From 5abb26a3a065e44d506d7b5d6c8cf5e19be26e86 Mon Sep 17 00:00:00 2001 From: Lance Date: Fri, 7 Aug 2026 11:07:16 -0700 Subject: [PATCH 1/3] docs: storybook instructions If you don't first run 'npm run dev', storybook may not be using the latest version of the runtime --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f2affb4..4114073 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,16 +23,16 @@ npm run dev We use Storybook to deploy our examples out onto a public-facing page for folks to view and see code examples for. It also serves as the place we'll include any example suites. These story files are stored in `/examples` -To run Storybook, run the following command in the terminal: +To make sure you're using the latest version of the runtime and to see changes made to the Rive React runtime reflected in your storybook, run the following command in a separate terminal window: ``` -npm run storybook +npm run dev ``` -To see changes made to the Rive React runtime reflected in your storyook, run the following command in a separate terminal window: +To run Storybook, run the following command in the terminal: ``` -npm run dev +npm run storybook ``` ### Testing From 3fe226c1543092fa0e8cf5913f5dc9c15094e9d4 Mon Sep 17 00:00:00 2001 From: Lance Date: Fri, 7 Aug 2026 11:39:19 -0700 Subject: [PATCH 2/3] tests: update the db font example Use the branded file instead --- examples/public/Orbitron.ttf | Bin 0 -> 38576 bytes examples/public/font_db_test.riv | Bin 206536 -> 856 bytes examples/src/components/DataBindingHooks.tsx | 15 +- .../components/DataBindingTests.stories.tsx | 1149 +++++----- examples/src/components/DataBindingTests.tsx | 1977 +++++++++-------- examples/src/components/Semantics.tsx | 15 +- 6 files changed, 1729 insertions(+), 1427 deletions(-) create mode 100644 examples/public/Orbitron.ttf diff --git a/examples/public/Orbitron.ttf b/examples/public/Orbitron.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1fc54ce7116a6ec549f37358466bcc92f9a72c33 GIT binary patch literal 38576 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�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 literal 0 HcmV?d00001 diff --git a/examples/public/font_db_test.riv b/examples/public/font_db_test.riv index 60f8c199c63f81d38ee28e91d59d30ee80b8a859..252bf2220c0b1195a2eef58e1721d70e7bf75314 100644 GIT binary patch literal 856 zcma))PiPZC6vp41d6R^sQB0$~2<8&-+JhDk)?^zi0h2--a^JR#4b+XKE8;CpA!gmX-E!xw zf_d7&U(}!mmPJ{$s3q3ufU2TEO>EMl*rvMch_A+&M0uPXM`u7*Oy%LJnhj33%G@zk=%I3%4N+4zFR5?$5V0BGI9;9EU@uW z*2tUA7|#;fNn^Sn<~=pKH1l+P%Frh>=A+@PX*r(nqVZX-5s)Wt&RDuRVZdvTf>px0 z3(h~G?m|F6z>lE~1UEo2=7IIwu@f0=BJeGU5_-mjfVvuH);7GAievdfJJ!pwUfU5D zoq+8~H+-;$Jn-qeb|Sq{L`Colm0A=4Pqd;0s75LR;j7%_9yW+=KI2;W`bxVEWmK+Z z@%!idFYYQY=rMS~Tg$>#5;V$>1uIf<|FNvZF5w>GKH&l3A>k46`{6P1YvCzji?9Q; zZZL4VjtqRohVj`jJvK~TYq9QV71qBn$S{53HV+%d{|`)0S@=sL5R0awAuXPa#gh+0 z!z0Pmn2qN9Uo_6jPIjB1`%O45IG!i&l{V{W!O=NKyYzu~LzhTU!A$`{<#N=|dSk$w x$~-ovGo}&hhg$=e$1L44LJ56hs$<=mNB2Yhxsl`Ldl0Q4!rdkQ%Ofxde*n6c-mw4x literal 206536 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%0A<4wRx{BRd)_dW*e^ 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 { const { rive, RiveComponent } = useRive({ src: 'global_variables_test.riv', @@ -29,14 +28,14 @@ const GlobalViewModelInstance = () => { autoplay: false, autoBind: false, }); - + // Set up the main view model instance if you need a reference to it to change any properties. // These two lines are optional here: the global hooks below trigger a bind(), and bind() fills // any unset slots (including main) with their default instance — so the default main gets bound // either way. (With autoBind:false and no globals, you'd need to set the main yourself.) const mainViewModel = useViewModel(rive, { name: 'Main' }); - useViewModelInstance(mainViewModel, {rive}); - + useViewModelInstance(mainViewModel, { rive }); + // Set up global view model instances // Note that we don't need to specify every global view model here - only the ones we want to have a reference to // to change values on. The other globals will use a default instance. @@ -47,19 +46,21 @@ const GlobalViewModelInstance = () => { { rive } ); - const globalCurrencyViewModel = useViewModel(rive, { name: GLOBAL_VM_CURRENCY }); + const globalCurrencyViewModel = useViewModel(rive, { + name: GLOBAL_VM_CURRENCY, + }); const globalCurrencyInstance = useGlobalViewModelInstance( globalCurrencyViewModel, GLOBAL_VM_CURRENCY, { rive } ); - const { value: bgColor, setValue: setBgColor } = useViewModelInstanceColor( + const { setValue: setBgColor } = useViewModelInstanceColor( COLOR_PROP, globalColorsInstance ); - const { value: currency, setValue: setCurrency } = useViewModelInstanceString( + const { setValue: setCurrency } = useViewModelInstanceString( CURRENCY_PROP, globalCurrencyInstance ); diff --git a/examples/src/components/DataBindingTests.stories.tsx b/examples/src/components/DataBindingTests.stories.tsx index e9232ba..67e2513 100644 --- a/examples/src/components/DataBindingTests.stories.tsx +++ b/examples/src/components/DataBindingTests.stories.tsx @@ -1,565 +1,702 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { within, expect, waitFor, userEvent } from '@storybook/test'; -import { StringPropertyTest, NumberPropertyTest, BooleanPropertyTest, ColorPropertyTest, EnumPropertyTest, NestedViewModelTest, TriggerPropertyTest, PersonForm, PersonInstances, ImagePropertyTest, FontPropertyTest, TodoListTest, ArtboardPropertyTest } from './DataBindingTests'; +import { + StringPropertyTest, + NumberPropertyTest, + BooleanPropertyTest, + ColorPropertyTest, + EnumPropertyTest, + NestedViewModelTest, + TriggerPropertyTest, + PersonForm, + PersonInstances, + ImagePropertyTest, + FontPropertyTest, + TodoListTest, + ArtboardPropertyTest, +} from './DataBindingTests'; const meta: Meta = { - title: 'Tests/DataBinding', - parameters: { - layout: 'centered', - }, + title: 'Tests/DataBinding', + parameters: { + layout: 'centered', + }, }; export default meta; - export const StringPropertyStory: StoryObj = { - name: 'String Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('name-value')).toBeTruthy(); - }, { timeout: 3000 }); - - const nameInput = canvas.getByTestId('name-input'); - await userEvent.clear(nameInput); - - // Wait for the input to be cleared - await waitFor(() => { - expect(nameInput.value).toBe(''); - }, { timeout: 1000 }); - - await userEvent.click(nameInput); - await userEvent.paste('Test User'); - - await waitFor(() => { - expect(nameInput.value).toBe('Test User'); - }, { timeout: 2000 }); - - await waitFor(() => { - expect(canvas.getByTestId('name-value').textContent).toBe('Test User'); - }, { timeout: 2000 }); - } + name: 'String Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('name-value')).toBeTruthy(); + }, + { timeout: 3000 } + ); + + const nameInput = canvas.getByTestId('name-input'); + await userEvent.clear(nameInput); + + // Wait for the input to be cleared + await waitFor( + () => { + expect(nameInput.value).toBe(''); + }, + { timeout: 1000 } + ); + + await userEvent.click(nameInput); + await userEvent.paste('Test User'); + + await waitFor( + () => { + expect(nameInput.value).toBe('Test User'); + }, + { timeout: 2000 } + ); + + await waitFor( + () => { + expect(canvas.getByTestId('name-value').textContent).toBe('Test User'); + }, + { timeout: 2000 } + ); + }, }; export const NumberPropertyStory: StoryObj = { - name: 'Number Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('age-value')).toBeTruthy(); - }, { timeout: 2000 }); - - const ageInput = canvas.getByTestId('age-input'); - - const currentValue = ageInput.value; - expect(currentValue).toBe('23'); - - await userEvent.click(ageInput); - await userEvent.clear(ageInput); - await waitFor(() => { - expect(ageInput.value).toBe('0'); // This is a hack to wait for the input to be cleared - }, { timeout: 1000 }); - - await userEvent.paste('42'); - - - await waitFor(() => { - expect(canvas.getByTestId('age-value').textContent).toBe('42'); - }, { timeout: 2000 }); - } + name: 'Number Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('age-value')).toBeTruthy(); + }, + { timeout: 2000 } + ); + + const ageInput = canvas.getByTestId('age-input'); + + const currentValue = ageInput.value; + expect(currentValue).toBe('23'); + + await userEvent.click(ageInput); + await userEvent.clear(ageInput); + await waitFor( + () => { + expect(ageInput.value).toBe('0'); // This is a hack to wait for the input to be cleared + }, + { timeout: 1000 } + ); + + await userEvent.paste('42'); + + await waitFor( + () => { + expect(canvas.getByTestId('age-value').textContent).toBe('42'); + }, + { timeout: 2000 } + ); + }, }; export const BooleanPropertyStory: StoryObj = { - name: 'Boolean Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); + name: 'Boolean Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); - // Wait for the Rive file to load + // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('terms-value')).toBeTruthy(); - }, { timeout: 2000 }); + await waitFor( + () => { + expect(canvas.getByTestId('terms-value')).toBeTruthy(); + }, + { timeout: 2000 } + ); - const termsCheckbox = canvas.getByTestId('terms-checkbox'); + const termsCheckbox = + canvas.getByTestId('terms-checkbox'); - expect(termsCheckbox.checked).toBe(false); + expect(termsCheckbox.checked).toBe(false); - expect(canvas.getByTestId('terms-value').textContent).toBe('false'); + expect(canvas.getByTestId('terms-value').textContent).toBe('false'); - await userEvent.click(termsCheckbox); + await userEvent.click(termsCheckbox); - // Verify terms update - await waitFor(() => { - expect(canvas.getByTestId('terms-value').textContent).toBe('true'); - }); - } + // Verify terms update + await waitFor(() => { + expect(canvas.getByTestId('terms-value').textContent).toBe('true'); + }); + }, }; export const ColorPropertyStory: StoryObj = { - name: 'Color Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load and the component to render - await waitFor(() => { - expect(canvas.getByTestId('color-value')).toBeTruthy(); - expect(canvas.getByTestId('set-color-red')).toBeTruthy(); - expect(canvas.getByTestId('set-color-blue')).toBeTruthy(); - }, { timeout: 5000 }); - - const numberValueDiv = canvas.getByTestId('number-value'); - const hexValueDiv = canvas.getByTestId('hex-value'); - - // Verify initial state is red - await waitFor(() => { - expect(hexValueDiv.textContent).toContain('Hex value: #ce2323'); - expect(numberValueDiv.textContent).toContain('Number value: -3267805'); - }); - - - // Change color to Blue --- - const blueButton = canvas.getByTestId('set-color-blue'); - await userEvent.click(blueButton); - - // Verify Blue State - await waitFor(() => { - expect(numberValueDiv.textContent).toContain('Number value: -16776961'); - expect(hexValueDiv.textContent).toContain('Hex value: #0000ff'); - }); - - - // Change color back to Red --- - const redButton = canvas.getByTestId('set-color-red'); - await userEvent.click(redButton); - - // Verify Red State - await waitFor(() => { - expect(numberValueDiv.textContent).toContain('Number value: -65536'); - expect(hexValueDiv.textContent).toContain('Hex value: #ff0000'); - }); - } + name: 'Color Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load and the component to render + await waitFor( + () => { + expect(canvas.getByTestId('color-value')).toBeTruthy(); + expect(canvas.getByTestId('set-color-red')).toBeTruthy(); + expect(canvas.getByTestId('set-color-blue')).toBeTruthy(); + }, + { timeout: 5000 } + ); + + const numberValueDiv = canvas.getByTestId('number-value'); + const hexValueDiv = canvas.getByTestId('hex-value'); + + // Verify initial state is red + await waitFor(() => { + expect(hexValueDiv.textContent).toContain('Hex value: #ce2323'); + expect(numberValueDiv.textContent).toContain('Number value: -3267805'); + }); + + // Change color to Blue --- + const blueButton = canvas.getByTestId('set-color-blue'); + await userEvent.click(blueButton); + + // Verify Blue State + await waitFor(() => { + expect(numberValueDiv.textContent).toContain('Number value: -16776961'); + expect(hexValueDiv.textContent).toContain('Hex value: #0000ff'); + }); + + // Change color back to Red --- + const redButton = canvas.getByTestId('set-color-red'); + await userEvent.click(redButton); + + // Verify Red State + await waitFor(() => { + expect(numberValueDiv.textContent).toContain('Number value: -65536'); + expect(hexValueDiv.textContent).toContain('Hex value: #ff0000'); + }); + }, }; export const EnumPropertyStory: StoryObj = { - name: 'Enum Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('country-value')).toBeTruthy(); - }); - - // Wait for options to be loaded - await waitFor(() => { - const countrySelect = canvas.getByTestId('country-select'); - return countrySelect.options.length > 0; - }); - - const countrySelect = canvas.getByTestId('country-select'); - - // Verify that the dropdown contains usa, japan, and canada - const optionValues = Array.from(countrySelect.options).map(option => option.value); - expect(optionValues).toContain('usa'); - expect(optionValues).toContain('japan'); - expect(optionValues).toContain('canada'); - - const currentValue = countrySelect.value; - - expect(currentValue).toBe('usa'); - - let optionToSelect = 'japan'; - - await userEvent.selectOptions(countrySelect, optionToSelect); - - await waitFor(() => { - expect(canvas.getByTestId('country-value').textContent).toBe(optionToSelect); - }); - } + name: 'Enum Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor(() => { + expect(canvas.getByTestId('country-value')).toBeTruthy(); + }); + + // Wait for options to be loaded + await waitFor(() => { + const countrySelect = + canvas.getByTestId('country-select'); + return countrySelect.options.length > 0; + }); + + const countrySelect = + canvas.getByTestId('country-select'); + + // Verify that the dropdown contains usa, japan, and canada + const optionValues = Array.from(countrySelect.options).map( + (option) => option.value + ); + expect(optionValues).toContain('usa'); + expect(optionValues).toContain('japan'); + expect(optionValues).toContain('canada'); + + const currentValue = countrySelect.value; + + expect(currentValue).toBe('usa'); + + let optionToSelect = 'japan'; + + await userEvent.selectOptions(countrySelect, optionToSelect); + + await waitFor(() => { + expect(canvas.getByTestId('country-value').textContent).toBe( + optionToSelect + ); + }); + }, }; export const NestedViewModelStory: StoryObj = { - name: 'Nested ViewModel Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('drink-type-value')).toBeTruthy(); - }); - - // Wait for options to be loaded - await waitFor(() => { - const drinkTypeSelect = canvas.getByTestId('drink-type-select'); - return drinkTypeSelect.options.length > 0; - }, { timeout: 2000 }); - - const drinkTypeSelect = canvas.getByTestId('drink-type-select'); - const optionValues = Array.from(drinkTypeSelect.options).map(option => option.value); - expect(optionValues).toContain('Coffee'); - expect(optionValues).toContain('Tea'); - - - expect(drinkTypeSelect.value).toBe('Tea'); - - let optionToSelect = 'Coffee'; - - await userEvent.selectOptions(drinkTypeSelect, optionToSelect); - - await waitFor(() => { - expect(canvas.getByTestId('drink-type-value').textContent).toBe(optionToSelect); - }); - } + name: 'Nested ViewModel Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor(() => { + expect(canvas.getByTestId('drink-type-value')).toBeTruthy(); + }); + + // Wait for options to be loaded + await waitFor( + () => { + const drinkTypeSelect = + canvas.getByTestId('drink-type-select'); + return drinkTypeSelect.options.length > 0; + }, + { timeout: 2000 } + ); + + const drinkTypeSelect = + canvas.getByTestId('drink-type-select'); + const optionValues = Array.from(drinkTypeSelect.options).map( + (option) => option.value + ); + expect(optionValues).toContain('Coffee'); + expect(optionValues).toContain('Tea'); + + expect(drinkTypeSelect.value).toBe('Tea'); + + let optionToSelect = 'Coffee'; + + await userEvent.selectOptions(drinkTypeSelect, optionToSelect); + + await waitFor(() => { + expect(canvas.getByTestId('drink-type-value').textContent).toBe( + optionToSelect + ); + }); + }, }; export const TriggerPropertyStory: StoryObj = { - name: 'Trigger Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('submit-button')).toBeTruthy(); - }, { timeout: 2000 }); - - expect(canvas.getByTestId('callback-triggered').textContent).toContain('none'); - - // Trigger submit action - await userEvent.click(canvas.getByTestId('submit-button')); - - await waitFor(() => { - expect(canvas.getByTestId('callback-triggered').textContent).toContain('submit-callback'); - }); - - await userEvent.click(canvas.getByTestId('reset-button')); - - // Verify onTrigger callback works for reset - await waitFor(() => { - expect(canvas.getByTestId('callback-triggered').textContent).toContain('reset-callback'); - }); - } + name: 'Trigger Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('submit-button')).toBeTruthy(); + }, + { timeout: 2000 } + ); + + expect(canvas.getByTestId('callback-triggered').textContent).toContain( + 'none' + ); + + // Trigger submit action + await userEvent.click(canvas.getByTestId('submit-button')); + + await waitFor(() => { + expect(canvas.getByTestId('callback-triggered').textContent).toContain( + 'submit-callback' + ); + }); + + await userEvent.click(canvas.getByTestId('reset-button')); + + // Verify onTrigger callback works for reset + await waitFor(() => { + expect(canvas.getByTestId('callback-triggered').textContent).toContain( + 'reset-callback' + ); + }); + }, }; export const PersonInstancesStory: StoryObj = { - name: 'Person Instances', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('instance-name')).toBeTruthy(); - expect(canvas.getByTestId('select-jane')).toBeTruthy(); - expect(canvas.getByTestId('select-default')).toBeTruthy(); - }, { timeout: 2000 }); - - // Initially should show Steve - expect(canvas.getByTestId('instance-name').textContent).toContain('Steve'); - - // Switch to Jane - const janeButton = canvas.getByTestId('select-jane'); - await userEvent.click(janeButton); - - // Verify instance changed to Jane - await waitFor(() => { - expect(canvas.getByTestId('instance-name').textContent).toContain('Jane'); - }); - - // Switch to Default instance - const defaultButton = canvas.getByTestId('select-default'); - await userEvent.click(defaultButton); - - // Verify instance changed to Default - await waitFor(() => { - expect(canvas.getByTestId('instance-name').textContent).toContain('Default'); - }); - - // Switch back to Steve - const steveButton = canvas.getByTestId('select-steve'); - await userEvent.click(steveButton); - - // Verify instance changed back to Steve - await waitFor(() => { - expect(canvas.getByTestId('instance-name').textContent).toContain('Steve'); - }); - } + name: 'Person Instances', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('instance-name')).toBeTruthy(); + expect(canvas.getByTestId('select-jane')).toBeTruthy(); + expect(canvas.getByTestId('select-default')).toBeTruthy(); + }, + { timeout: 2000 } + ); + + // Initially should show Steve + expect(canvas.getByTestId('instance-name').textContent).toContain('Steve'); + + // Switch to Jane + const janeButton = canvas.getByTestId('select-jane'); + await userEvent.click(janeButton); + + // Verify instance changed to Jane + await waitFor(() => { + expect(canvas.getByTestId('instance-name').textContent).toContain('Jane'); + }); + + // Switch to Default instance + const defaultButton = canvas.getByTestId('select-default'); + await userEvent.click(defaultButton); + + // Verify instance changed to Default + await waitFor(() => { + expect(canvas.getByTestId('instance-name').textContent).toContain( + 'Default' + ); + }); + + // Switch back to Steve + const steveButton = canvas.getByTestId('select-steve'); + await userEvent.click(steveButton); + + // Verify instance changed back to Steve + await waitFor(() => { + expect(canvas.getByTestId('instance-name').textContent).toContain( + 'Steve' + ); + }); + }, }; // A configurable form story, so we can test all the properties at once export const PersonFormStory: StoryObj = { - name: 'Complete Person Form', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('name-value')).toBeTruthy(); - }, { timeout: 2000 }); - - // Update name - const nameInput = canvas.getByTestId('name-input'); - await userEvent.clear(nameInput); - await userEvent.type(nameInput, 'Test User'); - - // Update age - const ageInput = canvas.getByTestId('age-input'); - await userEvent.clear(ageInput); - await userEvent.type(ageInput, '42'); - - // Toggle terms agreement - const termsCheckbox = canvas.getByTestId('terms-checkbox'); - await userEvent.click(termsCheckbox); - - // Change color - const colorButton = canvas.getByTestId('set-color-red'); - await userEvent.click(colorButton); - - // Change country - const countrySelect = canvas.getByTestId('country-select'); - await userEvent.selectOptions(countrySelect, 'japan'); - - // Change drink type - const drinkTypeSelect = canvas.getByTestId('drink-type-select'); - await userEvent.selectOptions(drinkTypeSelect, 'Coffee'); - - // Submit the form - const submitButton = canvas.getByTestId('submit-button'); - await userEvent.click(submitButton); - } + name: 'Complete Person Form', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('name-value')).toBeTruthy(); + }, + { timeout: 2000 } + ); + + // Update name + const nameInput = canvas.getByTestId('name-input'); + await userEvent.clear(nameInput); + await userEvent.type(nameInput, 'Test User'); + + // Update age + const ageInput = canvas.getByTestId('age-input'); + await userEvent.clear(ageInput); + await userEvent.type(ageInput, '42'); + + // Toggle terms agreement + const termsCheckbox = canvas.getByTestId('terms-checkbox'); + await userEvent.click(termsCheckbox); + + // Change color + const colorButton = canvas.getByTestId('set-color-red'); + await userEvent.click(colorButton); + + // Change country + const countrySelect = + canvas.getByTestId('country-select'); + await userEvent.selectOptions(countrySelect, 'japan'); + + // Change drink type + const drinkTypeSelect = + canvas.getByTestId('drink-type-select'); + await userEvent.selectOptions(drinkTypeSelect, 'Coffee'); + + // Submit the form + const submitButton = canvas.getByTestId('submit-button'); + await userEvent.click(submitButton); + }, }; - export const ImagePropertyStory: StoryObj = { - name: 'Image Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('load-random-image')).toBeTruthy(); - expect(canvas.getByTestId('clear-image')).toBeTruthy(); - }, { timeout: 3000 }); - - const loadImageButton = canvas.getByTestId('load-random-image'); - const clearImageButton = canvas.getByTestId('clear-image'); - - expect(canvas.queryByTestId('current-image-url')).toBeNull(); - - // Load a random image - await userEvent.click(loadImageButton); - - // Wait for the image to load and URL to appear - await waitFor(() => { - expect(canvas.getByTestId('current-image-url')).toBeTruthy(); - }, { timeout: 5000 }); - - // Verify the image URL is displayed - const imageUrlElement = canvas.getByTestId('current-image-url'); - expect(imageUrlElement.textContent).toContain('Current image: https://picsum.photos'); - - // Clear the image - await userEvent.click(clearImageButton); - - // Load another image to test it works multiple times - await userEvent.click(loadImageButton); - - // Wait for the new image to load - await waitFor(() => { - expect(canvas.getByTestId('current-image-url')).toBeTruthy(); - }, { timeout: 5000 }); - } + name: 'Image Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('load-random-image')).toBeTruthy(); + expect(canvas.getByTestId('clear-image')).toBeTruthy(); + }, + { timeout: 3000 } + ); + + const loadImageButton = canvas.getByTestId('load-random-image'); + const clearImageButton = canvas.getByTestId('clear-image'); + + expect(canvas.queryByTestId('current-image-url')).toBeNull(); + + // Load a random image + await userEvent.click(loadImageButton); + + // Wait for the image to load and URL to appear + await waitFor( + () => { + expect(canvas.getByTestId('current-image-url')).toBeTruthy(); + }, + { timeout: 5000 } + ); + + // Verify the image URL is displayed + const imageUrlElement = canvas.getByTestId('current-image-url'); + expect(imageUrlElement.textContent).toContain( + 'Current image: https://picsum.photos' + ); + + // Clear the image + await userEvent.click(clearImageButton); + + // Load another image to test it works multiple times + await userEvent.click(loadImageButton); + + // Wait for the new image to load + await waitFor( + () => { + expect(canvas.getByTestId('current-image-url')).toBeTruthy(); + }, + { timeout: 5000 } + ); + }, }; export const FontPropertyStory: StoryObj = { - name: 'Font Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - await waitFor(() => { - expect(canvas.getByTestId('set-font-noto-thai')).toBeTruthy(); - expect(canvas.getByTestId('set-font-noto-arabic')).toBeTruthy(); - expect(canvas.getByTestId('clear-font')).toBeTruthy(); - }, { timeout: 3000 }); - + name: 'Font Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + await waitFor( + () => { + expect(canvas.getByTestId('set-font-noto-thai')).toBeTruthy(); + expect(canvas.getByTestId('set-font-orbitron')).toBeTruthy(); + expect(canvas.getByTestId('clear-font')).toBeTruthy(); + }, + { timeout: 3000 } + ); + + expect(canvas.queryByTestId('current-font')).toBeNull(); + + await userEvent.click(canvas.getByTestId('set-font-orbitron')); + + await waitFor( + () => { + expect(canvas.getByTestId('current-font').textContent).toBe( + 'Current font: Orbitron' + ); + }, + { timeout: 5000 } + ); + + await userEvent.click(canvas.getByTestId('clear-font')); + + await waitFor( + () => { expect(canvas.queryByTestId('current-font')).toBeNull(); + }, + { timeout: 2000 } + ); + + await userEvent.click(canvas.getByTestId('set-font-orbitron')); + + await waitFor( + () => { + expect(canvas.getByTestId('current-font').textContent).toBe( + 'Current font: Orbitron' + ); + }, + { timeout: 5000 } + ); + }, +}; - await userEvent.click(canvas.getByTestId('set-font-noto-arabic')); - - await waitFor(() => { - expect(canvas.getByTestId('current-font').textContent).toBe( - 'Current font: Noto Sans Arabic' - ); - }, { timeout: 5000 }); - - await userEvent.click(canvas.getByTestId('clear-font')); - - await waitFor(() => { - expect(canvas.queryByTestId('current-font')).toBeNull(); - }, { timeout: 2000 }); - - await userEvent.click(canvas.getByTestId('set-font-noto-arabic')); +export const TodoListStory: StoryObj = { + name: 'Todo List Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('list-length')).toBeTruthy(); + }, + { timeout: 3000 } + ); + + const initialLengthText = canvas.getByTestId('list-length').textContent; + const initialCount = parseInt( + initialLengthText?.match(/Items: (\d+)/)?.[1] || '0' + ); + + // Test 1: addInstance - Add item to end + const addButton = canvas.getByTestId('add-item-button'); + await userEvent.click(addButton); + + await waitFor(() => { + expect(canvas.getByTestId('list-length').textContent).toContain( + `Items: ${initialCount + 1}` + ); + }); + + // Test 2: addInstanceAt - Add item at specific index (if we have items) + if (initialCount > 0) { + const addAtButton = canvas.getByTestId('add-item-at-button'); + await userEvent.click(addAtButton); + + await waitFor(() => { + expect(canvas.getByTestId('list-length').textContent).toContain( + `Items: ${initialCount + 2}` + ); + }); + } - await waitFor(() => { - expect(canvas.getByTestId('current-font').textContent).toBe( - 'Current font: Noto Sans Arabic' - ); - }, { timeout: 5000 }); + // Test 3: getInstanceAt - Interact with specific items + const currentCount = initialCount + (initialCount > 0 ? 2 : 1); + if (currentCount > 0) { + await waitFor(() => { + expect(canvas.getByTestId('todo-item-0')).toBeTruthy(); + }); + + // Edit the first item + const todoText = canvas.getByTestId('todo-text-0'); + await userEvent.clear(todoText); + + // Wait for the input to be cleared to avoid issues with autocomplete + await waitFor( + () => { + expect((todoText as HTMLInputElement).value).toBe(''); + }, + { timeout: 2000 } + ); + + await userEvent.click(todoText); + await userEvent.paste('Test Item'); + + await waitFor( + () => { + expect(canvas.getByTestId('todo-text-value-0').textContent).toContain( + 'Test Item' + ); + }, + { timeout: 3000 } + ); } -}; + // Test 4: swap - Swap first two items + if (currentCount >= 2) { + const firstText = + canvas.getByTestId('todo-text-0').value; + const secondText = + canvas.getByTestId('todo-text-1').value; + + const swapButton = canvas.getByTestId('swap-button'); + await userEvent.click(swapButton); + + await waitFor( + () => { + expect(canvas.getByTestId('todo-text-0')).toHaveValue(secondText); + expect(canvas.getByTestId('todo-text-1')).toHaveValue(firstText); + }, + { timeout: 3000 } + ); + } -export const TodoListStory: StoryObj = { - name: 'Todo List Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('list-length')).toBeTruthy(); - }, { timeout: 3000 }); - - const initialLengthText = canvas.getByTestId('list-length').textContent; - const initialCount = parseInt(initialLengthText?.match(/Items: (\d+)/)?.[1] || '0'); - - // Test 1: addInstance - Add item to end - const addButton = canvas.getByTestId('add-item-button'); - await userEvent.click(addButton); - - await waitFor(() => { - expect(canvas.getByTestId('list-length').textContent).toContain(`Items: ${initialCount + 1}`); - }); - - // Test 2: addInstanceAt - Add item at specific index (if we have items) - if (initialCount > 0) { - const addAtButton = canvas.getByTestId('add-item-at-button'); - await userEvent.click(addAtButton); - - await waitFor(() => { - expect(canvas.getByTestId('list-length').textContent).toContain(`Items: ${initialCount + 2}`); - }); - } - - // Test 3: getInstanceAt - Interact with specific items - const currentCount = initialCount + (initialCount > 0 ? 2 : 1); - if (currentCount > 0) { - await waitFor(() => { - expect(canvas.getByTestId('todo-item-0')).toBeTruthy(); - }); - - // Edit the first item - const todoText = canvas.getByTestId('todo-text-0'); - await userEvent.clear(todoText); - - // Wait for the input to be cleared to avoid issues with autocomplete - await waitFor(() => { - expect((todoText as HTMLInputElement).value).toBe(''); - }, { timeout: 2000 }); - - await userEvent.click(todoText); - await userEvent.paste('Test Item'); - - await waitFor(() => { - expect(canvas.getByTestId('todo-text-value-0').textContent).toContain('Test Item'); - }, { timeout: 3000 }); - - } - - // Test 4: swap - Swap first two items - if (currentCount >= 2) { - const firstText = canvas.getByTestId('todo-text-0').value; - const secondText = canvas.getByTestId('todo-text-1').value; - - const swapButton = canvas.getByTestId('swap-button'); - await userEvent.click(swapButton); - - await waitFor(() => { - expect(canvas.getByTestId('todo-text-0')).toHaveValue(secondText); - expect(canvas.getByTestId('todo-text-1')).toHaveValue(firstText); - }, { timeout: 3000 }); - } - - // Test 5: removeInstance - Remove by instance reference - if (currentCount > 0) { - const removeInstanceButton = canvas.getByTestId('remove-instance-button'); - await userEvent.click(removeInstanceButton); - - await waitFor(() => { - expect(canvas.getByTestId('list-length').textContent).toContain(`Items: ${currentCount - 1}`); - }, { timeout: 3000 }); - } - - // Test 6: removeInstanceAt - Remove by index - const afterRemoveInstance = currentCount > 0 ? currentCount - 1 : 0; - if (afterRemoveInstance > 0) { - const removeIndexButton = canvas.getByTestId('remove-index-button'); - await userEvent.click(removeIndexButton); - - await waitFor(() => { - expect(canvas.getByTestId('list-length').textContent).toContain(`Items: ${afterRemoveInstance - 1}`); - }, { timeout: 3000 }); - } + // Test 5: removeInstance - Remove by instance reference + if (currentCount > 0) { + const removeInstanceButton = canvas.getByTestId('remove-instance-button'); + await userEvent.click(removeInstanceButton); + + await waitFor( + () => { + expect(canvas.getByTestId('list-length').textContent).toContain( + `Items: ${currentCount - 1}` + ); + }, + { timeout: 3000 } + ); + } + // Test 6: removeInstanceAt - Remove by index + const afterRemoveInstance = currentCount > 0 ? currentCount - 1 : 0; + if (afterRemoveInstance > 0) { + const removeIndexButton = canvas.getByTestId('remove-index-button'); + await userEvent.click(removeIndexButton); + + await waitFor( + () => { + expect(canvas.getByTestId('list-length').textContent).toContain( + `Items: ${afterRemoveInstance - 1}` + ); + }, + { timeout: 3000 } + ); } + }, }; export const ArtboardPropertyStory: StoryObj = { - name: 'Artboard Property', - render: () => , - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - // Wait for the Rive file to load - await waitFor(() => { - expect(canvas.getByTestId('set-artboard1-blue')).toBeTruthy(); - expect(canvas.getByTestId('set-artboard1-red')).toBeTruthy(); - expect(canvas.getByTestId('set-artboard1-green')).toBeTruthy(); - }, { timeout: 3000 }); - - // Initially should show None - expect(canvas.getByTestId('artboard1-current').textContent).toBe('Current: None'); - expect(canvas.getByTestId('artboard2-current').textContent).toBe('Current: None'); - - // Set artboard 1 to blue - await userEvent.click(canvas.getByTestId('set-artboard1-blue')); - await waitFor(() => { - expect(canvas.getByTestId('artboard1-current').textContent).toBe('Current: ArtboardBlue'); - }); - - // Set artboard 2 to red - await userEvent.click(canvas.getByTestId('set-artboard2-red')); - await waitFor(() => { - expect(canvas.getByTestId('artboard2-current').textContent).toBe('Current: ArtboardRed'); - }); - - // Switch artboard 1 to green - await userEvent.click(canvas.getByTestId('set-artboard1-green')); - await waitFor(() => { - expect(canvas.getByTestId('artboard1-current').textContent).toBe('Current: ArtboardGreen'); - }); - - // Switch artboard 2 to blue - await userEvent.click(canvas.getByTestId('set-artboard2-blue')); - await waitFor(() => { - expect(canvas.getByTestId('artboard2-current').textContent).toBe('Current: ArtboardBlue'); - }); - } -}; \ No newline at end of file + name: 'Artboard Property', + render: () => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + // Wait for the Rive file to load + await waitFor( + () => { + expect(canvas.getByTestId('set-artboard1-blue')).toBeTruthy(); + expect(canvas.getByTestId('set-artboard1-red')).toBeTruthy(); + expect(canvas.getByTestId('set-artboard1-green')).toBeTruthy(); + }, + { timeout: 3000 } + ); + + // Initially should show None + expect(canvas.getByTestId('artboard1-current').textContent).toBe( + 'Current: None' + ); + expect(canvas.getByTestId('artboard2-current').textContent).toBe( + 'Current: None' + ); + + // Set artboard 1 to blue + await userEvent.click(canvas.getByTestId('set-artboard1-blue')); + await waitFor(() => { + expect(canvas.getByTestId('artboard1-current').textContent).toBe( + 'Current: ArtboardBlue' + ); + }); + + // Set artboard 2 to red + await userEvent.click(canvas.getByTestId('set-artboard2-red')); + await waitFor(() => { + expect(canvas.getByTestId('artboard2-current').textContent).toBe( + 'Current: ArtboardRed' + ); + }); + + // Switch artboard 1 to green + await userEvent.click(canvas.getByTestId('set-artboard1-green')); + await waitFor(() => { + expect(canvas.getByTestId('artboard1-current').textContent).toBe( + 'Current: ArtboardGreen' + ); + }); + + // Switch artboard 2 to blue + await userEvent.click(canvas.getByTestId('set-artboard2-blue')); + await waitFor(() => { + expect(canvas.getByTestId('artboard2-current').textContent).toBe( + 'Current: ArtboardBlue' + ); + }); + }, +}; diff --git a/examples/src/components/DataBindingTests.tsx b/examples/src/components/DataBindingTests.tsx index 144205c..e1875af 100644 --- a/examples/src/components/DataBindingTests.tsx +++ b/examples/src/components/DataBindingTests.tsx @@ -1,979 +1,1152 @@ -import React, { useEffect, useState } from 'react'; - -import Rive, { - useRive, - useViewModel, - useViewModelInstance, - useViewModelInstanceBoolean, - useViewModelInstanceString, - useViewModelInstanceNumber, - useViewModelInstanceEnum, - useViewModelInstanceColor, - useViewModelInstanceTrigger, - useViewModelInstanceImage, - useViewModelInstanceFont, - decodeImage, - decodeFont, - ViewModelInstance, - useViewModelInstanceList, - useViewModelInstanceArtboard +import React, { useState } from 'react'; + +import { + useRive, + useViewModel, + useViewModelInstance, + useViewModelInstanceBoolean, + useViewModelInstanceString, + useViewModelInstanceNumber, + useViewModelInstanceEnum, + useViewModelInstanceColor, + useViewModelInstanceTrigger, + useViewModelInstanceImage, + useViewModelInstanceFont, + decodeImage, + decodeFont, + ViewModelInstance, + useViewModelInstanceList, + useViewModelInstanceArtboard, + Layout, + Fit, } from '@rive-app/react-webgl2'; - export const StringPropertyTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { value: name, setValue: setName } = useViewModelInstanceString('name', rive?.viewModelInstance); - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { value: name, setValue: setName } = useViewModelInstanceString( + 'name', + rive?.viewModelInstance + ); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- -
{name}
-
- )} + +
{name}
- ); + )} +
+ ); }; export const NumberPropertyTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { value: age, setValue: setAge } = useViewModelInstanceNumber('age', rive?.viewModelInstance); - - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { value: age, setValue: setAge } = useViewModelInstanceNumber( + 'age', + rive?.viewModelInstance + ); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- -
{age}
-
- )} + +
{age}
- ); + )} +
+ ); }; export const BooleanPropertyTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { value: agreedToTerms, setValue: setAgreedToTerms } = useViewModelInstanceBoolean('agreedToTerms', rive?.viewModelInstance); - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { value: agreedToTerms, setValue: setAgreedToTerms } = + useViewModelInstanceBoolean('agreedToTerms', rive?.viewModelInstance); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- -
{agreedToTerms ? 'true' : 'false'}
-
- )} + +
+ {agreedToTerms ? 'true' : 'false'} +
- ); + )} +
+ ); }; const colorNumberToHexString = (colorNum: number | null) => { - if (colorNum === null) { - return 'N/A'; - } - const unsignedInt = colorNum >>> 0; - const r = (unsignedInt >> 16) & 0xff; - const g = (unsignedInt >> 8) & 0xff; - const b = unsignedInt & 0xff; - - const toHex = (c: number) => c.toString(16).padStart(2, '0'); - return `#${toHex(r)}${toHex(g)}${toHex(b)}`; + if (colorNum === null) { + return 'N/A'; + } + const unsignedInt = colorNum >>> 0; + const r = (unsignedInt >> 16) & 0xff; + const g = (unsignedInt >> 8) & 0xff; + const b = unsignedInt & 0xff; + + const toHex = (c: number) => c.toString(16).padStart(2, '0'); + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; }; export const ColorPropertyTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - - const { value: colorNum, setValue: setColor, setRgb } = useViewModelInstanceColor('favColor', rive?.viewModelInstance); - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { value: colorNum, setRgb } = useViewModelInstanceColor( + 'favColor', + rive?.viewModelInstance + ); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- - - -
- )} + + +
- ); + )} +
+ ); }; export const EnumPropertyTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { value: country, setValue: setCountry, values: countries } = useViewModelInstanceEnum('country', rive?.viewModelInstance); - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { + value: country, + setValue: setCountry, + values: countries, + } = useViewModelInstanceEnum('country', rive?.viewModelInstance); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- -
{country}
-
- )} + +
{country}
- ); + )} +
+ ); }; export const NestedViewModelTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { value: drinkType, setValue: setDrinkType, values: drinkTypes } = useViewModelInstanceEnum('favDrink/type', rive?.viewModelInstance); - - return ( + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { + value: drinkType, + setValue: setDrinkType, + values: drinkTypes, + } = useViewModelInstanceEnum('favDrink/type', rive?.viewModelInstance); + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- -
{drinkType}
-
- )} + +
{drinkType}
- ); + )} +
+ ); }; export const TriggerPropertyTest = ({ src }: { src: string }) => { - const [callbackTriggered, setCallbackTriggered] = useState(''); - - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - autoBind: true, - artboard: "Artboard", - stateMachines: "State Machine 1", - }); - - - - const { trigger: onFormSubmit } = useViewModelInstanceTrigger('onFormSubmit', rive?.viewModelInstance, - { - onTrigger: () => { - setCallbackTriggered('submit-callback'); - } - } - ); - - const { trigger: onFormReset } = useViewModelInstanceTrigger('onFormReset', rive?.viewModelInstance, - { - onTrigger: () => { - setCallbackTriggered('reset-callback'); - } - } - ); - - const handleSubmit = () => { - onFormSubmit(); - }; - - const handleReset = () => { - onFormReset(); - }; - - return ( + const [callbackTriggered, setCallbackTriggered] = useState(''); + + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + autoBind: true, + artboard: 'Artboard', + stateMachines: 'State Machine 1', + }); + + const { trigger: onFormSubmit } = useViewModelInstanceTrigger( + 'onFormSubmit', + rive?.viewModelInstance, + { + onTrigger: () => { + setCallbackTriggered('submit-callback'); + }, + } + ); + + const { trigger: onFormReset } = useViewModelInstanceTrigger( + 'onFormReset', + rive?.viewModelInstance, + { + onTrigger: () => { + setCallbackTriggered('reset-callback'); + }, + } + ); + + const handleSubmit = () => { + onFormSubmit(); + }; + + const handleReset = () => { + onFormReset(); + }; + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
- - - -
- Last callback triggered: {callbackTriggered || 'none'} -
-
- )} + + + +
+ Last callback triggered: {callbackTriggered || 'none'} +
- ); + )} +
+ ); }; export const PersonForm = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - autoBind: true, - artboard: "Artboard", - stateMachines: "State Machine 1", - }); - - const { value: name, setValue: setName } = useViewModelInstanceString('name', rive?.viewModelInstance); - const { value: age, setValue: setAge } = useViewModelInstanceNumber('age', rive?.viewModelInstance); - const { value: agreedToTerms, setValue: setAgreedToTerms } = useViewModelInstanceBoolean('agreedToTerms', rive?.viewModelInstance); - const { value: colorNum, setRgb } = useViewModelInstanceColor('favColor', rive?.viewModelInstance); - const { value: country, setValue: setCountry, values: countries } = useViewModelInstanceEnum('country', rive?.viewModelInstance); - const { trigger: onFormSubmit } = useViewModelInstanceTrigger('onFormSubmit', rive?.viewModelInstance); - const { trigger: onFormReset } = useViewModelInstanceTrigger('onFormReset', rive?.viewModelInstance); - - - // Drink properties (nested viewmodel) - const { value: drinkType, setValue: setDrinkType, values: drinkTypes } = useViewModelInstanceEnum('favDrink/type', rive?.viewModelInstance); - - const handleReset = () => { - setName(''); - setAge(0); - setAgreedToTerms(false); - setRgb(0, 0, 0); - setCountry(countries[0]); - setDrinkType(drinkTypes[0]); - onFormReset(); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - onFormSubmit(); - }; - - return ( -
- - - {(rive === null) ?
Loading…
: ( -
-
- -
{name}
-
- -
- -
{age}
-
- -
- -
{agreedToTerms ? 'true' : 'false'}
-
- -
- - - -
- -
- -
{country}
-
- -
- -
{drinkType}
-
- -
- - -
-
- )} -
- ); + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + autoBind: true, + artboard: 'Artboard', + stateMachines: 'State Machine 1', + }); + + const { value: name, setValue: setName } = useViewModelInstanceString( + 'name', + rive?.viewModelInstance + ); + const { value: age, setValue: setAge } = useViewModelInstanceNumber( + 'age', + rive?.viewModelInstance + ); + const { value: agreedToTerms, setValue: setAgreedToTerms } = + useViewModelInstanceBoolean('agreedToTerms', rive?.viewModelInstance); + const { value: colorNum, setRgb } = useViewModelInstanceColor( + 'favColor', + rive?.viewModelInstance + ); + const { + value: country, + setValue: setCountry, + values: countries, + } = useViewModelInstanceEnum('country', rive?.viewModelInstance); + const { trigger: onFormSubmit } = useViewModelInstanceTrigger( + 'onFormSubmit', + rive?.viewModelInstance + ); + const { trigger: onFormReset } = useViewModelInstanceTrigger( + 'onFormReset', + rive?.viewModelInstance + ); + + // Drink properties (nested viewmodel) + const { + value: drinkType, + setValue: setDrinkType, + values: drinkTypes, + } = useViewModelInstanceEnum('favDrink/type', rive?.viewModelInstance); + + const handleReset = () => { + setName(''); + setAge(0); + setAgreedToTerms(false); + setRgb(0, 0, 0); + setCountry(countries[0]); + setDrinkType(drinkTypes[0]); + onFormReset(); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onFormSubmit(); + }; + + return ( +
+ + + {rive === null ? ( +
Loading…
+ ) : ( +
+
+ +
{name}
+
+ +
+ +
{age}
+
+ +
+ +
+ {agreedToTerms ? 'true' : 'false'} +
+
+ +
+ + + +
+ +
+ +
{country}
+
+ +
+ +
{drinkType}
+
+ +
+ + +
+
+ )} +
+ ); }; - -// Component to demonstrate different viewmodel instances +// Component to demonstrate different view model instances export const PersonInstances = ({ src }: { src: string }) => { - const [activeInstance, setActiveInstance] = useState('Steve'); - const [useDefaultInstance, setUseDefaultInstance] = useState(false); - - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - stateMachines: "State Machine 1", - }); - - const viewModel = useViewModel(rive, { name: 'PersonViewModel' }); - const params = useDefaultInstance ? { useDefault: true, rive } : { name: activeInstance, rive } - const viewModelInstance = useViewModelInstance(viewModel, params); - - - const { value: name } = useViewModelInstanceString('name', viewModelInstance); - const { value: age } = useViewModelInstanceNumber('age', viewModelInstance); - const { value: country } = useViewModelInstanceEnum('country', viewModelInstance); - - const switchToNamedInstance = (instanceName: string) => { - setActiveInstance(instanceName); - setUseDefaultInstance(false); - }; - - const switchToDefaultInstance = () => { - setUseDefaultInstance(true); - }; - - return ( + const [activeInstance, setActiveInstance] = useState('Steve'); + const [useDefaultInstance, setUseDefaultInstance] = useState(false); + + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + stateMachines: 'State Machine 1', + }); + + const viewModel = useViewModel(rive, { name: 'PersonViewModel' }); + const params = useDefaultInstance + ? { useDefault: true, rive } + : { name: activeInstance, rive }; + const viewModelInstance = useViewModelInstance(viewModel, params); + + const { value: name } = useViewModelInstanceString('name', viewModelInstance); + const { value: age } = useViewModelInstanceNumber('age', viewModelInstance); + const { value: country } = useViewModelInstanceEnum( + 'country', + viewModelInstance + ); + + const switchToNamedInstance = (instanceName: string) => { + setActiveInstance(instanceName); + setUseDefaultInstance(false); + }; + + const switchToDefaultInstance = () => { + setUseDefaultInstance(true); + }; + + return ( +
+ + + {rive === null ? ( +
Loading…
+ ) : (
- - - {(rive === null) ?
Loading…
: ( -
- - - -
- )} - -
-

Instance: {useDefaultInstance ? 'Default' : activeInstance}

-

Name: {name}

-

Age: {age}

-

Country: {country}

-
+ + +
- ); + )} + +
+

