bits-ui 2.7.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/bits/accordion/accordion.svelte.d.ts +66 -58
- package/dist/bits/accordion/accordion.svelte.js +56 -51
- package/dist/bits/accordion/components/accordion-content.svelte +4 -4
- package/dist/bits/accordion/components/accordion-header.svelte +2 -2
- package/dist/bits/accordion/components/accordion-item.svelte +2 -2
- package/dist/bits/accordion/components/accordion-trigger.svelte +2 -2
- package/dist/bits/accordion/components/accordion.svelte +2 -2
- package/dist/bits/alert-dialog/components/alert-dialog-action.svelte +2 -2
- package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte +2 -2
- package/dist/bits/alert-dialog/components/alert-dialog-content.svelte +9 -12
- package/dist/bits/alert-dialog/components/alert-dialog.svelte +9 -3
- package/dist/bits/aspect-ratio/aspect-ratio.svelte.d.ts +10 -16
- package/dist/bits/aspect-ratio/aspect-ratio.svelte.js +4 -11
- package/dist/bits/aspect-ratio/components/aspect-ratio.svelte +2 -2
- package/dist/bits/avatar/avatar.svelte.d.ts +25 -33
- package/dist/bits/avatar/avatar.svelte.js +20 -21
- package/dist/bits/avatar/components/avatar-fallback.svelte +2 -2
- package/dist/bits/avatar/components/avatar-image.svelte +2 -2
- package/dist/bits/avatar/components/avatar.svelte +2 -2
- package/dist/bits/calendar/calendar.svelte.d.ts +117 -106
- package/dist/bits/calendar/calendar.svelte.js +51 -52
- package/dist/bits/calendar/components/calendar-cell.svelte +2 -2
- package/dist/bits/calendar/components/calendar-day.svelte +2 -2
- package/dist/bits/calendar/components/calendar-grid-body.svelte +2 -2
- package/dist/bits/calendar/components/calendar-grid-head.svelte +2 -2
- package/dist/bits/calendar/components/calendar-grid-row.svelte +2 -2
- package/dist/bits/calendar/components/calendar-grid.svelte +2 -2
- package/dist/bits/calendar/components/calendar-head-cell.svelte +2 -2
- package/dist/bits/calendar/components/calendar-header.svelte +2 -2
- package/dist/bits/calendar/components/calendar-heading.svelte +5 -5
- package/dist/bits/calendar/components/calendar-month-select.svelte +2 -2
- package/dist/bits/calendar/components/calendar-next-button.svelte +5 -3
- package/dist/bits/calendar/components/calendar-prev-button.svelte +5 -3
- package/dist/bits/calendar/components/calendar-year-select.svelte +2 -2
- package/dist/bits/calendar/components/calendar.svelte +2 -2
- package/dist/bits/checkbox/checkbox.svelte.d.ts +37 -34
- package/dist/bits/checkbox/checkbox.svelte.js +19 -22
- package/dist/bits/checkbox/components/checkbox-group-label.svelte +2 -2
- package/dist/bits/checkbox/components/checkbox-group.svelte +2 -2
- package/dist/bits/checkbox/components/checkbox-input.svelte +2 -2
- package/dist/bits/checkbox/components/checkbox.svelte +2 -2
- package/dist/bits/collapsible/collapsible.svelte.d.ts +30 -27
- package/dist/bits/collapsible/collapsible.svelte.js +23 -15
- package/dist/bits/collapsible/components/collapsible-content.svelte +5 -5
- package/dist/bits/collapsible/components/collapsible-content.svelte.d.ts +1 -4
- package/dist/bits/collapsible/components/collapsible-trigger.svelte +2 -2
- package/dist/bits/collapsible/components/collapsible.svelte +4 -2
- package/dist/bits/collapsible/types.d.ts +4 -0
- package/dist/bits/combobox/components/combobox-input.svelte +2 -2
- package/dist/bits/combobox/components/combobox-trigger.svelte +2 -2
- package/dist/bits/combobox/components/combobox.svelte +4 -2
- package/dist/bits/command/command.svelte.d.ts +103 -92
- package/dist/bits/command/command.svelte.js +55 -57
- package/dist/bits/command/components/_command-label.svelte +2 -2
- package/dist/bits/command/components/command-empty.svelte +2 -2
- package/dist/bits/command/components/command-group-heading.svelte +2 -2
- package/dist/bits/command/components/command-group-items.svelte +2 -2
- package/dist/bits/command/components/command-group.svelte +2 -2
- package/dist/bits/command/components/command-input.svelte +2 -2
- package/dist/bits/command/components/command-item.svelte +2 -2
- package/dist/bits/command/components/command-link-item.svelte +2 -2
- package/dist/bits/command/components/command-list.svelte +2 -2
- package/dist/bits/command/components/command-loading.svelte +2 -2
- package/dist/bits/command/components/command-separator.svelte +2 -2
- package/dist/bits/command/components/command-viewport.svelte +2 -2
- package/dist/bits/command/components/command.svelte +2 -2
- package/dist/bits/context-menu/components/context-menu-content-static.svelte +3 -3
- package/dist/bits/context-menu/components/context-menu-content.svelte +4 -4
- package/dist/bits/context-menu/components/context-menu-trigger.svelte +2 -2
- package/dist/bits/context-menu/components/context-menu.svelte +16 -11
- package/dist/bits/date-field/components/date-field-hidden-input.svelte +2 -2
- package/dist/bits/date-field/components/date-field-input.svelte +2 -2
- package/dist/bits/date-field/components/date-field-label.svelte +2 -2
- package/dist/bits/date-field/components/date-field-segment.svelte +2 -2
- package/dist/bits/date-field/components/date-field.svelte +2 -2
- package/dist/bits/date-field/date-field.svelte.d.ts +85 -74
- package/dist/bits/date-field/date-field.svelte.js +55 -53
- package/dist/bits/date-picker/components/date-picker-calendar.svelte +2 -2
- package/dist/bits/date-picker/components/date-picker.svelte +8 -6
- package/dist/bits/date-picker/date-picker.svelte.d.ts +10 -10
- package/dist/bits/date-picker/date-picker.svelte.js +6 -5
- package/dist/bits/date-picker/types.d.ts +4 -0
- package/dist/bits/date-range-field/components/date-range-field-input.svelte +2 -2
- package/dist/bits/date-range-field/components/date-range-field-label.svelte +2 -2
- package/dist/bits/date-range-field/components/date-range-field.svelte +2 -2
- package/dist/bits/date-range-field/date-range-field.svelte.d.ts +32 -29
- package/dist/bits/date-range-field/date-range-field.svelte.js +33 -32
- package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +2 -2
- package/dist/bits/date-range-picker/components/date-range-picker.svelte +8 -6
- package/dist/bits/date-range-picker/date-range-picker.svelte.d.ts +10 -10
- package/dist/bits/date-range-picker/date-range-picker.svelte.js +6 -5
- package/dist/bits/date-range-picker/types.d.ts +4 -0
- package/dist/bits/dialog/components/dialog-close.svelte +2 -2
- package/dist/bits/dialog/components/dialog-content.svelte +8 -10
- package/dist/bits/dialog/components/dialog-description.svelte +2 -2
- package/dist/bits/dialog/components/dialog-overlay.svelte +3 -6
- package/dist/bits/dialog/components/dialog-title.svelte +2 -2
- package/dist/bits/dialog/components/dialog-trigger.svelte +2 -2
- package/dist/bits/dialog/components/dialog.svelte +9 -3
- package/dist/bits/dialog/dialog.svelte.d.ts +75 -65
- package/dist/bits/dialog/dialog.svelte.js +47 -38
- package/dist/bits/dialog/types.d.ts +4 -0
- package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +3 -3
- package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +6 -5
- package/dist/bits/label/components/label.svelte +2 -2
- package/dist/bits/label/label.svelte.d.ts +8 -7
- package/dist/bits/label/label.svelte.js +4 -4
- package/dist/bits/link-preview/components/link-preview-content-static.svelte +3 -3
- package/dist/bits/link-preview/components/link-preview-content.svelte +3 -3
- package/dist/bits/link-preview/components/link-preview-trigger.svelte +2 -2
- package/dist/bits/link-preview/components/link-preview.svelte +4 -2
- package/dist/bits/link-preview/link-preview.svelte.d.ts +28 -25
- package/dist/bits/link-preview/link-preview.svelte.js +24 -16
- package/dist/bits/link-preview/types.d.ts +4 -0
- package/dist/bits/menu/components/menu-arrow.svelte +2 -2
- package/dist/bits/menu/components/menu-checkbox-group.svelte +2 -2
- package/dist/bits/menu/components/menu-checkbox-item.svelte +2 -2
- package/dist/bits/menu/components/menu-content-static.svelte +3 -3
- package/dist/bits/menu/components/menu-content.svelte +3 -3
- package/dist/bits/menu/components/menu-group-heading.svelte +2 -2
- package/dist/bits/menu/components/menu-group.svelte +2 -2
- package/dist/bits/menu/components/menu-item.svelte +2 -2
- package/dist/bits/menu/components/menu-radio-group.svelte +2 -2
- package/dist/bits/menu/components/menu-radio-item.svelte +2 -2
- package/dist/bits/menu/components/menu-separator.svelte +2 -2
- package/dist/bits/menu/components/menu-sub-content-static.svelte +3 -3
- package/dist/bits/menu/components/menu-sub-content.svelte +3 -3
- package/dist/bits/menu/components/menu-sub-trigger.svelte +2 -2
- package/dist/bits/menu/components/menu-sub.svelte +9 -3
- package/dist/bits/menu/components/menu-trigger.svelte +2 -2
- package/dist/bits/menu/components/menu.svelte +16 -11
- package/dist/bits/menu/menu.svelte.d.ts +136 -119
- package/dist/bits/menu/menu.svelte.js +105 -105
- package/dist/bits/menu/types.d.ts +8 -0
- package/dist/bits/menubar/components/menubar-content-static.svelte +2 -2
- package/dist/bits/menubar/components/menubar-content.svelte +2 -2
- package/dist/bits/menubar/components/menubar-menu.svelte +2 -2
- package/dist/bits/menubar/components/menubar-trigger.svelte +4 -4
- package/dist/bits/menubar/components/menubar.svelte +2 -2
- package/dist/bits/menubar/menubar.svelte.d.ts +37 -36
- package/dist/bits/menubar/menubar.svelte.js +21 -24
- package/dist/bits/meter/components/meter.svelte +2 -2
- package/dist/bits/meter/meter.svelte.d.ts +10 -9
- package/dist/bits/meter/meter.svelte.js +4 -4
- package/dist/bits/navigation-menu/components/navigation-menu-content-impl.svelte +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +3 -3
- package/dist/bits/navigation-menu/components/navigation-menu-indicator-impl.svelte +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +3 -3
- package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +4 -3
- package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +4 -3
- package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +3 -3
- package/dist/bits/navigation-menu/components/navigation-menu.svelte +2 -2
- package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +116 -109
- package/dist/bits/navigation-menu/navigation-menu.svelte.js +78 -81
- package/dist/bits/pagination/components/pagination-next-button.svelte +2 -2
- package/dist/bits/pagination/components/pagination-page.svelte +2 -2
- package/dist/bits/pagination/components/pagination-prev-button.svelte +2 -2
- package/dist/bits/pagination/components/pagination.svelte +2 -2
- package/dist/bits/pagination/pagination.svelte.d.ts +34 -32
- package/dist/bits/pagination/pagination.svelte.js +15 -15
- package/dist/bits/pin-input/components/pin-input-cell.svelte +2 -2
- package/dist/bits/pin-input/components/pin-input.svelte +2 -2
- package/dist/bits/pin-input/pin-input.svelte.d.ts +22 -21
- package/dist/bits/pin-input/pin-input.svelte.js +9 -9
- package/dist/bits/popover/components/popover-close.svelte +2 -2
- package/dist/bits/popover/components/popover-content-static.svelte +3 -3
- package/dist/bits/popover/components/popover-content.svelte +3 -3
- package/dist/bits/popover/components/popover-trigger.svelte +2 -2
- package/dist/bits/popover/components/popover.svelte +9 -3
- package/dist/bits/popover/popover.svelte.d.ts +36 -31
- package/dist/bits/popover/popover.svelte.js +26 -21
- package/dist/bits/popover/types.d.ts +4 -0
- package/dist/bits/progress/components/progress.svelte +2 -2
- package/dist/bits/progress/progress.svelte.d.ts +10 -9
- package/dist/bits/progress/progress.svelte.js +4 -4
- package/dist/bits/radio-group/components/radio-group-input.svelte +2 -2
- package/dist/bits/radio-group/components/radio-group-item.svelte +2 -2
- package/dist/bits/radio-group/components/radio-group.svelte +2 -2
- package/dist/bits/radio-group/radio-group.svelte.d.ts +21 -19
- package/dist/bits/radio-group/radio-group.svelte.js +15 -15
- package/dist/bits/range-calendar/components/range-calendar-cell.svelte +2 -2
- package/dist/bits/range-calendar/components/range-calendar-day.svelte +2 -2
- package/dist/bits/range-calendar/components/range-calendar.svelte +2 -2
- package/dist/bits/range-calendar/range-calendar.svelte.d.ts +21 -20
- package/dist/bits/range-calendar/range-calendar.svelte.js +12 -12
- package/dist/bits/rating-group/components/rating-group-input.svelte +2 -2
- package/dist/bits/rating-group/components/rating-group-item.svelte +2 -2
- package/dist/bits/rating-group/components/rating-group.svelte +2 -2
- package/dist/bits/rating-group/rating-group.svelte.d.ts +19 -18
- package/dist/bits/rating-group/rating-group.svelte.js +16 -17
- package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +3 -3
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +6 -6
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +3 -3
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-visible.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +2 -5
- package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +2 -2
- package/dist/bits/scroll-area/components/scroll-area.svelte +2 -2
- package/dist/bits/scroll-area/scroll-area.svelte.d.ts +98 -78
- package/dist/bits/scroll-area/scroll-area.svelte.js +78 -74
- package/dist/bits/select/components/select-content-static.svelte +3 -3
- package/dist/bits/select/components/select-content.svelte +3 -3
- package/dist/bits/select/components/select-group-heading.svelte +2 -2
- package/dist/bits/select/components/select-group.svelte +2 -2
- package/dist/bits/select/components/select-hidden-input.svelte +2 -2
- package/dist/bits/select/components/select-item.svelte +2 -2
- package/dist/bits/select/components/select-scroll-down-button.svelte +2 -2
- package/dist/bits/select/components/select-scroll-up-button.svelte +2 -2
- package/dist/bits/select/components/select-trigger.svelte +2 -2
- package/dist/bits/select/components/select-viewport.svelte +2 -2
- package/dist/bits/select/components/select.svelte +4 -2
- package/dist/bits/select/select.svelte.d.ts +127 -113
- package/dist/bits/select/select.svelte.js +72 -62
- package/dist/bits/select/types.d.ts +4 -0
- package/dist/bits/separator/components/separator.svelte +2 -2
- package/dist/bits/separator/separator.svelte.d.ts +9 -8
- package/dist/bits/separator/separator.svelte.js +4 -4
- package/dist/bits/slider/components/slider-range.svelte +2 -2
- package/dist/bits/slider/components/slider-thumb-label.svelte +2 -2
- package/dist/bits/slider/components/slider-thumb.svelte +2 -2
- package/dist/bits/slider/components/slider-tick-label.svelte +2 -2
- package/dist/bits/slider/components/slider-tick.svelte +2 -2
- package/dist/bits/slider/components/slider.svelte +2 -2
- package/dist/bits/slider/slider.svelte.d.ts +82 -73
- package/dist/bits/slider/slider.svelte.js +30 -28
- package/dist/bits/switch/components/switch-input.svelte +2 -2
- package/dist/bits/switch/components/switch-thumb.svelte +2 -2
- package/dist/bits/switch/components/switch.svelte +2 -2
- package/dist/bits/switch/switch.svelte.d.ts +19 -17
- package/dist/bits/switch/switch.svelte.js +13 -13
- package/dist/bits/tabs/components/tabs-content.svelte +2 -2
- package/dist/bits/tabs/components/tabs-list.svelte +2 -2
- package/dist/bits/tabs/components/tabs-trigger.svelte +2 -2
- package/dist/bits/tabs/components/tabs.svelte +2 -2
- package/dist/bits/tabs/tabs.svelte.d.ts +33 -29
- package/dist/bits/tabs/tabs.svelte.js +19 -19
- package/dist/bits/time-field/components/time-field-hidden-input.svelte +2 -2
- package/dist/bits/time-field/components/time-field-input.svelte +2 -2
- package/dist/bits/time-field/components/time-field-label.svelte +2 -2
- package/dist/bits/time-field/components/time-field-segment.svelte +2 -2
- package/dist/bits/time-field/components/time-field.svelte +2 -2
- package/dist/bits/time-field/time-field.svelte.d.ts +72 -66
- package/dist/bits/time-field/time-field.svelte.js +37 -42
- package/dist/bits/time-range-field/components/time-range-field-input.svelte +2 -2
- package/dist/bits/time-range-field/components/time-range-field-label.svelte +2 -2
- package/dist/bits/time-range-field/components/time-range-field.svelte +2 -2
- package/dist/bits/time-range-field/time-range-field.svelte.d.ts +35 -31
- package/dist/bits/time-range-field/time-range-field.svelte.js +34 -32
- package/dist/bits/toggle/components/toggle.svelte +2 -2
- package/dist/bits/toggle/toggle.svelte.d.ts +11 -10
- package/dist/bits/toggle/toggle.svelte.js +4 -4
- package/dist/bits/toggle-group/components/toggle-group-item.svelte +2 -2
- package/dist/bits/toggle-group/components/toggle-group.svelte +2 -2
- package/dist/bits/toggle-group/toggle-group.svelte.d.ts +48 -43
- package/dist/bits/toggle-group/toggle-group.svelte.js +24 -25
- package/dist/bits/toolbar/components/toolbar-button.svelte +2 -2
- package/dist/bits/toolbar/components/toolbar-group-item.svelte +2 -2
- package/dist/bits/toolbar/components/toolbar-group.svelte +2 -2
- package/dist/bits/toolbar/components/toolbar-link.svelte +2 -2
- package/dist/bits/toolbar/components/toolbar.svelte +2 -2
- package/dist/bits/toolbar/toolbar.svelte.d.ts +59 -51
- package/dist/bits/toolbar/toolbar.svelte.js +32 -30
- package/dist/bits/tooltip/components/tooltip-content-static.svelte +3 -3
- package/dist/bits/tooltip/components/tooltip-content.svelte +3 -3
- package/dist/bits/tooltip/components/tooltip-provider.svelte +2 -2
- package/dist/bits/tooltip/components/tooltip-trigger.svelte +2 -2
- package/dist/bits/tooltip/components/tooltip.svelte +4 -2
- package/dist/bits/tooltip/tooltip.svelte.d.ts +33 -29
- package/dist/bits/tooltip/tooltip.svelte.js +33 -28
- package/dist/bits/tooltip/types.d.ts +4 -0
- package/dist/bits/utilities/config/bits-config.d.ts +1 -1
- package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -2
- package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +6 -7
- package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +3 -3
- package/dist/bits/utilities/escape-layer/escape-layer.svelte +2 -2
- package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.d.ts +6 -7
- package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.js +3 -3
- package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -2
- package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte +2 -2
- package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte +2 -2
- package/dist/bits/utilities/floating-layer/components/floating-layer.svelte +2 -2
- package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +25 -23
- package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +25 -25
- package/dist/bits/utilities/focus-scope/focus-scope-manager.d.ts +12 -0
- package/dist/bits/utilities/focus-scope/focus-scope-manager.js +40 -0
- package/dist/bits/utilities/focus-scope/focus-scope.svelte +6 -8
- package/dist/bits/utilities/focus-scope/focus-scope.svelte.d.ts +1 -0
- package/dist/bits/utilities/focus-scope/focus-scope.svelte.js +204 -0
- package/dist/bits/utilities/focus-scope/types.d.ts +2 -6
- package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte +1 -1
- package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte.d.ts +1 -1
- package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +3 -3
- package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte.d.ts +1 -1
- package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -3
- package/dist/bits/utilities/presence-layer/presence-layer.svelte +8 -8
- package/dist/bits/utilities/presence-layer/presence.svelte.d.ts +42 -0
- package/dist/bits/utilities/presence-layer/presence.svelte.js +116 -0
- package/dist/bits/utilities/presence-layer/types.d.ts +3 -5
- package/dist/bits/utilities/scroll-lock/scroll-lock.svelte +2 -2
- package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -2
- package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +7 -7
- package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +3 -3
- package/dist/internal/animations-complete.d.ts +12 -0
- package/dist/internal/animations-complete.js +55 -0
- package/dist/internal/arrays.js +20 -36
- package/dist/internal/attrs.d.ts +9 -2
- package/dist/internal/attrs.js +21 -11
- package/dist/internal/body-scroll-lock.svelte.d.ts +10 -0
- package/dist/internal/body-scroll-lock.svelte.js +106 -0
- package/dist/internal/data-typeahead.svelte.d.ts +15 -0
- package/dist/internal/data-typeahead.svelte.js +33 -0
- package/dist/internal/date-time/calendar-helpers.svelte.d.ts +1 -1
- package/dist/internal/dom-typeahead.svelte.d.ts +14 -0
- package/dist/internal/dom-typeahead.svelte.js +44 -0
- package/dist/internal/dom.d.ts +0 -2
- package/dist/internal/dom.js +0 -15
- package/dist/internal/focus.js +1 -1
- package/dist/internal/{use-grace-area.svelte.d.ts → grace-area.svelte.d.ts} +5 -4
- package/dist/internal/{use-grace-area.svelte.js → grace-area.svelte.js} +60 -56
- package/dist/internal/open-change-complete.d.ts +13 -0
- package/dist/internal/open-change-complete.js +24 -0
- package/dist/internal/{use-roving-focus.svelte.d.ts → roving-focus-group.d.ts} +9 -8
- package/dist/internal/{use-roving-focus.svelte.js → roving-focus-group.js} +30 -34
- package/dist/internal/shared-state.svelte.d.ts +6 -0
- package/dist/internal/shared-state.svelte.js +31 -0
- package/dist/internal/should-enable-focus-trap.d.ts +5 -0
- package/dist/internal/should-enable-focus-trap.js +5 -0
- package/dist/internal/state-machine.d.ts +16 -0
- package/dist/internal/state-machine.js +18 -0
- package/dist/internal/svelte-resize-observer.svelte.d.ts +6 -0
- package/dist/internal/svelte-resize-observer.svelte.js +25 -0
- package/dist/internal/tabbable.d.ts +0 -1
- package/dist/internal/tabbable.js +0 -11
- package/dist/internal/timeout-fn.d.ts +16 -0
- package/dist/internal/timeout-fn.js +38 -0
- package/dist/internal/types.d.ts +2 -2
- package/package.json +2 -2
- package/dist/bits/utilities/focus-scope/focus-scope-stack.svelte.d.ts +0 -14
- package/dist/bits/utilities/focus-scope/focus-scope-stack.svelte.js +0 -50
- package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +0 -49
- package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +0 -218
- package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +0 -4
- package/dist/bits/utilities/presence-layer/use-presence.svelte.js +0 -97
- package/dist/internal/box.svelte.d.ts +0 -21
- package/dist/internal/box.svelte.js +0 -26
- package/dist/internal/create-event-hook.svelte.d.ts +0 -18
- package/dist/internal/create-event-hook.svelte.js +0 -29
- package/dist/internal/create-shared-hook.svelte.d.ts +0 -2
- package/dist/internal/create-shared-hook.svelte.js +0 -27
- package/dist/internal/should-trap-focus.d.ts +0 -6
- package/dist/internal/should-trap-focus.js +0 -6
- package/dist/internal/sleep.d.ts +0 -1
- package/dist/internal/sleep.js +0 -3
- package/dist/internal/use-after-animations.svelte.d.ts +0 -5
- package/dist/internal/use-after-animations.svelte.js +0 -27
- package/dist/internal/use-body-scroll-lock.svelte.d.ts +0 -6
- package/dist/internal/use-body-scroll-lock.svelte.js +0 -106
- package/dist/internal/use-data-typeahead.svelte.d.ts +0 -15
- package/dist/internal/use-data-typeahead.svelte.js +0 -34
- package/dist/internal/use-dom-typeahead.svelte.d.ts +0 -13
- package/dist/internal/use-dom-typeahead.svelte.js +0 -32
- package/dist/internal/use-form-control.svelte.d.ts +0 -4
- package/dist/internal/use-form-control.svelte.js +0 -16
- package/dist/internal/use-resize-observer.svelte.d.ts +0 -2
- package/dist/internal/use-resize-observer.svelte.js +0 -17
- package/dist/internal/use-state-machine.svelte.d.ts +0 -24
- package/dist/internal/use-state-machine.svelte.js +0 -28
- package/dist/internal/use-timeout-fn.svelte.d.ts +0 -25
- package/dist/internal/use-timeout-fn.svelte.js +0 -39
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
-
import {
|
|
3
|
+
import { FloatingRootState } from "../use-floating-layer.svelte.js";
|
|
4
4
|
|
|
5
5
|
let { children, tooltip = false }: { children?: Snippet; tooltip?: boolean } = $props();
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
FloatingRootState.create(tooltip);
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
10
|
{@render children?.()}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Middleware, type Placement } from "@floating-ui/dom";
|
|
2
|
-
import { type ReadableBox } from "svelte-toolbelt";
|
|
3
|
-
import type { Arrayable,
|
|
4
|
-
import type { Box, ReadableBoxedValues } from "../../../internal/box.svelte.js";
|
|
2
|
+
import { type ReadableBoxedValues, type ReadableBox, type Box } from "svelte-toolbelt";
|
|
3
|
+
import type { Arrayable, WithRefOpts } from "../../../internal/types.js";
|
|
5
4
|
import type { Measurable, UseFloatingReturn } from "../../../internal/floating-svelte/types.js";
|
|
6
5
|
import type { Direction, StyleProperties } from "../../../shared/index.js";
|
|
7
6
|
export declare const SIDE_OPTIONS: readonly ["top", "right", "bottom", "left"];
|
|
@@ -9,13 +8,14 @@ export declare const ALIGN_OPTIONS: readonly ["start", "center", "end"];
|
|
|
9
8
|
export type Side = (typeof SIDE_OPTIONS)[number];
|
|
10
9
|
export type Align = (typeof ALIGN_OPTIONS)[number];
|
|
11
10
|
export type Boundary = Element | null;
|
|
12
|
-
declare class FloatingRootState {
|
|
11
|
+
export declare class FloatingRootState {
|
|
12
|
+
static create(tooltip?: boolean): FloatingRootState;
|
|
13
13
|
anchorNode: import("svelte-toolbelt").WritableBox<HTMLElement | Measurable | null>;
|
|
14
14
|
customAnchorNode: import("svelte-toolbelt").WritableBox<string | HTMLElement | Measurable | null>;
|
|
15
15
|
triggerNode: ReadableBox<Measurable | HTMLElement | null>;
|
|
16
16
|
constructor();
|
|
17
17
|
}
|
|
18
|
-
export
|
|
18
|
+
export interface FloatingContentStateOpts extends ReadableBoxedValues<{
|
|
19
19
|
id: string;
|
|
20
20
|
wrapperId: string;
|
|
21
21
|
side: Side;
|
|
@@ -35,10 +35,12 @@ export type FloatingContentStateProps = ReadableBoxedValues<{
|
|
|
35
35
|
style: StyleProperties | null | undefined | string;
|
|
36
36
|
enabled: boolean;
|
|
37
37
|
customAnchor: string | HTMLElement | null | Measurable;
|
|
38
|
-
}
|
|
39
|
-
|
|
38
|
+
}> {
|
|
39
|
+
}
|
|
40
|
+
export declare class FloatingContentState {
|
|
40
41
|
#private;
|
|
41
|
-
|
|
42
|
+
static create(opts: FloatingContentStateOpts, tooltip?: boolean): FloatingContentState;
|
|
43
|
+
readonly opts: FloatingContentStateOpts;
|
|
42
44
|
readonly root: FloatingRootState;
|
|
43
45
|
contentRef: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
|
|
44
46
|
wrapperRef: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
|
|
@@ -911,14 +913,16 @@ declare class FloatingContentState {
|
|
|
911
913
|
transform: string;
|
|
912
914
|
visibility: string | undefined;
|
|
913
915
|
};
|
|
914
|
-
constructor(opts:
|
|
916
|
+
constructor(opts: FloatingContentStateOpts, root: FloatingRootState);
|
|
917
|
+
}
|
|
918
|
+
interface FloatingArrowStateOpts extends WithRefOpts {
|
|
915
919
|
}
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
readonly opts:
|
|
920
|
+
export declare class FloatingArrowState {
|
|
921
|
+
static create(opts: FloatingArrowStateOpts): FloatingArrowState;
|
|
922
|
+
readonly opts: FloatingArrowStateOpts;
|
|
919
923
|
readonly content: FloatingContentState;
|
|
920
|
-
constructor(opts:
|
|
921
|
-
props: {
|
|
924
|
+
constructor(opts: FloatingArrowStateOpts, content: FloatingContentState);
|
|
925
|
+
readonly props: {
|
|
922
926
|
readonly id: string;
|
|
923
927
|
readonly style: {
|
|
924
928
|
[x: string]: string | number | undefined;
|
|
@@ -932,20 +936,18 @@ declare class FloatingArrowState {
|
|
|
932
936
|
readonly "data-side": "left" | "right" | "top" | "bottom";
|
|
933
937
|
};
|
|
934
938
|
}
|
|
935
|
-
|
|
939
|
+
interface FloatingAnchorStateOpts extends ReadableBoxedValues<{
|
|
936
940
|
id: string;
|
|
937
941
|
virtualEl?: Measurable | null;
|
|
938
942
|
ref: Measurable | HTMLElement | null;
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
|
|
943
|
+
}> {
|
|
944
|
+
}
|
|
945
|
+
export declare class FloatingAnchorState {
|
|
946
|
+
static create(opts: FloatingAnchorStateOpts, tooltip?: boolean): FloatingAnchorState;
|
|
947
|
+
readonly opts: FloatingAnchorStateOpts;
|
|
942
948
|
readonly root: FloatingRootState;
|
|
943
|
-
constructor(opts:
|
|
949
|
+
constructor(opts: FloatingAnchorStateOpts, root: FloatingRootState);
|
|
944
950
|
}
|
|
945
|
-
export declare function useFloatingRootState(tooltip?: boolean): FloatingRootState;
|
|
946
|
-
export declare function useFloatingContentState(props: FloatingContentStateProps, tooltip?: boolean): FloatingContentState;
|
|
947
|
-
export declare function useFloatingArrowState(props: FloatingArrowStateProps): FloatingArrowState;
|
|
948
|
-
export declare function useFloatingAnchorState(props: FloatingAnchorStateProps, tooltip?: boolean): FloatingAnchorState;
|
|
949
951
|
export declare function getSideFromPlacement(placement: Placement): "left" | "right" | "top" | "bottom";
|
|
950
952
|
export declare function getAlignFromPlacement(placement: Placement): "end" | "center" | "start";
|
|
951
953
|
export {};
|
|
@@ -12,7 +12,15 @@ const OPPOSITE_SIDE = {
|
|
|
12
12
|
bottom: "top",
|
|
13
13
|
left: "right",
|
|
14
14
|
};
|
|
15
|
-
|
|
15
|
+
const FloatingRootContext = new Context("Floating.Root");
|
|
16
|
+
const FloatingContentContext = new Context("Floating.Content");
|
|
17
|
+
const FloatingTooltipRootContext = new Context("Floating.Root");
|
|
18
|
+
export class FloatingRootState {
|
|
19
|
+
static create(tooltip = false) {
|
|
20
|
+
return tooltip
|
|
21
|
+
? FloatingTooltipRootContext.set(new FloatingRootState())
|
|
22
|
+
: FloatingRootContext.set(new FloatingRootState());
|
|
23
|
+
}
|
|
16
24
|
anchorNode = box(null);
|
|
17
25
|
customAnchorNode = box(null);
|
|
18
26
|
triggerNode = box(null);
|
|
@@ -32,7 +40,12 @@ class FloatingRootState {
|
|
|
32
40
|
});
|
|
33
41
|
}
|
|
34
42
|
}
|
|
35
|
-
class FloatingContentState {
|
|
43
|
+
export class FloatingContentState {
|
|
44
|
+
static create(opts, tooltip = false) {
|
|
45
|
+
return tooltip
|
|
46
|
+
? FloatingContentContext.set(new FloatingContentState(opts, FloatingTooltipRootContext.get()))
|
|
47
|
+
: FloatingContentContext.set(new FloatingContentState(opts, FloatingRootContext.get()));
|
|
48
|
+
}
|
|
36
49
|
opts;
|
|
37
50
|
root;
|
|
38
51
|
// nodes
|
|
@@ -202,7 +215,10 @@ class FloatingContentState {
|
|
|
202
215
|
});
|
|
203
216
|
}
|
|
204
217
|
}
|
|
205
|
-
class FloatingArrowState {
|
|
218
|
+
export class FloatingArrowState {
|
|
219
|
+
static create(opts) {
|
|
220
|
+
return new FloatingArrowState(opts, FloatingContentContext.get());
|
|
221
|
+
}
|
|
206
222
|
opts;
|
|
207
223
|
content;
|
|
208
224
|
constructor(opts, content) {
|
|
@@ -216,7 +232,12 @@ class FloatingArrowState {
|
|
|
216
232
|
...attachRef(this.content.arrowRef),
|
|
217
233
|
}));
|
|
218
234
|
}
|
|
219
|
-
class FloatingAnchorState {
|
|
235
|
+
export class FloatingAnchorState {
|
|
236
|
+
static create(opts, tooltip = false) {
|
|
237
|
+
return tooltip
|
|
238
|
+
? new FloatingAnchorState(opts, FloatingTooltipRootContext.get())
|
|
239
|
+
: new FloatingAnchorState(opts, FloatingRootContext.get());
|
|
240
|
+
}
|
|
220
241
|
opts;
|
|
221
242
|
root;
|
|
222
243
|
constructor(opts, root) {
|
|
@@ -230,27 +251,6 @@ class FloatingAnchorState {
|
|
|
230
251
|
}
|
|
231
252
|
}
|
|
232
253
|
}
|
|
233
|
-
const FloatingRootContext = new Context("Floating.Root");
|
|
234
|
-
const FloatingContentContext = new Context("Floating.Content");
|
|
235
|
-
const FloatingTooltipRootContext = new Context("Floating.Root");
|
|
236
|
-
export function useFloatingRootState(tooltip = false) {
|
|
237
|
-
return tooltip
|
|
238
|
-
? FloatingTooltipRootContext.set(new FloatingRootState())
|
|
239
|
-
: FloatingRootContext.set(new FloatingRootState());
|
|
240
|
-
}
|
|
241
|
-
export function useFloatingContentState(props, tooltip = false) {
|
|
242
|
-
return tooltip
|
|
243
|
-
? FloatingContentContext.set(new FloatingContentState(props, FloatingTooltipRootContext.get()))
|
|
244
|
-
: FloatingContentContext.set(new FloatingContentState(props, FloatingRootContext.get()));
|
|
245
|
-
}
|
|
246
|
-
export function useFloatingArrowState(props) {
|
|
247
|
-
return new FloatingArrowState(props, FloatingContentContext.get());
|
|
248
|
-
}
|
|
249
|
-
export function useFloatingAnchorState(props, tooltip = false) {
|
|
250
|
-
return tooltip
|
|
251
|
-
? new FloatingAnchorState(props, FloatingTooltipRootContext.get())
|
|
252
|
-
: new FloatingAnchorState(props, FloatingRootContext.get());
|
|
253
|
-
}
|
|
254
254
|
//
|
|
255
255
|
// HELPERS
|
|
256
256
|
//
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FocusScope } from "./focus-scope.svelte.js";
|
|
2
|
+
export declare class FocusScopeManager {
|
|
3
|
+
#private;
|
|
4
|
+
static instance: FocusScopeManager;
|
|
5
|
+
static getInstance(): FocusScopeManager;
|
|
6
|
+
register(scope: FocusScope): void;
|
|
7
|
+
unregister(scope: FocusScope): void;
|
|
8
|
+
getActive(): FocusScope | undefined;
|
|
9
|
+
setFocusMemory(scope: FocusScope, element: HTMLElement): void;
|
|
10
|
+
getFocusMemory(scope: FocusScope): HTMLElement | undefined;
|
|
11
|
+
isActiveScope(scope: FocusScope): boolean;
|
|
12
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { box } from "svelte-toolbelt";
|
|
2
|
+
import { FocusScope } from "./focus-scope.svelte.js";
|
|
3
|
+
export class FocusScopeManager {
|
|
4
|
+
static instance;
|
|
5
|
+
#scopeStack = box([]);
|
|
6
|
+
#focusHistory = new WeakMap();
|
|
7
|
+
static getInstance() {
|
|
8
|
+
if (!this.instance) {
|
|
9
|
+
this.instance = new FocusScopeManager();
|
|
10
|
+
}
|
|
11
|
+
return this.instance;
|
|
12
|
+
}
|
|
13
|
+
register(scope) {
|
|
14
|
+
const current = this.getActive();
|
|
15
|
+
if (current && current !== scope) {
|
|
16
|
+
current.pause();
|
|
17
|
+
}
|
|
18
|
+
this.#scopeStack.current = this.#scopeStack.current.filter((s) => s !== scope);
|
|
19
|
+
this.#scopeStack.current.unshift(scope);
|
|
20
|
+
}
|
|
21
|
+
unregister(scope) {
|
|
22
|
+
this.#scopeStack.current = this.#scopeStack.current.filter((s) => s !== scope);
|
|
23
|
+
const next = this.getActive();
|
|
24
|
+
if (next) {
|
|
25
|
+
next.resume();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
getActive() {
|
|
29
|
+
return this.#scopeStack.current[0];
|
|
30
|
+
}
|
|
31
|
+
setFocusMemory(scope, element) {
|
|
32
|
+
this.#focusHistory.set(scope, element);
|
|
33
|
+
}
|
|
34
|
+
getFocusMemory(scope) {
|
|
35
|
+
return this.#focusHistory.get(scope);
|
|
36
|
+
}
|
|
37
|
+
isActiveScope(scope) {
|
|
38
|
+
return this.getActive() === scope;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { box } from "svelte-toolbelt";
|
|
3
3
|
import type { FocusScopeImplProps } from "./types.js";
|
|
4
|
-
import { useFocusScope } from "./use-focus-scope.svelte.js";
|
|
5
4
|
import { noop } from "../../../internal/noop.js";
|
|
5
|
+
import { FocusScope } from "./focus-scope.svelte.js";
|
|
6
6
|
|
|
7
7
|
let {
|
|
8
|
-
|
|
8
|
+
enabled = false,
|
|
9
9
|
trapFocus = false,
|
|
10
10
|
loop = false,
|
|
11
11
|
onCloseAutoFocus = noop,
|
|
12
12
|
onOpenAutoFocus = noop,
|
|
13
13
|
focusScope,
|
|
14
|
-
forceMount = false,
|
|
15
14
|
ref,
|
|
16
15
|
}: FocusScopeImplProps = $props();
|
|
17
16
|
|
|
18
|
-
const focusScopeState =
|
|
19
|
-
enabled: box.with(() =>
|
|
20
|
-
|
|
17
|
+
const focusScopeState = FocusScope.use({
|
|
18
|
+
enabled: box.with(() => enabled),
|
|
19
|
+
trap: box.with(() => trapFocus),
|
|
20
|
+
loop: loop,
|
|
21
21
|
onCloseAutoFocus: box.with(() => onCloseAutoFocus),
|
|
22
22
|
onOpenAutoFocus: box.with(() => onOpenAutoFocus),
|
|
23
|
-
id: box.with(() => id),
|
|
24
|
-
forceMount: box.with(() => forceMount),
|
|
25
23
|
ref,
|
|
26
24
|
});
|
|
27
25
|
</script>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FocusScopeImplProps } from "./types.js";
|
|
2
|
+
import { FocusScope } from "./focus-scope.svelte.js";
|
|
2
3
|
declare const FocusScope: import("svelte").Component<FocusScopeImplProps, {}, "">;
|
|
3
4
|
type FocusScope = ReturnType<typeof FocusScope>;
|
|
4
5
|
export default FocusScope;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { onDestroyEffect } from "svelte-toolbelt";
|
|
2
|
+
import { FocusScopeManager } from "./focus-scope-manager.js";
|
|
3
|
+
import { focusable, isFocusable, tabbable } from "tabbable";
|
|
4
|
+
import { on } from "svelte/events";
|
|
5
|
+
import { watch } from "runed";
|
|
6
|
+
export class FocusScope {
|
|
7
|
+
#paused = false;
|
|
8
|
+
#container = null;
|
|
9
|
+
#manager = FocusScopeManager.getInstance();
|
|
10
|
+
#cleanupFns = [];
|
|
11
|
+
#opts;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.#opts = opts;
|
|
14
|
+
}
|
|
15
|
+
get paused() {
|
|
16
|
+
return this.#paused;
|
|
17
|
+
}
|
|
18
|
+
pause() {
|
|
19
|
+
this.#paused = true;
|
|
20
|
+
}
|
|
21
|
+
resume() {
|
|
22
|
+
this.#paused = false;
|
|
23
|
+
}
|
|
24
|
+
#cleanup() {
|
|
25
|
+
for (const fn of this.#cleanupFns) {
|
|
26
|
+
fn();
|
|
27
|
+
}
|
|
28
|
+
this.#cleanupFns = [];
|
|
29
|
+
}
|
|
30
|
+
mount(container) {
|
|
31
|
+
if (this.#container) {
|
|
32
|
+
this.unmount();
|
|
33
|
+
}
|
|
34
|
+
this.#container = container;
|
|
35
|
+
this.#manager.register(this);
|
|
36
|
+
this.#setupEventListeners();
|
|
37
|
+
this.#handleOpenAutoFocus();
|
|
38
|
+
}
|
|
39
|
+
unmount() {
|
|
40
|
+
if (!this.#container)
|
|
41
|
+
return;
|
|
42
|
+
this.#cleanup();
|
|
43
|
+
// handle close auto-focus
|
|
44
|
+
this.#handleCloseAutoFocus();
|
|
45
|
+
this.#manager.unregister(this);
|
|
46
|
+
this.#container = null;
|
|
47
|
+
}
|
|
48
|
+
#handleOpenAutoFocus() {
|
|
49
|
+
if (!this.#container)
|
|
50
|
+
return;
|
|
51
|
+
const event = new CustomEvent("focusScope.onOpenAutoFocus", {
|
|
52
|
+
bubbles: false,
|
|
53
|
+
cancelable: true,
|
|
54
|
+
});
|
|
55
|
+
this.#opts.onOpenAutoFocus.current(event);
|
|
56
|
+
if (!event.defaultPrevented) {
|
|
57
|
+
requestAnimationFrame(() => {
|
|
58
|
+
if (!this.#container)
|
|
59
|
+
return;
|
|
60
|
+
const firstTabbable = this.#getFirstTabbable();
|
|
61
|
+
if (firstTabbable) {
|
|
62
|
+
firstTabbable.focus();
|
|
63
|
+
this.#manager.setFocusMemory(this, firstTabbable);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.#container.focus();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
#handleCloseAutoFocus() {
|
|
72
|
+
const event = new CustomEvent("focusScope.onCloseAutoFocus", {
|
|
73
|
+
bubbles: false,
|
|
74
|
+
cancelable: true,
|
|
75
|
+
});
|
|
76
|
+
this.#opts.onCloseAutoFocus.current(event);
|
|
77
|
+
if (!event.defaultPrevented) {
|
|
78
|
+
// return focus to previously focused element
|
|
79
|
+
const prevFocused = document.activeElement;
|
|
80
|
+
if (prevFocused && prevFocused !== document.body) {
|
|
81
|
+
prevFocused.focus();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
#setupEventListeners() {
|
|
86
|
+
if (!this.#container || !this.#opts.trap.current)
|
|
87
|
+
return;
|
|
88
|
+
const container = this.#container;
|
|
89
|
+
const doc = container.ownerDocument;
|
|
90
|
+
const handleFocus = (e) => {
|
|
91
|
+
if (this.#paused || !this.#manager.isActiveScope(this))
|
|
92
|
+
return;
|
|
93
|
+
const target = e.target;
|
|
94
|
+
if (!target)
|
|
95
|
+
return;
|
|
96
|
+
const isInside = container.contains(target);
|
|
97
|
+
if (isInside) {
|
|
98
|
+
// store last focused element
|
|
99
|
+
this.#manager.setFocusMemory(this, target);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// focus escaped - bring it back
|
|
103
|
+
const lastFocused = this.#manager.getFocusMemory(this);
|
|
104
|
+
if (lastFocused && container.contains(lastFocused) && isFocusable(lastFocused)) {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
lastFocused.focus();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// fallback to first tabbable or first focusable or container
|
|
110
|
+
const firstTabbable = this.#getFirstTabbable();
|
|
111
|
+
const firstFocusable = this.#getAllFocusables()[0];
|
|
112
|
+
(firstTabbable || firstFocusable || container).focus();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const handleKeydown = (e) => {
|
|
117
|
+
if (!this.#opts.loop || this.#paused || e.key !== "Tab")
|
|
118
|
+
return;
|
|
119
|
+
if (!this.#manager.isActiveScope(this))
|
|
120
|
+
return;
|
|
121
|
+
const tabbables = this.#getTabbables();
|
|
122
|
+
if (tabbables.length < 2)
|
|
123
|
+
return;
|
|
124
|
+
const first = tabbables[0];
|
|
125
|
+
const last = tabbables[tabbables.length - 1];
|
|
126
|
+
if (!e.shiftKey && doc.activeElement === last) {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
first.focus();
|
|
129
|
+
}
|
|
130
|
+
else if (e.shiftKey && doc.activeElement === first) {
|
|
131
|
+
e.preventDefault();
|
|
132
|
+
last.focus();
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
this.#cleanupFns.push(on(doc, "focusin", handleFocus, { capture: true }), on(container, "keydown", handleKeydown));
|
|
136
|
+
const observer = new MutationObserver(() => {
|
|
137
|
+
const lastFocused = this.#manager.getFocusMemory(this);
|
|
138
|
+
if (lastFocused && !container.contains(lastFocused)) {
|
|
139
|
+
// last focused element was removed
|
|
140
|
+
const firstTabbable = this.#getFirstTabbable();
|
|
141
|
+
const firstFocusable = this.#getAllFocusables()[0];
|
|
142
|
+
const elementToFocus = firstTabbable || firstFocusable;
|
|
143
|
+
if (elementToFocus) {
|
|
144
|
+
elementToFocus.focus();
|
|
145
|
+
this.#manager.setFocusMemory(this, elementToFocus);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// no focusable elements left, focus container
|
|
149
|
+
container.focus();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
observer.observe(container, {
|
|
154
|
+
childList: true,
|
|
155
|
+
subtree: true,
|
|
156
|
+
});
|
|
157
|
+
this.#cleanupFns.push(() => observer.disconnect());
|
|
158
|
+
}
|
|
159
|
+
#getTabbables() {
|
|
160
|
+
if (!this.#container)
|
|
161
|
+
return [];
|
|
162
|
+
return tabbable(this.#container, {
|
|
163
|
+
includeContainer: false,
|
|
164
|
+
getShadowRoot: true,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
#getFirstTabbable() {
|
|
168
|
+
const tabbables = this.#getTabbables();
|
|
169
|
+
return tabbables[0] || null;
|
|
170
|
+
}
|
|
171
|
+
#getAllFocusables() {
|
|
172
|
+
if (!this.#container)
|
|
173
|
+
return [];
|
|
174
|
+
return focusable(this.#container, {
|
|
175
|
+
includeContainer: false,
|
|
176
|
+
getShadowRoot: true,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
static use(opts) {
|
|
180
|
+
let scope = null;
|
|
181
|
+
watch([() => opts.ref.current, () => opts.enabled.current], ([ref, enabled]) => {
|
|
182
|
+
if (ref && enabled) {
|
|
183
|
+
if (!scope) {
|
|
184
|
+
scope = new FocusScope(opts);
|
|
185
|
+
}
|
|
186
|
+
scope.mount(ref);
|
|
187
|
+
}
|
|
188
|
+
else if (scope) {
|
|
189
|
+
scope.unmount();
|
|
190
|
+
scope = null;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
onDestroyEffect(() => {
|
|
194
|
+
scope?.unmount();
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
get props() {
|
|
198
|
+
return {
|
|
199
|
+
tabindex: -1,
|
|
200
|
+
};
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
|
-
import type { FocusScopeContainerProps } from "./use-focus-scope.svelte.js";
|
|
3
2
|
import type { EventCallback } from "../../../internal/events.js";
|
|
4
3
|
import type { ReadableBox } from "svelte-toolbelt";
|
|
5
4
|
export type FocusScopeProps = {
|
|
@@ -21,15 +20,11 @@ export type FocusScopeProps = {
|
|
|
21
20
|
trapFocus?: boolean;
|
|
22
21
|
};
|
|
23
22
|
export type FocusScopeImplProps = {
|
|
24
|
-
/**
|
|
25
|
-
* The ID of the focus scope container node.
|
|
26
|
-
*/
|
|
27
|
-
id: string;
|
|
28
23
|
/**
|
|
29
24
|
* The snippet to render the focus scope container with its props.
|
|
30
25
|
*/
|
|
31
26
|
focusScope?: Snippet<[{
|
|
32
|
-
props:
|
|
27
|
+
props: Record<string, unknown>;
|
|
33
28
|
}]>;
|
|
34
29
|
/**
|
|
35
30
|
* When `true` will loop through the tabbable elements in the focus scope.
|
|
@@ -39,5 +34,6 @@ export type FocusScopeImplProps = {
|
|
|
39
34
|
* Whether the content within the focus trap is being force mounted or not.
|
|
40
35
|
*/
|
|
41
36
|
forceMount?: boolean;
|
|
37
|
+
enabled: boolean;
|
|
42
38
|
ref: ReadableBox<HTMLElement | null>;
|
|
43
39
|
} & FocusScopeProps;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PopperLayerImplProps } from "./types.js";
|
|
2
|
-
type $$ComponentProps = Omit<PopperLayerImplProps, "
|
|
2
|
+
type $$ComponentProps = Omit<PopperLayerImplProps, "open"> & {
|
|
3
3
|
enabled: boolean;
|
|
4
4
|
};
|
|
5
5
|
declare const PopperLayerForceMount: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
ref,
|
|
48
48
|
tooltip = false,
|
|
49
49
|
...restProps
|
|
50
|
-
}: Omit<PopperLayerImplProps, "
|
|
50
|
+
}: Omit<PopperLayerImplProps, "open" | "children"> & {
|
|
51
51
|
enabled: boolean;
|
|
52
52
|
} = $props();
|
|
53
53
|
</script>
|
|
@@ -82,11 +82,11 @@
|
|
|
82
82
|
<ScrollLock {preventScroll} />
|
|
83
83
|
{/if}
|
|
84
84
|
<FocusScope
|
|
85
|
-
{id}
|
|
86
85
|
{onOpenAutoFocus}
|
|
87
86
|
{onCloseAutoFocus}
|
|
88
87
|
{loop}
|
|
89
|
-
|
|
88
|
+
{enabled}
|
|
89
|
+
{trapFocus}
|
|
90
90
|
forceMount={restProps.forceMount}
|
|
91
91
|
{ref}
|
|
92
92
|
>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PopperLayerImplProps } from "./types.js";
|
|
2
|
-
type $$ComponentProps = Omit<PopperLayerImplProps, "
|
|
2
|
+
type $$ComponentProps = Omit<PopperLayerImplProps, "open" | "children"> & {
|
|
3
3
|
enabled: boolean;
|
|
4
4
|
};
|
|
5
5
|
declare const PopperLayerInner: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
let {
|
|
7
7
|
popper,
|
|
8
|
-
|
|
8
|
+
open,
|
|
9
9
|
onEscapeKeydown,
|
|
10
10
|
escapeKeydownBehavior,
|
|
11
11
|
preventOverflowTextSelection,
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
}: PopperLayerImplProps = $props();
|
|
45
45
|
</script>
|
|
46
46
|
|
|
47
|
-
<PresenceLayer {
|
|
47
|
+
<PresenceLayer {open} {ref}>
|
|
48
48
|
{#snippet presence()}
|
|
49
49
|
<PopperLayerInner
|
|
50
50
|
{popper}
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
{onPlaced}
|
|
74
74
|
{customAnchor}
|
|
75
75
|
{isStatic}
|
|
76
|
-
enabled={
|
|
76
|
+
enabled={open}
|
|
77
77
|
{onInteractOutside}
|
|
78
78
|
{onCloseAutoFocus}
|
|
79
79
|
{onOpenAutoFocus}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { box } from "svelte-toolbelt";
|
|
3
3
|
import type { PresenceLayerImplProps } from "./types.js";
|
|
4
|
-
import {
|
|
4
|
+
import { Presence } from "./presence.svelte.js";
|
|
5
5
|
|
|
6
|
-
let {
|
|
6
|
+
let { open, forceMount, presence, ref }: PresenceLayerImplProps = $props();
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
box.with(() =>
|
|
10
|
-
ref
|
|
11
|
-
);
|
|
8
|
+
const presenceState = new Presence({
|
|
9
|
+
open: box.with(() => open),
|
|
10
|
+
ref,
|
|
11
|
+
});
|
|
12
12
|
</script>
|
|
13
13
|
|
|
14
|
-
{#if forceMount ||
|
|
15
|
-
{@render presence?.({ present: isPresent })}
|
|
14
|
+
{#if forceMount || open || presenceState.isPresent}
|
|
15
|
+
{@render presence?.({ present: presenceState.isPresent })}
|
|
16
16
|
{/if}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ReadableBox, type ReadableBoxedValues } from "svelte-toolbelt";
|
|
2
|
+
import { Previous } from "runed";
|
|
3
|
+
import { StateMachine } from "../../../internal/state-machine.js";
|
|
4
|
+
export interface PresenceOptions extends ReadableBoxedValues<{
|
|
5
|
+
open: boolean;
|
|
6
|
+
ref: HTMLElement | null;
|
|
7
|
+
}> {
|
|
8
|
+
}
|
|
9
|
+
type PresenceStatus = "unmounted" | "mounted" | "unmountSuspended";
|
|
10
|
+
declare const presenceMachine: {
|
|
11
|
+
readonly mounted: {
|
|
12
|
+
readonly UNMOUNT: "unmounted";
|
|
13
|
+
readonly ANIMATION_OUT: "unmountSuspended";
|
|
14
|
+
};
|
|
15
|
+
readonly unmountSuspended: {
|
|
16
|
+
readonly MOUNT: "mounted";
|
|
17
|
+
readonly ANIMATION_END: "unmounted";
|
|
18
|
+
};
|
|
19
|
+
readonly unmounted: {
|
|
20
|
+
readonly MOUNT: "mounted";
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
type PresenceMachine = StateMachine<typeof presenceMachine>;
|
|
24
|
+
export declare class Presence {
|
|
25
|
+
readonly opts: PresenceOptions;
|
|
26
|
+
prevAnimationNameState: string;
|
|
27
|
+
styles: CSSStyleDeclaration;
|
|
28
|
+
initialStatus: PresenceStatus;
|
|
29
|
+
previousPresent: Previous<boolean>;
|
|
30
|
+
machine: PresenceMachine;
|
|
31
|
+
present: ReadableBox<boolean>;
|
|
32
|
+
constructor(opts: PresenceOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`
|
|
35
|
+
* event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we
|
|
36
|
+
* make sure we only trigger ANIMATION_END for the currently active animation.
|
|
37
|
+
*/
|
|
38
|
+
handleAnimationEnd(event: AnimationEvent): void;
|
|
39
|
+
handleAnimationStart(event: AnimationEvent): void;
|
|
40
|
+
isPresent: boolean;
|
|
41
|
+
}
|
|
42
|
+
export {};
|