reka-ui 2.9.9 → 2.10.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/AlertDialog/AlertDialogContent.cjs +2 -1
- package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
- package/dist/AlertDialog/AlertDialogContent.js +2 -1
- package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
- package/dist/AlertDialog/AlertDialogRoot.cjs +4 -0
- package/dist/AlertDialog/AlertDialogRoot.cjs.map +1 -1
- package/dist/AlertDialog/AlertDialogRoot.js +4 -0
- package/dist/AlertDialog/AlertDialogRoot.js.map +1 -1
- package/dist/Checkbox/CheckboxRoot.cjs +27 -18
- package/dist/Checkbox/CheckboxRoot.cjs.map +1 -1
- package/dist/Checkbox/CheckboxRoot.js +28 -19
- package/dist/Checkbox/CheckboxRoot.js.map +1 -1
- package/dist/Collection/Collection.cjs +2 -1
- package/dist/Collection/Collection.cjs.map +1 -1
- package/dist/Collection/Collection.js +2 -1
- package/dist/Collection/Collection.js.map +1 -1
- package/dist/Combobox/ComboboxContent.cjs +8 -0
- package/dist/Combobox/ComboboxContent.cjs.map +1 -1
- package/dist/Combobox/ComboboxContent.js +8 -0
- package/dist/Combobox/ComboboxContent.js.map +1 -1
- package/dist/Combobox/ComboboxContentImpl.cjs +18 -2
- package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
- package/dist/Combobox/ComboboxContentImpl.js +18 -2
- package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
- package/dist/Combobox/ComboboxItem.cjs +11 -2
- package/dist/Combobox/ComboboxItem.cjs.map +1 -1
- package/dist/Combobox/ComboboxItem.js +12 -3
- package/dist/Combobox/ComboboxItem.js.map +1 -1
- package/dist/ConfigProvider/ConfigProvider.cjs +7 -1
- package/dist/ConfigProvider/ConfigProvider.cjs.map +1 -1
- package/dist/ConfigProvider/ConfigProvider.js +7 -1
- package/dist/ConfigProvider/ConfigProvider.js.map +1 -1
- package/dist/ContextMenu/ContextMenuContent.cjs +4 -0
- package/dist/ContextMenu/ContextMenuContent.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuContent.js +4 -0
- package/dist/ContextMenu/ContextMenuContent.js.map +1 -1
- package/dist/ContextMenu/ContextMenuSubContent.cjs +4 -0
- package/dist/ContextMenu/ContextMenuSubContent.cjs.map +1 -1
- package/dist/ContextMenu/ContextMenuSubContent.js +4 -0
- package/dist/ContextMenu/ContextMenuSubContent.js.map +1 -1
- package/dist/DateField/DateFieldInput.cjs +3 -1
- package/dist/DateField/DateFieldInput.cjs.map +1 -1
- package/dist/DateField/DateFieldInput.js +3 -1
- 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/DatePickerContent.cjs +8 -0
- package/dist/DatePicker/DatePickerContent.cjs.map +1 -1
- package/dist/DatePicker/DatePickerContent.js +8 -0
- package/dist/DatePicker/DatePickerContent.js.map +1 -1
- package/dist/DatePicker/DatePickerRoot.cjs +4 -0
- package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
- package/dist/DatePicker/DatePickerRoot.js +4 -0
- package/dist/DatePicker/DatePickerRoot.js.map +1 -1
- package/dist/DateRangePicker/DateRangePickerContent.cjs +8 -0
- package/dist/DateRangePicker/DateRangePickerContent.cjs.map +1 -1
- package/dist/DateRangePicker/DateRangePickerContent.js +8 -0
- package/dist/DateRangePicker/DateRangePickerContent.js.map +1 -1
- package/dist/Dialog/DialogContent.cjs +16 -10
- package/dist/Dialog/DialogContent.cjs.map +1 -1
- package/dist/Dialog/DialogContent.js +17 -11
- package/dist/Dialog/DialogContent.js.map +1 -1
- package/dist/Dialog/DialogContentImpl.cjs +8 -1
- package/dist/Dialog/DialogContentImpl.cjs.map +1 -1
- package/dist/Dialog/DialogContentImpl.js +8 -1
- package/dist/Dialog/DialogContentImpl.js.map +1 -1
- package/dist/Dialog/DialogContentModal.cjs +23 -5
- package/dist/Dialog/DialogContentModal.cjs.map +1 -1
- package/dist/Dialog/DialogContentModal.js +24 -6
- package/dist/Dialog/DialogContentModal.js.map +1 -1
- package/dist/Dialog/DialogContentNonModal.cjs +18 -2
- package/dist/Dialog/DialogContentNonModal.cjs.map +1 -1
- package/dist/Dialog/DialogContentNonModal.js +19 -3
- package/dist/Dialog/DialogContentNonModal.js.map +1 -1
- package/dist/Dialog/DialogOverlay.cjs +12 -6
- package/dist/Dialog/DialogOverlay.cjs.map +1 -1
- package/dist/Dialog/DialogOverlay.js +13 -7
- package/dist/Dialog/DialogOverlay.js.map +1 -1
- package/dist/Dialog/DialogOverlayImpl.cjs +8 -1
- package/dist/Dialog/DialogOverlayImpl.cjs.map +1 -1
- package/dist/Dialog/DialogOverlayImpl.js +9 -2
- package/dist/Dialog/DialogOverlayImpl.js.map +1 -1
- package/dist/Dialog/DialogRoot.cjs +7 -1
- package/dist/Dialog/DialogRoot.cjs.map +1 -1
- package/dist/Dialog/DialogRoot.js +7 -1
- package/dist/Dialog/DialogRoot.js.map +1 -1
- package/dist/DismissableLayer/DismissableLayer.cjs +27 -10
- package/dist/DismissableLayer/DismissableLayer.cjs.map +1 -1
- package/dist/DismissableLayer/DismissableLayer.js +28 -11
- package/dist/DismissableLayer/DismissableLayer.js.map +1 -1
- package/dist/Drawer/DrawerClose.cjs +48 -0
- package/dist/Drawer/DrawerClose.cjs.map +1 -0
- package/dist/Drawer/DrawerClose.js +42 -0
- package/dist/Drawer/DrawerClose.js.map +1 -0
- package/dist/Drawer/DrawerContent.cjs +139 -0
- package/dist/Drawer/DrawerContent.cjs.map +1 -0
- package/dist/Drawer/DrawerContent.js +133 -0
- package/dist/Drawer/DrawerContent.js.map +1 -0
- package/dist/Drawer/DrawerContentImpl.cjs +298 -0
- package/dist/Drawer/DrawerContentImpl.cjs.map +1 -0
- package/dist/Drawer/DrawerContentImpl.js +292 -0
- package/dist/Drawer/DrawerContentImpl.js.map +1 -0
- package/dist/Drawer/DrawerDescription.cjs +45 -0
- package/dist/Drawer/DrawerDescription.cjs.map +1 -0
- package/dist/Drawer/DrawerDescription.js +39 -0
- package/dist/Drawer/DrawerDescription.js.map +1 -0
- package/dist/Drawer/DrawerHandle.cjs +48 -0
- package/dist/Drawer/DrawerHandle.cjs.map +1 -0
- package/dist/Drawer/DrawerHandle.js +42 -0
- package/dist/Drawer/DrawerHandle.js.map +1 -0
- package/dist/Drawer/DrawerIndent.cjs +78 -0
- package/dist/Drawer/DrawerIndent.cjs.map +1 -0
- package/dist/Drawer/DrawerIndent.js +72 -0
- package/dist/Drawer/DrawerIndent.js.map +1 -0
- package/dist/Drawer/DrawerIndentBackground.cjs +49 -0
- package/dist/Drawer/DrawerIndentBackground.cjs.map +1 -0
- package/dist/Drawer/DrawerIndentBackground.js +43 -0
- package/dist/Drawer/DrawerIndentBackground.js.map +1 -0
- package/dist/Drawer/DrawerOverlay.cjs +66 -0
- package/dist/Drawer/DrawerOverlay.cjs.map +1 -0
- package/dist/Drawer/DrawerOverlay.js +60 -0
- package/dist/Drawer/DrawerOverlay.js.map +1 -0
- package/dist/Drawer/DrawerOverlayImpl.cjs +69 -0
- package/dist/Drawer/DrawerOverlayImpl.cjs.map +1 -0
- package/dist/Drawer/DrawerOverlayImpl.js +63 -0
- package/dist/Drawer/DrawerOverlayImpl.js.map +1 -0
- package/dist/Drawer/DrawerPortal.cjs +47 -0
- package/dist/Drawer/DrawerPortal.cjs.map +1 -0
- package/dist/Drawer/DrawerPortal.js +41 -0
- package/dist/Drawer/DrawerPortal.js.map +1 -0
- package/dist/Drawer/DrawerProvider.cjs +80 -0
- package/dist/Drawer/DrawerProvider.cjs.map +1 -0
- package/dist/Drawer/DrawerProvider.js +68 -0
- package/dist/Drawer/DrawerProvider.js.map +1 -0
- package/dist/Drawer/DrawerRoot.cjs +197 -0
- package/dist/Drawer/DrawerRoot.cjs.map +1 -0
- package/dist/Drawer/DrawerRoot.js +185 -0
- package/dist/Drawer/DrawerRoot.js.map +1 -0
- package/dist/Drawer/DrawerSwipeArea.cjs +87 -0
- package/dist/Drawer/DrawerSwipeArea.cjs.map +1 -0
- package/dist/Drawer/DrawerSwipeArea.js +81 -0
- package/dist/Drawer/DrawerSwipeArea.js.map +1 -0
- package/dist/Drawer/DrawerTitle.cjs +45 -0
- package/dist/Drawer/DrawerTitle.cjs.map +1 -0
- package/dist/Drawer/DrawerTitle.js +39 -0
- package/dist/Drawer/DrawerTitle.js.map +1 -0
- package/dist/Drawer/DrawerTrigger.cjs +64 -0
- package/dist/Drawer/DrawerTrigger.cjs.map +1 -0
- package/dist/Drawer/DrawerTrigger.js +58 -0
- package/dist/Drawer/DrawerTrigger.js.map +1 -0
- package/dist/Drawer/DrawerViewport.cjs +49 -0
- package/dist/Drawer/DrawerViewport.cjs.map +1 -0
- package/dist/Drawer/DrawerViewport.js +43 -0
- package/dist/Drawer/DrawerViewport.js.map +1 -0
- package/dist/Drawer/utils.cjs +185 -0
- package/dist/Drawer/utils.cjs.map +1 -0
- package/dist/Drawer/utils.js +149 -0
- package/dist/Drawer/utils.js.map +1 -0
- package/dist/DropdownMenu/DropdownMenuContent.cjs +4 -0
- package/dist/DropdownMenu/DropdownMenuContent.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuContent.js +4 -0
- package/dist/DropdownMenu/DropdownMenuContent.js.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubContent.cjs +4 -0
- package/dist/DropdownMenu/DropdownMenuSubContent.cjs.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubContent.js +4 -0
- package/dist/DropdownMenu/DropdownMenuSubContent.js.map +1 -1
- package/dist/FocusScope/FocusScope.cjs +31 -11
- package/dist/FocusScope/FocusScope.cjs.map +1 -1
- package/dist/FocusScope/FocusScope.js +32 -12
- package/dist/FocusScope/FocusScope.js.map +1 -1
- package/dist/HoverCard/HoverCardContent.cjs +8 -0
- package/dist/HoverCard/HoverCardContent.cjs.map +1 -1
- package/dist/HoverCard/HoverCardContent.js +8 -0
- package/dist/HoverCard/HoverCardContent.js.map +1 -1
- package/dist/HoverCard/HoverCardContentImpl.cjs +8 -0
- package/dist/HoverCard/HoverCardContentImpl.cjs.map +1 -1
- package/dist/HoverCard/HoverCardContentImpl.js +8 -0
- package/dist/HoverCard/HoverCardContentImpl.js.map +1 -1
- package/dist/HoverCard/HoverCardRoot.cjs +9 -2
- package/dist/HoverCard/HoverCardRoot.cjs.map +1 -1
- package/dist/HoverCard/HoverCardRoot.js +9 -2
- package/dist/HoverCard/HoverCardRoot.js.map +1 -1
- package/dist/HoverCard/HoverCardTrigger.cjs +6 -0
- package/dist/HoverCard/HoverCardTrigger.cjs.map +1 -1
- package/dist/HoverCard/HoverCardTrigger.js +6 -0
- package/dist/HoverCard/HoverCardTrigger.js.map +1 -1
- package/dist/Listbox/ListboxRoot.cjs +4 -1
- package/dist/Listbox/ListboxRoot.cjs.map +1 -1
- package/dist/Listbox/ListboxRoot.js +4 -1
- package/dist/Listbox/ListboxRoot.js.map +1 -1
- package/dist/Listbox/ListboxVirtualizer.cjs +7 -3
- package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
- package/dist/Listbox/ListboxVirtualizer.js +7 -3
- package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
- package/dist/Menu/MenuContent.cjs +4 -0
- package/dist/Menu/MenuContent.cjs.map +1 -1
- package/dist/Menu/MenuContent.js +4 -0
- package/dist/Menu/MenuContent.js.map +1 -1
- package/dist/Menu/MenuContentImpl.cjs +4 -0
- package/dist/Menu/MenuContentImpl.cjs.map +1 -1
- package/dist/Menu/MenuContentImpl.js +4 -0
- package/dist/Menu/MenuContentImpl.js.map +1 -1
- package/dist/Menu/MenuRootContentModal.cjs +4 -0
- package/dist/Menu/MenuRootContentModal.cjs.map +1 -1
- package/dist/Menu/MenuRootContentModal.js +4 -0
- package/dist/Menu/MenuRootContentModal.js.map +1 -1
- package/dist/Menu/MenuRootContentNonModal.cjs +4 -0
- package/dist/Menu/MenuRootContentNonModal.cjs.map +1 -1
- package/dist/Menu/MenuRootContentNonModal.js +4 -0
- package/dist/Menu/MenuRootContentNonModal.js.map +1 -1
- package/dist/Menu/MenuSubContent.cjs +4 -0
- package/dist/Menu/MenuSubContent.cjs.map +1 -1
- package/dist/Menu/MenuSubContent.js +4 -0
- package/dist/Menu/MenuSubContent.js.map +1 -1
- package/dist/Menubar/MenubarContent.cjs +4 -0
- package/dist/Menubar/MenubarContent.cjs.map +1 -1
- package/dist/Menubar/MenubarContent.js +4 -0
- package/dist/Menubar/MenubarContent.js.map +1 -1
- package/dist/Menubar/MenubarSubContent.cjs +4 -0
- package/dist/Menubar/MenubarSubContent.cjs.map +1 -1
- package/dist/Menubar/MenubarSubContent.js +4 -0
- package/dist/Menubar/MenubarSubContent.js.map +1 -1
- package/dist/Popover/PopoverContent.cjs +8 -0
- package/dist/Popover/PopoverContent.cjs.map +1 -1
- package/dist/Popover/PopoverContent.js +8 -0
- package/dist/Popover/PopoverContent.js.map +1 -1
- package/dist/Popover/PopoverContentImpl.cjs +8 -0
- package/dist/Popover/PopoverContentImpl.cjs.map +1 -1
- package/dist/Popover/PopoverContentImpl.js +8 -0
- package/dist/Popover/PopoverContentImpl.js.map +1 -1
- package/dist/Popover/PopoverContentModal.cjs +8 -0
- package/dist/Popover/PopoverContentModal.cjs.map +1 -1
- package/dist/Popover/PopoverContentModal.js +8 -0
- package/dist/Popover/PopoverContentModal.js.map +1 -1
- package/dist/Popover/PopoverContentNonModal.cjs +8 -0
- package/dist/Popover/PopoverContentNonModal.cjs.map +1 -1
- package/dist/Popover/PopoverContentNonModal.js +8 -0
- package/dist/Popover/PopoverContentNonModal.js.map +1 -1
- package/dist/Popper/PopperContent.cjs +49 -6
- package/dist/Popper/PopperContent.cjs.map +1 -1
- package/dist/Popper/PopperContent.js +50 -7
- package/dist/Popper/PopperContent.js.map +1 -1
- package/dist/Popper/utils.cjs +10 -5
- package/dist/Popper/utils.cjs.map +1 -1
- package/dist/Popper/utils.js +10 -5
- package/dist/Popper/utils.js.map +1 -1
- package/dist/RadioGroup/Radio.cjs +27 -22
- package/dist/RadioGroup/Radio.cjs.map +1 -1
- package/dist/RadioGroup/Radio.js +28 -23
- package/dist/RadioGroup/Radio.js.map +1 -1
- package/dist/Rating/RatingItem.cjs +66 -0
- package/dist/Rating/RatingItem.cjs.map +1 -0
- package/dist/Rating/RatingItem.js +54 -0
- package/dist/Rating/RatingItem.js.map +1 -0
- package/dist/Rating/RatingItemIndicator.cjs +89 -0
- package/dist/Rating/RatingItemIndicator.cjs.map +1 -0
- package/dist/Rating/RatingItemIndicator.js +83 -0
- package/dist/Rating/RatingItemIndicator.js.map +1 -0
- package/dist/Rating/RatingRoot.cjs +136 -0
- package/dist/Rating/RatingRoot.cjs.map +1 -0
- package/dist/Rating/RatingRoot.js +124 -0
- package/dist/Rating/RatingRoot.js.map +1 -0
- package/dist/RovingFocus/RovingFocusItem.cjs +5 -0
- package/dist/RovingFocus/RovingFocusItem.cjs.map +1 -1
- package/dist/RovingFocus/RovingFocusItem.js +6 -1
- package/dist/RovingFocus/RovingFocusItem.js.map +1 -1
- package/dist/Select/SelectContent.cjs +8 -0
- package/dist/Select/SelectContent.cjs.map +1 -1
- package/dist/Select/SelectContent.js +8 -0
- package/dist/Select/SelectContent.js.map +1 -1
- package/dist/Select/SelectContentImpl.cjs +8 -0
- package/dist/Select/SelectContentImpl.cjs.map +1 -1
- package/dist/Select/SelectContentImpl.js +8 -0
- package/dist/Select/SelectContentImpl.js.map +1 -1
- package/dist/Select/SelectPopperPosition.cjs +8 -0
- package/dist/Select/SelectPopperPosition.cjs.map +1 -1
- package/dist/Select/SelectPopperPosition.js +8 -0
- package/dist/Select/SelectPopperPosition.js.map +1 -1
- package/dist/Select/SelectRoot.cjs +10 -5
- package/dist/Select/SelectRoot.cjs.map +1 -1
- package/dist/Select/SelectRoot.js +10 -5
- package/dist/Select/SelectRoot.js.map +1 -1
- package/dist/Select/SelectTrigger.cjs +25 -14
- package/dist/Select/SelectTrigger.cjs.map +1 -1
- package/dist/Select/SelectTrigger.js +25 -14
- package/dist/Select/SelectTrigger.js.map +1 -1
- package/dist/Switch/SwitchRoot.cjs +25 -18
- package/dist/Switch/SwitchRoot.cjs.map +1 -1
- package/dist/Switch/SwitchRoot.js +26 -19
- package/dist/Switch/SwitchRoot.js.map +1 -1
- package/dist/Tabs/TabsIndicator.cjs +4 -0
- package/dist/Tabs/TabsIndicator.cjs.map +1 -1
- package/dist/Tabs/TabsIndicator.js +4 -0
- package/dist/Tabs/TabsIndicator.js.map +1 -1
- package/dist/Teleport/Teleport.cjs +6 -3
- package/dist/Teleport/Teleport.cjs.map +1 -1
- package/dist/Teleport/Teleport.js +7 -4
- package/dist/Teleport/Teleport.js.map +1 -1
- package/dist/Toggle/Toggle.cjs +21 -16
- package/dist/Toggle/Toggle.cjs.map +1 -1
- package/dist/Toggle/Toggle.js +22 -17
- package/dist/Toggle/Toggle.js.map +1 -1
- package/dist/Toolbar/ToolbarToggleItem.cjs +5 -2
- package/dist/Toolbar/ToolbarToggleItem.cjs.map +1 -1
- package/dist/Toolbar/ToolbarToggleItem.js +5 -2
- package/dist/Toolbar/ToolbarToggleItem.js.map +1 -1
- package/dist/Tree/TreeItem.cjs +18 -2
- package/dist/Tree/TreeItem.cjs.map +1 -1
- package/dist/Tree/TreeItem.js +18 -2
- package/dist/Tree/TreeItem.js.map +1 -1
- package/dist/Tree/TreeVirtualizer.cjs +2 -1
- package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
- package/dist/Tree/TreeVirtualizer.js +2 -1
- package/dist/Tree/TreeVirtualizer.js.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.cjs +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/composables/useDrawerSnapPoints.cjs +130 -0
- package/dist/composables/useDrawerSnapPoints.cjs.map +1 -0
- package/dist/composables/useDrawerSnapPoints.js +124 -0
- package/dist/composables/useDrawerSnapPoints.js.map +1 -0
- package/dist/composables/useSwipeDismiss.cjs +397 -0
- package/dist/composables/useSwipeDismiss.cjs.map +1 -0
- package/dist/composables/useSwipeDismiss.js +391 -0
- package/dist/composables/useSwipeDismiss.js.map +1 -0
- package/dist/constant/components.cjs +20 -0
- package/dist/constant/components.cjs.map +1 -1
- package/dist/constant/components.js +20 -0
- package/dist/constant/components.js.map +1 -1
- package/dist/constant.d.cts +2 -0
- package/dist/constant.d.cts.map +1 -1
- package/dist/constant.d.ts +2 -0
- package/dist/constant.d.ts.map +1 -1
- package/dist/date/utils.cjs +1 -1
- package/dist/date/utils.cjs.map +1 -1
- package/dist/date/utils.js +1 -1
- package/dist/date/utils.js.map +1 -1
- package/dist/index.cjs +45 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +24 -2
- package/dist/index2.d.cts.map +1 -1
- package/dist/index3.d.cts +68 -29
- package/dist/index3.d.cts.map +1 -1
- package/dist/index3.d.ts +68 -29
- package/dist/index3.d.ts.map +1 -1
- package/dist/index4.d.cts +1648 -1190
- package/dist/index4.d.cts.map +1 -1
- package/dist/index4.d.ts +1660 -1202
- package/dist/index4.d.ts.map +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.d.cts +3 -3
- package/dist/internal.d.ts +3 -3
- package/dist/internal.js +1 -1
- package/dist/namespaced/index.cjs +22 -0
- package/dist/namespaced/index.d.cts +22 -2
- package/dist/namespaced/index.d.mts +22 -2
- package/dist/namespaced/index.mjs +22 -2
- package/dist/nuxt/index.d.cts +2 -1
- package/dist/nuxt/index.d.mts +2 -1
- package/dist/resolver/index.d.cts +2 -1
- package/dist/resolver/index.d.mts +2 -1
- package/dist/shared/useEmitAsProps.cjs +5 -0
- package/dist/shared/useEmitAsProps.cjs.map +1 -1
- package/dist/shared/useEmitAsProps.js +5 -0
- package/dist/shared/useEmitAsProps.js.map +1 -1
- package/dist/shared/useForwardPropsEmits.cjs +0 -12
- package/dist/shared/useForwardPropsEmits.cjs.map +1 -1
- package/dist/shared/useForwardPropsEmits.js +0 -12
- package/dist/shared/useForwardPropsEmits.js.map +1 -1
- package/dist/shared/useForwardScopeId.cjs +34 -0
- package/dist/shared/useForwardScopeId.cjs.map +1 -0
- package/dist/shared/useForwardScopeId.js +28 -0
- package/dist/shared/useForwardScopeId.js.map +1 -0
- package/dist/shared/useId.cjs +7 -8
- package/dist/shared/useId.cjs.map +1 -1
- package/dist/shared/useId.js +7 -8
- package/dist/shared/useId.js.map +1 -1
- package/dist/shared/useSize.cjs +6 -2
- package/dist/shared/useSize.cjs.map +1 -1
- package/dist/shared/useSize.js +7 -3
- package/dist/shared/useSize.js.map +1 -1
- package/dist/shared.cjs +2 -2
- package/dist/shared.d.cts +2 -2
- package/dist/shared.d.ts +2 -2
- package/dist/shared.js +2 -2
- package/dist/utils/style.cjs +1 -1
- package/dist/utils/style.cjs.map +1 -1
- package/dist/utils/style.js +1 -1
- package/dist/utils/style.js.map +1 -1
- package/package.json +7 -5
- package/src/AlertDialog/AlertDialogContent.vue +6 -1
- package/src/Checkbox/CheckboxRoot.vue +28 -16
- package/src/Collection/Collection.ts +2 -1
- package/src/Combobox/ComboboxContentImpl.vue +20 -4
- package/src/Combobox/ComboboxItem.vue +1 -0
- package/src/ConfigProvider/ConfigProvider.vue +11 -1
- package/src/DateField/DateFieldInput.vue +6 -1
- package/src/DateField/DateFieldRoot.vue +6 -1
- package/src/Dialog/DialogContent.vue +16 -2
- package/src/Dialog/DialogContentImpl.vue +9 -2
- package/src/Dialog/DialogContentModal.vue +23 -4
- package/src/Dialog/DialogContentNonModal.vue +21 -3
- package/src/Dialog/DialogOverlay.vue +4 -0
- package/src/Dialog/DialogOverlayImpl.vue +7 -2
- package/src/Dialog/DialogRoot.vue +10 -1
- package/src/DismissableLayer/DismissableLayer.vue +75 -23
- package/src/Drawer/DrawerClose.vue +25 -0
- package/src/Drawer/DrawerContent.vue +98 -0
- package/src/Drawer/DrawerContentImpl.vue +386 -0
- package/src/Drawer/DrawerDescription.vue +24 -0
- package/src/Drawer/DrawerHandle.vue +25 -0
- package/src/Drawer/DrawerIndent.vue +61 -0
- package/src/Drawer/DrawerIndentBackground.vue +26 -0
- package/src/Drawer/DrawerOverlay.vue +42 -0
- package/src/Drawer/DrawerOverlayImpl.vue +54 -0
- package/src/Drawer/DrawerPortal.vue +17 -0
- package/src/Drawer/DrawerProvider.vue +87 -0
- package/src/Drawer/DrawerRoot.vue +244 -0
- package/src/Drawer/DrawerSwipeArea.vue +73 -0
- package/src/Drawer/DrawerTitle.vue +24 -0
- package/src/Drawer/DrawerTrigger.vue +44 -0
- package/src/Drawer/DrawerViewport.vue +34 -0
- package/src/Drawer/composables/useDrawerSnapPoints.ts +200 -0
- package/src/Drawer/composables/useSwipeDismiss.ts +557 -0
- package/src/Drawer/index.ts +74 -0
- package/src/Drawer/utils.ts +205 -0
- package/src/FocusScope/FocusScope.vue +76 -19
- package/src/HoverCard/HoverCardRoot.vue +7 -1
- package/src/HoverCard/HoverCardTrigger.vue +11 -0
- package/src/Listbox/ListboxRoot.vue +7 -4
- package/src/Listbox/ListboxVirtualizer.vue +19 -3
- package/src/Popper/PopperContent.vue +45 -4
- package/src/Popper/utils.ts +17 -7
- package/src/RadioGroup/Radio.vue +22 -14
- package/src/Rating/RatingItem.vue +1 -0
- package/src/Rating/RatingItemIndicator.vue +3 -2
- package/src/Rating/RatingRoot.vue +6 -3
- package/src/Rating/index.ts +3 -3
- package/src/RovingFocus/RovingFocusItem.vue +12 -1
- package/src/Select/SelectRoot.vue +4 -1
- package/src/Select/SelectTrigger.vue +49 -33
- package/src/Splitter/utils/style.ts +1 -1
- package/src/Switch/SwitchRoot.vue +20 -12
- package/src/Tabs/TabsIndicator.vue +5 -0
- package/src/Teleport/Teleport.vue +8 -4
- package/src/Toggle/Toggle.vue +18 -9
- package/src/Toolbar/ToolbarToggleItem.vue +4 -1
- package/src/Tree/TreeItem.vue +18 -0
- package/src/Tree/TreeRoot.vue +2 -2
- package/src/Tree/TreeVirtualizer.vue +3 -1
- package/src/VisuallyHidden/VisuallyHidden.vue +1 -1
- package/src/index.ts +2 -0
- package/src/shared/date/utils.ts +1 -1
- package/src/shared/index.ts +2 -2
- package/src/shared/useEmitAsProps.test-d.ts +77 -0
- package/src/shared/useEmitAsProps.ts +83 -4
- package/src/shared/useForwardProps.ts +1 -1
- package/src/shared/useForwardPropsEmits.ts +17 -2
- package/src/shared/useForwardScopeId.ts +26 -0
- package/src/shared/useId.ts +14 -6
- package/src/shared/useSize.ts +9 -4
- package/dist/shared/trap-focus.cjs +0 -35
- package/dist/shared/trap-focus.cjs.map +0 -1
- package/dist/shared/trap-focus.js +0 -30
- package/dist/shared/trap-focus.js.map +0 -1
- package/src/shared/trap-focus.ts +0 -43
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type {
|
|
3
|
+
DismissableLayerEmits,
|
|
4
|
+
DismissableLayerProps,
|
|
5
|
+
} from '@/DismissableLayer'
|
|
6
|
+
|
|
7
|
+
export type DrawerContentImplEmits = DismissableLayerEmits & {
|
|
8
|
+
openAutoFocus: [event: Event]
|
|
9
|
+
closeAutoFocus: [event: Event]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface DrawerContentImplProps extends DismissableLayerProps {
|
|
13
|
+
trapFocus?: boolean
|
|
14
|
+
/**
|
|
15
|
+
* Initial focus target when the drawer opens.
|
|
16
|
+
* - `true` / default: focus the first focusable element inside
|
|
17
|
+
* - `false`: do not focus anything
|
|
18
|
+
* - element ref: focus that specific element
|
|
19
|
+
*/
|
|
20
|
+
initialFocus?: boolean | HTMLElement | null
|
|
21
|
+
/**
|
|
22
|
+
* Final focus target when the drawer closes.
|
|
23
|
+
* - `true` / default: focus the trigger
|
|
24
|
+
* - `false`: do not restore focus
|
|
25
|
+
* - element ref: focus that specific element
|
|
26
|
+
*/
|
|
27
|
+
finalFocus?: boolean | HTMLElement | null
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<script setup lang="ts">
|
|
32
|
+
import type { SwipeDirection } from './utils'
|
|
33
|
+
import { useResizeObserver } from '@vueuse/core'
|
|
34
|
+
import { computed, onMounted, onUnmounted, watch } from 'vue'
|
|
35
|
+
import { DismissableLayer } from '@/DismissableLayer'
|
|
36
|
+
import { FocusScope } from '@/FocusScope'
|
|
37
|
+
import { useForwardExpose } from '@/shared'
|
|
38
|
+
import { useDrawerSnapPoints } from './composables/useDrawerSnapPoints'
|
|
39
|
+
import { useSwipeDismiss } from './composables/useSwipeDismiss'
|
|
40
|
+
import { injectDrawerRootContext } from './DrawerRoot.vue'
|
|
41
|
+
import { computeSwipeReleaseScalar, DRAWER_CSS_VARS, getDisplacement, registerDrawerCssProperties } from './utils'
|
|
42
|
+
|
|
43
|
+
const props = defineProps<DrawerContentImplProps>()
|
|
44
|
+
const emits = defineEmits<DrawerContentImplEmits>()
|
|
45
|
+
|
|
46
|
+
const rootContext = injectDrawerRootContext()
|
|
47
|
+
const { forwardRef, currentElement } = useForwardExpose()
|
|
48
|
+
|
|
49
|
+
registerDrawerCssProperties()
|
|
50
|
+
|
|
51
|
+
// Snap points
|
|
52
|
+
const { activeSnapPointOffset, snapToNearest } = useDrawerSnapPoints({
|
|
53
|
+
snapPoints: rootContext.snapPoints,
|
|
54
|
+
activeSnapPoint: rootContext.activeSnapPoint,
|
|
55
|
+
popupHeight: rootContext.popupHeight,
|
|
56
|
+
viewportRef: currentElement,
|
|
57
|
+
onSnapPointChange: (point) => {
|
|
58
|
+
if (point === null)
|
|
59
|
+
rootContext.onOpenChange(false)
|
|
60
|
+
else
|
|
61
|
+
rootContext.setActiveSnapPoint(point)
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// Write the active snap offset to the popup's inline style. Called both via a
|
|
66
|
+
// watcher (for live updates as the snap point or popup height changes) and
|
|
67
|
+
// explicitly from onMounted (to set the initial value — a lazy watcher would
|
|
68
|
+
// only fire on CHANGE, which may never happen on a reopen where popupHeight
|
|
69
|
+
// is already measured from a previous open and activeSnapPoint is unchanged).
|
|
70
|
+
//
|
|
71
|
+
// BaseUI parity: snap points are applied purely via a translate using
|
|
72
|
+
// --drawer-snap-point-offset. The popup's height is independent (consumers
|
|
73
|
+
// should set max-height: 100dvh or similar and let the transform slide the
|
|
74
|
+
// popup visually).
|
|
75
|
+
function writeSnapPointOffset() {
|
|
76
|
+
const el = currentElement.value
|
|
77
|
+
if (!el)
|
|
78
|
+
return
|
|
79
|
+
const offset = activeSnapPointOffset.value
|
|
80
|
+
if (offset != null) {
|
|
81
|
+
const dir = rootContext.swipeDirection.value
|
|
82
|
+
const signedOffset = (dir === 'up' || dir === 'left') ? -offset : offset
|
|
83
|
+
el.style.setProperty(DRAWER_CSS_VARS.snapPointOffset, `${signedOffset}px`)
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
el.style.setProperty(DRAWER_CSS_VARS.snapPointOffset, '0px')
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
watch(activeSnapPointOffset, writeSnapPointOffset)
|
|
91
|
+
|
|
92
|
+
// Measure popup height via ResizeObserver. BaseUI parity: skip writes while a
|
|
93
|
+
// nested drawer is open and we already have a measured height, to keep the
|
|
94
|
+
// parent's snap-point geometry stable while the child drawer animates.
|
|
95
|
+
useResizeObserver(currentElement, ([entry]) => {
|
|
96
|
+
if (!entry)
|
|
97
|
+
return
|
|
98
|
+
if (rootContext.hasNestedDrawer.value && rootContext.popupHeight.value > 0)
|
|
99
|
+
return
|
|
100
|
+
const h = entry.contentRect.height
|
|
101
|
+
rootContext.onPopupHeightChange(h)
|
|
102
|
+
currentElement.value?.style.setProperty(DRAWER_CSS_VARS.height, `${h}px`)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
// Watch frontmostHeight -> set CSS var
|
|
106
|
+
watch(() => rootContext.frontmostHeight.value, (h) => {
|
|
107
|
+
currentElement.value?.style.setProperty(DRAWER_CSS_VARS.frontmostHeight, `${h}px`)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
// Swipe directions: when snap points exist, allow both dismiss AND expand directions
|
|
111
|
+
const hasSnapPoints = computed(() => (rootContext.snapPoints.value?.length ?? 0) > 0)
|
|
112
|
+
const swipeDirections = computed<SwipeDirection[]>(() => {
|
|
113
|
+
const dismiss = rootContext.swipeDirection.value
|
|
114
|
+
if (!hasSnapPoints.value)
|
|
115
|
+
return [dismiss]
|
|
116
|
+
// Allow swiping in both directions for snap point navigation
|
|
117
|
+
const opposite: Record<string, SwipeDirection> = { up: 'down', down: 'up', left: 'right', right: 'left' }
|
|
118
|
+
return [dismiss, opposite[dismiss]]
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
// Track the latest raw signed delta for snap release (BaseUI parity: the
|
|
122
|
+
// release math needs the delta as of the last move, not the accumulated
|
|
123
|
+
// CSS offset).
|
|
124
|
+
let lastRawDelta = { x: 0, y: 0 }
|
|
125
|
+
|
|
126
|
+
// Swipe dismiss
|
|
127
|
+
const { isSwiping, dragOffset } = useSwipeDismiss({
|
|
128
|
+
enabled: computed(() => rootContext.open.value),
|
|
129
|
+
elementRef: currentElement,
|
|
130
|
+
directions: swipeDirections,
|
|
131
|
+
movementCssVars: {
|
|
132
|
+
x: DRAWER_CSS_VARS.swipeMovementX,
|
|
133
|
+
y: DRAWER_CSS_VARS.swipeMovementY,
|
|
134
|
+
},
|
|
135
|
+
canStart: () => !rootContext.nestedSwiping.value,
|
|
136
|
+
onDismiss() {
|
|
137
|
+
if (!hasSnapPoints.value) {
|
|
138
|
+
rootContext.onOpenChange(false, 'swipe')
|
|
139
|
+
}
|
|
140
|
+
// With snap points, onRelease handles snapping
|
|
141
|
+
},
|
|
142
|
+
onRelease(velocity) {
|
|
143
|
+
// Write the `--drawer-swipe-strength` CSS var so consumer transitions can
|
|
144
|
+
// scale their duration with release velocity. Ported from BaseUI
|
|
145
|
+
// `DrawerViewport.tsx:resolveSwipeRelease`.
|
|
146
|
+
const el = currentElement.value
|
|
147
|
+
if (el) {
|
|
148
|
+
const dir = rootContext.swipeDirection.value
|
|
149
|
+
const size = (dir === 'left' || dir === 'right') ? el.offsetWidth : el.offsetHeight
|
|
150
|
+
const axisDelta = (dir === 'left' || dir === 'right') ? lastRawDelta.x : lastRawDelta.y
|
|
151
|
+
const releaseVelocity = (dir === 'left' || dir === 'right') ? velocity.x : velocity.y
|
|
152
|
+
const scalar = computeSwipeReleaseScalar({
|
|
153
|
+
direction: dir,
|
|
154
|
+
size,
|
|
155
|
+
axisDelta,
|
|
156
|
+
snapPointOffset: activeSnapPointOffset.value ?? 0,
|
|
157
|
+
releaseVelocity,
|
|
158
|
+
})
|
|
159
|
+
if (scalar != null)
|
|
160
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeStrength, `${scalar}`)
|
|
161
|
+
else
|
|
162
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeStrength, '1')
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (hasSnapPoints.value) {
|
|
166
|
+
// Convert the latest signed delta to a dismiss-direction-positive scalar
|
|
167
|
+
// (BaseUI: `dragDelta = direction==='down' ? deltaY : direction==='up' ? -deltaY : ...`).
|
|
168
|
+
// getDisplacement handles the sign flip per direction.
|
|
169
|
+
const dir = rootContext.swipeDirection.value
|
|
170
|
+
const dragDelta = getDisplacement(dir, lastRawDelta.x, lastRawDelta.y)
|
|
171
|
+
snapToNearest(dragDelta, velocity, dir, rootContext.snapToSequentialPoints.value)
|
|
172
|
+
|
|
173
|
+
// Sequencing matters for smooth drag-to-next-snap animation.
|
|
174
|
+
//
|
|
175
|
+
// After snapToNearest, activeSnapPoint has updated synchronously (Vue
|
|
176
|
+
// refs are synchronous) but the `watch(activeSnapPointOffset, ...)`
|
|
177
|
+
// runs on the next microtask. If we cleared --drawer-swipe-movement-y
|
|
178
|
+
// first, the transform would visually jump from the drag position
|
|
179
|
+
// (e.g. translateY(50)) back to the OLD snap offset (translateY(400))
|
|
180
|
+
// for a single frame, then the watch would fire and CSS would
|
|
181
|
+
// transition from 400 down to the new snap offset (translateY(0)) —
|
|
182
|
+
// the user sees a snap-back-then-animate instead of a continuous
|
|
183
|
+
// motion from their finger to the new snap.
|
|
184
|
+
//
|
|
185
|
+
// Fix: write the new snap offset CSS var synchronously FIRST (via
|
|
186
|
+
// writeSnapPointOffset, which reads activeSnapPointOffset.value — the
|
|
187
|
+
// computed recalculates on access), then clear the movement vars.
|
|
188
|
+
// Both writes happen in the same animation frame, and the CSS
|
|
189
|
+
// transition on `transform` smoothly interpolates from the current
|
|
190
|
+
// rendered transform (drag position) to the new snap target.
|
|
191
|
+
if (el) {
|
|
192
|
+
writeSnapPointOffset()
|
|
193
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeMovementX, '0px')
|
|
194
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeMovementY, '0px')
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// For snap-point drawers, this callback fully decides the open/close +
|
|
199
|
+
// transform outcome above, so tell finishSwipe to skip its own
|
|
200
|
+
// dismiss-vs-cancel branch.
|
|
201
|
+
return hasSnapPoints.value
|
|
202
|
+
},
|
|
203
|
+
onSwipingChange(swiping) {
|
|
204
|
+
rootContext.onSwipingChange(swiping)
|
|
205
|
+
rootContext.onNestedSwipingChange(swiping)
|
|
206
|
+
},
|
|
207
|
+
onProgress(progress, details) {
|
|
208
|
+
if (details) {
|
|
209
|
+
lastRawDelta = { x: details.deltaX, y: details.deltaY }
|
|
210
|
+
}
|
|
211
|
+
rootContext.onNestedSwipeProgressChange(progress)
|
|
212
|
+
},
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
// Track the source of the next dismiss so we can attach a reason.
|
|
216
|
+
// DismissableLayer fires `escape-key-down` / `pointer-down-outside` / `focus-outside`
|
|
217
|
+
// before it fires `dismiss`, so we capture the reason in those handlers and read
|
|
218
|
+
// it here.
|
|
219
|
+
let pendingDismissReason: 'escape-key' | 'outside-press' | undefined
|
|
220
|
+
|
|
221
|
+
function onDismiss() {
|
|
222
|
+
if (isSwiping.value)
|
|
223
|
+
return
|
|
224
|
+
rootContext.onOpenChange(false, pendingDismissReason ?? 'outside-press')
|
|
225
|
+
pendingDismissReason = undefined
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function onEscapeKeyDown(event: KeyboardEvent) {
|
|
229
|
+
pendingDismissReason = 'escape-key'
|
|
230
|
+
emits('escapeKeyDown', event)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function onPointerDownOutside(event: any) {
|
|
234
|
+
if (isSwiping.value) {
|
|
235
|
+
event.preventDefault()
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
pendingDismissReason = 'outside-press'
|
|
239
|
+
emits('pointerDownOutside', event)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function onFocusOutside(event: any) {
|
|
243
|
+
if (isSwiping.value) {
|
|
244
|
+
event.preventDefault()
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
emits('focusOutside', event)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function onInteractOutside(event: any) {
|
|
251
|
+
if (isSwiping.value) {
|
|
252
|
+
event.preventDefault()
|
|
253
|
+
return
|
|
254
|
+
}
|
|
255
|
+
emits('interactOutside', event)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// --- update:openComplete wiring ---
|
|
259
|
+
// Fire `update:openComplete` on the popup's own transitionend/animationend,
|
|
260
|
+
// not on a microtask — consumers rely on this marker to know the enter/exit
|
|
261
|
+
// transition has actually finished. We track the current listener so a rapid
|
|
262
|
+
// open→close doesn't leak or double-fire, and guard with `event.target === el`
|
|
263
|
+
// so child element transitions don't spuriously resolve the drawer lifecycle.
|
|
264
|
+
let openCompleteCleanup: (() => void) | undefined
|
|
265
|
+
|
|
266
|
+
function clearOpenCompleteListener() {
|
|
267
|
+
openCompleteCleanup?.()
|
|
268
|
+
openCompleteCleanup = undefined
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
watch(() => rootContext.open.value, (isOpen) => {
|
|
272
|
+
clearOpenCompleteListener()
|
|
273
|
+
const el = currentElement.value
|
|
274
|
+
if (!el) {
|
|
275
|
+
// If there's no element (e.g. closed without ever mounting), fire
|
|
276
|
+
// synchronously so consumers still get the contract.
|
|
277
|
+
rootContext.notifyOpenComplete(isOpen)
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
const handler = (event: Event) => {
|
|
281
|
+
if (event.target !== el)
|
|
282
|
+
return
|
|
283
|
+
clearOpenCompleteListener()
|
|
284
|
+
rootContext.notifyOpenComplete(isOpen)
|
|
285
|
+
}
|
|
286
|
+
el.addEventListener('transitionend', handler)
|
|
287
|
+
el.addEventListener('animationend', handler)
|
|
288
|
+
openCompleteCleanup = () => {
|
|
289
|
+
el.removeEventListener('transitionend', handler)
|
|
290
|
+
el.removeEventListener('animationend', handler)
|
|
291
|
+
}
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
// Data attributes
|
|
295
|
+
const dataAttributes = computed(() => {
|
|
296
|
+
const attrs: Record<string, string | undefined> = {
|
|
297
|
+
'data-state': rootContext.open.value ? 'open' : 'closed',
|
|
298
|
+
'data-swipe-direction': rootContext.swipeDirection.value,
|
|
299
|
+
}
|
|
300
|
+
if (isSwiping.value)
|
|
301
|
+
attrs['data-swiping'] = ''
|
|
302
|
+
if (rootContext.hasNestedDrawer.value)
|
|
303
|
+
attrs['data-nested-drawer-open'] = ''
|
|
304
|
+
return attrs
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
// Sync nestedOpenDrawerCount onto the popup CSS var so nested scale effects
|
|
308
|
+
// can read it. BaseUI uses a running count, not a boolean.
|
|
309
|
+
watch(() => rootContext.nestedOpenDrawerCount.value, (n) => {
|
|
310
|
+
currentElement.value?.style.setProperty(DRAWER_CSS_VARS.nestedDrawers, `${n}`)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
// Subscribe to the nested swipe progress store: when a CHILD drawer reports
|
|
314
|
+
// dismiss-swipe progress, the parent popup reads it and writes the value onto
|
|
315
|
+
// its own `--drawer-swipe-progress` CSS var so consumer CSS can animate the
|
|
316
|
+
// parent "in reverse" while the child swipes away. Ported from BaseUI
|
|
317
|
+
// `DrawerPopup.tsx` (useIsoLayoutEffect subscribing to nestedSwipeProgressStore).
|
|
318
|
+
let unsubscribeNestedProgress: (() => void) | undefined
|
|
319
|
+
|
|
320
|
+
onMounted(() => {
|
|
321
|
+
rootContext.contentElement.value = currentElement.value
|
|
322
|
+
rootContext.notifyParentHasNestedDrawer?.(true)
|
|
323
|
+
|
|
324
|
+
// Initial nested-drawer count
|
|
325
|
+
currentElement.value?.style.setProperty(
|
|
326
|
+
DRAWER_CSS_VARS.nestedDrawers,
|
|
327
|
+
`${rootContext.nestedOpenDrawerCount.value}`,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
// Initial snap-point offset. Required on reopen when popupHeight is already
|
|
331
|
+
// measured and activeSnapPoint is unchanged — the lazy watcher would never
|
|
332
|
+
// fire and the drawer would render at offset 0 (appearing as snap=1.0).
|
|
333
|
+
writeSnapPointOffset()
|
|
334
|
+
|
|
335
|
+
unsubscribeNestedProgress = rootContext.nestedSwipeProgressStore.subscribe(() => {
|
|
336
|
+
const progress = rootContext.nestedSwipeProgressStore.getSnapshot()
|
|
337
|
+
currentElement.value?.style.setProperty(DRAWER_CSS_VARS.swipeProgress, `${progress}`)
|
|
338
|
+
})
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
onUnmounted(() => {
|
|
342
|
+
rootContext.notifyParentHasNestedDrawer?.(false)
|
|
343
|
+
unsubscribeNestedProgress?.()
|
|
344
|
+
clearOpenCompleteListener()
|
|
345
|
+
})
|
|
346
|
+
|
|
347
|
+
// Dev warning for missing DrawerTitle
|
|
348
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
349
|
+
onMounted(() => {
|
|
350
|
+
if (!document.getElementById(rootContext.titleId)) {
|
|
351
|
+
console.warn(
|
|
352
|
+
`Warning: \`DrawerContent\` requires a \`DrawerTitle\` for accessibility.`,
|
|
353
|
+
)
|
|
354
|
+
}
|
|
355
|
+
})
|
|
356
|
+
}
|
|
357
|
+
</script>
|
|
358
|
+
|
|
359
|
+
<template>
|
|
360
|
+
<FocusScope
|
|
361
|
+
as-child
|
|
362
|
+
loop
|
|
363
|
+
:trapped="props.trapFocus"
|
|
364
|
+
@mount-auto-focus="emits('openAutoFocus', $event)"
|
|
365
|
+
@unmount-auto-focus="emits('closeAutoFocus', $event)"
|
|
366
|
+
>
|
|
367
|
+
<DismissableLayer
|
|
368
|
+
:id="rootContext.contentId"
|
|
369
|
+
:ref="forwardRef"
|
|
370
|
+
:as="as"
|
|
371
|
+
:as-child="asChild"
|
|
372
|
+
:disable-outside-pointer-events="disableOutsidePointerEvents"
|
|
373
|
+
role="dialog"
|
|
374
|
+
:aria-describedby="rootContext.descriptionId"
|
|
375
|
+
:aria-labelledby="rootContext.titleId"
|
|
376
|
+
v-bind="{ ...dataAttributes, ...$attrs }"
|
|
377
|
+
@dismiss="onDismiss"
|
|
378
|
+
@escape-key-down="onEscapeKeyDown"
|
|
379
|
+
@focus-outside="onFocusOutside"
|
|
380
|
+
@interact-outside="onInteractOutside"
|
|
381
|
+
@pointer-down-outside="onPointerDownOutside"
|
|
382
|
+
>
|
|
383
|
+
<slot />
|
|
384
|
+
</DismissableLayer>
|
|
385
|
+
</FocusScope>
|
|
386
|
+
</template>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PrimitiveProps } from '@/Primitive'
|
|
3
|
+
|
|
4
|
+
export interface DrawerDescriptionProps extends PrimitiveProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { Primitive } from '@/Primitive'
|
|
9
|
+
import { useForwardExpose } from '@/shared'
|
|
10
|
+
import { injectDrawerRootContext } from './DrawerRoot.vue'
|
|
11
|
+
|
|
12
|
+
const props = withDefaults(defineProps<DrawerDescriptionProps>(), { as: 'p' })
|
|
13
|
+
useForwardExpose()
|
|
14
|
+
const rootContext = injectDrawerRootContext()
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<Primitive
|
|
19
|
+
v-bind="props"
|
|
20
|
+
:id="rootContext.descriptionId"
|
|
21
|
+
>
|
|
22
|
+
<slot />
|
|
23
|
+
</Primitive>
|
|
24
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PrimitiveProps } from '@/Primitive'
|
|
3
|
+
|
|
4
|
+
export interface DrawerHandleProps extends PrimitiveProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { Primitive } from '@/Primitive'
|
|
9
|
+
import { useForwardExpose } from '@/shared'
|
|
10
|
+
import { injectDrawerRootContext } from './DrawerRoot.vue'
|
|
11
|
+
|
|
12
|
+
const props = withDefaults(defineProps<DrawerHandleProps>(), { as: 'div' })
|
|
13
|
+
useForwardExpose()
|
|
14
|
+
const rootContext = injectDrawerRootContext()
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<Primitive
|
|
19
|
+
v-bind="props"
|
|
20
|
+
aria-hidden="true"
|
|
21
|
+
:data-state="rootContext.open.value ? 'open' : 'closed'"
|
|
22
|
+
>
|
|
23
|
+
<slot />
|
|
24
|
+
</Primitive>
|
|
25
|
+
</template>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PrimitiveProps } from '@/Primitive'
|
|
3
|
+
|
|
4
|
+
export interface DrawerIndentProps extends PrimitiveProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { onMounted, onUnmounted } from 'vue'
|
|
9
|
+
import { Primitive } from '@/Primitive'
|
|
10
|
+
import { useForwardExpose } from '@/shared'
|
|
11
|
+
import { injectDrawerProviderContext } from './DrawerProvider.vue'
|
|
12
|
+
import { DRAWER_CSS_VARS } from './utils'
|
|
13
|
+
|
|
14
|
+
const props = withDefaults(defineProps<DrawerIndentProps>(), { as: 'div' })
|
|
15
|
+
const { forwardRef, currentElement } = useForwardExpose()
|
|
16
|
+
const providerContext = injectDrawerProviderContext(null)
|
|
17
|
+
|
|
18
|
+
let unsubscribe: (() => void) | undefined
|
|
19
|
+
|
|
20
|
+
onMounted(() => {
|
|
21
|
+
const store = providerContext?.visualStateStore
|
|
22
|
+
if (!store)
|
|
23
|
+
return
|
|
24
|
+
const el = currentElement.value
|
|
25
|
+
if (!el)
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
const sync = () => {
|
|
29
|
+
const { swipeProgress, frontmostHeight } = store.getSnapshot()
|
|
30
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeProgress, swipeProgress > 0 ? `${swipeProgress}` : '0')
|
|
31
|
+
if (frontmostHeight > 0)
|
|
32
|
+
el.style.setProperty(DRAWER_CSS_VARS.height, `${frontmostHeight}px`)
|
|
33
|
+
else
|
|
34
|
+
el.style.removeProperty(DRAWER_CSS_VARS.height)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
sync()
|
|
38
|
+
unsubscribe = store.subscribe(sync)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
onUnmounted(() => {
|
|
42
|
+
unsubscribe?.()
|
|
43
|
+
const el = currentElement.value
|
|
44
|
+
if (el) {
|
|
45
|
+
el.style.setProperty(DRAWER_CSS_VARS.swipeProgress, '0')
|
|
46
|
+
el.style.removeProperty(DRAWER_CSS_VARS.height)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<template>
|
|
52
|
+
<Primitive
|
|
53
|
+
v-bind="props"
|
|
54
|
+
:ref="forwardRef"
|
|
55
|
+
:data-active="providerContext?.active.value ? '' : undefined"
|
|
56
|
+
:data-inactive="providerContext?.active.value === false ? '' : undefined"
|
|
57
|
+
:style="{ [DRAWER_CSS_VARS.swipeProgress]: '0' }"
|
|
58
|
+
>
|
|
59
|
+
<slot />
|
|
60
|
+
</Primitive>
|
|
61
|
+
</template>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PrimitiveProps } from '@/Primitive'
|
|
3
|
+
|
|
4
|
+
export interface DrawerIndentBackgroundProps extends PrimitiveProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { Primitive } from '@/Primitive'
|
|
9
|
+
import { useForwardExpose } from '@/shared'
|
|
10
|
+
import { injectDrawerProviderContext } from './DrawerProvider.vue'
|
|
11
|
+
|
|
12
|
+
const props = withDefaults(defineProps<DrawerIndentBackgroundProps>(), { as: 'div' })
|
|
13
|
+
const { forwardRef } = useForwardExpose()
|
|
14
|
+
const providerContext = injectDrawerProviderContext(null)
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<Primitive
|
|
19
|
+
v-bind="props"
|
|
20
|
+
:ref="forwardRef"
|
|
21
|
+
:data-active="providerContext?.active.value ? '' : undefined"
|
|
22
|
+
:data-inactive="!providerContext?.active.value ? '' : undefined"
|
|
23
|
+
>
|
|
24
|
+
<slot />
|
|
25
|
+
</Primitive>
|
|
26
|
+
</template>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { DrawerOverlayImplProps } from './DrawerOverlayImpl.vue'
|
|
3
|
+
|
|
4
|
+
export interface DrawerOverlayProps extends DrawerOverlayImplProps {
|
|
5
|
+
/** Keep mounted for animation control. */
|
|
6
|
+
forceMount?: boolean
|
|
7
|
+
/** Render even when inside a nested drawer. @default false */
|
|
8
|
+
forceRender?: boolean
|
|
9
|
+
}
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script setup lang="ts">
|
|
13
|
+
import { Presence } from '@/Presence'
|
|
14
|
+
import { useForwardExpose } from '@/shared'
|
|
15
|
+
import DrawerOverlayImpl from './DrawerOverlayImpl.vue'
|
|
16
|
+
import { injectDrawerRootContext } from './DrawerRoot.vue'
|
|
17
|
+
|
|
18
|
+
const props = withDefaults(defineProps<DrawerOverlayProps>(), {
|
|
19
|
+
forceMount: false,
|
|
20
|
+
forceRender: false,
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const rootContext = injectDrawerRootContext()
|
|
24
|
+
const isNested = !!rootContext.notifyParentHasNestedDrawer
|
|
25
|
+
const { forwardRef } = useForwardExpose()
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<template>
|
|
29
|
+
<Presence
|
|
30
|
+
v-if="rootContext.modal.value && (!isNested || forceRender)"
|
|
31
|
+
:present="forceMount || rootContext.open.value"
|
|
32
|
+
>
|
|
33
|
+
<DrawerOverlayImpl
|
|
34
|
+
v-bind="$attrs"
|
|
35
|
+
:ref="forwardRef"
|
|
36
|
+
:as="as"
|
|
37
|
+
:as-child="asChild"
|
|
38
|
+
>
|
|
39
|
+
<slot />
|
|
40
|
+
</DrawerOverlayImpl>
|
|
41
|
+
</Presence>
|
|
42
|
+
</template>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PrimitiveProps } from '@/Primitive'
|
|
3
|
+
|
|
4
|
+
export interface DrawerOverlayImplProps extends PrimitiveProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed, watch } from 'vue'
|
|
9
|
+
import { Primitive } from '@/Primitive'
|
|
10
|
+
import { useBodyScrollLock, useForwardExpose } from '@/shared'
|
|
11
|
+
import { injectDrawerRootContext } from './DrawerRoot.vue'
|
|
12
|
+
import { DRAWER_CSS_VARS } from './utils'
|
|
13
|
+
|
|
14
|
+
defineProps<DrawerOverlayImplProps>()
|
|
15
|
+
const rootContext = injectDrawerRootContext()
|
|
16
|
+
|
|
17
|
+
// Only lock body scroll while the drawer is actually open. With `forceMount`,
|
|
18
|
+
// the overlay may stay mounted while closed — unconditional lock would keep
|
|
19
|
+
// the page scroll blocked.
|
|
20
|
+
const locked = useBodyScrollLock(rootContext.open.value)
|
|
21
|
+
watch(() => rootContext.open.value, (open) => {
|
|
22
|
+
locked.value = open
|
|
23
|
+
}, { immediate: true })
|
|
24
|
+
|
|
25
|
+
useForwardExpose()
|
|
26
|
+
|
|
27
|
+
// BaseUI parity: the backdrop carries data-swiping / data-swipe-direction so
|
|
28
|
+
// downstream CSS can target `[data-swiping] [data-slot="drawer-backdrop"]`.
|
|
29
|
+
const dataAttributes = computed(() => {
|
|
30
|
+
const attrs: Record<string, string | undefined> = {
|
|
31
|
+
'data-state': rootContext.open.value ? 'open' : 'closed',
|
|
32
|
+
'data-swipe-direction': rootContext.swipeDirection.value,
|
|
33
|
+
}
|
|
34
|
+
if (rootContext.isSwiping.value)
|
|
35
|
+
attrs['data-swiping'] = ''
|
|
36
|
+
return attrs
|
|
37
|
+
})
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<Primitive
|
|
42
|
+
:as="as"
|
|
43
|
+
:as-child="asChild"
|
|
44
|
+
v-bind="dataAttributes"
|
|
45
|
+
:style="{
|
|
46
|
+
pointerEvents: 'auto',
|
|
47
|
+
userSelect: 'none',
|
|
48
|
+
[DRAWER_CSS_VARS.swipeProgress]: '0',
|
|
49
|
+
[DRAWER_CSS_VARS.swipeStrength]: '1',
|
|
50
|
+
}"
|
|
51
|
+
>
|
|
52
|
+
<slot />
|
|
53
|
+
</Primitive>
|
|
54
|
+
</template>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { TeleportProps } from '@/Teleport'
|
|
3
|
+
|
|
4
|
+
export interface DrawerPortalProps extends TeleportProps {}
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { TeleportPrimitive } from '@/Teleport'
|
|
9
|
+
|
|
10
|
+
defineProps<DrawerPortalProps>()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<TeleportPrimitive v-bind="$props">
|
|
15
|
+
<slot />
|
|
16
|
+
</TeleportPrimitive>
|
|
17
|
+
</template>
|