reka-ui 2.2.1 → 2.3.0
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.
- package/dist/Accordion/AccordionItem.cjs.map +1 -1
- package/dist/Accordion/AccordionItem.js.map +1 -1
- package/dist/Accordion/AccordionRoot.cjs.map +1 -1
- package/dist/Accordion/AccordionRoot.js.map +1 -1
- package/dist/AlertDialog/AlertDialogCancel.cjs.map +1 -1
- package/dist/AlertDialog/AlertDialogCancel.js.map +1 -1
- package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
- package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
- package/dist/AspectRatio/AspectRatio.cjs.map +1 -1
- package/dist/AspectRatio/AspectRatio.js.map +1 -1
- package/dist/Avatar/AvatarFallback.cjs +11 -14
- package/dist/Avatar/AvatarFallback.cjs.map +1 -1
- package/dist/Avatar/AvatarFallback.js +12 -15
- package/dist/Avatar/AvatarFallback.js.map +1 -1
- package/dist/Avatar/AvatarImage.cjs +3 -2
- package/dist/Avatar/AvatarImage.cjs.map +1 -1
- package/dist/Avatar/AvatarImage.js +3 -2
- package/dist/Avatar/AvatarImage.js.map +1 -1
- package/dist/Avatar/AvatarRoot.cjs +1 -1
- package/dist/Avatar/AvatarRoot.cjs.map +1 -1
- package/dist/Avatar/AvatarRoot.js +1 -1
- package/dist/Avatar/AvatarRoot.js.map +1 -1
- package/dist/Avatar/utils.cjs +43 -16
- package/dist/Avatar/utils.cjs.map +1 -1
- package/dist/Avatar/utils.js +44 -17
- package/dist/Avatar/utils.js.map +1 -1
- package/dist/Calendar/CalendarCell.cjs +2 -2
- package/dist/Calendar/CalendarCell.cjs.map +1 -1
- package/dist/Calendar/CalendarCell.js +2 -2
- package/dist/Calendar/CalendarCell.js.map +1 -1
- package/dist/Calendar/CalendarCellTrigger.cjs +5 -1
- package/dist/Calendar/CalendarCellTrigger.cjs.map +1 -1
- package/dist/Calendar/CalendarCellTrigger.js +5 -1
- package/dist/Calendar/CalendarCellTrigger.js.map +1 -1
- package/dist/Calendar/CalendarGrid.cjs.map +1 -1
- package/dist/Calendar/CalendarGrid.js.map +1 -1
- package/dist/Calendar/CalendarHeading.cjs.map +1 -1
- package/dist/Calendar/CalendarHeading.js.map +1 -1
- package/dist/Calendar/CalendarNext.cjs.map +1 -1
- package/dist/Calendar/CalendarNext.js.map +1 -1
- package/dist/Calendar/CalendarPrev.cjs.map +1 -1
- package/dist/Calendar/CalendarPrev.js.map +1 -1
- package/dist/Calendar/CalendarRoot.cjs +7 -4
- package/dist/Calendar/CalendarRoot.cjs.map +1 -1
- package/dist/Calendar/CalendarRoot.js +7 -4
- package/dist/Calendar/CalendarRoot.js.map +1 -1
- package/dist/Calendar/useCalendar.cjs +2 -2
- package/dist/Calendar/useCalendar.cjs.map +1 -1
- package/dist/Calendar/useCalendar.js +2 -2
- package/dist/Calendar/useCalendar.js.map +1 -1
- package/dist/Checkbox/CheckboxGroupRoot.cjs.map +1 -1
- package/dist/Checkbox/CheckboxGroupRoot.js.map +1 -1
- package/dist/Checkbox/CheckboxRoot.cjs.map +1 -1
- package/dist/Checkbox/CheckboxRoot.js.map +1 -1
- package/dist/Collapsible/CollapsibleContent.cjs.map +1 -1
- package/dist/Collapsible/CollapsibleContent.js.map +1 -1
- package/dist/Collapsible/CollapsibleRoot.cjs +2 -0
- package/dist/Collapsible/CollapsibleRoot.cjs.map +1 -1
- package/dist/Collapsible/CollapsibleRoot.js +2 -0
- package/dist/Collapsible/CollapsibleRoot.js.map +1 -1
- package/dist/Collection/Collection.cjs.map +1 -1
- package/dist/Collection/Collection.js.map +1 -1
- package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
- package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
- package/dist/Combobox/ComboboxGroup.cjs.map +1 -1
- package/dist/Combobox/ComboboxGroup.js.map +1 -1
- package/dist/Combobox/ComboboxInput.cjs.map +1 -1
- package/dist/Combobox/ComboboxInput.js.map +1 -1
- package/dist/Combobox/ComboboxItem.cjs.map +1 -1
- package/dist/Combobox/ComboboxItem.js.map +1 -1
- package/dist/Combobox/ComboboxRoot.cjs +1 -2
- package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
- package/dist/Combobox/ComboboxRoot.js +1 -2
- package/dist/Combobox/ComboboxRoot.js.map +1 -1
- package/dist/Combobox/ComboboxTrigger.cjs.map +1 -1
- package/dist/Combobox/ComboboxTrigger.js.map +1 -1
- package/dist/Combobox/ComboboxViewport.cjs.map +1 -1
- package/dist/Combobox/ComboboxViewport.js.map +1 -1
- package/dist/Combobox/ComboboxVirtualizer.cjs.map +1 -1
- package/dist/Combobox/ComboboxVirtualizer.js.map +1 -1
- package/dist/ConfigProvider/ConfigProvider.cjs.map +1 -1
- package/dist/ConfigProvider/ConfigProvider.js.map +1 -1
- package/dist/ContextMenu/ContextMenuContent.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuContent.js.map +1 -1
- package/dist/ContextMenu/ContextMenuRoot.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuRoot.js.map +1 -1
- package/dist/ContextMenu/ContextMenuSub.cjs +1 -1
- package/dist/ContextMenu/ContextMenuSub.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuSub.js +1 -1
- package/dist/ContextMenu/ContextMenuSub.js.map +1 -1
- package/dist/ContextMenu/ContextMenuTrigger.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuTrigger.js.map +1 -1
- package/dist/DateField/DateFieldInput.cjs +1 -0
- package/dist/DateField/DateFieldInput.cjs.map +1 -1
- package/dist/DateField/DateFieldInput.js +1 -0
- package/dist/DateField/DateFieldInput.js.map +1 -1
- package/dist/DateField/DateFieldRoot.cjs +7 -1
- package/dist/DateField/DateFieldRoot.cjs.map +1 -1
- package/dist/DateField/DateFieldRoot.js +7 -1
- package/dist/DateField/DateFieldRoot.js.map +1 -1
- package/dist/DatePicker/DatePickerCellTrigger.cjs.map +1 -1
- package/dist/DatePicker/DatePickerCellTrigger.js.map +1 -1
- package/dist/DatePicker/DatePickerContent.cjs +8 -3
- package/dist/DatePicker/DatePickerContent.cjs.map +1 -1
- package/dist/DatePicker/DatePickerContent.js +9 -4
- package/dist/DatePicker/DatePickerContent.js.map +1 -1
- package/dist/DatePicker/DatePickerHeading.cjs.map +1 -1
- package/dist/DatePicker/DatePickerHeading.js.map +1 -1
- package/dist/DatePicker/DatePickerNext.cjs.map +1 -1
- package/dist/DatePicker/DatePickerNext.js.map +1 -1
- package/dist/DatePicker/DatePickerPrev.cjs.map +1 -1
- package/dist/DatePicker/DatePickerPrev.js.map +1 -1
- package/dist/DatePicker/DatePickerRoot.cjs +1 -0
- package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
- package/dist/DatePicker/DatePickerRoot.js +1 -0
- package/dist/DatePicker/DatePickerRoot.js.map +1 -1
- package/dist/DateRangeField/DateRangeFieldInput.cjs +1 -0
- package/dist/DateRangeField/DateRangeFieldInput.cjs.map +1 -1
- package/dist/DateRangeField/DateRangeFieldInput.js +1 -0
- package/dist/DateRangeField/DateRangeFieldInput.js.map +1 -1
- package/dist/DateRangeField/DateRangeFieldRoot.cjs +13 -9
- package/dist/DateRangeField/DateRangeFieldRoot.cjs.map +1 -1
- package/dist/DateRangeField/DateRangeFieldRoot.js +13 -9
- package/dist/DateRangeField/DateRangeFieldRoot.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerCalendar.cjs +2 -1
- package/dist/DateRangePicker/DateRangePickerCalendar.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerCalendar.js +2 -1
- package/dist/DateRangePicker/DateRangePickerCalendar.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerContent.cjs +8 -3
- package/dist/DateRangePicker/DateRangePickerContent.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerContent.js +9 -4
- package/dist/DateRangePicker/DateRangePickerContent.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerHeading.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerHeading.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerNext.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerNext.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerPrev.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerPrev.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerRoot.cjs +6 -2
- package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerRoot.js +6 -2
- package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
- package/dist/Dialog/DialogContentImpl.cjs.map +1 -1
- package/dist/Dialog/DialogContentImpl.js.map +1 -1
- package/dist/Dialog/DialogContentNonModal.cjs.map +1 -1
- package/dist/Dialog/DialogContentNonModal.js.map +1 -1
- package/dist/Dialog/DialogRoot.cjs +4 -1
- package/dist/Dialog/DialogRoot.cjs.map +1 -1
- package/dist/Dialog/DialogRoot.js +4 -1
- package/dist/Dialog/DialogRoot.js.map +1 -1
- package/dist/Dialog/DialogTrigger.cjs.map +1 -1
- package/dist/Dialog/DialogTrigger.js.map +1 -1
- package/dist/DismissableLayer/DismissableLayer.cjs.map +1 -1
- package/dist/DismissableLayer/DismissableLayer.js.map +1 -1
- package/dist/DismissableLayer/DismissableLayerBranch.cjs.map +1 -1
- package/dist/DismissableLayer/DismissableLayerBranch.js.map +1 -1
- package/dist/DismissableLayer/utils.cjs +7 -3
- package/dist/DismissableLayer/utils.cjs.map +1 -1
- package/dist/DismissableLayer/utils.js +8 -4
- package/dist/DismissableLayer/utils.js.map +1 -1
- package/dist/DropdownMenu/DropdownMenuContent.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuContent.js.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRoot.cjs +1 -1
- package/dist/DropdownMenu/DropdownMenuRoot.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRoot.js +1 -1
- package/dist/DropdownMenu/DropdownMenuRoot.js.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSub.cjs +1 -1
- package/dist/DropdownMenu/DropdownMenuSub.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSub.js +1 -1
- package/dist/DropdownMenu/DropdownMenuSub.js.map +1 -1
- package/dist/DropdownMenu/DropdownMenuTrigger.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuTrigger.js.map +1 -1
- package/dist/Editable/EditableInput.cjs.map +1 -1
- package/dist/Editable/EditableInput.js.map +1 -1
- package/dist/Editable/EditableRoot.cjs +1 -1
- package/dist/Editable/EditableRoot.cjs.map +1 -1
- package/dist/Editable/EditableRoot.js +1 -1
- package/dist/Editable/EditableRoot.js.map +1 -1
- package/dist/FocusScope/FocusScope.cjs.map +1 -1
- package/dist/FocusScope/FocusScope.js.map +1 -1
- package/dist/HoverCard/HoverCardContentImpl.cjs.map +1 -1
- package/dist/HoverCard/HoverCardContentImpl.js.map +1 -1
- package/dist/HoverCard/HoverCardRoot.cjs +1 -1
- package/dist/HoverCard/HoverCardRoot.cjs.map +1 -1
- package/dist/HoverCard/HoverCardRoot.js +1 -1
- package/dist/HoverCard/HoverCardRoot.js.map +1 -1
- package/dist/Listbox/ListboxFilter.cjs.map +1 -1
- package/dist/Listbox/ListboxFilter.js.map +1 -1
- package/dist/Listbox/ListboxItem.cjs.map +1 -1
- package/dist/Listbox/ListboxItem.js.map +1 -1
- package/dist/Listbox/ListboxRoot.cjs +1 -1
- package/dist/Listbox/ListboxRoot.cjs.map +1 -1
- package/dist/Listbox/ListboxRoot.js +1 -1
- package/dist/Listbox/ListboxRoot.js.map +1 -1
- package/dist/Listbox/ListboxVirtualizer.cjs +3 -3
- package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
- package/dist/Listbox/ListboxVirtualizer.js +3 -3
- package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
- package/dist/Menu/MenuCheckboxItem.cjs.map +1 -1
- package/dist/Menu/MenuCheckboxItem.js.map +1 -1
- package/dist/Menu/MenuContentImpl.cjs.map +1 -1
- package/dist/Menu/MenuContentImpl.js.map +1 -1
- package/dist/Menu/MenuItemImpl.cjs.map +1 -1
- package/dist/Menu/MenuItemImpl.js.map +1 -1
- package/dist/Menu/MenuItemIndicator.cjs.map +1 -1
- package/dist/Menu/MenuItemIndicator.js.map +1 -1
- package/dist/Menu/MenuRadioGroup.cjs.map +1 -1
- package/dist/Menu/MenuRadioGroup.js.map +1 -1
- package/dist/Menu/MenuRoot.cjs +1 -1
- package/dist/Menu/MenuRoot.cjs.map +1 -1
- package/dist/Menu/MenuRoot.js +1 -1
- package/dist/Menu/MenuRoot.js.map +1 -1
- package/dist/Menu/MenuSub.cjs +1 -1
- package/dist/Menu/MenuSub.cjs.map +1 -1
- package/dist/Menu/MenuSub.js +1 -1
- package/dist/Menu/MenuSub.js.map +1 -1
- package/dist/Menu/MenuSubTrigger.cjs.map +1 -1
- package/dist/Menu/MenuSubTrigger.js.map +1 -1
- package/dist/Menubar/MenubarContent.cjs.map +1 -1
- package/dist/Menubar/MenubarContent.js.map +1 -1
- package/dist/Menubar/MenubarMenu.cjs.map +1 -1
- package/dist/Menubar/MenubarMenu.js.map +1 -1
- package/dist/Menubar/MenubarRoot.cjs.map +1 -1
- package/dist/Menubar/MenubarRoot.js.map +1 -1
- package/dist/Menubar/MenubarSub.cjs +1 -1
- package/dist/Menubar/MenubarSub.cjs.map +1 -1
- package/dist/Menubar/MenubarSub.js +1 -1
- package/dist/Menubar/MenubarSub.js.map +1 -1
- package/dist/Menubar/MenubarTrigger.cjs.map +1 -1
- package/dist/Menubar/MenubarTrigger.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuContent.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuContent.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuContentImpl.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuContentImpl.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuIndicator.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuIndicator.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuItem.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuItem.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuList.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuList.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuRoot.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuRoot.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuSub.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuSub.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuTrigger.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuTrigger.js.map +1 -1
- package/dist/NavigationMenu/NavigationMenuViewport.cjs.map +1 -1
- package/dist/NavigationMenu/NavigationMenuViewport.js.map +1 -1
- package/dist/NumberField/NumberFieldInput.cjs +2 -2
- package/dist/NumberField/NumberFieldInput.cjs.map +1 -1
- package/dist/NumberField/NumberFieldInput.js +2 -2
- package/dist/NumberField/NumberFieldInput.js.map +1 -1
- package/dist/NumberField/NumberFieldRoot.cjs +8 -5
- package/dist/NumberField/NumberFieldRoot.cjs.map +1 -1
- package/dist/NumberField/NumberFieldRoot.js +8 -5
- package/dist/NumberField/NumberFieldRoot.js.map +1 -1
- package/dist/Pagination/PaginationFirst.cjs.map +1 -1
- package/dist/Pagination/PaginationFirst.js.map +1 -1
- package/dist/Pagination/PaginationLast.cjs.map +1 -1
- package/dist/Pagination/PaginationLast.js.map +1 -1
- package/dist/Pagination/PaginationList.cjs.map +1 -1
- package/dist/Pagination/PaginationList.js.map +1 -1
- package/dist/Pagination/PaginationListItem.cjs.map +1 -1
- package/dist/Pagination/PaginationListItem.js.map +1 -1
- package/dist/Pagination/PaginationNext.cjs.map +1 -1
- package/dist/Pagination/PaginationNext.js.map +1 -1
- package/dist/Pagination/PaginationPrev.cjs.map +1 -1
- package/dist/Pagination/PaginationPrev.js.map +1 -1
- package/dist/Pagination/PaginationRoot.cjs.map +1 -1
- package/dist/Pagination/PaginationRoot.js.map +1 -1
- package/dist/PinInput/PinInputInput.cjs +1 -1
- package/dist/PinInput/PinInputInput.cjs.map +1 -1
- package/dist/PinInput/PinInputInput.js +1 -1
- package/dist/PinInput/PinInputInput.js.map +1 -1
- package/dist/PinInput/PinInputRoot.cjs.map +1 -1
- package/dist/PinInput/PinInputRoot.js.map +1 -1
- package/dist/Popover/PopoverAnchor.cjs.map +1 -1
- package/dist/Popover/PopoverAnchor.js.map +1 -1
- package/dist/Popover/PopoverContentModal.cjs.map +1 -1
- package/dist/Popover/PopoverContentModal.js.map +1 -1
- package/dist/Popover/PopoverContentNonModal.cjs.map +1 -1
- package/dist/Popover/PopoverContentNonModal.js.map +1 -1
- package/dist/Popover/PopoverRoot.cjs +1 -1
- package/dist/Popover/PopoverRoot.cjs.map +1 -1
- package/dist/Popover/PopoverRoot.js +1 -1
- package/dist/Popover/PopoverRoot.js.map +1 -1
- package/dist/Popover/PopoverTrigger.cjs.map +1 -1
- package/dist/Popover/PopoverTrigger.js.map +1 -1
- package/dist/Popper/PopperAnchor.cjs.map +1 -1
- package/dist/Popper/PopperAnchor.js.map +1 -1
- package/dist/Popper/PopperArrow.cjs.map +1 -1
- package/dist/Popper/PopperArrow.js.map +1 -1
- package/dist/Popper/PopperContent.cjs.map +1 -1
- package/dist/Popper/PopperContent.js.map +1 -1
- package/dist/Presence/Presence.cjs.map +1 -1
- package/dist/Presence/Presence.js.map +1 -1
- package/dist/Presence/usePresence.cjs.map +1 -1
- package/dist/Presence/usePresence.js.map +1 -1
- package/dist/Primitive/Slot.cjs +1 -9
- package/dist/Primitive/Slot.cjs.map +1 -1
- package/dist/Primitive/Slot.js +1 -9
- package/dist/Primitive/Slot.js.map +1 -1
- package/dist/Progress/ProgressRoot.cjs +3 -2
- package/dist/Progress/ProgressRoot.cjs.map +1 -1
- package/dist/Progress/ProgressRoot.js +3 -2
- package/dist/Progress/ProgressRoot.js.map +1 -1
- package/dist/RadioGroup/Radio.cjs.map +1 -1
- package/dist/RadioGroup/Radio.js.map +1 -1
- package/dist/RadioGroup/RadioGroupItem.cjs.map +1 -1
- package/dist/RadioGroup/RadioGroupItem.js.map +1 -1
- package/dist/RadioGroup/RadioGroupRoot.cjs.map +1 -1
- package/dist/RadioGroup/RadioGroupRoot.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarCell.cjs +2 -2
- package/dist/RangeCalendar/RangeCalendarCell.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarCell.js +2 -2
- package/dist/RangeCalendar/RangeCalendarCell.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs +28 -9
- package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarCellTrigger.js +28 -9
- package/dist/RangeCalendar/RangeCalendarCellTrigger.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarGrid.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarGrid.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarHeading.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarHeading.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarNext.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarNext.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarPrev.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarPrev.js.map +1 -1
- package/dist/RangeCalendar/RangeCalendarRoot.cjs +26 -9
- package/dist/RangeCalendar/RangeCalendarRoot.cjs.map +1 -1
- package/dist/RangeCalendar/RangeCalendarRoot.js +26 -9
- package/dist/RangeCalendar/RangeCalendarRoot.js.map +1 -1
- package/dist/RangeCalendar/useRangeCalendar.cjs +21 -4
- package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
- package/dist/RangeCalendar/useRangeCalendar.js +21 -4
- package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
- package/dist/RovingFocus/RovingFocusGroup.cjs +1 -1
- package/dist/RovingFocus/RovingFocusGroup.cjs.map +1 -1
- package/dist/RovingFocus/RovingFocusGroup.js +1 -1
- package/dist/RovingFocus/RovingFocusGroup.js.map +1 -1
- package/dist/RovingFocus/RovingFocusItem.cjs.map +1 -1
- package/dist/RovingFocus/RovingFocusItem.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaCornerImpl.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaCornerImpl.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaRoot.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaRoot.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbar.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbar.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarAuto.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarAuto.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarHover.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarHover.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarImpl.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarImpl.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarScroll.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarScroll.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarX.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarX.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarY.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaScrollbarY.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaThumb.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaThumb.js.map +1 -1
- package/dist/ScrollArea/ScrollAreaViewport.cjs.map +1 -1
- package/dist/ScrollArea/ScrollAreaViewport.js.map +1 -1
- package/dist/Select/BubbleSelect.cjs.map +1 -1
- package/dist/Select/BubbleSelect.js.map +1 -1
- package/dist/Select/SelectContent.cjs.map +1 -1
- package/dist/Select/SelectContent.js.map +1 -1
- package/dist/Select/SelectContentImpl.cjs +1 -1
- package/dist/Select/SelectContentImpl.cjs.map +1 -1
- package/dist/Select/SelectContentImpl.js +1 -1
- package/dist/Select/SelectContentImpl.js.map +1 -1
- package/dist/Select/SelectItem.cjs.map +1 -1
- package/dist/Select/SelectItem.js.map +1 -1
- package/dist/Select/SelectItemAlignedPosition.cjs +1 -1
- package/dist/Select/SelectItemAlignedPosition.cjs.map +1 -1
- package/dist/Select/SelectItemAlignedPosition.js +1 -1
- package/dist/Select/SelectItemAlignedPosition.js.map +1 -1
- package/dist/Select/SelectItemText.cjs.map +1 -1
- package/dist/Select/SelectItemText.js.map +1 -1
- package/dist/Select/SelectProvider.cjs.map +1 -1
- package/dist/Select/SelectProvider.js.map +1 -1
- package/dist/Select/SelectRoot.cjs +3 -1
- package/dist/Select/SelectRoot.cjs.map +1 -1
- package/dist/Select/SelectRoot.js +3 -1
- package/dist/Select/SelectRoot.js.map +1 -1
- package/dist/Select/SelectScrollButtonImpl.cjs.map +1 -1
- package/dist/Select/SelectScrollButtonImpl.js.map +1 -1
- package/dist/Select/SelectTrigger.cjs.map +1 -1
- package/dist/Select/SelectTrigger.js.map +1 -1
- package/dist/Select/SelectValue.cjs.map +1 -1
- package/dist/Select/SelectValue.js.map +1 -1
- package/dist/Select/SelectViewport.cjs.map +1 -1
- package/dist/Select/SelectViewport.js.map +1 -1
- package/dist/Slider/SliderHorizontal.cjs +7 -4
- package/dist/Slider/SliderHorizontal.cjs.map +1 -1
- package/dist/Slider/SliderHorizontal.js +7 -4
- package/dist/Slider/SliderHorizontal.js.map +1 -1
- package/dist/Slider/SliderRange.cjs +2 -2
- package/dist/Slider/SliderRange.cjs.map +1 -1
- package/dist/Slider/SliderRange.js +2 -2
- package/dist/Slider/SliderRange.js.map +1 -1
- package/dist/Slider/SliderRoot.cjs.map +1 -1
- package/dist/Slider/SliderRoot.js.map +1 -1
- package/dist/Slider/SliderThumb.cjs.map +1 -1
- package/dist/Slider/SliderThumb.js.map +1 -1
- package/dist/Slider/SliderThumbImpl.cjs +3 -3
- package/dist/Slider/SliderThumbImpl.cjs.map +1 -1
- package/dist/Slider/SliderThumbImpl.js +3 -3
- package/dist/Slider/SliderThumbImpl.js.map +1 -1
- package/dist/Slider/SliderVertical.cjs +7 -4
- package/dist/Slider/SliderVertical.cjs.map +1 -1
- package/dist/Slider/SliderVertical.js +7 -4
- package/dist/Slider/SliderVertical.js.map +1 -1
- package/dist/Slider/utils.cjs +1 -1
- package/dist/Slider/utils.cjs.map +1 -1
- package/dist/Slider/utils.js +1 -1
- package/dist/Slider/utils.js.map +1 -1
- package/dist/Splitter/SplitterGroup.cjs.map +1 -1
- package/dist/Splitter/SplitterGroup.js.map +1 -1
- package/dist/Splitter/SplitterPanel.cjs +16 -10
- package/dist/Splitter/SplitterPanel.cjs.map +1 -1
- package/dist/Splitter/SplitterPanel.js +16 -10
- package/dist/Splitter/SplitterPanel.js.map +1 -1
- package/dist/Stepper/StepperIndicator.cjs.map +1 -1
- package/dist/Stepper/StepperIndicator.js.map +1 -1
- package/dist/Stepper/StepperItem.cjs.map +1 -1
- package/dist/Stepper/StepperItem.js.map +1 -1
- package/dist/Stepper/StepperRoot.cjs +30 -3
- package/dist/Stepper/StepperRoot.cjs.map +1 -1
- package/dist/Stepper/StepperRoot.js +30 -3
- package/dist/Stepper/StepperRoot.js.map +1 -1
- package/dist/Stepper/StepperTrigger.cjs.map +1 -1
- package/dist/Stepper/StepperTrigger.js.map +1 -1
- package/dist/Switch/SwitchRoot.cjs.map +1 -1
- package/dist/Switch/SwitchRoot.js.map +1 -1
- package/dist/Tabs/TabsContent.cjs.map +1 -1
- package/dist/Tabs/TabsContent.js.map +1 -1
- package/dist/Tabs/TabsIndicator.cjs.map +1 -1
- package/dist/Tabs/TabsIndicator.js.map +1 -1
- package/dist/Tabs/TabsList.cjs.map +1 -1
- package/dist/Tabs/TabsList.js.map +1 -1
- package/dist/Tabs/TabsRoot.cjs.map +1 -1
- package/dist/Tabs/TabsRoot.js.map +1 -1
- package/dist/Tabs/TabsTrigger.cjs.map +1 -1
- package/dist/Tabs/TabsTrigger.js.map +1 -1
- package/dist/TagsInput/TagsInputInput.cjs +1 -0
- package/dist/TagsInput/TagsInputInput.cjs.map +1 -1
- package/dist/TagsInput/TagsInputInput.js +1 -0
- package/dist/TagsInput/TagsInputInput.js.map +1 -1
- package/dist/TagsInput/TagsInputItem.cjs.map +1 -1
- package/dist/TagsInput/TagsInputItem.js.map +1 -1
- package/dist/TagsInput/TagsInputItemDelete.cjs.map +1 -1
- package/dist/TagsInput/TagsInputItemDelete.js.map +1 -1
- package/dist/TagsInput/TagsInputRoot.cjs +1 -1
- package/dist/TagsInput/TagsInputRoot.cjs.map +1 -1
- package/dist/TagsInput/TagsInputRoot.js +1 -1
- package/dist/TagsInput/TagsInputRoot.js.map +1 -1
- package/dist/TimeField/TimeFieldInput.cjs +1 -0
- package/dist/TimeField/TimeFieldInput.cjs.map +1 -1
- package/dist/TimeField/TimeFieldInput.js +1 -0
- package/dist/TimeField/TimeFieldInput.js.map +1 -1
- package/dist/TimeField/TimeFieldRoot.cjs +13 -4
- package/dist/TimeField/TimeFieldRoot.cjs.map +1 -1
- package/dist/TimeField/TimeFieldRoot.js +13 -4
- package/dist/TimeField/TimeFieldRoot.js.map +1 -1
- package/dist/Toast/ToastAnnounce.cjs.map +1 -1
- package/dist/Toast/ToastAnnounce.js.map +1 -1
- package/dist/Toast/ToastRoot.cjs.map +1 -1
- package/dist/Toast/ToastRoot.js.map +1 -1
- package/dist/Toast/ToastRootImpl.cjs +1 -1
- package/dist/Toast/ToastRootImpl.cjs.map +1 -1
- package/dist/Toast/ToastRootImpl.js +1 -1
- package/dist/Toast/ToastRootImpl.js.map +1 -1
- package/dist/Toast/ToastViewport.cjs +1 -1
- package/dist/Toast/ToastViewport.cjs.map +1 -1
- package/dist/Toast/ToastViewport.js +1 -1
- package/dist/Toast/ToastViewport.js.map +1 -1
- package/dist/Toggle/Toggle.cjs.map +1 -1
- package/dist/Toggle/Toggle.js.map +1 -1
- package/dist/ToggleGroup/ToggleGroupItem.cjs.map +1 -1
- package/dist/ToggleGroup/ToggleGroupItem.js.map +1 -1
- package/dist/ToggleGroup/ToggleGroupRoot.cjs.map +1 -1
- package/dist/ToggleGroup/ToggleGroupRoot.js.map +1 -1
- package/dist/Toolbar/ToolbarRoot.cjs.map +1 -1
- package/dist/Toolbar/ToolbarRoot.js.map +1 -1
- package/dist/Tooltip/TooltipContentImpl.cjs +1 -1
- package/dist/Tooltip/TooltipContentImpl.cjs.map +1 -1
- package/dist/Tooltip/TooltipContentImpl.js +1 -1
- package/dist/Tooltip/TooltipContentImpl.js.map +1 -1
- package/dist/Tooltip/TooltipRoot.cjs +1 -1
- package/dist/Tooltip/TooltipRoot.cjs.map +1 -1
- package/dist/Tooltip/TooltipRoot.js +1 -1
- package/dist/Tooltip/TooltipRoot.js.map +1 -1
- package/dist/Tooltip/TooltipTrigger.cjs +1 -1
- package/dist/Tooltip/TooltipTrigger.cjs.map +1 -1
- package/dist/Tooltip/TooltipTrigger.js +1 -1
- package/dist/Tooltip/TooltipTrigger.js.map +1 -1
- package/dist/Tree/TreeItem.cjs +4 -1
- package/dist/Tree/TreeItem.cjs.map +1 -1
- package/dist/Tree/TreeItem.js +4 -1
- package/dist/Tree/TreeItem.js.map +1 -1
- package/dist/Tree/TreeRoot.cjs +29 -3
- package/dist/Tree/TreeRoot.cjs.map +1 -1
- package/dist/Tree/TreeRoot.js +29 -3
- package/dist/Tree/TreeRoot.js.map +1 -1
- package/dist/Tree/TreeVirtualizer.cjs +2 -2
- package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
- package/dist/Tree/TreeVirtualizer.js +2 -2
- package/dist/Tree/TreeVirtualizer.js.map +1 -1
- package/dist/Viewport/Viewport.cjs.map +1 -1
- package/dist/Viewport/Viewport.js.map +1 -1
- package/dist/VisuallyHidden/VisuallyHiddenInputBubble.cjs.map +1 -1
- package/dist/VisuallyHidden/VisuallyHiddenInputBubble.js.map +1 -1
- package/dist/component/BaseSeparator.cjs.map +1 -1
- package/dist/component/BaseSeparator.js.map +1 -1
- package/dist/date/calendar.cjs.map +1 -1
- package/dist/date/calendar.js.map +1 -1
- package/dist/date/parser.cjs +22 -7
- package/dist/date/parser.cjs.map +1 -1
- package/dist/date/parser.js +23 -8
- package/dist/date/parser.js.map +1 -1
- package/dist/date/useDateField.cjs +21 -6
- package/dist/date/useDateField.cjs.map +1 -1
- package/dist/date/useDateField.js +21 -6
- package/dist/date/useDateField.js.map +1 -1
- package/dist/date/utils.cjs +31 -2
- package/dist/date/utils.cjs.map +1 -1
- package/dist/date/utils.js +30 -3
- package/dist/date/utils.js.map +1 -1
- package/dist/index.d.ts +492 -351
- package/dist/shared/useBodyScrollLock.cjs +2 -2
- package/dist/shared/useBodyScrollLock.cjs.map +1 -1
- package/dist/shared/useBodyScrollLock.js +2 -2
- package/dist/shared/useBodyScrollLock.js.map +1 -1
- package/dist/shared/useDateFormatter.cjs +12 -10
- package/dist/shared/useDateFormatter.cjs.map +1 -1
- package/dist/shared/useDateFormatter.js +12 -10
- package/dist/shared/useDateFormatter.js.map +1 -1
- package/dist/shared/useDirection.cjs.map +1 -1
- package/dist/shared/useDirection.js.map +1 -1
- package/dist/shared/useForwardProps.cjs +4 -2
- package/dist/shared/useForwardProps.cjs.map +1 -1
- package/dist/shared/useForwardProps.js +5 -3
- package/dist/shared/useForwardProps.js.map +1 -1
- package/dist/shared/useGraceArea.cjs.map +1 -1
- package/dist/shared/useGraceArea.js.map +1 -1
- package/dist/shared/useId.cjs +2 -2
- package/dist/shared/useId.cjs.map +1 -1
- package/dist/shared/useId.js +2 -2
- package/dist/shared/useId.js.map +1 -1
- package/dist/shared/useLocale.cjs.map +1 -1
- package/dist/shared/useLocale.js.map +1 -1
- package/dist/shared/useNonce.cjs.map +1 -1
- package/dist/shared/useNonce.js.map +1 -1
- package/package.json +5 -5
package/dist/Tree/TreeRoot.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const vue = require('vue');
|
|
4
|
-
const RovingFocus_utils = require('../RovingFocus/utils.cjs');
|
|
5
4
|
const core = require('@vueuse/core');
|
|
5
|
+
const RovingFocus_utils = require('../RovingFocus/utils.cjs');
|
|
6
6
|
const Tree_utils = require('./utils.cjs');
|
|
7
7
|
const shared_createContext = require('../shared/createContext.cjs');
|
|
8
8
|
const shared_useTypeahead = require('../shared/useTypeahead.cjs');
|
|
@@ -24,10 +24,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
24
24
|
getKey: {},
|
|
25
25
|
getChildren: { type: Function, default: (val) => val.children },
|
|
26
26
|
selectionBehavior: { default: "toggle" },
|
|
27
|
-
multiple: {
|
|
27
|
+
multiple: {},
|
|
28
28
|
dir: {},
|
|
29
29
|
disabled: { type: Boolean },
|
|
30
30
|
propagateSelect: { type: Boolean },
|
|
31
|
+
bubbleSelect: { type: Boolean },
|
|
31
32
|
asChild: { type: Boolean },
|
|
32
33
|
as: { default: "ul" }
|
|
33
34
|
},
|
|
@@ -35,7 +36,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
35
36
|
setup(__props, { emit: __emit }) {
|
|
36
37
|
const props = __props;
|
|
37
38
|
const emits = __emit;
|
|
38
|
-
const { items, multiple, disabled, propagateSelect, dir: propDir } = vue.toRefs(props);
|
|
39
|
+
const { items, multiple, disabled, propagateSelect, dir: propDir, bubbleSelect } = vue.toRefs(props);
|
|
39
40
|
const { handleTypeaheadSearch } = shared_useTypeahead.useTypeahead();
|
|
40
41
|
const dir = shared_useDirection.useDirection(propDir);
|
|
41
42
|
const rovingFocusGroupRef = vue.ref();
|
|
@@ -111,6 +112,22 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
111
112
|
);
|
|
112
113
|
});
|
|
113
114
|
}
|
|
115
|
+
function handleBubbleSelect(item) {
|
|
116
|
+
if (item.parentItem != null && Array.isArray(modelValue.value) && props.multiple) {
|
|
117
|
+
const parentItem = expandedItems.value.find((i) => {
|
|
118
|
+
return item.parentItem != null && props.getKey(i.value) === props.getKey(item.parentItem);
|
|
119
|
+
});
|
|
120
|
+
if (parentItem != null) {
|
|
121
|
+
const areAllChilredOfParentSelected = props.getChildren(parentItem.value)?.every((i) => modelValue.value.find((v) => props.getKey(v) === props.getKey(i)));
|
|
122
|
+
if (areAllChilredOfParentSelected) {
|
|
123
|
+
modelValue.value = [...modelValue.value, parentItem.value];
|
|
124
|
+
} else {
|
|
125
|
+
modelValue.value = modelValue.value.filter((v) => props.getKey(v) !== props.getKey(parentItem.value));
|
|
126
|
+
}
|
|
127
|
+
handleBubbleSelect(parentItem);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
114
131
|
provideTreeRootContext({
|
|
115
132
|
modelValue,
|
|
116
133
|
selectedKeys,
|
|
@@ -118,6 +135,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
118
135
|
const condition = (baseValue) => props.getKey(baseValue ?? {}) === props.getKey(val);
|
|
119
136
|
const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : void 0;
|
|
120
137
|
onSelectItem(val, condition);
|
|
138
|
+
if (props.bubbleSelect && props.multiple && Array.isArray(modelValue.value)) {
|
|
139
|
+
const item = expandedItems.value.find((i) => {
|
|
140
|
+
return props.getKey(i.value) === props.getKey(val);
|
|
141
|
+
});
|
|
142
|
+
if (item != null) {
|
|
143
|
+
handleBubbleSelect(item);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
121
146
|
if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {
|
|
122
147
|
const children = Tree_utils.flatten(props.getChildren(val) ?? []);
|
|
123
148
|
if (exist) {
|
|
@@ -146,6 +171,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
146
171
|
multiple,
|
|
147
172
|
dir,
|
|
148
173
|
propagateSelect,
|
|
174
|
+
bubbleSelect,
|
|
149
175
|
isVirtual,
|
|
150
176
|
virtualKeydownHook,
|
|
151
177
|
handleMultipleReplace
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeRoot.cjs","sources":["../../src/Tree/TreeRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Direction } from '@/shared/types'\nimport { createContext, getActiveElement, useDirection, useSelectionBehavior, useTypeahead } from '@/shared'\nimport { flatten } from './utils'\n\nexport interface TreeRootProps<T = Record<string, any>, U extends Record<string, any> = Record<string, any>> extends PrimitiveProps {\n /** The controlled value of the tree. Can be binded with with `v-model`. */\n modelValue?: U | U[]\n /** The value of the tree when initially rendered. Use when you do not need to control the state of the tree */\n defaultValue?: U | U[]\n /** List of items */\n items?: T[]\n /** The controlled value of the expanded item. Can be binded with with `v-model`. */\n expanded?: string[]\n /** The value of the expanded tree when initially rendered. Use when you do not need to control the state of the expanded tree */\n defaultExpanded?: string[]\n /** This function is passed the index of each item and should return a unique key for that item */\n getKey: (val: T) => string\n /** This function is passed the index of each item and should return a list of children for that item */\n getChildren?: (val: T) => T[] | undefined\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: 'toggle' | 'replace'\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\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 tree */\n disabled?: boolean\n /** When `true`, selecting parent will select the descendants. */\n propagateSelect?: boolean\n}\n\nexport type TreeRootEmits<T = Record<string, any>> = {\n 'update:modelValue': [val: T]\n 'update:expanded': [val: string[]]\n}\n\ninterface TreeRootContext<T = Record<string, any>> {\n modelValue: Ref<T | T[]>\n selectedKeys: Ref<string[]>\n onSelect: (val: T) => void\n expanded: Ref<string[]>\n onToggle: (val: T) => void\n items: Ref<T[]>\n expandedItems: Ref<T[]>\n getKey: (val: T) => string\n getChildren: (val: T) => T[] | undefined\n multiple: Ref<boolean>\n disabled: Ref<boolean>\n dir: Ref<Direction>\n propagateSelect: Ref<boolean>\n isVirtual: Ref<boolean>\n virtualKeydownHook: EventHook<KeyboardEvent>\n\n handleMultipleReplace: ReturnType<typeof useSelectionBehavior>['handleMultipleReplace']\n}\n\nexport type FlattenedItem<T> = {\n _id: string\n index: number\n value: T\n level: number\n hasChildren: boolean\n parentItem?: T\n bind: {\n value: T\n level: number\n [key: string]: any\n }\n}\n\nexport const [injectTreeRootContext, provideTreeRootContext] = createContext<TreeRootContext<any>>('TreeRoot')\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends Record<string, any>, U extends Record<string, any>\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { Primitive } from '@/Primitive'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { computed, nextTick, ref, toRefs } from 'vue'\n\nconst props = withDefaults(defineProps<TreeRootProps<T, U>>(), {\n as: 'ul',\n selectionBehavior: 'toggle',\n getChildren: (val: T) => val.children,\n})\nconst emits = defineEmits<TreeRootEmits<U>>()\n\ndefineSlots<{\n default: (props: {\n flattenItems: FlattenedItem<T>[]\n modelValue: typeof modelValue.value\n expanded: typeof expanded.value\n }) => any\n}>()\n\nconst { items, multiple, disabled, propagateSelect, dir: propDir } = toRefs(props)\nconst { handleTypeaheadSearch } = useTypeahead()\nconst dir = useDirection(propDir)\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\n\n// Virtualizer\nconst isVirtual = ref(false)\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<U | U[]>\n\nconst expanded = useVModel(props, 'expanded', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultExpanded ?? [],\n passive: (props.expanded === undefined) as false,\n deep: true,\n}) as Ref<string[]>\n\nconst { onSelectItem, handleMultipleReplace } = useSelectionBehavior(modelValue, props)\n\nconst selectedKeys = computed(() => {\n if (multiple.value && Array.isArray(modelValue.value))\n return modelValue.value.map(i => props.getKey(i as any))\n else\n return [props.getKey(modelValue.value as any ?? {})]\n})\n\nfunction flattenItems(items: T[], level: number = 1, parentItem?: T): FlattenedItem<T>[] {\n return items.reduce((acc: FlattenedItem<T>[], item: T, index: number) => {\n const key = props.getKey(item)\n const children = props.getChildren(item)\n const isExpanded = expanded.value.includes(key)\n\n const flattenedItem: FlattenedItem<T> = {\n _id: key,\n value: item,\n index,\n level,\n parentItem,\n hasChildren: !!children,\n bind: {\n 'value': item,\n level,\n 'aria-setsize': items.length,\n 'aria-posinset': index + 1,\n },\n }\n acc.push(flattenedItem)\n\n if (children && isExpanded)\n acc.push(...flattenItems(children, level + 1, item))\n\n return acc\n }, [])\n}\n\nconst expandedItems = computed(() => {\n const items = props.items\n const expandedKeys = expanded.value.map(i => i)\n return flattenItems(items ?? [])\n})\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const collections = rovingFocusGroupRef.value?.getItems() ?? []\n handleTypeaheadSearch(event.key, collections)\n }\n}\n\nfunction handleKeydownNavigation(event: KeyboardEvent) {\n if (isVirtual.value)\n return\n\n const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n nextTick(() => {\n handleMultipleReplace(\n intent,\n getActiveElement(),\n rovingFocusGroupRef.value?.getItems!,\n expandedItems.value.map(i => i.value),\n )\n })\n}\n\nprovideTreeRootContext({\n modelValue,\n selectedKeys,\n onSelect: (val) => {\n const condition = (baseValue: U) => props.getKey(baseValue as any ?? {}) === props.getKey(val)\n const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : undefined\n onSelectItem(val, condition)\n\n if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {\n const children = flatten<U, any>(props.getChildren(val) ?? [])\n if (exist) {\n // remove all child\n modelValue.value = [...modelValue.value]\n .filter(i => !children.some(child => props.getKey(i as any ?? {}) === props.getKey(child as any)))\n }\n else {\n // select all child\n modelValue.value = [...modelValue.value, ...children]\n }\n }\n },\n expanded,\n onToggle(val) {\n const children = val ? props.getChildren(val) : undefined\n if (!children)\n return\n\n const key = props.getKey(val) ?? val\n if (expanded.value.includes(key))\n expanded.value = expanded.value.filter(val => val !== key)\n else\n expanded.value.push(key)\n },\n getKey: props.getKey,\n getChildren: props.getChildren,\n items,\n expandedItems,\n disabled,\n multiple,\n dir,\n propagateSelect,\n\n isVirtual,\n virtualKeydownHook,\n handleMultipleReplace,\n})\n</script>\n\n<template>\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n as-child\n orientation=\"vertical\"\n :dir=\"dir\"\n >\n <Primitive\n role=\"tree\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-multiselectable=\"multiple ? true : undefined\"\n @keydown=\"handleKeydown\"\n @keydown.up.down.shift=\"handleKeydownNavigation\"\n >\n <slot\n :flatten-items=\"expandedItems\"\n :model-value=\"modelValue\"\n :expanded=\"expanded\"\n />\n </Primitive>\n </RovingFocusGroup>\n</template>\n"],"names":["createContext","toRefs","useTypeahead","useDirection","ref","createEventHook","useVModel","useSelectionBehavior","computed","items","MAP_KEY_TO_FOCUS_INTENT","nextTick","getActiveElement","flatten","val"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeRoot.cjs","sources":["../../src/Tree/TreeRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Direction } from '@/shared/types'\nimport { createContext, getActiveElement, useDirection, useSelectionBehavior, useTypeahead } from '@/shared'\nimport { flatten } from './utils'\n\nexport interface TreeRootProps<T = Record<string, any>, U extends Record<string, any> = Record<string, any>, M extends boolean = false> extends PrimitiveProps {\n /** The controlled value of the tree. Can be binded with with `v-model`. */\n modelValue?: M extends true ? U[] : U\n /** The value of the tree when initially rendered. Use when you do not need to control the state of the tree */\n defaultValue?: M extends true ? U[] : U\n /** List of items */\n items?: T[]\n /** The controlled value of the expanded item. Can be binded with with `v-model`. */\n expanded?: string[]\n /** The value of the expanded tree when initially rendered. Use when you do not need to control the state of the expanded tree */\n defaultExpanded?: string[]\n /** This function is passed the index of each item and should return a unique key for that item */\n getKey: (val: T) => string\n /** This function is passed the index of each item and should return a list of children for that item */\n getChildren?: (val: T) => T[] | undefined\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: 'toggle' | 'replace'\n /** Whether multiple options can be selected or not. */\n multiple?: M\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 tree */\n disabled?: boolean\n /** When `true`, selecting parent will select the descendants. */\n propagateSelect?: boolean\n /** When `true`, selecting children will update the parent state. */\n bubbleSelect?: boolean\n}\n\nexport type TreeRootEmits<T = Record<string, any>, M extends boolean = false> = {\n 'update:modelValue': [val: M extends true ? T[] : T]\n 'update:expanded': [val: string[]]\n}\n\ninterface TreeRootContext<T = Record<string, any>> {\n modelValue: Ref<T | T[]>\n selectedKeys: Ref<string[]>\n onSelect: (val: T) => void\n expanded: Ref<string[]>\n onToggle: (val: T) => void\n items: Ref<T[]>\n expandedItems: Ref<T[]>\n getKey: (val: T) => string\n getChildren: (val: T) => T[] | undefined\n multiple: Ref<boolean>\n disabled: Ref<boolean>\n dir: Ref<Direction>\n propagateSelect: Ref<boolean>\n bubbleSelect: Ref<boolean>\n isVirtual: Ref<boolean>\n virtualKeydownHook: EventHook<KeyboardEvent>\n\n handleMultipleReplace: ReturnType<typeof useSelectionBehavior>['handleMultipleReplace']\n}\n\nexport type FlattenedItem<T> = {\n _id: string\n index: number\n value: T\n level: number\n hasChildren: boolean\n parentItem?: T\n bind: {\n value: T\n level: number\n [key: string]: any\n }\n}\n\nexport const [injectTreeRootContext, provideTreeRootContext] = createContext<TreeRootContext<any>>('TreeRoot')\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends Record<string, any>, U extends Record<string, any>, M extends boolean = false\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { computed, nextTick, ref, toRefs } from 'vue'\nimport { Primitive } from '@/Primitive'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\n\nconst props = withDefaults(defineProps<TreeRootProps<T, U, M>>(), {\n as: 'ul',\n selectionBehavior: 'toggle',\n getChildren: (val: T) => val.children,\n})\nconst emits = defineEmits<TreeRootEmits<U, M>>()\n\ndefineSlots<{\n default?: (props: {\n flattenItems: FlattenedItem<T>[]\n modelValue: M extends true ? U[] : U\n expanded: typeof expanded.value\n }) => any\n}>()\n\nconst { items, multiple, disabled, propagateSelect, dir: propDir, bubbleSelect } = toRefs(props)\nconst { handleTypeaheadSearch } = useTypeahead()\nconst dir = useDirection(propDir)\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\n\n// Virtualizer\nconst isVirtual = ref(false)\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<U | U[]>\n\nconst expanded = useVModel(props, 'expanded', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultExpanded ?? [],\n passive: (props.expanded === undefined) as false,\n deep: true,\n}) as Ref<string[]>\n\nconst { onSelectItem, handleMultipleReplace } = useSelectionBehavior(modelValue, props)\n\nconst selectedKeys = computed(() => {\n if (multiple.value && Array.isArray(modelValue.value))\n return modelValue.value.map(i => props.getKey(i as any))\n else\n return [props.getKey(modelValue.value as any ?? {})]\n})\n\nfunction flattenItems(items: T[], level: number = 1, parentItem?: T): FlattenedItem<T>[] {\n return items.reduce((acc: FlattenedItem<T>[], item: T, index: number) => {\n const key = props.getKey(item)\n const children = props.getChildren(item)\n const isExpanded = expanded.value.includes(key)\n\n const flattenedItem: FlattenedItem<T> = {\n _id: key,\n value: item,\n index,\n level,\n parentItem,\n hasChildren: !!children,\n bind: {\n 'value': item,\n level,\n 'aria-setsize': items.length,\n 'aria-posinset': index + 1,\n },\n }\n acc.push(flattenedItem)\n\n if (children && isExpanded)\n acc.push(...flattenItems(children, level + 1, item))\n\n return acc\n }, [])\n}\n\nconst expandedItems = computed(() => {\n const items = props.items\n const expandedKeys = expanded.value.map(i => i)\n return flattenItems(items ?? [])\n})\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const collections = rovingFocusGroupRef.value?.getItems() ?? []\n handleTypeaheadSearch(event.key, collections)\n }\n}\n\nfunction handleKeydownNavigation(event: KeyboardEvent) {\n if (isVirtual.value)\n return\n\n const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n nextTick(() => {\n handleMultipleReplace(\n intent,\n getActiveElement(),\n rovingFocusGroupRef.value?.getItems!,\n expandedItems.value.map(i => i.value),\n )\n })\n}\n\nfunction handleBubbleSelect(item: FlattenedItem<T>) {\n if (item.parentItem != null && Array.isArray(modelValue.value) && props.multiple) {\n const parentItem = expandedItems.value.find((i) => {\n return item.parentItem != null && props.getKey(i.value) === props.getKey(item.parentItem)\n })\n\n if (parentItem != null) {\n const areAllChilredOfParentSelected = props.getChildren(parentItem.value)?.every(i => modelValue.value.find((v: any) => props.getKey(v) === props.getKey(i)))\n\n if (areAllChilredOfParentSelected) {\n modelValue.value = [...modelValue.value, parentItem.value as any]\n }\n else {\n modelValue.value = modelValue.value.filter((v: any) => props.getKey(v) !== props.getKey(parentItem.value))\n }\n\n handleBubbleSelect(parentItem)\n }\n }\n}\n\nprovideTreeRootContext({\n modelValue,\n selectedKeys,\n onSelect: (val) => {\n const condition = (baseValue: U) => props.getKey(baseValue as any ?? {}) === props.getKey(val)\n const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : undefined\n onSelectItem(val, condition)\n\n if (props.bubbleSelect && props.multiple && Array.isArray(modelValue.value)) {\n const item = expandedItems.value.find((i) => {\n return props.getKey(i.value) === props.getKey(val)\n })\n if (item != null) {\n handleBubbleSelect(item)\n }\n }\n\n if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {\n const children = flatten<U, any>(props.getChildren(val) ?? [])\n\n if (exist) {\n // remove all child\n modelValue.value = [...modelValue.value]\n .filter(i => !children.some(child => props.getKey(i as any ?? {}) === props.getKey(child as any)))\n }\n else {\n // select all child\n modelValue.value = [...modelValue.value, ...children]\n }\n }\n },\n expanded,\n onToggle(val) {\n const children = val ? props.getChildren(val) : undefined\n if (!children)\n return\n\n const key = props.getKey(val) ?? val\n if (expanded.value.includes(key))\n expanded.value = expanded.value.filter(val => val !== key)\n else\n expanded.value.push(key)\n },\n getKey: props.getKey,\n getChildren: props.getChildren,\n items,\n expandedItems,\n disabled,\n multiple,\n dir,\n propagateSelect,\n bubbleSelect,\n\n isVirtual,\n virtualKeydownHook,\n handleMultipleReplace,\n})\n</script>\n\n<template>\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n as-child\n orientation=\"vertical\"\n :dir=\"dir\"\n >\n <Primitive\n role=\"tree\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-multiselectable=\"multiple ? true : undefined\"\n @keydown=\"handleKeydown\"\n @keydown.up.down.shift=\"handleKeydownNavigation\"\n >\n <slot\n :flatten-items=\"expandedItems\"\n :model-value=\"modelValue as M extends true ? U[] : U\"\n :expanded=\"expanded\"\n />\n </Primitive>\n </RovingFocusGroup>\n</template>\n"],"names":["createContext","toRefs","useTypeahead","useDirection","ref","createEventHook","useVModel","useSelectionBehavior","computed","items","MAP_KEY_TO_FOCUS_INTENT","nextTick","getActiveElement","flatten","val"],"mappings":"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"}
|
package/dist/Tree/TreeRoot.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, toRefs, ref, computed, createBlock, openBlock, unref, withCtx, createVNode, withKeys, withModifiers, renderSlot, nextTick } from 'vue';
|
|
2
|
-
import { M as MAP_KEY_TO_FOCUS_INTENT } from '../RovingFocus/utils.js';
|
|
3
2
|
import { createEventHook, useVModel } from '@vueuse/core';
|
|
3
|
+
import { M as MAP_KEY_TO_FOCUS_INTENT } from '../RovingFocus/utils.js';
|
|
4
4
|
import { f as flatten } from './utils.js';
|
|
5
5
|
import { c as createContext } from '../shared/createContext.js';
|
|
6
6
|
import { u as useTypeahead } from '../shared/useTypeahead.js';
|
|
@@ -22,10 +22,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
22
22
|
getKey: {},
|
|
23
23
|
getChildren: { type: Function, default: (val) => val.children },
|
|
24
24
|
selectionBehavior: { default: "toggle" },
|
|
25
|
-
multiple: {
|
|
25
|
+
multiple: {},
|
|
26
26
|
dir: {},
|
|
27
27
|
disabled: { type: Boolean },
|
|
28
28
|
propagateSelect: { type: Boolean },
|
|
29
|
+
bubbleSelect: { type: Boolean },
|
|
29
30
|
asChild: { type: Boolean },
|
|
30
31
|
as: { default: "ul" }
|
|
31
32
|
},
|
|
@@ -33,7 +34,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
33
34
|
setup(__props, { emit: __emit }) {
|
|
34
35
|
const props = __props;
|
|
35
36
|
const emits = __emit;
|
|
36
|
-
const { items, multiple, disabled, propagateSelect, dir: propDir } = toRefs(props);
|
|
37
|
+
const { items, multiple, disabled, propagateSelect, dir: propDir, bubbleSelect } = toRefs(props);
|
|
37
38
|
const { handleTypeaheadSearch } = useTypeahead();
|
|
38
39
|
const dir = useDirection(propDir);
|
|
39
40
|
const rovingFocusGroupRef = ref();
|
|
@@ -109,6 +110,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
109
110
|
);
|
|
110
111
|
});
|
|
111
112
|
}
|
|
113
|
+
function handleBubbleSelect(item) {
|
|
114
|
+
if (item.parentItem != null && Array.isArray(modelValue.value) && props.multiple) {
|
|
115
|
+
const parentItem = expandedItems.value.find((i) => {
|
|
116
|
+
return item.parentItem != null && props.getKey(i.value) === props.getKey(item.parentItem);
|
|
117
|
+
});
|
|
118
|
+
if (parentItem != null) {
|
|
119
|
+
const areAllChilredOfParentSelected = props.getChildren(parentItem.value)?.every((i) => modelValue.value.find((v) => props.getKey(v) === props.getKey(i)));
|
|
120
|
+
if (areAllChilredOfParentSelected) {
|
|
121
|
+
modelValue.value = [...modelValue.value, parentItem.value];
|
|
122
|
+
} else {
|
|
123
|
+
modelValue.value = modelValue.value.filter((v) => props.getKey(v) !== props.getKey(parentItem.value));
|
|
124
|
+
}
|
|
125
|
+
handleBubbleSelect(parentItem);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
112
129
|
provideTreeRootContext({
|
|
113
130
|
modelValue,
|
|
114
131
|
selectedKeys,
|
|
@@ -116,6 +133,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
116
133
|
const condition = (baseValue) => props.getKey(baseValue ?? {}) === props.getKey(val);
|
|
117
134
|
const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : void 0;
|
|
118
135
|
onSelectItem(val, condition);
|
|
136
|
+
if (props.bubbleSelect && props.multiple && Array.isArray(modelValue.value)) {
|
|
137
|
+
const item = expandedItems.value.find((i) => {
|
|
138
|
+
return props.getKey(i.value) === props.getKey(val);
|
|
139
|
+
});
|
|
140
|
+
if (item != null) {
|
|
141
|
+
handleBubbleSelect(item);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
119
144
|
if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {
|
|
120
145
|
const children = flatten(props.getChildren(val) ?? []);
|
|
121
146
|
if (exist) {
|
|
@@ -144,6 +169,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
144
169
|
multiple,
|
|
145
170
|
dir,
|
|
146
171
|
propagateSelect,
|
|
172
|
+
bubbleSelect,
|
|
147
173
|
isVirtual,
|
|
148
174
|
virtualKeydownHook,
|
|
149
175
|
handleMultipleReplace
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeRoot.js","sources":["../../src/Tree/TreeRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Direction } from '@/shared/types'\nimport { createContext, getActiveElement, useDirection, useSelectionBehavior, useTypeahead } from '@/shared'\nimport { flatten } from './utils'\n\nexport interface TreeRootProps<T = Record<string, any>, U extends Record<string, any> = Record<string, any>> extends PrimitiveProps {\n /** The controlled value of the tree. Can be binded with with `v-model`. */\n modelValue?: U | U[]\n /** The value of the tree when initially rendered. Use when you do not need to control the state of the tree */\n defaultValue?: U | U[]\n /** List of items */\n items?: T[]\n /** The controlled value of the expanded item. Can be binded with with `v-model`. */\n expanded?: string[]\n /** The value of the expanded tree when initially rendered. Use when you do not need to control the state of the expanded tree */\n defaultExpanded?: string[]\n /** This function is passed the index of each item and should return a unique key for that item */\n getKey: (val: T) => string\n /** This function is passed the index of each item and should return a list of children for that item */\n getChildren?: (val: T) => T[] | undefined\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: 'toggle' | 'replace'\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\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 tree */\n disabled?: boolean\n /** When `true`, selecting parent will select the descendants. */\n propagateSelect?: boolean\n}\n\nexport type TreeRootEmits<T = Record<string, any>> = {\n 'update:modelValue': [val: T]\n 'update:expanded': [val: string[]]\n}\n\ninterface TreeRootContext<T = Record<string, any>> {\n modelValue: Ref<T | T[]>\n selectedKeys: Ref<string[]>\n onSelect: (val: T) => void\n expanded: Ref<string[]>\n onToggle: (val: T) => void\n items: Ref<T[]>\n expandedItems: Ref<T[]>\n getKey: (val: T) => string\n getChildren: (val: T) => T[] | undefined\n multiple: Ref<boolean>\n disabled: Ref<boolean>\n dir: Ref<Direction>\n propagateSelect: Ref<boolean>\n isVirtual: Ref<boolean>\n virtualKeydownHook: EventHook<KeyboardEvent>\n\n handleMultipleReplace: ReturnType<typeof useSelectionBehavior>['handleMultipleReplace']\n}\n\nexport type FlattenedItem<T> = {\n _id: string\n index: number\n value: T\n level: number\n hasChildren: boolean\n parentItem?: T\n bind: {\n value: T\n level: number\n [key: string]: any\n }\n}\n\nexport const [injectTreeRootContext, provideTreeRootContext] = createContext<TreeRootContext<any>>('TreeRoot')\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends Record<string, any>, U extends Record<string, any>\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { Primitive } from '@/Primitive'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { computed, nextTick, ref, toRefs } from 'vue'\n\nconst props = withDefaults(defineProps<TreeRootProps<T, U>>(), {\n as: 'ul',\n selectionBehavior: 'toggle',\n getChildren: (val: T) => val.children,\n})\nconst emits = defineEmits<TreeRootEmits<U>>()\n\ndefineSlots<{\n default: (props: {\n flattenItems: FlattenedItem<T>[]\n modelValue: typeof modelValue.value\n expanded: typeof expanded.value\n }) => any\n}>()\n\nconst { items, multiple, disabled, propagateSelect, dir: propDir } = toRefs(props)\nconst { handleTypeaheadSearch } = useTypeahead()\nconst dir = useDirection(propDir)\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\n\n// Virtualizer\nconst isVirtual = ref(false)\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<U | U[]>\n\nconst expanded = useVModel(props, 'expanded', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultExpanded ?? [],\n passive: (props.expanded === undefined) as false,\n deep: true,\n}) as Ref<string[]>\n\nconst { onSelectItem, handleMultipleReplace } = useSelectionBehavior(modelValue, props)\n\nconst selectedKeys = computed(() => {\n if (multiple.value && Array.isArray(modelValue.value))\n return modelValue.value.map(i => props.getKey(i as any))\n else\n return [props.getKey(modelValue.value as any ?? {})]\n})\n\nfunction flattenItems(items: T[], level: number = 1, parentItem?: T): FlattenedItem<T>[] {\n return items.reduce((acc: FlattenedItem<T>[], item: T, index: number) => {\n const key = props.getKey(item)\n const children = props.getChildren(item)\n const isExpanded = expanded.value.includes(key)\n\n const flattenedItem: FlattenedItem<T> = {\n _id: key,\n value: item,\n index,\n level,\n parentItem,\n hasChildren: !!children,\n bind: {\n 'value': item,\n level,\n 'aria-setsize': items.length,\n 'aria-posinset': index + 1,\n },\n }\n acc.push(flattenedItem)\n\n if (children && isExpanded)\n acc.push(...flattenItems(children, level + 1, item))\n\n return acc\n }, [])\n}\n\nconst expandedItems = computed(() => {\n const items = props.items\n const expandedKeys = expanded.value.map(i => i)\n return flattenItems(items ?? [])\n})\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const collections = rovingFocusGroupRef.value?.getItems() ?? []\n handleTypeaheadSearch(event.key, collections)\n }\n}\n\nfunction handleKeydownNavigation(event: KeyboardEvent) {\n if (isVirtual.value)\n return\n\n const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n nextTick(() => {\n handleMultipleReplace(\n intent,\n getActiveElement(),\n rovingFocusGroupRef.value?.getItems!,\n expandedItems.value.map(i => i.value),\n )\n })\n}\n\nprovideTreeRootContext({\n modelValue,\n selectedKeys,\n onSelect: (val) => {\n const condition = (baseValue: U) => props.getKey(baseValue as any ?? {}) === props.getKey(val)\n const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : undefined\n onSelectItem(val, condition)\n\n if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {\n const children = flatten<U, any>(props.getChildren(val) ?? [])\n if (exist) {\n // remove all child\n modelValue.value = [...modelValue.value]\n .filter(i => !children.some(child => props.getKey(i as any ?? {}) === props.getKey(child as any)))\n }\n else {\n // select all child\n modelValue.value = [...modelValue.value, ...children]\n }\n }\n },\n expanded,\n onToggle(val) {\n const children = val ? props.getChildren(val) : undefined\n if (!children)\n return\n\n const key = props.getKey(val) ?? val\n if (expanded.value.includes(key))\n expanded.value = expanded.value.filter(val => val !== key)\n else\n expanded.value.push(key)\n },\n getKey: props.getKey,\n getChildren: props.getChildren,\n items,\n expandedItems,\n disabled,\n multiple,\n dir,\n propagateSelect,\n\n isVirtual,\n virtualKeydownHook,\n handleMultipleReplace,\n})\n</script>\n\n<template>\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n as-child\n orientation=\"vertical\"\n :dir=\"dir\"\n >\n <Primitive\n role=\"tree\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-multiselectable=\"multiple ? true : undefined\"\n @keydown=\"handleKeydown\"\n @keydown.up.down.shift=\"handleKeydownNavigation\"\n >\n <slot\n :flatten-items=\"expandedItems\"\n :model-value=\"modelValue\"\n :expanded=\"expanded\"\n />\n </Primitive>\n </RovingFocusGroup>\n</template>\n"],"names":["items","val"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeRoot.js","sources":["../../src/Tree/TreeRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Direction } from '@/shared/types'\nimport { createContext, getActiveElement, useDirection, useSelectionBehavior, useTypeahead } from '@/shared'\nimport { flatten } from './utils'\n\nexport interface TreeRootProps<T = Record<string, any>, U extends Record<string, any> = Record<string, any>, M extends boolean = false> extends PrimitiveProps {\n /** The controlled value of the tree. Can be binded with with `v-model`. */\n modelValue?: M extends true ? U[] : U\n /** The value of the tree when initially rendered. Use when you do not need to control the state of the tree */\n defaultValue?: M extends true ? U[] : U\n /** List of items */\n items?: T[]\n /** The controlled value of the expanded item. Can be binded with with `v-model`. */\n expanded?: string[]\n /** The value of the expanded tree when initially rendered. Use when you do not need to control the state of the expanded tree */\n defaultExpanded?: string[]\n /** This function is passed the index of each item and should return a unique key for that item */\n getKey: (val: T) => string\n /** This function is passed the index of each item and should return a list of children for that item */\n getChildren?: (val: T) => T[] | undefined\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: 'toggle' | 'replace'\n /** Whether multiple options can be selected or not. */\n multiple?: M\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 tree */\n disabled?: boolean\n /** When `true`, selecting parent will select the descendants. */\n propagateSelect?: boolean\n /** When `true`, selecting children will update the parent state. */\n bubbleSelect?: boolean\n}\n\nexport type TreeRootEmits<T = Record<string, any>, M extends boolean = false> = {\n 'update:modelValue': [val: M extends true ? T[] : T]\n 'update:expanded': [val: string[]]\n}\n\ninterface TreeRootContext<T = Record<string, any>> {\n modelValue: Ref<T | T[]>\n selectedKeys: Ref<string[]>\n onSelect: (val: T) => void\n expanded: Ref<string[]>\n onToggle: (val: T) => void\n items: Ref<T[]>\n expandedItems: Ref<T[]>\n getKey: (val: T) => string\n getChildren: (val: T) => T[] | undefined\n multiple: Ref<boolean>\n disabled: Ref<boolean>\n dir: Ref<Direction>\n propagateSelect: Ref<boolean>\n bubbleSelect: Ref<boolean>\n isVirtual: Ref<boolean>\n virtualKeydownHook: EventHook<KeyboardEvent>\n\n handleMultipleReplace: ReturnType<typeof useSelectionBehavior>['handleMultipleReplace']\n}\n\nexport type FlattenedItem<T> = {\n _id: string\n index: number\n value: T\n level: number\n hasChildren: boolean\n parentItem?: T\n bind: {\n value: T\n level: number\n [key: string]: any\n }\n}\n\nexport const [injectTreeRootContext, provideTreeRootContext] = createContext<TreeRootContext<any>>('TreeRoot')\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends Record<string, any>, U extends Record<string, any>, M extends boolean = false\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { computed, nextTick, ref, toRefs } from 'vue'\nimport { Primitive } from '@/Primitive'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\n\nconst props = withDefaults(defineProps<TreeRootProps<T, U, M>>(), {\n as: 'ul',\n selectionBehavior: 'toggle',\n getChildren: (val: T) => val.children,\n})\nconst emits = defineEmits<TreeRootEmits<U, M>>()\n\ndefineSlots<{\n default?: (props: {\n flattenItems: FlattenedItem<T>[]\n modelValue: M extends true ? U[] : U\n expanded: typeof expanded.value\n }) => any\n}>()\n\nconst { items, multiple, disabled, propagateSelect, dir: propDir, bubbleSelect } = toRefs(props)\nconst { handleTypeaheadSearch } = useTypeahead()\nconst dir = useDirection(propDir)\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\n\n// Virtualizer\nconst isVirtual = ref(false)\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<U | U[]>\n\nconst expanded = useVModel(props, 'expanded', emits, {\n // @ts-expect-error idk\n defaultValue: props.defaultExpanded ?? [],\n passive: (props.expanded === undefined) as false,\n deep: true,\n}) as Ref<string[]>\n\nconst { onSelectItem, handleMultipleReplace } = useSelectionBehavior(modelValue, props)\n\nconst selectedKeys = computed(() => {\n if (multiple.value && Array.isArray(modelValue.value))\n return modelValue.value.map(i => props.getKey(i as any))\n else\n return [props.getKey(modelValue.value as any ?? {})]\n})\n\nfunction flattenItems(items: T[], level: number = 1, parentItem?: T): FlattenedItem<T>[] {\n return items.reduce((acc: FlattenedItem<T>[], item: T, index: number) => {\n const key = props.getKey(item)\n const children = props.getChildren(item)\n const isExpanded = expanded.value.includes(key)\n\n const flattenedItem: FlattenedItem<T> = {\n _id: key,\n value: item,\n index,\n level,\n parentItem,\n hasChildren: !!children,\n bind: {\n 'value': item,\n level,\n 'aria-setsize': items.length,\n 'aria-posinset': index + 1,\n },\n }\n acc.push(flattenedItem)\n\n if (children && isExpanded)\n acc.push(...flattenItems(children, level + 1, item))\n\n return acc\n }, [])\n}\n\nconst expandedItems = computed(() => {\n const items = props.items\n const expandedKeys = expanded.value.map(i => i)\n return flattenItems(items ?? [])\n})\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const collections = rovingFocusGroupRef.value?.getItems() ?? []\n handleTypeaheadSearch(event.key, collections)\n }\n}\n\nfunction handleKeydownNavigation(event: KeyboardEvent) {\n if (isVirtual.value)\n return\n\n const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n nextTick(() => {\n handleMultipleReplace(\n intent,\n getActiveElement(),\n rovingFocusGroupRef.value?.getItems!,\n expandedItems.value.map(i => i.value),\n )\n })\n}\n\nfunction handleBubbleSelect(item: FlattenedItem<T>) {\n if (item.parentItem != null && Array.isArray(modelValue.value) && props.multiple) {\n const parentItem = expandedItems.value.find((i) => {\n return item.parentItem != null && props.getKey(i.value) === props.getKey(item.parentItem)\n })\n\n if (parentItem != null) {\n const areAllChilredOfParentSelected = props.getChildren(parentItem.value)?.every(i => modelValue.value.find((v: any) => props.getKey(v) === props.getKey(i)))\n\n if (areAllChilredOfParentSelected) {\n modelValue.value = [...modelValue.value, parentItem.value as any]\n }\n else {\n modelValue.value = modelValue.value.filter((v: any) => props.getKey(v) !== props.getKey(parentItem.value))\n }\n\n handleBubbleSelect(parentItem)\n }\n }\n}\n\nprovideTreeRootContext({\n modelValue,\n selectedKeys,\n onSelect: (val) => {\n const condition = (baseValue: U) => props.getKey(baseValue as any ?? {}) === props.getKey(val)\n const exist = props.multiple && Array.isArray(modelValue.value) ? modelValue.value?.findIndex(condition) !== -1 : undefined\n onSelectItem(val, condition)\n\n if (props.bubbleSelect && props.multiple && Array.isArray(modelValue.value)) {\n const item = expandedItems.value.find((i) => {\n return props.getKey(i.value) === props.getKey(val)\n })\n if (item != null) {\n handleBubbleSelect(item)\n }\n }\n\n if (props.propagateSelect && props.multiple && Array.isArray(modelValue.value)) {\n const children = flatten<U, any>(props.getChildren(val) ?? [])\n\n if (exist) {\n // remove all child\n modelValue.value = [...modelValue.value]\n .filter(i => !children.some(child => props.getKey(i as any ?? {}) === props.getKey(child as any)))\n }\n else {\n // select all child\n modelValue.value = [...modelValue.value, ...children]\n }\n }\n },\n expanded,\n onToggle(val) {\n const children = val ? props.getChildren(val) : undefined\n if (!children)\n return\n\n const key = props.getKey(val) ?? val\n if (expanded.value.includes(key))\n expanded.value = expanded.value.filter(val => val !== key)\n else\n expanded.value.push(key)\n },\n getKey: props.getKey,\n getChildren: props.getChildren,\n items,\n expandedItems,\n disabled,\n multiple,\n dir,\n propagateSelect,\n bubbleSelect,\n\n isVirtual,\n virtualKeydownHook,\n handleMultipleReplace,\n})\n</script>\n\n<template>\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n as-child\n orientation=\"vertical\"\n :dir=\"dir\"\n >\n <Primitive\n role=\"tree\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-multiselectable=\"multiple ? true : undefined\"\n @keydown=\"handleKeydown\"\n @keydown.up.down.shift=\"handleKeydownNavigation\"\n >\n <slot\n :flatten-items=\"expandedItems\"\n :model-value=\"modelValue as M extends true ? U[] : U\"\n :expanded=\"expanded\"\n />\n </Primitive>\n </RovingFocusGroup>\n</template>\n"],"names":["items","val"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const vue = require('vue');
|
|
4
|
+
const vueVirtual = require('@tanstack/vue-virtual');
|
|
5
|
+
const core = require('@vueuse/core');
|
|
4
6
|
const Collection_Collection = require('../Collection/Collection.cjs');
|
|
5
7
|
const RovingFocus_utils = require('../RovingFocus/utils.cjs');
|
|
6
8
|
const shared_useTypeahead = require('../shared/useTypeahead.cjs');
|
|
7
|
-
const vueVirtual = require('@tanstack/vue-virtual');
|
|
8
|
-
const core = require('@vueuse/core');
|
|
9
9
|
const shared_getActiveElement = require('../shared/getActiveElement.cjs');
|
|
10
10
|
const Tree_TreeRoot = require('./TreeRoot.cjs');
|
|
11
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeVirtualizer.cjs","sources":["../../src/Tree/TreeVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface TreeVirtualizerProps {\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?: (item: Record<string, any>) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref } from 'vue'\nimport type { FlattenedItem } from './TreeRoot.vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { refAutoReset, useParentElement } from '@vueuse/core'\nimport { cloneVNode, computed, nextTick, useSlots } from 'vue'\nimport { injectTreeRootContext } from './TreeRoot.vue'\n\nconst props = defineProps<TreeVirtualizerProps>()\n\ndefineSlots<{\n default: (props: {\n item: FlattenedItem<Record<string, any>>\n virtualizer: Virtualizer<Element | Window, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectTreeRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection()\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: Record<string, any>) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option.toString().toLowerCase()\n }\n\n return rootContext.expandedItems.value.map((option, index) => ({\n index,\n textContent: parseTextContent(option.value),\n }))\n})\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 rootContext.expandedItems.value.length ?? 0 },\n get horizontal() { return false },\n getItemKey(index) {\n return index + rootContext.getKey(rootContext.expandedItems.value[index].value)\n },\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 return {\n item,\n is: cloneVNode(slots.default!({\n item: rootContext.expandedItems.value[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })![0], {\n 'data-index': item.index,\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\nfunction scrollToIndexAndFocus(index: number) {\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${index}\"]`) as HTMLElement\n if (item instanceof HTMLElement)\n item.focus()\n })\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 const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : rootContext.expandedItems.value.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 item.ref.focus()\n })\n }\n else if (intent === 'prev' && event.key !== 'ArrowUp') {\n const currentElement = getActiveElement() as HTMLElement\n const currentIndex = Number(currentElement.getAttribute('data-index'))\n const currentLevel = Number(currentElement.getAttribute('data-indent'))\n const list = rootContext.expandedItems.value.slice(0, currentIndex).map((item, index) => ({ ...item, index })).reverse()\n\n const parentItem = list.find(item => item.level === (currentLevel - 1))\n if (parentItem)\n scrollToIndexAndFocus(parentItem.index)\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 scrollToIndexAndFocus(nextMatch.index)\n }\n\n nextTick(() => {\n if (event.shiftKey && intent)\n rootContext.handleMultipleReplace(intent, getActiveElement(), getItems, rootContext.expandedItems.value.map(i => i.value))\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.key\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectTreeRootContext","useParentElement","useCollection","refAutoReset","computed","useVirtualizer","cloneVNode","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch","nextTick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeVirtualizer.cjs","sources":["../../src/Tree/TreeVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface TreeVirtualizerProps {\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?: (item: Record<string, any>) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref } from 'vue'\nimport type { FlattenedItem } from './TreeRoot.vue'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { refAutoReset, useParentElement } from '@vueuse/core'\nimport { cloneVNode, computed, nextTick, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectTreeRootContext } from './TreeRoot.vue'\n\nconst props = defineProps<TreeVirtualizerProps>()\n\ndefineSlots<{\n default?: (props: {\n item: FlattenedItem<Record<string, any>>\n virtualizer: Virtualizer<Element | Window, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectTreeRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection()\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: Record<string, any>) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option.toString().toLowerCase()\n }\n\n return rootContext.expandedItems.value.map((option, index) => ({\n index,\n textContent: parseTextContent(option.value),\n }))\n})\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 rootContext.expandedItems.value.length ?? 0 },\n get horizontal() { return false },\n getItemKey(index) {\n return index + rootContext.getKey(rootContext.expandedItems.value[index].value)\n },\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 return {\n item,\n is: cloneVNode(slots.default!({\n item: rootContext.expandedItems.value[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })![0], {\n 'data-index': item.index,\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\nfunction scrollToIndexAndFocus(index: number) {\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${index}\"]`) as HTMLElement\n if (item instanceof HTMLElement)\n item.focus()\n })\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 const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : rootContext.expandedItems.value.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 item.ref.focus()\n })\n }\n else if (intent === 'prev' && event.key !== 'ArrowUp') {\n const currentElement = getActiveElement() as HTMLElement\n const currentIndex = Number(currentElement.getAttribute('data-index'))\n const currentLevel = Number(currentElement.getAttribute('data-indent'))\n const list = rootContext.expandedItems.value.slice(0, currentIndex).map((item, index) => ({ ...item, index })).reverse()\n\n const parentItem = list.find(item => item.level === (currentLevel - 1))\n if (parentItem)\n scrollToIndexAndFocus(parentItem.index)\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 scrollToIndexAndFocus(nextMatch.index)\n }\n\n nextTick(() => {\n if (event.shiftKey && intent)\n rootContext.handleMultipleReplace(intent, getActiveElement(), getItems, rootContext.expandedItems.value.map(i => i.value))\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.key\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectTreeRootContext","useParentElement","useCollection","refAutoReset","computed","useVirtualizer","cloneVNode","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch","nextTick"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { defineComponent, useSlots, computed, cloneVNode, nextTick, createElementBlock, openBlock, normalizeStyle, unref, Fragment, renderList, createBlock, resolveDynamicComponent } from 'vue';
|
|
2
|
+
import { useVirtualizer } from '@tanstack/vue-virtual';
|
|
3
|
+
import { useParentElement, refAutoReset } from '@vueuse/core';
|
|
2
4
|
import { u as useCollection } from '../Collection/Collection.js';
|
|
3
5
|
import { M as MAP_KEY_TO_FOCUS_INTENT } from '../RovingFocus/utils.js';
|
|
4
6
|
import { g as getNextMatch } from '../shared/useTypeahead.js';
|
|
5
|
-
import { useVirtualizer } from '@tanstack/vue-virtual';
|
|
6
|
-
import { useParentElement, refAutoReset } from '@vueuse/core';
|
|
7
7
|
import { g as getActiveElement } from '../shared/getActiveElement.js';
|
|
8
8
|
import { i as injectTreeRootContext } from './TreeRoot.js';
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeVirtualizer.js","sources":["../../src/Tree/TreeVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface TreeVirtualizerProps {\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?: (item: Record<string, any>) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref } from 'vue'\nimport type { FlattenedItem } from './TreeRoot.vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { refAutoReset, useParentElement } from '@vueuse/core'\nimport { cloneVNode, computed, nextTick, useSlots } from 'vue'\nimport { injectTreeRootContext } from './TreeRoot.vue'\n\nconst props = defineProps<TreeVirtualizerProps>()\n\ndefineSlots<{\n default: (props: {\n item: FlattenedItem<Record<string, any>>\n virtualizer: Virtualizer<Element | Window, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectTreeRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection()\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: Record<string, any>) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option.toString().toLowerCase()\n }\n\n return rootContext.expandedItems.value.map((option, index) => ({\n index,\n textContent: parseTextContent(option.value),\n }))\n})\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 rootContext.expandedItems.value.length ?? 0 },\n get horizontal() { return false },\n getItemKey(index) {\n return index + rootContext.getKey(rootContext.expandedItems.value[index].value)\n },\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 return {\n item,\n is: cloneVNode(slots.default!({\n item: rootContext.expandedItems.value[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })![0], {\n 'data-index': item.index,\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\nfunction scrollToIndexAndFocus(index: number) {\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${index}\"]`) as HTMLElement\n if (item instanceof HTMLElement)\n item.focus()\n })\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 const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : rootContext.expandedItems.value.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 item.ref.focus()\n })\n }\n else if (intent === 'prev' && event.key !== 'ArrowUp') {\n const currentElement = getActiveElement() as HTMLElement\n const currentIndex = Number(currentElement.getAttribute('data-index'))\n const currentLevel = Number(currentElement.getAttribute('data-indent'))\n const list = rootContext.expandedItems.value.slice(0, currentIndex).map((item, index) => ({ ...item, index })).reverse()\n\n const parentItem = list.find(item => item.level === (currentLevel - 1))\n if (parentItem)\n scrollToIndexAndFocus(parentItem.index)\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 scrollToIndexAndFocus(nextMatch.index)\n }\n\n nextTick(() => {\n if (event.shiftKey && intent)\n rootContext.handleMultipleReplace(intent, getActiveElement(), getItems, rootContext.expandedItems.value.map(i => i.value))\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.key\"\n />\n </div>\n</template>\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeVirtualizer.js","sources":["../../src/Tree/TreeVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface TreeVirtualizerProps {\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?: (item: Record<string, any>) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref } from 'vue'\nimport type { FlattenedItem } from './TreeRoot.vue'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { refAutoReset, useParentElement } from '@vueuse/core'\nimport { cloneVNode, computed, nextTick, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectTreeRootContext } from './TreeRoot.vue'\n\nconst props = defineProps<TreeVirtualizerProps>()\n\ndefineSlots<{\n default?: (props: {\n item: FlattenedItem<Record<string, any>>\n virtualizer: Virtualizer<Element | Window, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectTreeRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection()\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: Record<string, any>) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option.toString().toLowerCase()\n }\n\n return rootContext.expandedItems.value.map((option, index) => ({\n index,\n textContent: parseTextContent(option.value),\n }))\n})\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 rootContext.expandedItems.value.length ?? 0 },\n get horizontal() { return false },\n getItemKey(index) {\n return index + rootContext.getKey(rootContext.expandedItems.value[index].value)\n },\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 return {\n item,\n is: cloneVNode(slots.default!({\n item: rootContext.expandedItems.value[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })![0], {\n 'data-index': item.index,\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\nfunction scrollToIndexAndFocus(index: number) {\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${index}\"]`) as HTMLElement\n if (item instanceof HTMLElement)\n item.focus()\n })\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 const intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : rootContext.expandedItems.value.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 item.ref.focus()\n })\n }\n else if (intent === 'prev' && event.key !== 'ArrowUp') {\n const currentElement = getActiveElement() as HTMLElement\n const currentIndex = Number(currentElement.getAttribute('data-index'))\n const currentLevel = Number(currentElement.getAttribute('data-indent'))\n const list = rootContext.expandedItems.value.slice(0, currentIndex).map((item, index) => ({ ...item, index })).reverse()\n\n const parentItem = list.find(item => item.level === (currentLevel - 1))\n if (parentItem)\n scrollToIndexAndFocus(parentItem.index)\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 scrollToIndexAndFocus(nextMatch.index)\n }\n\n nextTick(() => {\n if (event.shiftKey && intent)\n rootContext.handleMultipleReplace(intent, getActiveElement(), getItems, rootContext.expandedItems.value.map(i => i.value))\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.key\"\n />\n </div>\n</template>\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewport.cjs","sources":["../../src/Viewport/Viewport.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport {
|
|
1
|
+
{"version":3,"file":"Viewport.cjs","sources":["../../src/Viewport/Viewport.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { toRefs } from 'vue'\nimport { useForwardExpose } from '@/shared'\nimport { useNonce } from '@/shared/useNonce'\n\nexport interface ViewportProps extends PrimitiveProps {\n /**\n * Will add `nonce` attribute to the style tag which can be used by Content Security Policy. <br> If omitted, inherits globally from `ConfigProvider`.\n */\n nonce?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Primitive } from '@/Primitive'\n\nconst props = defineProps<ViewportProps>()\nconst { forwardRef } = useForwardExpose()\n\nconst { nonce: propNonce } = toRefs(props)\nconst nonce = useNonce(propNonce)\n</script>\n\n<template>\n <Primitive\n v-bind=\"{ ...$attrs, ...props }\"\n :ref=\"forwardRef\"\n data-reka-viewport\n role=\"presentation\"\n :style=\"{\n // we use position: 'relative' here on the `viewport` so that when we call\n // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport\n // (independent of the scrollUpButton).\n position: 'relative',\n flex: 1,\n overflow: 'auto',\n }\"\n >\n <slot />\n </Primitive>\n <Primitive\n as=\"style\"\n :nonce=\"nonce\"\n >\n /* Hide scrollbars cross-browser and enable momentum scroll for touch\n devices */ [data-reka-viewport] { scrollbar-width:none; -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch; }\n [data-reka-viewport]::-webkit-scrollbar { display: none; }\n </Primitive>\n</template>\n"],"names":["useForwardExpose","toRefs","useNonce"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAM,MAAA,EAAE,UAAW,EAAA,GAAIA,wCAAiB,EAAA;AAExC,IAAA,MAAM,EAAE,KAAA,EAAO,SAAU,EAAA,GAAIC,WAAO,KAAK,CAAA;AACzC,IAAM,MAAA,KAAA,GAAQC,yBAAS,SAAS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewport.js","sources":["../../src/Viewport/Viewport.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport {
|
|
1
|
+
{"version":3,"file":"Viewport.js","sources":["../../src/Viewport/Viewport.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport { toRefs } from 'vue'\nimport { useForwardExpose } from '@/shared'\nimport { useNonce } from '@/shared/useNonce'\n\nexport interface ViewportProps extends PrimitiveProps {\n /**\n * Will add `nonce` attribute to the style tag which can be used by Content Security Policy. <br> If omitted, inherits globally from `ConfigProvider`.\n */\n nonce?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Primitive } from '@/Primitive'\n\nconst props = defineProps<ViewportProps>()\nconst { forwardRef } = useForwardExpose()\n\nconst { nonce: propNonce } = toRefs(props)\nconst nonce = useNonce(propNonce)\n</script>\n\n<template>\n <Primitive\n v-bind=\"{ ...$attrs, ...props }\"\n :ref=\"forwardRef\"\n data-reka-viewport\n role=\"presentation\"\n :style=\"{\n // we use position: 'relative' here on the `viewport` so that when we call\n // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport\n // (independent of the scrollUpButton).\n position: 'relative',\n flex: 1,\n overflow: 'auto',\n }\"\n >\n <slot />\n </Primitive>\n <Primitive\n as=\"style\"\n :nonce=\"nonce\"\n >\n /* Hide scrollbars cross-browser and enable momentum scroll for touch\n devices */ [data-reka-viewport] { scrollbar-width:none; -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch; }\n [data-reka-viewport]::-webkit-scrollbar { display: none; }\n </Primitive>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;AAiBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAM,MAAA,EAAE,UAAW,EAAA,GAAI,gBAAiB,EAAA;AAExC,IAAA,MAAM,EAAE,KAAA,EAAO,SAAU,EAAA,GAAI,OAAO,KAAK,CAAA;AACzC,IAAM,MAAA,KAAA,GAAQ,SAAS,SAAS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisuallyHiddenInputBubble.cjs","sources":["../../src/VisuallyHidden/VisuallyHiddenInputBubble.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface VisuallyHiddenInputBubbleProps<T> {\n name: string\n value: T\n checked?: boolean\n required?: boolean\n disabled?: boolean\n feature?: VisuallyHiddenProps['feature']\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport type { VisuallyHiddenProps } from './VisuallyHidden.vue'\nimport {
|
|
1
|
+
{"version":3,"file":"VisuallyHiddenInputBubble.cjs","sources":["../../src/VisuallyHidden/VisuallyHiddenInputBubble.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface VisuallyHiddenInputBubbleProps<T> {\n name: string\n value: T\n checked?: boolean\n required?: boolean\n disabled?: boolean\n feature?: VisuallyHiddenProps['feature']\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport type { VisuallyHiddenProps } from './VisuallyHidden.vue'\nimport { computed, watch } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport VisuallyHidden from './VisuallyHidden.vue'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<VisuallyHiddenInputBubbleProps<T>>(), {\n feature: 'fully-hidden',\n checked: undefined,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst valueState = computed(() => props.checked ?? props.value)\n\nwatch(valueState, (cur, prev) => {\n if (!currentElement.value)\n return\n\n const input = currentElement.value as HTMLInputElement\n const inputProto = window.HTMLInputElement.prototype\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, 'value') as PropertyDescriptor\n const setValue = descriptor.set\n if (setValue && cur !== prev) {\n const inputEvent = new Event('input', { bubbles: true })\n const changeEvent = new Event('change', { bubbles: true })\n setValue.call(input, cur)\n input.dispatchEvent(inputEvent)\n input.dispatchEvent(changeEvent)\n }\n})\n</script>\n\n<template>\n <VisuallyHidden\n ref=\"primitiveElement\"\n v-bind=\"{ ...props, ...$attrs }\"\n as=\"input\"\n />\n</template>\n"],"names":["usePrimitiveElement","computed","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAKd,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAIA,iDAAoB,EAAA;AACjE,IAAA,MAAM,aAAaC,YAAS,CAAA,MAAM,KAAM,CAAA,OAAA,IAAW,MAAM,KAAK,CAAA;AAE9D,IAAMC,SAAA,CAAA,UAAA,EAAY,CAAC,GAAA,EAAK,IAAS,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAe,CAAA,KAAA;AAClB,QAAA;AAEF,MAAA,MAAM,QAAQ,cAAe,CAAA,KAAA;AAC7B,MAAM,MAAA,UAAA,GAAa,OAAO,gBAAiB,CAAA,SAAA;AAC3C,MAAA,MAAM,UAAa,GAAA,MAAA,CAAO,wBAAyB,CAAA,UAAA,EAAY,OAAO,CAAA;AACtE,MAAA,MAAM,WAAW,UAAW,CAAA,GAAA;AAC5B,MAAI,IAAA,QAAA,IAAY,QAAQ,IAAM,EAAA;AAC5B,QAAA,MAAM,aAAa,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AACvD,QAAA,MAAM,cAAc,IAAI,KAAA,CAAM,UAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD,QAAS,QAAA,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACxB,QAAA,KAAA,CAAM,cAAc,UAAU,CAAA;AAC9B,QAAA,KAAA,CAAM,cAAc,WAAW,CAAA;AAAA;AACjC,KACD,CAAA;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisuallyHiddenInputBubble.js","sources":["../../src/VisuallyHidden/VisuallyHiddenInputBubble.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface VisuallyHiddenInputBubbleProps<T> {\n name: string\n value: T\n checked?: boolean\n required?: boolean\n disabled?: boolean\n feature?: VisuallyHiddenProps['feature']\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport type { VisuallyHiddenProps } from './VisuallyHidden.vue'\nimport {
|
|
1
|
+
{"version":3,"file":"VisuallyHiddenInputBubble.js","sources":["../../src/VisuallyHidden/VisuallyHiddenInputBubble.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface VisuallyHiddenInputBubbleProps<T> {\n name: string\n value: T\n checked?: boolean\n required?: boolean\n disabled?: boolean\n feature?: VisuallyHiddenProps['feature']\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport type { VisuallyHiddenProps } from './VisuallyHidden.vue'\nimport { computed, watch } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport VisuallyHidden from './VisuallyHidden.vue'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<VisuallyHiddenInputBubbleProps<T>>(), {\n feature: 'fully-hidden',\n checked: undefined,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst valueState = computed(() => props.checked ?? props.value)\n\nwatch(valueState, (cur, prev) => {\n if (!currentElement.value)\n return\n\n const input = currentElement.value as HTMLInputElement\n const inputProto = window.HTMLInputElement.prototype\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, 'value') as PropertyDescriptor\n const setValue = descriptor.set\n if (setValue && cur !== prev) {\n const inputEvent = new Event('input', { bubbles: true })\n const changeEvent = new Event('change', { bubbles: true })\n setValue.call(input, cur)\n input.dispatchEvent(inputEvent)\n input.dispatchEvent(changeEvent)\n }\n})\n</script>\n\n<template>\n <VisuallyHidden\n ref=\"primitiveElement\"\n v-bind=\"{ ...props, ...$attrs }\"\n as=\"input\"\n />\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAKd,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAI,mBAAoB,EAAA;AACjE,IAAA,MAAM,aAAa,QAAS,CAAA,MAAM,KAAM,CAAA,OAAA,IAAW,MAAM,KAAK,CAAA;AAE9D,IAAM,KAAA,CAAA,UAAA,EAAY,CAAC,GAAA,EAAK,IAAS,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAe,CAAA,KAAA;AAClB,QAAA;AAEF,MAAA,MAAM,QAAQ,cAAe,CAAA,KAAA;AAC7B,MAAM,MAAA,UAAA,GAAa,OAAO,gBAAiB,CAAA,SAAA;AAC3C,MAAA,MAAM,UAAa,GAAA,MAAA,CAAO,wBAAyB,CAAA,UAAA,EAAY,OAAO,CAAA;AACtE,MAAA,MAAM,WAAW,UAAW,CAAA,GAAA;AAC5B,MAAI,IAAA,QAAA,IAAY,QAAQ,IAAM,EAAA;AAC5B,QAAA,MAAM,aAAa,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AACvD,QAAA,MAAM,cAAc,IAAI,KAAA,CAAM,UAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD,QAAS,QAAA,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACxB,QAAA,KAAA,CAAM,cAAc,UAAU,CAAA;AAC9B,QAAA,KAAA,CAAM,cAAc,WAAW,CAAA;AAAA;AACjC,KACD,CAAA;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseSeparator.cjs","sources":["../../src/shared/component/BaseSeparator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {
|
|
1
|
+
{"version":3,"file":"BaseSeparator.cjs","sources":["../../src/shared/component/BaseSeparator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DataOrientation } from '../types'\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface BaseSeparatorProps extends PrimitiveProps {\n /**\n * Orientation of the component.\n *\n * Either `vertical` or `horizontal`. Defaults to `horizontal`.\n */\n orientation?: DataOrientation\n /**\n * Whether or not the component is purely decorative. <br>When `true`, accessibility-related attributes\n * are updated so that that the rendered element is removed from the accessibility tree.\n */\n decorative?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Primitive } from '@/Primitive'\n\nconst props = withDefaults(defineProps<BaseSeparatorProps>(), {\n orientation: 'horizontal',\n})\n\nconst ORIENTATIONS = ['horizontal', 'vertical'] as const\nfunction isValidOrientation(orientation: any): orientation is DataOrientation {\n return ORIENTATIONS.includes(orientation)\n}\n\nconst computedOrientation = computed(() =>\n isValidOrientation(props.orientation) ? props.orientation : 'horizontal',\n)\n// `aria-orientation` defaults to `horizontal` so we only need it if `orientation` is vertical\nconst ariaOrientation = computed(() =>\n computedOrientation.value === 'vertical' ? props.orientation : undefined,\n)\n\nconst semanticProps = computed(() =>\n props.decorative\n ? { role: 'none' }\n : { 'aria-orientation': ariaOrientation.value, 'role': 'separator' },\n)\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-orientation=\"computedOrientation\"\n v-bind=\"semanticProps\"\n >\n <slot />\n </Primitive>\n</template>\n"],"names":["computed"],"mappings":";;;;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAId,IAAM,MAAA,YAAA,GAAe,CAAC,YAAA,EAAc,UAAU,CAAA;AAC9C,IAAA,SAAS,mBAAmB,WAAkD,EAAA;AAC5E,MAAO,OAAA,YAAA,CAAa,SAAS,WAAW,CAAA;AAAA;AAG1C,IAAA,MAAM,mBAAsB,GAAAA,YAAA;AAAA,MAAS,MACnC,kBAAmB,CAAA,KAAA,CAAM,WAAW,CAAA,GAAI,MAAM,WAAc,GAAA;AAAA,KAC9D;AAEA,IAAA,MAAM,eAAkB,GAAAA,YAAA;AAAA,MAAS,MAC/B,mBAAA,CAAoB,KAAU,KAAA,UAAA,GAAa,MAAM,WAAc,GAAA;AAAA,KACjE;AAEA,IAAA,MAAM,aAAgB,GAAAA,YAAA;AAAA,MAAS,MAC7B,KAAA,CAAM,UACF,GAAA,EAAE,IAAM,EAAA,MAAA,EACR,GAAA,EAAE,kBAAoB,EAAA,eAAA,CAAgB,KAAO,EAAA,MAAA,EAAQ,WAAY;AAAA,KACvE;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseSeparator.js","sources":["../../src/shared/component/BaseSeparator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {
|
|
1
|
+
{"version":3,"file":"BaseSeparator.js","sources":["../../src/shared/component/BaseSeparator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DataOrientation } from '../types'\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface BaseSeparatorProps extends PrimitiveProps {\n /**\n * Orientation of the component.\n *\n * Either `vertical` or `horizontal`. Defaults to `horizontal`.\n */\n orientation?: DataOrientation\n /**\n * Whether or not the component is purely decorative. <br>When `true`, accessibility-related attributes\n * are updated so that that the rendered element is removed from the accessibility tree.\n */\n decorative?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Primitive } from '@/Primitive'\n\nconst props = withDefaults(defineProps<BaseSeparatorProps>(), {\n orientation: 'horizontal',\n})\n\nconst ORIENTATIONS = ['horizontal', 'vertical'] as const\nfunction isValidOrientation(orientation: any): orientation is DataOrientation {\n return ORIENTATIONS.includes(orientation)\n}\n\nconst computedOrientation = computed(() =>\n isValidOrientation(props.orientation) ? props.orientation : 'horizontal',\n)\n// `aria-orientation` defaults to `horizontal` so we only need it if `orientation` is vertical\nconst ariaOrientation = computed(() =>\n computedOrientation.value === 'vertical' ? props.orientation : undefined,\n)\n\nconst semanticProps = computed(() =>\n props.decorative\n ? { role: 'none' }\n : { 'aria-orientation': ariaOrientation.value, 'role': 'separator' },\n)\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-orientation=\"computedOrientation\"\n v-bind=\"semanticProps\"\n >\n <slot />\n </Primitive>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAId,IAAM,MAAA,YAAA,GAAe,CAAC,YAAA,EAAc,UAAU,CAAA;AAC9C,IAAA,SAAS,mBAAmB,WAAkD,EAAA;AAC5E,MAAO,OAAA,YAAA,CAAa,SAAS,WAAW,CAAA;AAAA;AAG1C,IAAA,MAAM,mBAAsB,GAAA,QAAA;AAAA,MAAS,MACnC,kBAAmB,CAAA,KAAA,CAAM,WAAW,CAAA,GAAI,MAAM,WAAc,GAAA;AAAA,KAC9D;AAEA,IAAA,MAAM,eAAkB,GAAA,QAAA;AAAA,MAAS,MAC/B,mBAAA,CAAoB,KAAU,KAAA,UAAA,GAAa,MAAM,WAAc,GAAA;AAAA,KACjE;AAEA,IAAA,MAAM,aAAgB,GAAA,QAAA;AAAA,MAAS,MAC7B,KAAA,CAAM,UACF,GAAA,EAAE,IAAM,EAAA,MAAA,EACR,GAAA,EAAE,kBAAoB,EAAA,eAAA,CAAgB,KAAO,EAAA,MAAA,EAAQ,WAAY;AAAA,KACvE;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.cjs","sources":["../../src/date/calendar.ts"],"sourcesContent":["/*\n * Implementation ported from from from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/calendar/create.ts\n*/\n\nimport type { DateRange } from '@/shared'\nimport type { DateValue } from '@internationalized/date'\nimport type { Grid } from './types'\nimport { endOfMonth, endOfYear, startOfMonth, startOfYear } from '@internationalized/date'\nimport { getDaysInMonth, getLastFirstDayOfWeek, getNextLastDayOfWeek } from './comparators'\nimport { chunk } from './utils'\n\nexport type WeekDayFormat = 'narrow' | 'short' | 'long'\n\nexport type CreateSelectProps = {\n /**\n * The date object representing the date (usually the first day of the month/year).\n */\n dateObj: DateValue\n}\n\nexport type CreateMonthProps = {\n /**\n * The date object representing the month's date (usually the first day of the month).\n */\n dateObj: DateValue\n\n /**\n * The day of the week to start the calendar on (0 for Sunday, 1 for Monday, etc.).\n */\n weekStartsOn: number\n\n /**\n * Whether to always render 6 weeks in the calendar, even if the month doesn't\n * span 6 weeks.\n */\n fixedWeeks: boolean\n\n /**\n * The locale to use when creating the calendar month.\n */\n locale: string\n}\n\n/**\n * Retrieves an array of date values representing the days between\n * the provided start and end dates.\n */\nexport function getDaysBetween(start: DateValue, end: DateValue) {\n const days: DateValue[] = []\n let dCurrent = start.add({ days: 1 })\n const dEnd = end\n while (dCurrent.compare(dEnd) < 0) {\n days.push(dCurrent)\n dCurrent = dCurrent.add({ days: 1 })\n }\n return days\n}\n\nexport function createMonth(props: CreateMonthProps): Grid<DateValue> {\n const { dateObj, weekStartsOn, fixedWeeks, locale } = props\n const daysInMonth = getDaysInMonth(dateObj)\n\n const datesArray = Array.from({ length: daysInMonth }, (_, i) => dateObj.set({ day: i + 1 }))\n\n const firstDayOfMonth = startOfMonth(dateObj)\n const lastDayOfMonth = endOfMonth(dateObj)\n\n const lastSunday = getLastFirstDayOfWeek(firstDayOfMonth, weekStartsOn, locale)\n const nextSaturday = getNextLastDayOfWeek(lastDayOfMonth, weekStartsOn, locale)\n\n const lastMonthDays = getDaysBetween(lastSunday.subtract({ days: 1 }), firstDayOfMonth)\n const nextMonthDays = getDaysBetween(lastDayOfMonth, nextSaturday.add({ days: 1 }))\n\n const totalDays = lastMonthDays.length + datesArray.length + nextMonthDays.length\n\n if (fixedWeeks && totalDays < 42) {\n const extraDays = 42 - totalDays\n\n let startFrom = nextMonthDays[nextMonthDays.length - 1]\n\n if (!startFrom)\n startFrom = endOfMonth(dateObj)\n\n const extraDaysArray = Array.from({ length: extraDays }, (_, i) => {\n const incr = i + 1\n return startFrom.add({ days: incr })\n })\n nextMonthDays.push(...extraDaysArray)\n }\n\n const allDays = lastMonthDays.concat(datesArray, nextMonthDays)\n\n const weeks = chunk(allDays, 7)\n\n return {\n value: dateObj,\n cells: allDays,\n rows: weeks,\n }\n}\n\ntype SetMonthProps = CreateMonthProps & {\n numberOfMonths: number | undefined\n currentMonths?: Grid<DateValue>[]\n}\n\ntype SetYearProps = CreateSelectProps & {\n numberOfMonths?: number\n pagedNavigation?: boolean\n}\n\ntype SetDecadeProps = CreateSelectProps & {\n startIndex?: number\n endIndex: number\n}\n\nexport function startOfDecade(dateObj: DateValue) {\n // round to the lowest nearest 10 when building the decade\n return startOfYear(dateObj.subtract({ years: dateObj.year - Math.floor(dateObj.year / 10) * 10 }).set({ day: 1, month: 1 }))\n}\n\nexport function endOfDecade(dateObj: DateValue) {\n // round to the lowest nearest 10 when building the decade\n return endOfYear(dateObj.add({ years: Math.ceil((dateObj.year + 1) / 10) * 10 - dateObj.year - 1 }).set({ day: 35, month: 12 }))\n}\n\nexport function createDecade(props: SetDecadeProps): DateValue[] {\n const { dateObj, startIndex, endIndex } = props\n\n const decadeArray = Array.from({ length: Math.abs(startIndex ?? 0) + endIndex }, (_, i) =>\n i <= Math.abs((startIndex ?? 0))\n ? dateObj.subtract({ years: i }).set({ day: 1, month: 1 })\n : dateObj.add({ years: i - endIndex }).set({ day: 1, month: 1 }))\n\n decadeArray.sort((a: DateValue, b: DateValue) => a.year - b.year)\n\n return decadeArray\n}\n\nexport function createYear(props: SetYearProps): DateValue[] {\n const { dateObj, numberOfMonths = 1, pagedNavigation = false } = props\n\n if (numberOfMonths && pagedNavigation) {\n const monthsArray = Array.from({ length: Math.floor(12 / numberOfMonths) }, (_, i) => startOfMonth(dateObj.set({ month: i * numberOfMonths + 1 })))\n\n return monthsArray\n }\n\n const monthsArray = Array.from({ length: 12 }, (_, i) => startOfMonth(dateObj.set({ month: i + 1 })))\n return monthsArray\n}\n\nexport function createMonths(props: SetMonthProps) {\n const { numberOfMonths, dateObj, ...monthProps } = props\n\n const months: Grid<DateValue>[] = []\n\n if (!numberOfMonths || numberOfMonths === 1) {\n months.push(\n createMonth({\n ...monthProps,\n dateObj,\n }),\n )\n return months\n }\n\n months.push(\n createMonth({\n ...monthProps,\n dateObj,\n }),\n )\n\n // Create all the months, starting with the current month\n for (let i = 1; i < numberOfMonths; i++) {\n const nextMonth = dateObj.add({ months: i })\n months.push(\n createMonth({\n ...monthProps,\n dateObj: nextMonth,\n }),\n )\n }\n\n return months\n}\n\nexport function createYearRange({ start, end }: DateRange): DateValue[] {\n const years: DateValue[] = []\n\n if (!start || !end)\n return years\n\n let current = startOfYear(start)\n\n while (current.compare(end) <= 0) {\n years.push(current)\n // Move to the first day of the next year\n current = startOfYear(current.add({ years: 1 }))\n }\n\n return years\n}\n\nexport function createDateRange({ start, end }: DateRange): DateValue[] {\n const dates: DateValue[] = []\n\n if (!start || !end)\n return dates\n\n let current = start\n\n while (current.compare(end) <= 0) {\n dates.push(current)\n current = current.add({ days: 1 })\n }\n\n return dates\n}\n"],"names":["getDaysInMonth","startOfMonth","endOfMonth","getLastFirstDayOfWeek","getNextLastDayOfWeek","chunk","startOfYear","endOfYear","monthsArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calendar.cjs","sources":["../../src/date/calendar.ts"],"sourcesContent":["/*\n * Implementation ported from from from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/calendar/create.ts\n*/\n\nimport type { DateValue } from '@internationalized/date'\nimport type { Grid } from './types'\nimport type { DateRange } from '@/shared'\nimport { endOfMonth, endOfYear, startOfMonth, startOfYear } from '@internationalized/date'\nimport { getDaysInMonth, getLastFirstDayOfWeek, getNextLastDayOfWeek } from './comparators'\nimport { chunk } from './utils'\n\nexport type WeekDayFormat = 'narrow' | 'short' | 'long'\n\nexport type CreateSelectProps = {\n /**\n * The date object representing the date (usually the first day of the month/year).\n */\n dateObj: DateValue\n}\n\nexport type CreateMonthProps = {\n /**\n * The date object representing the month's date (usually the first day of the month).\n */\n dateObj: DateValue\n\n /**\n * The day of the week to start the calendar on (0 for Sunday, 1 for Monday, etc.).\n */\n weekStartsOn: number\n\n /**\n * Whether to always render 6 weeks in the calendar, even if the month doesn't\n * span 6 weeks.\n */\n fixedWeeks: boolean\n\n /**\n * The locale to use when creating the calendar month.\n */\n locale: string\n}\n\n/**\n * Retrieves an array of date values representing the days between\n * the provided start and end dates.\n */\nexport function getDaysBetween(start: DateValue, end: DateValue) {\n const days: DateValue[] = []\n let dCurrent = start.add({ days: 1 })\n const dEnd = end\n while (dCurrent.compare(dEnd) < 0) {\n days.push(dCurrent)\n dCurrent = dCurrent.add({ days: 1 })\n }\n return days\n}\n\nexport function createMonth(props: CreateMonthProps): Grid<DateValue> {\n const { dateObj, weekStartsOn, fixedWeeks, locale } = props\n const daysInMonth = getDaysInMonth(dateObj)\n\n const datesArray = Array.from({ length: daysInMonth }, (_, i) => dateObj.set({ day: i + 1 }))\n\n const firstDayOfMonth = startOfMonth(dateObj)\n const lastDayOfMonth = endOfMonth(dateObj)\n\n const lastSunday = getLastFirstDayOfWeek(firstDayOfMonth, weekStartsOn, locale)\n const nextSaturday = getNextLastDayOfWeek(lastDayOfMonth, weekStartsOn, locale)\n\n const lastMonthDays = getDaysBetween(lastSunday.subtract({ days: 1 }), firstDayOfMonth)\n const nextMonthDays = getDaysBetween(lastDayOfMonth, nextSaturday.add({ days: 1 }))\n\n const totalDays = lastMonthDays.length + datesArray.length + nextMonthDays.length\n\n if (fixedWeeks && totalDays < 42) {\n const extraDays = 42 - totalDays\n\n let startFrom = nextMonthDays[nextMonthDays.length - 1]\n\n if (!startFrom)\n startFrom = endOfMonth(dateObj)\n\n const extraDaysArray = Array.from({ length: extraDays }, (_, i) => {\n const incr = i + 1\n return startFrom.add({ days: incr })\n })\n nextMonthDays.push(...extraDaysArray)\n }\n\n const allDays = lastMonthDays.concat(datesArray, nextMonthDays)\n\n const weeks = chunk(allDays, 7)\n\n return {\n value: dateObj,\n cells: allDays,\n rows: weeks,\n }\n}\n\ntype SetMonthProps = CreateMonthProps & {\n numberOfMonths: number | undefined\n currentMonths?: Grid<DateValue>[]\n}\n\ntype SetYearProps = CreateSelectProps & {\n numberOfMonths?: number\n pagedNavigation?: boolean\n}\n\ntype SetDecadeProps = CreateSelectProps & {\n startIndex?: number\n endIndex: number\n}\n\nexport function startOfDecade(dateObj: DateValue) {\n // round to the lowest nearest 10 when building the decade\n return startOfYear(dateObj.subtract({ years: dateObj.year - Math.floor(dateObj.year / 10) * 10 }).set({ day: 1, month: 1 }))\n}\n\nexport function endOfDecade(dateObj: DateValue) {\n // round to the lowest nearest 10 when building the decade\n return endOfYear(dateObj.add({ years: Math.ceil((dateObj.year + 1) / 10) * 10 - dateObj.year - 1 }).set({ day: 35, month: 12 }))\n}\n\nexport function createDecade(props: SetDecadeProps): DateValue[] {\n const { dateObj, startIndex, endIndex } = props\n\n const decadeArray = Array.from({ length: Math.abs(startIndex ?? 0) + endIndex }, (_, i) =>\n i <= Math.abs((startIndex ?? 0))\n ? dateObj.subtract({ years: i }).set({ day: 1, month: 1 })\n : dateObj.add({ years: i - endIndex }).set({ day: 1, month: 1 }))\n\n decadeArray.sort((a: DateValue, b: DateValue) => a.year - b.year)\n\n return decadeArray\n}\n\nexport function createYear(props: SetYearProps): DateValue[] {\n const { dateObj, numberOfMonths = 1, pagedNavigation = false } = props\n\n if (numberOfMonths && pagedNavigation) {\n const monthsArray = Array.from({ length: Math.floor(12 / numberOfMonths) }, (_, i) => startOfMonth(dateObj.set({ month: i * numberOfMonths + 1 })))\n\n return monthsArray\n }\n\n const monthsArray = Array.from({ length: 12 }, (_, i) => startOfMonth(dateObj.set({ month: i + 1 })))\n return monthsArray\n}\n\nexport function createMonths(props: SetMonthProps) {\n const { numberOfMonths, dateObj, ...monthProps } = props\n\n const months: Grid<DateValue>[] = []\n\n if (!numberOfMonths || numberOfMonths === 1) {\n months.push(\n createMonth({\n ...monthProps,\n dateObj,\n }),\n )\n return months\n }\n\n months.push(\n createMonth({\n ...monthProps,\n dateObj,\n }),\n )\n\n // Create all the months, starting with the current month\n for (let i = 1; i < numberOfMonths; i++) {\n const nextMonth = dateObj.add({ months: i })\n months.push(\n createMonth({\n ...monthProps,\n dateObj: nextMonth,\n }),\n )\n }\n\n return months\n}\n\nexport function createYearRange({ start, end }: DateRange): DateValue[] {\n const years: DateValue[] = []\n\n if (!start || !end)\n return years\n\n let current = startOfYear(start)\n\n while (current.compare(end) <= 0) {\n years.push(current)\n // Move to the first day of the next year\n current = startOfYear(current.add({ years: 1 }))\n }\n\n return years\n}\n\nexport function createDateRange({ start, end }: DateRange): DateValue[] {\n const dates: DateValue[] = []\n\n if (!start || !end)\n return dates\n\n let current = start\n\n while (current.compare(end) <= 0) {\n dates.push(current)\n current = current.add({ days: 1 })\n }\n\n return dates\n}\n"],"names":["getDaysInMonth","startOfMonth","endOfMonth","getLastFirstDayOfWeek","getNextLastDayOfWeek","chunk","startOfYear","endOfYear","monthsArray"],"mappings":"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"}
|