reka-ui 2.0.2 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/AlertDialog/AlertDialogRoot.cjs +2 -2
  2. package/dist/AlertDialog/AlertDialogRoot.cjs.map +1 -1
  3. package/dist/AlertDialog/AlertDialogRoot.js +3 -3
  4. package/dist/AlertDialog/AlertDialogRoot.js.map +1 -1
  5. package/dist/Calendar/CalendarCellTrigger.cjs +7 -5
  6. package/dist/Calendar/CalendarCellTrigger.cjs.map +1 -1
  7. package/dist/Calendar/CalendarCellTrigger.js +7 -5
  8. package/dist/Calendar/CalendarCellTrigger.js.map +1 -1
  9. package/dist/Combobox/ComboboxItem.cjs +0 -3
  10. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  11. package/dist/Combobox/ComboboxItem.js +1 -3
  12. package/dist/Combobox/ComboboxItem.js.map +1 -1
  13. package/dist/Combobox/ComboboxRoot.cjs +9 -1
  14. package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
  15. package/dist/Combobox/ComboboxRoot.js +10 -2
  16. package/dist/Combobox/ComboboxRoot.js.map +1 -1
  17. package/dist/HoverCard/HoverCardRoot.cjs.map +1 -1
  18. package/dist/HoverCard/HoverCardRoot.js.map +1 -1
  19. package/dist/NavigationMenu/NavigationMenuSub.cjs +11 -1
  20. package/dist/NavigationMenu/NavigationMenuSub.cjs.map +1 -1
  21. package/dist/NavigationMenu/NavigationMenuSub.js +12 -2
  22. package/dist/NavigationMenu/NavigationMenuSub.js.map +1 -1
  23. package/dist/NavigationMenu/NavigationMenuViewport.cjs +2 -3
  24. package/dist/NavigationMenu/NavigationMenuViewport.cjs.map +1 -1
  25. package/dist/NavigationMenu/NavigationMenuViewport.js +2 -3
  26. package/dist/NavigationMenu/NavigationMenuViewport.js.map +1 -1
  27. package/dist/NumberField/NumberFieldInput.cjs +2 -0
  28. package/dist/NumberField/NumberFieldInput.cjs.map +1 -1
  29. package/dist/NumberField/NumberFieldInput.js +2 -0
  30. package/dist/NumberField/NumberFieldInput.js.map +1 -1
  31. package/dist/NumberField/NumberFieldRoot.cjs +5 -2
  32. package/dist/NumberField/NumberFieldRoot.cjs.map +1 -1
  33. package/dist/NumberField/NumberFieldRoot.js +5 -2
  34. package/dist/NumberField/NumberFieldRoot.js.map +1 -1
  35. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs +6 -4
  36. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs.map +1 -1
  37. package/dist/RangeCalendar/RangeCalendarCellTrigger.js +6 -4
  38. package/dist/RangeCalendar/RangeCalendarCellTrigger.js.map +1 -1
  39. package/dist/RangeCalendar/RangeCalendarRoot.cjs +3 -3
  40. package/dist/RangeCalendar/RangeCalendarRoot.cjs.map +1 -1
  41. package/dist/RangeCalendar/RangeCalendarRoot.js +3 -3
  42. package/dist/RangeCalendar/RangeCalendarRoot.js.map +1 -1
  43. package/dist/Select/SelectContentImpl.cjs +15 -5
  44. package/dist/Select/SelectContentImpl.cjs.map +1 -1
  45. package/dist/Select/SelectContentImpl.js +15 -5
  46. package/dist/Select/SelectContentImpl.js.map +1 -1
  47. package/dist/Slider/SliderHorizontal.cjs +19 -9
  48. package/dist/Slider/SliderHorizontal.cjs.map +1 -1
  49. package/dist/Slider/SliderHorizontal.js +20 -10
  50. package/dist/Slider/SliderHorizontal.js.map +1 -1
  51. package/dist/Slider/SliderRoot.cjs +5 -3
  52. package/dist/Slider/SliderRoot.cjs.map +1 -1
  53. package/dist/Slider/SliderRoot.js +5 -3
  54. package/dist/Slider/SliderRoot.js.map +1 -1
  55. package/dist/Slider/SliderThumb.cjs +2 -2
  56. package/dist/Slider/SliderThumb.cjs.map +1 -1
  57. package/dist/Slider/SliderThumb.js +2 -2
  58. package/dist/Slider/SliderThumb.js.map +1 -1
  59. package/dist/Slider/SliderThumbImpl.cjs +7 -1
  60. package/dist/Slider/SliderThumbImpl.cjs.map +1 -1
  61. package/dist/Slider/SliderThumbImpl.js +7 -1
  62. package/dist/Slider/SliderThumbImpl.js.map +1 -1
  63. package/dist/Slider/SliderVertical.cjs +19 -9
  64. package/dist/Slider/SliderVertical.cjs.map +1 -1
  65. package/dist/Slider/SliderVertical.js +20 -10
  66. package/dist/Slider/SliderVertical.js.map +1 -1
  67. package/dist/TagsInput/TagsInputItemDelete.cjs +2 -1
  68. package/dist/TagsInput/TagsInputItemDelete.cjs.map +1 -1
  69. package/dist/TagsInput/TagsInputItemDelete.js +2 -1
  70. package/dist/TagsInput/TagsInputItemDelete.js.map +1 -1
  71. package/dist/Toast/ToastClose.cjs +2 -2
  72. package/dist/Toast/ToastClose.cjs.map +1 -1
  73. package/dist/Toast/ToastClose.js +2 -2
  74. package/dist/Toast/ToastClose.js.map +1 -1
  75. package/dist/Toast/ToastRoot.cjs +3 -0
  76. package/dist/Toast/ToastRoot.cjs.map +1 -1
  77. package/dist/Toast/ToastRoot.js +3 -0
  78. package/dist/Toast/ToastRoot.js.map +1 -1
  79. package/dist/Toast/ToastRootImpl.cjs +6 -3
  80. package/dist/Toast/ToastRootImpl.cjs.map +1 -1
  81. package/dist/Toast/ToastRootImpl.js +6 -3
  82. package/dist/Toast/ToastRootImpl.js.map +1 -1
  83. package/dist/Toggle/Toggle.cjs +6 -1
  84. package/dist/Toggle/Toggle.cjs.map +1 -1
  85. package/dist/Toggle/Toggle.js +6 -1
  86. package/dist/Toggle/Toggle.js.map +1 -1
  87. package/dist/ToggleGroup/ToggleGroupItem.cjs +2 -2
  88. package/dist/ToggleGroup/ToggleGroupItem.cjs.map +1 -1
  89. package/dist/ToggleGroup/ToggleGroupItem.js +3 -3
  90. package/dist/ToggleGroup/ToggleGroupItem.js.map +1 -1
  91. package/dist/date.d.ts +2 -0
  92. package/dist/index.cjs +4 -4
  93. package/dist/index.d.ts +59 -16
  94. package/dist/index.js +2 -2
  95. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SelectContentImpl.js","sources":["../../src/Select/SelectContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n ComponentPublicInstance,\n Ref,\n} from 'vue'\nimport type { PopperContentProps } from '@/Popper'\nimport type { PointerDownOutsideEvent } from '@/DismissableLayer'\nimport {\n createContext,\n useFocusGuards,\n useForwardProps,\n useHideOthers,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\nimport type { AcceptableValue } from '@/shared/types'\nimport { valueComparator } from './utils'\nimport { useCollection } from '@/Collection'\n\nexport interface SelectContentContext {\n content?: Ref<HTMLElement | undefined>\n viewport?: Ref<HTMLElement | undefined>\n onViewportChange: (node: HTMLElement | undefined) => void\n itemRefCallback: (\n node: HTMLElement | undefined,\n value: AcceptableValue,\n disabled: boolean\n ) => void\n selectedItem?: Ref<HTMLElement | undefined>\n onItemLeave?: () => void\n itemTextRefCallback: (\n node: HTMLElement | undefined,\n value: AcceptableValue,\n disabled: boolean\n ) => void\n focusSelectedItem?: () => void\n selectedItemText?: Ref<HTMLElement | undefined>\n position?: 'item-aligned' | 'popper'\n isPositioned?: Ref<boolean>\n searchRef?: Ref<string>\n}\n\nexport const SelectContentDefaultContextValue: SelectContentContext = {\n onViewportChange: () => {},\n itemTextRefCallback: () => {},\n itemRefCallback: () => {},\n}\n\nexport type SelectContentImplEmits = {\n closeAutoFocus: [event: Event]\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n escapeKeyDown: [event: KeyboardEvent]\n /**\n * Event handler called when a `pointerdown` event happens outside of the `DismissableLayer`.\n * Can be prevented.\n */\n pointerDownOutside: [event: PointerDownOutsideEvent]\n}\n\nexport interface SelectContentImplProps extends PopperContentProps {\n /**\n * The positioning mode to use\n *\n * `item-aligned (default)` - behaves similarly to a native MacOS menu by positioning content relative to the active item. <br>\n * `popper` - positions content in the same way as our other primitives, for example `Popover` or `DropdownMenu`.\n */\n position?: 'item-aligned' | 'popper'\n /**\n * The document.body will be lock, and scrolling will be disabled.\n *\n * @defaultValue true\n */\n bodyLock?: boolean\n}\n\nexport const [injectSelectContentContext, provideSelectContentContext]\n = createContext<SelectContentContext>('SelectContent')\n</script>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n ref,\n watch,\n watchEffect,\n} from 'vue'\nimport { unrefElement } from '@vueuse/core'\nimport { injectSelectRootContext } from './SelectRoot.vue'\nimport SelectItemAlignedPosition from './SelectItemAlignedPosition.vue'\nimport SelectPopperPosition from './SelectPopperPosition.vue'\nimport { FocusScope } from '@/FocusScope'\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { focusFirst } from '@/Menu/utils'\n\nconst props = withDefaults(defineProps<SelectContentImplProps>(), {\n align: 'start',\n position: 'item-aligned',\n bodyLock: true,\n})\nconst emits = defineEmits<SelectContentImplEmits>()\n\nconst rootContext = injectSelectRootContext()\n\nuseFocusGuards()\nuseBodyScrollLock(props.bodyLock)\nconst { CollectionSlot, getItems } = useCollection()\n\nconst content = ref<HTMLElement>()\nuseHideOthers(content)\n\nconst { search, handleTypeaheadSearch } = useTypeahead()\n\nconst viewport = ref<HTMLElement>()\nconst selectedItem = ref<HTMLElement>()\nconst selectedItemText = ref<HTMLElement>()\nconst isPositioned = ref(false)\nconst firstValidItemFoundRef = ref(false)\n\nfunction focusSelectedItem() {\n if (selectedItem.value && content.value)\n focusFirst([selectedItem.value, content.value])\n}\n\nwatch(isPositioned, () => {\n focusSelectedItem()\n})\n\n// prevent selecting items on `pointerup` in some cases after opening from `pointerdown`\n// and close on `pointerup` outside.\nconst { onOpenChange, triggerPointerDownPosRef } = rootContext\nwatchEffect((cleanupFn) => {\n if (!content.value)\n return\n let pointerMoveDelta = { x: 0, y: 0 }\n\n const handlePointerMove = (event: PointerEvent) => {\n pointerMoveDelta = {\n x: Math.abs(\n Math.round(event.pageX) - (triggerPointerDownPosRef.value?.x ?? 0),\n ),\n y: Math.abs(\n Math.round(event.pageY) - (triggerPointerDownPosRef.value?.y ?? 0),\n ),\n }\n }\n const handlePointerUp = (event: PointerEvent) => {\n // Prevent options from being untappable on touch devices\n // https://github.com/unovue/reka-ui/issues/804\n if (event.pointerType === 'touch')\n return\n\n // If the pointer hasn't moved by a certain threshold then we prevent selecting item on `pointerup`.\n if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {\n event.preventDefault()\n }\n else {\n // otherwise, if the event was outside the content, close.\n if (!content.value?.contains(event.target as HTMLElement))\n onOpenChange(false)\n }\n document.removeEventListener('pointermove', handlePointerMove)\n triggerPointerDownPosRef.value = null\n }\n\n if (triggerPointerDownPosRef.value !== null) {\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp, {\n capture: true,\n once: true,\n })\n }\n\n cleanupFn(() => {\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp, {\n capture: true,\n })\n })\n})\n\nfunction handleKeyDown(event: KeyboardEvent) {\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n\n // select should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n\n if (!isModifierKey && event.key.length === 1)\n handleTypeaheadSearch(event.key, getItems())\n\n if (['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n const collectionItems = getItems().map(i => i.ref)\n let candidateNodes = [...collectionItems]\n\n if (['ArrowUp', 'End'].includes(event.key))\n candidateNodes = candidateNodes.slice().reverse()\n\n if (['ArrowUp', 'ArrowDown'].includes(event.key)) {\n const currentElement = event.target as HTMLElement\n const currentIndex = candidateNodes.indexOf(currentElement)\n candidateNodes = candidateNodes.slice(currentIndex + 1)\n }\n setTimeout(() => focusFirst(candidateNodes))\n event.preventDefault()\n }\n}\n\nconst pickedProps = computed(() => {\n if (props.position === 'popper')\n return props\n else return {}\n})\n\nconst forwardedProps = useForwardProps(pickedProps.value)\n\nprovideSelectContentContext({\n content,\n viewport,\n onViewportChange: (node) => {\n viewport.value = node\n },\n itemRefCallback: (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.value && !disabled\n const isSelectedItem = valueComparator(rootContext.modelValue.value, value, rootContext.by)\n\n if (isFirstValidItem) {\n if (rootContext.isEmptyModelValue.value) {\n firstValidItemFoundRef.value = true\n selectedItem.value = node\n }\n else if (isSelectedItem) {\n firstValidItemFoundRef.value = true\n selectedItem.value = node\n }\n }\n },\n selectedItem,\n selectedItemText,\n onItemLeave: () => {\n content.value?.focus()\n },\n itemTextRefCallback: (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.value && !disabled\n const isSelectedItem = valueComparator(rootContext.modelValue.value, value, rootContext.by)\n\n if (isSelectedItem || isFirstValidItem)\n selectedItemText.value = node\n },\n focusSelectedItem,\n position: props.position,\n isPositioned,\n searchRef: search,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <FocusScope\n as-child\n @mount-auto-focus.prevent\n @unmount-auto-focus=\"\n (event) => {\n emits('closeAutoFocus', event);\n if (event.defaultPrevented) return;\n rootContext.triggerElement.value?.focus({ preventScroll: true });\n event.preventDefault();\n }\n \"\n >\n <DismissableLayer\n as-child\n disable-outside-pointer-events\n @focus-outside.prevent\n @dismiss=\"rootContext.onOpenChange(false)\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n >\n <component\n :is=\"\n position === 'popper'\n ? SelectPopperPosition\n : SelectItemAlignedPosition\n \"\n v-bind=\"{ ...$attrs, ...forwardedProps }\"\n :id=\"rootContext.contentId\"\n :ref=\"\n (vnode: ComponentPublicInstance) => {\n content = unrefElement(vnode) as HTMLElement\n return undefined\n }\n \"\n role=\"listbox\"\n :data-state=\"rootContext.open.value ? 'open' : 'closed'\"\n :dir=\"rootContext.dir.value\"\n :style=\"{\n // flex layout so we can place the scroll buttons properly\n display: 'flex',\n flexDirection: 'column',\n // reset the outline by default as the content MAY get focused\n outline: 'none',\n }\"\n @contextmenu.prevent\n @placed=\"isPositioned = true\"\n @keydown=\"(handleKeyDown as any)\"\n >\n <slot />\n </component>\n </DismissableLayer>\n </FocusScope>\n </CollectionSlot>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectContentImpl.js","sources":["../../src/Select/SelectContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n ComponentPublicInstance,\n Ref,\n} from 'vue'\nimport type { PopperContentProps } from '@/Popper'\nimport type { PointerDownOutsideEvent } from '@/DismissableLayer'\nimport {\n createContext,\n useFocusGuards,\n useForwardProps,\n useHideOthers,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\nimport type { AcceptableValue } from '@/shared/types'\nimport { valueComparator } from './utils'\nimport { useCollection } from '@/Collection'\n\nexport interface SelectContentContext {\n content?: Ref<HTMLElement | undefined>\n viewport?: Ref<HTMLElement | undefined>\n onViewportChange: (node: HTMLElement | undefined) => void\n itemRefCallback: (\n node: HTMLElement | undefined,\n value: AcceptableValue,\n disabled: boolean\n ) => void\n selectedItem?: Ref<HTMLElement | undefined>\n onItemLeave?: () => void\n itemTextRefCallback: (\n node: HTMLElement | undefined,\n value: AcceptableValue,\n disabled: boolean\n ) => void\n focusSelectedItem?: () => void\n selectedItemText?: Ref<HTMLElement | undefined>\n position?: 'item-aligned' | 'popper'\n isPositioned?: Ref<boolean>\n searchRef?: Ref<string>\n}\n\nexport const SelectContentDefaultContextValue: SelectContentContext = {\n onViewportChange: () => {},\n itemTextRefCallback: () => {},\n itemRefCallback: () => {},\n}\n\nexport type SelectContentImplEmits = {\n closeAutoFocus: [event: Event]\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n escapeKeyDown: [event: KeyboardEvent]\n /**\n * Event handler called when a `pointerdown` event happens outside of the `DismissableLayer`.\n * Can be prevented.\n */\n pointerDownOutside: [event: PointerDownOutsideEvent]\n}\n\nexport interface SelectContentImplProps extends PopperContentProps {\n /**\n * The positioning mode to use\n *\n * `item-aligned (default)` - behaves similarly to a native MacOS menu by positioning content relative to the active item. <br>\n * `popper` - positions content in the same way as our other primitives, for example `Popover` or `DropdownMenu`.\n */\n position?: 'item-aligned' | 'popper'\n /**\n * The document.body will be lock, and scrolling will be disabled.\n *\n * @defaultValue true\n */\n bodyLock?: boolean\n}\n\nexport const [injectSelectContentContext, provideSelectContentContext]\n = createContext<SelectContentContext>('SelectContent')\n</script>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n ref,\n watch,\n watchEffect,\n} from 'vue'\nimport { unrefElement } from '@vueuse/core'\nimport { injectSelectRootContext } from './SelectRoot.vue'\nimport SelectItemAlignedPosition from './SelectItemAlignedPosition.vue'\nimport SelectPopperPosition from './SelectPopperPosition.vue'\nimport { FocusScope } from '@/FocusScope'\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { focusFirst } from '@/Menu/utils'\n\nconst props = withDefaults(defineProps<SelectContentImplProps>(), {\n align: 'start',\n position: 'item-aligned',\n bodyLock: true,\n})\nconst emits = defineEmits<SelectContentImplEmits>()\n\nconst rootContext = injectSelectRootContext()\n\nuseFocusGuards()\nuseBodyScrollLock(props.bodyLock)\nconst { CollectionSlot, getItems } = useCollection()\n\nconst content = ref<HTMLElement>()\nuseHideOthers(content)\n\nconst { search, handleTypeaheadSearch } = useTypeahead()\n\nconst viewport = ref<HTMLElement>()\nconst selectedItem = ref<HTMLElement>()\nconst selectedItemText = ref<HTMLElement>()\nconst isPositioned = ref(false)\nconst firstValidItemFoundRef = ref(false)\nconst firstSelectedItemInArrayFoundRef = ref(false)\n\nfunction focusSelectedItem() {\n if (selectedItem.value && content.value)\n focusFirst([selectedItem.value, content.value])\n}\n\nwatch(isPositioned, () => {\n focusSelectedItem()\n})\n\n// prevent selecting items on `pointerup` in some cases after opening from `pointerdown`\n// and close on `pointerup` outside.\nconst { onOpenChange, triggerPointerDownPosRef } = rootContext\nwatchEffect((cleanupFn) => {\n if (!content.value)\n return\n let pointerMoveDelta = { x: 0, y: 0 }\n\n const handlePointerMove = (event: PointerEvent) => {\n pointerMoveDelta = {\n x: Math.abs(\n Math.round(event.pageX) - (triggerPointerDownPosRef.value?.x ?? 0),\n ),\n y: Math.abs(\n Math.round(event.pageY) - (triggerPointerDownPosRef.value?.y ?? 0),\n ),\n }\n }\n const handlePointerUp = (event: PointerEvent) => {\n // Prevent options from being untappable on touch devices\n // https://github.com/unovue/reka-ui/issues/804\n if (event.pointerType === 'touch')\n return\n\n // If the pointer hasn't moved by a certain threshold then we prevent selecting item on `pointerup`.\n if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {\n event.preventDefault()\n }\n else {\n // otherwise, if the event was outside the content, close.\n if (!content.value?.contains(event.target as HTMLElement))\n onOpenChange(false)\n }\n document.removeEventListener('pointermove', handlePointerMove)\n triggerPointerDownPosRef.value = null\n }\n\n if (triggerPointerDownPosRef.value !== null) {\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp, {\n capture: true,\n once: true,\n })\n }\n\n cleanupFn(() => {\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp, {\n capture: true,\n })\n })\n})\n\nfunction handleKeyDown(event: KeyboardEvent) {\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n\n // select should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n\n if (!isModifierKey && event.key.length === 1)\n handleTypeaheadSearch(event.key, getItems())\n\n if (['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n const collectionItems = getItems().map(i => i.ref)\n let candidateNodes = [...collectionItems]\n\n if (['ArrowUp', 'End'].includes(event.key))\n candidateNodes = candidateNodes.slice().reverse()\n\n if (['ArrowUp', 'ArrowDown'].includes(event.key)) {\n const currentElement = event.target as HTMLElement\n const currentIndex = candidateNodes.indexOf(currentElement)\n candidateNodes = candidateNodes.slice(currentIndex + 1)\n }\n setTimeout(() => focusFirst(candidateNodes))\n event.preventDefault()\n }\n}\n\nconst pickedProps = computed(() => {\n if (props.position === 'popper')\n return props\n else return {}\n})\n\nconst forwardedProps = useForwardProps(pickedProps.value)\n\nprovideSelectContentContext({\n content,\n viewport,\n onViewportChange: (node) => {\n viewport.value = node\n },\n itemRefCallback: (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.value && !disabled\n const isSelectedItem = valueComparator(rootContext.modelValue.value, value, rootContext.by)\n\n if (rootContext.multiple.value) {\n if (firstSelectedItemInArrayFoundRef.value) {\n return\n }\n if (isSelectedItem || isFirstValidItem) {\n selectedItem.value = node\n\n // make sure to keep the first item highlighted when `multiple`\n if (isSelectedItem) {\n firstSelectedItemInArrayFoundRef.value = true\n }\n }\n }\n else {\n if (isSelectedItem || isFirstValidItem) {\n selectedItem.value = node\n }\n }\n\n if (isFirstValidItem) {\n firstValidItemFoundRef.value = true\n }\n },\n selectedItem,\n selectedItemText,\n onItemLeave: () => {\n content.value?.focus()\n },\n itemTextRefCallback: (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.value && !disabled\n const isSelectedItem = valueComparator(rootContext.modelValue.value, value, rootContext.by)\n\n if (isSelectedItem || isFirstValidItem)\n selectedItemText.value = node\n },\n focusSelectedItem,\n position: props.position,\n isPositioned,\n searchRef: search,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <FocusScope\n as-child\n @mount-auto-focus.prevent\n @unmount-auto-focus=\"\n (event) => {\n emits('closeAutoFocus', event);\n if (event.defaultPrevented) return;\n rootContext.triggerElement.value?.focus({ preventScroll: true });\n event.preventDefault();\n }\n \"\n >\n <DismissableLayer\n as-child\n disable-outside-pointer-events\n @focus-outside.prevent\n @dismiss=\"rootContext.onOpenChange(false)\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n >\n <component\n :is=\"\n position === 'popper'\n ? SelectPopperPosition\n : SelectItemAlignedPosition\n \"\n v-bind=\"{ ...$attrs, ...forwardedProps }\"\n :id=\"rootContext.contentId\"\n :ref=\"\n (vnode: ComponentPublicInstance) => {\n content = unrefElement(vnode) as HTMLElement\n return undefined\n }\n \"\n role=\"listbox\"\n :data-state=\"rootContext.open.value ? 'open' : 'closed'\"\n :dir=\"rootContext.dir.value\"\n :style=\"{\n // flex layout so we can place the scroll buttons properly\n display: 'flex',\n flexDirection: 'column',\n // reset the outline by default as the content MAY get focused\n outline: 'none',\n }\"\n @contextmenu.prevent\n @placed=\"isPositioned = true\"\n @keydown=\"(handleKeyDown as any)\"\n >\n <slot />\n </component>\n </DismissableLayer>\n </FocusScope>\n </CollectionSlot>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA0CO,MAAM,gCAAyD,GAAA;AAAA,EACpE,kBAAkB,MAAM;AAAA,GAAC;AAAA,EACzB,qBAAqB,MAAM;AAAA,GAAC;AAAA,EAC5B,iBAAiB,MAAM;AAAA;AACzB;AAgCO,MAAM,CAAC,0BAAA,EAA4B,2BAA2B,CAAA,GACjE,cAAoC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBvD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAKd,IAAA,MAAM,KAAQ,GAAA,MAAA;AAEd,IAAA,MAAM,cAAc,uBAAwB,EAAA;AAE5C,IAAe,cAAA,EAAA;AACf,IAAA,iBAAA,CAAkB,MAAM,QAAQ,CAAA;AAChC,IAAA,MAAM,EAAE,cAAA,EAAgB,QAAS,EAAA,GAAI,aAAc,EAAA;AAEnD,IAAA,MAAM,UAAU,GAAiB,EAAA;AACjC,IAAA,aAAA,CAAc,OAAO,CAAA;AAErB,IAAA,MAAM,EAAE,MAAA,EAAQ,qBAAsB,EAAA,GAAI,YAAa,EAAA;AAEvD,IAAA,MAAM,WAAW,GAAiB,EAAA;AAClC,IAAA,MAAM,eAAe,GAAiB,EAAA;AACtC,IAAA,MAAM,mBAAmB,GAAiB,EAAA;AAC1C,IAAM,MAAA,YAAA,GAAe,IAAI,KAAK,CAAA;AAC9B,IAAM,MAAA,sBAAA,GAAyB,IAAI,KAAK,CAAA;AACxC,IAAM,MAAA,gCAAA,GAAmC,IAAI,KAAK,CAAA;AAElD,IAAA,SAAS,iBAAoB,GAAA;AAC3B,MAAI,IAAA,YAAA,CAAa,SAAS,OAAQ,CAAA,KAAA;AAChC,QAAA,UAAA,CAAW,CAAC,YAAA,CAAa,KAAO,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGlD,IAAA,KAAA,CAAM,cAAc,MAAM;AACxB,MAAkB,iBAAA,EAAA;AAAA,KACnB,CAAA;AAID,IAAM,MAAA,EAAE,YAAc,EAAA,wBAAA,EAA6B,GAAA,WAAA;AACnD,IAAA,WAAA,CAAY,CAAC,SAAc,KAAA;AACzB,MAAA,IAAI,CAAC,OAAQ,CAAA,KAAA;AACX,QAAA;AACF,MAAA,IAAI,gBAAmB,GAAA,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAE,EAAA;AAEpC,MAAM,MAAA,iBAAA,GAAoB,CAAC,KAAwB,KAAA;AACjD,QAAmB,gBAAA,GAAA;AAAA,UACjB,GAAG,IAAK,CAAA,GAAA;AAAA,YACN,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAK,IAAA,wBAAA,CAAyB,OAAO,CAAK,IAAA,CAAA;AAAA,WAClE;AAAA,UACA,GAAG,IAAK,CAAA,GAAA;AAAA,YACN,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAK,IAAA,wBAAA,CAAyB,OAAO,CAAK,IAAA,CAAA;AAAA;AAClE,SACF;AAAA,OACF;AACA,MAAM,MAAA,eAAA,GAAkB,CAAC,KAAwB,KAAA;AAG/C,QAAA,IAAI,MAAM,WAAgB,KAAA,OAAA;AACxB,UAAA;AAGF,QAAA,IAAI,gBAAiB,CAAA,CAAA,IAAK,EAAM,IAAA,gBAAA,CAAiB,KAAK,EAAI,EAAA;AACxD,UAAA,KAAA,CAAM,cAAe,EAAA;AAAA,SAElB,MAAA;AAEH,UAAA,IAAI,CAAC,OAAA,CAAQ,KAAO,EAAA,QAAA,CAAS,MAAM,MAAqB,CAAA;AACtD,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA;AAEtB,QAAS,QAAA,CAAA,mBAAA,CAAoB,eAAe,iBAAiB,CAAA;AAC7D,QAAA,wBAAA,CAAyB,KAAQ,GAAA,IAAA;AAAA,OACnC;AAEA,MAAI,IAAA,wBAAA,CAAyB,UAAU,IAAM,EAAA;AAC3C,QAAS,QAAA,CAAA,gBAAA,CAAiB,eAAe,iBAAiB,CAAA;AAC1D,QAAS,QAAA,CAAA,gBAAA,CAAiB,aAAa,eAAiB,EAAA;AAAA,UACtD,OAAS,EAAA,IAAA;AAAA,UACT,IAAM,EAAA;AAAA,SACP,CAAA;AAAA;AAGH,MAAA,SAAA,CAAU,MAAM;AACd,QAAS,QAAA,CAAA,mBAAA,CAAoB,eAAe,iBAAiB,CAAA;AAC7D,QAAS,QAAA,CAAA,mBAAA,CAAoB,aAAa,eAAiB,EAAA;AAAA,UACzD,OAAS,EAAA;AAAA,SACV,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA;AAED,IAAA,SAAS,cAAc,KAAsB,EAAA;AAC3C,MAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,OAAW,IAAA,KAAA,CAAM,UAAU,KAAM,CAAA,OAAA;AAG7D,MAAA,IAAI,MAAM,GAAQ,KAAA,KAAA;AAChB,QAAA,KAAA,CAAM,cAAe,EAAA;AAEvB,MAAA,IAAI,CAAC,aAAA,IAAiB,KAAM,CAAA,GAAA,CAAI,MAAW,KAAA,CAAA;AACzC,QAAsB,qBAAA,CAAA,KAAA,CAAM,GAAK,EAAA,QAAA,EAAU,CAAA;AAE7C,MAAI,IAAA,CAAC,WAAW,WAAa,EAAA,MAAA,EAAQ,KAAK,CAAE,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,CAAG,EAAA;AAC/D,QAAA,MAAM,kBAAkB,QAAS,EAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AACjD,QAAI,IAAA,cAAA,GAAiB,CAAC,GAAG,eAAe,CAAA;AAExC,QAAA,IAAI,CAAC,SAAW,EAAA,KAAK,CAAE,CAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AACvC,UAAiB,cAAA,GAAA,cAAA,CAAe,KAAM,EAAA,CAAE,OAAQ,EAAA;AAElD,QAAA,IAAI,CAAC,SAAW,EAAA,WAAW,EAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAG,EAAA;AAChD,UAAA,MAAM,iBAAiB,KAAM,CAAA,MAAA;AAC7B,UAAM,MAAA,YAAA,GAAe,cAAe,CAAA,OAAA,CAAQ,cAAc,CAAA;AAC1D,UAAiB,cAAA,GAAA,cAAA,CAAe,KAAM,CAAA,YAAA,GAAe,CAAC,CAAA;AAAA;AAExD,QAAW,UAAA,CAAA,MAAM,UAAW,CAAA,cAAc,CAAC,CAAA;AAC3C,QAAA,KAAA,CAAM,cAAe,EAAA;AAAA;AACvB;AAGF,IAAM,MAAA,WAAA,GAAc,SAAS,MAAM;AACjC,MAAA,IAAI,MAAM,QAAa,KAAA,QAAA;AACrB,QAAO,OAAA,KAAA;AAAA,kBACG,EAAC;AAAA,KACd,CAAA;AAED,IAAM,MAAA,cAAA,GAAiB,eAAgB,CAAA,WAAA,CAAY,KAAK,CAAA;AAExD,IAA4B,2BAAA,CAAA;AAAA,MAC1B,OAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA,EAAkB,CAAC,IAAS,KAAA;AAC1B,QAAA,QAAA,CAAS,KAAQ,GAAA,IAAA;AAAA,OACnB;AAAA,MACA,eAAiB,EAAA,CAAC,IAAM,EAAA,KAAA,EAAO,QAAa,KAAA;AAC1C,QAAA,MAAM,gBAAmB,GAAA,CAAC,sBAAuB,CAAA,KAAA,IAAS,CAAC,QAAA;AAC3D,QAAA,MAAM,iBAAiB,eAAgB,CAAA,WAAA,CAAY,WAAW,KAAO,EAAA,KAAA,EAAO,YAAY,EAAE,CAAA;AAE1F,QAAI,IAAA,WAAA,CAAY,SAAS,KAAO,EAAA;AAC9B,UAAA,IAAI,iCAAiC,KAAO,EAAA;AAC1C,YAAA;AAAA;AAEF,UAAA,IAAI,kBAAkB,gBAAkB,EAAA;AACtC,YAAA,YAAA,CAAa,KAAQ,GAAA,IAAA;AAGrB,YAAA,IAAI,cAAgB,EAAA;AAClB,cAAA,gCAAA,CAAiC,KAAQ,GAAA,IAAA;AAAA;AAC3C;AACF,SAEG,MAAA;AACH,UAAA,IAAI,kBAAkB,gBAAkB,EAAA;AACtC,YAAA,YAAA,CAAa,KAAQ,GAAA,IAAA;AAAA;AACvB;AAGF,QAAA,IAAI,gBAAkB,EAAA;AACpB,UAAA,sBAAA,CAAuB,KAAQ,GAAA,IAAA;AAAA;AACjC,OACF;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,OAAA,CAAQ,OAAO,KAAM,EAAA;AAAA,OACvB;AAAA,MACA,mBAAqB,EAAA,CAAC,IAAM,EAAA,KAAA,EAAO,QAAa,KAAA;AAC9C,QAAA,MAAM,gBAAmB,GAAA,CAAC,sBAAuB,CAAA,KAAA,IAAS,CAAC,QAAA;AAC3D,QAAA,MAAM,iBAAiB,eAAgB,CAAA,WAAA,CAAY,WAAW,KAAO,EAAA,KAAA,EAAO,YAAY,EAAE,CAAA;AAE1F,QAAA,IAAI,cAAkB,IAAA,gBAAA;AACpB,UAAA,gBAAA,CAAiB,KAAQ,GAAA,IAAA;AAAA,OAC7B;AAAA,MACA,iBAAA;AAAA,MACA,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,YAAA;AAAA,MACA,SAAW,EAAA;AAAA,KACZ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -4,6 +4,7 @@ const vue = require('vue');
