bits-ui 1.8.0 → 2.2.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/bits/accordion/accordion.svelte.d.ts +56 -53
- package/dist/bits/accordion/accordion.svelte.js +78 -89
- package/dist/bits/accordion/components/accordion-content.svelte +5 -3
- package/dist/bits/accordion/components/accordion-header.svelte +4 -2
- package/dist/bits/accordion/components/accordion-item.svelte +6 -3
- package/dist/bits/accordion/components/accordion-trigger.svelte +4 -2
- package/dist/bits/accordion/components/accordion.svelte +4 -2
- package/dist/bits/alert-dialog/components/alert-dialog-action.svelte +4 -2
- package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte +4 -2
- package/dist/bits/alert-dialog/components/alert-dialog-content.svelte +8 -3
- package/dist/bits/aspect-ratio/aspect-ratio.svelte.js +2 -2
- package/dist/bits/aspect-ratio/components/aspect-ratio.svelte +4 -2
- package/dist/bits/avatar/avatar.svelte.d.ts +2 -1
- package/dist/bits/avatar/avatar.svelte.js +8 -6
- package/dist/bits/avatar/components/avatar-fallback.svelte +4 -2
- package/dist/bits/avatar/components/avatar-image.svelte +4 -2
- package/dist/bits/avatar/components/avatar.svelte +4 -2
- package/dist/bits/button/components/button.svelte +1 -1
- package/dist/bits/calendar/calendar.svelte.d.ts +3 -9
- package/dist/bits/calendar/calendar.svelte.js +55 -41
- package/dist/bits/calendar/components/calendar-cell.svelte +4 -2
- package/dist/bits/calendar/components/calendar-day.svelte +4 -2
- package/dist/bits/calendar/components/calendar-grid-body.svelte +4 -2
- package/dist/bits/calendar/components/calendar-grid-head.svelte +4 -2
- package/dist/bits/calendar/components/calendar-grid-row.svelte +4 -2
- package/dist/bits/calendar/components/calendar-grid.svelte +4 -2
- package/dist/bits/calendar/components/calendar-head-cell.svelte +4 -2
- package/dist/bits/calendar/components/calendar-header.svelte +4 -2
- package/dist/bits/calendar/components/calendar-heading.svelte +4 -2
- package/dist/bits/calendar/components/calendar-next-button.svelte +4 -2
- package/dist/bits/calendar/components/calendar-prev-button.svelte +4 -2
- package/dist/bits/checkbox/checkbox.svelte.js +4 -14
- package/dist/bits/checkbox/components/checkbox-group-label.svelte +4 -2
- package/dist/bits/checkbox/components/checkbox-group.svelte +4 -2
- package/dist/bits/checkbox/components/checkbox.svelte +4 -2
- package/dist/bits/collapsible/collapsible.svelte.js +4 -10
- package/dist/bits/collapsible/components/collapsible-content.svelte +5 -3
- package/dist/bits/collapsible/components/collapsible-trigger.svelte +4 -2
- package/dist/bits/collapsible/components/collapsible.svelte +4 -2
- package/dist/bits/combobox/components/combobox-input.svelte +3 -3
- package/dist/bits/combobox/components/combobox.svelte +6 -1
- package/dist/bits/combobox/types.d.ts +18 -1
- package/dist/bits/command/command.svelte.js +13 -45
- package/dist/bits/command/components/_command-label.svelte +6 -7
- package/dist/bits/command/components/_command-label.svelte.d.ts +1 -1
- package/dist/bits/command/components/command-empty.svelte +4 -2
- package/dist/bits/command/components/command-group-heading.svelte +4 -2
- package/dist/bits/command/components/command-group-items.svelte +4 -2
- package/dist/bits/command/components/command-group.svelte +4 -2
- package/dist/bits/command/components/command-input.svelte +4 -2
- package/dist/bits/command/components/command-item.svelte +4 -2
- package/dist/bits/command/components/command-link-item.svelte +4 -2
- package/dist/bits/command/components/command-list.svelte +4 -2
- package/dist/bits/command/components/command-loading.svelte +4 -2
- package/dist/bits/command/components/command-separator.svelte +4 -2
- package/dist/bits/command/components/command-viewport.svelte +4 -2
- package/dist/bits/command/components/command.svelte +4 -2
- package/dist/bits/context-menu/components/context-menu-content-static.svelte +2 -3
- package/dist/bits/context-menu/components/context-menu-content.svelte +2 -3
- package/dist/bits/context-menu/components/context-menu-trigger.svelte +1 -1
- package/dist/bits/date-field/components/date-field-input.svelte +4 -2
- package/dist/bits/date-field/components/date-field-label.svelte +4 -2
- package/dist/bits/date-field/components/date-field-segment.svelte +4 -2
- package/dist/bits/date-field/date-field.svelte.d.ts +7 -5
- package/dist/bits/date-field/date-field.svelte.js +29 -38
- package/dist/bits/date-picker/components/date-picker-calendar.svelte +4 -2
- package/dist/bits/date-range-field/components/date-range-field-input.svelte +4 -2
- package/dist/bits/date-range-field/components/date-range-field-label.svelte +4 -2
- package/dist/bits/date-range-field/components/date-range-field.svelte +4 -2
- package/dist/bits/date-range-field/date-range-field.svelte.d.ts +2 -0
- package/dist/bits/date-range-field/date-range-field.svelte.js +6 -14
- package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +4 -2
- package/dist/bits/dialog/components/dialog-close.svelte +4 -2
- package/dist/bits/dialog/components/dialog-content.svelte +8 -2
- package/dist/bits/dialog/components/dialog-description.svelte +4 -2
- package/dist/bits/dialog/components/dialog-overlay.svelte +8 -3
- package/dist/bits/dialog/components/dialog-title.svelte +4 -2
- package/dist/bits/dialog/components/dialog-trigger.svelte +4 -2
- package/dist/bits/dialog/dialog.svelte.d.ts +1 -1
- package/dist/bits/dialog/dialog.svelte.js +19 -47
- package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +6 -5
- package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +6 -5
- package/dist/bits/index.d.ts +2 -0
- package/dist/bits/index.js +2 -0
- package/dist/bits/label/components/label.svelte +4 -2
- package/dist/bits/label/label.svelte.js +2 -2
- package/dist/bits/link-preview/components/link-preview-content-static.svelte +6 -2
- package/dist/bits/link-preview/components/link-preview-content.svelte +6 -2
- package/dist/bits/link-preview/components/link-preview-trigger.svelte +5 -3
- package/dist/bits/link-preview/link-preview.svelte.d.ts +2 -0
- package/dist/bits/link-preview/link-preview.svelte.js +13 -19
- package/dist/bits/menu/components/menu-checkbox-group.svelte +4 -2
- package/dist/bits/menu/components/menu-checkbox-item.svelte +6 -4
- package/dist/bits/menu/components/menu-content-static.svelte +6 -5
- package/dist/bits/menu/components/menu-content.svelte +6 -5
- package/dist/bits/menu/components/menu-group-heading.svelte +4 -2
- package/dist/bits/menu/components/menu-group.svelte +4 -2
- package/dist/bits/menu/components/menu-item.svelte +4 -2
- package/dist/bits/menu/components/menu-radio-group.svelte +4 -2
- package/dist/bits/menu/components/menu-radio-item.svelte +4 -2
- package/dist/bits/menu/components/menu-separator.svelte +4 -2
- package/dist/bits/menu/components/menu-sub-content-static.svelte +6 -5
- package/dist/bits/menu/components/menu-sub-content.svelte +6 -5
- package/dist/bits/menu/components/menu-sub-trigger.svelte +6 -3
- package/dist/bits/menu/components/menu-trigger.svelte +5 -3
- package/dist/bits/menu/menu.svelte.d.ts +9 -20
- package/dist/bits/menu/menu.svelte.js +40 -63
- package/dist/bits/menubar/components/menubar-content-static.svelte +4 -2
- package/dist/bits/menubar/components/menubar-content.svelte +4 -2
- package/dist/bits/menubar/components/menubar-menu.svelte +4 -2
- package/dist/bits/menubar/components/menubar-trigger.svelte +14 -6
- package/dist/bits/menubar/components/menubar.svelte +4 -2
- package/dist/bits/menubar/menubar.svelte.d.ts +24 -20
- package/dist/bits/menubar/menubar.svelte.js +40 -56
- package/dist/bits/meter/components/meter.svelte +4 -2
- package/dist/bits/meter/meter.svelte.js +2 -2
- package/dist/bits/navigation-menu/components/navigation-menu-content-impl.svelte +5 -2
- package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +8 -3
- package/dist/bits/navigation-menu/components/navigation-menu-indicator-impl.svelte +4 -2
- package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +6 -4
- package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +6 -3
- package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +4 -2
- package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +4 -2
- package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +4 -2
- package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +4 -2
- package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +5 -3
- package/dist/bits/navigation-menu/components/navigation-menu.svelte +4 -2
- package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +3 -1
- package/dist/bits/navigation-menu/navigation-menu.svelte.js +33 -60
- package/dist/bits/pagination/components/pagination-next-button.svelte +4 -2
- package/dist/bits/pagination/components/pagination-page.svelte +4 -2
- package/dist/bits/pagination/components/pagination-prev-button.svelte +4 -2
- package/dist/bits/pagination/components/pagination.svelte +4 -2
- package/dist/bits/pagination/pagination.svelte.js +4 -4
- package/dist/bits/pin-input/components/pin-input-cell.svelte +4 -2
- package/dist/bits/pin-input/components/pin-input.svelte +5 -3
- package/dist/bits/pin-input/pin-input.svelte.d.ts +4 -2
- package/dist/bits/pin-input/pin-input.svelte.js +20 -22
- package/dist/bits/pin-input/usePasswordManager.svelte.d.ts +3 -2
- package/dist/bits/pin-input/usePasswordManager.svelte.js +6 -5
- package/dist/bits/popover/components/popover-close.svelte +4 -2
- package/dist/bits/popover/components/popover-content-static.svelte +6 -2
- package/dist/bits/popover/components/popover-content.svelte +6 -2
- package/dist/bits/popover/components/popover-trigger.svelte +5 -3
- package/dist/bits/popover/popover.svelte.js +4 -18
- package/dist/bits/progress/components/progress.svelte +4 -2
- package/dist/bits/progress/progress.svelte.js +2 -2
- package/dist/bits/radio-group/components/radio-group-item.svelte +4 -2
- package/dist/bits/radio-group/components/radio-group.svelte +4 -2
- package/dist/bits/radio-group/radio-group.svelte.js +4 -7
- package/dist/bits/range-calendar/components/range-calendar-cell.svelte +4 -2
- package/dist/bits/range-calendar/components/range-calendar-day.svelte +4 -2
- package/dist/bits/range-calendar/components/range-calendar.svelte +4 -2
- package/dist/bits/range-calendar/range-calendar.svelte.d.ts +2 -0
- package/dist/bits/range-calendar/range-calendar.svelte.js +12 -6
- package/dist/bits/scroll-area/components/scroll-area-corner.svelte +8 -2
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +4 -1
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +1 -1
- package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +5 -1
- package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +4 -2
- package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +8 -3
- package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +4 -2
- package/dist/bits/scroll-area/components/scroll-area.svelte +4 -2
- package/dist/bits/scroll-area/scroll-area.svelte.d.ts +2 -0
- package/dist/bits/scroll-area/scroll-area.svelte.js +27 -58
- package/dist/bits/select/components/select-content-static.svelte +6 -2
- package/dist/bits/select/components/select-content.svelte +6 -2
- package/dist/bits/select/components/select-group-heading.svelte +3 -2
- package/dist/bits/select/components/select-group.svelte +4 -2
- package/dist/bits/select/components/select-item.svelte +4 -2
- package/dist/bits/select/components/select-scroll-down-button.svelte +4 -2
- package/dist/bits/select/components/select-scroll-up-button.svelte +4 -2
- package/dist/bits/select/components/select-trigger.svelte +5 -3
- package/dist/bits/select/components/select-viewport.svelte +4 -2
- package/dist/bits/select/components/select.svelte +7 -1
- package/dist/bits/select/select.svelte.d.ts +5 -19
- package/dist/bits/select/select.svelte.js +43 -60
- package/dist/bits/separator/components/separator.svelte +4 -2
- package/dist/bits/separator/separator.svelte.js +2 -2
- package/dist/bits/slider/components/slider-range.svelte +4 -2
- package/dist/bits/slider/components/slider-thumb-label.svelte +50 -0
- package/dist/bits/slider/components/slider-thumb-label.svelte.d.ts +4 -0
- package/dist/bits/slider/components/slider-thumb.svelte +4 -2
- package/dist/bits/slider/components/slider-tick-label.svelte +50 -0
- package/dist/bits/slider/components/slider-tick-label.svelte.d.ts +4 -0
- package/dist/bits/slider/components/slider-tick.svelte +4 -2
- package/dist/bits/slider/components/slider.svelte +24 -5
- package/dist/bits/slider/exports.d.ts +3 -1
- package/dist/bits/slider/exports.js +2 -0
- package/dist/bits/slider/helpers.d.ts +14 -0
- package/dist/bits/slider/helpers.js +122 -0
- package/dist/bits/slider/slider.svelte.d.ts +91 -5
- package/dist/bits/slider/slider.svelte.js +194 -101
- package/dist/bits/slider/types.d.ts +105 -11
- package/dist/bits/switch/components/switch-thumb.svelte +4 -2
- package/dist/bits/switch/components/switch.svelte +4 -2
- package/dist/bits/switch/switch.svelte.js +3 -3
- package/dist/bits/tabs/components/tabs-content.svelte +4 -2
- package/dist/bits/tabs/components/tabs-list.svelte +4 -2
- package/dist/bits/tabs/components/tabs-trigger.svelte +4 -2
- package/dist/bits/tabs/components/tabs.svelte +4 -2
- package/dist/bits/tabs/tabs.svelte.js +6 -6
- package/dist/bits/time-field/components/time-field-hidden-input.svelte +10 -0
- package/dist/bits/{date-field/components/date-field-error.svelte.d.ts → time-field/components/time-field-hidden-input.svelte.d.ts} +6 -14
- package/dist/bits/time-field/components/time-field-input.svelte +39 -0
- package/dist/bits/time-field/components/time-field-input.svelte.d.ts +4 -0
- package/dist/bits/time-field/components/time-field-label.svelte +34 -0
- package/dist/bits/time-field/components/time-field-label.svelte.d.ts +4 -0
- package/dist/bits/time-field/components/time-field-segment.svelte +37 -0
- package/dist/bits/time-field/components/time-field-segment.svelte.d.ts +4 -0
- package/dist/bits/time-field/components/time-field.svelte +94 -0
- package/dist/bits/time-field/components/time-field.svelte.d.ts +20 -0
- package/dist/bits/time-field/exports.d.ts +5 -0
- package/dist/bits/time-field/exports.js +4 -0
- package/dist/bits/time-field/index.d.ts +1 -0
- package/dist/bits/time-field/index.js +1 -0
- package/dist/bits/time-field/time-field.svelte.d.ts +417 -0
- package/dist/bits/time-field/time-field.svelte.js +980 -0
- package/dist/bits/time-field/types.d.ts +137 -0
- package/dist/bits/time-field/types.js +1 -0
- package/dist/bits/time-range-field/components/time-range-field-input.svelte +43 -0
- package/dist/bits/time-range-field/components/time-range-field-input.svelte.d.ts +4 -0
- package/dist/bits/time-range-field/components/time-range-field-label.svelte +34 -0
- package/dist/bits/time-range-field/components/time-range-field-label.svelte.d.ts +4 -0
- package/dist/bits/time-range-field/components/time-range-field.svelte +144 -0
- package/dist/bits/time-range-field/components/time-range-field.svelte.d.ts +20 -0
- package/dist/bits/time-range-field/exports.d.ts +5 -0
- package/dist/bits/time-range-field/exports.js +4 -0
- package/dist/bits/time-range-field/index.d.ts +1 -0
- package/dist/bits/time-range-field/index.js +1 -0
- package/dist/bits/time-range-field/time-range-field.svelte.d.ts +92 -0
- package/dist/bits/time-range-field/time-range-field.svelte.js +212 -0
- package/dist/bits/time-range-field/types.d.ts +150 -0
- package/dist/bits/time-range-field/types.js +1 -0
- package/dist/bits/toggle/components/toggle.svelte +4 -2
- package/dist/bits/toggle/toggle.svelte.js +2 -2
- package/dist/bits/toggle-group/components/toggle-group-item.svelte +4 -2
- package/dist/bits/toggle-group/components/toggle-group.svelte +4 -2
- package/dist/bits/toggle-group/toggle-group.svelte.js +4 -4
- package/dist/bits/toolbar/components/toolbar-button.svelte +4 -2
- package/dist/bits/toolbar/components/toolbar-group-item.svelte +4 -2
- package/dist/bits/toolbar/components/toolbar-group.svelte +4 -2
- package/dist/bits/toolbar/components/toolbar-link.svelte +4 -2
- package/dist/bits/toolbar/components/toolbar.svelte +4 -2
- package/dist/bits/toolbar/toolbar.svelte.js +7 -7
- package/dist/bits/tooltip/components/tooltip-content-static.svelte +6 -2
- package/dist/bits/tooltip/components/tooltip-content.svelte +6 -2
- package/dist/bits/tooltip/components/tooltip-trigger.svelte +5 -3
- package/dist/bits/tooltip/tooltip.svelte.d.ts +2 -0
- package/dist/bits/tooltip/tooltip.svelte.js +6 -15
- package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -0
- package/dist/bits/utilities/dismissible-layer/types.d.ts +2 -0
- package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +3 -3
- package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +16 -25
- package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -1
- package/dist/bits/utilities/floating-layer/types.d.ts +1 -0
- package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +3 -2
- package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +7 -27
- package/dist/bits/utilities/focus-scope/focus-scope.svelte +2 -0
- package/dist/bits/utilities/focus-scope/types.d.ts +2 -0
- package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +2 -1
- package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +15 -16
- package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +4 -0
- package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -1
- package/dist/bits/utilities/portal/types.d.ts +1 -1
- package/dist/bits/utilities/presence-layer/presence-layer.svelte +2 -2
- package/dist/bits/utilities/presence-layer/types.d.ts +2 -1
- package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +1 -1
- package/dist/bits/utilities/presence-layer/use-presence.svelte.js +19 -36
- package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -0
- package/dist/bits/utilities/text-selection-layer/types.d.ts +2 -0
- package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +5 -1
- package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +8 -14
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/box-auto-reset.svelte.d.ts +7 -1
- package/dist/internal/box-auto-reset.svelte.js +11 -6
- package/dist/internal/create-id.d.ts +8 -0
- package/dist/internal/create-id.js +5 -0
- package/dist/internal/date-time/announcer.d.ts +1 -1
- package/dist/internal/date-time/announcer.js +20 -20
- package/dist/internal/date-time/calendar-helpers.svelte.js +7 -5
- package/dist/internal/date-time/field/helpers.d.ts +9 -2
- package/dist/internal/date-time/field/helpers.js +16 -9
- package/dist/internal/date-time/field/parts.d.ts +3 -1
- package/dist/internal/date-time/field/parts.js +10 -2
- package/dist/internal/date-time/field/segments.d.ts +9 -0
- package/dist/internal/date-time/field/segments.js +65 -0
- package/dist/internal/date-time/field/time-helpers.d.ts +83 -0
- package/dist/internal/date-time/field/time-helpers.js +301 -0
- package/dist/internal/date-time/field/types.d.ts +2 -2
- package/dist/internal/date-time/formatter.d.ts +11 -1
- package/dist/internal/date-time/formatter.js +56 -0
- package/dist/internal/date-time/utils.d.ts +7 -2
- package/dist/internal/date-time/utils.js +15 -1
- package/dist/internal/dom.d.ts +0 -1
- package/dist/internal/dom.js +0 -3
- package/dist/internal/focus.d.ts +2 -2
- package/dist/internal/focus.js +14 -9
- package/dist/internal/math.d.ts +0 -4
- package/dist/internal/math.js +0 -28
- package/dist/internal/tabbable.d.ts +0 -2
- package/dist/internal/tabbable.js +10 -14
- package/dist/internal/use-data-typeahead.svelte.d.ts +1 -0
- package/dist/internal/use-data-typeahead.svelte.js +4 -1
- package/dist/internal/use-dom-typeahead.svelte.d.ts +3 -1
- package/dist/internal/use-dom-typeahead.svelte.js +5 -2
- package/dist/internal/use-grace-area.svelte.js +9 -5
- package/dist/internal/use-roving-focus.svelte.d.ts +3 -3
- package/dist/internal/use-roving-focus.svelte.js +10 -11
- package/dist/shared/date/types.d.ts +27 -4
- package/dist/shared/index.d.ts +2 -2
- package/dist/types.d.ts +2 -0
- package/package.json +18 -16
- package/dist/bits/date-field/components/date-field-error.svelte +0 -0
- package/dist/internal/use-size.svelte.d.ts +0 -7
- package/dist/internal/use-size.svelte.js +0 -54
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { TooltipContentStaticProps } from "../types.js";
|
|
4
4
|
import { useTooltipContent } from "../tooltip.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
6
|
import PopperLayer from "../../utilities/popper-layer/popper-layer.svelte";
|
|
7
7
|
import { getFloatingContentCSSVars } from "../../../internal/floating-svelte/floating-utils.svelte.js";
|
|
8
8
|
import PopperLayerForceMount from "../../utilities/popper-layer/popper-layer-force-mount.svelte";
|
|
9
9
|
import { noop } from "../../../internal/noop.js";
|
|
10
10
|
|
|
11
|
+
const uid = $props.id();
|
|
12
|
+
|
|
11
13
|
let {
|
|
12
14
|
children,
|
|
13
15
|
child,
|
|
14
|
-
id =
|
|
16
|
+
id = createId(uid),
|
|
15
17
|
ref = $bindable(null),
|
|
16
18
|
onInteractOutside = noop,
|
|
17
19
|
onEscapeKeydown = noop,
|
|
@@ -43,6 +45,7 @@
|
|
|
43
45
|
loop={false}
|
|
44
46
|
preventScroll={false}
|
|
45
47
|
forceMount={true}
|
|
48
|
+
ref={contentState.opts.ref}
|
|
46
49
|
>
|
|
47
50
|
{#snippet popper({ props })}
|
|
48
51
|
{@const mergedProps = mergeProps(props, {
|
|
@@ -68,6 +71,7 @@
|
|
|
68
71
|
loop={false}
|
|
69
72
|
preventScroll={false}
|
|
70
73
|
forceMount={false}
|
|
74
|
+
ref={contentState.opts.ref}
|
|
71
75
|
>
|
|
72
76
|
{#snippet popper({ props })}
|
|
73
77
|
{@const mergedProps = mergeProps(props, {
|
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { TooltipContentProps } from "../types.js";
|
|
4
4
|
import { useTooltipContent } from "../tooltip.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
6
|
import PopperLayer from "../../utilities/popper-layer/popper-layer.svelte";
|
|
7
7
|
import { getFloatingContentCSSVars } from "../../../internal/floating-svelte/floating-utils.svelte.js";
|
|
8
8
|
import PopperLayerForceMount from "../../utilities/popper-layer/popper-layer-force-mount.svelte";
|
|
9
9
|
import { noop } from "../../../internal/noop.js";
|
|
10
10
|
|
|
11
|
+
const uid = $props.id();
|
|
12
|
+
|
|
11
13
|
let {
|
|
12
14
|
children,
|
|
13
15
|
child,
|
|
14
|
-
id =
|
|
16
|
+
id = createId(uid),
|
|
15
17
|
ref = $bindable(null),
|
|
16
18
|
side = "top",
|
|
17
19
|
sideOffset = 0,
|
|
@@ -61,6 +63,7 @@
|
|
|
61
63
|
loop={false}
|
|
62
64
|
preventScroll={false}
|
|
63
65
|
forceMount={true}
|
|
66
|
+
ref={contentState.opts.ref}
|
|
64
67
|
>
|
|
65
68
|
{#snippet popper({ props, wrapperProps })}
|
|
66
69
|
{@const mergedProps = mergeProps(props, {
|
|
@@ -87,6 +90,7 @@
|
|
|
87
90
|
loop={false}
|
|
88
91
|
preventScroll={false}
|
|
89
92
|
forceMount={false}
|
|
93
|
+
ref={contentState.opts.ref}
|
|
90
94
|
>
|
|
91
95
|
{#snippet popper({ props, wrapperProps })}
|
|
92
96
|
{@const mergedProps = mergeProps(props, {
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { TooltipTriggerProps } from "../types.js";
|
|
4
4
|
import { useTooltipTrigger } from "../tooltip.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
6
|
import FloatingLayerAnchor from "../../utilities/floating-layer/components/floating-layer-anchor.svelte";
|
|
7
7
|
|
|
8
|
+
const uid = $props.id();
|
|
9
|
+
|
|
8
10
|
let {
|
|
9
11
|
children,
|
|
10
12
|
child,
|
|
11
|
-
id =
|
|
13
|
+
id = createId(uid),
|
|
12
14
|
disabled = false,
|
|
13
15
|
type = "button",
|
|
14
16
|
ref = $bindable(null),
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
const mergedProps = $derived(mergeProps(restProps, triggerState.props, { type }));
|
|
28
30
|
</script>
|
|
29
31
|
|
|
30
|
-
<FloatingLayerAnchor {id}>
|
|
32
|
+
<FloatingLayerAnchor {id} ref={triggerState.opts.ref}>
|
|
31
33
|
{#if child}
|
|
32
34
|
{@render child({ props: mergedProps })}
|
|
33
35
|
{:else}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DOMContext } from "svelte-toolbelt";
|
|
1
2
|
import type { ReadableBoxedValues, WritableBoxedValues } from "../../internal/box.svelte.js";
|
|
2
3
|
import type { WithRefProps } from "../../internal/types.js";
|
|
3
4
|
import type { PointerEventHandler } from "svelte/elements";
|
|
@@ -53,6 +54,7 @@ declare class TooltipTriggerState {
|
|
|
53
54
|
#private;
|
|
54
55
|
readonly opts: TooltipTriggerStateProps;
|
|
55
56
|
readonly root: TooltipRootState;
|
|
57
|
+
domContext: DOMContext;
|
|
56
58
|
constructor(opts: TooltipTriggerStateProps, root: TooltipRootState);
|
|
57
59
|
handlePointerUp: () => void;
|
|
58
60
|
props: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { box, onMountEffect,
|
|
1
|
+
import { box, onMountEffect, attachRef, DOMContext } from "svelte-toolbelt";
|
|
2
2
|
import { on } from "svelte/events";
|
|
3
3
|
import { Context, watch } from "runed";
|
|
4
4
|
import { useTimeoutFn } from "../../internal/use-timeout-fn.svelte.js";
|
|
@@ -135,15 +135,11 @@ class TooltipTriggerState {
|
|
|
135
135
|
#isPointerDown = box(false);
|
|
136
136
|
#hasPointerMoveOpened = $state(false);
|
|
137
137
|
#isDisabled = $derived.by(() => this.opts.disabled.current || this.root.disabled);
|
|
138
|
+
domContext;
|
|
138
139
|
constructor(opts, root) {
|
|
139
140
|
this.opts = opts;
|
|
140
141
|
this.root = root;
|
|
141
|
-
|
|
142
|
-
...opts,
|
|
143
|
-
onRefChange: (node) => {
|
|
144
|
-
this.root.triggerNode = node;
|
|
145
|
-
},
|
|
146
|
-
});
|
|
142
|
+
this.domContext = new DOMContext(opts.ref);
|
|
147
143
|
}
|
|
148
144
|
handlePointerUp = () => {
|
|
149
145
|
this.#isPointerDown.current = false;
|
|
@@ -157,7 +153,7 @@ class TooltipTriggerState {
|
|
|
157
153
|
if (this.#isDisabled)
|
|
158
154
|
return;
|
|
159
155
|
this.#isPointerDown.current = true;
|
|
160
|
-
|
|
156
|
+
this.domContext.getDocument().addEventListener("pointerup", () => {
|
|
161
157
|
this.handlePointerUp();
|
|
162
158
|
}, { once: true });
|
|
163
159
|
};
|
|
@@ -212,6 +208,7 @@ class TooltipTriggerState {
|
|
|
212
208
|
onfocus: this.#onfocus,
|
|
213
209
|
onblur: this.#onblur,
|
|
214
210
|
onclick: this.#onclick,
|
|
211
|
+
...attachRef(this.opts.ref, (v) => (this.root.triggerNode = v)),
|
|
215
212
|
}));
|
|
216
213
|
}
|
|
217
214
|
class TooltipContentState {
|
|
@@ -220,13 +217,6 @@ class TooltipContentState {
|
|
|
220
217
|
constructor(opts, root) {
|
|
221
218
|
this.opts = opts;
|
|
222
219
|
this.root = root;
|
|
223
|
-
useRefById({
|
|
224
|
-
...opts,
|
|
225
|
-
onRefChange: (node) => {
|
|
226
|
-
this.root.contentNode = node;
|
|
227
|
-
},
|
|
228
|
-
deps: () => this.root.opts.open.current,
|
|
229
|
-
});
|
|
230
220
|
useGraceArea({
|
|
231
221
|
triggerNode: () => this.root.triggerNode,
|
|
232
222
|
contentNode: () => this.root.contentNode,
|
|
@@ -284,6 +274,7 @@ class TooltipContentState {
|
|
|
284
274
|
outline: "none",
|
|
285
275
|
},
|
|
286
276
|
[TOOLTIP_CONTENT_ATTR]: "",
|
|
277
|
+
...attachRef(this.opts.ref, (v) => (this.root.contentNode = v)),
|
|
287
278
|
}));
|
|
288
279
|
popperProps = {
|
|
289
280
|
onInteractOutside: this.onInteractOutside,
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
children,
|
|
13
13
|
enabled,
|
|
14
14
|
isValidEvent = () => false,
|
|
15
|
+
ref,
|
|
15
16
|
}: DismissibleLayerImplProps = $props();
|
|
16
17
|
|
|
17
18
|
const dismissibleLayerState = useDismissibleLayer({
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
enabled: box.with(() => enabled),
|
|
22
23
|
onFocusOutside: box.with(() => onFocusOutside),
|
|
23
24
|
isValidEvent: box.with(() => isValidEvent),
|
|
25
|
+
ref,
|
|
24
26
|
});
|
|
25
27
|
</script>
|
|
26
28
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
|
+
import type { WritableBox } from "svelte-toolbelt";
|
|
2
3
|
export type InteractOutsideEvent = PointerEvent;
|
|
3
4
|
export type InteractOutsideEventHandler = (e: PointerEvent) => void;
|
|
4
5
|
export type InteractOutsideBehaviorType = "close" | "defer-otherwise-close" | "defer-otherwise-ignore" | "ignore";
|
|
@@ -44,4 +45,5 @@ export type DismissibleLayerImplProps = {
|
|
|
44
45
|
children?: Snippet<[{
|
|
45
46
|
props: Record<string, unknown>;
|
|
46
47
|
}]>;
|
|
48
|
+
ref: WritableBox<HTMLElement | null>;
|
|
47
49
|
} & DismissibleLayerProps;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type WritableBox } from "svelte-toolbelt";
|
|
2
2
|
import type { DismissibleLayerImplProps } from "./types.js";
|
|
3
3
|
import type { ReadableBoxedValues } from "../../../internal/box.svelte.js";
|
|
4
|
-
type DismissibleLayerStateProps = ReadableBoxedValues<Required<Omit<DismissibleLayerImplProps, "children"
|
|
4
|
+
type DismissibleLayerStateProps = ReadableBoxedValues<Required<Omit<DismissibleLayerImplProps, "children" | "ref">>> & {
|
|
5
|
+
ref: WritableBox<HTMLElement | null>;
|
|
6
|
+
};
|
|
5
7
|
export declare class DismissibleLayerState {
|
|
6
8
|
#private;
|
|
7
9
|
readonly opts: DismissibleLayerStateProps;
|
|
8
|
-
node: WritableBox<HTMLElement | null>;
|
|
9
|
-
currNode: HTMLElement | null;
|
|
10
10
|
constructor(opts: DismissibleLayerStateProps);
|
|
11
11
|
props: {
|
|
12
12
|
onfocuscapture: () => void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterSleep, afterTick,
|
|
1
|
+
import { afterSleep, afterTick, executeCallbacks, onDestroyEffect, } from "svelte-toolbelt";
|
|
2
2
|
import { watch } from "runed";
|
|
3
3
|
import { on } from "svelte/events";
|
|
4
4
|
import { addEventListener } from "../../../internal/events.js";
|
|
@@ -17,26 +17,16 @@ export class DismissibleLayerState {
|
|
|
17
17
|
};
|
|
18
18
|
#isResponsibleLayer = false;
|
|
19
19
|
#isFocusInsideDOMTree = false;
|
|
20
|
-
node = box(null);
|
|
21
20
|
#documentObj = undefined;
|
|
22
21
|
#onFocusOutside;
|
|
23
|
-
currNode = $state(null);
|
|
24
22
|
#unsubClickListener = noop;
|
|
25
23
|
constructor(opts) {
|
|
26
24
|
this.opts = opts;
|
|
27
|
-
useRefById({
|
|
28
|
-
id: opts.id,
|
|
29
|
-
ref: this.node,
|
|
30
|
-
deps: () => opts.enabled.current,
|
|
31
|
-
onRefChange: (node) => {
|
|
32
|
-
this.currNode = node;
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
25
|
this.#behaviorType = opts.interactOutsideBehavior;
|
|
36
26
|
this.#interactOutsideProp = opts.onInteractOutside;
|
|
37
27
|
this.#onFocusOutside = opts.onFocusOutside;
|
|
38
28
|
$effect(() => {
|
|
39
|
-
this.#documentObj = getOwnerDocument(this.
|
|
29
|
+
this.#documentObj = getOwnerDocument(this.opts.ref.current);
|
|
40
30
|
});
|
|
41
31
|
let unsubEvents = noop;
|
|
42
32
|
const cleanup = () => {
|
|
@@ -45,11 +35,11 @@ export class DismissibleLayerState {
|
|
|
45
35
|
this.#handleInteractOutside.destroy();
|
|
46
36
|
unsubEvents();
|
|
47
37
|
};
|
|
48
|
-
watch([() => this.opts.enabled.current, () => this.
|
|
49
|
-
if (!enabled || !
|
|
38
|
+
watch([() => this.opts.enabled.current, () => this.opts.ref.current], () => {
|
|
39
|
+
if (!this.opts.enabled.current || !this.opts.ref.current)
|
|
50
40
|
return;
|
|
51
41
|
afterSleep(1, () => {
|
|
52
|
-
if (!this.
|
|
42
|
+
if (!this.opts.ref.current)
|
|
53
43
|
return;
|
|
54
44
|
globalThis.bitsDismissableLayers.set(this, this.#behaviorType);
|
|
55
45
|
unsubEvents();
|
|
@@ -68,10 +58,10 @@ export class DismissibleLayerState {
|
|
|
68
58
|
#handleFocus = (event) => {
|
|
69
59
|
if (event.defaultPrevented)
|
|
70
60
|
return;
|
|
71
|
-
if (!this.
|
|
61
|
+
if (!this.opts.ref.current)
|
|
72
62
|
return;
|
|
73
63
|
afterTick(() => {
|
|
74
|
-
if (!this.
|
|
64
|
+
if (!this.opts.ref.current || this.#isTargetWithinLayer(event.target))
|
|
75
65
|
return;
|
|
76
66
|
if (event.target && !this.#isFocusInsideDOMTree) {
|
|
77
67
|
this.#onFocusOutside.current?.(event);
|
|
@@ -107,11 +97,12 @@ export class DismissibleLayerState {
|
|
|
107
97
|
this.#interactOutsideProp.current(e);
|
|
108
98
|
};
|
|
109
99
|
#handleInteractOutside = debounce((e) => {
|
|
110
|
-
if (!this.
|
|
100
|
+
if (!this.opts.ref.current) {
|
|
111
101
|
this.#unsubClickListener();
|
|
112
102
|
return;
|
|
113
103
|
}
|
|
114
|
-
const isEventValid = this.opts.isValidEvent.current(e, this.
|
|
104
|
+
const isEventValid = this.opts.isValidEvent.current(e, this.opts.ref.current) ||
|
|
105
|
+
isValidEvent(e, this.opts.ref.current);
|
|
115
106
|
if (!this.#isResponsibleLayer || this.#isAnyEventIntercepted() || !isEventValid) {
|
|
116
107
|
this.#unsubClickListener();
|
|
117
108
|
return;
|
|
@@ -141,14 +132,14 @@ export class DismissibleLayerState {
|
|
|
141
132
|
this.#interceptedEvents[e.type] = false;
|
|
142
133
|
};
|
|
143
134
|
#markResponsibleLayer = () => {
|
|
144
|
-
if (!this.
|
|
135
|
+
if (!this.opts.ref.current)
|
|
145
136
|
return;
|
|
146
|
-
this.#isResponsibleLayer = isResponsibleLayer(this.
|
|
137
|
+
this.#isResponsibleLayer = isResponsibleLayer(this.opts.ref.current);
|
|
147
138
|
};
|
|
148
139
|
#isTargetWithinLayer = (target) => {
|
|
149
|
-
if (!this.
|
|
140
|
+
if (!this.opts.ref.current)
|
|
150
141
|
return false;
|
|
151
|
-
return isOrContainsTarget(this.
|
|
142
|
+
return isOrContainsTarget(this.opts.ref.current, target);
|
|
152
143
|
};
|
|
153
144
|
#resetState = debounce(() => {
|
|
154
145
|
for (const eventType in this.#interceptedEvents) {
|
|
@@ -187,9 +178,9 @@ function isResponsibleLayer(node) {
|
|
|
187
178
|
*/
|
|
188
179
|
const topMostLayer = getTopMostLayer(layersArr);
|
|
189
180
|
if (topMostLayer)
|
|
190
|
-
return topMostLayer[0].
|
|
181
|
+
return topMostLayer[0].opts.ref.current === node;
|
|
191
182
|
const [firstLayerNode] = layersArr[0];
|
|
192
|
-
return firstLayerNode.
|
|
183
|
+
return firstLayerNode.opts.ref.current === node;
|
|
193
184
|
}
|
|
194
185
|
function isValidEvent(e, node) {
|
|
195
186
|
if ("button" in e && e.button > 0)
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
import type { AnchorProps } from "./index.js";
|
|
5
5
|
import type { Measurable } from "../../../../internal/floating-svelte/types.js";
|
|
6
6
|
|
|
7
|
-
let { id, children, virtualEl }: AnchorProps = $props();
|
|
7
|
+
let { id, children, virtualEl, ref }: AnchorProps = $props();
|
|
8
8
|
|
|
9
9
|
useFloatingAnchorState({
|
|
10
10
|
id: box.with(() => id),
|
|
11
11
|
virtualEl: box.with(() => virtualEl as unknown as Measurable | null),
|
|
12
|
+
ref,
|
|
12
13
|
});
|
|
13
14
|
</script>
|
|
14
15
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Middleware, type Placement } from "@floating-ui/dom";
|
|
2
|
+
import { type ReadableBox } from "svelte-toolbelt";
|
|
2
3
|
import type { Arrayable, WithRefProps } from "../../../internal/types.js";
|
|
3
4
|
import type { Box, ReadableBoxedValues } from "../../../internal/box.svelte.js";
|
|
4
5
|
import type { Measurable, UseFloatingReturn } from "../../../internal/floating-svelte/types.js";
|
|
@@ -11,7 +12,7 @@ export type Boundary = Element | null;
|
|
|
11
12
|
declare class FloatingRootState {
|
|
12
13
|
anchorNode: import("svelte-toolbelt").WritableBox<HTMLElement | Measurable | null>;
|
|
13
14
|
customAnchorNode: import("svelte-toolbelt").WritableBox<string | HTMLElement | Measurable | null>;
|
|
14
|
-
triggerNode:
|
|
15
|
+
triggerNode: ReadableBox<Measurable | HTMLElement | null>;
|
|
15
16
|
constructor();
|
|
16
17
|
}
|
|
17
18
|
export type FloatingContentStateProps = ReadableBoxedValues<{
|
|
@@ -934,11 +935,11 @@ declare class FloatingArrowState {
|
|
|
934
935
|
type FloatingAnchorStateProps = ReadableBoxedValues<{
|
|
935
936
|
id: string;
|
|
936
937
|
virtualEl?: Measurable | null;
|
|
938
|
+
ref: Measurable | HTMLElement | null;
|
|
937
939
|
}>;
|
|
938
940
|
declare class FloatingAnchorState {
|
|
939
941
|
readonly opts: FloatingAnchorStateProps;
|
|
940
942
|
readonly root: FloatingRootState;
|
|
941
|
-
ref: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
|
|
942
943
|
constructor(opts: FloatingAnchorStateProps, root: FloatingRootState);
|
|
943
944
|
}
|
|
944
945
|
export declare function useFloatingRootState(): FloatingRootState;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { arrow, autoUpdate, flip, hide, limitShift, offset, shift, size, } from "@floating-ui/dom";
|
|
2
|
-
import { box, cssToStyleObj, styleToString,
|
|
2
|
+
import { attachRef, box, cssToStyleObj, getWindow, styleToString, } from "svelte-toolbelt";
|
|
3
3
|
import { Context, ElementSize, watch } from "runed";
|
|
4
4
|
import { isNotNull } from "../../../internal/is.js";
|
|
5
5
|
import { useId } from "../../../internal/use-id.js";
|
|
@@ -133,6 +133,7 @@ class FloatingContentState {
|
|
|
133
133
|
},
|
|
134
134
|
// Floating UI calculates logical alignment based the `dir` attribute
|
|
135
135
|
dir: this.opts.dir.current,
|
|
136
|
+
...attachRef(this.wrapperRef),
|
|
136
137
|
}));
|
|
137
138
|
props = $derived.by(() => ({
|
|
138
139
|
"data-side": this.placedSide,
|
|
@@ -143,6 +144,7 @@ class FloatingContentState {
|
|
|
143
144
|
// we prevent animations so that users's animation don't kick in too early referring wrong sides
|
|
144
145
|
// animation: !this.floating.isPositioned ? "none" : undefined,
|
|
145
146
|
}),
|
|
147
|
+
...attachRef(this.contentRef),
|
|
146
148
|
}));
|
|
147
149
|
arrowStyle = $derived({
|
|
148
150
|
position: "absolute",
|
|
@@ -172,16 +174,6 @@ class FloatingContentState {
|
|
|
172
174
|
watch(() => opts.customAnchor.current, (customAnchor) => {
|
|
173
175
|
this.root.customAnchorNode.current = customAnchor;
|
|
174
176
|
});
|
|
175
|
-
useRefById({
|
|
176
|
-
id: this.opts.wrapperId,
|
|
177
|
-
ref: this.wrapperRef,
|
|
178
|
-
deps: () => this.opts.enabled.current,
|
|
179
|
-
});
|
|
180
|
-
useRefById({
|
|
181
|
-
id: this.opts.id,
|
|
182
|
-
ref: this.contentRef,
|
|
183
|
-
deps: () => this.opts.enabled.current,
|
|
184
|
-
});
|
|
185
177
|
this.floating = useFloating({
|
|
186
178
|
strategy: () => this.opts.strategy.current,
|
|
187
179
|
placement: () => this.#desiredPlacement,
|
|
@@ -203,7 +195,8 @@ class FloatingContentState {
|
|
|
203
195
|
watch(() => this.contentRef.current, (contentNode) => {
|
|
204
196
|
if (!contentNode)
|
|
205
197
|
return;
|
|
206
|
-
|
|
198
|
+
const win = getWindow(contentNode);
|
|
199
|
+
this.contentZIndex = win.getComputedStyle(contentNode).zIndex;
|
|
207
200
|
});
|
|
208
201
|
$effect(() => {
|
|
209
202
|
this.floating.floating.current = this.wrapperRef.current;
|
|
@@ -216,24 +209,17 @@ class FloatingArrowState {
|
|
|
216
209
|
constructor(opts, content) {
|
|
217
210
|
this.opts = opts;
|
|
218
211
|
this.content = content;
|
|
219
|
-
useRefById({
|
|
220
|
-
...opts,
|
|
221
|
-
onRefChange: (node) => {
|
|
222
|
-
this.content.arrowRef.current = node;
|
|
223
|
-
},
|
|
224
|
-
deps: () => this.content.opts.enabled.current,
|
|
225
|
-
});
|
|
226
212
|
}
|
|
227
213
|
props = $derived.by(() => ({
|
|
228
214
|
id: this.opts.id.current,
|
|
229
215
|
style: this.content.arrowStyle,
|
|
230
216
|
"data-side": this.content.placedSide,
|
|
217
|
+
...attachRef(this.content.arrowRef),
|
|
231
218
|
}));
|
|
232
219
|
}
|
|
233
220
|
class FloatingAnchorState {
|
|
234
221
|
opts;
|
|
235
222
|
root;
|
|
236
|
-
ref = box(null);
|
|
237
223
|
constructor(opts, root) {
|
|
238
224
|
this.opts = opts;
|
|
239
225
|
this.root = root;
|
|
@@ -241,13 +227,7 @@ class FloatingAnchorState {
|
|
|
241
227
|
root.triggerNode = box.from(opts.virtualEl.current);
|
|
242
228
|
}
|
|
243
229
|
else {
|
|
244
|
-
|
|
245
|
-
id: opts.id,
|
|
246
|
-
ref: this.ref,
|
|
247
|
-
onRefChange: (node) => {
|
|
248
|
-
root.triggerNode.current = node;
|
|
249
|
-
},
|
|
250
|
-
});
|
|
230
|
+
root.triggerNode = opts.ref;
|
|
251
231
|
}
|
|
252
232
|
}
|
|
253
233
|
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
onOpenAutoFocus = noop,
|
|
13
13
|
focusScope,
|
|
14
14
|
forceMount = false,
|
|
15
|
+
ref,
|
|
15
16
|
}: FocusScopeImplProps = $props();
|
|
16
17
|
|
|
17
18
|
const focusScopeState = useFocusScope({
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
onOpenAutoFocus: box.with(() => onOpenAutoFocus),
|
|
22
23
|
id: box.with(() => id),
|
|
23
24
|
forceMount: box.with(() => forceMount),
|
|
25
|
+
ref,
|
|
24
26
|
});
|
|
25
27
|
</script>
|
|
26
28
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
2
|
import type { FocusScopeContainerProps } from "./use-focus-scope.svelte.js";
|
|
3
3
|
import type { EventCallback } from "../../../internal/events.js";
|
|
4
|
+
import type { ReadableBox } from "svelte-toolbelt";
|
|
4
5
|
export type FocusScopeProps = {
|
|
5
6
|
/**
|
|
6
7
|
* Event handler called when auto-focusing on open.
|
|
@@ -38,4 +39,5 @@ export type FocusScopeImplProps = {
|
|
|
38
39
|
* Whether the content within the focus trap is being force mounted or not.
|
|
39
40
|
*/
|
|
40
41
|
forceMount?: boolean;
|
|
42
|
+
ref: ReadableBox<HTMLElement | null>;
|
|
41
43
|
} & FocusScopeProps;
|
|
@@ -36,13 +36,14 @@ type UseFocusScopeProps = ReadableBoxedValues<{
|
|
|
36
36
|
* Whether force mount is enabled or not
|
|
37
37
|
*/
|
|
38
38
|
forceMount: boolean;
|
|
39
|
+
ref: HTMLElement | null;
|
|
39
40
|
}>;
|
|
40
41
|
export type FocusScopeContainerProps = {
|
|
41
42
|
id: string;
|
|
42
43
|
tabindex: number;
|
|
43
44
|
onkeydown: EventCallback<KeyboardEvent>;
|
|
44
45
|
};
|
|
45
|
-
export declare function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, }: UseFocusScopeProps): {
|
|
46
|
+
export declare function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, ref, }: UseFocusScopeProps): {
|
|
46
47
|
readonly props: FocusScopeContainerProps;
|
|
47
48
|
};
|
|
48
49
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterSleep, afterTick,
|
|
1
|
+
import { afterSleep, afterTick, DOMContext, executeCallbacks } from "svelte-toolbelt";
|
|
2
2
|
import { Context, watch } from "runed";
|
|
3
3
|
import { on } from "svelte/events";
|
|
4
4
|
import { createFocusScopeAPI, createFocusScopeStack, removeLinks, } from "./focus-scope-stack.svelte.js";
|
|
@@ -16,17 +16,12 @@ const AutoFocusOnDestroyEvent = new CustomEventDispatcher("focusScope.autoFocusO
|
|
|
16
16
|
cancelable: true,
|
|
17
17
|
});
|
|
18
18
|
export const FocusScopeContext = new Context("FocusScope");
|
|
19
|
-
export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, }) {
|
|
19
|
+
export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, ref, }) {
|
|
20
20
|
const focusScopeStack = createFocusScopeStack();
|
|
21
21
|
const focusScope = createFocusScopeAPI();
|
|
22
|
-
const ref = box(null);
|
|
23
22
|
const ctx = FocusScopeContext.getOr({ ignoreCloseAutoFocus: false });
|
|
24
23
|
let lastFocusedElement = null;
|
|
25
|
-
|
|
26
|
-
id,
|
|
27
|
-
ref,
|
|
28
|
-
deps: () => enabled.current,
|
|
29
|
-
});
|
|
24
|
+
const domContext = new DOMContext(ref);
|
|
30
25
|
function manageFocus(event) {
|
|
31
26
|
if (focusScope.paused || !ref.current || focusScope.isHandlingFocus)
|
|
32
27
|
return;
|
|
@@ -95,14 +90,16 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
95
90
|
* If the element was removed and focus is now outside the container,
|
|
96
91
|
* (e.g., browser moved it to body), refocus the container.
|
|
97
92
|
*/
|
|
98
|
-
if (elementWasRemoved &&
|
|
93
|
+
if (elementWasRemoved &&
|
|
94
|
+
ref.current &&
|
|
95
|
+
!ref.current.contains(domContext.getActiveElement())) {
|
|
99
96
|
focus(ref.current);
|
|
100
97
|
}
|
|
101
98
|
}
|
|
102
99
|
watch([() => ref.current, () => enabled.current], ([container, enabled]) => {
|
|
103
100
|
if (!container || !enabled)
|
|
104
101
|
return;
|
|
105
|
-
const removeEvents = executeCallbacks(on(
|
|
102
|
+
const removeEvents = executeCallbacks(on(domContext.getDocument(), "focusin", manageFocus), on(domContext.getDocument(), "focusout", manageFocus));
|
|
106
103
|
const mutationObserver = new MutationObserver(handleMutations);
|
|
107
104
|
mutationObserver.observe(container, {
|
|
108
105
|
childList: true,
|
|
@@ -117,7 +114,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
117
114
|
watch([() => forceMount.current, () => ref.current], ([forceMount, container]) => {
|
|
118
115
|
if (forceMount)
|
|
119
116
|
return;
|
|
120
|
-
const prevFocusedElement =
|
|
117
|
+
const prevFocusedElement = domContext.getActiveElement();
|
|
121
118
|
handleOpen(container, prevFocusedElement);
|
|
122
119
|
return () => {
|
|
123
120
|
if (!container)
|
|
@@ -128,7 +125,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
128
125
|
watch([() => forceMount.current, () => ref.current, () => enabled.current], ([forceMount, container]) => {
|
|
129
126
|
if (!forceMount)
|
|
130
127
|
return;
|
|
131
|
-
const prevFocusedElement =
|
|
128
|
+
const prevFocusedElement = domContext.getActiveElement();
|
|
132
129
|
handleOpen(container, prevFocusedElement);
|
|
133
130
|
return () => {
|
|
134
131
|
if (!container)
|
|
@@ -138,7 +135,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
138
135
|
});
|
|
139
136
|
function handleOpen(container, prevFocusedElement) {
|
|
140
137
|
if (!container)
|
|
141
|
-
container =
|
|
138
|
+
container = domContext.getElementById(id.current);
|
|
142
139
|
if (!container || !enabled.current)
|
|
143
140
|
return;
|
|
144
141
|
focusScopeStack.add(focusScope);
|
|
@@ -152,7 +149,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
152
149
|
return;
|
|
153
150
|
const result = focusFirst(removeLinks(getTabbableCandidates(container)), {
|
|
154
151
|
select: true,
|
|
155
|
-
});
|
|
152
|
+
}, () => domContext.getActiveElement());
|
|
156
153
|
if (!result)
|
|
157
154
|
focus(container);
|
|
158
155
|
});
|
|
@@ -165,7 +162,9 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
165
162
|
const shouldIgnore = ctx.ignoreCloseAutoFocus;
|
|
166
163
|
afterSleep(0, () => {
|
|
167
164
|
if (!destroyEvent.defaultPrevented && prevFocusedElement && !shouldIgnore) {
|
|
168
|
-
focus(isTabbable(prevFocusedElement)
|
|
165
|
+
focus(isTabbable(prevFocusedElement)
|
|
166
|
+
? prevFocusedElement
|
|
167
|
+
: domContext.getDocument().body, {
|
|
169
168
|
select: true,
|
|
170
169
|
});
|
|
171
170
|
}
|
|
@@ -180,7 +179,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
|
|
|
180
179
|
if (focusScope.paused)
|
|
181
180
|
return;
|
|
182
181
|
const isTabKey = e.key === kbd.TAB && !e.ctrlKey && !e.altKey && !e.metaKey;
|
|
183
|
-
const focusedElement =
|
|
182
|
+
const focusedElement = domContext.getActiveElement();
|
|
184
183
|
if (!(isTabKey && focusedElement))
|
|
185
184
|
return;
|
|
186
185
|
const container = ref.current;
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
customAnchor = null,
|
|
45
45
|
isStatic = false,
|
|
46
46
|
enabled,
|
|
47
|
+
ref,
|
|
47
48
|
...restProps
|
|
48
49
|
}: Omit<PopperLayerImplProps, "present" | "children"> & {
|
|
49
50
|
enabled: boolean;
|
|
@@ -85,6 +86,7 @@
|
|
|
85
86
|
{loop}
|
|
86
87
|
trapFocus={enabled && trapFocus}
|
|
87
88
|
forceMount={restProps.forceMount}
|
|
89
|
+
{ref}
|
|
88
90
|
>
|
|
89
91
|
{#snippet focusScope({ props: focusScopeProps })}
|
|
90
92
|
<EscapeLayer {onEscapeKeydown} {escapeKeydownBehavior} {enabled}>
|
|
@@ -95,6 +97,7 @@
|
|
|
95
97
|
{interactOutsideBehavior}
|
|
96
98
|
{isValidEvent}
|
|
97
99
|
{enabled}
|
|
100
|
+
{ref}
|
|
98
101
|
>
|
|
99
102
|
{#snippet children({ props: dismissibleProps })}
|
|
100
103
|
<TextSelectionLayer
|
|
@@ -103,6 +106,7 @@
|
|
|
103
106
|
{onPointerDown}
|
|
104
107
|
{onPointerUp}
|
|
105
108
|
{enabled}
|
|
109
|
+
{ref}
|
|
106
110
|
>
|
|
107
111
|
{@render popper?.({
|
|
108
112
|
props: mergeProps(
|
|
@@ -39,11 +39,12 @@
|
|
|
39
39
|
isValidEvent = () => false,
|
|
40
40
|
customAnchor = null,
|
|
41
41
|
isStatic = false,
|
|
42
|
+
ref,
|
|
42
43
|
...restProps
|
|
43
44
|
}: PopperLayerImplProps = $props();
|
|
44
45
|
</script>
|
|
45
46
|
|
|
46
|
-
<PresenceLayer {
|
|
47
|
+
<PresenceLayer {present} {ref}>
|
|
47
48
|
{#snippet presence()}
|
|
48
49
|
<PopperLayerInner
|
|
49
50
|
{popper}
|
|
@@ -82,6 +83,7 @@
|
|
|
82
83
|
{isValidEvent}
|
|
83
84
|
{onFocusOutside}
|
|
84
85
|
forceMount={false}
|
|
86
|
+
{ref}
|
|
85
87
|
{...restProps}
|
|
86
88
|
/>
|
|
87
89
|
{/snippet}
|