reka-ui 2.3.1 → 2.3.2

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 (85) hide show
  1. package/dist/Accordion/AccordionItem.cjs +1 -1
  2. package/dist/Accordion/AccordionItem.cjs.map +1 -1
  3. package/dist/Accordion/AccordionItem.js +1 -1
  4. package/dist/Accordion/AccordionItem.js.map +1 -1
  5. package/dist/AlertDialog/AlertDialogContent.cjs +0 -1
  6. package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
  7. package/dist/AlertDialog/AlertDialogContent.js +0 -1
  8. package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
  9. package/dist/Combobox/ComboboxCancel.cjs +1 -1
  10. package/dist/Combobox/ComboboxCancel.cjs.map +1 -1
  11. package/dist/Combobox/ComboboxCancel.js +1 -1
  12. package/dist/Combobox/ComboboxCancel.js.map +1 -1
  13. package/dist/Combobox/ComboboxEmpty.cjs +1 -1
  14. package/dist/Combobox/ComboboxEmpty.cjs.map +1 -1
  15. package/dist/Combobox/ComboboxEmpty.js +1 -1
  16. package/dist/Combobox/ComboboxEmpty.js.map +1 -1
  17. package/dist/Combobox/ComboboxGroup.cjs +1 -1
  18. package/dist/Combobox/ComboboxGroup.cjs.map +1 -1
  19. package/dist/Combobox/ComboboxGroup.js +1 -1
  20. package/dist/Combobox/ComboboxGroup.js.map +1 -1
  21. package/dist/Combobox/ComboboxInput.cjs +7 -10
  22. package/dist/Combobox/ComboboxInput.cjs.map +1 -1
  23. package/dist/Combobox/ComboboxInput.js +7 -10
  24. package/dist/Combobox/ComboboxInput.js.map +1 -1
  25. package/dist/Combobox/ComboboxItem.cjs +2 -2
  26. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  27. package/dist/Combobox/ComboboxItem.js +2 -2
  28. package/dist/Combobox/ComboboxItem.js.map +1 -1
  29. package/dist/Combobox/ComboboxRoot.cjs +23 -33
  30. package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
  31. package/dist/Combobox/ComboboxRoot.js +24 -34
  32. package/dist/Combobox/ComboboxRoot.js.map +1 -1
  33. package/dist/DateRangePicker/DateRangePickerCalendar.cjs +2 -1
  34. package/dist/DateRangePicker/DateRangePickerCalendar.cjs.map +1 -1
  35. package/dist/DateRangePicker/DateRangePickerCalendar.js +2 -1
  36. package/dist/DateRangePicker/DateRangePickerCalendar.js.map +1 -1
  37. package/dist/DateRangePicker/DateRangePickerRoot.cjs +5 -2
  38. package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
  39. package/dist/DateRangePicker/DateRangePickerRoot.js +5 -2
  40. package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
  41. package/dist/Dialog/DialogContent.cjs +0 -1
  42. package/dist/Dialog/DialogContent.cjs.map +1 -1
  43. package/dist/Dialog/DialogContent.js +0 -1
  44. package/dist/Dialog/DialogContent.js.map +1 -1
  45. package/dist/Listbox/ListboxFilter.cjs +1 -1
  46. package/dist/Listbox/ListboxFilter.cjs.map +1 -1
  47. package/dist/Listbox/ListboxFilter.js +1 -1
  48. package/dist/Listbox/ListboxFilter.js.map +1 -1
  49. package/dist/Listbox/ListboxRoot.cjs.map +1 -1
  50. package/dist/Listbox/ListboxRoot.js.map +1 -1
  51. package/dist/Listbox/ListboxVirtualizer.cjs +1 -1
  52. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  53. package/dist/Listbox/ListboxVirtualizer.js +1 -1
  54. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  55. package/dist/Primitive/Slot.cjs +7 -7
  56. package/dist/Primitive/Slot.cjs.map +1 -1
  57. package/dist/Primitive/Slot.js +7 -7
  58. package/dist/Primitive/Slot.js.map +1 -1
  59. package/dist/RangeCalendar/useRangeCalendar.cjs +22 -4
  60. package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
  61. package/dist/RangeCalendar/useRangeCalendar.js +22 -4
  62. package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
  63. package/dist/Select/SelectContent.cjs +8 -4
  64. package/dist/Select/SelectContent.cjs.map +1 -1
  65. package/dist/Select/SelectContent.js +9 -5
  66. package/dist/Select/SelectContent.js.map +1 -1
  67. package/dist/Select/SelectItemText.cjs +1 -1
  68. package/dist/Select/SelectItemText.cjs.map +1 -1
  69. package/dist/Select/SelectItemText.js +2 -2
  70. package/dist/Select/SelectItemText.js.map +1 -1
  71. package/dist/constant/components.cjs.map +1 -1
  72. package/dist/constant/components.js.map +1 -1
  73. package/dist/constant.d.ts +60 -0
  74. package/dist/date/useDateField.cjs +6 -2
  75. package/dist/date/useDateField.cjs.map +1 -1
  76. package/dist/date/useDateField.js +6 -2
  77. package/dist/date/useDateField.js.map +1 -1
  78. package/dist/index.d.ts +14 -14
  79. package/dist/nuxt/index.cjs +14 -14
  80. package/dist/nuxt/index.d.cts +2 -2
  81. package/dist/nuxt/index.d.mts +2 -2
  82. package/dist/nuxt/index.mjs +14 -14
  83. package/dist/resolver/index.cjs +9 -5
  84. package/dist/resolver/index.mjs +9 -5
  85. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxRoot.cjs","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: (event: InputEvent) => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","useCollection","useTypeahead","usePrimitiveElement","useKbd","useDirection","useFormControl","ref","useVModel","compare","createEventHook","nextTick","getFocusIntent","findValuesBetween","watch"],"mappings":"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"}
1
+ {"version":3,"file":"ListboxRoot.cjs","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: () => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","useCollection","useTypeahead","usePrimitiveElement","useKbd","useDirection","useFormControl","ref","useVModel","compare","createEventHook","nextTick","getFocusIntent","findValuesBetween","watch"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxRoot.js","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: (event: InputEvent) => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListboxRoot.js","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: () => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
@@ -105,7 +105,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
105
105
  }