4
4
  const Slider_SliderImpl = require('./SliderImpl.cjs');
5
5
  const Slider_utils = require('./utils.cjs');
6
6
  const shared_useForwardExpose = require('../shared/useForwardExpose.cjs');
7
+ const Slider_SliderRoot = require('./SliderRoot.cjs');
7
8
 
8
9
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
9
10
  __name: "SliderHorizontal",
@@ -19,15 +20,23 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
19
20
  const emits = __emit;
20
21
  const { max, min, dir, inverted } = vue.toRefs(props);
21
22
  const { forwardRef, currentElement: sliderElement } = shared_useForwardExpose.useForwardExpose();
23
+ const rootContext = Slider_SliderRoot.injectSliderRootContext();
24
+ const offsetPosition = vue.ref();
22
25
  const rectRef = vue.ref();
23
26
  const isSlidingFromLeft = vue.computed(() => dir?.value === "ltr" && !inverted.value || dir?.value !== "ltr" && inverted.value);
24
- function getValueFromPointer(pointerPosition) {
27
+ function getValueFromPointerEvent(event, slideStart) {
25
28
  const rect = rectRef.value || sliderElement.value.getBoundingClientRect();
26
- const input = [0, rect.width];
29
+ const thumb = [...rootContext.thumbElements.value][rootContext.valueIndexToChangeRef.value];
30
+ const thumbWidth = rootContext.thumbAlignment.value === "contain" ? thumb.clientWidth : 0;
31
+ if (!offsetPosition.value && !slideStart && rootContext.thumbAlignment.value === "contain") {
32
+ offsetPosition.value = event.clientX - thumb.getBoundingClientRect().left;
33
+ }
34
+ const input = [0, rect.width - thumbWidth];
27
35
  const output = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value];
28
36
  const value = Slider_utils.linearScale(input, output);
29
37
  rectRef.value = rect;
30
- return value(pointerPosition - rect.left);
38
+ const position = slideStart ? event.clientX - rect.left - thumbWidth / 2 : event.clientX - rect.left - (offsetPosition.value ?? 0);
39
+ return value(position);
31
40
  }
