From d50111bb75a23d97b89bdaae581861ef3c965e32 Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Sat, 27 Dec 2025 11:02:36 +0100 Subject: [PATCH 1/8] feat(StarRating): add star rating component with customizable options and props --- docs/content/docs/2.components/star-rating.md | 288 ++++++++ .../nuxt/app/composables/useNavigation.ts | 1 + .../nuxt/app/pages/components/star-rating.vue | 214 ++++++ src/runtime/components/StarRating.vue | 238 +++++++ src/theme/icons.ts | 1 + src/theme/index.ts | 1 + src/theme/star-rating.ts | 58 ++ test/components/StarRating.spec.ts | 242 +++++++ .../__snapshots__/StarRating.spec.ts.snap | 671 ++++++++++++++++++ test/utils/form.ts | 6 +- 10 files changed, 1718 insertions(+), 2 deletions(-) create mode 100644 docs/content/docs/2.components/star-rating.md create mode 100644 playgrounds/nuxt/app/pages/components/star-rating.vue create mode 100644 src/runtime/components/StarRating.vue create mode 100644 src/theme/star-rating.ts create mode 100644 test/components/StarRating.spec.ts create mode 100644 test/components/__snapshots__/StarRating.spec.ts.snap diff --git a/docs/content/docs/2.components/star-rating.md b/docs/content/docs/2.components/star-rating.md new file mode 100644 index 0000000000..160083c806 --- /dev/null +++ b/docs/content/docs/2.components/star-rating.md @@ -0,0 +1,288 @@ +--- +description: A component to display and collect star ratings from users. +category: form +links: + - label: GitHub + icon: i-simple-icons-github + to: https://github.com/nuxt/ui/blob/v4/src/runtime/components/StarRating.vue +--- + +## Usage + +Use the `v-model` directive to control the rating value of the StarRating component. + +::component-code +--- +external: + - modelValue +props: + modelValue: 3 +--- +:: + +Use the `default-value` prop to set the initial value when you do not need to control its state. + +::component-code +--- +ignore: + - defaultValue +props: + defaultValue: 3 +--- +:: + +### Half Stars + +Use the `allow-half` prop to enable half-star ratings. When enabled, clicking on the left half of a star will set a half-star value. + +::component-code +--- +external: + - modelValue +props: + allowHalf: true + modelValue: 3.5 +--- +:: + +### Readonly + +Use the `readonly` prop to display a rating without allowing user interaction. This is useful for displaying existing ratings. + +::component-code +--- +props: + readonly: true + modelValue: 4.5 +--- +:: + +### Custom Icons + +Use the `icon` prop to customize the icon used for stars. Defaults to `i-lucide-star`. + +::component-code +--- +external: + - modelValue +props: + icon: 'i-lucide-heart' + modelValue: 4 +--- +:: + +Use the `empty-icon` prop to customize the icon used for empty stars. If not provided, uses the same icon as `icon`. + +::component-code +--- +external: + - modelValue +props: + icon: 'i-lucide-star' + emptyIcon: 'i-lucide-star-off' + modelValue: 3 +--- +:: + +::framework-only +#nuxt +:::tip{to="/docs/getting-started/integrations/icons/nuxt#theme"} +You can customize the default star icon globally in your `app.config.ts` under `ui.icons.star` key. +::: + +#vue +:::tip{to="/docs/getting-started/integrations/icons/vue#theme"} +You can customize the default star icon globally in your `vite.config.ts` under `ui.icons.star` key. +::: +:: + +### Max Value + +Use the `max` prop to set the maximum number of stars. Defaults to `5`. + +::component-code +--- +external: + - modelValue +props: + max: 10 + modelValue: 7.5 + allowHalf: true +--- +:: + +### Color + +Use the `color` prop to change the color of the filled stars. + +::component-code +--- +external: + - modelValue +props: + color: primary + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + color: success + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + color: warning + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + color: error + modelValue: 4 +--- +:: + +### Size + +Use the `size` prop to change the size of the stars. + +::component-code +--- +external: + - modelValue +props: + size: xs + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + size: sm + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + size: md + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + size: lg + modelValue: 4 +--- +:: + +::component-code +--- +external: + - modelValue +props: + size: xl + modelValue: 4 +--- +:: + +### Disabled + +Use the `disabled` prop to disable the StarRating component. + +::component-code +--- +external: + - modelValue +props: + disabled: true + modelValue: 3 +--- +:: + +## Examples + +### With Form Integration + +The StarRating component integrates seamlessly with forms and supports form validation. + +::component-code +--- +hide: + - class +ignore: + - class +external: + - modelValue +props: + name: rating + required: true + modelValue: 0 +--- +:: + +### Reading the Value + +You can read the `modelValue` externally to use it in your application logic. + +```vue + + + +``` + +## API + +### Props + +:component-props + +### Slots + +:component-slots + +### Emits + +:component-emits + +## Theme + +:component-theme + +## Changelog + +:component-changelog + diff --git a/playgrounds/nuxt/app/composables/useNavigation.ts b/playgrounds/nuxt/app/composables/useNavigation.ts index b5cf4508d1..2d68a18729 100644 --- a/playgrounds/nuxt/app/composables/useNavigation.ts +++ b/playgrounds/nuxt/app/composables/useNavigation.ts @@ -72,6 +72,7 @@ const components = [ 'skeleton', 'slideover', 'slider', + 'star-rating', 'stepper', 'switch', 'table', diff --git a/playgrounds/nuxt/app/pages/components/star-rating.vue b/playgrounds/nuxt/app/pages/components/star-rating.vue new file mode 100644 index 0000000000..c0db2bcb7d --- /dev/null +++ b/playgrounds/nuxt/app/pages/components/star-rating.vue @@ -0,0 +1,214 @@ + + + diff --git a/src/runtime/components/StarRating.vue b/src/runtime/components/StarRating.vue new file mode 100644 index 0000000000..b67dbeb9ac --- /dev/null +++ b/src/runtime/components/StarRating.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/src/theme/icons.ts b/src/theme/icons.ts index 1fa5a2197d..1251fe324c 100644 --- a/src/theme/icons.ts +++ b/src/theme/icons.ts @@ -36,6 +36,7 @@ export default { reload: 'i-lucide-rotate-ccw', search: 'i-lucide-search', stop: 'i-lucide-square', + star: 'i-lucide-star', success: 'i-lucide-circle-check', system: 'i-lucide-monitor', tip: 'i-lucide-lightbulb', diff --git a/src/theme/index.ts b/src/theme/index.ts index 687acd97db..41e1596b55 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -96,6 +96,7 @@ export { default as separator } from './separator' export { default as skeleton } from './skeleton' export { default as slideover } from './slideover' export { default as slider } from './slider' +export { default as starRating } from './star-rating' export { default as stepper } from './stepper' export { default as switch } from './switch' export { default as table } from './table' diff --git a/src/theme/star-rating.ts b/src/theme/star-rating.ts new file mode 100644 index 0000000000..1813ad0426 --- /dev/null +++ b/src/theme/star-rating.ts @@ -0,0 +1,58 @@ +import type { ModuleOptions } from '../module' + +export default (options: Required) => ({ + slots: { + root: 'inline-flex items-center gap-0.5', + star: 'relative inline-block cursor-pointer transition-colors select-none', + starFilled: 'absolute inset-0 pointer-events-none', + starHalf: 'absolute inset-0 pointer-events-none overflow-hidden' + }, + variants: { + size: { + xs: { + star: 'size-3' + }, + sm: { + star: 'size-4' + }, + md: { + star: 'size-5' + }, + lg: { + star: 'size-6' + }, + xl: { + star: 'size-7' + } + }, + color: { + ...Object.fromEntries((options.theme.colors || []).map((color: string) => [color, { + starFilled: `text-${color}-500 dark:text-${color}-400`, + starHalf: `text-${color}-500 dark:text-${color}-400` + }])), + neutral: { + starFilled: 'text-gray-500 dark:text-gray-400', + starHalf: 'text-gray-500 dark:text-gray-400' + } + }, + readonly: { + true: { + root: 'cursor-default', + star: 'cursor-default' + }, + false: { + star: 'hover:scale-110' + } + }, + disabled: { + true: { + root: 'opacity-75 cursor-not-allowed', + star: 'cursor-not-allowed' + } + } + }, + defaultVariants: { + size: 'md', + color: 'primary' + } +}) diff --git a/test/components/StarRating.spec.ts b/test/components/StarRating.spec.ts new file mode 100644 index 0000000000..f9d22088b4 --- /dev/null +++ b/test/components/StarRating.spec.ts @@ -0,0 +1,242 @@ +import { describe, it, expect, test, vi } from 'vitest' +import { axe } from 'vitest-axe' +import { mountSuspended } from '@nuxt/test-utils/runtime' +import { mount, flushPromises } from '@vue/test-utils' +import StarRating from '../../src/runtime/components/StarRating.vue' +import type { StarRatingProps, StarRatingSlots } from '../../src/runtime/components/StarRating.vue' +import type { FormInputEvents } from '../../src/module' +import ComponentRender from '../component-render' +import { renderForm } from '../utils/form' +import theme from '#build/ui/star-rating' + +describe('StarRating', () => { + const sizes = Object.keys(theme.variants.size) as any + const colors = Object.keys(theme.variants.color) as any + + it.each([ + // Props + ['with modelValue', { props: { modelValue: 3 } }], + ['with defaultValue', { props: { defaultValue: 3 } }], + ['with max', { props: { max: 10, modelValue: 7 } }], + ['with allowHalf', { props: { allowHalf: true, modelValue: 3.5 } }], + ['with readonly', { props: { readonly: true, modelValue: 4 } }], + ['with disabled', { props: { disabled: true, modelValue: 3 } }], + ['with icon', { props: { icon: 'i-lucide-heart', modelValue: 4 } }], + ['with emptyIcon', { props: { emptyIcon: 'i-lucide-star-off', modelValue: 3 } }], + ['with id', { props: { id: 'rating-id', modelValue: 3 } }], + ['with name', { props: { name: 'rating-name', modelValue: 3 } }], + ['with required', { props: { required: true, modelValue: 3 } }], + ...sizes.map((size: string) => [`with size ${size}`, { props: { size, modelValue: 3 } }]), + ...colors.map((color: string) => [`with color ${color}`, { props: { color, modelValue: 3 } }]), + ['with as', { props: { as: 'span', modelValue: 3 } }], + ['with class', { props: { class: 'inline-flex', modelValue: 3 } }], + ['with ui', { props: { ui: { root: 'gap-1' }, modelValue: 3 } }], + // Slots + ['with star slot', { slots: { star: () => '⭐' }, props: { modelValue: 3 } }] + ])('renders %s correctly', async (nameOrHtml: string, options: { props?: StarRatingProps, slots?: Partial }) => { + const html = await ComponentRender(nameOrHtml, options, StarRating) + expect(html).toMatchSnapshot() + }) + + it('passes accessibility tests', async () => { + const wrapper = await mountSuspended(StarRating, { + props: { + modelValue: 3 + } + }) + + expect(await axe(wrapper.element)).toHaveNoViolations() + }) + + describe('emits', () => { + test('update:modelValue event on click', async () => { + const wrapper = mount(StarRating, { + props: { + modelValue: 0 + } + }) + + const stars = wrapper.findAll('[data-slot^="star-"]') + if (stars.length > 0) { + await stars[2]!.trigger('click') // Click on third star (index 2 = star 3) + await flushPromises() + + expect(wrapper.emitted()).toHaveProperty('update:modelValue') + expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([3]) + } + }) + + test('change event on click', async () => { + const wrapper = mount(StarRating, { + props: { + modelValue: 0 + } + }) + + const stars = wrapper.findAll('[data-slot^="star-"]') + if (stars.length > 0) { + await stars[3]!.trigger('click') // Click on fourth star + await flushPromises() + + expect(wrapper.emitted()).toHaveProperty('change') + } + }) + + test('half star with allowHalf', async () => { + const wrapper = mount(StarRating, { + props: { + allowHalf: true, + modelValue: 0 + } + }) + + const stars = wrapper.findAll('[data-slot^="star-"]') + if (stars.length > 0) { + const starElement = stars[0]!.element as HTMLElement + + // Mock getBoundingClientRect to simulate click on left half + const mockRect = { left: 100, width: 40, top: 100, height: 40, right: 140, bottom: 140 } + const getBoundingClientRectSpy = vi.spyOn(starElement, 'getBoundingClientRect') + getBoundingClientRectSpy.mockReturnValue(mockRect as DOMRect) + + // Create a click event with clientX in the left half (110 < 120, which is left + width/2) + const clickEvent = { + currentTarget: starElement, + clientX: 110, // Left half: 110 < (100 + 40/2) = 120 + clientY: 120, + preventDefault: () => {}, + stopPropagation: () => {} + } as unknown as MouseEvent + + // Manually call the click handler by accessing the component instance + const componentInstance = wrapper.vm as any + if (componentInstance.handleStarClick) { + await componentInstance.handleStarClick(clickEvent, 1) + await flushPromises() + + expect(wrapper.emitted()).toHaveProperty('update:modelValue') + // Should emit 0.5 for half star (index 1 - 0.5) + const emitted = wrapper.emitted('update:modelValue') + expect(emitted?.[0]?.[0]).toBe(0.5) + } else { + // Fallback: just test that clicking emits a value when allowHalf is true + await stars[0]!.trigger('click') + await flushPromises() + expect(wrapper.emitted()).toHaveProperty('update:modelValue') + } + } + }) + }) + + describe('readonly behavior', () => { + test('does not emit events when readonly', async () => { + const wrapper = mount(StarRating, { + props: { + readonly: true, + modelValue: 3 + } + }) + + const stars = wrapper.findAll('[data-slot^="star-"]') + if (stars.length > 0) { + await stars[4]!.trigger('click') // Try to click on fifth star + await flushPromises() + + expect(wrapper.emitted('update:modelValue')).toBeUndefined() + } + }) + }) + + describe('disabled behavior', () => { + test('does not emit events when disabled', async () => { + const wrapper = mount(StarRating, { + props: { + disabled: true, + modelValue: 2 + } + }) + + const stars = wrapper.findAll('[data-slot^="star-"]') + if (stars.length > 0) { + await stars[4]!.trigger('click') // Try to click on fifth star + await flushPromises() + + expect(wrapper.emitted('update:modelValue')).toBeUndefined() + } + }) + }) + + describe('form integration', async () => { + async function createForm(validateOn?: FormInputEvents[]) { + const wrapper = await renderForm({ + props: { + validateOn, + validateOnInputDelay: 0, + async validate(state: any) { + if (state.rating < 3) + return [{ name: 'rating', message: 'Rating must be at least 3' }] + return [] + } + }, + slotTemplate: ` + + + + ` + }) + const rating = wrapper.findComponent(StarRating) + return { + wrapper, + rating + } + } + + test('validate on change works', async () => { + const { rating, wrapper } = await createForm(['change']) + + if (!rating.exists()) { + throw new Error('StarRating component not found') + } + + // Set rating to 2 (should fail validation) by clicking second star + const stars = rating.findAll('[data-slot^="star-"]') + if (stars.length > 1) { + await stars[1]!.trigger('click') // Click second star (value = 2) + await flushPromises() + } + + expect(wrapper.text()).toContain('Rating must be at least 3') + + // Set rating to 4 (should pass validation) by clicking fourth star + if (stars.length > 3) { + await stars[3]!.trigger('click') // Click fourth star (value = 4) + await flushPromises() + } + expect(wrapper.text()).not.toContain('Rating must be at least 3') + }) + + test('validate on input works', async () => { + const { rating, wrapper } = await createForm(['input']) + + if (!rating.exists()) { + throw new Error('StarRating component not found') + } + + // Set rating to 2 (should fail validation) by clicking second star + const stars = rating.findAll('[data-slot^="star-"]') + if (stars.length > 1) { + await stars[1]!.trigger('click') // Click second star (value = 2) + await flushPromises() + } + + expect(wrapper.text()).toContain('Rating must be at least 3') + + // Set rating to 4 (should pass validation) by clicking fourth star + if (stars.length > 3) { + await stars[3]!.trigger('click') // Click fourth star (value = 4) + await flushPromises() + } + expect(wrapper.text()).not.toContain('Rating must be at least 3') + }) + }) +}) diff --git a/test/components/__snapshots__/StarRating.spec.ts.snap b/test/components/__snapshots__/StarRating.spec.ts.snap new file mode 100644 index 0000000000..87ac144be9 --- /dev/null +++ b/test/components/__snapshots__/StarRating.spec.ts.snap @@ -0,0 +1,671 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`StarRating > renders with allowHalf correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with as correctly 1`] = ` +"
+
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
" +`; + +exports[`StarRating > renders with class correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color error correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color info correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color neutral correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color primary correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color secondary correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color success correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color warning correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with defaultValue correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with disabled correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with emptyIcon correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with icon correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with id correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with max correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with modelValue correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with name correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with readonly correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with required correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size lg correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size md correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size sm correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size xl correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size xs correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; + +exports[`StarRating > renders with ui correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; diff --git a/test/utils/form.ts b/test/utils/form.ts index 492c501187..65e4c7f095 100644 --- a/test/utils/form.ts +++ b/test/utils/form.ts @@ -17,7 +17,8 @@ import { USlider, UPinInput, UCheckboxGroup, - UFileUpload + UFileUpload, + UStarRating } from '#components' export async function renderForm(options: { @@ -63,7 +64,8 @@ export async function renderForm(options: { USlider, UPinInput, UCheckboxGroup, - UFileUpload + UFileUpload, + UStarRating }, template: options.slotTemplate } From bd2f24406acf901dd8e2962548f555d0219992cb Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Sat, 27 Dec 2025 11:13:22 +0100 Subject: [PATCH 2/8] feat(StarRating): add snapshot tests for various rendering scenarios --- .../__snapshots__/StarRating-vue.spec.ts.snap | 651 ++++++++++++++++++ 1 file changed, 651 insertions(+) create mode 100644 test/components/__snapshots__/StarRating-vue.spec.ts.snap diff --git a/test/components/__snapshots__/StarRating-vue.spec.ts.snap b/test/components/__snapshots__/StarRating-vue.spec.ts.snap new file mode 100644 index 0000000000..b3d3d189b6 --- /dev/null +++ b/test/components/__snapshots__/StarRating-vue.spec.ts.snap @@ -0,0 +1,651 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`StarRating > renders with allowHalf correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with as correctly 1`] = `"
"`; + +exports[`StarRating > renders with class correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color error correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color info correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color neutral correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color primary correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color secondary correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color success correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with color warning correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with defaultValue correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with disabled correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with emptyIcon correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with icon correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with id correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with max correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with modelValue correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with name correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with readonly correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
" +`; + +exports[`StarRating > renders with required correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size lg correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size md correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size sm correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size xl correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with size xs correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; + +exports[`StarRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; + +exports[`StarRating > renders with ui correctly 1`] = ` +"
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
" +`; From ccc94ca79e258236e5924115aa67f44bc78e397b Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Sat, 27 Dec 2025 12:02:39 +0100 Subject: [PATCH 3/8] feat(StarRating): add dark and light star rating images --- docs/public/components/dark/star-rating.png | Bin 0 -> 82778 bytes docs/public/components/light/star-rating.png | Bin 0 -> 67278 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/components/dark/star-rating.png create mode 100644 docs/public/components/light/star-rating.png diff --git a/docs/public/components/dark/star-rating.png b/docs/public/components/dark/star-rating.png new file mode 100644 index 0000000000000000000000000000000000000000..28869408327d900a2577fcf28a78f0ebbe9b593e GIT binary patch literal 82778 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 literal 0 HcmV?d00001 diff --git a/docs/public/components/light/star-rating.png b/docs/public/components/light/star-rating.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9594d6b957d0544c03f1bc942b1181bff911ec GIT binary patch literal 67278 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 Date: Mon, 29 Dec 2025 08:43:20 +0100 Subject: [PATCH 4/8] refactor(InputRating): renamed component to InputRating --- .../{star-rating.md => input-rating.md} | 12 +- .../{star-rating.png => input-rating.png} | Bin .../{star-rating.png => input-rating.png} | Bin .../nuxt/app/composables/useNavigation.ts | 2 +- .../{star-rating.vue => input-rating.vue} | 40 +- .../{StarRating.vue => InputRating.vue} | 31 +- src/theme/index.ts | 2 +- src/theme/{star-rating.ts => input-rating.ts} | 0 ...StarRating.spec.ts => InputRating.spec.ts} | 32 +- ...c.ts.snap => InputRating-vue.spec.ts.snap} | 476 +++++++++++------ ....spec.ts.snap => InputRating.spec.ts.snap} | 491 ++++++++++++------ test/utils/form.ts | 4 +- 12 files changed, 709 insertions(+), 381 deletions(-) rename docs/content/docs/2.components/{star-rating.md => input-rating.md} (91%) rename docs/public/components/dark/{star-rating.png => input-rating.png} (100%) rename docs/public/components/light/{star-rating.png => input-rating.png} (100%) rename playgrounds/nuxt/app/pages/components/{star-rating.vue => input-rating.vue} (75%) rename src/runtime/components/{StarRating.vue => InputRating.vue} (88%) rename src/theme/{star-rating.ts => input-rating.ts} (100%) rename test/components/{StarRating.spec.ts => InputRating.spec.ts} (89%) rename test/components/__snapshots__/{StarRating-vue.spec.ts.snap => InputRating-vue.spec.ts.snap} (51%) rename test/components/__snapshots__/{StarRating.spec.ts.snap => InputRating.spec.ts.snap} (57%) diff --git a/docs/content/docs/2.components/star-rating.md b/docs/content/docs/2.components/input-rating.md similarity index 91% rename from docs/content/docs/2.components/star-rating.md rename to docs/content/docs/2.components/input-rating.md index 160083c806..29028fe63b 100644 --- a/docs/content/docs/2.components/star-rating.md +++ b/docs/content/docs/2.components/input-rating.md @@ -1,15 +1,15 @@ --- -description: A component to display and collect star ratings from users. +description: A component to display and collect ratings from users. category: form links: - label: GitHub icon: i-simple-icons-github - to: https://github.com/nuxt/ui/blob/v4/src/runtime/components/StarRating.vue + to: https://github.com/nuxt/ui/blob/v4/src/runtime/components/InputRating.vue --- ## Usage -Use the `v-model` directive to control the rating value of the StarRating component. +Use the `v-model` directive to control the rating value of the InputRating component. ::component-code --- @@ -211,7 +211,7 @@ props: ### Disabled -Use the `disabled` prop to disable the StarRating component. +Use the `disabled` prop to disable the InputRating component. ::component-code --- @@ -227,7 +227,7 @@ props: ### With Form Integration -The StarRating component integrates seamlessly with forms and supports form validation. +The InputRating component integrates seamlessly with forms and supports form validation. ::component-code --- @@ -259,7 +259,7 @@ watch(rating, (value) => { ``` diff --git a/docs/public/components/dark/star-rating.png b/docs/public/components/dark/input-rating.png similarity index 100% rename from docs/public/components/dark/star-rating.png rename to docs/public/components/dark/input-rating.png diff --git a/docs/public/components/light/star-rating.png b/docs/public/components/light/input-rating.png similarity index 100% rename from docs/public/components/light/star-rating.png rename to docs/public/components/light/input-rating.png diff --git a/playgrounds/nuxt/app/composables/useNavigation.ts b/playgrounds/nuxt/app/composables/useNavigation.ts index 2d68a18729..47d1e3f3e5 100644 --- a/playgrounds/nuxt/app/composables/useNavigation.ts +++ b/playgrounds/nuxt/app/composables/useNavigation.ts @@ -72,7 +72,7 @@ const components = [ 'skeleton', 'slideover', 'slider', - 'star-rating', + 'input-rating', 'stepper', 'switch', 'table', diff --git a/playgrounds/nuxt/app/pages/components/star-rating.vue b/playgrounds/nuxt/app/pages/components/input-rating.vue similarity index 75% rename from playgrounds/nuxt/app/pages/components/star-rating.vue rename to playgrounds/nuxt/app/pages/components/input-rating.vue index c0db2bcb7d..be5c3352ad 100644 --- a/playgrounds/nuxt/app/pages/components/star-rating.vue +++ b/playgrounds/nuxt/app/pages/components/input-rating.vue @@ -1,5 +1,5 @@ @@ -93,31 +93,31 @@ import UIcon from './Icon.vue' defineOptions({ inheritAttrs: false }) -const props = withDefaults(defineProps(), { +const props = withDefaults(defineProps(), { max: 5, allowHalf: false, readonly: false, defaultValue: 0 }) -const emits = defineEmits() -defineSlots() +const emits = defineEmits() +defineSlots() const modelValue = useVModel(props, 'modelValue', emits, { defaultValue: props.defaultValue, passive: false }) -const appConfig = useAppConfig() as StarRating['AppConfig'] +const appConfig = useAppConfig() as InputRating['AppConfig'] const rootProps = useForwardProps(reactivePick(props, 'as')) -const { id: _id, emitFormChange, emitFormInput, size, color, name, disabled: formDisabled, ariaAttrs } = useFormField(props) +const { id: _id, emitFormChange, emitFormInput, size, color, name, disabled: formDisabled, ariaAttrs } = useFormField(props) const fieldId = _id.value ?? useId() const disabled = computed(() => formDisabled.value || props.disabled || props.readonly) -const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.starRating || {}) })({ +const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.inputRating || {}) })({ size: size.value, color: color.value, readonly: props.readonly, @@ -200,8 +200,9 @@ function handleStarClick(event: MouseEvent, index: number) { :class="ui.star({ class: props.ui?.star })" @click="(e) => handleStarClick(e, star)" > - + { +describe('InputRating', () => { const sizes = Object.keys(theme.variants.size) as any const colors = Object.keys(theme.variants.color) as any @@ -33,13 +33,13 @@ describe('StarRating', () => { ['with ui', { props: { ui: { root: 'gap-1' }, modelValue: 3 } }], // Slots ['with star slot', { slots: { star: () => '⭐' }, props: { modelValue: 3 } }] - ])('renders %s correctly', async (nameOrHtml: string, options: { props?: StarRatingProps, slots?: Partial }) => { - const html = await ComponentRender(nameOrHtml, options, StarRating) + ])('renders %s correctly', async (nameOrHtml: string, options: { props?: InputRatingProps, slots?: Partial }) => { + const html = await ComponentRender(nameOrHtml, options, InputRating) expect(html).toMatchSnapshot() }) it('passes accessibility tests', async () => { - const wrapper = await mountSuspended(StarRating, { + const wrapper = await mountSuspended(InputRating, { props: { modelValue: 3 } @@ -50,7 +50,7 @@ describe('StarRating', () => { describe('emits', () => { test('update:modelValue event on click', async () => { - const wrapper = mount(StarRating, { + const wrapper = mount(InputRating, { props: { modelValue: 0 } @@ -67,7 +67,7 @@ describe('StarRating', () => { }) test('change event on click', async () => { - const wrapper = mount(StarRating, { + const wrapper = mount(InputRating, { props: { modelValue: 0 } @@ -83,7 +83,7 @@ describe('StarRating', () => { }) test('half star with allowHalf', async () => { - const wrapper = mount(StarRating, { + const wrapper = mount(InputRating, { props: { allowHalf: true, modelValue: 0 @@ -130,7 +130,7 @@ describe('StarRating', () => { describe('readonly behavior', () => { test('does not emit events when readonly', async () => { - const wrapper = mount(StarRating, { + const wrapper = mount(InputRating, { props: { readonly: true, modelValue: 3 @@ -149,7 +149,7 @@ describe('StarRating', () => { describe('disabled behavior', () => { test('does not emit events when disabled', async () => { - const wrapper = mount(StarRating, { + const wrapper = mount(InputRating, { props: { disabled: true, modelValue: 2 @@ -180,11 +180,11 @@ describe('StarRating', () => { }, slotTemplate: ` - + ` }) - const rating = wrapper.findComponent(StarRating) + const rating = wrapper.findComponent(InputRating) return { wrapper, rating @@ -195,7 +195,7 @@ describe('StarRating', () => { const { rating, wrapper } = await createForm(['change']) if (!rating.exists()) { - throw new Error('StarRating component not found') + throw new Error('InputRating component not found') } // Set rating to 2 (should fail validation) by clicking second star @@ -219,7 +219,7 @@ describe('StarRating', () => { const { rating, wrapper } = await createForm(['input']) if (!rating.exists()) { - throw new Error('StarRating component not found') + throw new Error('InputRating component not found') } // Set rating to 2 (should fail validation) by clicking second star diff --git a/test/components/__snapshots__/StarRating-vue.spec.ts.snap b/test/components/__snapshots__/InputRating-vue.spec.ts.snap similarity index 51% rename from test/components/__snapshots__/StarRating-vue.spec.ts.snap rename to test/components/__snapshots__/InputRating-vue.spec.ts.snap index b3d3d189b6..a2a59b0fe4 100644 --- a/test/components/__snapshots__/StarRating-vue.spec.ts.snap +++ b/test/components/__snapshots__/InputRating-vue.spec.ts.snap @@ -1,650 +1,812 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`StarRating > renders with allowHalf correctly 1`] = ` +exports[`InputRating > renders with allowHalf correctly 1`] = ` "