106
106
  });
107
107
  } else {
108
- rootContext.highlightFirstItem(event);
108
+ rootContext.highlightFirstItem();
109
109
  }
110
110
  });
111
111
  rootContext.virtualHighlightHook.on((value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxVirtualizer.cjs","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectListboxRootContext","useParentElement","useCollection","computed","useVirtualizer","Fragment","cloneVNode","compare","queryCheckedElement","refAutoReset","findValuesBetween","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch"],"mappings":"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"}
1
+ {"version":3,"file":"ListboxVirtualizer.cjs","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem()\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectListboxRootContext","useParentElement","useCollection","computed","useVirtualizer","Fragment","cloneVNode","compare","queryCheckedElement","refAutoReset","findValuesBetween","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch"],"mappings":"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"}
@@ -103,7 +103,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
103
103
  }
104
104
  });
105
105
  } else {
106
- rootContext.highlightFirstItem(event);
106
+ rootContext.highlightFirstItem();
107
107
  }
108
108
  });
109
109
  rootContext.virtualHighlightHook.on((value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxVirtualizer.js","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListboxVirtualizer.js","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem()\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAUd,IAAA,MAAM,QAAQ,QAAS,EAAA;AACvB,IAAA,MAAM,cAAc,wBAAyB,EAAA;AAC7C,IAAA,MAAM,WAAW,gBAAiB,EAAA;AAClC,IAAM,MAAA,EAAE,QAAS,EAAA,GAAI,aAA4B,EAAA;AAGjD,IAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,IAAA;AAE9B,IAAM,MAAA,OAAA,GAAU,SAAS,MAAM;AAC7B,MAAA,MAAM,KAAK,QAAS,CAAA,KAAA;AACpB,MAAA,IAAI,CAAC,EAAI,EAAA;AACP,QAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,GAAA,EAAK,CAAE,EAAA;AAAA,OAEvB,MAAA;AACH,QAAM,MAAA,MAAA,GAAS,MAAO,CAAA,gBAAA,CAAiB,EAAE,CAAA;AACzC,QAAO,OAAA;AAAA,UACL,OAAO,MAAO,CAAA,UAAA,CAAW,MAAO,CAAA,iBAAA,IAAqB,OAAO,UAAU,CAAA;AAAA,UACtE,KAAK,MAAO,CAAA,UAAA,CAAW,MAAO,CAAA,eAAA,IAAmB,OAAO,aAAa;AAAA,SACvE;AAAA;AACF,KACD,CAAA;AAED,IAAA,MAAM,WAAc,GAAA,cAAA;AAAA,MAClB;AAAA,QACE,IAAI,kBAAqB,GAAA;AAAE,UAAA,OAAO,QAAQ,KAAM,CAAA,KAAA;AAAA,SAAM;AAAA,QACtD,IAAI,gBAAmB,GAAA;AAAE,UAAA,OAAO,QAAQ,KAAM,CAAA,GAAA;AAAA,SAAI;AAAA,QAClD,IAAI,KAAQ,GAAA;AAAE,UAAA,OAAO,MAAM,OAAQ,CAAA,MAAA;AAAA,SAAO;AAAA,QAC1C,IAAI,UAAa,GAAA;AAAE,UAAO,OAAA,WAAA,CAAY,YAAY,KAAU,KAAA,YAAA;AAAA,SAAa;AAAA,QACzE,YAAe,GAAA;AACb,UAAA,OAAO,MAAM,YAAgB,IAAA,EAAA;AAAA,SAC/B;AAAA,QACA,gBAAmB,GAAA;AAAE,UAAA,OAAO,QAAS,CAAA,KAAA;AAAA,SAAM;AAAA,QAC3C,QAAA,EAAU,MAAM,QAAY,IAAA;AAAA;AAC9B,KACF;AAEA,IAAM,MAAA,gBAAA,GAAmB,SAAS,MAAM,WAAA,CAAY,MAAM,eAAgB,EAAA,CAAE,GAAI,CAAA,CAAC,IAAS,KAAA;AACxF,MAAM,MAAA,WAAA,GAAc,MAAM,OAAS,CAAA;AAAA,QACjC,MAAQ,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QAChC,aAAa,WAAY,CAAA,KAAA;AAAA,QACzB,WAAa,EAAA;AAAA,OACd,EAAE,CAAC,CAAA;AAEJ,MAAA,MAAM,UAAa,GAAA,WAAA,CAAY,IAAS,KAAA,QAAA,IAAY,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,QAAQ,CAClF,GAAA,WAAA,CAAY,QAAS,CAAA,CAAC,CACtB,GAAA,WAAA;AAEJ,MAAO,OAAA;AAAA,QACL,IAAA;AAAA,QACA,EAAA,EAAI,WAAW,UAAY,EAAA;AAAA,UACzB,KAAA,EAAO,CAAG,EAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,UAClB,cAAc,IAAK,CAAA,KAAA;AAAA,UACnB,cAAA,EAAgB,MAAM,OAAQ,CAAA,MAAA;AAAA,UAC9B,eAAA,EAAiB,KAAK,KAAQ,GAAA,CAAA;AAAA,UAC9B,OAAS,EAAA;AAAA,YACP,QAAU,EAAA,UAAA;AAAA,YACV,GAAK,EAAA,CAAA;AAAA,YACL,IAAM,EAAA,CAAA;AAAA,YACN,SAAA,EAAW,CAAc,WAAA,EAAA,IAAA,CAAK,KAAK,CAAA,GAAA,CAAA;AAAA,YACnC,cAAgB,EAAA;AAAA;AAClB,SACD;AAAA,OACH;AAAA,KACD,CAAC,CAAA;AAEF,IAAY,WAAA,CAAA,gBAAA,CAAiB,EAAG,CAAA,CAAC,KAAU,KAAA;AACzC,MAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,CAAC,MAAW,KAAA;AAChD,QAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,UAAA,CAAW,KAAK,CAAA;AAC5C,UAAO,OAAA,OAAA,CAAQ,QAAQ,WAAY,CAAA,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG,YAAY,EAAE,CAAA;AAAA;AAEtE,UAAA,OAAO,QAAQ,MAAQ,EAAA,WAAA,CAAY,UAAW,CAAA,KAAA,EAAQ,YAAY,EAAE,CAAA;AAAA,OACvE,CAAA;AACD,MAAA,IAAI,UAAU,EAAI,EAAA;AAChB,QAAA,KAAA,EAAO,cAAe,EAAA;AAEtB,QAAA,WAAA,CAAY,MAAM,aAAc,CAAA,KAAA,EAAO,EAAE,KAAA,EAAO,SAAS,CAAA;AACzD,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAM,MAAA,IAAA,GAAO,mBAAoB,CAAA,QAAA,CAAS,KAAK,CAAA;AAC/C,UAAA,IAAI,IAAM,EAAA;AACR,YAAA,WAAA,CAAY,gBAAgB,IAAI,CAAA;AAChC,YAAI,IAAA,KAAA;AACF,cAAA,IAAA,EAAM,KAAM,EAAA;AAAA;AAChB,SACD,CAAA;AAAA,OAEE,MAAA;AACH,QAAA,WAAA,CAAY,kBAAmB,EAAA;AAAA;AACjC,KACD,CAAA;AAED,IAAY,WAAA,CAAA,oBAAA,CAAqB,EAAG,CAAA,CAAC,KAAU,KAAA;AAC7C,MAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,CAAC,MAAW,KAAA;AAChD,QAAA,OAAO,OAAQ,CAAA,MAAA,EAAQ,KAAO,EAAA,WAAA,CAAY,EAAE,CAAA;AAAA,OAC7C,CAAA;AACD,MAAA,WAAA,CAAY,MAAM,aAAc,CAAA,KAAA,EAAO,EAAE,KAAA,EAAO,SAAS,CAAA;AACzD,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAM,MAAA,IAAA,GAAO,mBAAoB,CAAA,QAAA,CAAS,KAAK,CAAA;AAC/C,QAAI,IAAA,IAAA;AACF,UAAA,WAAA,CAAY,gBAAgB,IAAI,CAAA;AAAA,OACnC,CAAA;AAAA,KACF,CAAA;AAGD,IAAM,MAAA,MAAA,GAAS,YAAa,CAAA,EAAA,EAAI,GAAI,CAAA;AACpC,IAAM,MAAA,mBAAA,GAAsB,SAAS,MAAM;AACzC,MAAM,MAAA,gBAAA,GAAmB,CAAC,MAAc,KAAA;AACtC,QAAA,IAAI,KAAM,CAAA,WAAA;AACR,UAAO,OAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAAA;AAE/B,UAAO,OAAA,MAAA,EAAQ,QAAS,EAAA,CAAE,WAAY,EAAA;AAAA,OAC1C;AAEA,MAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,QAAQ,KAAW,MAAA;AAAA,QAC3C,KAAA;AAAA,QACA,WAAA,EAAa,iBAAiB,MAAM;AAAA,OACpC,CAAA,CAAA;AAAA,KACH,CAAA;AAED,IAAS,SAAA,qBAAA,CAAsB,OAAc,MAA4C,EAAA;AACvF,MAAA,IAAI,CAAC,WAAA,CAAY,UAAY,EAAA,KAAA,IAAS,CAAC,WAAA,CAAY,QAAS,CAAA,KAAA,IAAS,CAAC,KAAA,CAAM,OAAQ,CAAA,WAAA,CAAY,WAAW,KAAK,CAAA;AAC9G,QAAA;AAEF,MAAM,MAAA,UAAA,GAAa,UAAW,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,GAAA,CAAI,OAAQ,CAAA,QAAA,KAAa,EAAE,CAAA;AACvE,MAAM,MAAA,SAAA,GAAY,WAAW,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,GAAQ,KAAA,WAAA,CAAY,kBAAmB,CAAA,KAAK,CAAG,EAAA,KAAA;AACxF,MAAA,IAAI,CAAC,SAAA;AACH,QAAA;AAEF,MAAA,IAAI,KAAoB,GAAA,IAAA;AACxB,MAAA,QAAQ,MAAQ;AAAA,QACd,KAAK,MAAA;AAAA,QACL,KAAK,MAAQ,EAAA;AACX,UAAA,KAAA,GAAQ,kBAAkB,KAAM,CAAA,OAAA,EAAS,WAAY,CAAA,UAAA,CAAW,OAAY,SAAS,CAAA;AACrF,UAAA;AAAA;AACF,QACA,KAAK,OAAS,EAAA;AACZ,UAAQ,KAAA,GAAA,iBAAA,CAAkB,MAAM,OAAS,EAAA,WAAA,CAAY,WAAW,KAAY,EAAA,KAAA,CAAM,OAAU,GAAA,CAAC,CAAC,CAAA;AAC9F,UAAA;AAAA;AACF,QACA,KAAK,MAAQ,EAAA;AACX,UAAA,KAAA,GAAQ,iBAAkB,CAAA,KAAA,CAAM,OAAS,EAAA,WAAA,CAAY,UAAW,CAAA,KAAA,EAAY,KAAM,CAAA,OAAA,GAAU,KAAM,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAC,CAAC,CAAA;AACrH,UAAA;AAAA;AACF;AAEF,MAAA,WAAA,CAAY,WAAW,KAAQ,GAAA,KAAA;AAAA;AAGjC,IAAY,WAAA,CAAA,kBAAA,CAAmB,EAAG,CAAA,CAAC,KAAU,KAAA;AAC3C,MAAA,MAAM,SAAY,GAAA,KAAA,CAAM,MAAU,IAAA,KAAA,CAAM,WAAW,KAAM,CAAA,OAAA;AACzD,MAAA,MAAM,QAAW,GAAA,KAAA,CAAM,GAAQ,KAAA,KAAA,IAAS,CAAC,SAAA;AACzC,MAAI,IAAA,QAAA;AACF,QAAA;AAEF,MAAI,IAAA,MAAA,GAAS,uBAAwB,CAAA,KAAA,CAAM,GAAG,CAAA;AAG9C,MAAA,IAAI,aAAa,KAAM,CAAA,GAAA,KAAQ,GAAO,IAAA,WAAA,CAAY,SAAS,KAAO,EAAA;AAChE,QAAA,KAAA,CAAM,cAAe,EAAA;AACrB,QAAA,WAAA,CAAY,UAAW,CAAA,KAAA,GAAQ,CAAC,GAAG,MAAM,OAAO,CAAA;AAEhD,QAAS,MAAA,GAAA,MAAA;AAAA,OACX,MAAA,IACS,KAAM,CAAA,QAAA,IAAY,MAAQ,EAAA;AACjC,QAAA,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAAA;AAGrC,MAAA,IAAI,CAAC,OAAS,EAAA,MAAM,CAAE,CAAA,QAAA,CAAS,MAAM,CAAG,EAAA;AACtC,QAAA,KAAA,CAAM,cAAe,EAAA;AAErB,QAAA,MAAM,QAAQ,MAAW,KAAA,OAAA,GAAU,CAAI,GAAA,KAAA,CAAM,QAAQ,MAAS,GAAA,CAAA;AAC9D,QAAY,WAAA,CAAA,KAAA,CAAM,cAAc,KAAK,CAAA;AACrC,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,MAAM,QAAQ,QAAS,EAAA;AACvB,UAAM,MAAA,IAAA,GAAO,WAAW,OAAU,GAAA,KAAA,CAAM,CAAC,CAAI,GAAA,KAAA,CAAM,KAAM,CAAA,MAAA,GAAS,CAAC,CAAA;AACnE,UAAI,IAAA,IAAA;AACF,YAAY,WAAA,CAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,SACvC,CAAA;AAAA,OAEM,MAAA,IAAA,CAAC,MAAU,IAAA,CAAC,SAAW,EAAA;AAC9B,QAAA,MAAA,CAAO,SAAS,KAAM,CAAA,GAAA;AACtB,QAAA,MAAM,eAAe,MAAO,CAAA,gBAAA,EAAoB,EAAA,YAAA,CAAa,YAAY,CAAC,CAAA;AAC1E,QAAA,MAAM,YAAe,GAAA,mBAAA,CAAoB,KAAM,CAAA,YAAY,CAAE,CAAA,WAAA;AAC7D,QAAA,MAAM,kBAAkB,mBAAoB,CAAA,KAAA,CAAM,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,eAAe,EAAE,CAAA;AAC9E,QAAA,MAAM,IAAO,GAAA,YAAA,CAAa,eAAiB,EAAA,MAAA,CAAO,OAAO,YAAY,CAAA;AAErE,QAAA,MAAM,YAAY,mBAAoB,CAAA,KAAA,CAAM,KAAK,CAAU,MAAA,KAAA,MAAA,CAAO,gBAAgB,IAAI,CAAA;AACtF,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,WAAA,CAAY,MAAM,aAAc,CAAA,SAAA,CAAU,OAAO,EAAE,KAAA,EAAO,SAAS,CAAA;AACnE,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,MAAM,OAAO,QAAS,CAAA,KAAA,CAAM,cAAc,CAAgB,aAAA,EAAA,SAAA,CAAU,KAAK,CAAI,EAAA,CAAA,CAAA;AAC7E,YAAA,IAAI,IAAgB,YAAA,WAAA;AAClB,cAAA,WAAA,CAAY,gBAAgB,IAAI,CAAA;AAAA,WACnC,CAAA;AAAA;AACH;AACF,KACD,CAAA;;;;;;;;;;;;;;;;;;;;;;"}
@@ -10,18 +10,18 @@ const Slot = vue.defineComponent({
10
10
  return () => {
11
11
  if (!slots.default)
12
12
  return null;
13
- const childrens = shared_renderSlotFragments.renderSlotFragments(slots.default());
14
- const firstNonCommentChildrenIndex = childrens.findIndex((child) => child.type !== vue.Comment);
13
+ const children = shared_renderSlotFragments.renderSlotFragments(slots.default());
14
+ const firstNonCommentChildrenIndex = children.findIndex((child) => child.type !== vue.Comment);
15
15
  if (firstNonCommentChildrenIndex === -1)
16
- return childrens;
17
- const firstNonCommentChildren = childrens[firstNonCommentChildrenIndex];
16
+ return children;
17
+ const firstNonCommentChildren = children[firstNonCommentChildrenIndex];
18
18
  delete firstNonCommentChildren.props?.ref;
19
19
  const mergedProps = firstNonCommentChildren.props ? vue.mergeProps(attrs, firstNonCommentChildren.props) : attrs;
20
20
  const cloned = vue.cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps);
21
- if (childrens.length === 1)
21
+ if (children.length === 1)
22
22
  return cloned;
23
- childrens[firstNonCommentChildrenIndex] = cloned;
24
- return childrens;
23
+ children[firstNonCommentChildrenIndex] = cloned;
24
+ return children;
25
25
  };
26
26
  }
27
27
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Slot.cjs","sources":["../../src/Primitive/Slot.ts"],"sourcesContent":["import { cloneVNode, Comment, defineComponent, mergeProps } from 'vue'\nimport { renderSlotFragments } from '@/shared'\n\nexport const Slot = defineComponent({\n name: 'PrimitiveSlot',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => {\n if (!slots.default)\n return null\n\n const childrens = renderSlotFragments(slots.default())\n const firstNonCommentChildrenIndex = childrens.findIndex(child => child.type !== Comment)\n if (firstNonCommentChildrenIndex === -1)\n return childrens\n\n const firstNonCommentChildren = childrens[firstNonCommentChildrenIndex]\n\n // Remove props ref from being inferred\n delete firstNonCommentChildren.props?.ref\n\n // Manually merge props to ensure `firstNonCommentChildren.props`\n // has higher priority than `attrs` and can override `attrs`.\n // Otherwise `cloneVNode(firstNonCommentChildren, attrs)` will\n // prioritize `attrs` and override `firstNonCommentChildren.props`.\n const mergedProps = firstNonCommentChildren.props\n ? mergeProps(attrs, firstNonCommentChildren.props)\n : attrs\n const cloned = cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps)\n\n if (childrens.length === 1)\n return cloned\n\n childrens[firstNonCommentChildrenIndex] = cloned\n return childrens\n }\n },\n})\n"],"names":["defineComponent","renderSlotFragments","Comment","mergeProps","cloneVNode"],"mappings":";;;;;AAGO,MAAM,OAAOA,mBAAgB,CAAA;AAAA,EAClC,IAAM,EAAA,eAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAAA,EACd,KAAM,CAAA,CAAA,EAAG,EAAE,KAAA,EAAO,OAAS,EAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,KAAM,CAAA,OAAA;AACT,QAAO,OAAA,IAAA;AAET,MAAA,MAAM,SAAY,GAAAC,8CAAA,CAAoB,KAAM,CAAA,OAAA,EAAS,CAAA;AACrD,MAAA,MAAM,+BAA+B,SAAU,CAAA,SAAA,CAAU,CAAS,KAAA,KAAA,KAAA,CAAM,SAASC,WAAO,CAAA;AACxF,MAAA,IAAI,4BAAiC,KAAA,EAAA;AACnC,QAAO,OAAA,SAAA;AAET,MAAM,MAAA,uBAAA,GAA0B,UAAU,4BAA4B,CAAA;AAGtE,MAAA,OAAO,wBAAwB,KAAO,EAAA,GAAA;AAMtC,MAAA,MAAM,cAAc,uBAAwB,CAAA,KAAA,GACxCC,eAAW,KAAO,EAAA,uBAAA,CAAwB,KAAK,CAC/C,GAAA,KAAA;AACJ,MAAM,MAAA,MAAA,GAASC,eAAW,EAAE,GAAG,yBAAyB,KAAO,EAAA,EAAG,EAAA,EAAG,WAAW,CAAA;AAEhF,MAAA,IAAI,UAAU,MAAW,KAAA,CAAA;AACvB,QAAO,OAAA,MAAA;AAET,MAAA,SAAA,CAAU,4BAA4B,CAAI,GAAA,MAAA;AAC1C,MAAO,OAAA,SAAA;AAAA,KACT;AAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"Slot.cjs","sources":["../../src/Primitive/Slot.ts"],"sourcesContent":["import { cloneVNode, Comment, defineComponent, mergeProps } from 'vue'\nimport { renderSlotFragments } from '@/shared'\n\nexport const Slot = defineComponent({\n name: 'PrimitiveSlot',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => {\n if (!slots.default)\n return null\n\n const children = renderSlotFragments(slots.default())\n const firstNonCommentChildrenIndex = children.findIndex(child => child.type !== Comment)\n if (firstNonCommentChildrenIndex === -1)\n return children\n\n const firstNonCommentChildren = children[firstNonCommentChildrenIndex]\n\n // Remove props ref from being inferred\n delete firstNonCommentChildren.props?.ref\n\n // Manually merge props to ensure `firstNonCommentChildren.props`\n // has higher priority than `attrs` and can override `attrs`.\n // Otherwise `cloneVNode(firstNonCommentChildren, attrs)` will\n // prioritize `attrs` and override `firstNonCommentChildren.props`.\n const mergedProps = firstNonCommentChildren.props\n ? mergeProps(attrs, firstNonCommentChildren.props)\n : attrs\n const cloned = cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps)\n\n if (children.length === 1)\n return cloned\n\n children[firstNonCommentChildrenIndex] = cloned\n return children\n }\n },\n})\n"],"names":["defineComponent","renderSlotFragments","Comment","mergeProps","cloneVNode"],"mappings":";;;;;AAGO,MAAM,OAAOA,mBAAgB,CAAA;AAAA,EAClC,IAAM,EAAA,eAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAAA,EACd,KAAM,CAAA,CAAA,EAAG,EAAE,KAAA,EAAO,OAAS,EAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,KAAM,CAAA,OAAA;AACT,QAAO,OAAA,IAAA;AAET,MAAA,MAAM,QAAW,GAAAC,8CAAA,CAAoB,KAAM,CAAA,OAAA,EAAS,CAAA;AACpD,MAAA,MAAM,+BAA+B,QAAS,CAAA,SAAA,CAAU,CAAS,KAAA,KAAA,KAAA,CAAM,SAASC,WAAO,CAAA;AACvF,MAAA,IAAI,4BAAiC,KAAA,EAAA;AACnC,QAAO,OAAA,QAAA;AAET,MAAM,MAAA,uBAAA,GAA0B,SAAS,4BAA4B,CAAA;AAGrE,MAAA,OAAO,wBAAwB,KAAO,EAAA,GAAA;AAMtC,MAAA,MAAM,cAAc,uBAAwB,CAAA,KAAA,GACxCC,eAAW,KAAO,EAAA,uBAAA,CAAwB,KAAK,CAC/C,GAAA,KAAA;AACJ,MAAM,MAAA,MAAA,GAASC,eAAW,EAAE,GAAG,yBAAyB,KAAO,EAAA,EAAG,EAAA,EAAG,WAAW,CAAA;AAEhF,MAAA,IAAI,SAAS,MAAW,KAAA,CAAA;AACtB,QAAO,OAAA,MAAA;AAET,MAAA,QAAA,CAAS,4BAA4B,CAAI,GAAA,MAAA;AACzC,MAAO,OAAA,QAAA;AAAA,KACT;AAAA;AAEJ,CAAC;;;;"}
@@ -8,18 +8,18 @@ const Slot = defineComponent({
8
8
  return () => {
9
9
  if (!slots.default)
10
10
  return null;
11
- const childrens = renderSlotFragments(slots.default());
12
- const firstNonCommentChildrenIndex = childrens.findIndex((child) => child.type !== Comment);
11
+ const children = renderSlotFragments(slots.default());
12
+ const firstNonCommentChildrenIndex = children.findIndex((child) => child.type !== Comment);
13
13
  if (firstNonCommentChildrenIndex === -1)
14
- return childrens;
15
- const firstNonCommentChildren = childrens[firstNonCommentChildrenIndex];
14
+ return children;
15
+ const firstNonCommentChildren = children[firstNonCommentChildrenIndex];
16
16
  delete firstNonCommentChildren.props?.ref;
17
17
  const mergedProps = firstNonCommentChildren.props ? mergeProps(attrs, firstNonCommentChildren.props) : attrs;
18
18
  const cloned = cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps);
19
- if (childrens.length === 1)
19
+ if (children.length === 1)
20
20
  return cloned;
21
- childrens[firstNonCommentChildrenIndex] = cloned;
22
- return childrens;
21
+ children[firstNonCommentChildrenIndex] = cloned;
22
+ return children;
23
23
  };
24
24
  }
25
25
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Slot.js","sources":["../../src/Primitive/Slot.ts"],"sourcesContent":["import { cloneVNode, Comment, defineComponent, mergeProps } from 'vue'\nimport { renderSlotFragments } from '@/shared'\n\nexport const Slot = defineComponent({\n name: 'PrimitiveSlot',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => {\n if (!slots.default)\n return null\n\n const childrens = renderSlotFragments(slots.default())\n const firstNonCommentChildrenIndex = childrens.findIndex(child => child.type !== Comment)\n if (firstNonCommentChildrenIndex === -1)\n return childrens\n\n const firstNonCommentChildren = childrens[firstNonCommentChildrenIndex]\n\n // Remove props ref from being inferred\n delete firstNonCommentChildren.props?.ref\n\n // Manually merge props to ensure `firstNonCommentChildren.props`\n // has higher priority than `attrs` and can override `attrs`.\n // Otherwise `cloneVNode(firstNonCommentChildren, attrs)` will\n // prioritize `attrs` and override `firstNonCommentChildren.props`.\n const mergedProps = firstNonCommentChildren.props\n ? mergeProps(attrs, firstNonCommentChildren.props)\n : attrs\n const cloned = cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps)\n\n if (childrens.length === 1)\n return cloned\n\n childrens[firstNonCommentChildrenIndex] = cloned\n return childrens\n }\n },\n})\n"],"names":[],"mappings":";;;AAGO,MAAM,OAAO,eAAgB,CAAA;AAAA,EAClC,IAAM,EAAA,eAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAAA,EACd,KAAM,CAAA,CAAA,EAAG,EAAE,KAAA,EAAO,OAAS,EAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,KAAM,CAAA,OAAA;AACT,QAAO,OAAA,IAAA;AAET,MAAA,MAAM,SAAY,GAAA,mBAAA,CAAoB,KAAM,CAAA,OAAA,EAAS,CAAA;AACrD,MAAA,MAAM,+BAA+B,SAAU,CAAA,SAAA,CAAU,CAAS,KAAA,KAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACxF,MAAA,IAAI,4BAAiC,KAAA,EAAA;AACnC,QAAO,OAAA,SAAA;AAET,MAAM,MAAA,uBAAA,GAA0B,UAAU,4BAA4B,CAAA;AAGtE,MAAA,OAAO,wBAAwB,KAAO,EAAA,GAAA;AAMtC,MAAA,MAAM,cAAc,uBAAwB,CAAA,KAAA,GACxC,WAAW,KAAO,EAAA,uBAAA,CAAwB,KAAK,CAC/C,GAAA,KAAA;AACJ,MAAM,MAAA,MAAA,GAAS,WAAW,EAAE,GAAG,yBAAyB,KAAO,EAAA,EAAG,EAAA,EAAG,WAAW,CAAA;AAEhF,MAAA,IAAI,UAAU,MAAW,KAAA,CAAA;AACvB,QAAO,OAAA,MAAA;AAET,MAAA,SAAA,CAAU,4BAA4B,CAAI,GAAA,MAAA;AAC1C,MAAO,OAAA,SAAA;AAAA,KACT;AAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"Slot.js","sources":["../../src/Primitive/Slot.ts"],"sourcesContent":["import { cloneVNode, Comment, defineComponent, mergeProps } from 'vue'\nimport { renderSlotFragments } from '@/shared'\n\nexport const Slot = defineComponent({\n name: 'PrimitiveSlot',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => {\n if (!slots.default)\n return null\n\n const children = renderSlotFragments(slots.default())\n const firstNonCommentChildrenIndex = children.findIndex(child => child.type !== Comment)\n if (firstNonCommentChildrenIndex === -1)\n return children\n\n const firstNonCommentChildren = children[firstNonCommentChildrenIndex]\n\n // Remove props ref from being inferred\n delete firstNonCommentChildren.props?.ref\n\n // Manually merge props to ensure `firstNonCommentChildren.props`\n // has higher priority than `attrs` and can override `attrs`.\n // Otherwise `cloneVNode(firstNonCommentChildren, attrs)` will\n // prioritize `attrs` and override `firstNonCommentChildren.props`.\n const mergedProps = firstNonCommentChildren.props\n ? mergeProps(attrs, firstNonCommentChildren.props)\n : attrs\n const cloned = cloneVNode({ ...firstNonCommentChildren, props: {} }, mergedProps)\n\n if (children.length === 1)\n return cloned\n\n children[firstNonCommentChildrenIndex] = cloned\n return children\n }\n },\n})\n"],"names":[],"mappings":";;;AAGO,MAAM,OAAO,eAAgB,CAAA;AAAA,EAClC,IAAM,EAAA,eAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAAA,EACd,KAAM,CAAA,CAAA,EAAG,EAAE,KAAA,EAAO,OAAS,EAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,KAAM,CAAA,OAAA;AACT,QAAO,OAAA,IAAA;AAET,MAAA,MAAM,QAAW,GAAA,mBAAA,CAAoB,KAAM,CAAA,OAAA,EAAS,CAAA;AACpD,MAAA,MAAM,+BAA+B,QAAS,CAAA,SAAA,CAAU,CAAS,KAAA,KAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACvF,MAAA,IAAI,4BAAiC,KAAA,EAAA;AACnC,QAAO,OAAA,QAAA;AAET,MAAM,MAAA,uBAAA,GAA0B,SAAS,4BAA4B,CAAA;AAGrE,MAAA,OAAO,wBAAwB,KAAO,EAAA,GAAA;AAMtC,MAAA,MAAM,cAAc,uBAAwB,CAAA,KAAA,GACxC,WAAW,KAAO,EAAA,uBAAA,CAAwB,KAAK,CAC/C,GAAA,KAAA;AACJ,MAAM,MAAA,MAAA,GAAS,WAAW,EAAE,GAAG,yBAAyB,KAAO,EAAA,EAAG,EAAA,EAAG,WAAW,CAAA;AAEhF,MAAA,IAAI,SAAS,MAAW,KAAA,CAAA;AACtB,QAAO,OAAA,MAAA;AAET,MAAA,QAAA,CAAS,4BAA4B,CAAI,GAAA,MAAA;AACzC,MAAO,OAAA,QAAA;AAAA,KACT;AAAA;AAEJ,CAAC;;;;"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  const date = require('@internationalized/date');
4
4
  const vue = require('vue');
5
+ const date_calendar = require('../date/calendar.cjs');
5
6
  const date_comparators = require('../date/comparators.cjs');
6
7
 
7
8
  function useRangeCalendarState(props) {
@@ -50,10 +51,27 @@ function useRangeCalendarState(props) {
50
51
  const rangeIsDateDisabled = (date$1) => {
51
52
  if (props.isDateDisabled(date$1))
52
53
  return true;
53
- if (!props.maximumDays?.value || !props.start.value || props.end.value || date.isSameDay(props.start.value, date$1))
54
+ if (props.maximumDays?.value) {
55
+ if (props.start.value && props.end.value) {
56
+ if (props.fixedDate.value) {
57
+ const diff = date_calendar.getDaysBetween(props.start.value, props.end.value).length;
58
+ if (diff <= props.maximumDays.value) {
59
+ const daysLeft = props.maximumDays.value - diff - 1;
60
+ const startLimit = props.start.value.subtract({ days: daysLeft });
61
+ const endLimit = props.end.value.add({ days: daysLeft });
62
+ return !date_comparators.isBetween(date$1, startLimit, endLimit);
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ if (props.start.value) {
68
+ const maxDate = props.start.value.add({ days: props.maximumDays.value });
69
+ const minDate = props.start.value.subtract({ days: props.maximumDays.value });
70
+ return !date_comparators.isBetween(date$1, minDate, maxDate);
71
+ }
72
+ }
73
+ if (!props.start.value || props.end.value || date.isSameDay(props.start.value, date$1))
54
74
  return false;
55
- if (Math.abs(date$1.compare(props.start.value)) > props.maximumDays.value)
56
- return true;
57
75
  return false;
58
76
  };
59
77
  const isDateHighlightable = (date) => {
@@ -75,7 +93,7 @@ function useRangeCalendarState(props) {
75
93
  end
76
94
  };
77
95
  }
78
- if (props.maximumDays?.value && !props.end.value && Math.abs(end.compare(start)) > props.maximumDays.value) {
96
+ if (props.maximumDays?.value && !props.end.value) {
79
97
  const cappedEnd = isStartBeforeFocused ? start.add({ days: props.maximumDays.value }) : start.subtract({ days: props.maximumDays.value });
80
98
  return {
81
99
  start,
@@ -1 +1 @@
1
- {"version":3,"file":"useRangeCalendar.cjs","sources":["../../src/RangeCalendar/useRangeCalendar.ts"],"sourcesContent":["/*\n * Adapted from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/range-calendar/create.ts\n*/\n\nimport type { DateValue } from '@internationalized/date'\nimport type { Ref } from 'vue'\nimport type { Matcher } from '@/date'\nimport { isSameDay } from '@internationalized/date'\nimport { computed } from 'vue'\nimport { areAllDaysBetweenValid, isBefore, isBetween } from '@/date'\n\nexport type UseRangeCalendarProps = {\n start: Ref<DateValue | undefined>\n end: Ref<DateValue | undefined>\n isDateDisabled: Matcher\n isDateUnavailable: Matcher\n isDateHighlightable?: Matcher\n focusedValue: Ref<DateValue | undefined>\n allowNonContiguousRanges: Ref<boolean>\n fixedDate: Ref<'start' | 'end' | undefined>\n maximumDays?: Ref<number | undefined>\n}\n\nexport function useRangeCalendarState(props: UseRangeCalendarProps) {\n const isStartInvalid = computed(() => {\n if (!props.start.value)\n return false\n if (props.isDateDisabled(props.start.value))\n return true\n return false\n })\n\n const isEndInvalid = computed(() => {\n if (!props.end.value)\n return false\n if (props.isDateDisabled(props.end.value))\n return true\n return false\n })\n\n const isInvalid = computed(\n () => {\n if (isStartInvalid.value || isEndInvalid.value)\n return false\n if (props.start.value && props.end.value && isBefore(props.end.value, props.start.value))\n return true\n return false\n },\n )\n\n const isSelectionStart = (date: DateValue) => {\n if (!props.start.value)\n return false\n return isSameDay(props.start.value, date)\n }\n\n const isSelectionEnd = (date: DateValue) => {\n if (!props.end.value)\n return false\n return isSameDay(props.end.value, date)\n }\n\n const isSelected = (date: DateValue) => {\n if (props.start.value && isSameDay(props.start.value, date))\n return true\n if (props.end.value && isSameDay(props.end.value, date))\n return true\n if (props.end.value && props.start.value)\n return isBetween(date, props.start.value, props.end.value)\n\n return false\n }\n\n // Check if a date exceeds maximum days limit from the start date\n const rangeIsDateDisabled = (date: DateValue) => {\n if (props.isDateDisabled(date))\n return true\n\n if (!props.maximumDays?.value || !props.start.value || props.end.value || isSameDay(props.start.value, date))\n return false\n\n // Check if exceeds maximum days limit\n if (Math.abs(date.compare(props.start.value)) > props.maximumDays.value)\n return true\n\n return false\n }\n\n const isDateHighlightable = (date: DateValue) => {\n if (props.isDateHighlightable?.(date))\n return true\n return false\n }\n\n const highlightedRange = computed(() => {\n if (props.start.value && props.end.value && !props.fixedDate.value)\n return null\n if (!props.start.value || !props.focusedValue.value)\n return null\n\n const isStartBeforeFocused = isBefore(props.start.value, props.focusedValue.value)\n const start = isStartBeforeFocused ? props.start.value : props.focusedValue.value\n const end = isStartBeforeFocused ? props.focusedValue.value : props.start.value\n\n if (isSameDay(start, end)) {\n return {\n start,\n end,\n }\n }\n\n // If maximum days is set and the range exceeds it, limit the highlight\n // We only apply this when we're in the middle of a selection (no end date yet)\n if (props.maximumDays?.value && !props.end.value && Math.abs(end.compare(start)) > props.maximumDays.value) {\n // Determine the direction of selection and limit to maximum days\n const cappedEnd = isStartBeforeFocused\n ? start.add({ days: props.maximumDays.value })\n : start.subtract({ days: props.maximumDays.value })\n\n return {\n start,\n end: cappedEnd,\n }\n }\n\n const isValid = areAllDaysBetweenValid(start, end, props.allowNonContiguousRanges.value ? () => false : props.isDateUnavailable, rangeIsDateDisabled, props.isDateHighlightable)\n if (isValid) {\n return {\n start,\n end,\n }\n }\n return null\n })\n\n const isHighlightedStart = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.start)\n return false\n return isSameDay(highlightedRange.value.start, date)\n }\n\n const isHighlightedEnd = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.end)\n return false\n return isSameDay(highlightedRange.value.end, date)\n }\n\n return {\n isInvalid,\n isSelected,\n isDateHighlightable,\n highlightedRange,\n isSelectionStart,\n isSelectionEnd,\n isHighlightedStart,\n isHighlightedEnd,\n isDateDisabled: rangeIsDateDisabled,\n }\n}\n"],"names":["computed","isBefore","date","isSameDay","isBetween","areAllDaysBetweenValid"],"mappings":"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"}
1
+ {"version":3,"file":"useRangeCalendar.cjs","sources":["../../src/RangeCalendar/useRangeCalendar.ts"],"sourcesContent":["/*\n * Adapted from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/range-calendar/create.ts\n*/\n\nimport type { DateValue } from '@internationalized/date'\nimport type { Ref } from 'vue'\nimport type { Matcher } from '@/date'\nimport { isSameDay } from '@internationalized/date'\nimport { computed } from 'vue'\nimport { areAllDaysBetweenValid, getDaysBetween, isBefore, isBetween } from '@/date'\n\nexport type UseRangeCalendarProps = {\n start: Ref<DateValue | undefined>\n end: Ref<DateValue | undefined>\n isDateDisabled: Matcher\n isDateUnavailable: Matcher\n isDateHighlightable?: Matcher\n focusedValue: Ref<DateValue | undefined>\n allowNonContiguousRanges: Ref<boolean>\n fixedDate: Ref<'start' | 'end' | undefined>\n maximumDays?: Ref<number | undefined>\n}\n\nexport function useRangeCalendarState(props: UseRangeCalendarProps) {\n const isStartInvalid = computed(() => {\n if (!props.start.value)\n return false\n if (props.isDateDisabled(props.start.value))\n return true\n return false\n })\n\n const isEndInvalid = computed(() => {\n if (!props.end.value)\n return false\n if (props.isDateDisabled(props.end.value))\n return true\n return false\n })\n\n const isInvalid = computed(\n () => {\n if (isStartInvalid.value || isEndInvalid.value)\n return false\n if (props.start.value && props.end.value && isBefore(props.end.value, props.start.value))\n return true\n return false\n },\n )\n\n const isSelectionStart = (date: DateValue) => {\n if (!props.start.value)\n return false\n return isSameDay(props.start.value, date)\n }\n\n const isSelectionEnd = (date: DateValue) => {\n if (!props.end.value)\n return false\n return isSameDay(props.end.value, date)\n }\n\n const isSelected = (date: DateValue) => {\n if (props.start.value && isSameDay(props.start.value, date))\n return true\n if (props.end.value && isSameDay(props.end.value, date))\n return true\n if (props.end.value && props.start.value)\n return isBetween(date, props.start.value, props.end.value)\n\n return false\n }\n\n // Check if a date exceeds maximum days limit from the start date\n const rangeIsDateDisabled = (date: DateValue) => {\n if (props.isDateDisabled(date))\n return true\n\n // Check if exceeds maximum days limit\n if (props.maximumDays?.value) {\n if (props.start.value && props.end.value) {\n if (props.fixedDate.value) {\n const diff = getDaysBetween(props.start.value, props.end.value).length\n if (diff <= props.maximumDays.value) {\n const daysLeft = props.maximumDays.value - diff - 1\n const startLimit = props.start.value.subtract({ days: daysLeft })\n const endLimit = props.end.value.add({ days: daysLeft })\n return !isBetween(date, startLimit, endLimit)\n }\n }\n return false\n }\n if (props.start.value) {\n const maxDate = props.start.value.add({ days: props.maximumDays.value })\n const minDate = props.start.value.subtract({ days: props.maximumDays.value })\n return !isBetween(date, minDate, maxDate)\n }\n }\n\n if (!props.start.value || props.end.value || isSameDay(props.start.value, date))\n return false\n\n return false\n }\n\n const isDateHighlightable = (date: DateValue) => {\n if (props.isDateHighlightable?.(date))\n return true\n return false\n }\n\n const highlightedRange = computed(() => {\n if (props.start.value && props.end.value && !props.fixedDate.value)\n return null\n if (!props.start.value || !props.focusedValue.value)\n return null\n\n const isStartBeforeFocused = isBefore(props.start.value, props.focusedValue.value)\n const start = isStartBeforeFocused ? props.start.value : props.focusedValue.value\n const end = isStartBeforeFocused ? props.focusedValue.value : props.start.value\n\n if (isSameDay(start, end)) {\n return {\n start,\n end,\n }\n }\n\n // If maximum days is set and the range exceeds it, limit the highlight\n // We only apply this when we're in the middle of a selection (no end date yet)\n if (props.maximumDays?.value && !props.end.value) {\n // Determine the direction of selection and limit to maximum days\n const cappedEnd = isStartBeforeFocused\n ? start.add({ days: props.maximumDays.value })\n : start.subtract({ days: props.maximumDays.value })\n\n return {\n start,\n end: cappedEnd,\n }\n }\n\n const isValid = areAllDaysBetweenValid(start, end, props.allowNonContiguousRanges.value ? () => false : props.isDateUnavailable, rangeIsDateDisabled, props.isDateHighlightable)\n if (isValid) {\n return {\n start,\n end,\n }\n }\n return null\n })\n\n const isHighlightedStart = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.start)\n return false\n return isSameDay(highlightedRange.value.start, date)\n }\n\n const isHighlightedEnd = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.end)\n return false\n return isSameDay(highlightedRange.value.end, date)\n }\n\n return {\n isInvalid,\n isSelected,\n isDateHighlightable,\n highlightedRange,\n isSelectionStart,\n isSelectionEnd,\n isHighlightedStart,\n isHighlightedEnd,\n isDateDisabled: rangeIsDateDisabled,\n }\n}\n"],"names":["computed","isBefore","date","isSameDay","isBetween","getDaysBetween","areAllDaysBetweenValid"],"mappings":"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"}