32
41
  Slider_utils.provideSliderOrientationContext({
33
42
  startEdge: isSlidingFromLeft.value ? "left" : "right",
@@ -40,19 +49,20 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
40
49
  ref: vue.unref(forwardRef),
41
50
  dir: vue.unref(dir),
42
51
  "data-orientation": "horizontal",
43
- style: {
44
- ["--reka-slider-thumb-transform"]: "translateX(-50%)"
45
- },
52
+ style: vue.normalizeStyle({
53
+ ["--reka-slider-thumb-transform"]: !isSlidingFromLeft.value && vue.unref(rootContext).thumbAlignment.value === "overflow" ? "translateX(50%)" : "translateX(-50%)"
54
+ }),
46
55
  onSlideStart: _cache[0] || (_cache[0] = (event) => {
47
- const value = getValueFromPointer(event.clientX);
56
+ const value = getValueFromPointerEvent(event, true);
48
57
  emits("slideStart", value);
49
58
  }),
50
59
  onSlideMove: _cache[1] || (_cache[1] = (event) => {
51
- const value = getValueFromPointer(event.clientX);
60
+ const value = getValueFromPointerEvent(event);
52
61
  emits("slideMove", value);
53
62
  }),
54
63
  onSlideEnd: _cache[2] || (_cache[2] = () => {
55
64
  rectRef.value = undefined;
65
+ offsetPosition.value = undefined;
56
66
  emits("slideEnd");
57
67
  }),
58
68
  onStepKeyDown: _cache[3] || (_cache[3] = (event) => {
@@ -67,7 +77,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
67
77
  vue.renderSlot(_ctx.$slots, "default")
68
78
  ]),
69
79
  _: 3
70
- }, 8, ["dir"]);
80
+ }, 8, ["dir", "style"]);
71
81
  };
72
82
  }
73
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SliderHorizontal.cjs","sources":["../../src/Slider/SliderHorizontal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport SliderImpl from './SliderImpl.vue'\nimport { computed, ref, toRefs } from 'vue'\nimport type { Direction, SliderOrientationPrivateEmits, SliderOrientationPrivateProps } from './utils'\nimport { BACK_KEYS, linearScale, provideSliderOrientationContext } from './utils'\nimport { useForwardExpose } from '@/shared'\n\ninterface SliderHorizontalProps extends SliderOrientationPrivateProps {\n dir?: Direction\n}\n\nconst props = defineProps<SliderHorizontalProps>()\nconst emits = defineEmits<SliderOrientationPrivateEmits>()\nconst { max, min, dir, inverted } = toRefs(props)\n\nconst { forwardRef, currentElement: sliderElement } = useForwardExpose()\n\nconst rectRef = ref<ClientRect>()\nconst isSlidingFromLeft = computed(() => (dir?.value === 'ltr' && !inverted.value) || (dir?.value !== 'ltr' && inverted.value))\n\nfunction getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.value || sliderElement.value!.getBoundingClientRect()\n const input: [number, number] = [0, rect.width]\n const output: [number, number] = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value]\n const value = linearScale(input, output)\n\n rectRef.value = rect\n return value(pointerPosition - rect.left)\n}\n\nprovideSliderOrientationContext({\n startEdge: isSlidingFromLeft.value ? 'left' : 'right',\n endEdge: isSlidingFromLeft.value ? 'right' : 'left',\n direction: isSlidingFromLeft.value ? 1 : -1,\n size: 'width',\n})\n</script>\n\n<template>\n <SliderImpl\n :ref=\"forwardRef\"\n :dir=\"dir\"\n data-orientation=\"horizontal\"\n :style=\"{\n ['--reka-slider-thumb-transform' as any]: 'translateX(-50%)',\n }\"\n @slide-start=\"(event) => {\n const value = getValueFromPointer(event.clientX);\n emits('slideStart', value)\n }\"\n @slide-move=\"(event) => {\n const value = getValueFromPointer(event.clientX);\n emits('slideMove', value)\n }\"\n @slide-end=\"() => {\n rectRef = undefined;\n emits('slideEnd')\n }\"\n @step-key-down=\"(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n emits('stepKeyDown', event, isBackKey ? -1 : 1)\n }\"\n @end-key-down=\"emits('endKeyDown', $event)\"\n @home-key-down=\"emits('homeKeyDown', $event)\"\n >\n <slot />\n </SliderImpl>\n</template>\n"],"names":["toRefs","useForwardExpose","ref","computed","linearScale","provideSliderOrientationContext"],"mappings":";;;;;;;;;;;;;;;;;AAWA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA;AACd,IAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,KAAK,QAAS,EAAA,GAAIA,WAAO,KAAK,CAAA;AAEhD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,aAAA,KAAkBC,wCAAiB,EAAA;AAEvE,IAAA,MAAM,UAAUC,OAAgB,EAAA;AAChC,IAAA,MAAM,iBAAoB,GAAAC,YAAA,CAAS,MAAO,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,CAAC,QAAA,CAAS,KAAW,IAAA,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,SAAS,KAAM,CAAA;AAE9H,IAAA,SAAS,oBAAoB,eAAyB,EAAA;AACpD,MAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAS,IAAA,aAAA,CAAc,MAAO,qBAAsB,EAAA;AACzE,MAAA,MAAM,KAA0B,GAAA,CAAC,CAAG,EAAA,IAAA,CAAK,KAAK,CAAA;AAC9C,MAAA,MAAM,MAA2B,GAAA,iBAAA,CAAkB,KAAQ,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,GAAI,CAAA,KAAK,CAAI,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,IAAI,KAAK,CAAA;AACzG,MAAM,MAAA,KAAA,GAAQC,wBAAY,CAAA,KAAA,EAAO,MAAM,CAAA;AAEvC,MAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA;AAChB,MAAO,OAAA,KAAA,CAAM,eAAkB,GAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAG1C,IAAgCC,4CAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,MAAS,GAAA,OAAA;AAAA,MAC9C,OAAA,EAAS,iBAAkB,CAAA,KAAA,GAAQ,OAAU,GAAA,MAAA;AAAA,MAC7C,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,CAAI,GAAA,EAAA;AAAA,MACzC,IAAM,EAAA;AAAA,KACP,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderHorizontal.cjs","sources":["../../src/Slider/SliderHorizontal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport SliderImpl from './SliderImpl.vue'\nimport { computed, ref, toRefs } from 'vue'\nimport type { Direction, SliderOrientationPrivateEmits, SliderOrientationPrivateProps } from './utils'\nimport { BACK_KEYS, linearScale, provideSliderOrientationContext } from './utils'\nimport { useForwardExpose } from '@/shared'\nimport { injectSliderRootContext } from './SliderRoot.vue'\n\ninterface SliderHorizontalProps extends SliderOrientationPrivateProps {\n dir?: Direction\n}\n\nconst props = defineProps<SliderHorizontalProps>()\nconst emits = defineEmits<SliderOrientationPrivateEmits>()\nconst { max, min, dir, inverted } = toRefs(props)\n\nconst { forwardRef, currentElement: sliderElement } = useForwardExpose()\nconst rootContext = injectSliderRootContext()\n\nconst offsetPosition = ref<number>()\nconst rectRef = ref<ClientRect>()\nconst isSlidingFromLeft = computed(() => (dir?.value === 'ltr' && !inverted.value) || (dir?.value !== 'ltr' && inverted.value))\n\nfunction getValueFromPointerEvent(event: PointerEvent, slideStart?: boolean) {\n const rect = rectRef.value || sliderElement.value!.getBoundingClientRect()\n\n // Get the currently active thumb element\n const thumb = [...rootContext.thumbElements.value][rootContext.valueIndexToChangeRef.value]\n const thumbWidth = rootContext.thumbAlignment.value === 'contain' ? thumb.clientWidth : 0\n\n // Calculate offset for dragging, but only when needed\n if (!offsetPosition.value && !slideStart && rootContext.thumbAlignment.value === 'contain') {\n offsetPosition.value = event.clientX - thumb.getBoundingClientRect().left\n }\n\n // Define the input range (slider track width minus thumb width)\n const input: [number, number] = [0, rect.width - thumbWidth]\n const output: [number, number] = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value]\n const value = linearScale(input, output)\n\n rectRef.value = rect\n const position = slideStart\n ? event.clientX - rect.left - thumbWidth / 2\n : event.clientX - rect.left - (offsetPosition.value ?? 0)\n\n return value(position)\n}\n\nprovideSliderOrientationContext({\n startEdge: isSlidingFromLeft.value ? 'left' : 'right',\n endEdge: isSlidingFromLeft.value ? 'right' : 'left',\n direction: isSlidingFromLeft.value ? 1 : -1,\n size: 'width',\n})\n</script>\n\n<template>\n <SliderImpl\n :ref=\"forwardRef\"\n :dir=\"dir\"\n data-orientation=\"horizontal\"\n :style=\"{\n ['--reka-slider-thumb-transform' as any]:\n !isSlidingFromLeft && rootContext.thumbAlignment.value === 'overflow' ? 'translateX(50%)' : 'translateX(-50%)',\n }\"\n @slide-start=\"(event) => {\n const value = getValueFromPointerEvent(event, true);\n emits('slideStart', value)\n }\"\n @slide-move=\"(event) => {\n const value = getValueFromPointerEvent(event);\n emits('slideMove', value)\n }\"\n @slide-end=\"() => {\n rectRef = undefined;\n offsetPosition = undefined\n emits('slideEnd')\n }\"\n @step-key-down=\"(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n emits('stepKeyDown', event, isBackKey ? -1 : 1)\n }\"\n @end-key-down=\"emits('endKeyDown', $event)\"\n @home-key-down=\"emits('homeKeyDown', $event)\"\n >\n <slot />\n </SliderImpl>\n</template>\n"],"names":["toRefs","useForwardExpose","injectSliderRootContext","ref","computed","linearScale","provideSliderOrientationContext"],"mappings":";;;;;;;;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA;AACd,IAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,KAAK,QAAS,EAAA,GAAIA,WAAO,KAAK,CAAA;AAEhD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,aAAA,KAAkBC,wCAAiB,EAAA;AACvE,IAAA,MAAM,cAAcC,yCAAwB,EAAA;AAE5C,IAAA,MAAM,iBAAiBC,OAAY,EAAA;AACnC,IAAA,MAAM,UAAUA,OAAgB,EAAA;AAChC,IAAA,MAAM,iBAAoB,GAAAC,YAAA,CAAS,MAAO,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,CAAC,QAAA,CAAS,KAAW,IAAA,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,SAAS,KAAM,CAAA;AAE9H,IAAS,SAAA,wBAAA,CAAyB,OAAqB,UAAsB,EAAA;AAC3E,MAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAS,IAAA,aAAA,CAAc,MAAO,qBAAsB,EAAA;AAGzE,MAAM,MAAA,KAAA,GAAQ,CAAC,GAAG,WAAA,CAAY,cAAc,KAAK,CAAA,CAAE,WAAY,CAAA,qBAAA,CAAsB,KAAK,CAAA;AAC1F,MAAA,MAAM,aAAa,WAAY,CAAA,cAAA,CAAe,KAAU,KAAA,SAAA,GAAY,MAAM,WAAc,GAAA,CAAA;AAGxF,MAAI,IAAA,CAAC,eAAe,KAAS,IAAA,CAAC,cAAc,WAAY,CAAA,cAAA,CAAe,UAAU,SAAW,EAAA;AAC1F,QAAA,cAAA,CAAe,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA,KAAA,CAAM,uBAAwB,CAAA,IAAA;AAAA;AAIvE,MAAA,MAAM,KAA0B,GAAA,CAAC,CAAG,EAAA,IAAA,CAAK,QAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,MAA2B,GAAA,iBAAA,CAAkB,KAAQ,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,GAAI,CAAA,KAAK,CAAI,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,IAAI,KAAK,CAAA;AACzG,MAAM,MAAA,KAAA,GAAQC,wBAAY,CAAA,KAAA,EAAO,MAAM,CAAA;AAEvC,MAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA;AAChB,MAAA,MAAM,QAAW,GAAA,UAAA,GACb,KAAM,CAAA,OAAA,GAAU,IAAK,CAAA,IAAA,GAAO,UAAa,GAAA,CAAA,GACzC,KAAM,CAAA,OAAA,GAAU,IAAK,CAAA,IAAA,IAAQ,eAAe,KAAS,IAAA,CAAA,CAAA;AAEzD,MAAA,OAAO,MAAM,QAAQ,CAAA;AAAA;AAGvB,IAAgCC,4CAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,MAAS,GAAA,OAAA;AAAA,MAC9C,OAAA,EAAS,iBAAkB,CAAA,KAAA,GAAQ,OAAU,GAAA,MAAA;AAAA,MAC7C,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,CAAI,GAAA,EAAA;AAAA,MACzC,IAAM,EAAA;AAAA,KACP,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,8 @@
1
- import { defineComponent, toRefs, ref, computed, openBlock, createBlock, unref, withCtx, renderSlot } from 'vue';
1
+ import { defineComponent, toRefs, ref, computed, openBlock, createBlock, unref, normalizeStyle, withCtx, renderSlot } from 'vue';
2
2
  import { _ as _sfc_main$1 } from './SliderImpl.js';