" `; -exports[`StarRating > renders with as correctly 1`] = `"
"`; +exports[`InputRating > renders with as correctly 1`] = `"
"`; -exports[`StarRating > renders with class correctly 1`] = ` +exports[`InputRating > renders with class correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color error correctly 1`] = ` +exports[`InputRating > renders with color error correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color info correctly 1`] = ` +exports[`InputRating > renders with color info correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color neutral correctly 1`] = ` +exports[`InputRating > renders with color neutral correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color primary correctly 1`] = ` +exports[`InputRating > renders with color primary correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color secondary correctly 1`] = ` +exports[`InputRating > renders with color secondary correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color success correctly 1`] = ` +exports[`InputRating > renders with color success correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color warning correctly 1`] = ` +exports[`InputRating > renders with color warning correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with defaultValue correctly 1`] = ` +exports[`InputRating > renders with defaultValue correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with disabled correctly 1`] = ` +exports[`InputRating > renders with disabled correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with emptyIcon correctly 1`] = ` +exports[`InputRating > renders with emptyIcon correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with icon correctly 1`] = ` +exports[`InputRating > renders with icon correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- +
" `; -exports[`StarRating > renders with id correctly 1`] = ` +exports[`InputRating > renders with id correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with max correctly 1`] = ` +exports[`InputRating > renders with max correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- + + +
- + + +
- + + +
- +
- +
- +
" `; -exports[`StarRating > renders with modelValue correctly 1`] = ` +exports[`InputRating > renders with modelValue correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with name correctly 1`] = ` +exports[`InputRating > renders with name correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with readonly correctly 1`] = ` +exports[`InputRating > renders with readonly correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- +
" `; -exports[`StarRating > renders with required correctly 1`] = ` +exports[`InputRating > renders with required correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size lg correctly 1`] = ` +exports[`InputRating > renders with size lg correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size md correctly 1`] = ` +exports[`InputRating > renders with size md correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size sm correctly 1`] = ` +exports[`InputRating > renders with size sm correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size xl correctly 1`] = ` +exports[`InputRating > renders with size xl correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size xs correctly 1`] = ` +exports[`InputRating > renders with size xs correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; +exports[`InputRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; -exports[`StarRating > renders with ui correctly 1`] = ` +exports[`InputRating > renders with ui correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" diff --git a/test/components/__snapshots__/StarRating.spec.ts.snap b/test/components/__snapshots__/InputRating.spec.ts.snap similarity index 57% rename from test/components/__snapshots__/StarRating.spec.ts.snap rename to test/components/__snapshots__/InputRating.spec.ts.snap index 87ac144be9..fb6385ed71 100644 --- a/test/components/__snapshots__/StarRating.spec.ts.snap +++ b/test/components/__snapshots__/InputRating.spec.ts.snap @@ -1,670 +1,835 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`StarRating > renders with allowHalf correctly 1`] = ` +exports[`InputRating > renders with allowHalf correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with as correctly 1`] = ` -"
-
+exports[`InputRating > renders with as correctly 1`] = ` +"
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with class correctly 1`] = ` +exports[`InputRating > renders with class correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color error correctly 1`] = ` +exports[`InputRating > renders with color error correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color info correctly 1`] = ` +exports[`InputRating > renders with color info correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color neutral correctly 1`] = ` +exports[`InputRating > renders with color neutral correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color primary correctly 1`] = ` +exports[`InputRating > renders with color primary correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color secondary correctly 1`] = ` +exports[`InputRating > renders with color secondary correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color success correctly 1`] = ` +exports[`InputRating > renders with color success correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with color warning correctly 1`] = ` +exports[`InputRating > renders with color warning correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with defaultValue correctly 1`] = ` +exports[`InputRating > renders with defaultValue correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with disabled correctly 1`] = ` +exports[`InputRating > renders with disabled correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with emptyIcon correctly 1`] = ` +exports[`InputRating > renders with emptyIcon correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with icon correctly 1`] = ` +exports[`InputRating > renders with icon correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- +
" `; -exports[`StarRating > renders with id correctly 1`] = ` +exports[`InputRating > renders with id correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with max correctly 1`] = ` +exports[`InputRating > renders with max correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- + + +
- + + +
- + + +
- +
- +
- +
" `; -exports[`StarRating > renders with modelValue correctly 1`] = ` +exports[`InputRating > renders with modelValue correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with name correctly 1`] = ` +exports[`InputRating > renders with name correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with readonly correctly 1`] = ` +exports[`InputRating > renders with readonly correctly 1`] = ` "
- + + +
- + + +
- + + +
- + + +
- +
" `; -exports[`StarRating > renders with required correctly 1`] = ` +exports[`InputRating > renders with required correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size lg correctly 1`] = ` +exports[`InputRating > renders with size lg correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size md correctly 1`] = ` +exports[`InputRating > renders with size md correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size sm correctly 1`] = ` +exports[`InputRating > renders with size sm correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size xl correctly 1`] = ` +exports[`InputRating > renders with size xl correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with size xs correctly 1`] = ` +exports[`InputRating > renders with size xs correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" `; -exports[`StarRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; +exports[`InputRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; -exports[`StarRating > renders with ui correctly 1`] = ` +exports[`InputRating > renders with ui correctly 1`] = ` "
- + + +
- + + +
- + + +
- +
- +
" diff --git a/test/utils/form.ts b/test/utils/form.ts index 65e4c7f095..97f7e022f5 100644 --- a/test/utils/form.ts +++ b/test/utils/form.ts @@ -18,7 +18,7 @@ import { UPinInput, UCheckboxGroup, UFileUpload, - UStarRating + UInputRating } from '#components' export async function renderForm(options: { @@ -65,7 +65,7 @@ export async function renderForm(options: { UPinInput, UCheckboxGroup, UFileUpload, - UStarRating + UInputRating }, template: options.slotTemplate } From 971ce950a08e69d9c01503c0f9da5d6cca730b34 Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Tue, 6 Jan 2026 15:47:28 +0100 Subject: [PATCH 5/8] refactor(InputRating): refactor component with RadioGroupItem, enhance component with readonly and disabled states, add focus ring customization, and improve documentation --- .../content/docs/2.components/input-rating.md | 50 +- .../app/pages/components/input-rating.vue | 89 +- src/runtime/components/InputRating.vue | 145 ++- src/theme/input-rating.ts | 19 +- test/components/InputRating.spec.ts | 91 +- .../InputRating-vue.spec.ts.snap | 980 ++++++++++------ .../__snapshots__/InputRating.spec.ts.snap | 1012 +++++++++++------ 7 files changed, 1573 insertions(+), 813 deletions(-) diff --git a/docs/content/docs/2.components/input-rating.md b/docs/content/docs/2.components/input-rating.md index 29028fe63b..8fd85e3a74 100644 --- a/docs/content/docs/2.components/input-rating.md +++ b/docs/content/docs/2.components/input-rating.md @@ -47,7 +47,7 @@ props: ### Readonly -Use the `readonly` prop to display a rating without allowing user interaction. This is useful for displaying existing ratings. +Use the `readonly` prop to display a rating without allowing user interaction. This is useful for displaying existing ratings. The component maintains its normal appearance but prevents user interaction. ::component-code --- @@ -211,7 +211,7 @@ props: ### Disabled -Use the `disabled` prop to disable the InputRating component. +Use the `disabled` prop to disable the InputRating component. When disabled, the component has reduced opacity (75%) and shows a `not-allowed` cursor to indicate it's not interactive. ::component-code --- @@ -223,6 +223,52 @@ props: --- :: +### Readonly vs Disabled + +Both `readonly` and `disabled` prevent user interaction, but they have different visual appearances: + +- **`readonly`**: Maintains normal appearance (full opacity, default cursor). Use when you want to display a rating that cannot be changed but should look normal. +- **`disabled`**: Shows reduced opacity (75%) and a `not-allowed` cursor. Use when you want to clearly indicate that the rating is temporarily unavailable or inactive. + +::component-code +--- +external: + - modelValue +props: + readonly: true + modelValue: 4.5 +--- +:: + +::component-code +--- +external: + - modelValue +props: + disabled: true + modelValue: 4.5 +--- +:: + +### Focus Ring + +The InputRating component displays a focus ring by default for accessibility purposes, helping keyboard users identify the focused element. If you need to remove the focus ring for design reasons, you can override it using the `ui` prop: + +::component-code +--- +external: + - modelValue +props: + modelValue: 3 + ui: + star: 'focus-within:ring-0 focus-within:ring-offset-0' +--- +:: + +::note +Removing the focus ring may impact accessibility for keyboard users. Consider providing alternative visual indicators when removing the default focus ring. +:: + ## Examples ### With Form Integration diff --git a/playgrounds/nuxt/app/pages/components/input-rating.vue b/playgrounds/nuxt/app/pages/components/input-rating.vue index be5c3352ad..febd14169b 100644 --- a/playgrounds/nuxt/app/pages/components/input-rating.vue +++ b/playgrounds/nuxt/app/pages/components/input-rating.vue @@ -1,6 +1,9 @@ diff --git a/src/runtime/components/InputRating.vue b/src/runtime/components/InputRating.vue index b98395d433..341da02aca 100644 --- a/src/runtime/components/InputRating.vue +++ b/src/runtime/components/InputRating.vue @@ -83,8 +83,8 @@ export interface InputRatingSlots { diff --git a/src/theme/input-rating.ts b/src/theme/input-rating.ts index 1813ad0426..581f12dd47 100644 --- a/src/theme/input-rating.ts +++ b/src/theme/input-rating.ts @@ -3,9 +3,9 @@ import type { ModuleOptions } from '../module' export default (options: Required) => ({ slots: { root: 'inline-flex items-center gap-0.5', - star: 'relative inline-block cursor-pointer transition-colors select-none', + star: 'relative inline-block cursor-pointer transition-colors select-none focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-offset-white dark:focus-within:ring-offset-gray-900 rounded-sm', starFilled: 'absolute inset-0 pointer-events-none', - starHalf: 'absolute inset-0 pointer-events-none overflow-hidden' + starHalf: 'absolute inset-0 pointer-events-none overflow-hidden [clip-path:polygon(0_0,50%_0,50%_100%,0_100%)] [-webkit-clip-path:polygon(0_0,50%_0,50%_100%,0_100%)]' }, variants: { size: { @@ -28,11 +28,13 @@ export default (options: Required) => ({ color: { ...Object.fromEntries((options.theme.colors || []).map((color: string) => [color, { starFilled: `text-${color}-500 dark:text-${color}-400`, - starHalf: `text-${color}-500 dark:text-${color}-400` + starHalf: `text-${color}-500 dark:text-${color}-400`, + star: `focus-within:ring-${color}-500 dark:focus-within:ring-${color}-400` }])), neutral: { starFilled: 'text-gray-500 dark:text-gray-400', - starHalf: 'text-gray-500 dark:text-gray-400' + starHalf: 'text-gray-500 dark:text-gray-400', + star: 'focus-within:ring-gray-500 dark:focus-within:ring-gray-400' } }, readonly: { @@ -40,14 +42,15 @@ export default (options: Required) => ({ root: 'cursor-default', star: 'cursor-default' }, - false: { - star: 'hover:scale-110' - } + false: {} }, disabled: { true: { root: 'opacity-75 cursor-not-allowed', - star: 'cursor-not-allowed' + star: 'cursor-not-allowed pointer-events-none' + }, + false: { + star: 'hover:scale-110' } } }, diff --git a/test/components/InputRating.spec.ts b/test/components/InputRating.spec.ts index 6608d3e9c0..307501cb47 100644 --- a/test/components/InputRating.spec.ts +++ b/test/components/InputRating.spec.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, test, vi } from 'vitest' +import { describe, it, expect, test } from 'vitest' import { axe } from 'vitest-axe' import { mountSuspended } from '@nuxt/test-utils/runtime' import { mount, flushPromises } from '@vue/test-utils' @@ -56,9 +56,9 @@ describe('InputRating', () => { } }) - const stars = wrapper.findAll('[data-slot^="star-"]') - if (stars.length > 0) { - await stars[2]!.trigger('click') // Click on third star (index 2 = star 3) + const item = wrapper.find('button[role="radio"][value="3"]') + if (item.exists()) { + await item.trigger('click') await flushPromises() expect(wrapper.emitted()).toHaveProperty('update:modelValue') @@ -73,9 +73,9 @@ describe('InputRating', () => { } }) - const stars = wrapper.findAll('[data-slot^="star-"]') - if (stars.length > 0) { - await stars[3]!.trigger('click') // Click on fourth star + const item = wrapper.find('button[role="radio"][value="4"]') + if (item.exists()) { + await item.trigger('click') await flushPromises() expect(wrapper.emitted()).toHaveProperty('change') @@ -90,40 +90,15 @@ describe('InputRating', () => { } }) - const stars = wrapper.findAll('[data-slot^="star-"]') - if (stars.length > 0) { - const starElement = stars[0]!.element as HTMLElement - - // Mock getBoundingClientRect to simulate click on left half - const mockRect = { left: 100, width: 40, top: 100, height: 40, right: 140, bottom: 140 } - const getBoundingClientRectSpy = vi.spyOn(starElement, 'getBoundingClientRect') - getBoundingClientRectSpy.mockReturnValue(mockRect as DOMRect) - - // Create a click event with clientX in the left half (110 < 120, which is left + width/2) - const clickEvent = { - currentTarget: starElement, - clientX: 110, // Left half: 110 < (100 + 40/2) = 120 - clientY: 120, - preventDefault: () => {}, - stopPropagation: () => {} - } as unknown as MouseEvent - - // Manually call the click handler by accessing the component instance - const componentInstance = wrapper.vm as any - if (componentInstance.handleStarClick) { - await componentInstance.handleStarClick(clickEvent, 1) - await flushPromises() - - expect(wrapper.emitted()).toHaveProperty('update:modelValue') - // Should emit 0.5 for half star (index 1 - 0.5) - const emitted = wrapper.emitted('update:modelValue') - expect(emitted?.[0]?.[0]).toBe(0.5) - } else { - // Fallback: just test that clicking emits a value when allowHalf is true - await stars[0]!.trigger('click') - await flushPromises() - expect(wrapper.emitted()).toHaveProperty('update:modelValue') - } + const item = wrapper.find('button[role="radio"][value="0.5"]') + if (item.exists()) { + await item.trigger('click') + await flushPromises() + + expect(wrapper.emitted()).toHaveProperty('update:modelValue') + // Should emit 0.5 for half star + const emitted = wrapper.emitted('update:modelValue') + expect(emitted?.[0]?.[0]).toBe(0.5) } }) }) @@ -137,9 +112,9 @@ describe('InputRating', () => { } }) - const stars = wrapper.findAll('[data-slot^="star-"]') - if (stars.length > 0) { - await stars[4]!.trigger('click') // Try to click on fifth star + const item = wrapper.find('button[role="radio"][value="5"]') + if (item.exists()) { + await item.trigger('click') await flushPromises() expect(wrapper.emitted('update:modelValue')).toBeUndefined() @@ -156,9 +131,9 @@ describe('InputRating', () => { } }) - const stars = wrapper.findAll('[data-slot^="star-"]') - if (stars.length > 0) { - await stars[4]!.trigger('click') // Try to click on fifth star + const item = wrapper.find('button[role="radio"][value="5"]') + if (item.exists()) { + await item.trigger('click') await flushPromises() expect(wrapper.emitted('update:modelValue')).toBeUndefined() @@ -199,17 +174,18 @@ describe('InputRating', () => { } // Set rating to 2 (should fail validation) by clicking second star - const stars = rating.findAll('[data-slot^="star-"]') - if (stars.length > 1) { - await stars[1]!.trigger('click') // Click second star (value = 2) + const item2 = rating.find('button[role="radio"][value="2"]') + if (item2.exists()) { + await item2.trigger('click') await flushPromises() } expect(wrapper.text()).toContain('Rating must be at least 3') // Set rating to 4 (should pass validation) by clicking fourth star - if (stars.length > 3) { - await stars[3]!.trigger('click') // Click fourth star (value = 4) + const item4 = rating.find('button[role="radio"][value="4"]') + if (item4.exists()) { + await item4.trigger('click') await flushPromises() } expect(wrapper.text()).not.toContain('Rating must be at least 3') @@ -223,17 +199,18 @@ describe('InputRating', () => { } // Set rating to 2 (should fail validation) by clicking second star - const stars = rating.findAll('[data-slot^="star-"]') - if (stars.length > 1) { - await stars[1]!.trigger('click') // Click second star (value = 2) + const item2 = rating.find('button[role="radio"][value="2"]') + if (item2.exists()) { + await item2.trigger('click') await flushPromises() } expect(wrapper.text()).toContain('Rating must be at least 3') // Set rating to 4 (should pass validation) by clicking fourth star - if (stars.length > 3) { - await stars[3]!.trigger('click') // Click fourth star (value = 4) + const item4 = rating.find('button[role="radio"][value="4"]') + if (item4.exists()) { + await item4.trigger('click') await flushPromises() } expect(wrapper.text()).not.toContain('Rating must be at least 3') diff --git a/test/components/__snapshots__/InputRating-vue.spec.ts.snap b/test/components/__snapshots__/InputRating-vue.spec.ts.snap index a2a59b0fe4..a390ede0fe 100644 --- a/test/components/__snapshots__/InputRating-vue.spec.ts.snap +++ b/test/components/__snapshots__/InputRating-vue.spec.ts.snap @@ -1,813 +1,1117 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`InputRating > renders with allowHalf correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- +
+ -
-
-
- - -
+
+
+
+ + +
+
" `; -exports[`InputRating > renders with as correctly 1`] = `"
"`; +exports[`InputRating > renders with as correctly 1`] = `"
"`; exports[`InputRating > renders with class correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color error correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color info correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color neutral correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color primary correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color secondary correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color success correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color warning correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with defaultValue correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with disabled correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with emptyIcon correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with icon correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
+
" `; exports[`InputRating > renders with id correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with max correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with modelValue correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with name correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with readonly correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
+
" `; exports[`InputRating > renders with required correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size lg correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size md correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size sm correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size xl correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size xs correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; -exports[`InputRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; +exports[`InputRating > renders with star slot correctly 1`] = ` +"
+
+
+
+
+
+ +
" +`; exports[`InputRating > renders with ui correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; diff --git a/test/components/__snapshots__/InputRating.spec.ts.snap b/test/components/__snapshots__/InputRating.spec.ts.snap index fb6385ed71..e9e1db72d1 100644 --- a/test/components/__snapshots__/InputRating.spec.ts.snap +++ b/test/components/__snapshots__/InputRating.spec.ts.snap @@ -1,836 +1,1150 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`InputRating > renders with allowHalf correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- +
+ -
-
-
- - +
+
+
+ +
+
" `; exports[`InputRating > renders with as correctly 1`] = ` -"
-
-
+"
+
-
+
-
+
-
+
-
- - +
+ +
-
- - -
" +
+ + +
+" `; exports[`InputRating > renders with class correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color error correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color info correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color neutral correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color primary correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color secondary correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color success correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with color warning correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with defaultValue correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with disabled correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with emptyIcon correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with icon correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
+
" `; exports[`InputRating > renders with id correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with max correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with modelValue correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with name correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with readonly correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
+
" `; exports[`InputRating > renders with required correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size lg correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size md correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size sm correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size xl correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; exports[`InputRating > renders with size xs correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; -exports[`InputRating > renders with star slot correctly 1`] = `"
⭐⭐⭐⭐⭐
"`; +exports[`InputRating > renders with star slot correctly 1`] = ` +"
+
+
+
+
+
+ +
" +`; exports[`InputRating > renders with ui correctly 1`] = ` -"
-
+"
+
-
+
-
+
-
+
-
+
-
+
-
- - +
+ +
-
- - +
+ +
+
" `; From 5581bae066e52a3f53c4d598dba45f42198218e8 Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Wed, 7 Jan 2026 20:45:41 +0100 Subject: [PATCH 6/8] feat(InputRating): add orientation props, update documentation and optimize stars state computation and props handling - Remove separate computed for stars and inline logic into `starsWithState` using Array.from - Precompute steps inside `starsWithState` and remove `getStepsForStar` - Use `star.steps` in the template instead of calling a function per star - Remove redundant fallback in `currentValue` (useVModel already handles `defaultValue`) - Add optional `orientation` prop with default `horizontal` and use it in the template --- .../content/docs/2.components/input-rating.md | 108 ++----- .../app/pages/components/input-rating.vue | 28 ++ src/runtime/components/InputRating.vue | 91 +++--- src/theme/input-rating.ts | 16 +- .../InputRating-vue.spec.ts.snap | 264 ++++++++--------- .../__snapshots__/InputRating.spec.ts.snap | 272 +++++++++--------- 6 files changed, 369 insertions(+), 410 deletions(-) diff --git a/docs/content/docs/2.components/input-rating.md b/docs/content/docs/2.components/input-rating.md index 8fd85e3a74..a7bb98bfd9 100644 --- a/docs/content/docs/2.components/input-rating.md +++ b/docs/content/docs/2.components/input-rating.md @@ -45,21 +45,9 @@ props: --- :: -### Readonly - -Use the `readonly` prop to display a rating without allowing user interaction. This is useful for displaying existing ratings. The component maintains its normal appearance but prevents user interaction. - -::component-code ---- -props: - readonly: true - modelValue: 4.5 ---- -:: - ### Custom Icons -Use the `icon` prop to customize the icon used for stars. Defaults to `i-lucide-star`. +Use the `icon` prop to customize the icon used for stars. Defaults to `i-lucide-star`. Use the `empty-icon` prop to customize the icon used for empty stars. If not provided, uses the same icon as `icon`. ::component-code --- @@ -71,8 +59,6 @@ props: --- :: -Use the `empty-icon` prop to customize the icon used for empty stars. If not provided, uses the same icon as `icon`. - ::component-code --- external: @@ -125,76 +111,37 @@ props: --- :: -::component-code ---- -external: - - modelValue -props: - color: success - modelValue: 4 ---- -:: - -::component-code ---- -external: - - modelValue -props: - color: warning - modelValue: 4 ---- -:: - -::component-code ---- -external: - - modelValue -props: - color: error - modelValue: 4 ---- -:: - ### Size Use the `size` prop to change the size of the stars. ::component-code --- +items: + size: + - xs + - sm + - md + - lg + - xl external: - modelValue props: - size: xs + size: md modelValue: 4 --- :: -::component-code ---- -external: - - modelValue -props: - size: sm - modelValue: 4 ---- -:: +### Orientation -::component-code ---- -external: - - modelValue -props: - size: md - modelValue: 4 ---- -:: +Use the `orientation` prop to change the orientation of the rating. Defaults to `horizontal`. ::component-code --- external: - modelValue props: - size: lg + orientation: horizontal modelValue: 4 --- :: @@ -203,9 +150,11 @@ props: --- external: - modelValue + - class props: - size: xl + orientation: vertical modelValue: 4 + class: 'h-48' --- :: @@ -223,12 +172,9 @@ props: --- :: -### Readonly vs Disabled - -Both `readonly` and `disabled` prevent user interaction, but they have different visual appearances: +### Readonly -- **`readonly`**: Maintains normal appearance (full opacity, default cursor). Use when you want to display a rating that cannot be changed but should look normal. -- **`disabled`**: Shows reduced opacity (75%) and a `not-allowed` cursor. Use when you want to clearly indicate that the rating is temporarily unavailable or inactive. +Use the `readonly` prop to display a rating without allowing user interaction. Unlike `disabled`, it maintains normal appearance (full opacity, default cursor). Use when you want to display a rating that cannot be changed but should look normal. ::component-code --- @@ -290,26 +236,6 @@ props: --- :: -### Reading the Value - -You can read the `modelValue` externally to use it in your application logic. - -```vue - - - -``` - ## API ### Props diff --git a/playgrounds/nuxt/app/pages/components/input-rating.vue b/playgrounds/nuxt/app/pages/components/input-rating.vue index febd14169b..59c05e0688 100644 --- a/playgrounds/nuxt/app/pages/components/input-rating.vue +++ b/playgrounds/nuxt/app/pages/components/input-rating.vue @@ -236,6 +236,34 @@ watch(formRating, (value) => { +
+

+ Orientation +

+
+
+

+ Horizontal (default) +

+ +
+
+

+ Vertical +

+ +
+
+
+ + +

Custom Max Value diff --git a/src/runtime/components/InputRating.vue b/src/runtime/components/InputRating.vue index 341da02aca..643971c54c 100644 --- a/src/runtime/components/InputRating.vue +++ b/src/runtime/components/InputRating.vue @@ -68,6 +68,11 @@ export interface InputRatingProps { id?: string /** Form field required. */ required?: boolean + /** + * The orientation of the rating. + * @defaultValue 'horizontal' + */ + orientation?: 'horizontal' | 'vertical' class?: any ui?: InputRating['slots'] } @@ -97,7 +102,8 @@ const props = withDefaults(defineProps(), { max: 5, allowHalf: false, readonly: false, - defaultValue: 0 + defaultValue: 0, + orientation: 'horizontal' }) const emits = defineEmits() @@ -125,12 +131,13 @@ const isVisuallyDisabled = computed(() => formDisabled.value || props.disabled) const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.inputRating || {}) })({ size: size.value, color: color.value, + orientation: props.orientation, readonly: props.readonly && !props.disabled, // Only apply readonly styles if not disabled disabled: isVisuallyDisabled.value // Only apply disabled styles when explicitly disabled })) const currentValue = computed(() => { - const value = modelValue.value ?? props.defaultValue ?? 0 + const value = modelValue.value ?? 0 return Math.max(0, Math.min(value, props.max)) }) @@ -140,43 +147,31 @@ const emptyStarIcon = computed(() => { return starIcon.value }) -const iconSizeClass = computed(() => { - const sizeMap: Record = { - xs: 'size-3', - sm: 'size-4', - md: 'size-5', - lg: 'size-6', - xl: 'size-7' - } - return sizeMap[size.value || 'md'] || 'size-5' -}) - -const stars = computed(() => { - return Array.from({ length: props.max }, (_, i) => i + 1) -}) - -function getStepsForStar(star: number) { - if (props.allowHalf) { - return [star - 0.5, star] - } - return [star] -} - -function getStarState(index: number): { filled: boolean, half: boolean } { +const starsWithState = computed(() => { // Don't show hover effect when disabled const value = (disabled.value ? 0 : hoveredValue.value) || currentValue.value - const starValue = index - if (value >= starValue) { - return { filled: true, half: false } - } + return Array.from({ length: props.max }, (_, i) => { + const starValue = i + 1 + let filled = false + let half = false - if (props.allowHalf && value >= starValue - 0.5) { - return { filled: false, half: true } - } + if (value >= starValue) { + filled = true + } else if (props.allowHalf && value >= starValue - 0.5) { + half = true + } - return { filled: false, half: false } -} + const steps = props.allowHalf ? [starValue - 0.5, starValue] : [starValue] + + return { + index: starValue, + filled, + half, + steps + } + }) +}) function onUpdate(value: string) { const newValue = Number(value) @@ -197,58 +192,58 @@ function onUpdate(value: string) { :model-value="(modelValue ?? 0).toString()" :name="name" :disabled="disabled" - :orientation="'horizontal'" + :orientation="orientation" data-slot="root" :class="ui.root({ class: [props.ui?.root, props.class] })" @update:model-value="onUpdate" @mouseleave="hoveredValue = 0" >
) => ({ slots: { - root: 'inline-flex items-center gap-0.5', + root: '', star: 'relative inline-block cursor-pointer transition-colors select-none focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-offset-white dark:focus-within:ring-offset-gray-900 rounded-sm', starFilled: 'absolute inset-0 pointer-events-none', - starHalf: 'absolute inset-0 pointer-events-none overflow-hidden [clip-path:polygon(0_0,50%_0,50%_100%,0_100%)] [-webkit-clip-path:polygon(0_0,50%_0,50%_100%,0_100%)]' + starHalf: 'absolute inset-0 pointer-events-none overflow-hidden [clip-path:polygon(0_0,50%_0,50%_100%,0_100%)] [-webkit-clip-path:polygon(0_0,50%_0,50%_100%,0_100%)]', + icon: 'w-full h-full' }, variants: { + orientation: { + horizontal: { + root: 'inline-flex items-center gap-0.5' + }, + vertical: { + root: 'inline-flex flex-col items-center gap-0.5' + } + }, size: { xs: { star: 'size-3' @@ -56,6 +65,7 @@ export default (options: Required) => ({ }, defaultVariants: { size: 'md', - color: 'primary' + color: 'primary', + orientation: 'horizontal' } }) diff --git a/test/components/__snapshots__/InputRating-vue.spec.ts.snap b/test/components/__snapshots__/InputRating-vue.spec.ts.snap index a390ede0fe..13bf6d4c1f 100644 --- a/test/components/__snapshots__/InputRating-vue.spec.ts.snap +++ b/test/components/__snapshots__/InputRating-vue.spec.ts.snap @@ -6,7 +6,7 @@ exports[`InputRating > renders with allowHalf correctly 1`] = ` -
- + -
- +
" `; -exports[`InputRating > renders with as correctly 1`] = `"
"`; +exports[`InputRating > renders with as correctly 1`] = `"
"`; exports[`InputRating > renders with class correctly 1`] = ` "
@@ -61,7 +61,7 @@ exports[`InputRating > renders with class correctly 1`] = ` -
@@ -69,7 +69,7 @@ exports[`InputRating > renders with class correctly 1`] = ` -

@@ -77,18 +77,18 @@ exports[`InputRating > renders with class correctly 1`] = ` -
- +
- + @@ -103,7 +103,7 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
@@ -111,7 +111,7 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
@@ -119,18 +119,18 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
- +
- + @@ -145,7 +145,7 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
@@ -153,7 +153,7 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
@@ -161,18 +161,18 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
- +
- + @@ -187,7 +187,7 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
@@ -195,7 +195,7 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
@@ -203,18 +203,18 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
- +
- + @@ -229,7 +229,7 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
@@ -237,7 +237,7 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
@@ -245,18 +245,18 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
- +
- + @@ -271,7 +271,7 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
@@ -279,7 +279,7 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
@@ -287,18 +287,18 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
- +
- + @@ -313,7 +313,7 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
@@ -321,7 +321,7 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
@@ -329,18 +329,18 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
- +
- + @@ -355,7 +355,7 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
@@ -363,7 +363,7 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
@@ -371,18 +371,18 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
- +
- + @@ -397,7 +397,7 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
@@ -405,7 +405,7 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
@@ -413,18 +413,18 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
- +
- + @@ -439,7 +439,7 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
@@ -447,7 +447,7 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
@@ -455,18 +455,18 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
- +
- + @@ -481,7 +481,7 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
@@ -489,7 +489,7 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
@@ -497,18 +497,18 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
- +
- + @@ -523,7 +523,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -531,7 +531,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -539,7 +539,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -547,12 +547,12 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
- + @@ -567,7 +567,7 @@ exports[`InputRating > renders with id correctly 1`] = ` -
@@ -575,7 +575,7 @@ exports[`InputRating > renders with id correctly 1`] = ` -
@@ -583,18 +583,18 @@ exports[`InputRating > renders with id correctly 1`] = ` -
- +
- + @@ -609,7 +609,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -617,7 +617,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -625,7 +625,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -633,7 +633,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -641,7 +641,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -649,7 +649,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -657,24 +657,24 @@ exports[`InputRating > renders with max correctly 1`] = ` -
- +
- +
- + @@ -689,7 +689,7 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
@@ -697,7 +697,7 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
@@ -705,18 +705,18 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
- +
- + @@ -731,7 +731,7 @@ exports[`InputRating > renders with name correctly 1`] = ` -
@@ -739,7 +739,7 @@ exports[`InputRating > renders with name correctly 1`] = ` -
@@ -747,18 +747,18 @@ exports[`InputRating > renders with name correctly 1`] = ` -
- +
- + @@ -773,7 +773,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -781,7 +781,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -789,7 +789,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -797,12 +797,12 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
- + @@ -817,7 +817,7 @@ exports[`InputRating > renders with required correctly 1`] = ` -
@@ -825,7 +825,7 @@ exports[`InputRating > renders with required correctly 1`] = ` -
@@ -833,18 +833,18 @@ exports[`InputRating > renders with required correctly 1`] = ` -
- +
- + @@ -859,7 +859,7 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
@@ -867,7 +867,7 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
@@ -875,18 +875,18 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
- +
- + @@ -901,7 +901,7 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
@@ -909,7 +909,7 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
@@ -917,18 +917,18 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
- +
- + @@ -943,7 +943,7 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
@@ -951,7 +951,7 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
@@ -959,18 +959,18 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
- +
- + @@ -985,7 +985,7 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
@@ -993,7 +993,7 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
@@ -1001,18 +1001,18 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
- +
- + @@ -1027,7 +1027,7 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
@@ -1035,7 +1035,7 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
@@ -1043,18 +1043,18 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
- +
- + @@ -1080,7 +1080,7 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
@@ -1088,7 +1088,7 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
@@ -1096,18 +1096,18 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
- +
- + diff --git a/test/components/__snapshots__/InputRating.spec.ts.snap b/test/components/__snapshots__/InputRating.spec.ts.snap index e9e1db72d1..f873b99dc0 100644 --- a/test/components/__snapshots__/InputRating.spec.ts.snap +++ b/test/components/__snapshots__/InputRating.spec.ts.snap @@ -6,7 +6,7 @@ exports[`InputRating > renders with allowHalf correctly 1`] = ` -
- + -
- +
-
@@ -69,18 +69,18 @@ exports[`InputRating > renders with as correctly 1`] = ` -
- +
- + @@ -94,7 +94,7 @@ exports[`InputRating > renders with class correctly 1`] = ` -
@@ -102,7 +102,7 @@ exports[`InputRating > renders with class correctly 1`] = ` -
@@ -110,18 +110,18 @@ exports[`InputRating > renders with class correctly 1`] = ` -
- +
- + @@ -136,7 +136,7 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
@@ -144,7 +144,7 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
@@ -152,18 +152,18 @@ exports[`InputRating > renders with color error correctly 1`] = ` -
- +
- + @@ -178,7 +178,7 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
@@ -186,7 +186,7 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
@@ -194,18 +194,18 @@ exports[`InputRating > renders with color info correctly 1`] = ` -
- +
- + @@ -220,7 +220,7 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
@@ -228,7 +228,7 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
@@ -236,18 +236,18 @@ exports[`InputRating > renders with color neutral correctly 1`] = ` -
- +
- + @@ -262,7 +262,7 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
@@ -270,7 +270,7 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
@@ -278,18 +278,18 @@ exports[`InputRating > renders with color primary correctly 1`] = ` -
- +
- + @@ -304,7 +304,7 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
@@ -312,7 +312,7 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
@@ -320,18 +320,18 @@ exports[`InputRating > renders with color secondary correctly 1`] = ` -
- +
- + @@ -346,7 +346,7 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
@@ -354,7 +354,7 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
@@ -362,18 +362,18 @@ exports[`InputRating > renders with color success correctly 1`] = ` -
- +
- + @@ -388,7 +388,7 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
@@ -396,7 +396,7 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
@@ -404,18 +404,18 @@ exports[`InputRating > renders with color warning correctly 1`] = ` -
- +
- + @@ -430,7 +430,7 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
@@ -438,7 +438,7 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
@@ -446,18 +446,18 @@ exports[`InputRating > renders with defaultValue correctly 1`] = ` -
- +
- + @@ -472,7 +472,7 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
@@ -480,7 +480,7 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
@@ -488,18 +488,18 @@ exports[`InputRating > renders with disabled correctly 1`] = ` -
- +
- + @@ -514,7 +514,7 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
@@ -522,7 +522,7 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
@@ -530,18 +530,18 @@ exports[`InputRating > renders with emptyIcon correctly 1`] = ` -
- +
- + @@ -556,7 +556,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -564,7 +564,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -572,7 +572,7 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
@@ -580,12 +580,12 @@ exports[`InputRating > renders with icon correctly 1`] = ` -
- + @@ -600,7 +600,7 @@ exports[`InputRating > renders with id correctly 1`] = ` -
@@ -608,7 +608,7 @@ exports[`InputRating > renders with id correctly 1`] = ` -
@@ -616,18 +616,18 @@ exports[`InputRating > renders with id correctly 1`] = ` -
- +
- + @@ -642,7 +642,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -650,7 +650,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -658,7 +658,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -666,7 +666,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -674,7 +674,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -682,7 +682,7 @@ exports[`InputRating > renders with max correctly 1`] = ` -
@@ -690,24 +690,24 @@ exports[`InputRating > renders with max correctly 1`] = ` -
- +
- +
- + @@ -722,7 +722,7 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
@@ -730,7 +730,7 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
@@ -738,18 +738,18 @@ exports[`InputRating > renders with modelValue correctly 1`] = ` -
- +
- + @@ -764,7 +764,7 @@ exports[`InputRating > renders with name correctly 1`] = ` -
@@ -772,7 +772,7 @@ exports[`InputRating > renders with name correctly 1`] = ` -
@@ -780,18 +780,18 @@ exports[`InputRating > renders with name correctly 1`] = ` -
- +
- + @@ -806,7 +806,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -814,7 +814,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -822,7 +822,7 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
@@ -830,12 +830,12 @@ exports[`InputRating > renders with readonly correctly 1`] = ` -
- + @@ -850,7 +850,7 @@ exports[`InputRating > renders with required correctly 1`] = ` -
@@ -858,7 +858,7 @@ exports[`InputRating > renders with required correctly 1`] = ` -
@@ -866,18 +866,18 @@ exports[`InputRating > renders with required correctly 1`] = ` -
- +
- + @@ -892,7 +892,7 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
@@ -900,7 +900,7 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
@@ -908,18 +908,18 @@ exports[`InputRating > renders with size lg correctly 1`] = ` -
- +
- + @@ -934,7 +934,7 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
@@ -942,7 +942,7 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
@@ -950,18 +950,18 @@ exports[`InputRating > renders with size md correctly 1`] = ` -
- +
- + @@ -976,7 +976,7 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
@@ -984,7 +984,7 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
@@ -992,18 +992,18 @@ exports[`InputRating > renders with size sm correctly 1`] = ` -
- +
- + @@ -1018,7 +1018,7 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
@@ -1026,7 +1026,7 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
@@ -1034,18 +1034,18 @@ exports[`InputRating > renders with size xl correctly 1`] = ` -
- +
- + @@ -1060,7 +1060,7 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
@@ -1068,7 +1068,7 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
@@ -1076,18 +1076,18 @@ exports[`InputRating > renders with size xs correctly 1`] = ` -
- +
- + @@ -1113,7 +1113,7 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
@@ -1121,7 +1121,7 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
@@ -1129,18 +1129,18 @@ exports[`InputRating > renders with ui correctly 1`] = ` -
- +
- + From b89d07b2d5520d2367eb416a3999674fc7a8aa6a Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Wed, 7 Jan 2026 21:13:48 +0100 Subject: [PATCH 7/8] docs(InputRating): remove outdated component code and streamline documentation --- docs/content/docs/2.components/input-rating.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/docs/content/docs/2.components/input-rating.md b/docs/content/docs/2.components/input-rating.md index a7bb98bfd9..864d3d7154 100644 --- a/docs/content/docs/2.components/input-rating.md +++ b/docs/content/docs/2.components/input-rating.md @@ -146,18 +146,6 @@ props: --- :: -::component-code ---- -external: - - modelValue - - class -props: - orientation: vertical - modelValue: 4 - class: 'h-48' ---- -:: - ### Disabled Use the `disabled` prop to disable the InputRating component. When disabled, the component has reduced opacity (75%) and shows a `not-allowed` cursor to indicate it's not interactive. From 469ec5ac4cfd9b78e74fcc130413c83e1424ed06 Mon Sep 17 00:00:00 2001 From: Francesco Mussoni Date: Sat, 14 Feb 2026 10:14:59 +0100 Subject: [PATCH 8/8] temp: Refactor component with Reka-ui primitive - patch needed in reka-ui --- .../content/docs/2.components/input-rating.md | 14 + patches/reka-ui.patch | 404 ++++++ .../app/pages/components/input-rating.vue | 17 + pnpm-lock.yaml | 53 +- pnpm-workspace.yaml | 5 +- src/runtime/components/InputRating.vue | 171 +-- src/theme/input-rating.ts | 27 +- test/components/InputRating.spec.ts | 2 + .../InputRating-vue.spec.ts.snap | 1064 ++++++---------- .../__snapshots__/InputRating.spec.ts.snap | 1094 ++++++----------- 10 files changed, 1250 insertions(+), 1601 deletions(-) create mode 100644 patches/reka-ui.patch diff --git a/docs/content/docs/2.components/input-rating.md b/docs/content/docs/2.components/input-rating.md index 864d3d7154..48776c9355 100644 --- a/docs/content/docs/2.components/input-rating.md +++ b/docs/content/docs/2.components/input-rating.md @@ -146,6 +146,20 @@ props: --- :: +### Clearable + +Use the `clearable` prop to allow users to clear the rating by clicking on the currently selected value. Defaults to `false`. + +::component-code +--- +external: + - modelValue +props: + clearable: true + modelValue: 3 +--- +:: + ### Disabled Use the `disabled` prop to disable the InputRating component. When disabled, the component has reduced opacity (75%) and shows a `not-allowed` cursor to indicate it's not interactive. diff --git a/patches/reka-ui.patch b/patches/reka-ui.patch new file mode 100644 index 0000000000..cdf48ad5e6 --- /dev/null +++ b/patches/reka-ui.patch @@ -0,0 +1,404 @@ +diff --git a/dist/Rating/RatingItem.js b/dist/Rating/RatingItem.js +new file mode 100644 +index 0000000000000000000000000000000000000000..66b7a5433786ea89599eaa79959f25ed81cd93d2 +--- /dev/null ++++ b/dist/Rating/RatingItem.js +@@ -0,0 +1,61 @@ ++import { createContext } from "../shared/createContext.js"; ++import { Primitive } from "../Primitive/Primitive.js"; ++import { injectRatingRootContext } from "./RatingRoot.js"; ++import { computed, defineComponent, openBlock, createBlock, unref, withCtx, renderSlot } from "vue"; ++ ++//#region src/Rating/RatingItem.vue?vue&type=script&setup=true&lang.ts ++const [injectRatingItemContext, provideRatingItemContext] = createContext("RatingItem"); ++var RatingItem_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ ++ __name: "RatingItem", ++ props: { ++ item: { ++ type: Number, ++ required: true ++ }, ++ asChild: { ++ type: Boolean, ++ required: false ++ }, ++ as: { ++ type: null, ++ required: false, ++ default: "label" ++ } ++ }, ++ setup(__props) { ++ const props = __props; ++ const rootContext = injectRatingRootContext(); ++ ++ const steps = computed(() => { ++ const groupStartValue = props.item - 1; ++ const groupEndValue = props.item; ++ const stepSize = rootContext.step.value; ++ ++ const numberOfSteps = Math.ceil((groupEndValue - groupStartValue) / stepSize); ++ ++ return Array.from({ length: numberOfSteps }, (_, index) => ++ Number((groupStartValue + (index + 1) * stepSize).toFixed(2))); ++ }); ++ ++ provideRatingItemContext({ steps }); ++ ++ return (_ctx, _cache) => { ++ return openBlock(), createBlock(unref(Primitive), { ++ as: _ctx.as, ++ "as-child": _ctx.asChild ++ }, { ++ default: withCtx(() => [renderSlot(_ctx.$slots, "default", { ++ steps: steps.value ++ })]), ++ _: 3 ++ }, 8, ["as", "as-child"]); ++ }; ++ } ++}); ++ ++//#endregion ++//#region src/Rating/RatingItem.vue ++var RatingItem_default = RatingItem_vue_vue_type_script_setup_true_lang_default; ++ ++//#endregion ++export { RatingItem_default, injectRatingItemContext }; +diff --git a/dist/Rating/RatingItemIndicator.js b/dist/Rating/RatingItemIndicator.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f626f8b4788c4fafa69dfaf8e1a7cecd5eff3d4f +--- /dev/null ++++ b/dist/Rating/RatingItemIndicator.js +@@ -0,0 +1,93 @@ ++import { useForwardExpose } from "../shared/useForwardExpose.js"; ++import { RadioGroupItem_default } from "../RadioGroup/RadioGroupItem.js"; ++import { RadioGroupIndicator_default } from "../RadioGroup/RadioGroupIndicator.js"; ++import { injectRatingItemContext } from "./RatingItem.js"; ++import { injectRatingRootContext } from "./RatingRoot.js"; ++import { computed, defineComponent, openBlock, createBlock, unref, withCtx, renderSlot, createVNode, normalizeStyle } from "vue"; ++import { useActiveElement } from "@vueuse/core"; ++ ++//#region src/Rating/RatingItemIndicator.vue?vue&type=script&setup=true&lang.ts ++var RatingItemIndicator_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ ++ __name: "RatingItemIndicator", ++ props: { ++ step: { ++ type: Number, ++ required: true ++ }, ++ asChild: { ++ type: Boolean, ++ required: false ++ }, ++ as: { ++ type: null, ++ required: false ++ } ++ }, ++ setup(__props) { ++ const props = __props; ++ const rootContext = injectRatingRootContext(); ++ const { currentElement, forwardRef } = useForwardExpose(); ++ const activeElement = useActiveElement(); ++ const itemContext = injectRatingItemContext(); ++ ++ const isActive = computed(() => { ++ return (rootContext.hoveredRating.value > 0 && props.step <= rootContext.hoveredRating.value) ++ || (rootContext.hoveredRating.value === 0 && props.step <= rootContext.modelValue.value); ++ }); ++ ++ const isVisible = computed(() => { ++ return activeElement.value === currentElement.value ++ || rootContext.step.value === 1 ++ || props.step % 1 === 0 ++ || props.step === rootContext.hoveredRating.value ++ || props.step === rootContext.modelValue.value; ++ }); ++ ++ function handleMouseEnter() { ++ rootContext.changeHoveredRating(props.step); ++ } ++ ++ return (_ctx, _cache) => { ++ return openBlock(), createBlock(unref(RadioGroupItem_default), { ++ ref: unref(forwardRef), ++ as: _ctx.as, ++ "as-child": _ctx.asChild, ++ style: normalizeStyle({ ++ '--reka-rating-item-step-width': `${((props.step % 1 || 1) * 100)}%`, ++ '--reka-rating-item-step-opacity': isVisible.value ? 1 : 0, ++ '--reka-rating-item-step-z-index': itemContext.steps.value.length - itemContext.steps.value.indexOf(props.step) ++ }), ++ value: props.step, ++ "data-state": isActive.value ? "active" : void 0, ++ disabled: unref(rootContext).disabled.value, ++ onSelect: ($event) => unref(rootContext).changeModelValue(props.step), ++ onMouseenter: handleMouseEnter ++ }, { ++ default: withCtx(() => [createVNode(unref(RadioGroupIndicator_default), { ++ "force-mount": "", ++ "as-child": "" ++ }, { ++ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), ++ _: 3 ++ })]), ++ _: 3 ++ }, 8, [ ++ "as", ++ "as-child", ++ "style", ++ "value", ++ "data-state", ++ "disabled", ++ "onSelect", ++ "onMouseenter" ++ ]); ++ }; ++ } ++}); ++ ++//#endregion ++//#region src/Rating/RatingItemIndicator.vue ++var RatingItemIndicator_default = RatingItemIndicator_vue_vue_type_script_setup_true_lang_default; ++ ++//#endregion ++export { RatingItemIndicator_default }; +diff --git a/dist/Rating/RatingRoot.js b/dist/Rating/RatingRoot.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5a384bf826a1d0e12d6e78daaae6bdd8048c6ef8 +--- /dev/null ++++ b/dist/Rating/RatingRoot.js +@@ -0,0 +1,139 @@ ++import { createContext } from "../shared/createContext.js"; ++import { useForwardExpose } from "../shared/useForwardExpose.js"; ++import { RadioGroupRoot_default } from "../RadioGroup/RadioGroupRoot.js"; ++import { computed, defineComponent, openBlock, createBlock, unref, withCtx, renderSlot, ref, toRefs } from "vue"; ++import { reactiveOmit, useVModel } from "@vueuse/core"; ++ ++//#region src/Rating/RatingRoot.vue?vue&type=script&setup=true&lang.ts ++const [injectRatingRootContext, provideRatingRootContext] = createContext("RatingRoot"); ++var RatingRoot_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ ++ __name: "RatingRoot", ++ props: { ++ modelValue: { ++ type: Number, ++ required: false ++ }, ++ defaultValue: { ++ type: Number, ++ required: false ++ }, ++ length: { ++ type: Number, ++ required: false, ++ default: 5 ++ }, ++ clearable: { ++ type: Boolean, ++ required: false ++ }, ++ hoverable: { ++ type: Boolean, ++ required: false ++ }, ++ step: { ++ type: Number, ++ required: false, ++ default: 1 ++ }, ++ disabled: { ++ type: Boolean, ++ required: false, ++ default: false ++ }, ++ orientation: { ++ type: String, ++ required: false, ++ default: "horizontal" ++ }, ++ dir: { ++ type: String, ++ required: false ++ }, ++ loop: { ++ type: Boolean, ++ required: false, ++ default: true ++ }, ++ asChild: { ++ type: Boolean, ++ required: false ++ }, ++ as: { ++ type: null, ++ required: false ++ }, ++ name: { ++ type: String, ++ required: false ++ }, ++ required: { ++ type: Boolean, ++ required: false, ++ default: false ++ } ++ }, ++ emits: ["update:modelValue"], ++ setup(__props, { emit: __emit }) { ++ const props = __props; ++ const emits = __emit; ++ const { length, disabled, clearable, hoverable, step } = toRefs(props); ++ ++ useForwardExpose(); ++ ++ const modelValue = useVModel(props, "modelValue", emits, { ++ defaultValue: props.defaultValue, ++ passive: props.modelValue === void 0 ++ }); ++ ++ const items = computed(() => { ++ return Array.from({ length: length.value }, (_, i) => i + 1); ++ }); ++ ++ const hoveredRating = ref(0); ++ ++ function changeModelValue(rating) { ++ if (disabled.value) ++ return; ++ if (clearable.value && modelValue.value === rating) { ++ hoveredRating.value = 0; ++ modelValue.value = 0; ++ } ++ else { ++ modelValue.value = rating; ++ } ++ } ++ ++ function changeHoveredRating(rating) { ++ if (disabled.value || !hoverable.value) ++ return; ++ hoveredRating.value = rating; ++ } ++ ++ provideRatingRootContext({ ++ modelValue, ++ items, ++ hoveredRating, ++ disabled, ++ step, ++ changeModelValue, ++ changeHoveredRating ++ }); ++ ++ return (_ctx, _cache) => { ++ return openBlock(), createBlock(unref(RadioGroupRoot_default), reactiveOmit(props, 'length', 'clearable', 'hoverable', 'step'), { ++ default: withCtx(() => [renderSlot(_ctx.$slots, "default", { ++ items: unref(items), ++ modelValue: unref(modelValue) ++ })]), ++ _: 3 ++ }, 16); ++ }; ++ } ++}); ++ ++//#endregion ++//#region src/Rating/RatingRoot.vue ++var RatingRoot_default = RatingRoot_vue_vue_type_script_setup_true_lang_default; ++ ++//#endregion ++export { RatingRoot_default, injectRatingRootContext }; +diff --git a/dist/index.d.ts b/dist/index.d.ts +index e82faa7801052f97680c3db7592154711a7f0f29..680aecf35905deb3f35126220cdcb7f6fc1e63c1 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -6046,6 +6046,59 @@ type __VLS_WithSlots$83 = T & { + }; + //# sourceMappingURL=RadioGroupRoot.vue.d.ts.map + //#endregion ++//#region src/Rating/RatingRoot.vue.d.ts ++interface RatingRootProps extends Omit { ++ defaultValue?: number; ++ modelValue?: number; ++ length?: number; ++ clearable?: boolean; ++ hoverable?: boolean; ++ step?: 1 | 0.5 | 0.25 | 0.1; ++} ++type RatingRootEmits = { ++ 'update:modelValue': [payload: number]; ++}; ++interface RatingRootContext { ++ modelValue: vue33.Ref; ++ items: vue33.ComputedRef; ++ hoveredRating: vue33.Ref; ++ disabled: vue33.Ref; ++ step: vue33.Ref; ++ changeModelValue: (rating: number) => void; ++ changeHoveredRating: (rating: number) => void; ++} ++declare const injectRatingRootContext: (fallback?: T | undefined) => T extends null ? RatingRootContext | null : RatingRootContext, provideRatingRootContext: (contextValue: RatingRootContext) => RatingRootContext; ++declare const RatingRoot: vue33.DefineComponent any; ++}, string, vue33.PublicProps, Readonly & Readonly<{ ++ 'onUpdate:modelValue'?: ((payload: number) => any) | undefined; ++}>, { ++ disabled: boolean; ++ orientation: 'horizontal' | 'vertical'; ++ loop: boolean; ++ required: boolean; ++ length: number; ++ step: 1 | 0.5 | 0.25 | 0.1; ++}>; ++//#endregion ++//#region src/Rating/RatingItem.vue.d.ts ++interface RatingItemProps extends PrimitiveProps { ++ item: number; ++} ++interface RatingItemContext { ++ steps: vue33.ComputedRef; ++} ++declare const injectRatingItemContext: (fallback?: T | undefined) => T extends null ? RatingItemContext | null : RatingItemContext, provideRatingItemContext: (contextValue: RatingItemContext) => RatingItemContext; ++declare const RatingItem: vue33.DefineComponent & Readonly<{}>, { ++ as: AsTag; ++}>; ++//#endregion ++//#region src/Rating/RatingItemIndicator.vue.d.ts ++interface RatingItemIndicatorProps extends PrimitiveProps { ++ step: number; ++} ++declare const RatingItemIndicator: vue33.DefineComponent & Readonly<{}>, {}>; ++//#endregion + //#region src/RangeCalendar/RangeCalendarCell.vue.d.ts + interface RangeCalendarCellProps extends PrimitiveProps { + date: DateValue$1; +@@ -8825,5 +8878,5 @@ type __VLS_WithSlots = T & { + //# sourceMappingURL=VisuallyHidden.vue.d.ts.map + + //#endregion +-export { AcceptableInputValue, AcceptableValue, _default as AccordionContent, AccordionContentProps, _default$1 as AccordionHeader, AccordionHeaderProps, _default$2 as AccordionItem, AccordionItemProps, _default$3 as AccordionRoot, AccordionRootEmits, AccordionRootProps, _default$4 as AccordionTrigger, AccordionTriggerProps, _default$5 as AlertDialogAction, AlertDialogActionProps, _default$6 as AlertDialogCancel, AlertDialogCancelProps, _default$7 as AlertDialogContent, AlertDialogContentEmits, AlertDialogContentProps, _default$8 as AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogEmits, _default$9 as AlertDialogOverlay, AlertDialogOverlayProps, _default$10 as AlertDialogPortal, AlertDialogPortalProps, AlertDialogProps, _default$11 as AlertDialogRoot, _default$12 as AlertDialogTitle, AlertDialogTitleProps, _default$13 as AlertDialogTrigger, AlertDialogTriggerProps, AsTag, _default$14 as AspectRatio, AspectRatioProps, _default$15 as AvatarFallback, AvatarFallbackProps, _default$16 as AvatarImage, AvatarImageEmits, AvatarImageProps, _default$17 as AvatarRoot, AvatarRootProps, _default$18 as CalendarCell, CalendarCellProps, _default$19 as CalendarCellTrigger, CalendarCellTriggerProps, _default$20 as CalendarGrid, _default$21 as CalendarGridBody, CalendarGridBodyProps, _default$22 as CalendarGridHead, CalendarGridHeadProps, CalendarGridProps, _default$23 as CalendarGridRow, CalendarGridRowProps, _default$24 as CalendarHeadCell, CalendarHeadCellProps, _default$25 as CalendarHeader, CalendarHeaderProps, _default$26 as CalendarHeading, CalendarHeadingProps, _default$27 as CalendarNext, CalendarNextProps, _default$28 as CalendarPrev, CalendarPrevProps, _default$29 as CalendarRoot, CalendarRootEmits, CalendarRootProps, CheckedState as CheckboxCheckedState, _default$30 as CheckboxGroupRoot, CheckboxGroupRootEmits, CheckboxGroupRootProps, _default$31 as CheckboxIndicator, CheckboxIndicatorProps, _default$32 as CheckboxRoot, CheckboxRootEmits, CheckboxRootProps, _default$33 as CollapsibleContent, CollapsibleContentEmits, CollapsibleContentProps, _default$34 as CollapsibleRoot, CollapsibleRootEmits, CollapsibleRootProps, _default$35 as CollapsibleTrigger, CollapsibleTriggerProps, _default$36 as ComboboxAnchor, ComboboxAnchorProps, _default$37 as ComboboxArrow, ComboboxArrowProps, _default$38 as ComboboxCancel, ComboboxCancelProps, _default$39 as ComboboxContent, ComboboxContentEmits, ComboboxContentProps, _default$40 as ComboboxEmpty, ComboboxEmptyProps, _default$41 as ComboboxGroup, ComboboxGroupProps, _default$42 as ComboboxInput, ComboboxInputEmits, ComboboxInputProps, _default$43 as ComboboxItem, ComboboxItemEmits, _default$44 as ComboboxItemIndicator, ComboboxItemIndicatorProps, ComboboxItemProps, _default$45 as ComboboxLabel, ComboboxLabelProps, _default$46 as ComboboxPortal, ComboboxPortalProps, _default$47 as ComboboxRoot, ComboboxRootEmits, ComboboxRootProps, _default$48 as ComboboxSeparator, ComboboxSeparatorProps, _default$49 as ComboboxTrigger, ComboboxTriggerProps, _default$50 as ComboboxViewport, ComboboxViewportProps, _default$51 as ComboboxVirtualizer, ComboboxVirtualizerProps, _default$52 as ConfigProvider, ConfigProviderProps, _default$53 as ContextMenuArrow, ContextMenuArrowProps, _default$54 as ContextMenuCheckboxItem, ContextMenuCheckboxItemEmits, ContextMenuCheckboxItemProps, _default$55 as ContextMenuContent, ContextMenuContentEmits, ContextMenuContentProps, _default$56 as ContextMenuGroup, ContextMenuGroupProps, _default$57 as ContextMenuItem, ContextMenuItemEmits, _default$58 as ContextMenuItemIndicator, ContextMenuItemIndicatorProps, ContextMenuItemProps, _default$59 as ContextMenuLabel, ContextMenuLabelProps, _default$60 as ContextMenuPortal, ContextMenuPortalProps, _default$61 as ContextMenuRadioGroup, ContextMenuRadioGroupEmits, ContextMenuRadioGroupProps, _default$62 as ContextMenuRadioItem, ContextMenuRadioItemEmits, ContextMenuRadioItemProps, _default$63 as ContextMenuRoot, ContextMenuRootEmits, ContextMenuRootProps, _default$64 as ContextMenuSeparator, ContextMenuSeparatorProps, _default$65 as ContextMenuSub, _default$66 as ContextMenuSubContent, ContextMenuSubContentEmits, ContextMenuSubContentProps, ContextMenuSubEmits, ContextMenuSubProps, _default$67 as ContextMenuSubTrigger, ContextMenuSubTriggerProps, _default$68 as ContextMenuTrigger, ContextMenuTriggerProps, _default$69 as DateFieldInput, DateFieldInputProps, _default$70 as DateFieldRoot, DateFieldRootEmits, DateFieldRootProps, _default$71 as DatePickerAnchor, DatePickerAnchorProps, _default$72 as DatePickerArrow, DatePickerArrowProps, _default$73 as DatePickerCalendar, _default$74 as DatePickerCell, DatePickerCellProps, _default$75 as DatePickerCellTrigger, DatePickerCellTriggerProps, _default$76 as DatePickerClose, DatePickerCloseProps, _default$77 as DatePickerContent, DatePickerContentEmits, DatePickerContentProps, _default$78 as DatePickerField, _default$79 as DatePickerGrid, _default$80 as DatePickerGridBody, DatePickerGridBodyProps, _default$81 as DatePickerGridHead, DatePickerGridHeadProps, DatePickerGridProps, _default$82 as DatePickerGridRow, DatePickerGridRowProps, _default$83 as DatePickerHeadCell, DatePickerHeadCellProps, _default$84 as DatePickerHeader, DatePickerHeaderProps, _default$85 as DatePickerHeading, DatePickerHeadingProps, _default$86 as DatePickerInput, DatePickerInputProps, _default$87 as DatePickerNext, DatePickerNextProps, _default$88 as DatePickerPrev, DatePickerPrevProps, _default$89 as DatePickerRoot, DatePickerRootEmits, DatePickerRootProps, _default$90 as DatePickerTrigger, DatePickerTriggerProps, DateRange, _default$91 as DateRangeFieldInput, DateRangeFieldInputProps, _default$92 as DateRangeFieldRoot, DateRangeFieldRootEmits, DateRangeFieldRootProps, _default$93 as DateRangePickerAnchor, DateRangePickerAnchorProps, _default$94 as DateRangePickerArrow, DateRangePickerArrowProps, _default$95 as DateRangePickerCalendar, _default$96 as DateRangePickerCell, DateRangePickerCellProps, _default$97 as DateRangePickerCellTrigger, DateRangePickerCellTriggerProps, _default$98 as DateRangePickerClose, DateRangePickerCloseProps, _default$99 as DateRangePickerContent, DateRangePickerContentEmits, DateRangePickerContentProps, _default$100 as DateRangePickerField, _default$101 as DateRangePickerGrid, _default$102 as DateRangePickerGridBody, DateRangePickerGridBodyProps, _default$103 as DateRangePickerGridHead, DateRangePickerGridHeadProps, DateRangePickerGridProps, _default$104 as DateRangePickerGridRow, DateRangePickerGridRowProps, _default$105 as DateRangePickerHeadCell, DateRangePickerHeadCellProps, _default$106 as DateRangePickerHeader, DateRangePickerHeaderProps, _default$107 as DateRangePickerHeading, DateRangePickerHeadingProps, _default$108 as DateRangePickerInput, DateRangePickerInputProps, _default$109 as DateRangePickerNext, DateRangePickerNextProps, _default$110 as DateRangePickerPrev, DateRangePickerPrevProps, _default$111 as DateRangePickerRoot, DateRangePickerRootEmits, DateRangePickerRootProps, _default$112 as DateRangePickerTrigger, DateRangePickerTriggerProps, DateValue, _default$113 as DialogClose, DialogCloseProps, _default$114 as DialogContent, DialogContentEmits, DialogContentProps, _default$115 as DialogDescription, DialogDescriptionProps, _default$116 as DialogOverlay, DialogOverlayProps, _default$117 as DialogPortal, DialogPortalProps, _default$118 as DialogRoot, DialogRootEmits, DialogRootProps, _default$119 as DialogTitle, DialogTitleProps, _default$120 as DialogTrigger, DialogTriggerProps, _default$121 as DropdownMenuArrow, DropdownMenuArrowProps, _default$122 as DropdownMenuCheckboxItem, DropdownMenuCheckboxItemEmits, DropdownMenuCheckboxItemProps, _default$123 as DropdownMenuContent, DropdownMenuContentEmits, DropdownMenuContentProps, _default$124 as DropdownMenuGroup, DropdownMenuGroupProps, _default$125 as DropdownMenuItem, DropdownMenuItemEmits, _default$126 as DropdownMenuItemIndicator, DropdownMenuItemIndicatorProps, DropdownMenuItemProps, _default$127 as DropdownMenuLabel, DropdownMenuLabelProps, _default$128 as DropdownMenuPortal, DropdownMenuPortalProps, _default$129 as DropdownMenuRadioGroup, DropdownMenuRadioGroupEmits, DropdownMenuRadioGroupProps, _default$130 as DropdownMenuRadioItem, DropdownMenuRadioItemEmits, DropdownMenuRadioItemProps, _default$131 as DropdownMenuRoot, DropdownMenuRootEmits, DropdownMenuRootProps, _default$132 as DropdownMenuSeparator, DropdownMenuSeparatorProps, _default$133 as DropdownMenuSub, _default$134 as DropdownMenuSubContent, DropdownMenuSubContentEmits, DropdownMenuSubContentProps, DropdownMenuSubEmits, DropdownMenuSubProps, _default$135 as DropdownMenuSubTrigger, DropdownMenuSubTriggerProps, _default$136 as DropdownMenuTrigger, DropdownMenuTriggerProps, _default$137 as EditableArea, EditableAreaProps, _default$138 as EditableCancelTrigger, EditableCancelTriggerProps, _default$139 as EditableEditTrigger, EditableEditTriggerProps, _default$140 as EditableInput, EditableInputProps, _default$141 as EditablePreview, EditablePreviewProps, _default$142 as EditableRoot, EditableRootEmits, EditableRootProps, _default$143 as EditableSubmitTrigger, EditableSubmitTriggerProps, FlattenedItem, FocusOutsideEvent, _default$144 as FocusScope, FocusScopeEmits, FocusScopeProps, Formatter, GenericComponentInstance, _default$145 as HoverCardArrow, HoverCardArrowProps, _default$146 as HoverCardContent, HoverCardContentProps, _default$147 as HoverCardPortal, HoverCardPortalProps, _default$148 as HoverCardRoot, HoverCardRootEmits, HoverCardRootProps, _default$149 as HoverCardTrigger, HoverCardTriggerProps, _default$150 as Label, LabelProps, _default$151 as ListboxContent, ListboxContentProps, _default$152 as ListboxFilter, ListboxFilterEmits, ListboxFilterProps, _default$153 as ListboxGroup, _default$154 as ListboxGroupLabel, ListboxGroupLabelProps, ListboxGroupProps, _default$155 as ListboxItem, ListboxItemEmits, _default$156 as ListboxItemIndicator, ListboxItemIndicatorProps, ListboxItemProps, SelectEvent as ListboxItemSelectEvent, _default$157 as ListboxRoot, ListboxRootEmits, ListboxRootProps, _default$158 as ListboxVirtualizer, ListboxVirtualizerProps, _default$159 as MenubarArrow, MenubarArrowProps, _default$160 as MenubarCheckboxItem, MenubarCheckboxItemEmits, MenubarCheckboxItemProps, _default$161 as MenubarContent, MenubarContentProps, _default$162 as MenubarGroup, MenubarGroupProps, _default$163 as MenubarItem, MenubarItemEmits, _default$164 as MenubarItemIndicator, MenubarItemIndicatorProps, MenubarItemProps, _default$165 as MenubarLabel, MenubarLabelProps, _default$166 as MenubarMenu, MenubarMenuProps, _default$167 as MenubarPortal, MenubarPortalProps, _default$168 as MenubarRadioGroup, MenubarRadioGroupEmits, MenubarRadioGroupProps, _default$169 as MenubarRadioItem, MenubarRadioItemEmits, MenubarRadioItemProps, _default$170 as MenubarRoot, MenubarRootEmits, MenubarRootProps, _default$171 as MenubarSeparator, MenubarSeparatorProps, _default$172 as MenubarSub, _default$173 as MenubarSubContent, MenubarSubContentEmits, MenubarSubContentProps, MenubarSubEmits, MenubarSubProps, _default$174 as MenubarSubTrigger, MenubarSubTriggerProps, _default$175 as MenubarTrigger, MenubarTriggerProps, _default$176 as NavigationMenuContent, NavigationMenuContentEmits, NavigationMenuContentProps, _default$177 as NavigationMenuIndicator, NavigationMenuIndicatorProps, _default$178 as NavigationMenuItem, NavigationMenuItemProps, _default$179 as NavigationMenuLink, NavigationMenuLinkEmits, NavigationMenuLinkProps, _default$180 as NavigationMenuList, NavigationMenuListProps, _default$181 as NavigationMenuRoot, NavigationMenuRootEmits, NavigationMenuRootProps, _default$182 as NavigationMenuSub, NavigationMenuSubEmits, NavigationMenuSubProps, _default$183 as NavigationMenuTrigger, NavigationMenuTriggerProps, _default$184 as NavigationMenuViewport, NavigationMenuViewportProps, _default$185 as NumberFieldDecrement, NumberFieldDecrementProps, _default$186 as NumberFieldIncrement, NumberFieldIncrementProps, _default$187 as NumberFieldInput, NumberFieldInputProps, _default$188 as NumberFieldRoot, NumberFieldRootEmits, NumberFieldRootProps, _default$189 as PaginationEllipsis, PaginationEllipsisProps, _default$190 as PaginationFirst, PaginationFirstProps, _default$191 as PaginationLast, PaginationLastProps, _default$192 as PaginationList, _default$193 as PaginationListItem, PaginationListItemProps, PaginationListProps, _default$194 as PaginationNext, PaginationNextProps, _default$195 as PaginationPrev, PaginationPrevProps, _default$196 as PaginationRoot, PaginationRootEmits, PaginationRootProps, _default$197 as PinInputInput, PinInputInputProps, _default$198 as PinInputRoot, PinInputRootEmits, PinInputRootProps, PointerDownOutsideEvent, _default$199 as PopoverAnchor, PopoverAnchorProps, _default$200 as PopoverArrow, PopoverArrowProps, _default$201 as PopoverClose, PopoverCloseProps, _default$202 as PopoverContent, PopoverContentEmits, PopoverContentProps, _default$203 as PopoverPortal, PopoverPortalProps, _default$204 as PopoverRoot, PopoverRootEmits, PopoverRootProps, _default$205 as PopoverTrigger, PopoverTriggerProps, _default$206 as Presence, PresenceProps, Primitive, PrimitiveProps, _default$207 as ProgressIndicator, ProgressIndicatorProps, _default$208 as ProgressRoot, ProgressRootEmits, ProgressRootProps, _default$209 as RadioGroupIndicator, RadioGroupIndicatorProps, _default$210 as RadioGroupItem, RadioGroupItemEmits, RadioGroupItemProps, SelectEvent$1 as RadioGroupItemSelectEvent, _default$211 as RadioGroupRoot, RadioGroupRootEmits, RadioGroupRootProps, _default$212 as RangeCalendarCell, RangeCalendarCellProps, _default$213 as RangeCalendarCellTrigger, RangeCalendarCellTriggerProps, _default$214 as RangeCalendarGrid, _default$215 as RangeCalendarGridBody, RangeCalendarGridBodyProps, _default$216 as RangeCalendarGridHead, RangeCalendarGridHeadProps, RangeCalendarGridProps, _default$217 as RangeCalendarGridRow, RangeCalendarGridRowProps, _default$218 as RangeCalendarHeadCell, RangeCalendarHeadCellProps, _default$219 as RangeCalendarHeader, RangeCalendarHeaderProps, _default$220 as RangeCalendarHeading, RangeCalendarHeadingProps, _default$221 as RangeCalendarNext, RangeCalendarNextProps, _default$222 as RangeCalendarPrev, RangeCalendarPrevProps, _default$223 as RangeCalendarRoot, RangeCalendarRootEmits, RangeCalendarRootProps, ReferenceElement, _default$224 as RovingFocusGroup, RovingFocusGroupEmits, RovingFocusGroupProps, _default$225 as RovingFocusItem, RovingFocusItemProps, _default$226 as ScrollAreaCorner, ScrollAreaCornerProps, _default$227 as ScrollAreaRoot, ScrollAreaRootProps, _default$228 as ScrollAreaScrollbar, _default$229 as ScrollAreaScrollbarGlimpse, ScrollAreaScrollbarGlimpseProps, ScrollAreaScrollbarProps, _default$230 as ScrollAreaThumb, ScrollAreaThumbProps, _default$231 as ScrollAreaViewport, ScrollAreaViewportProps, SegmentPart, _default$232 as SelectArrow, SelectArrowProps, _default$233 as SelectContent, SelectContentEmits, SelectContentProps, _default$234 as SelectGroup, SelectGroupProps, _default$235 as SelectIcon, SelectIconProps, _default$236 as SelectItem, _default$237 as SelectItemIndicator, SelectItemIndicatorProps, SelectItemProps, SelectEvent$2 as SelectItemSelectEvent, _default$238 as SelectItemText, SelectItemTextProps, _default$239 as SelectLabel, SelectLabelProps, _default$240 as SelectPortal, SelectPortalProps, _default$241 as SelectRoot, SelectRootEmits, SelectRootProps, _default$242 as SelectScrollDownButton, SelectScrollDownButtonProps, _default$243 as SelectScrollUpButton, SelectScrollUpButtonProps, _default$244 as SelectSeparator, SelectSeparatorProps, _default$245 as SelectTrigger, SelectTriggerProps, _default$246 as SelectValue, SelectValueProps, _default$247 as SelectViewport, SelectViewportProps, _default$248 as Separator, SeparatorProps, _default$249 as SliderRange, SliderRangeProps, _default$250 as SliderRoot, SliderRootEmits, SliderRootProps, _default$251 as SliderThumb, SliderThumbProps, _default$252 as SliderTrack, SliderTrackProps, Slot, _default$253 as SplitterGroup, SplitterGroupEmits, SplitterGroupProps, _default$254 as SplitterPanel, SplitterPanelEmits, SplitterPanelProps, _default$255 as SplitterResizeHandle, SplitterResizeHandleEmits, SplitterResizeHandleProps, _default$256 as StepperDescription, StepperDescriptionProps, _default$257 as StepperIndicator, StepperIndicatorProps, _default$258 as StepperItem, StepperItemProps, _default$259 as StepperRoot, StepperRootEmits, StepperRootProps, _default$260 as StepperSeparator, StepperSeparatorProps, _default$261 as StepperTitle, StepperTitleProps, _default$262 as StepperTrigger, StepperTriggerProps, _default$263 as SwitchRoot, SwitchRootEmits, SwitchRootProps, _default$264 as SwitchThumb, SwitchThumbProps, _default$265 as TabsContent, TabsContentProps, _default$266 as TabsIndicator, TabsIndicatorProps, _default$267 as TabsList, TabsListProps, _default$268 as TabsRoot, TabsRootEmits, TabsRootProps, _default$269 as TabsTrigger, TabsTriggerProps, _default$270 as TagsInputClear, TagsInputClearProps, _default$271 as TagsInputInput, TagsInputInputProps, _default$272 as TagsInputItem, _default$273 as TagsInputItemDelete, TagsInputItemDeleteProps, TagsInputItemProps, _default$274 as TagsInputItemText, TagsInputItemTextProps, _default$275 as TagsInputRoot, TagsInputRootEmits, TagsInputRootProps, _default$276 as TimeFieldInput, TimeFieldInputProps, _default$277 as TimeFieldRoot, TimeFieldRootEmits, TimeFieldRootProps, TimeValue, _default$278 as ToastAction, ToastActionProps, _default$279 as ToastClose, ToastCloseProps, _default$280 as ToastDescription, ToastDescriptionProps, _default$281 as ToastPortal, ToastPortalProps, _default$282 as ToastProvider, ToastProviderProps, _default$283 as ToastRoot, ToastRootEmits, ToastRootProps, _default$284 as ToastTitle, ToastTitleProps, _default$285 as ToastViewport, ToastViewportProps, _default$286 as Toggle, ToggleEmits, _default$287 as ToggleGroupItem, ToggleGroupItemProps, _default$288 as ToggleGroupRoot, ToggleGroupRootEmits, ToggleGroupRootProps, ToggleProps, _default$289 as ToolbarButton, ToolbarButtonProps, _default$290 as ToolbarLink, ToolbarLinkProps, _default$291 as ToolbarRoot, ToolbarRootProps, _default$292 as ToolbarSeparator, ToolbarSeparatorProps, _default$293 as ToolbarToggleGroup, ToolbarToggleGroupEmits, ToolbarToggleGroupProps, _default$294 as ToolbarToggleItem, ToolbarToggleItemProps, _default$295 as TooltipArrow, TooltipArrowProps, _default$296 as TooltipContent, TooltipContentEmits, TooltipContentProps, _default$297 as TooltipPortal, TooltipPortalProps, _default$298 as TooltipProvider, TooltipProviderProps, _default$299 as TooltipRoot, TooltipRootEmits, TooltipRootProps, _default$300 as TooltipTrigger, TooltipTriggerProps, _default$301 as TreeItem, TreeItemEmits, TreeItemProps, SelectEvent$3 as TreeItemSelectEvent, ToggleEvent as TreeItemToggleEvent, _default$302 as TreeRoot, TreeRootEmits, TreeRootProps, _default$303 as TreeVirtualizer, TreeVirtualizerProps, _default$304 as Viewport, ViewportProps, _default$305 as VisuallyHidden, VisuallyHiddenProps, createContext, injectAccordionItemContext, injectAccordionRootContext, injectAlertDialogContentContext, injectAvatarRootContext, injectCalendarRootContext, injectCheckboxGroupRootContext, injectCheckboxRootContext, injectCollapsibleRootContext, injectComboboxGroupContext, injectListboxItemContext as injectComboboxItemContext, injectComboboxRootContext, injectConfigProviderContext, injectContextMenuRootContext, injectDateFieldRootContext, injectDatePickerRootContext, injectDateRangeFieldRootContext, injectDateRangePickerRootContext, injectDialogRootContext, injectDropdownMenuRootContext, injectEditableRootContext, injectHoverCardRootContext, injectListboxGroupContext, injectListboxItemContext, injectListboxRootContext, injectMenubarMenuContext, injectMenubarRootContext, injectNavigationMenuContext, injectNavigationMenuItemContext, injectNumberFieldRootContext, injectPaginationRootContext, injectPinInputRootContext, injectPopoverRootContext, injectProgressRootContext, injectRadioGroupItemContext, injectRadioGroupRootContext, injectRangeCalendarRootContext, injectScrollAreaRootContext, injectScrollAreaScrollbarContext, injectSelectGroupContext, injectSelectItemContext, injectSelectRootContext, injectSliderRootContext, injectPanelGroupContext as injectSplitterGroupContext, injectStepperItemContext, injectStepperRootContext, injectSwitchRootContext, injectTabsRootContext, injectTagsInputItemContext, injectTagsInputRootContext, injectTimeFieldRootContext, injectToastProviderContext, injectToggleGroupRootContext, injectToolbarRootContext, injectTooltipProviderContext, injectTooltipRootContext, injectTreeRootContext, useBodyScrollLock, useDateFormatter, useDirection, useEmitAsProps, useFilter, useForwardExpose, useForwardProps, useForwardPropsEmits, useId, useLocale, useStateMachine, withDefault }; ++export { AcceptableInputValue, AcceptableValue, _default as AccordionContent, AccordionContentProps, _default$1 as AccordionHeader, AccordionHeaderProps, _default$2 as AccordionItem, AccordionItemProps, _default$3 as AccordionRoot, AccordionRootEmits, AccordionRootProps, _default$4 as AccordionTrigger, AccordionTriggerProps, _default$5 as AlertDialogAction, AlertDialogActionProps, _default$6 as AlertDialogCancel, AlertDialogCancelProps, _default$7 as AlertDialogContent, AlertDialogContentEmits, AlertDialogContentProps, _default$8 as AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogEmits, _default$9 as AlertDialogOverlay, AlertDialogOverlayProps, _default$10 as AlertDialogPortal, AlertDialogPortalProps, AlertDialogProps, _default$11 as AlertDialogRoot, _default$12 as AlertDialogTitle, AlertDialogTitleProps, _default$13 as AlertDialogTrigger, AlertDialogTriggerProps, AsTag, _default$14 as AspectRatio, AspectRatioProps, _default$15 as AvatarFallback, AvatarFallbackProps, _default$16 as AvatarImage, AvatarImageEmits, AvatarImageProps, _default$17 as AvatarRoot, AvatarRootProps, _default$18 as CalendarCell, CalendarCellProps, _default$19 as CalendarCellTrigger, CalendarCellTriggerProps, _default$20 as CalendarGrid, _default$21 as CalendarGridBody, CalendarGridBodyProps, _default$22 as CalendarGridHead, CalendarGridHeadProps, CalendarGridProps, _default$23 as CalendarGridRow, CalendarGridRowProps, _default$24 as CalendarHeadCell, CalendarHeadCellProps, _default$25 as CalendarHeader, CalendarHeaderProps, _default$26 as CalendarHeading, CalendarHeadingProps, _default$27 as CalendarNext, CalendarNextProps, _default$28 as CalendarPrev, CalendarPrevProps, _default$29 as CalendarRoot, CalendarRootEmits, CalendarRootProps, CheckedState as CheckboxCheckedState, _default$30 as CheckboxGroupRoot, CheckboxGroupRootEmits, CheckboxGroupRootProps, _default$31 as CheckboxIndicator, CheckboxIndicatorProps, _default$32 as CheckboxRoot, CheckboxRootEmits, CheckboxRootProps, _default$33 as CollapsibleContent, CollapsibleContentEmits, CollapsibleContentProps, _default$34 as CollapsibleRoot, CollapsibleRootEmits, CollapsibleRootProps, _default$35 as CollapsibleTrigger, CollapsibleTriggerProps, _default$36 as ComboboxAnchor, ComboboxAnchorProps, _default$37 as ComboboxArrow, ComboboxArrowProps, _default$38 as ComboboxCancel, ComboboxCancelProps, _default$39 as ComboboxContent, ComboboxContentEmits, ComboboxContentProps, _default$40 as ComboboxEmpty, ComboboxEmptyProps, _default$41 as ComboboxGroup, ComboboxGroupProps, _default$42 as ComboboxInput, ComboboxInputEmits, ComboboxInputProps, _default$43 as ComboboxItem, ComboboxItemEmits, _default$44 as ComboboxItemIndicator, ComboboxItemIndicatorProps, ComboboxItemProps, _default$45 as ComboboxLabel, ComboboxLabelProps, _default$46 as ComboboxPortal, ComboboxPortalProps, _default$47 as ComboboxRoot, ComboboxRootEmits, ComboboxRootProps, _default$48 as ComboboxSeparator, ComboboxSeparatorProps, _default$49 as ComboboxTrigger, ComboboxTriggerProps, _default$50 as ComboboxViewport, ComboboxViewportProps, _default$51 as ComboboxVirtualizer, ComboboxVirtualizerProps, _default$52 as ConfigProvider, ConfigProviderProps, _default$53 as ContextMenuArrow, ContextMenuArrowProps, _default$54 as ContextMenuCheckboxItem, ContextMenuCheckboxItemEmits, ContextMenuCheckboxItemProps, _default$55 as ContextMenuContent, ContextMenuContentEmits, ContextMenuContentProps, _default$56 as ContextMenuGroup, ContextMenuGroupProps, _default$57 as ContextMenuItem, ContextMenuItemEmits, _default$58 as ContextMenuItemIndicator, ContextMenuItemIndicatorProps, ContextMenuItemProps, _default$59 as ContextMenuLabel, ContextMenuLabelProps, _default$60 as ContextMenuPortal, ContextMenuPortalProps, _default$61 as ContextMenuRadioGroup, ContextMenuRadioGroupEmits, ContextMenuRadioGroupProps, _default$62 as ContextMenuRadioItem, ContextMenuRadioItemEmits, ContextMenuRadioItemProps, _default$63 as ContextMenuRoot, ContextMenuRootEmits, ContextMenuRootProps, _default$64 as ContextMenuSeparator, ContextMenuSeparatorProps, _default$65 as ContextMenuSub, _default$66 as ContextMenuSubContent, ContextMenuSubContentEmits, ContextMenuSubContentProps, ContextMenuSubEmits, ContextMenuSubProps, _default$67 as ContextMenuSubTrigger, ContextMenuSubTriggerProps, _default$68 as ContextMenuTrigger, ContextMenuTriggerProps, _default$69 as DateFieldInput, DateFieldInputProps, _default$70 as DateFieldRoot, DateFieldRootEmits, DateFieldRootProps, _default$71 as DatePickerAnchor, DatePickerAnchorProps, _default$72 as DatePickerArrow, DatePickerArrowProps, _default$73 as DatePickerCalendar, _default$74 as DatePickerCell, DatePickerCellProps, _default$75 as DatePickerCellTrigger, DatePickerCellTriggerProps, _default$76 as DatePickerClose, DatePickerCloseProps, _default$77 as DatePickerContent, DatePickerContentEmits, DatePickerContentProps, _default$78 as DatePickerField, _default$79 as DatePickerGrid, _default$80 as DatePickerGridBody, DatePickerGridBodyProps, _default$81 as DatePickerGridHead, DatePickerGridHeadProps, DatePickerGridProps, _default$82 as DatePickerGridRow, DatePickerGridRowProps, _default$83 as DatePickerHeadCell, DatePickerHeadCellProps, _default$84 as DatePickerHeader, DatePickerHeaderProps, _default$85 as DatePickerHeading, DatePickerHeadingProps, _default$86 as DatePickerInput, DatePickerInputProps, _default$87 as DatePickerNext, DatePickerNextProps, _default$88 as DatePickerPrev, DatePickerPrevProps, _default$89 as DatePickerRoot, DatePickerRootEmits, DatePickerRootProps, _default$90 as DatePickerTrigger, DatePickerTriggerProps, DateRange, _default$91 as DateRangeFieldInput, DateRangeFieldInputProps, _default$92 as DateRangeFieldRoot, DateRangeFieldRootEmits, DateRangeFieldRootProps, _default$93 as DateRangePickerAnchor, DateRangePickerAnchorProps, _default$94 as DateRangePickerArrow, DateRangePickerArrowProps, _default$95 as DateRangePickerCalendar, _default$96 as DateRangePickerCell, DateRangePickerCellProps, _default$97 as DateRangePickerCellTrigger, DateRangePickerCellTriggerProps, _default$98 as DateRangePickerClose, DateRangePickerCloseProps, _default$99 as DateRangePickerContent, DateRangePickerContentEmits, DateRangePickerContentProps, _default$100 as DateRangePickerField, _default$101 as DateRangePickerGrid, _default$102 as DateRangePickerGridBody, DateRangePickerGridBodyProps, _default$103 as DateRangePickerGridHead, DateRangePickerGridHeadProps, DateRangePickerGridProps, _default$104 as DateRangePickerGridRow, DateRangePickerGridRowProps, _default$105 as DateRangePickerHeadCell, DateRangePickerHeadCellProps, _default$106 as DateRangePickerHeader, DateRangePickerHeaderProps, _default$107 as DateRangePickerHeading, DateRangePickerHeadingProps, _default$108 as DateRangePickerInput, DateRangePickerInputProps, _default$109 as DateRangePickerNext, DateRangePickerNextProps, _default$110 as DateRangePickerPrev, DateRangePickerPrevProps, _default$111 as DateRangePickerRoot, DateRangePickerRootEmits, DateRangePickerRootProps, _default$112 as DateRangePickerTrigger, DateRangePickerTriggerProps, DateValue, _default$113 as DialogClose, DialogCloseProps, _default$114 as DialogContent, DialogContentEmits, DialogContentProps, _default$115 as DialogDescription, DialogDescriptionProps, _default$116 as DialogOverlay, DialogOverlayProps, _default$117 as DialogPortal, DialogPortalProps, _default$118 as DialogRoot, DialogRootEmits, DialogRootProps, _default$119 as DialogTitle, DialogTitleProps, _default$120 as DialogTrigger, DialogTriggerProps, _default$121 as DropdownMenuArrow, DropdownMenuArrowProps, _default$122 as DropdownMenuCheckboxItem, DropdownMenuCheckboxItemEmits, DropdownMenuCheckboxItemProps, _default$123 as DropdownMenuContent, DropdownMenuContentEmits, DropdownMenuContentProps, _default$124 as DropdownMenuGroup, DropdownMenuGroupProps, _default$125 as DropdownMenuItem, DropdownMenuItemEmits, _default$126 as DropdownMenuItemIndicator, DropdownMenuItemIndicatorProps, DropdownMenuItemProps, _default$127 as DropdownMenuLabel, DropdownMenuLabelProps, _default$128 as DropdownMenuPortal, DropdownMenuPortalProps, _default$129 as DropdownMenuRadioGroup, DropdownMenuRadioGroupEmits, DropdownMenuRadioGroupProps, _default$130 as DropdownMenuRadioItem, DropdownMenuRadioItemEmits, DropdownMenuRadioItemProps, _default$131 as DropdownMenuRoot, DropdownMenuRootEmits, DropdownMenuRootProps, _default$132 as DropdownMenuSeparator, DropdownMenuSeparatorProps, _default$133 as DropdownMenuSub, _default$134 as DropdownMenuSubContent, DropdownMenuSubContentEmits, DropdownMenuSubContentProps, DropdownMenuSubEmits, DropdownMenuSubProps, _default$135 as DropdownMenuSubTrigger, DropdownMenuSubTriggerProps, _default$136 as DropdownMenuTrigger, DropdownMenuTriggerProps, _default$137 as EditableArea, EditableAreaProps, _default$138 as EditableCancelTrigger, EditableCancelTriggerProps, _default$139 as EditableEditTrigger, EditableEditTriggerProps, _default$140 as EditableInput, EditableInputProps, _default$141 as EditablePreview, EditablePreviewProps, _default$142 as EditableRoot, EditableRootEmits, EditableRootProps, _default$143 as EditableSubmitTrigger, EditableSubmitTriggerProps, FlattenedItem, FocusOutsideEvent, _default$144 as FocusScope, FocusScopeEmits, FocusScopeProps, Formatter, GenericComponentInstance, _default$145 as HoverCardArrow, HoverCardArrowProps, _default$146 as HoverCardContent, HoverCardContentProps, _default$147 as HoverCardPortal, HoverCardPortalProps, _default$148 as HoverCardRoot, HoverCardRootEmits, HoverCardRootProps, _default$149 as HoverCardTrigger, HoverCardTriggerProps, _default$150 as Label, LabelProps, _default$151 as ListboxContent, ListboxContentProps, _default$152 as ListboxFilter, ListboxFilterEmits, ListboxFilterProps, _default$153 as ListboxGroup, _default$154 as ListboxGroupLabel, ListboxGroupLabelProps, ListboxGroupProps, _default$155 as ListboxItem, ListboxItemEmits, _default$156 as ListboxItemIndicator, ListboxItemIndicatorProps, ListboxItemProps, SelectEvent as ListboxItemSelectEvent, _default$157 as ListboxRoot, ListboxRootEmits, ListboxRootProps, _default$158 as ListboxVirtualizer, ListboxVirtualizerProps, _default$159 as MenubarArrow, MenubarArrowProps, _default$160 as MenubarCheckboxItem, MenubarCheckboxItemEmits, MenubarCheckboxItemProps, _default$161 as MenubarContent, MenubarContentProps, _default$162 as MenubarGroup, MenubarGroupProps, _default$163 as MenubarItem, MenubarItemEmits, _default$164 as MenubarItemIndicator, MenubarItemIndicatorProps, MenubarItemProps, _default$165 as MenubarLabel, MenubarLabelProps, _default$166 as MenubarMenu, MenubarMenuProps, _default$167 as MenubarPortal, MenubarPortalProps, _default$168 as MenubarRadioGroup, MenubarRadioGroupEmits, MenubarRadioGroupProps, _default$169 as MenubarRadioItem, MenubarRadioItemEmits, MenubarRadioItemProps, _default$170 as MenubarRoot, MenubarRootEmits, MenubarRootProps, _default$171 as MenubarSeparator, MenubarSeparatorProps, _default$172 as MenubarSub, _default$173 as MenubarSubContent, MenubarSubContentEmits, MenubarSubContentProps, MenubarSubEmits, MenubarSubProps, _default$174 as MenubarSubTrigger, MenubarSubTriggerProps, _default$175 as MenubarTrigger, MenubarTriggerProps, _default$176 as NavigationMenuContent, NavigationMenuContentEmits, NavigationMenuContentProps, _default$177 as NavigationMenuIndicator, NavigationMenuIndicatorProps, _default$178 as NavigationMenuItem, NavigationMenuItemProps, _default$179 as NavigationMenuLink, NavigationMenuLinkEmits, NavigationMenuLinkProps, _default$180 as NavigationMenuList, NavigationMenuListProps, _default$181 as NavigationMenuRoot, NavigationMenuRootEmits, NavigationMenuRootProps, _default$182 as NavigationMenuSub, NavigationMenuSubEmits, NavigationMenuSubProps, _default$183 as NavigationMenuTrigger, NavigationMenuTriggerProps, _default$184 as NavigationMenuViewport, NavigationMenuViewportProps, _default$185 as NumberFieldDecrement, NumberFieldDecrementProps, _default$186 as NumberFieldIncrement, NumberFieldIncrementProps, _default$187 as NumberFieldInput, NumberFieldInputProps, _default$188 as NumberFieldRoot, NumberFieldRootEmits, NumberFieldRootProps, _default$189 as PaginationEllipsis, PaginationEllipsisProps, _default$190 as PaginationFirst, PaginationFirstProps, _default$191 as PaginationLast, PaginationLastProps, _default$192 as PaginationList, _default$193 as PaginationListItem, PaginationListItemProps, PaginationListProps, _default$194 as PaginationNext, PaginationNextProps, _default$195 as PaginationPrev, PaginationPrevProps, _default$196 as PaginationRoot, PaginationRootEmits, PaginationRootProps, _default$197 as PinInputInput, PinInputInputProps, _default$198 as PinInputRoot, PinInputRootEmits, PinInputRootProps, PointerDownOutsideEvent, _default$199 as PopoverAnchor, PopoverAnchorProps, _default$200 as PopoverArrow, PopoverArrowProps, _default$201 as PopoverClose, PopoverCloseProps, _default$202 as PopoverContent, PopoverContentEmits, PopoverContentProps, _default$203 as PopoverPortal, PopoverPortalProps, _default$204 as PopoverRoot, PopoverRootEmits, PopoverRootProps, _default$205 as PopoverTrigger, PopoverTriggerProps, _default$206 as Presence, PresenceProps, Primitive, PrimitiveProps, _default$207 as ProgressIndicator, ProgressIndicatorProps, _default$208 as ProgressRoot, ProgressRootEmits, ProgressRootProps, _default$209 as RadioGroupIndicator, RadioGroupIndicatorProps, _default$210 as RadioGroupItem, RadioGroupItemEmits, RadioGroupItemProps, SelectEvent$1 as RadioGroupItemSelectEvent, _default$211 as RadioGroupRoot, RadioGroupRootEmits, RadioGroupRootProps, RatingRoot, RatingRootEmits, RatingRootProps, RatingItem, RatingItemProps, RatingItemIndicator, RatingItemIndicatorProps, _default$212 as RangeCalendarCell, RangeCalendarCellProps, _default$213 as RangeCalendarCellTrigger, RangeCalendarCellTriggerProps, _default$214 as RangeCalendarGrid, _default$215 as RangeCalendarGridBody, RangeCalendarGridBodyProps, _default$216 as RangeCalendarGridHead, RangeCalendarGridHeadProps, RangeCalendarGridProps, _default$217 as RangeCalendarGridRow, RangeCalendarGridRowProps, _default$218 as RangeCalendarHeadCell, RangeCalendarHeadCellProps, _default$219 as RangeCalendarHeader, RangeCalendarHeaderProps, _default$220 as RangeCalendarHeading, RangeCalendarHeadingProps, _default$221 as RangeCalendarNext, RangeCalendarNextProps, _default$222 as RangeCalendarPrev, RangeCalendarPrevProps, _default$223 as RangeCalendarRoot, RangeCalendarRootEmits, RangeCalendarRootProps, ReferenceElement, _default$224 as RovingFocusGroup, RovingFocusGroupEmits, RovingFocusGroupProps, _default$225 as RovingFocusItem, RovingFocusItemProps, _default$226 as ScrollAreaCorner, ScrollAreaCornerProps, _default$227 as ScrollAreaRoot, ScrollAreaRootProps, _default$228 as ScrollAreaScrollbar, _default$229 as ScrollAreaScrollbarGlimpse, ScrollAreaScrollbarGlimpseProps, ScrollAreaScrollbarProps, _default$230 as ScrollAreaThumb, ScrollAreaThumbProps, _default$231 as ScrollAreaViewport, ScrollAreaViewportProps, SegmentPart, _default$232 as SelectArrow, SelectArrowProps, _default$233 as SelectContent, SelectContentEmits, SelectContentProps, _default$234 as SelectGroup, SelectGroupProps, _default$235 as SelectIcon, SelectIconProps, _default$236 as SelectItem, _default$237 as SelectItemIndicator, SelectItemIndicatorProps, SelectItemProps, SelectEvent$2 as SelectItemSelectEvent, _default$238 as SelectItemText, SelectItemTextProps, _default$239 as SelectLabel, SelectLabelProps, _default$240 as SelectPortal, SelectPortalProps, _default$241 as SelectRoot, SelectRootEmits, SelectRootProps, _default$242 as SelectScrollDownButton, SelectScrollDownButtonProps, _default$243 as SelectScrollUpButton, SelectScrollUpButtonProps, _default$244 as SelectSeparator, SelectSeparatorProps, _default$245 as SelectTrigger, SelectTriggerProps, _default$246 as SelectValue, SelectValueProps, _default$247 as SelectViewport, SelectViewportProps, _default$248 as Separator, SeparatorProps, _default$249 as SliderRange, SliderRangeProps, _default$250 as SliderRoot, SliderRootEmits, SliderRootProps, _default$251 as SliderThumb, SliderThumbProps, _default$252 as SliderTrack, SliderTrackProps, Slot, _default$253 as SplitterGroup, SplitterGroupEmits, SplitterGroupProps, _default$254 as SplitterPanel, SplitterPanelEmits, SplitterPanelProps, _default$255 as SplitterResizeHandle, SplitterResizeHandleEmits, SplitterResizeHandleProps, _default$256 as StepperDescription, StepperDescriptionProps, _default$257 as StepperIndicator, StepperIndicatorProps, _default$258 as StepperItem, StepperItemProps, _default$259 as StepperRoot, StepperRootEmits, StepperRootProps, _default$260 as StepperSeparator, StepperSeparatorProps, _default$261 as StepperTitle, StepperTitleProps, _default$262 as StepperTrigger, StepperTriggerProps, _default$263 as SwitchRoot, SwitchRootEmits, SwitchRootProps, _default$264 as SwitchThumb, SwitchThumbProps, _default$265 as TabsContent, TabsContentProps, _default$266 as TabsIndicator, TabsIndicatorProps, _default$267 as TabsList, TabsListProps, _default$268 as TabsRoot, TabsRootEmits, TabsRootProps, _default$269 as TabsTrigger, TabsTriggerProps, _default$270 as TagsInputClear, TagsInputClearProps, _default$271 as TagsInputInput, TagsInputInputProps, _default$272 as TagsInputItem, _default$273 as TagsInputItemDelete, TagsInputItemDeleteProps, TagsInputItemProps, _default$274 as TagsInputItemText, TagsInputItemTextProps, _default$275 as TagsInputRoot, TagsInputRootEmits, TagsInputRootProps, _default$276 as TimeFieldInput, TimeFieldInputProps, _default$277 as TimeFieldRoot, TimeFieldRootEmits, TimeFieldRootProps, TimeValue, _default$278 as ToastAction, ToastActionProps, _default$279 as ToastClose, ToastCloseProps, _default$280 as ToastDescription, ToastDescriptionProps, _default$281 as ToastPortal, ToastPortalProps, _default$282 as ToastProvider, ToastProviderProps, _default$283 as ToastRoot, ToastRootEmits, ToastRootProps, _default$284 as ToastTitle, ToastTitleProps, _default$285 as ToastViewport, ToastViewportProps, _default$286 as Toggle, ToggleEmits, _default$287 as ToggleGroupItem, ToggleGroupItemProps, _default$288 as ToggleGroupRoot, ToggleGroupRootEmits, ToggleGroupRootProps, ToggleProps, _default$289 as ToolbarButton, ToolbarButtonProps, _default$290 as ToolbarLink, ToolbarLinkProps, _default$291 as ToolbarRoot, ToolbarRootProps, _default$292 as ToolbarSeparator, ToolbarSeparatorProps, _default$293 as ToolbarToggleGroup, ToolbarToggleGroupEmits, ToolbarToggleGroupProps, _default$294 as ToolbarToggleItem, ToolbarToggleItemProps, _default$295 as TooltipArrow, TooltipArrowProps, _default$296 as TooltipContent, TooltipContentEmits, TooltipContentProps, _default$297 as TooltipPortal, TooltipPortalProps, _default$298 as TooltipProvider, TooltipProviderProps, _default$299 as TooltipRoot, TooltipRootEmits, TooltipRootProps, _default$300 as TooltipTrigger, TooltipTriggerProps, _default$301 as TreeItem, TreeItemEmits, TreeItemProps, SelectEvent$3 as TreeItemSelectEvent, ToggleEvent as TreeItemToggleEvent, _default$302 as TreeRoot, TreeRootEmits, TreeRootProps, _default$303 as TreeVirtualizer, TreeVirtualizerProps, _default$304 as Viewport, ViewportProps, _default$305 as VisuallyHidden, VisuallyHiddenProps, createContext, injectAccordionItemContext, injectAccordionRootContext, injectAlertDialogContentContext, injectAvatarRootContext, injectCalendarRootContext, injectCheckboxGroupRootContext, injectCheckboxRootContext, injectCollapsibleRootContext, injectComboboxGroupContext, injectListboxItemContext as injectComboboxItemContext, injectComboboxRootContext, injectConfigProviderContext, injectContextMenuRootContext, injectDateFieldRootContext, injectDatePickerRootContext, injectDateRangeFieldRootContext, injectDateRangePickerRootContext, injectDialogRootContext, injectDropdownMenuRootContext, injectEditableRootContext, injectHoverCardRootContext, injectListboxGroupContext, injectListboxItemContext, injectListboxRootContext, injectMenubarMenuContext, injectMenubarRootContext, injectNavigationMenuContext, injectNavigationMenuItemContext, injectNumberFieldRootContext, injectPaginationRootContext, injectPinInputRootContext, injectPopoverRootContext, injectProgressRootContext, injectRadioGroupItemContext, injectRadioGroupRootContext, injectRatingRootContext, injectRatingItemContext, injectRangeCalendarRootContext, injectScrollAreaRootContext, injectScrollAreaScrollbarContext, injectSelectGroupContext, injectSelectItemContext, injectSelectRootContext, injectSliderRootContext, injectPanelGroupContext as injectSplitterGroupContext, injectStepperItemContext, injectStepperRootContext, injectSwitchRootContext, injectTabsRootContext, injectTagsInputItemContext, injectTagsInputRootContext, injectTimeFieldRootContext, injectToastProviderContext, injectToggleGroupRootContext, injectToolbarRootContext, injectTooltipProviderContext, injectTooltipRootContext, injectTreeRootContext, useBodyScrollLock, useDateFormatter, useDirection, useEmitAsProps, useFilter, useForwardExpose, useForwardProps, useForwardPropsEmits, useId, useLocale, useStateMachine, withDefault }; + //# sourceMappingURL=index.d.ts.map +\ No newline at end of file +diff --git a/dist/index.js b/dist/index.js +index 14b909376e6f0b2f7a23c46038c6dedd740f370b..20595b661f266a55a2d729f737775be44b4b8650 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -318,6 +318,9 @@ import "./RadioGroup/Radio.js"; + import { RadioGroupRoot_default, injectRadioGroupRootContext } from "./RadioGroup/RadioGroupRoot.js"; + import { RadioGroupItem_default, injectRadioGroupItemContext } from "./RadioGroup/RadioGroupItem.js"; + import { RadioGroupIndicator_default } from "./RadioGroup/RadioGroupIndicator.js"; ++import { RatingRoot_default, injectRatingRootContext } from "./Rating/RatingRoot.js"; ++import { RatingItem_default, injectRatingItemContext } from "./Rating/RatingItem.js"; ++import { RatingItemIndicator_default } from "./Rating/RatingItemIndicator.js"; + import "./RangeCalendar/useRangeCalendar.js"; + import { RangeCalendarRoot_default, injectRangeCalendarRootContext } from "./RangeCalendar/RangeCalendarRoot.js"; + import { RangeCalendarCell_default } from "./RangeCalendar/RangeCalendarCell.js"; +@@ -463,4 +466,4 @@ import { TreeVirtualizer_default } from "./Tree/TreeVirtualizer.js"; + import { Viewport_default } from "./Viewport/Viewport.js"; + import "./index2.js"; + +-export { AccordionContent_default as AccordionContent, AccordionHeader_default as AccordionHeader, AccordionItem_default as AccordionItem, AccordionRoot_default as AccordionRoot, AccordionTrigger_default as AccordionTrigger, AlertDialogAction_default as AlertDialogAction, AlertDialogCancel_default as AlertDialogCancel, AlertDialogContent_default as AlertDialogContent, AlertDialogDescription_default as AlertDialogDescription, AlertDialogOverlay_default as AlertDialogOverlay, AlertDialogPortal_default as AlertDialogPortal, AlertDialogRoot_default as AlertDialogRoot, AlertDialogTitle_default as AlertDialogTitle, AlertDialogTrigger_default as AlertDialogTrigger, AspectRatio_default as AspectRatio, AvatarFallback_default as AvatarFallback, AvatarImage_default as AvatarImage, AvatarRoot_default as AvatarRoot, CalendarCell_default as CalendarCell, CalendarCellTrigger_default as CalendarCellTrigger, CalendarGrid_default as CalendarGrid, CalendarGridBody_default as CalendarGridBody, CalendarGridHead_default as CalendarGridHead, CalendarGridRow_default as CalendarGridRow, CalendarHeadCell_default as CalendarHeadCell, CalendarHeader_default as CalendarHeader, CalendarHeading_default as CalendarHeading, CalendarNext_default as CalendarNext, CalendarPrev_default as CalendarPrev, CalendarRoot_default as CalendarRoot, CheckboxGroupRoot_default as CheckboxGroupRoot, CheckboxIndicator_default as CheckboxIndicator, CheckboxRoot_default as CheckboxRoot, CollapsibleContent_default as CollapsibleContent, CollapsibleRoot_default as CollapsibleRoot, CollapsibleTrigger_default as CollapsibleTrigger, ComboboxAnchor_default as ComboboxAnchor, ComboboxArrow_default as ComboboxArrow, ComboboxCancel_default as ComboboxCancel, ComboboxContent_default as ComboboxContent, ComboboxEmpty_default as ComboboxEmpty, ComboboxGroup_default as ComboboxGroup, ComboboxInput_default as ComboboxInput, ComboboxItem_default as ComboboxItem, ComboboxItemIndicator_default as ComboboxItemIndicator, ComboboxLabel_default as ComboboxLabel, ComboboxPortal_default as ComboboxPortal, ComboboxRoot_default as ComboboxRoot, ComboboxSeparator_default as ComboboxSeparator, ComboboxTrigger_default as ComboboxTrigger, ComboboxViewport_default as ComboboxViewport, ComboboxVirtualizer_default as ComboboxVirtualizer, ConfigProvider_default as ConfigProvider, ContextMenuArrow_default as ContextMenuArrow, ContextMenuCheckboxItem_default as ContextMenuCheckboxItem, ContextMenuContent_default as ContextMenuContent, ContextMenuGroup_default as ContextMenuGroup, ContextMenuItem_default as ContextMenuItem, ContextMenuItemIndicator_default as ContextMenuItemIndicator, ContextMenuLabel_default as ContextMenuLabel, ContextMenuPortal_default as ContextMenuPortal, ContextMenuRadioGroup_default as ContextMenuRadioGroup, ContextMenuRadioItem_default as ContextMenuRadioItem, ContextMenuRoot_default as ContextMenuRoot, ContextMenuSeparator_default as ContextMenuSeparator, ContextMenuSub_default as ContextMenuSub, ContextMenuSubContent_default as ContextMenuSubContent, ContextMenuSubTrigger_default as ContextMenuSubTrigger, ContextMenuTrigger_default as ContextMenuTrigger, DateFieldInput_default as DateFieldInput, DateFieldRoot_default as DateFieldRoot, DatePickerAnchor_default as DatePickerAnchor, DatePickerArrow_default as DatePickerArrow, DatePickerCalendar_default as DatePickerCalendar, DatePickerCell_default as DatePickerCell, DatePickerCellTrigger_default as DatePickerCellTrigger, DatePickerClose_default as DatePickerClose, DatePickerContent_default as DatePickerContent, DatePickerField_default as DatePickerField, DatePickerGrid_default as DatePickerGrid, DatePickerGridBody_default as DatePickerGridBody, DatePickerGridHead_default as DatePickerGridHead, DatePickerGridRow_default as DatePickerGridRow, DatePickerHeadCell_default as DatePickerHeadCell, DatePickerHeader_default as DatePickerHeader, DatePickerHeading_default as DatePickerHeading, DatePickerInput_default as DatePickerInput, DatePickerNext_default as DatePickerNext, DatePickerPrev_default as DatePickerPrev, DatePickerRoot_default as DatePickerRoot, DatePickerTrigger_default as DatePickerTrigger, DateRangeFieldInput_default as DateRangeFieldInput, DateRangeFieldRoot_default as DateRangeFieldRoot, DateRangePickerAnchor_default as DateRangePickerAnchor, DateRangePickerArrow_default as DateRangePickerArrow, DateRangePickerCalendar_default as DateRangePickerCalendar, DateRangePickerCell_default as DateRangePickerCell, DateRangePickerCellTrigger_default as DateRangePickerCellTrigger, DateRangePickerClose_default as DateRangePickerClose, DateRangePickerContent_default as DateRangePickerContent, DateRangePickerField_default as DateRangePickerField, DateRangePickerGrid_default as DateRangePickerGrid, DateRangePickerGridBody_default as DateRangePickerGridBody, DateRangePickerGridHead_default as DateRangePickerGridHead, DateRangePickerGridRow_default as DateRangePickerGridRow, DateRangePickerHeadCell_default as DateRangePickerHeadCell, DateRangePickerHeader_default as DateRangePickerHeader, DateRangePickerHeading_default as DateRangePickerHeading, DateRangePickerInput_default as DateRangePickerInput, DateRangePickerNext_default as DateRangePickerNext, DateRangePickerPrev_default as DateRangePickerPrev, DateRangePickerRoot_default as DateRangePickerRoot, DateRangePickerTrigger_default as DateRangePickerTrigger, DialogClose_default as DialogClose, DialogContent_default as DialogContent, DialogDescription_default as DialogDescription, DialogOverlay_default as DialogOverlay, DialogPortal_default as DialogPortal, DialogRoot_default as DialogRoot, DialogTitle_default as DialogTitle, DialogTrigger_default as DialogTrigger, DropdownMenuArrow_default as DropdownMenuArrow, DropdownMenuCheckboxItem_default as DropdownMenuCheckboxItem, DropdownMenuContent_default as DropdownMenuContent, DropdownMenuGroup_default as DropdownMenuGroup, DropdownMenuItem_default as DropdownMenuItem, DropdownMenuItemIndicator_default as DropdownMenuItemIndicator, DropdownMenuLabel_default as DropdownMenuLabel, DropdownMenuPortal_default as DropdownMenuPortal, DropdownMenuRadioGroup_default as DropdownMenuRadioGroup, DropdownMenuRadioItem_default as DropdownMenuRadioItem, DropdownMenuRoot_default as DropdownMenuRoot, DropdownMenuSeparator_default as DropdownMenuSeparator, DropdownMenuSub_default as DropdownMenuSub, DropdownMenuSubContent_default as DropdownMenuSubContent, DropdownMenuSubTrigger_default as DropdownMenuSubTrigger, DropdownMenuTrigger_default as DropdownMenuTrigger, EditableArea_default as EditableArea, EditableCancelTrigger_default as EditableCancelTrigger, EditableEditTrigger_default as EditableEditTrigger, EditableInput_default as EditableInput, EditablePreview_default as EditablePreview, EditableRoot_default as EditableRoot, EditableSubmitTrigger_default as EditableSubmitTrigger, FocusScope_default as FocusScope, HoverCardArrow_default as HoverCardArrow, HoverCardContent_default as HoverCardContent, HoverCardPortal_default as HoverCardPortal, HoverCardRoot_default as HoverCardRoot, HoverCardTrigger_default as HoverCardTrigger, Label_default as Label, ListboxContent_default as ListboxContent, ListboxFilter_default as ListboxFilter, ListboxGroup_default as ListboxGroup, ListboxGroupLabel_default as ListboxGroupLabel, ListboxItem_default as ListboxItem, ListboxItemIndicator_default as ListboxItemIndicator, ListboxRoot_default as ListboxRoot, ListboxVirtualizer_default as ListboxVirtualizer, MenubarArrow_default as MenubarArrow, MenubarCheckboxItem_default as MenubarCheckboxItem, MenubarContent_default as MenubarContent, MenubarGroup_default as MenubarGroup, MenubarItem_default as MenubarItem, MenubarItemIndicator_default as MenubarItemIndicator, MenubarLabel_default as MenubarLabel, MenubarMenu_default as MenubarMenu, MenubarPortal_default as MenubarPortal, MenubarRadioGroup_default as MenubarRadioGroup, MenubarRadioItem_default as MenubarRadioItem, MenubarRoot_default as MenubarRoot, MenubarSeparator_default as MenubarSeparator, MenubarSub_default as MenubarSub, MenubarSubContent_default as MenubarSubContent, MenubarSubTrigger_default as MenubarSubTrigger, MenubarTrigger_default as MenubarTrigger, NavigationMenuContent_default as NavigationMenuContent, NavigationMenuIndicator_default as NavigationMenuIndicator, NavigationMenuItem_default as NavigationMenuItem, NavigationMenuLink_default as NavigationMenuLink, NavigationMenuList_default as NavigationMenuList, NavigationMenuRoot_default as NavigationMenuRoot, NavigationMenuSub_default as NavigationMenuSub, NavigationMenuTrigger_default as NavigationMenuTrigger, NavigationMenuViewport_default as NavigationMenuViewport, NumberFieldDecrement_default as NumberFieldDecrement, NumberFieldIncrement_default as NumberFieldIncrement, NumberFieldInput_default as NumberFieldInput, NumberFieldRoot_default as NumberFieldRoot, PaginationEllipsis_default as PaginationEllipsis, PaginationFirst_default as PaginationFirst, PaginationLast_default as PaginationLast, PaginationList_default as PaginationList, PaginationListItem_default as PaginationListItem, PaginationNext_default as PaginationNext, PaginationPrev_default as PaginationPrev, PaginationRoot_default as PaginationRoot, PinInputInput_default as PinInputInput, PinInputRoot_default as PinInputRoot, PopoverAnchor_default as PopoverAnchor, PopoverArrow_default as PopoverArrow, PopoverClose_default as PopoverClose, PopoverContent_default as PopoverContent, PopoverPortal_default as PopoverPortal, PopoverRoot_default as PopoverRoot, PopoverTrigger_default as PopoverTrigger, Presence_default as Presence, Primitive, ProgressIndicator_default as ProgressIndicator, ProgressRoot_default as ProgressRoot, RadioGroupIndicator_default as RadioGroupIndicator, RadioGroupItem_default as RadioGroupItem, RadioGroupRoot_default as RadioGroupRoot, RangeCalendarCell_default as RangeCalendarCell, RangeCalendarCellTrigger_default as RangeCalendarCellTrigger, RangeCalendarGrid_default as RangeCalendarGrid, RangeCalendarGridBody_default as RangeCalendarGridBody, RangeCalendarGridHead_default as RangeCalendarGridHead, RangeCalendarGridRow_default as RangeCalendarGridRow, RangeCalendarHeadCell_default as RangeCalendarHeadCell, RangeCalendarHeader_default as RangeCalendarHeader, RangeCalendarHeading_default as RangeCalendarHeading, RangeCalendarNext_default as RangeCalendarNext, RangeCalendarPrev_default as RangeCalendarPrev, RangeCalendarRoot_default as RangeCalendarRoot, RovingFocusGroup_default as RovingFocusGroup, RovingFocusItem_default as RovingFocusItem, ScrollAreaCorner_default as ScrollAreaCorner, ScrollAreaRoot_default as ScrollAreaRoot, ScrollAreaScrollbar_default as ScrollAreaScrollbar, ScrollAreaScrollbarGlimpse_default as ScrollAreaScrollbarGlimpse, ScrollAreaThumb_default as ScrollAreaThumb, ScrollAreaViewport_default as ScrollAreaViewport, SelectArrow_default as SelectArrow, SelectContent_default as SelectContent, SelectGroup_default as SelectGroup, SelectIcon_default as SelectIcon, SelectItem_default as SelectItem, SelectItemIndicator_default as SelectItemIndicator, SelectItemText_default as SelectItemText, SelectLabel_default as SelectLabel, SelectPortal_default as SelectPortal, SelectRoot_default as SelectRoot, SelectScrollDownButton_default as SelectScrollDownButton, SelectScrollUpButton_default as SelectScrollUpButton, SelectSeparator_default as SelectSeparator, SelectTrigger_default as SelectTrigger, SelectValue_default as SelectValue, SelectViewport_default as SelectViewport, Separator_default as Separator, SliderRange_default as SliderRange, SliderRoot_default as SliderRoot, SliderThumb_default as SliderThumb, SliderTrack_default as SliderTrack, Slot, SplitterGroup_default as SplitterGroup, SplitterPanel_default as SplitterPanel, SplitterResizeHandle_default as SplitterResizeHandle, StepperDescription_default as StepperDescription, StepperIndicator_default as StepperIndicator, StepperItem_default as StepperItem, StepperRoot_default as StepperRoot, StepperSeparator_default as StepperSeparator, StepperTitle_default as StepperTitle, StepperTrigger_default as StepperTrigger, SwitchRoot_default as SwitchRoot, SwitchThumb_default as SwitchThumb, TabsContent_default as TabsContent, TabsIndicator_default as TabsIndicator, TabsList_default as TabsList, TabsRoot_default as TabsRoot, TabsTrigger_default as TabsTrigger, TagsInputClear_default as TagsInputClear, TagsInputInput_default as TagsInputInput, TagsInputItem_default as TagsInputItem, TagsInputItemDelete_default as TagsInputItemDelete, TagsInputItemText_default as TagsInputItemText, TagsInputRoot_default as TagsInputRoot, TimeFieldInput_default as TimeFieldInput, TimeFieldRoot_default as TimeFieldRoot, ToastAction_default as ToastAction, ToastClose_default as ToastClose, ToastDescription_default as ToastDescription, ToastPortal_default as ToastPortal, ToastProvider_default as ToastProvider, ToastRoot_default as ToastRoot, ToastTitle_default as ToastTitle, ToastViewport_default as ToastViewport, Toggle_default as Toggle, ToggleGroupItem_default as ToggleGroupItem, ToggleGroupRoot_default as ToggleGroupRoot, ToolbarButton_default as ToolbarButton, ToolbarLink_default as ToolbarLink, ToolbarRoot_default as ToolbarRoot, ToolbarSeparator_default as ToolbarSeparator, ToolbarToggleGroup_default as ToolbarToggleGroup, ToolbarToggleItem_default as ToolbarToggleItem, TooltipArrow_default as TooltipArrow, TooltipContent_default as TooltipContent, TooltipPortal_default as TooltipPortal, TooltipProvider_default as TooltipProvider, TooltipRoot_default as TooltipRoot, TooltipTrigger_default as TooltipTrigger, TreeItem_default as TreeItem, TreeRoot_default as TreeRoot, TreeVirtualizer_default as TreeVirtualizer, Viewport_default as Viewport, VisuallyHidden_default as VisuallyHidden, createContext, injectAccordionItemContext, injectAccordionRootContext, injectAlertDialogContentContext, injectAvatarRootContext, injectCalendarRootContext, injectCheckboxGroupRootContext, injectCheckboxRootContext, injectCollapsibleRootContext, injectComboboxGroupContext, injectListboxItemContext as injectComboboxItemContext, injectComboboxRootContext, injectConfigProviderContext, injectContextMenuRootContext, injectDateFieldRootContext, injectDatePickerRootContext, injectDateRangeFieldRootContext, injectDateRangePickerRootContext, injectDialogRootContext, injectDropdownMenuRootContext, injectEditableRootContext, injectHoverCardRootContext, injectListboxGroupContext, injectListboxItemContext, injectListboxRootContext, injectMenubarMenuContext, injectMenubarRootContext, injectNavigationMenuContext, injectNavigationMenuItemContext, injectNumberFieldRootContext, injectPaginationRootContext, injectPinInputRootContext, injectPopoverRootContext, injectProgressRootContext, injectRadioGroupItemContext, injectRadioGroupRootContext, injectRangeCalendarRootContext, injectScrollAreaRootContext, injectScrollAreaScrollbarContext, injectSelectGroupContext, injectSelectItemContext, injectSelectRootContext, injectSliderRootContext, injectPanelGroupContext as injectSplitterGroupContext, injectStepperItemContext, injectStepperRootContext, injectSwitchRootContext, injectTabsRootContext, injectTagsInputItemContext, injectTagsInputRootContext, injectTimeFieldRootContext, injectToastProviderContext, injectToggleGroupRootContext, injectToolbarRootContext, injectTooltipProviderContext, injectTooltipRootContext, injectTreeRootContext, useBodyScrollLock, useDateFormatter, useDirection, useEmitAsProps, useFilter, useForwardExpose, useForwardProps, useForwardPropsEmits, useId, useLocale, useStateMachine, withDefault }; +\ No newline at end of file ++export { AccordionContent_default as AccordionContent, AccordionHeader_default as AccordionHeader, AccordionItem_default as AccordionItem, AccordionRoot_default as AccordionRoot, AccordionTrigger_default as AccordionTrigger, AlertDialogAction_default as AlertDialogAction, AlertDialogCancel_default as AlertDialogCancel, AlertDialogContent_default as AlertDialogContent, AlertDialogDescription_default as AlertDialogDescription, AlertDialogOverlay_default as AlertDialogOverlay, AlertDialogPortal_default as AlertDialogPortal, AlertDialogRoot_default as AlertDialogRoot, AlertDialogTitle_default as AlertDialogTitle, AlertDialogTrigger_default as AlertDialogTrigger, AspectRatio_default as AspectRatio, AvatarFallback_default as AvatarFallback, AvatarImage_default as AvatarImage, AvatarRoot_default as AvatarRoot, CalendarCell_default as CalendarCell, CalendarCellTrigger_default as CalendarCellTrigger, CalendarGrid_default as CalendarGrid, CalendarGridBody_default as CalendarGridBody, CalendarGridHead_default as CalendarGridHead, CalendarGridRow_default as CalendarGridRow, CalendarHeadCell_default as CalendarHeadCell, CalendarHeader_default as CalendarHeader, CalendarHeading_default as CalendarHeading, CalendarNext_default as CalendarNext, CalendarPrev_default as CalendarPrev, CalendarRoot_default as CalendarRoot, CheckboxGroupRoot_default as CheckboxGroupRoot, CheckboxIndicator_default as CheckboxIndicator, CheckboxRoot_default as CheckboxRoot, CollapsibleContent_default as CollapsibleContent, CollapsibleRoot_default as CollapsibleRoot, CollapsibleTrigger_default as CollapsibleTrigger, ComboboxAnchor_default as ComboboxAnchor, ComboboxArrow_default as ComboboxArrow, ComboboxCancel_default as ComboboxCancel, ComboboxContent_default as ComboboxContent, ComboboxEmpty_default as ComboboxEmpty, ComboboxGroup_default as ComboboxGroup, ComboboxInput_default as ComboboxInput, ComboboxItem_default as ComboboxItem, ComboboxItemIndicator_default as ComboboxItemIndicator, ComboboxLabel_default as ComboboxLabel, ComboboxPortal_default as ComboboxPortal, ComboboxRoot_default as ComboboxRoot, ComboboxSeparator_default as ComboboxSeparator, ComboboxTrigger_default as ComboboxTrigger, ComboboxViewport_default as ComboboxViewport, ComboboxVirtualizer_default as ComboboxVirtualizer, ConfigProvider_default as ConfigProvider, ContextMenuArrow_default as ContextMenuArrow, ContextMenuCheckboxItem_default as ContextMenuCheckboxItem, ContextMenuContent_default as ContextMenuContent, ContextMenuGroup_default as ContextMenuGroup, ContextMenuItem_default as ContextMenuItem, ContextMenuItemIndicator_default as ContextMenuItemIndicator, ContextMenuLabel_default as ContextMenuLabel, ContextMenuPortal_default as ContextMenuPortal, ContextMenuRadioGroup_default as ContextMenuRadioGroup, ContextMenuRadioItem_default as ContextMenuRadioItem, ContextMenuRoot_default as ContextMenuRoot, ContextMenuSeparator_default as ContextMenuSeparator, ContextMenuSub_default as ContextMenuSub, ContextMenuSubContent_default as ContextMenuSubContent, ContextMenuSubTrigger_default as ContextMenuSubTrigger, ContextMenuTrigger_default as ContextMenuTrigger, DateFieldInput_default as DateFieldInput, DateFieldRoot_default as DateFieldRoot, DatePickerAnchor_default as DatePickerAnchor, DatePickerArrow_default as DatePickerArrow, DatePickerCalendar_default as DatePickerCalendar, DatePickerCell_default as DatePickerCell, DatePickerCellTrigger_default as DatePickerCellTrigger, DatePickerClose_default as DatePickerClose, DatePickerContent_default as DatePickerContent, DatePickerField_default as DatePickerField, DatePickerGrid_default as DatePickerGrid, DatePickerGridBody_default as DatePickerGridBody, DatePickerGridHead_default as DatePickerGridHead, DatePickerGridRow_default as DatePickerGridRow, DatePickerHeadCell_default as DatePickerHeadCell, DatePickerHeader_default as DatePickerHeader, DatePickerHeading_default as DatePickerHeading, DatePickerInput_default as DatePickerInput, DatePickerNext_default as DatePickerNext, DatePickerPrev_default as DatePickerPrev, DatePickerRoot_default as DatePickerRoot, DatePickerTrigger_default as DatePickerTrigger, DateRangeFieldInput_default as DateRangeFieldInput, DateRangeFieldRoot_default as DateRangeFieldRoot, DateRangePickerAnchor_default as DateRangePickerAnchor, DateRangePickerArrow_default as DateRangePickerArrow, DateRangePickerCalendar_default as DateRangePickerCalendar, DateRangePickerCell_default as DateRangePickerCell, DateRangePickerCellTrigger_default as DateRangePickerCellTrigger, DateRangePickerClose_default as DateRangePickerClose, DateRangePickerContent_default as DateRangePickerContent, DateRangePickerField_default as DateRangePickerField, DateRangePickerGrid_default as DateRangePickerGrid, DateRangePickerGridBody_default as DateRangePickerGridBody, DateRangePickerGridHead_default as DateRangePickerGridHead, DateRangePickerGridRow_default as DateRangePickerGridRow, DateRangePickerHeadCell_default as DateRangePickerHeadCell, DateRangePickerHeader_default as DateRangePickerHeader, DateRangePickerHeading_default as DateRangePickerHeading, DateRangePickerInput_default as DateRangePickerInput, DateRangePickerNext_default as DateRangePickerNext, DateRangePickerPrev_default as DateRangePickerPrev, DateRangePickerRoot_default as DateRangePickerRoot, DateRangePickerTrigger_default as DateRangePickerTrigger, DialogClose_default as DialogClose, DialogContent_default as DialogContent, DialogDescription_default as DialogDescription, DialogOverlay_default as DialogOverlay, DialogPortal_default as DialogPortal, DialogRoot_default as DialogRoot, DialogTitle_default as DialogTitle, DialogTrigger_default as DialogTrigger, DropdownMenuArrow_default as DropdownMenuArrow, DropdownMenuCheckboxItem_default as DropdownMenuCheckboxItem, DropdownMenuContent_default as DropdownMenuContent, DropdownMenuGroup_default as DropdownMenuGroup, DropdownMenuItem_default as DropdownMenuItem, DropdownMenuItemIndicator_default as DropdownMenuItemIndicator, DropdownMenuLabel_default as DropdownMenuLabel, DropdownMenuPortal_default as DropdownMenuPortal, DropdownMenuRadioGroup_default as DropdownMenuRadioGroup, DropdownMenuRadioItem_default as DropdownMenuRadioItem, DropdownMenuRoot_default as DropdownMenuRoot, DropdownMenuSeparator_default as DropdownMenuSeparator, DropdownMenuSub_default as DropdownMenuSub, DropdownMenuSubContent_default as DropdownMenuSubContent, DropdownMenuSubTrigger_default as DropdownMenuSubTrigger, DropdownMenuTrigger_default as DropdownMenuTrigger, EditableArea_default as EditableArea, EditableCancelTrigger_default as EditableCancelTrigger, EditableEditTrigger_default as EditableEditTrigger, EditableInput_default as EditableInput, EditablePreview_default as EditablePreview, EditableRoot_default as EditableRoot, EditableSubmitTrigger_default as EditableSubmitTrigger, FocusScope_default as FocusScope, HoverCardArrow_default as HoverCardArrow, HoverCardContent_default as HoverCardContent, HoverCardPortal_default as HoverCardPortal, HoverCardRoot_default as HoverCardRoot, HoverCardTrigger_default as HoverCardTrigger, Label_default as Label, ListboxContent_default as ListboxContent, ListboxFilter_default as ListboxFilter, ListboxGroup_default as ListboxGroup, ListboxGroupLabel_default as ListboxGroupLabel, ListboxItem_default as ListboxItem, ListboxItemIndicator_default as ListboxItemIndicator, ListboxRoot_default as ListboxRoot, ListboxVirtualizer_default as ListboxVirtualizer, MenubarArrow_default as MenubarArrow, MenubarCheckboxItem_default as MenubarCheckboxItem, MenubarContent_default as MenubarContent, MenubarGroup_default as MenubarGroup, MenubarItem_default as MenubarItem, MenubarItemIndicator_default as MenubarItemIndicator, MenubarLabel_default as MenubarLabel, MenubarMenu_default as MenubarMenu, MenubarPortal_default as MenubarPortal, MenubarRadioGroup_default as MenubarRadioGroup, MenubarRadioItem_default as MenubarRadioItem, MenubarRoot_default as MenubarRoot, MenubarSeparator_default as MenubarSeparator, MenubarSub_default as MenubarSub, MenubarSubContent_default as MenubarSubContent, MenubarSubTrigger_default as MenubarSubTrigger, MenubarTrigger_default as MenubarTrigger, NavigationMenuContent_default as NavigationMenuContent, NavigationMenuIndicator_default as NavigationMenuIndicator, NavigationMenuItem_default as NavigationMenuItem, NavigationMenuLink_default as NavigationMenuLink, NavigationMenuList_default as NavigationMenuList, NavigationMenuRoot_default as NavigationMenuRoot, NavigationMenuSub_default as NavigationMenuSub, NavigationMenuTrigger_default as NavigationMenuTrigger, NavigationMenuViewport_default as NavigationMenuViewport, NumberFieldDecrement_default as NumberFieldDecrement, NumberFieldIncrement_default as NumberFieldIncrement, NumberFieldInput_default as NumberFieldInput, NumberFieldRoot_default as NumberFieldRoot, PaginationEllipsis_default as PaginationEllipsis, PaginationFirst_default as PaginationFirst, PaginationLast_default as PaginationLast, PaginationList_default as PaginationList, PaginationListItem_default as PaginationListItem, PaginationNext_default as PaginationNext, PaginationPrev_default as PaginationPrev, PaginationRoot_default as PaginationRoot, PinInputInput_default as PinInputInput, PinInputRoot_default as PinInputRoot, PopoverAnchor_default as PopoverAnchor, PopoverArrow_default as PopoverArrow, PopoverClose_default as PopoverClose, PopoverContent_default as PopoverContent, PopoverPortal_default as PopoverPortal, PopoverRoot_default as PopoverRoot, PopoverTrigger_default as PopoverTrigger, Presence_default as Presence, Primitive, ProgressIndicator_default as ProgressIndicator, ProgressRoot_default as ProgressRoot, RadioGroupIndicator_default as RadioGroupIndicator, RadioGroupItem_default as RadioGroupItem, RadioGroupRoot_default as RadioGroupRoot, RatingRoot_default as RatingRoot, RatingItem_default as RatingItem, RatingItemIndicator_default as RatingItemIndicator, RangeCalendarCell_default as RangeCalendarCell, RangeCalendarCellTrigger_default as RangeCalendarCellTrigger, RangeCalendarGrid_default as RangeCalendarGrid, RangeCalendarGridBody_default as RangeCalendarGridBody, RangeCalendarGridHead_default as RangeCalendarGridHead, RangeCalendarGridRow_default as RangeCalendarGridRow, RangeCalendarHeadCell_default as RangeCalendarHeadCell, RangeCalendarHeader_default as RangeCalendarHeader, RangeCalendarHeading_default as RangeCalendarHeading, RangeCalendarNext_default as RangeCalendarNext, RangeCalendarPrev_default as RangeCalendarPrev, RangeCalendarRoot_default as RangeCalendarRoot, RovingFocusGroup_default as RovingFocusGroup, RovingFocusItem_default as RovingFocusItem, ScrollAreaCorner_default as ScrollAreaCorner, ScrollAreaRoot_default as ScrollAreaRoot, ScrollAreaScrollbar_default as ScrollAreaScrollbar, ScrollAreaScrollbarGlimpse_default as ScrollAreaScrollbarGlimpse, ScrollAreaThumb_default as ScrollAreaThumb, ScrollAreaViewport_default as ScrollAreaViewport, SelectArrow_default as SelectArrow, SelectContent_default as SelectContent, SelectGroup_default as SelectGroup, SelectIcon_default as SelectIcon, SelectItem_default as SelectItem, SelectItemIndicator_default as SelectItemIndicator, SelectItemText_default as SelectItemText, SelectLabel_default as SelectLabel, SelectPortal_default as SelectPortal, SelectRoot_default as SelectRoot, SelectScrollDownButton_default as SelectScrollDownButton, SelectScrollUpButton_default as SelectScrollUpButton, SelectSeparator_default as SelectSeparator, SelectTrigger_default as SelectTrigger, SelectValue_default as SelectValue, SelectViewport_default as SelectViewport, Separator_default as Separator, SliderRange_default as SliderRange, SliderRoot_default as SliderRoot, SliderThumb_default as SliderThumb, SliderTrack_default as SliderTrack, Slot, SplitterGroup_default as SplitterGroup, SplitterPanel_default as SplitterPanel, SplitterResizeHandle_default as SplitterResizeHandle, StepperDescription_default as StepperDescription, StepperIndicator_default as StepperIndicator, StepperItem_default as StepperItem, StepperRoot_default as StepperRoot, StepperSeparator_default as StepperSeparator, StepperTitle_default as StepperTitle, StepperTrigger_default as StepperTrigger, SwitchRoot_default as SwitchRoot, SwitchThumb_default as SwitchThumb, TabsContent_default as TabsContent, TabsIndicator_default as TabsIndicator, TabsList_default as TabsList, TabsRoot_default as TabsRoot, TabsTrigger_default as TabsTrigger, TagsInputClear_default as TagsInputClear, TagsInputInput_default as TagsInputInput, TagsInputItem_default as TagsInputItem, TagsInputItemDelete_default as TagsInputItemDelete, TagsInputItemText_default as TagsInputItemText, TagsInputRoot_default as TagsInputRoot, TimeFieldInput_default as TimeFieldInput, TimeFieldRoot_default as TimeFieldRoot, ToastAction_default as ToastAction, ToastClose_default as ToastClose, ToastDescription_default as ToastDescription, ToastPortal_default as ToastPortal, ToastProvider_default as ToastProvider, ToastRoot_default as ToastRoot, ToastTitle_default as ToastTitle, ToastViewport_default as ToastViewport, Toggle_default as Toggle, ToggleGroupItem_default as ToggleGroupItem, ToggleGroupRoot_default as ToggleGroupRoot, ToolbarButton_default as ToolbarButton, ToolbarLink_default as ToolbarLink, ToolbarRoot_default as ToolbarRoot, ToolbarSeparator_default as ToolbarSeparator, ToolbarToggleGroup_default as ToolbarToggleGroup, ToolbarToggleItem_default as ToolbarToggleItem, TooltipArrow_default as TooltipArrow, TooltipContent_default as TooltipContent, TooltipPortal_default as TooltipPortal, TooltipProvider_default as TooltipProvider, TooltipRoot_default as TooltipRoot, TooltipTrigger_default as TooltipTrigger, TreeItem_default as TreeItem, TreeRoot_default as TreeRoot, TreeVirtualizer_default as TreeVirtualizer, Viewport_default as Viewport, VisuallyHidden_default as VisuallyHidden, createContext, injectAccordionItemContext, injectAccordionRootContext, injectAlertDialogContentContext, injectAvatarRootContext, injectCalendarRootContext, injectCheckboxGroupRootContext, injectCheckboxRootContext, injectCollapsibleRootContext, injectComboboxGroupContext, injectListboxItemContext as injectComboboxItemContext, injectComboboxRootContext, injectConfigProviderContext, injectContextMenuRootContext, injectDateFieldRootContext, injectDatePickerRootContext, injectDateRangeFieldRootContext, injectDateRangePickerRootContext, injectDialogRootContext, injectDropdownMenuRootContext, injectEditableRootContext, injectHoverCardRootContext, injectListboxGroupContext, injectListboxItemContext, injectListboxRootContext, injectMenubarMenuContext, injectMenubarRootContext, injectNavigationMenuContext, injectNavigationMenuItemContext, injectNumberFieldRootContext, injectPaginationRootContext, injectPinInputRootContext, injectPopoverRootContext, injectProgressRootContext, injectRadioGroupItemContext, injectRadioGroupRootContext, injectRatingRootContext, injectRatingItemContext, injectRangeCalendarRootContext, injectScrollAreaRootContext, injectScrollAreaScrollbarContext, injectSelectGroupContext, injectSelectItemContext, injectSelectRootContext, injectSliderRootContext, injectPanelGroupContext as injectSplitterGroupContext, injectStepperItemContext, injectStepperRootContext, injectSwitchRootContext, injectTabsRootContext, injectTagsInputItemContext, injectTagsInputRootContext, injectTimeFieldRootContext, injectToastProviderContext, injectToggleGroupRootContext, injectToolbarRootContext, injectTooltipProviderContext, injectTooltipRootContext, injectTreeRootContext, useBodyScrollLock, useDateFormatter, useDirection, useEmitAsProps, useFilter, useForwardExpose, useForwardProps, useForwardPropsEmits, useId, useLocale, useStateMachine, withDefault }; diff --git a/playgrounds/nuxt/app/pages/components/input-rating.vue b/playgrounds/nuxt/app/pages/components/input-rating.vue index 59c05e0688..e7f39e93d3 100644 --- a/playgrounds/nuxt/app/pages/components/input-rating.vue +++ b/playgrounds/nuxt/app/pages/components/input-rating.vue @@ -18,6 +18,7 @@ const rating5 = ref(2.5) const readonlyRating = ref(4.5) const formRating = ref(0) const ratingNoRing = ref(0) +const ratingClearable = ref(3) const formSchema = z.object({ rating: z.number().min(1, 'Please select a rating') @@ -96,6 +97,22 @@ watch(formRating, (value) => { +
+

+ Clearable +

+
+
+

+ Rating: {{ ratingClearable }} (click same star to clear) +

+ +
+
+
+ + +

Readonly diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e439e21c47..0d9b945718 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,11 @@ overrides: unplugin: ^2.3.11 c12: ^3.3.2 +patchedDependencies: + reka-ui: + hash: 0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a + path: patches/reka-ui.patch + importers: .: @@ -186,7 +191,7 @@ importers: version: 2.0.3 reka-ui: specifier: 2.8.0 - version: 2.8.0(vue@3.5.27(typescript@5.8.3)) + version: 2.8.0(patch_hash=0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a)(vue@3.5.27(typescript@5.8.3)) scule: specifier: ^1.3.0 version: 1.3.0 @@ -225,7 +230,7 @@ importers: version: 1.2.0(typescript@5.8.3) vaul-vue: specifier: 0.4.1 - version: 0.4.1(reka-ui@2.8.0(vue@3.5.27(typescript@5.8.3)))(vue@3.5.27(typescript@5.8.3)) + version: 0.4.1(reka-ui@2.8.0(patch_hash=0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a)(vue@3.5.27(typescript@5.8.3)))(vue@3.5.27(typescript@5.8.3)) vue-component-type-helpers: specifier: ^3.2.4 version: 3.2.4 @@ -5095,8 +5100,8 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -5244,9 +5249,10 @@ packages: h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} - h3@2.0.1-rc.7: - resolution: {integrity: sha512-qbrRu1OLXmUYnysWOCVrYhtC/m8ZuXu/zCbo3U/KyphJxbPFiC76jHYwVrmEcss9uNAHO5BoUguQ46yEpgI2PA==} + h3@2.0.1-rc.14: + resolution: {integrity: sha512-163qbGmTr/9rqQRNuqMqtgXnOUAkE4KTdauiC9y0E5iG1I65kte9NyfWvZw5RTDMt6eY+DtyoNzrQ9wA2BfvGQ==} engines: {node: '>=20.11.1'} + hasBin: true peerDependencies: crossws: ^0.4.1 peerDependenciesMeta: @@ -5734,8 +5740,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lib0@0.2.114: - resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==} + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} engines: {node: '>=16'} hasBin: true @@ -7410,6 +7416,11 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + srvx@0.11.4: + resolution: {integrity: sha512-m/2p87bqWZ94xpRN06qNBwh0xq/D0dXajnvPDSHFqrTogxuTWYNP1UHz6Cf+oY7D+NPLY35TJAp4ESIKn0WArQ==} + engines: {node: '>=20.16.0'} + hasBin: true + stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} @@ -9866,7 +9877,7 @@ snapshots: fake-indexeddb: 6.2.5 get-port-please: 3.2.0 h3: 1.15.5 - h3-next: h3@2.0.1-rc.7 + h3-next: h3@2.0.1-rc.14 local-pkg: 1.1.2 magic-string: 0.30.21 node-fetch-native: 1.6.7 @@ -11069,7 +11080,7 @@ snapshots: '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - lib0: 0.2.114 + lib0: 0.2.117 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 prosemirror-view: 1.41.4 @@ -11807,7 +11818,7 @@ snapshots: axios@1.12.2: dependencies: follow-redirects: 1.15.11 - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -13166,7 +13177,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.4: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -13328,10 +13339,10 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - h3@2.0.1-rc.7: + h3@2.0.1-rc.14: dependencies: rou3: 0.7.12 - srvx: 0.10.0 + srvx: 0.11.4 handlebars@4.7.8: dependencies: @@ -13894,7 +13905,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lib0@0.2.114: + lib0@0.2.117: dependencies: isomorphic.js: 0.2.5 @@ -15759,7 +15770,7 @@ snapshots: '@types/hast': 3.0.4 unist-util-visit: 5.1.0 - reka-ui@2.8.0(vue@3.5.27(typescript@5.8.3)): + reka-ui@2.8.0(patch_hash=0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a)(vue@3.5.27(typescript@5.8.3)): dependencies: '@floating-ui/dom': 1.7.5 '@floating-ui/vue': 1.1.9(vue@3.5.27(typescript@5.8.3)) @@ -16285,6 +16296,8 @@ snapshots: srvx@0.10.0: {} + srvx@0.11.4: {} + stable-hash-x@0.2.0: {} stackback@0.0.2: {} @@ -16890,10 +16903,10 @@ snapshots: vary@1.1.2: {} - vaul-vue@0.4.1(reka-ui@2.8.0(vue@3.5.27(typescript@5.8.3)))(vue@3.5.27(typescript@5.8.3)): + vaul-vue@0.4.1(reka-ui@2.8.0(patch_hash=0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a)(vue@3.5.27(typescript@5.8.3)))(vue@3.5.27(typescript@5.8.3)): dependencies: '@vueuse/core': 10.11.1(vue@3.5.27(typescript@5.8.3)) - reka-ui: 2.8.0(vue@3.5.27(typescript@5.8.3)) + reka-ui: 2.8.0(patch_hash=0991eb757837d7610e8b84617adfa9eb61124917c2f9a1c8f80f184df1dcdb2a)(vue@3.5.27(typescript@5.8.3)) vue: 3.5.27(typescript@5.8.3) transitivePeerDependencies: - '@vue/composition-api' @@ -17254,7 +17267,7 @@ snapshots: y-protocols@1.0.6(yjs@13.6.27): dependencies: - lib0: 0.2.114 + lib0: 0.2.117 yjs: 13.6.27 y18n@5.0.8: {} @@ -17284,7 +17297,7 @@ snapshots: yjs@13.6.27: dependencies: - lib0: 0.2.114 + lib0: 0.2.117 yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c324db0d37..33121d01f6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,8 @@ packages: - playgrounds/nuxt - playgrounds/vue +ignoreWorkspaceRootCheck: true + ignoredBuiltDependencies: - '@parcel/watcher' - '@tailwindcss/oxide' @@ -18,4 +20,5 @@ onlyBuiltDependencies: - puppeteer - sharp -ignoreWorkspaceRootCheck: true +patchedDependencies: + reka-ui: patches/reka-ui.patch diff --git a/src/runtime/components/InputRating.vue b/src/runtime/components/InputRating.vue index 643971c54c..c9f01c618c 100644 --- a/src/runtime/components/InputRating.vue +++ b/src/runtime/components/InputRating.vue @@ -42,6 +42,16 @@ export interface InputRatingProps { * @defaultValue false */ disabled?: boolean + /** + * Allow clearing the rating by clicking on the current value. + * @defaultValue false + */ + clearable?: boolean + /** + * Show hover preview. + * @defaultValue true + */ + hoverable?: boolean /** * The icon to use for stars. * @defaultValue appConfig.ui.icons.star @@ -88,8 +98,8 @@ export interface InputRatingSlots { + diff --git a/src/theme/input-rating.ts b/src/theme/input-rating.ts index 244056e089..a85c192aca 100644 --- a/src/theme/input-rating.ts +++ b/src/theme/input-rating.ts @@ -4,9 +4,9 @@ export default (options: Required) => ({ slots: { root: '', star: 'relative inline-block cursor-pointer transition-colors select-none focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-offset-white dark:focus-within:ring-offset-gray-900 rounded-sm', - starFilled: 'absolute inset-0 pointer-events-none', - starHalf: 'absolute inset-0 pointer-events-none overflow-hidden [clip-path:polygon(0_0,50%_0,50%_100%,0_100%)] [-webkit-clip-path:polygon(0_0,50%_0,50%_100%,0_100%)]', - icon: 'w-full h-full' + indicator: 'absolute inset-0 overflow-hidden w-[var(--reka-rating-item-step-width)] opacity-[var(--reka-rating-item-step-opacity)] z-[var(--reka-rating-item-step-z-index)]', + icon: 'block', + emptyIcon: 'w-full h-full text-muted pointer-events-none' }, variants: { orientation: { @@ -19,30 +19,33 @@ export default (options: Required) => ({ }, size: { xs: { - star: 'size-3' + star: 'size-3', + icon: 'size-3' }, sm: { - star: 'size-4' + star: 'size-4', + icon: 'size-4' }, md: { - star: 'size-5' + star: 'size-5', + icon: 'size-5' }, lg: { - star: 'size-6' + star: 'size-6', + icon: 'size-6' }, xl: { - star: 'size-7' + star: 'size-7', + icon: 'size-7' } }, color: { ...Object.fromEntries((options.theme.colors || []).map((color: string) => [color, { - starFilled: `text-${color}-500 dark:text-${color}-400`, - starHalf: `text-${color}-500 dark:text-${color}-400`, + indicator: `data-[state=active]:text-${color}-500 dark:data-[state=active]:text-${color}-400`, star: `focus-within:ring-${color}-500 dark:focus-within:ring-${color}-400` }])), neutral: { - starFilled: 'text-gray-500 dark:text-gray-400', - starHalf: 'text-gray-500 dark:text-gray-400', + indicator: 'data-[state=active]:text-gray-500 dark:data-[state=active]:text-gray-400', star: 'focus-within:ring-gray-500 dark:focus-within:ring-gray-400' } }, diff --git a/test/components/InputRating.spec.ts b/test/components/InputRating.spec.ts index 307501cb47..983dcf25dd 100644 --- a/test/components/InputRating.spec.ts +++ b/test/components/InputRating.spec.ts @@ -21,6 +21,8 @@ describe('InputRating', () => { ['with allowHalf', { props: { allowHalf: true, modelValue: 3.5 } }], ['with readonly', { props: { readonly: true, modelValue: 4 } }], ['with disabled', { props: { disabled: true, modelValue: 3 } }], + ['with clearable', { props: { clearable: true, modelValue: 3 } }], + ['with hoverable false', { props: { hoverable: false, modelValue: 3 } }], ['with icon', { props: { icon: 'i-lucide-heart', modelValue: 4 } }], ['with emptyIcon', { props: { emptyIcon: 'i-lucide-star-off', modelValue: 3 } }], ['with id', { props: { id: 'rating-id', modelValue: 3 } }], diff --git a/test/components/__snapshots__/InputRating-vue.spec.ts.snap b/test/components/__snapshots__/InputRating-vue.spec.ts.snap index 13bf6d4c1f..8cdd686f76 100644 --- a/test/components/__snapshots__/InputRating-vue.spec.ts.snap +++ b/test/components/__snapshots__/InputRating-vue.spec.ts.snap @@ -1,1117 +1,741 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`InputRating > renders with allowHalf correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
-
- - -
+
" `; -exports[`InputRating > renders with as correctly 1`] = `"
"`; +exports[`InputRating > renders with as correctly 1`] = `""`; exports[`InputRating > renders with class correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+ + +
" +`; + +exports[`InputRating > renders with clearable correctly 1`] = ` +"
" `; exports[`InputRating > renders with color error correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color info correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color neutral correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color primary correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color secondary correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color success correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color warning correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with defaultValue correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with disabled correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with emptyIcon correctly 1`] = ` -"
-
- - - -
+ + +
" +`; + +exports[`InputRating > renders with hoverable false correctly 1`] = ` +"
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with icon correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
+
" `; exports[`InputRating > renders with id correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with max correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with modelValue correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with name correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with readonly correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
+
" `; exports[`InputRating > renders with required correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size lg correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size md correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size sm correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size xl correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size xs correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with star slot correctly 1`] = ` -"
-
-
-
-
-
+"
" `; exports[`InputRating > renders with ui correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; diff --git a/test/components/__snapshots__/InputRating.spec.ts.snap b/test/components/__snapshots__/InputRating.spec.ts.snap index f873b99dc0..8de243de66 100644 --- a/test/components/__snapshots__/InputRating.spec.ts.snap +++ b/test/components/__snapshots__/InputRating.spec.ts.snap @@ -1,1150 +1,762 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`InputRating > renders with allowHalf correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
-
- - -
+
" `; exports[`InputRating > renders with as correctly 1`] = ` -"
-
- +"
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with class correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
+ + +
" +`; + +exports[`InputRating > renders with clearable correctly 1`] = ` +"
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color error correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color info correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color neutral correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color primary correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color secondary correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color success correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with color warning correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with defaultValue correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with disabled correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with emptyIcon correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+ + +
" +`; + +exports[`InputRating > renders with hoverable false correctly 1`] = ` +"
" `; exports[`InputRating > renders with icon correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
+
" `; exports[`InputRating > renders with id correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with max correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with modelValue correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with name correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with readonly correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
+
" `; exports[`InputRating > renders with required correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size lg correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size md correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size sm correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size xl correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with size xs correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `; exports[`InputRating > renders with star slot correctly 1`] = ` -"
-
-
-
-
-
+"
" `; exports[`InputRating > renders with ui correctly 1`] = ` -"
-
- - - -
-
-
- - - -
-
-
- - - -
-
-
- - -
-
- - -
+
" `;