+ Instance: {useDefaultInstance ? 'Default' : activeInstance} +

+

Name: {name}

+

Age: {age}

+

Country: {country}

+
+
+ ); }; export const ImagePropertyTest = ({ src }: { src: string }) => { - const [currentImageUrl, setCurrentImageUrl] = useState(''); - const [isLoading, setIsLoading] = useState(false); - - const { rive, RiveComponent } = useRive({ - src, - artboard: "Artboard", - stateMachines: "State Machine 1", - autoplay: true, - autoBind: false, - }); - - const viewModel = useViewModel(rive, { name: 'Post' }); - const viewModelInstance = useViewModelInstance(viewModel, { rive }); - - const { setValue: setImage } = useViewModelInstanceImage( - 'image', - viewModelInstance - ); - - const loadRandomImage = async () => { - if (!setImage) return; - - setIsLoading(true); - try { - const imageUrl = `https://picsum.photos/400/300?random=${Date.now()}`; - setCurrentImageUrl(imageUrl); - - const response = await fetch(imageUrl); - const imageBuffer = await response.arrayBuffer(); - const decodedImage = await decodeImage(new Uint8Array(imageBuffer)); - - setImage(decodedImage); - - decodedImage.unref(); - } catch (error) { - console.error('Failed to load image:', error); - } finally { - setIsLoading(false); - } - }; - - const clearImage = () => { - if (setImage) { - setImage(null); - setCurrentImageUrl(''); - } - }; - - - return ( -
-
- -
+ const [currentImageUrl, setCurrentImageUrl] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const { rive, RiveComponent } = useRive({ + src, + artboard: 'Artboard', + stateMachines: 'State Machine 1', + autoplay: true, + autoBind: false, + }); + + const viewModel = useViewModel(rive, { name: 'Post' }); + const viewModelInstance = useViewModelInstance(viewModel, { rive }); + + const { setValue: setImage } = useViewModelInstanceImage( + 'image', + viewModelInstance + ); + + const loadRandomImage = async () => { + if (!setImage) return; + + setIsLoading(true); + try { + const imageUrl = `https://picsum.photos/400/300?random=${Date.now()}`; + setCurrentImageUrl(imageUrl); + + const response = await fetch(imageUrl); + const imageBuffer = await response.arrayBuffer(); + const decodedImage = await decodeImage(new Uint8Array(imageBuffer)); + + setImage(decodedImage); + + decodedImage.unref(); + } catch (error) { + console.error('Failed to load image:', error); + } finally { + setIsLoading(false); + } + }; - {rive === null ? ( -
Loading…
- ) : ( -
- - - -
- )} - - {currentImageUrl && ( -
- Current image: {currentImageUrl} -
- )} + const clearImage = () => { + if (setImage) { + setImage(null); + setCurrentImageUrl(''); + } + }; + + return ( +
+
+ +
+ + {rive === null ? ( +
Loading…
+ ) : ( +
+ + + +
+ )} + + {currentImageUrl && ( +
+ + Current image: {currentImageUrl} +
- ); + )} +
+ ); }; const FONT_OPTIONS = [ - { - name: 'Noto Serif Thai', - url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notoserifthai/NotoSerifThai%5Bwdth%2Cwght%5D.ttf', - testId: 'set-font-noto-thai', - }, - { - name: 'Noto Sans Arabic', - url: './NotoSansArabic-VariableFont_wdth,wght.ttf', - testId: 'set-font-noto-arabic', - }, + { + name: 'Orbitron', + url: './Orbitron.ttf', + testId: 'set-font-orbitron', + }, + { + name: 'Noto Serif Thai', + url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notoserifthai/NotoSerifThai%5Bwdth%2Cwght%5D.ttf', + testId: 'set-font-noto-thai', + }, ] as const; export const FontPropertyTest = ({ src }: { src: string }) => { - const [currentFont, setCurrentFont] = useState(''); - const [isLoading, setIsLoading] = useState(false); - - const { rive, RiveComponent } = useRive({ - src, - stateMachines: 'State Machine 1', - autoplay: true, - autoBind: true, - }); - - const { setValue: setFont } = useViewModelInstanceFont( - 'fontProperty', - rive?.viewModelInstance - ); - - const loadFont = async (name: string, url: string) => { - if (!setFont) return; - - setIsLoading(true); - try { - const response = await fetch(url); - const fontBuffer = await response.arrayBuffer(); - const decodedFont = await decodeFont(new Uint8Array(fontBuffer)); - - setFont(decodedFont); - setCurrentFont(name); - - decodedFont.unref(); - } catch (error) { - console.error('Failed to load font:', error); - } finally { - setIsLoading(false); - } - }; - - const clearFont = () => { - if (setFont) { - setFont(null); - setCurrentFont(''); - } - }; - - return ( -
-
- -
+ const [currentFont, setCurrentFont] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const { rive, RiveComponent } = useRive({ + src, + stateMachines: 'State Machine 1', + autoplay: true, + autoBind: true, + layout: new Layout({ + fit: Fit.Layout, + layoutScaleFactor: 0.5, + }), + }); + + const { setValue: setHeadingFont } = useViewModelInstanceFont( + 'headingFont', + rive?.viewModelInstance + ); + const { setValue: setSubheadingFont } = useViewModelInstanceFont( + 'subheadingFont', + rive?.viewModelInstance + ); + + const loadFont = async (name: string, url: string) => { + if (!setHeadingFont) return; + + setIsLoading(true); + try { + const response = await fetch(url); + const fontBuffer = await response.arrayBuffer(); + const decodedFont = await decodeFont(new Uint8Array(fontBuffer)); + + setHeadingFont(decodedFont); + setSubheadingFont(decodedFont); + setCurrentFont(name); + + decodedFont.unref(); + } catch (error) { + console.error('Failed to load font:', error); + } finally { + setIsLoading(false); + } + }; - {rive === null ? ( -
Loading…
- ) : ( -
- {FONT_OPTIONS.map((font) => ( - - ))} - - -
- )} - - {currentFont && ( -
- Current font: {currentFont} -
- )} + const clearFont = () => { + if (setHeadingFont) { + setHeadingFont(null); + setSubheadingFont(null); + setCurrentFont(''); + } + }; + + return ( +
+
+ +
+ + {rive === null ? ( +
Loading…
+ ) : ( +
+ {FONT_OPTIONS.map((font) => ( + + ))} + +
- ); + )} + + {currentFont && ( +
+ Current font: {currentFont} +
+ )} +
+ ); }; // List Property Test const TodoItemComponent = ({ - index, - todoItem + index, + todoItem, }: { - index: number; - todoItem: ViewModelInstance | null; + index: number; + todoItem: ViewModelInstance | null; }) => { - const { value: text, setValue: setText } = useViewModelInstanceString('text', todoItem); - const { value: isDone, setValue: setIsDone } = useViewModelInstanceBoolean('isDone', todoItem); + const { value: text, setValue: setText } = useViewModelInstanceString( + 'text', + todoItem + ); + const { value: isDone, setValue: setIsDone } = useViewModelInstanceBoolean( + 'isDone', + todoItem + ); + + if (!todoItem) { + return
Item not found
; + } + + return ( +
+ setIsDone(e.target.checked)} + /> + setText(e.target.value)} + style={{ flex: 1 }} + /> +
+ Text: {text} +
+
+ Done: {isDone ? 'true' : 'false'} +
+
+ ); +}; - if (!todoItem) { - return
Item not found
; +export const TodoListTest = ({ src }: { src: string }) => { + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Artboard', + autoBind: false, + stateMachines: 'State Machine 1', + }); + + const viewModel = useViewModel(rive, { name: 'TodoList' }); + const viewModelInstance = useViewModelInstance(viewModel, { rive }); + + const { + length, + addInstance, + addInstanceAt, + removeInstance, + removeInstanceAt, + getInstanceAt, + swap, + } = useViewModelInstanceList('items', viewModelInstance); + + const handleAddItem = () => { + const todoItemViewModel = rive?.viewModelByName?.('TodoItem'); + if (todoItemViewModel) { + const newTodoItem = todoItemViewModel.instance?.(); + if (newTodoItem) { + addInstance(newTodoItem); + } } + }; + + const handleAddItemAt = () => { + const todoItemViewModel = rive?.viewModelByName?.('TodoItem'); + if (todoItemViewModel && length > 0) { + const newTodoItem = todoItemViewModel.instance?.(); + if (newTodoItem) { + addInstanceAt(newTodoItem, 1); + } + } + }; - return ( -
- setIsDone(e.target.checked)} - /> - setText(e.target.value)} - style={{ flex: 1 }} - /> -
- Text: {text} -
-
- Done: {isDone ? 'true' : 'false'} -
-
- ); -}; + const handleRemoveFirstInstance = () => { + const firstInstance = getInstanceAt(0); + if (firstInstance) { + removeInstance(firstInstance); + } + }; -export const TodoListTest = ({ src }: { src: string }) => { - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Artboard", - autoBind: false, - stateMachines: "State Machine 1", - }); - - const viewModel = useViewModel(rive, { name: 'TodoList' }); - const viewModelInstance = useViewModelInstance(viewModel, { rive }); - - const { - length, - addInstance, - addInstanceAt, - removeInstance, - removeInstanceAt, - getInstanceAt, - swap - } = useViewModelInstanceList('items', viewModelInstance); - - const handleAddItem = () => { - const todoItemViewModel = rive?.viewModelByName?.('TodoItem'); - if (todoItemViewModel) { - const newTodoItem = todoItemViewModel.instance?.(); - if (newTodoItem) { - addInstance(newTodoItem); - } - } - }; - - const handleAddItemAt = () => { - const todoItemViewModel = rive?.viewModelByName?.('TodoItem'); - if (todoItemViewModel && length > 0) { - const newTodoItem = todoItemViewModel.instance?.(); - if (newTodoItem) { - addInstanceAt(newTodoItem, 1); - } - } - }; - - const handleRemoveFirstInstance = () => { - const firstInstance = getInstanceAt(0); - if (firstInstance) { - removeInstance(firstInstance); - } - }; - - const handleRemoveFirstByIndex = () => { - if (length > 0) { - removeInstanceAt(0); - } - }; - - const handleSwapItems = () => { - if (length >= 2) { - swap(0, 1); - } - }; - - return ( + const handleRemoveFirstByIndex = () => { + if (length > 0) { + removeInstanceAt(0); + } + }; + + const handleSwapItems = () => { + if (length >= 2) { + swap(0, 1); + } + }; + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {rive === null ? ( -
Loading…
- ) : ( -
-
Items: {length}
- -
- - - - - - - - - -
- -
- {Array.from({ length }, (_, index) => ( - - ))} -
-
- )} +
Items: {length}
+ +
+ + + + + + + + + +
+ +
+ {Array.from({ length }, (_, index) => ( + + ))} +
- ); + )} +
+ ); }; export const ArtboardPropertyTest = ({ src }: { src: string }) => { - const [currentArtboard1, setCurrentArtboard1] = useState('None'); - const [currentArtboard2, setCurrentArtboard2] = useState('None'); - - const { rive, RiveComponent } = useRive({ - src, - autoplay: true, - artboard: "Main", - autoBind: true, - stateMachines: "State Machine 1", - }); - - const { setValue: setArtboard1 } = useViewModelInstanceArtboard('artboard_1', rive?.viewModelInstance); - const { setValue: setArtboard2 } = useViewModelInstanceArtboard('artboard_2', rive?.viewModelInstance); - - const handleSetArtboard1 = (artboardName: string) => { - if (rive) { - const artboard = rive.getArtboard(artboardName); - setArtboard1(artboard); - setCurrentArtboard1(artboardName); - } - }; - - const handleSetArtboard2 = (artboardName: string) => { - if (rive) { - const artboard = rive.getArtboard(artboardName); - setArtboard2(artboard); - setCurrentArtboard2(artboardName); - } - }; - - return ( + const [currentArtboard1, setCurrentArtboard1] = useState('None'); + const [currentArtboard2, setCurrentArtboard2] = useState('None'); + + const { rive, RiveComponent } = useRive({ + src, + autoplay: true, + artboard: 'Main', + autoBind: true, + stateMachines: 'State Machine 1', + }); + + const { setValue: setArtboard1 } = useViewModelInstanceArtboard( + 'artboard_1', + rive?.viewModelInstance + ); + const { setValue: setArtboard2 } = useViewModelInstanceArtboard( + 'artboard_2', + rive?.viewModelInstance + ); + + const handleSetArtboard1 = (artboardName: string) => { + if (rive) { + const artboard = rive.getArtboard(artboardName); + setArtboard1(artboard); + setCurrentArtboard1(artboardName); + } + }; + + const handleSetArtboard2 = (artboardName: string) => { + if (rive) { + const artboard = rive.getArtboard(artboardName); + setArtboard2(artboard); + setCurrentArtboard2(artboardName); + } + }; + + return ( +
+ + {rive === null ? ( +
Loading…
+ ) : (
- - {(rive === null) ?
Loading…
: ( -
-
-

Artboard 1:

-
- - - -
-
Current: {currentArtboard1}
-
- -
-

Artboard 2:

-
- - - -
-
Current: {currentArtboard2}
-
-
- )} +
+

Artboard 1:

+
+ + + +
+
+ Current: {currentArtboard1} +
+
+ +
+

Artboard 2:

+
+ + + +
+
+ Current: {currentArtboard2} +
+
- ); -}; \ No newline at end of file + )} +
+ ); +}; diff --git a/examples/src/components/Semantics.tsx b/examples/src/components/Semantics.tsx index 683d9a7..972389b 100644 --- a/examples/src/components/Semantics.tsx +++ b/examples/src/components/Semantics.tsx @@ -5,13 +5,7 @@ import React, { useRef, useState, } from 'react'; -import { - useRive, - EventType, - SemanticMode, - Fit, - Layout, -} from '@rive-app/react-canvas'; +import { useRive, SemanticMode, Fit, Layout } from '@rive-app/react-canvas'; /** * Testing semantics tree feature in Rive. Enable your accessibility tool to traverse the examples here (i.e. VoiceOver). @@ -22,10 +16,7 @@ import { // The example .riv files, copied into examples/public. Each is loaded with the // file's default artboard and a state machine named "State Machine 1". -const RIV_FILES = [ - 'data_binding_lists.riv', - 'semantic_warning_exp4.riv', -]; +const RIV_FILES = ['data_binding_lists.riv', 'semantic_warning_exp4.riv']; type FitValue = 'contain' | 'cover' | 'layout'; @@ -233,7 +224,7 @@ const Semantics = () => { onDrop={onDrop} > {source && ( -
+
Date: Fri, 7 Aug 2026 12:09:18 -0700 Subject: [PATCH 3/3] add default font these fonts are not embeded so we need to add one when it loads --- examples/src/components/DataBindingTests.tsx | 51 ++++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/examples/src/components/DataBindingTests.tsx b/examples/src/components/DataBindingTests.tsx index e1875af..9342f79 100644 --- a/examples/src/components/DataBindingTests.tsx +++ b/examples/src/components/DataBindingTests.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { useRive, @@ -770,26 +770,29 @@ export const FontPropertyTest = ({ src }: { src: string }) => { rive?.viewModelInstance ); - const loadFont = async (name: string, url: string) => { - if (!setHeadingFont) return; - - setIsLoading(true); - try { - const response = await fetch(url); - const fontBuffer = await response.arrayBuffer(); - const decodedFont = await decodeFont(new Uint8Array(fontBuffer)); - - setHeadingFont(decodedFont); - setSubheadingFont(decodedFont); - setCurrentFont(name); - - decodedFont.unref(); - } catch (error) { - console.error('Failed to load font:', error); - } finally { - setIsLoading(false); - } - }; + const loadFont = useCallback( + async (name: string, url: string) => { + if (!setHeadingFont) return; + + setIsLoading(true); + try { + const response = await fetch(url); + const fontBuffer = await response.arrayBuffer(); + const decodedFont = await decodeFont(new Uint8Array(fontBuffer)); + + setHeadingFont(decodedFont); + setSubheadingFont(decodedFont); + setCurrentFont(name); + + decodedFont.unref(); + } catch (error) { + console.error('Failed to load font:', error); + } finally { + setIsLoading(false); + } + }, + [setHeadingFont, setSubheadingFont] + ); const clearFont = () => { if (setHeadingFont) { @@ -799,6 +802,12 @@ export const FontPropertyTest = ({ src }: { src: string }) => { } }; + useEffect(() => { + if (rive) { + loadFont(FONT_OPTIONS[0].name, FONT_OPTIONS[0].url); + } + }, [loadFont, rive]); + return (