3
3
  import { p as provideSliderOrientationContext, B as BACK_KEYS, l as linearScale } from './utils.js';
4
4
  import { u as useForwardExpose } from '../shared/useForwardExpose.js';
5
+ import { i as injectSliderRootContext } from './SliderRoot.js';
5
6
 
6
7
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
8
  __name: "SliderHorizontal",
@@ -17,15 +18,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
17
18
  const emits = __emit;
18
19
  const { max, min, dir, inverted } = toRefs(props);
19
20
  const { forwardRef, currentElement: sliderElement } = useForwardExpose();
21
+ const rootContext = injectSliderRootContext();
22
+ const offsetPosition = ref();
20
23
  const rectRef = ref();
21
24
  const isSlidingFromLeft = computed(() => dir?.value === "ltr" && !inverted.value || dir?.value !== "ltr" && inverted.value);
22
- function getValueFromPointer(pointerPosition) {
25
+ function getValueFromPointerEvent(event, slideStart) {
23
26
  const rect = rectRef.value || sliderElement.value.getBoundingClientRect();
24
- const input = [0, rect.width];
27
+ const thumb = [...rootContext.thumbElements.value][rootContext.valueIndexToChangeRef.value];
28
+ const thumbWidth = rootContext.thumbAlignment.value === "contain" ? thumb.clientWidth : 0;
29
+ if (!offsetPosition.value && !slideStart && rootContext.thumbAlignment.value === "contain") {
30
+ offsetPosition.value = event.clientX - thumb.getBoundingClientRect().left;
31
+ }
32
+ const input = [0, rect.width - thumbWidth];
25
33
  const output = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value];
26
34
  const value = linearScale(input, output);
27
35
  rectRef.value = rect;
28
- return value(pointerPosition - rect.left);
36
+ const position = slideStart ? event.clientX - rect.left - thumbWidth / 2 : event.clientX - rect.left - (offsetPosition.value ?? 0);
37
+ return value(position);
29
38
  }
30
39
  provideSliderOrientationContext({
31
40
  startEdge: isSlidingFromLeft.value ? "left" : "right",
@@ -38,19 +47,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
38
47
  ref: unref(forwardRef),
39
48
  dir: unref(dir),
40
49
  "data-orientation": "horizontal",
41
- style: {
42
- ["--reka-slider-thumb-transform"]: "translateX(-50%)"
43
- },
50
+ style: normalizeStyle({
51
+ ["--reka-slider-thumb-transform"]: !isSlidingFromLeft.value && unref(rootContext).thumbAlignment.value === "overflow" ? "translateX(50%)" : "translateX(-50%)"
52
+ }),
44
53
  onSlideStart: _cache[0] || (_cache[0] = (event) => {
45
- const value = getValueFromPointer(event.clientX);
54
+ const value = getValueFromPointerEvent(event, true);
46
55
  emits("slideStart", value);
47
56
  }),
48
57
  onSlideMove: _cache[1] || (_cache[1] = (event) => {
49
- const value = getValueFromPointer(event.clientX);
58
+ const value = getValueFromPointerEvent(event);
50
59
  emits("slideMove", value);
51
60
  }),
52
61
  onSlideEnd: _cache[2] || (_cache[2] = () => {
53
62
  rectRef.value = undefined;
63
+ offsetPosition.value = undefined;
54
64
  emits("slideEnd");
55
65
  }),
56
66
  onStepKeyDown: _cache[3] || (_cache[3] = (event) => {
@@ -65,7 +75,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
65
75
  renderSlot(_ctx.$slots, "default")
66
76
  ]),
67
77
  _: 3
68
- }, 8, ["dir"]);
78
+ }, 8, ["dir", "style"]);
69
79
  };
70
80
  }
71
81
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SliderHorizontal.js","sources":["../../src/Slider/SliderHorizontal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport SliderImpl from './SliderImpl.vue'\nimport { computed, ref, toRefs } from 'vue'\nimport type { Direction, SliderOrientationPrivateEmits, SliderOrientationPrivateProps } from './utils'\nimport { BACK_KEYS, linearScale, provideSliderOrientationContext } from './utils'\nimport { useForwardExpose } from '@/shared'\n\ninterface SliderHorizontalProps extends SliderOrientationPrivateProps {\n dir?: Direction\n}\n\nconst props = defineProps<SliderHorizontalProps>()\nconst emits = defineEmits<SliderOrientationPrivateEmits>()\nconst { max, min, dir, inverted } = toRefs(props)\n\nconst { forwardRef, currentElement: sliderElement } = useForwardExpose()\n\nconst rectRef = ref<ClientRect>()\nconst isSlidingFromLeft = computed(() => (dir?.value === 'ltr' && !inverted.value) || (dir?.value !== 'ltr' && inverted.value))\n\nfunction getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.value || sliderElement.value!.getBoundingClientRect()\n const input: [number, number] = [0, rect.width]\n const output: [number, number] = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value]\n const value = linearScale(input, output)\n\n rectRef.value = rect\n return value(pointerPosition - rect.left)\n}\n\nprovideSliderOrientationContext({\n startEdge: isSlidingFromLeft.value ? 'left' : 'right',\n endEdge: isSlidingFromLeft.value ? 'right' : 'left',\n direction: isSlidingFromLeft.value ? 1 : -1,\n size: 'width',\n})\n</script>\n\n<template>\n <SliderImpl\n :ref=\"forwardRef\"\n :dir=\"dir\"\n data-orientation=\"horizontal\"\n :style=\"{\n ['--reka-slider-thumb-transform' as any]: 'translateX(-50%)',\n }\"\n @slide-start=\"(event) => {\n const value = getValueFromPointer(event.clientX);\n emits('slideStart', value)\n }\"\n @slide-move=\"(event) => {\n const value = getValueFromPointer(event.clientX);\n emits('slideMove', value)\n }\"\n @slide-end=\"() => {\n rectRef = undefined;\n emits('slideEnd')\n }\"\n @step-key-down=\"(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n emits('stepKeyDown', event, isBackKey ? -1 : 1)\n }\"\n @end-key-down=\"emits('endKeyDown', $event)\"\n @home-key-down=\"emits('homeKeyDown', $event)\"\n >\n <slot />\n </SliderImpl>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAWA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA;AACd,IAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,KAAK,QAAS,EAAA,GAAI,OAAO,KAAK,CAAA;AAEhD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,aAAA,KAAkB,gBAAiB,EAAA;AAEvE,IAAA,MAAM,UAAU,GAAgB,EAAA;AAChC,IAAA,MAAM,iBAAoB,GAAA,QAAA,CAAS,MAAO,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,CAAC,QAAA,CAAS,KAAW,IAAA,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,SAAS,KAAM,CAAA;AAE9H,IAAA,SAAS,oBAAoB,eAAyB,EAAA;AACpD,MAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAS,IAAA,aAAA,CAAc,MAAO,qBAAsB,EAAA;AACzE,MAAA,MAAM,KAA0B,GAAA,CAAC,CAAG,EAAA,IAAA,CAAK,KAAK,CAAA;AAC9C,MAAA,MAAM,MAA2B,GAAA,iBAAA,CAAkB,KAAQ,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,GAAI,CAAA,KAAK,CAAI,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,IAAI,KAAK,CAAA;AACzG,MAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,EAAO,MAAM,CAAA;AAEvC,MAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA;AAChB,MAAO,OAAA,KAAA,CAAM,eAAkB,GAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAG1C,IAAgC,+BAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,MAAS,GAAA,OAAA;AAAA,MAC9C,OAAA,EAAS,iBAAkB,CAAA,KAAA,GAAQ,OAAU,GAAA,MAAA;AAAA,MAC7C,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,CAAI,GAAA,EAAA;AAAA,MACzC,IAAM,EAAA;AAAA,KACP,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderHorizontal.js","sources":["../../src/Slider/SliderHorizontal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport SliderImpl from './SliderImpl.vue'\nimport { computed, ref, toRefs } from 'vue'\nimport type { Direction, SliderOrientationPrivateEmits, SliderOrientationPrivateProps } from './utils'\nimport { BACK_KEYS, linearScale, provideSliderOrientationContext } from './utils'\nimport { useForwardExpose } from '@/shared'\nimport { injectSliderRootContext } from './SliderRoot.vue'\n\ninterface SliderHorizontalProps extends SliderOrientationPrivateProps {\n dir?: Direction\n}\n\nconst props = defineProps<SliderHorizontalProps>()\nconst emits = defineEmits<SliderOrientationPrivateEmits>()\nconst { max, min, dir, inverted } = toRefs(props)\n\nconst { forwardRef, currentElement: sliderElement } = useForwardExpose()\nconst rootContext = injectSliderRootContext()\n\nconst offsetPosition = ref<number>()\nconst rectRef = ref<ClientRect>()\nconst isSlidingFromLeft = computed(() => (dir?.value === 'ltr' && !inverted.value) || (dir?.value !== 'ltr' && inverted.value))\n\nfunction getValueFromPointerEvent(event: PointerEvent, slideStart?: boolean) {\n const rect = rectRef.value || sliderElement.value!.getBoundingClientRect()\n\n // Get the currently active thumb element\n const thumb = [...rootContext.thumbElements.value][rootContext.valueIndexToChangeRef.value]\n const thumbWidth = rootContext.thumbAlignment.value === 'contain' ? thumb.clientWidth : 0\n\n // Calculate offset for dragging, but only when needed\n if (!offsetPosition.value && !slideStart && rootContext.thumbAlignment.value === 'contain') {\n offsetPosition.value = event.clientX - thumb.getBoundingClientRect().left\n }\n\n // Define the input range (slider track width minus thumb width)\n const input: [number, number] = [0, rect.width - thumbWidth]\n const output: [number, number] = isSlidingFromLeft.value ? [min.value, max.value] : [max.value, min.value]\n const value = linearScale(input, output)\n\n rectRef.value = rect\n const position = slideStart\n ? event.clientX - rect.left - thumbWidth / 2\n : event.clientX - rect.left - (offsetPosition.value ?? 0)\n\n return value(position)\n}\n\nprovideSliderOrientationContext({\n startEdge: isSlidingFromLeft.value ? 'left' : 'right',\n endEdge: isSlidingFromLeft.value ? 'right' : 'left',\n direction: isSlidingFromLeft.value ? 1 : -1,\n size: 'width',\n})\n</script>\n\n<template>\n <SliderImpl\n :ref=\"forwardRef\"\n :dir=\"dir\"\n data-orientation=\"horizontal\"\n :style=\"{\n ['--reka-slider-thumb-transform' as any]:\n !isSlidingFromLeft && rootContext.thumbAlignment.value === 'overflow' ? 'translateX(50%)' : 'translateX(-50%)',\n }\"\n @slide-start=\"(event) => {\n const value = getValueFromPointerEvent(event, true);\n emits('slideStart', value)\n }\"\n @slide-move=\"(event) => {\n const value = getValueFromPointerEvent(event);\n emits('slideMove', value)\n }\"\n @slide-end=\"() => {\n rectRef = undefined;\n offsetPosition = undefined\n emits('slideEnd')\n }\"\n @step-key-down=\"(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n emits('stepKeyDown', event, isBackKey ? -1 : 1)\n }\"\n @end-key-down=\"emits('endKeyDown', $event)\"\n @home-key-down=\"emits('homeKeyDown', $event)\"\n >\n <slot />\n </SliderImpl>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA;AACd,IAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,KAAK,QAAS,EAAA,GAAI,OAAO,KAAK,CAAA;AAEhD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,aAAA,KAAkB,gBAAiB,EAAA;AACvE,IAAA,MAAM,cAAc,uBAAwB,EAAA;AAE5C,IAAA,MAAM,iBAAiB,GAAY,EAAA;AACnC,IAAA,MAAM,UAAU,GAAgB,EAAA;AAChC,IAAA,MAAM,iBAAoB,GAAA,QAAA,CAAS,MAAO,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,CAAC,QAAA,CAAS,KAAW,IAAA,GAAA,EAAK,KAAU,KAAA,KAAA,IAAS,SAAS,KAAM,CAAA;AAE9H,IAAS,SAAA,wBAAA,CAAyB,OAAqB,UAAsB,EAAA;AAC3E,MAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAS,IAAA,aAAA,CAAc,MAAO,qBAAsB,EAAA;AAGzE,MAAM,MAAA,KAAA,GAAQ,CAAC,GAAG,WAAA,CAAY,cAAc,KAAK,CAAA,CAAE,WAAY,CAAA,qBAAA,CAAsB,KAAK,CAAA;AAC1F,MAAA,MAAM,aAAa,WAAY,CAAA,cAAA,CAAe,KAAU,KAAA,SAAA,GAAY,MAAM,WAAc,GAAA,CAAA;AAGxF,MAAI,IAAA,CAAC,eAAe,KAAS,IAAA,CAAC,cAAc,WAAY,CAAA,cAAA,CAAe,UAAU,SAAW,EAAA;AAC1F,QAAA,cAAA,CAAe,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA,KAAA,CAAM,uBAAwB,CAAA,IAAA;AAAA;AAIvE,MAAA,MAAM,KAA0B,GAAA,CAAC,CAAG,EAAA,IAAA,CAAK,QAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,MAA2B,GAAA,iBAAA,CAAkB,KAAQ,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,GAAI,CAAA,KAAK,CAAI,GAAA,CAAC,GAAI,CAAA,KAAA,EAAO,IAAI,KAAK,CAAA;AACzG,MAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,EAAO,MAAM,CAAA;AAEvC,MAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA;AAChB,MAAA,MAAM,QAAW,GAAA,UAAA,GACb,KAAM,CAAA,OAAA,GAAU,IAAK,CAAA,IAAA,GAAO,UAAa,GAAA,CAAA,GACzC,KAAM,CAAA,OAAA,GAAU,IAAK,CAAA,IAAA,IAAQ,eAAe,KAAS,IAAA,CAAA,CAAA;AAEzD,MAAA,OAAO,MAAM,QAAQ,CAAA;AAAA;AAGvB,IAAgC,+BAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,MAAS,GAAA,OAAA;AAAA,MAC9C,OAAA,EAAS,iBAAkB,CAAA,KAAA,GAAQ,OAAU,GAAA,MAAA;AAAA,MAC7C,SAAA,EAAW,iBAAkB,CAAA,KAAA,GAAQ,CAAI,GAAA,EAAA;AAAA,MACzC,IAAM,EAAA;AAAA,KACP,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -30,8 +30,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
30
30
  max: { default: 100 },
31
31
  step: { default: 1 },
32
32
  minStepsBetweenThumbs: { default: 0 },
33
+ thumbAlignment: { default: "contain" },
33
34
  asChild: { type: Boolean },
34
- as: {},
35
+ as: { default: "span" },
35
36
  name: {},
36
37
  required: { type: Boolean }
37
38
  },
