diff --git a/.storybook/main.js b/.storybook/main.js index 66a9cf7..61241a6 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,7 +1,7 @@ module.exports = { "stories": [ - "../examples/stories/*.stories.mdx", - "../examples/stories/*.stories.@(js|jsx|ts|tsx)" + "../examples/**/*.stories.mdx", + "../examples/**/*.stories.@(js|jsx|ts|tsx)" ], "addons": [ "@storybook/addon-links", diff --git a/examples/stories/assets/map-accessories.riv b/examples/stories/assets/map-accessories.riv new file mode 100644 index 0000000..2b41549 Binary files /dev/null and b/examples/stories/assets/map-accessories.riv differ diff --git a/examples/stories/components/bareBonesRiveCanvas/Example.css b/examples/stories/components/bareBonesRiveCanvas/Example.css new file mode 100644 index 0000000..9fdd248 --- /dev/null +++ b/examples/stories/components/bareBonesRiveCanvas/Example.css @@ -0,0 +1,4 @@ +canvas { + width: 500px!important; + height: 500px!important; +} \ No newline at end of file diff --git a/examples/stories/components/bareBonesRiveCanvas/Example.stories.tsx b/examples/stories/components/bareBonesRiveCanvas/Example.stories.tsx new file mode 100644 index 0000000..cb843d7 --- /dev/null +++ b/examples/stories/components/bareBonesRiveCanvas/Example.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import BareBonesRiveCanvas from './Example'; + +const meta = { + title: 'Components/BareBonesRiveCanvas', + component: BareBonesRiveCanvas, + argTypes: { + backgroundColor: { control: 'color' }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Primary: Story = { + args: {}, +}; diff --git a/examples/stories/components/bareBonesRiveCanvas/Example.tsx b/examples/stories/components/bareBonesRiveCanvas/Example.tsx new file mode 100644 index 0000000..1b985c8 --- /dev/null +++ b/examples/stories/components/bareBonesRiveCanvas/Example.tsx @@ -0,0 +1,102 @@ +import React, { useState, useRef, useEffect } from 'react'; + +import Bird from './components/Bird'; +import Tree from './components/Tree'; + +export default function App() { + return ( +
+ + +
+ ); +} + +function StaticTest() { + const [counter, setCounter] = useState(0); + + const [running, setRunning] = useState(false); + const intervalRef = useRef(); + useEffect(() => { + if (running) { + intervalRef.current = setInterval(() => { + setCounter((prev) => prev + 1); + }, 100); + } else { + clearInterval(intervalRef.current); + } + }, [running]); + + return ( +
+

Static

+ + + +
+ ); +} + +function RiveTest() { + const [counter, setCounter] = useState(0); + + const [running, setRunning] = useState(false); + const intervalRef = useRef(); + useEffect(() => { + if (running) { + intervalRef.current = setInterval(() => { + setCounter((prev) => prev + 1); + }, 100); + } else { + clearInterval(intervalRef.current); + } + }, [running]); + + return ( +
+

Rive

+ + + +
+ ); +} + +const useId = () => { + // random id + return Math.random().toString(36).substring(7); +}; + +function FakeAsset({ id }: { id: string; key: string }) { + const internalId = useId(); + useEffect(() => { + console.log(`[${internalId}] mount static ${id}`); + return () => { + console.log(`[${internalId}] unmount static ${id}`); + }; + }, [id, internalId]); + + return ( +
+ {id} +
+ ); +} + +// --- +type ButtonProps = React.ButtonHTMLAttributes; + +function Button({ children, ...props }: ButtonProps) { + return ( + + ); +} diff --git a/examples/stories/components/bareBonesRiveCanvas/components/Bird.tsx b/examples/stories/components/bareBonesRiveCanvas/components/Bird.tsx new file mode 100644 index 0000000..0a17243 --- /dev/null +++ b/examples/stories/components/bareBonesRiveCanvas/components/Bird.tsx @@ -0,0 +1,24 @@ +import { useRive } from '../../../../../src'; +import React, { useEffect } from 'react'; + +export default function Bird({}) { + const { RiveComponent } = useRive({ + stateMachines: 'State Machine 1', + artboard: 'bird', + src: 'map-accessories.riv', + autoplay: true, + }); + + useEffect(() => { + // console.log(`mount rive 🐓`); + return () => { + // console.log(`unmount rive 🐓`); + }; + }, []); + + return ( +
+ +
+ ); +} diff --git a/examples/stories/components/bareBonesRiveCanvas/components/Tree.tsx b/examples/stories/components/bareBonesRiveCanvas/components/Tree.tsx new file mode 100644 index 0000000..9bbbcc9 --- /dev/null +++ b/examples/stories/components/bareBonesRiveCanvas/components/Tree.tsx @@ -0,0 +1,25 @@ +import { useRive } from '../../../../../src'; + +import React, { useEffect } from 'react'; + +export default function Tree({}) { + const { RiveComponent } = useRive({ + stateMachines: 'State Machine 1', + artboard: 'treeComponent', + src: 'map-accessories.riv', + autoplay: true, + }); + + useEffect(() => { + // console.log(`mount rive 🌲`); + return () => { + // console.log(`unmount rive 🌲`); + }; + }, []); + + return ( +
+ +
+ ); +} diff --git a/examples/stories/components/bareBonesRiveCanvas/rive/map-accessories.riv b/examples/stories/components/bareBonesRiveCanvas/rive/map-accessories.riv new file mode 100644 index 0000000..2b41549 Binary files /dev/null and b/examples/stories/components/bareBonesRiveCanvas/rive/map-accessories.riv differ