@@ -39,7 +40,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
39
40
  setup(__props, { emit: __emit }) {
40
41
  const props = __props;
41
42
  const emits = __emit;
42
- const { min, max, step, minStepsBetweenThumbs, orientation, disabled, dir: propDir } = vue.toRefs(props);
43
+ const { min, max, step, minStepsBetweenThumbs, orientation, disabled, thumbAlignment, dir: propDir } = vue.toRefs(props);
43
44
  const dir = shared_useDirection.useDirection(propDir);
44
45
  const { forwardRef, currentElement } = shared_useForwardExpose.useForwardExpose();
45
46
  const isFormControl = shared_useFormControl.useFormControl(currentElement);
@@ -90,7 +91,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
90
91
  orientation,
91
92
  min,
92
93
  max,
93
- disabled
94
+ disabled,
95
+ thumbAlignment
94
96
  });
95
97
  return (_ctx, _cache) => {
96
98
  return vue.openBlock(), vue.createBlock(vue.unref(CollectionSlot), null, {
@@ -1 +1 @@
1
- {"version":3,"file":"SliderRoot.cjs","sources":["../../src/Slider/SliderRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { DataOrientation, Direction, FormFieldProps } from '../shared/types'\nimport { clamp, createContext, useDirection, useFormControl, useForwardExpose } from '@/shared'\nimport { useCollection } from '@/Collection'\n\nexport interface SliderRootProps extends PrimitiveProps, FormFieldProps {\n /** The value of the slider when initially rendered. Use when you do not need to control the state of the slider. */\n defaultValue?: number[]\n /** The controlled value of the slider. Can be bind as `v-model`. */\n modelValue?: number[] | null\n /** When `true`, prevents the user from interacting with the slider. */\n disabled?: boolean\n /** The orientation of the slider. */\n orientation?: DataOrientation\n /** The reading direction of the combobox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the slider is visually inverted. */\n inverted?: boolean\n /** The minimum value for the range. */\n min?: number\n /** The maximum value for the range. */\n max?: number\n /** The stepping interval. */\n step?: number\n /** The minimum permitted steps between multiple thumbs. */\n minStepsBetweenThumbs?: number\n}\n\nexport type SliderRootEmits = {\n /**\n * Event handler called when the slider value changes\n */\n 'update:modelValue': [payload: number[] | undefined]\n /**\n * Event handler called when the value changes at the end of an interaction.\n *\n * Useful when you only need to capture a final value e.g. to update a backend service.\n */\n 'valueCommit': [payload: number[]]\n}\n\nexport interface SliderRootContext {\n orientation: Ref<DataOrientation>\n disabled: Ref<boolean>\n min: Ref<number>\n max: Ref<number>\n modelValue?: Readonly<Ref<number[] | null | undefined>>\n currentModelValue: ComputedRef<number[]>\n valueIndexToChangeRef: Ref<number>\n thumbElements: Ref<HTMLElement[]>\n}\n\nexport const [injectSliderRootContext, provideSliderRootContext]\n = createContext<SliderRootContext>('SliderRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport SliderHorizontal from './SliderHorizontal.vue'\nimport SliderVertical from './SliderVertical.vue'\nimport { computed, ref, toRaw, toRefs } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { ARROW_KEYS, PAGE_KEYS, getClosestValueIndex, getDecimalCount, getNextSortedValues, hasMinStepsBetweenValues, roundValue } from './utils'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<SliderRootProps>(), {\n min: 0,\n max: 100,\n step: 1,\n orientation: 'horizontal',\n disabled: false,\n minStepsBetweenThumbs: 0,\n defaultValue: () => [0],\n inverted: false,\n})\nconst emits = defineEmits<SliderRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current slider values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { min, max, step, minStepsBetweenThumbs, orientation, disabled, dir: propDir } = toRefs(props)\nconst dir = useDirection(propDir)\nconst { forwardRef, currentElement } = useForwardExpose()\nconst isFormControl = useFormControl(currentElement)\n\nconst { CollectionSlot } = useCollection({ isProvider: true })\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue,\n passive: (props.modelValue === undefined) as false,\n}) as Ref<number[] | null>\n\nconst currentModelValue = computed(() => Array.isArray(modelValue.value) ? [...modelValue.value] : [])\n\nconst valueIndexToChangeRef = ref(0)\nconst valuesBeforeSlideStartRef = ref(currentModelValue.value)\n\nfunction handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(currentModelValue.value, value)\n updateValues(value, closestIndex)\n}\n\nfunction handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.value)\n}\n\nfunction handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.value[valueIndexToChangeRef.value]\n const nextValue = currentModelValue.value[valueIndexToChangeRef.value]\n const hasChanged = nextValue !== prevValue\n if (hasChanged)\n emits('valueCommit', toRaw(currentModelValue.value))\n}\n\nfunction updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step.value)\n const snapToStep = roundValue(Math.round((value - min.value) / step.value) * step.value + min.value, decimalCount)\n const nextValue = clamp(snapToStep, min.value, max.value)\n\n const nextValues = getNextSortedValues(currentModelValue.value, nextValue, atIndex)\n\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs.value * step.value)) {\n valueIndexToChangeRef.value = nextValues.indexOf(nextValue)\n const hasChanged = String(nextValues) !== String(modelValue.value)\n if (hasChanged && commit)\n emits('valueCommit', nextValues)\n\n if (hasChanged) {\n thumbElements.value[valueIndexToChangeRef.value]?.focus()\n modelValue.value = nextValues\n }\n }\n}\n\nconst thumbElements = ref<HTMLElement[]>([])\nprovideSliderRootContext({\n modelValue,\n currentModelValue,\n valueIndexToChangeRef,\n thumbElements,\n orientation,\n min,\n max,\n disabled,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <component\n :is=\"orientation === 'horizontal' ? SliderHorizontal : SliderVertical\"\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n :as-child=\"asChild\"\n :as=\"as\"\n :min=\"min\"\n :max=\"max\"\n :dir=\"dir\"\n :inverted=\"inverted\"\n :aria-disabled=\"disabled\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerdown=\"() => {\n if (!disabled) valuesBeforeSlideStartRef = currentModelValue\n }\"\n @slide-start=\"!disabled && handleSlideStart($event)\"\n @slide-move=\"!disabled && handleSlideMove($event)\"\n @slide-end=\"!disabled && handleSlideEnd()\"\n @home-key-down=\"!disabled && updateValues(min, 0, { commit: true })\"\n @end-key-down=\"!disabled && updateValues(max, currentModelValue.length - 1, { commit: true })\"\n @step-key-down=\"(event, direction) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef;\n const value = currentModelValue[atIndex];\n const stepInDirection = step * multiplier * direction;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"number\"\n :value=\"modelValue\"\n :name=\"name\"\n :required=\"required\"\n :disabled=\"disabled\"\n :step=\"step\"\n />\n </component>\n </CollectionSlot>\n</template>\n"],"names":["createContext","toRefs","useDirection","useForwardExpose","useFormControl","useCollection","useVModel","computed","ref","getClosestValueIndex","toRaw","getDecimalCount","roundValue","clamp","getNextSortedValues","hasMinStepsBetweenValues"],"mappings":"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"}
1
+ {"version":3,"file":"SliderRoot.cjs","sources":["../../src/Slider/SliderRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { DataOrientation, Direction, FormFieldProps } from '../shared/types'\nimport { clamp, createContext, useDirection, useFormControl, useForwardExpose } from '@/shared'\nimport { useCollection } from '@/Collection'\n\ntype ThumbAlignment = 'contain' | 'overflow'\n\nexport interface SliderRootProps extends PrimitiveProps, FormFieldProps {\n /** The value of the slider when initially rendered. Use when you do not need to control the state of the slider. */\n defaultValue?: number[]\n /** The controlled value of the slider. Can be bind as `v-model`. */\n modelValue?: number[] | null\n /** When `true`, prevents the user from interacting with the slider. */\n disabled?: boolean\n /** The orientation of the slider. */\n orientation?: DataOrientation\n /** The reading direction of the combobox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the slider is visually inverted. */\n inverted?: boolean\n /** The minimum value for the range. */\n min?: number\n /** The maximum value for the range. */\n max?: number\n /** The stepping interval. */\n step?: number\n /** The minimum permitted steps between multiple thumbs. */\n minStepsBetweenThumbs?: number\n /**\n * The alignment of the slider thumb.\n * - `contain`: thumbs will be contained within the bounds of the track.\n * - `overflow`: thumbs will not be bound by the track. No extra offset will be added.\n * @defaultValue 'contain'\n */\n thumbAlignment?: ThumbAlignment\n}\n\nexport type SliderRootEmits = {\n /**\n * Event handler called when the slider value changes\n */\n 'update:modelValue': [payload: number[] | undefined]\n /**\n * Event handler called when the value changes at the end of an interaction.\n *\n * Useful when you only need to capture a final value e.g. to update a backend service.\n */\n 'valueCommit': [payload: number[]]\n}\n\nexport interface SliderRootContext {\n orientation: Ref<DataOrientation>\n disabled: Ref<boolean>\n min: Ref<number>\n max: Ref<number>\n modelValue?: Readonly<Ref<number[] | null | undefined>>\n currentModelValue: ComputedRef<number[]>\n valueIndexToChangeRef: Ref<number>\n thumbElements: Ref<HTMLElement[]>\n thumbAlignment: Ref<ThumbAlignment>\n}\n\nexport const [injectSliderRootContext, provideSliderRootContext]\n = createContext<SliderRootContext>('SliderRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport SliderHorizontal from './SliderHorizontal.vue'\nimport SliderVertical from './SliderVertical.vue'\nimport { computed, ref, toRaw, toRefs } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { ARROW_KEYS, PAGE_KEYS, getClosestValueIndex, getDecimalCount, getNextSortedValues, hasMinStepsBetweenValues, roundValue } from './utils'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<SliderRootProps>(), {\n min: 0,\n max: 100,\n step: 1,\n orientation: 'horizontal',\n disabled: false,\n minStepsBetweenThumbs: 0,\n defaultValue: () => [0],\n inverted: false,\n thumbAlignment: 'contain',\n as: 'span',\n})\nconst emits = defineEmits<SliderRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current slider values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { min, max, step, minStepsBetweenThumbs, orientation, disabled, thumbAlignment, dir: propDir } = toRefs(props)\nconst dir = useDirection(propDir)\nconst { forwardRef, currentElement } = useForwardExpose()\nconst isFormControl = useFormControl(currentElement)\n\nconst { CollectionSlot } = useCollection({ isProvider: true })\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue,\n passive: (props.modelValue === undefined) as false,\n}) as Ref<number[] | null>\n\nconst currentModelValue = computed(() => Array.isArray(modelValue.value) ? [...modelValue.value] : [])\n\nconst valueIndexToChangeRef = ref(0)\nconst valuesBeforeSlideStartRef = ref(currentModelValue.value)\n\nfunction handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(currentModelValue.value, value)\n updateValues(value, closestIndex)\n}\n\nfunction handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.value)\n}\n\nfunction handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.value[valueIndexToChangeRef.value]\n const nextValue = currentModelValue.value[valueIndexToChangeRef.value]\n const hasChanged = nextValue !== prevValue\n if (hasChanged)\n emits('valueCommit', toRaw(currentModelValue.value))\n}\n\nfunction updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step.value)\n const snapToStep = roundValue(Math.round((value - min.value) / step.value) * step.value + min.value, decimalCount)\n const nextValue = clamp(snapToStep, min.value, max.value)\n\n const nextValues = getNextSortedValues(currentModelValue.value, nextValue, atIndex)\n\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs.value * step.value)) {\n valueIndexToChangeRef.value = nextValues.indexOf(nextValue)\n const hasChanged = String(nextValues) !== String(modelValue.value)\n if (hasChanged && commit)\n emits('valueCommit', nextValues)\n\n if (hasChanged) {\n thumbElements.value[valueIndexToChangeRef.value]?.focus()\n modelValue.value = nextValues\n }\n }\n}\n\nconst thumbElements = ref<HTMLElement[]>([])\nprovideSliderRootContext({\n modelValue,\n currentModelValue,\n valueIndexToChangeRef,\n thumbElements,\n orientation,\n min,\n max,\n disabled,\n thumbAlignment,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <component\n :is=\"orientation === 'horizontal' ? SliderHorizontal : SliderVertical\"\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n :as-child=\"asChild\"\n :as=\"as\"\n :min=\"min\"\n :max=\"max\"\n :dir=\"dir\"\n :inverted=\"inverted\"\n :aria-disabled=\"disabled\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerdown=\"() => {\n if (!disabled) valuesBeforeSlideStartRef = currentModelValue\n }\"\n @slide-start=\"!disabled && handleSlideStart($event)\"\n @slide-move=\"!disabled && handleSlideMove($event)\"\n @slide-end=\"!disabled && handleSlideEnd()\"\n @home-key-down=\"!disabled && updateValues(min, 0, { commit: true })\"\n @end-key-down=\"!disabled && updateValues(max, currentModelValue.length - 1, { commit: true })\"\n @step-key-down=\"(event, direction) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef;\n const value = currentModelValue[atIndex];\n const stepInDirection = step * multiplier * direction;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"number\"\n :value=\"modelValue\"\n :name=\"name\"\n :required=\"required\"\n :disabled=\"disabled\"\n :step=\"step\"\n />\n </component>\n </CollectionSlot>\n</template>\n"],"names":["createContext","toRefs","useDirection","useForwardExpose","useFormControl","useCollection","useVModel","computed","ref","getClosestValueIndex","toRaw","getDecimalCount","roundValue","clamp","getNextSortedValues","hasMinStepsBetweenValues"],"mappings":"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"}
@@ -28,8 +28,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
28
28
  max: { default: 100 },
29
29
  step: { default: 1 },
30
30
  minStepsBetweenThumbs: { default: 0 },
31
+ thumbAlignment: { default: "contain" },
31
32
  asChild: { type: Boolean },
32
- as: {},
33
+ as: { default: "span" },
33
34
  name: {},
34
35
  required: { type: Boolean }
35
36
  },
@@ -37,7 +38,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
38
  setup(__props, { emit: __emit }) {
38
39
  const props = __props;
39
40
  const emits = __emit;
40
- const { min, max, step, minStepsBetweenThumbs, orientation, disabled, dir: propDir } = toRefs(props);
41
+ const { min, max, step, minStepsBetweenThumbs, orientation, disabled, thumbAlignment, dir: propDir } = toRefs(props);
41
42
  const dir = useDirection(propDir);
42
43
  const { forwardRef, currentElement } = useForwardExpose();
43
44
  const isFormControl = useFormControl(currentElement);
@@ -88,7 +89,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
88
89
  orientation,
89
90
  min,
90
91
  max,
91
- disabled
92
+ disabled,
93
+ thumbAlignment
92
94
  });
93
95
  return (_ctx, _cache) => {
94
96
  return openBlock(), createBlock(unref(CollectionSlot), null, {
@@ -1 +1 @@
1
- {"version":3,"file":"SliderRoot.js","sources":["../../src/Slider/SliderRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { DataOrientation, Direction, FormFieldProps } from '../shared/types'\nimport { clamp, createContext, useDirection, useFormControl, useForwardExpose } from '@/shared'\nimport { useCollection } from '@/Collection'\n\nexport interface SliderRootProps extends PrimitiveProps, FormFieldProps {\n /** The value of the slider when initially rendered. Use when you do not need to control the state of the slider. */\n defaultValue?: number[]\n /** The controlled value of the slider. Can be bind as `v-model`. */\n modelValue?: number[] | null\n /** When `true`, prevents the user from interacting with the slider. */\n disabled?: boolean\n /** The orientation of the slider. */\n orientation?: DataOrientation\n /** The reading direction of the combobox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the slider is visually inverted. */\n inverted?: boolean\n /** The minimum value for the range. */\n min?: number\n /** The maximum value for the range. */\n max?: number\n /** The stepping interval. */\n step?: number\n /** The minimum permitted steps between multiple thumbs. */\n minStepsBetweenThumbs?: number\n}\n\nexport type SliderRootEmits = {\n /**\n * Event handler called when the slider value changes\n */\n 'update:modelValue': [payload: number[] | undefined]\n /**\n * Event handler called when the value changes at the end of an interaction.\n *\n * Useful when you only need to capture a final value e.g. to update a backend service.\n */\n 'valueCommit': [payload: number[]]\n}\n\nexport interface SliderRootContext {\n orientation: Ref<DataOrientation>\n disabled: Ref<boolean>\n min: Ref<number>\n max: Ref<number>\n modelValue?: Readonly<Ref<number[] | null | undefined>>\n currentModelValue: ComputedRef<number[]>\n valueIndexToChangeRef: Ref<number>\n thumbElements: Ref<HTMLElement[]>\n}\n\nexport const [injectSliderRootContext, provideSliderRootContext]\n = createContext<SliderRootContext>('SliderRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport SliderHorizontal from './SliderHorizontal.vue'\nimport SliderVertical from './SliderVertical.vue'\nimport { computed, ref, toRaw, toRefs } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { ARROW_KEYS, PAGE_KEYS, getClosestValueIndex, getDecimalCount, getNextSortedValues, hasMinStepsBetweenValues, roundValue } from './utils'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<SliderRootProps>(), {\n min: 0,\n max: 100,\n step: 1,\n orientation: 'horizontal',\n disabled: false,\n minStepsBetweenThumbs: 0,\n defaultValue: () => [0],\n inverted: false,\n})\nconst emits = defineEmits<SliderRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current slider values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { min, max, step, minStepsBetweenThumbs, orientation, disabled, dir: propDir } = toRefs(props)\nconst dir = useDirection(propDir)\nconst { forwardRef, currentElement } = useForwardExpose()\nconst isFormControl = useFormControl(currentElement)\n\nconst { CollectionSlot } = useCollection({ isProvider: true })\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue,\n passive: (props.modelValue === undefined) as false,\n}) as Ref<number[] | null>\n\nconst currentModelValue = computed(() => Array.isArray(modelValue.value) ? [...modelValue.value] : [])\n\nconst valueIndexToChangeRef = ref(0)\nconst valuesBeforeSlideStartRef = ref(currentModelValue.value)\n\nfunction handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(currentModelValue.value, value)\n updateValues(value, closestIndex)\n}\n\nfunction handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.value)\n}\n\nfunction handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.value[valueIndexToChangeRef.value]\n const nextValue = currentModelValue.value[valueIndexToChangeRef.value]\n const hasChanged = nextValue !== prevValue\n if (hasChanged)\n emits('valueCommit', toRaw(currentModelValue.value))\n}\n\nfunction updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step.value)\n const snapToStep = roundValue(Math.round((value - min.value) / step.value) * step.value + min.value, decimalCount)\n const nextValue = clamp(snapToStep, min.value, max.value)\n\n const nextValues = getNextSortedValues(currentModelValue.value, nextValue, atIndex)\n\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs.value * step.value)) {\n valueIndexToChangeRef.value = nextValues.indexOf(nextValue)\n const hasChanged = String(nextValues) !== String(modelValue.value)\n if (hasChanged && commit)\n emits('valueCommit', nextValues)\n\n if (hasChanged) {\n thumbElements.value[valueIndexToChangeRef.value]?.focus()\n modelValue.value = nextValues\n }\n }\n}\n\nconst thumbElements = ref<HTMLElement[]>([])\nprovideSliderRootContext({\n modelValue,\n currentModelValue,\n valueIndexToChangeRef,\n thumbElements,\n orientation,\n min,\n max,\n disabled,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <component\n :is=\"orientation === 'horizontal' ? SliderHorizontal : SliderVertical\"\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n :as-child=\"asChild\"\n :as=\"as\"\n :min=\"min\"\n :max=\"max\"\n :dir=\"dir\"\n :inverted=\"inverted\"\n :aria-disabled=\"disabled\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerdown=\"() => {\n if (!disabled) valuesBeforeSlideStartRef = currentModelValue\n }\"\n @slide-start=\"!disabled && handleSlideStart($event)\"\n @slide-move=\"!disabled && handleSlideMove($event)\"\n @slide-end=\"!disabled && handleSlideEnd()\"\n @home-key-down=\"!disabled && updateValues(min, 0, { commit: true })\"\n @end-key-down=\"!disabled && updateValues(max, currentModelValue.length - 1, { commit: true })\"\n @step-key-down=\"(event, direction) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef;\n const value = currentModelValue[atIndex];\n const stepInDirection = step * multiplier * direction;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"number\"\n :value=\"modelValue\"\n :name=\"name\"\n :required=\"required\"\n :disabled=\"disabled\"\n :step=\"step\"\n />\n </component>\n </CollectionSlot>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SliderRoot.js","sources":["../../src/Slider/SliderRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { DataOrientation, Direction, FormFieldProps } from '../shared/types'\nimport { clamp, createContext, useDirection, useFormControl, useForwardExpose } from '@/shared'\nimport { useCollection } from '@/Collection'\n\ntype ThumbAlignment = 'contain' | 'overflow'\n\nexport interface SliderRootProps extends PrimitiveProps, FormFieldProps {\n /** The value of the slider when initially rendered. Use when you do not need to control the state of the slider. */\n defaultValue?: number[]\n /** The controlled value of the slider. Can be bind as `v-model`. */\n modelValue?: number[] | null\n /** When `true`, prevents the user from interacting with the slider. */\n disabled?: boolean\n /** The orientation of the slider. */\n orientation?: DataOrientation\n /** The reading direction of the combobox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the slider is visually inverted. */\n inverted?: boolean\n /** The minimum value for the range. */\n min?: number\n /** The maximum value for the range. */\n max?: number\n /** The stepping interval. */\n step?: number\n /** The minimum permitted steps between multiple thumbs. */\n minStepsBetweenThumbs?: number\n /**\n * The alignment of the slider thumb.\n * - `contain`: thumbs will be contained within the bounds of the track.\n * - `overflow`: thumbs will not be bound by the track. No extra offset will be added.\n * @defaultValue 'contain'\n */\n thumbAlignment?: ThumbAlignment\n}\n\nexport type SliderRootEmits = {\n /**\n * Event handler called when the slider value changes\n */\n 'update:modelValue': [payload: number[] | undefined]\n /**\n * Event handler called when the value changes at the end of an interaction.\n *\n * Useful when you only need to capture a final value e.g. to update a backend service.\n */\n 'valueCommit': [payload: number[]]\n}\n\nexport interface SliderRootContext {\n orientation: Ref<DataOrientation>\n disabled: Ref<boolean>\n min: Ref<number>\n max: Ref<number>\n modelValue?: Readonly<Ref<number[] | null | undefined>>\n currentModelValue: ComputedRef<number[]>\n valueIndexToChangeRef: Ref<number>\n thumbElements: Ref<HTMLElement[]>\n thumbAlignment: Ref<ThumbAlignment>\n}\n\nexport const [injectSliderRootContext, provideSliderRootContext]\n = createContext<SliderRootContext>('SliderRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport SliderHorizontal from './SliderHorizontal.vue'\nimport SliderVertical from './SliderVertical.vue'\nimport { computed, ref, toRaw, toRefs } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { ARROW_KEYS, PAGE_KEYS, getClosestValueIndex, getDecimalCount, getNextSortedValues, hasMinStepsBetweenValues, roundValue } from './utils'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<SliderRootProps>(), {\n min: 0,\n max: 100,\n step: 1,\n orientation: 'horizontal',\n disabled: false,\n minStepsBetweenThumbs: 0,\n defaultValue: () => [0],\n inverted: false,\n thumbAlignment: 'contain',\n as: 'span',\n})\nconst emits = defineEmits<SliderRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current slider values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { min, max, step, minStepsBetweenThumbs, orientation, disabled, thumbAlignment, dir: propDir } = toRefs(props)\nconst dir = useDirection(propDir)\nconst { forwardRef, currentElement } = useForwardExpose()\nconst isFormControl = useFormControl(currentElement)\n\nconst { CollectionSlot } = useCollection({ isProvider: true })\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue,\n passive: (props.modelValue === undefined) as false,\n}) as Ref<number[] | null>\n\nconst currentModelValue = computed(() => Array.isArray(modelValue.value) ? [...modelValue.value] : [])\n\nconst valueIndexToChangeRef = ref(0)\nconst valuesBeforeSlideStartRef = ref(currentModelValue.value)\n\nfunction handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(currentModelValue.value, value)\n updateValues(value, closestIndex)\n}\n\nfunction handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.value)\n}\n\nfunction handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.value[valueIndexToChangeRef.value]\n const nextValue = currentModelValue.value[valueIndexToChangeRef.value]\n const hasChanged = nextValue !== prevValue\n if (hasChanged)\n emits('valueCommit', toRaw(currentModelValue.value))\n}\n\nfunction updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step.value)\n const snapToStep = roundValue(Math.round((value - min.value) / step.value) * step.value + min.value, decimalCount)\n const nextValue = clamp(snapToStep, min.value, max.value)\n\n const nextValues = getNextSortedValues(currentModelValue.value, nextValue, atIndex)\n\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs.value * step.value)) {\n valueIndexToChangeRef.value = nextValues.indexOf(nextValue)\n const hasChanged = String(nextValues) !== String(modelValue.value)\n if (hasChanged && commit)\n emits('valueCommit', nextValues)\n\n if (hasChanged) {\n thumbElements.value[valueIndexToChangeRef.value]?.focus()\n modelValue.value = nextValues\n }\n }\n}\n\nconst thumbElements = ref<HTMLElement[]>([])\nprovideSliderRootContext({\n modelValue,\n currentModelValue,\n valueIndexToChangeRef,\n thumbElements,\n orientation,\n min,\n max,\n disabled,\n thumbAlignment,\n})\n</script>\n\n<template>\n <CollectionSlot>\n <component\n :is=\"orientation === 'horizontal' ? SliderHorizontal : SliderVertical\"\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n :as-child=\"asChild\"\n :as=\"as\"\n :min=\"min\"\n :max=\"max\"\n :dir=\"dir\"\n :inverted=\"inverted\"\n :aria-disabled=\"disabled\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerdown=\"() => {\n if (!disabled) valuesBeforeSlideStartRef = currentModelValue\n }\"\n @slide-start=\"!disabled && handleSlideStart($event)\"\n @slide-move=\"!disabled && handleSlideMove($event)\"\n @slide-end=\"!disabled && handleSlideEnd()\"\n @home-key-down=\"!disabled && updateValues(min, 0, { commit: true })\"\n @end-key-down=\"!disabled && updateValues(max, currentModelValue.length - 1, { commit: true })\"\n @step-key-down=\"(event, direction) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef;\n const value = currentModelValue[atIndex];\n const stepInDirection = step * multiplier * direction;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"number\"\n :value=\"modelValue\"\n :name=\"name\"\n :required=\"required\"\n :disabled=\"disabled\"\n :step=\"step\"\n />\n </component>\n </CollectionSlot>\n</template>\n"],"names":[],"mappings":"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"}
@@ -9,13 +9,13 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
9
9
  __name: "SliderThumb",
10
10
  props: {
11
11
  asChild: { type: Boolean },
12
- as: {}
12
+ as: { default: "span" }
13
13
  },
14
14
  setup(__props) {
15
15
  const props = __props;
16
16
  const { getItems } = Collection_Collection.useCollection();
17
17
  const { forwardRef, currentElement: thumbElement } = shared_useForwardExpose.useForwardExpose();
18
- const index = vue.computed(() => thumbElement.value ? getItems().findIndex((i) => i.ref === thumbElement.value) : -1);
18
+ const index = vue.computed(() => thumbElement.value ? getItems(true).findIndex((i) => i.ref === thumbElement.value) : -1);
19
19
  return (_ctx, _cache) => {
20
20
  return vue.openBlock(), vue.createBlock(Slider_SliderThumbImpl._sfc_main, vue.mergeProps({ ref: vue.unref(forwardRef) }, props, { index: index.value }), {
21
21
  default: vue.withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"SliderThumb.cjs","sources":["../../src/Slider/SliderThumb.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\n\nexport interface SliderThumbProps extends PrimitiveProps {}\n</script>\n\n<script setup lang=\"ts\">\nimport SliderThumbImpl from './SliderThumbImpl.vue'\nimport { useCollection } from '@/Collection'\nimport { computed } from 'vue'\n\nconst props = defineProps<SliderThumbProps>()\nconst { getItems } = useCollection()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\n\nconst index = computed(() => thumbElement.value ? getItems().findIndex(i => i.ref === thumbElement.value) : -1)\n</script>\n\n<template>\n <SliderThumbImpl\n :ref=\"forwardRef\"\n v-bind=\"props\"\n :index=\"index\"\n >\n <slot />\n </SliderThumbImpl>\n</template>\n"],"names":["useCollection","useForwardExpose","computed"],"mappings":";;;;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAM,MAAA,EAAE,QAAS,EAAA,GAAIA,mCAAc,EAAA;AAEnC,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiBC,wCAAiB,EAAA;AAEtE,IAAA,MAAM,KAAQ,GAAAC,YAAA,CAAS,MAAM,YAAA,CAAa,QAAQ,QAAS,EAAA,CAAE,SAAU,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,GAAA,KAAQ,YAAa,CAAA,KAAK,IAAI,EAAE,CAAA;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderThumb.cjs","sources":["../../src/Slider/SliderThumb.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\n\nexport interface SliderThumbProps extends PrimitiveProps {}\n</script>\n\n<script setup lang=\"ts\">\nimport SliderThumbImpl from './SliderThumbImpl.vue'\nimport { useCollection } from '@/Collection'\nimport { computed } from 'vue'\n\nconst props = withDefaults(defineProps<SliderThumbProps>(), {\n as: 'span',\n})\nconst { getItems } = useCollection()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\n\nconst index = computed(() => thumbElement.value ? getItems(true).findIndex(i => i.ref === thumbElement.value) : -1)\n</script>\n\n<template>\n <SliderThumbImpl\n :ref=\"forwardRef\"\n v-bind=\"props\"\n :index=\"index\"\n >\n <slot />\n </SliderThumbImpl>\n</template>\n"],"names":["useCollection","useForwardExpose","computed"],"mappings":";;;;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAM,MAAA,EAAE,QAAS,EAAA,GAAIA,mCAAc,EAAA;AAEnC,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiBC,wCAAiB,EAAA;AAEtE,IAAA,MAAM,KAAQ,GAAAC,YAAA,CAAS,MAAM,YAAA,CAAa,QAAQ,QAAS,CAAA,IAAI,CAAE,CAAA,SAAA,CAAU,OAAK,CAAE,CAAA,GAAA,KAAQ,YAAa,CAAA,KAAK,IAAI,EAAE,CAAA;;;;;;;;;;;;;;"}
@@ -7,13 +7,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
7
7
  __name: "SliderThumb",
8
8
  props: {
9
9
  asChild: { type: Boolean },
10
- as: {}
10
+ as: { default: "span" }
11
11
  },
12
12
  setup(__props) {
13
13
  const props = __props;
14
14
  const { getItems } = useCollection();
15
15
  const { forwardRef, currentElement: thumbElement } = useForwardExpose();
16
- const index = computed(() => thumbElement.value ? getItems().findIndex((i) => i.ref === thumbElement.value) : -1);
16
+ const index = computed(() => thumbElement.value ? getItems(true).findIndex((i) => i.ref === thumbElement.value) : -1);
17
17
  return (_ctx, _cache) => {
18
18
  return openBlock(), createBlock(_sfc_main$1, mergeProps({ ref: unref(forwardRef) }, props, { index: index.value }), {
19
19
  default: withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"SliderThumb.js","sources":["../../src/Slider/SliderThumb.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\n\nexport interface SliderThumbProps extends PrimitiveProps {}\n</script>\n\n<script setup lang=\"ts\">\nimport SliderThumbImpl from './SliderThumbImpl.vue'\nimport { useCollection } from '@/Collection'\nimport { computed } from 'vue'\n\nconst props = defineProps<SliderThumbProps>()\nconst { getItems } = useCollection()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\n\nconst index = computed(() => thumbElement.value ? getItems().findIndex(i => i.ref === thumbElement.value) : -1)\n</script>\n\n<template>\n <SliderThumbImpl\n :ref=\"forwardRef\"\n v-bind=\"props\"\n :index=\"index\"\n >\n <slot />\n </SliderThumbImpl>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAM,MAAA,EAAE,QAAS,EAAA,GAAI,aAAc,EAAA;AAEnC,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiB,gBAAiB,EAAA;AAEtE,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,MAAM,YAAA,CAAa,QAAQ,QAAS,EAAA,CAAE,SAAU,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,GAAA,KAAQ,YAAa,CAAA,KAAK,IAAI,EAAE,CAAA;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderThumb.js","sources":["../../src/Slider/SliderThumb.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\n\nexport interface SliderThumbProps extends PrimitiveProps {}\n</script>\n\n<script setup lang=\"ts\">\nimport SliderThumbImpl from './SliderThumbImpl.vue'\nimport { useCollection } from '@/Collection'\nimport { computed } from 'vue'\n\nconst props = withDefaults(defineProps<SliderThumbProps>(), {\n as: 'span',\n})\nconst { getItems } = useCollection()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\n\nconst index = computed(() => thumbElement.value ? getItems(true).findIndex(i => i.ref === thumbElement.value) : -1)\n</script>\n\n<template>\n <SliderThumbImpl\n :ref=\"forwardRef\"\n v-bind=\"props\"\n :index=\"index\"\n >\n <slot />\n </SliderThumbImpl>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;AAYA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAM,MAAA,EAAE,QAAS,EAAA,GAAI,aAAc,EAAA;AAEnC,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiB,gBAAiB,EAAA;AAEtE,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,MAAM,YAAA,CAAa,QAAQ,QAAS,CAAA,IAAI,CAAE,CAAA,SAAA,CAAU,OAAK,CAAE,CAAA,GAAA,KAAQ,YAAa,CAAA,KAAK,IAAI,EAAE,CAAA;;;;;;;;;;;;;;"}
@@ -30,7 +30,13 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
30
30
  const label = vue.computed(() => Slider_utils.getLabel(props.index, rootContext.modelValue?.value?.length ?? 0));
31
31
  const size = shared_useSize.useSize(thumbElement);
32
32
  const orientationSize = vue.computed(() => size[orientation.size].value);
33
- const thumbInBoundsOffset = vue.computed(() => orientationSize.value ? Slider_utils.getThumbInBoundsOffset(orientationSize.value, percent.value, orientation.direction) : 0);
33
+ const thumbInBoundsOffset = vue.computed(() => {
34
+ if (rootContext.thumbAlignment.value === "overflow" || !orientationSize.value) {
35
+ return 0;
36
+ } else {
37
+ return Slider_utils.getThumbInBoundsOffset(orientationSize.value, percent.value, orientation.direction);
38
+ }
39
+ });
34
40
  const isMounted = core.useMounted();
35
41
  vue.onMounted(() => {
36
42
  rootContext.thumbElements.value.push(thumbElement.value);
@@ -1 +1 @@
1
- {"version":3,"file":"SliderThumbImpl.cjs","sources":["../../src/Slider/SliderThumbImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface SliderThumbImplProps extends PrimitiveProps {\n index: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted } from 'vue'\nimport { useMounted } from '@vueuse/core'\nimport { Primitive } from '@/Primitive'\nimport { useCollection } from '@/Collection'\nimport { injectSliderRootContext } from './SliderRoot.vue'\nimport { convertValueToPercentage, getLabel, getThumbInBoundsOffset, injectSliderOrientationContext } from './utils'\nimport { useForwardExpose, useSize } from '@/shared'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<SliderThumbImplProps>()\n\nconst rootContext = injectSliderRootContext()\nconst orientation = injectSliderOrientationContext()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst value = computed(() => rootContext.modelValue?.value?.[props.index])\nconst percent = computed(() => value.value === undefined ? 0 : convertValueToPercentage(value.value, rootContext.min.value ?? 0, rootContext.max.value ?? 100))\nconst label = computed(() => getLabel(props.index, rootContext.modelValue?.value?.length ?? 0))\nconst size = useSize(thumbElement)\nconst orientationSize = computed(() => size[orientation!.size].value)\nconst thumbInBoundsOffset = computed(() => orientationSize.value\n ? getThumbInBoundsOffset(orientationSize.value, percent.value, orientation!.direction)\n : 0)\n\nconst isMounted = useMounted()\nonMounted(() => {\n rootContext.thumbElements.value.push(thumbElement.value)\n})\nonUnmounted(() => {\n const i = rootContext.thumbElements.value.findIndex(i => i === thumbElement.value) ?? -1\n rootContext.thumbElements.value.splice(i, 1)\n})\n</script>\n\n<template>\n <CollectionItem>\n <Primitive\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n role=\"slider\"\n :tabindex=\"rootContext.disabled.value ? undefined : 0\"\n :aria-label=\"$attrs['aria-label'] || label\"\n :data-disabled=\"rootContext.disabled.value ? '' : undefined\"\n :data-orientation=\"rootContext.orientation.value\"\n :aria-valuenow=\"value\"\n :aria-valuemin=\"rootContext.min.value\"\n :aria-valuemax=\"rootContext.max.value\"\n :aria-orientation=\"rootContext.orientation.value\"\n :as-child=\"asChild\"\n :as=\"as\"\n :style=\"{\n transform: 'var(--reka-slider-thumb-transform)',\n position: 'absolute',\n [orientation!.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n display: !isMounted && value === undefined ? 'none' : undefined,\n }\"\n @focus=\"() => {\n rootContext.valueIndexToChangeRef.value = index\n }\"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["injectSliderRootContext","injectSliderOrientationContext","useForwardExpose","useCollection","computed","convertValueToPercentage","getLabel","useSize","getThumbInBoundsOffset","useMounted","onMounted","onUnmounted","i"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,cAAcA,yCAAwB,EAAA;AAC5C,IAAA,MAAM,cAAcC,2CAA+B,EAAA;AAEnD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiBC,wCAAiB,EAAA;AACtE,IAAM,MAAA,EAAE,cAAe,EAAA,GAAIC,mCAAc,EAAA;AAEzC,IAAM,MAAA,KAAA,GAAQC,aAAS,MAAM,WAAA,CAAY,YAAY,KAAQ,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACzE,IAAA,MAAM,UAAUA,YAAS,CAAA,MAAM,MAAM,KAAU,KAAA,SAAA,GAAY,IAAIC,qCAAyB,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,IAAI,KAAS,IAAA,CAAA,EAAG,YAAY,GAAI,CAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAC9J,IAAM,MAAA,KAAA,GAAQD,YAAS,CAAA,MAAME,qBAAS,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,UAAY,EAAA,KAAA,EAAO,MAAU,IAAA,CAAC,CAAC,CAAA;AAC9F,IAAM,MAAA,IAAA,GAAOC,uBAAQ,YAAY,CAAA;AACjC,IAAA,MAAM,kBAAkBH,YAAS,CAAA,MAAM,KAAK,WAAa,CAAA,IAAI,EAAE,KAAK,CAAA;AACpE,IAAA,MAAM,mBAAsB,GAAAA,YAAA,CAAS,MAAM,eAAA,CAAgB,KACvD,GAAAI,mCAAA,CAAuB,eAAgB,CAAA,KAAA,EAAO,OAAQ,CAAA,KAAA,EAAO,WAAa,CAAA,SAAS,IACnF,CAAC,CAAA;AAEL,IAAA,MAAM,YAAYC,eAAW,EAAA;AAC7B,IAAAC,aAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA;AAAA,KACxD,CAAA;AACD,IAAAC,eAAA,CAAY,MAAM;AAChB,MAAM,MAAA,CAAA,GAAI,WAAY,CAAA,aAAA,CAAc,KAAM,CAAA,SAAA,CAAU,CAAAC,EAAKA,KAAAA,EAAAA,KAAM,YAAa,CAAA,KAAK,CAAK,IAAA,EAAA;AACtF,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,KAC5C,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderThumbImpl.cjs","sources":["../../src/Slider/SliderThumbImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface SliderThumbImplProps extends PrimitiveProps {\n index: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted } from 'vue'\nimport { useMounted } from '@vueuse/core'\nimport { Primitive } from '@/Primitive'\nimport { useCollection } from '@/Collection'\nimport { injectSliderRootContext } from './SliderRoot.vue'\nimport { convertValueToPercentage, getLabel, getThumbInBoundsOffset, injectSliderOrientationContext } from './utils'\nimport { useForwardExpose, useSize } from '@/shared'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<SliderThumbImplProps>()\n\nconst rootContext = injectSliderRootContext()\nconst orientation = injectSliderOrientationContext()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst value = computed(() => rootContext.modelValue?.value?.[props.index])\nconst percent = computed(() => value.value === undefined ? 0 : convertValueToPercentage(value.value, rootContext.min.value ?? 0, rootContext.max.value ?? 100))\nconst label = computed(() => getLabel(props.index, rootContext.modelValue?.value?.length ?? 0))\nconst size = useSize(thumbElement)\nconst orientationSize = computed(() => size[orientation!.size].value)\nconst thumbInBoundsOffset = computed(() => {\n if (rootContext.thumbAlignment.value === 'overflow' || !orientationSize.value) {\n return 0\n }\n else {\n return getThumbInBoundsOffset(orientationSize.value, percent.value, orientation!.direction)\n }\n})\n\nconst isMounted = useMounted()\nonMounted(() => {\n rootContext.thumbElements.value.push(thumbElement.value)\n})\nonUnmounted(() => {\n const i = rootContext.thumbElements.value.findIndex(i => i === thumbElement.value) ?? -1\n rootContext.thumbElements.value.splice(i, 1)\n})\n</script>\n\n<template>\n <CollectionItem>\n <Primitive\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n role=\"slider\"\n :tabindex=\"rootContext.disabled.value ? undefined : 0\"\n :aria-label=\"$attrs['aria-label'] || label\"\n :data-disabled=\"rootContext.disabled.value ? '' : undefined\"\n :data-orientation=\"rootContext.orientation.value\"\n :aria-valuenow=\"value\"\n :aria-valuemin=\"rootContext.min.value\"\n :aria-valuemax=\"rootContext.max.value\"\n :aria-orientation=\"rootContext.orientation.value\"\n :as-child=\"asChild\"\n :as=\"as\"\n :style=\"{\n transform: 'var(--reka-slider-thumb-transform)',\n position: 'absolute',\n [orientation!.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n display: !isMounted && value === undefined ? 'none' : undefined,\n }\"\n @focus=\"() => {\n rootContext.valueIndexToChangeRef.value = index\n }\"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["injectSliderRootContext","injectSliderOrientationContext","useForwardExpose","useCollection","computed","convertValueToPercentage","getLabel","useSize","getThumbInBoundsOffset","useMounted","onMounted","onUnmounted","i"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,cAAcA,yCAAwB,EAAA;AAC5C,IAAA,MAAM,cAAcC,2CAA+B,EAAA;AAEnD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiBC,wCAAiB,EAAA;AACtE,IAAM,MAAA,EAAE,cAAe,EAAA,GAAIC,mCAAc,EAAA;AAEzC,IAAM,MAAA,KAAA,GAAQC,aAAS,MAAM,WAAA,CAAY,YAAY,KAAQ,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACzE,IAAA,MAAM,UAAUA,YAAS,CAAA,MAAM,MAAM,KAAU,KAAA,SAAA,GAAY,IAAIC,qCAAyB,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,IAAI,KAAS,IAAA,CAAA,EAAG,YAAY,GAAI,CAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAC9J,IAAM,MAAA,KAAA,GAAQD,YAAS,CAAA,MAAME,qBAAS,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,UAAY,EAAA,KAAA,EAAO,MAAU,IAAA,CAAC,CAAC,CAAA;AAC9F,IAAM,MAAA,IAAA,GAAOC,uBAAQ,YAAY,CAAA;AACjC,IAAA,MAAM,kBAAkBH,YAAS,CAAA,MAAM,KAAK,WAAa,CAAA,IAAI,EAAE,KAAK,CAAA;AACpE,IAAM,MAAA,mBAAA,GAAsBA,aAAS,MAAM;AACzC,MAAA,IAAI,YAAY,cAAe,CAAA,KAAA,KAAU,UAAc,IAAA,CAAC,gBAAgB,KAAO,EAAA;AAC7E,QAAO,OAAA,CAAA;AAAA,OAEJ,MAAA;AACH,QAAA,OAAOI,oCAAuB,eAAgB,CAAA,KAAA,EAAO,OAAQ,CAAA,KAAA,EAAO,YAAa,SAAS,CAAA;AAAA;AAC5F,KACD,CAAA;AAED,IAAA,MAAM,YAAYC,eAAW,EAAA;AAC7B,IAAAC,aAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA;AAAA,KACxD,CAAA;AACD,IAAAC,eAAA,CAAY,MAAM;AAChB,MAAM,MAAA,CAAA,GAAI,WAAY,CAAA,aAAA,CAAc,KAAM,CAAA,SAAA,CAAU,CAAAC,EAAKA,KAAAA,EAAAA,KAAM,YAAa,CAAA,KAAK,CAAK,IAAA,EAAA;AACtF,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,KAC5C,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -28,7 +28,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
28
28
  const label = computed(() => getLabel(props.index, rootContext.modelValue?.value?.length ?? 0));
29
29
  const size = useSize(thumbElement);
30
30
  const orientationSize = computed(() => size[orientation.size].value);
31
- const thumbInBoundsOffset = computed(() => orientationSize.value ? getThumbInBoundsOffset(orientationSize.value, percent.value, orientation.direction) : 0);
31
+ const thumbInBoundsOffset = computed(() => {
32
+ if (rootContext.thumbAlignment.value === "overflow" || !orientationSize.value) {
33
+ return 0;
34
+ } else {
35
+ return getThumbInBoundsOffset(orientationSize.value, percent.value, orientation.direction);
36
+ }
37
+ });
32
38
  const isMounted = useMounted();
33
39
  onMounted(() => {
34
40
  rootContext.thumbElements.value.push(thumbElement.value);
@@ -1 +1 @@
1
- {"version":3,"file":"SliderThumbImpl.js","sources":["../../src/Slider/SliderThumbImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface SliderThumbImplProps extends PrimitiveProps {\n index: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted } from 'vue'\nimport { useMounted } from '@vueuse/core'\nimport { Primitive } from '@/Primitive'\nimport { useCollection } from '@/Collection'\nimport { injectSliderRootContext } from './SliderRoot.vue'\nimport { convertValueToPercentage, getLabel, getThumbInBoundsOffset, injectSliderOrientationContext } from './utils'\nimport { useForwardExpose, useSize } from '@/shared'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<SliderThumbImplProps>()\n\nconst rootContext = injectSliderRootContext()\nconst orientation = injectSliderOrientationContext()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst value = computed(() => rootContext.modelValue?.value?.[props.index])\nconst percent = computed(() => value.value === undefined ? 0 : convertValueToPercentage(value.value, rootContext.min.value ?? 0, rootContext.max.value ?? 100))\nconst label = computed(() => getLabel(props.index, rootContext.modelValue?.value?.length ?? 0))\nconst size = useSize(thumbElement)\nconst orientationSize = computed(() => size[orientation!.size].value)\nconst thumbInBoundsOffset = computed(() => orientationSize.value\n ? getThumbInBoundsOffset(orientationSize.value, percent.value, orientation!.direction)\n : 0)\n\nconst isMounted = useMounted()\nonMounted(() => {\n rootContext.thumbElements.value.push(thumbElement.value)\n})\nonUnmounted(() => {\n const i = rootContext.thumbElements.value.findIndex(i => i === thumbElement.value) ?? -1\n rootContext.thumbElements.value.splice(i, 1)\n})\n</script>\n\n<template>\n <CollectionItem>\n <Primitive\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n role=\"slider\"\n :tabindex=\"rootContext.disabled.value ? undefined : 0\"\n :aria-label=\"$attrs['aria-label'] || label\"\n :data-disabled=\"rootContext.disabled.value ? '' : undefined\"\n :data-orientation=\"rootContext.orientation.value\"\n :aria-valuenow=\"value\"\n :aria-valuemin=\"rootContext.min.value\"\n :aria-valuemax=\"rootContext.max.value\"\n :aria-orientation=\"rootContext.orientation.value\"\n :as-child=\"asChild\"\n :as=\"as\"\n :style=\"{\n transform: 'var(--reka-slider-thumb-transform)',\n position: 'absolute',\n [orientation!.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n display: !isMounted && value === undefined ? 'none' : undefined,\n }\"\n @focus=\"() => {\n rootContext.valueIndexToChangeRef.value = index\n }\"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["i"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,cAAc,uBAAwB,EAAA;AAC5C,IAAA,MAAM,cAAc,8BAA+B,EAAA;AAEnD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiB,gBAAiB,EAAA;AACtE,IAAM,MAAA,EAAE,cAAe,EAAA,GAAI,aAAc,EAAA;AAEzC,IAAM,MAAA,KAAA,GAAQ,SAAS,MAAM,WAAA,CAAY,YAAY,KAAQ,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACzE,IAAA,MAAM,UAAU,QAAS,CAAA,MAAM,MAAM,KAAU,KAAA,SAAA,GAAY,IAAI,wBAAyB,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,IAAI,KAAS,IAAA,CAAA,EAAG,YAAY,GAAI,CAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAC9J,IAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,MAAM,QAAS,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,UAAY,EAAA,KAAA,EAAO,MAAU,IAAA,CAAC,CAAC,CAAA;AAC9F,IAAM,MAAA,IAAA,GAAO,QAAQ,YAAY,CAAA;AACjC,IAAA,MAAM,kBAAkB,QAAS,CAAA,MAAM,KAAK,WAAa,CAAA,IAAI,EAAE,KAAK,CAAA;AACpE,IAAA,MAAM,mBAAsB,GAAA,QAAA,CAAS,MAAM,eAAA,CAAgB,KACvD,GAAA,sBAAA,CAAuB,eAAgB,CAAA,KAAA,EAAO,OAAQ,CAAA,KAAA,EAAO,WAAa,CAAA,SAAS,IACnF,CAAC,CAAA;AAEL,IAAA,MAAM,YAAY,UAAW,EAAA;AAC7B,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA;AAAA,KACxD,CAAA;AACD,IAAA,WAAA,CAAY,MAAM;AAChB,MAAM,MAAA,CAAA,GAAI,WAAY,CAAA,aAAA,CAAc,KAAM,CAAA,SAAA,CAAU,CAAAA,EAAKA,KAAAA,EAAAA,KAAM,YAAa,CAAA,KAAK,CAAK,IAAA,EAAA;AACtF,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,KAC5C,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SliderThumbImpl.js","sources":["../../src/Slider/SliderThumbImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface SliderThumbImplProps extends PrimitiveProps {\n index: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted } from 'vue'\nimport { useMounted } from '@vueuse/core'\nimport { Primitive } from '@/Primitive'\nimport { useCollection } from '@/Collection'\nimport { injectSliderRootContext } from './SliderRoot.vue'\nimport { convertValueToPercentage, getLabel, getThumbInBoundsOffset, injectSliderOrientationContext } from './utils'\nimport { useForwardExpose, useSize } from '@/shared'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<SliderThumbImplProps>()\n\nconst rootContext = injectSliderRootContext()\nconst orientation = injectSliderOrientationContext()\n\nconst { forwardRef, currentElement: thumbElement } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst value = computed(() => rootContext.modelValue?.value?.[props.index])\nconst percent = computed(() => value.value === undefined ? 0 : convertValueToPercentage(value.value, rootContext.min.value ?? 0, rootContext.max.value ?? 100))\nconst label = computed(() => getLabel(props.index, rootContext.modelValue?.value?.length ?? 0))\nconst size = useSize(thumbElement)\nconst orientationSize = computed(() => size[orientation!.size].value)\nconst thumbInBoundsOffset = computed(() => {\n if (rootContext.thumbAlignment.value === 'overflow' || !orientationSize.value) {\n return 0\n }\n else {\n return getThumbInBoundsOffset(orientationSize.value, percent.value, orientation!.direction)\n }\n})\n\nconst isMounted = useMounted()\nonMounted(() => {\n rootContext.thumbElements.value.push(thumbElement.value)\n})\nonUnmounted(() => {\n const i = rootContext.thumbElements.value.findIndex(i => i === thumbElement.value) ?? -1\n rootContext.thumbElements.value.splice(i, 1)\n})\n</script>\n\n<template>\n <CollectionItem>\n <Primitive\n v-bind=\"$attrs\"\n :ref=\"forwardRef\"\n role=\"slider\"\n :tabindex=\"rootContext.disabled.value ? undefined : 0\"\n :aria-label=\"$attrs['aria-label'] || label\"\n :data-disabled=\"rootContext.disabled.value ? '' : undefined\"\n :data-orientation=\"rootContext.orientation.value\"\n :aria-valuenow=\"value\"\n :aria-valuemin=\"rootContext.min.value\"\n :aria-valuemax=\"rootContext.max.value\"\n :aria-orientation=\"rootContext.orientation.value\"\n :as-child=\"asChild\"\n :as=\"as\"\n :style=\"{\n transform: 'var(--reka-slider-thumb-transform)',\n position: 'absolute',\n [orientation!.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n display: !isMounted && value === undefined ? 'none' : undefined,\n }\"\n @focus=\"() => {\n rootContext.valueIndexToChangeRef.value = index\n }\"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["i"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,cAAc,uBAAwB,EAAA;AAC5C,IAAA,MAAM,cAAc,8BAA+B,EAAA;AAEnD,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,YAAA,KAAiB,gBAAiB,EAAA;AACtE,IAAM,MAAA,EAAE,cAAe,EAAA,GAAI,aAAc,EAAA;AAEzC,IAAM,MAAA,KAAA,GAAQ,SAAS,MAAM,WAAA,CAAY,YAAY,KAAQ,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACzE,IAAA,MAAM,UAAU,QAAS,CAAA,MAAM,MAAM,KAAU,KAAA,SAAA,GAAY,IAAI,wBAAyB,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,IAAI,KAAS,IAAA,CAAA,EAAG,YAAY,GAAI,CAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAC9J,IAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,MAAM,QAAS,CAAA,KAAA,CAAM,KAAO,EAAA,WAAA,CAAY,UAAY,EAAA,KAAA,EAAO,MAAU,IAAA,CAAC,CAAC,CAAA;AAC9F,IAAM,MAAA,IAAA,GAAO,QAAQ,YAAY,CAAA;AACjC,IAAA,MAAM,kBAAkB,QAAS,CAAA,MAAM,KAAK,WAAa,CAAA,IAAI,EAAE,KAAK,CAAA;AACpE,IAAM,MAAA,mBAAA,GAAsB,SAAS,MAAM;AACzC,MAAA,IAAI,YAAY,cAAe,CAAA,KAAA,KAAU,UAAc,IAAA,CAAC,gBAAgB,KAAO,EAAA;AAC7E,QAAO,OAAA,CAAA;AAAA,OAEJ,MAAA;AACH,QAAA,OAAO,uBAAuB,eAAgB,CAAA,KAAA,EAAO,OAAQ,CAAA,KAAA,EAAO,YAAa,SAAS,CAAA;AAAA;AAC5F,KACD,CAAA;AAED,IAAA,MAAM,YAAY,UAAW,EAAA;AAC7B,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA;AAAA,KACxD,CAAA;AACD,IAAA,WAAA,CAAY,MAAM;AAChB,MAAM,MAAA,CAAA,GAAI,WAAY,CAAA,aAAA,CAAc,KAAM,CAAA,SAAA,CAAU,CAAAA,EAAKA,KAAAA,EAAAA,KAAM,YAAa,CAAA,KAAK,CAAK,IAAA,EAAA;AACtF,MAAA,WAAA,CAAY,aAAc,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,KAC5C,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}