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,7 +2,7 @@
|
|
|
2
2
|
* Based on Radix UI's Navigation Menu
|
|
3
3
|
* https://www.radix-ui.com/docs/primitives/components/navigation-menu
|
|
4
4
|
*/
|
|
5
|
-
import { afterSleep, afterTick, box,
|
|
5
|
+
import { afterSleep, afterTick, box, attachRef, DOMContext, getWindow, } from "svelte-toolbelt";
|
|
6
6
|
import { Context, useDebounce, watch } from "runed";
|
|
7
7
|
import { untrack } from "svelte";
|
|
8
8
|
import { SvelteMap } from "svelte/reactivity";
|
|
@@ -71,8 +71,10 @@ class NavigationMenuRootState {
|
|
|
71
71
|
});
|
|
72
72
|
constructor(opts) {
|
|
73
73
|
this.opts = opts;
|
|
74
|
-
this.isDelaySkipped = boxAutoReset(false,
|
|
75
|
-
|
|
74
|
+
this.isDelaySkipped = boxAutoReset(false, {
|
|
75
|
+
afterMs: this.opts.skipDelayDuration.current,
|
|
76
|
+
getWindow: () => getWindow(opts.ref.current),
|
|
77
|
+
});
|
|
76
78
|
this.provider = useNavigationMenuProvider({
|
|
77
79
|
value: this.opts.value,
|
|
78
80
|
previousValue: this.previousValue,
|
|
@@ -135,6 +137,7 @@ class NavigationMenuRootState {
|
|
|
135
137
|
dir: this.opts.dir.current,
|
|
136
138
|
[NAVIGATION_MENU_ROOT_ATTR]: "",
|
|
137
139
|
[NAVIGATION_MENU_ATTR]: "",
|
|
140
|
+
...attachRef(this.opts.ref),
|
|
138
141
|
}));
|
|
139
142
|
}
|
|
140
143
|
class NavigationMenuSubState {
|
|
@@ -145,7 +148,6 @@ class NavigationMenuSubState {
|
|
|
145
148
|
constructor(opts, context) {
|
|
146
149
|
this.opts = opts;
|
|
147
150
|
this.context = context;
|
|
148
|
-
useRefById(opts);
|
|
149
151
|
this.subProvider = useNavigationMenuProvider({
|
|
150
152
|
isRootMenu: false,
|
|
151
153
|
value: this.opts.value,
|
|
@@ -173,6 +175,7 @@ class NavigationMenuSubState {
|
|
|
173
175
|
"data-orientation": getDataOrientation(this.opts.orientation.current),
|
|
174
176
|
[NAVIGATION_MENU_SUB_ATTR]: "",
|
|
175
177
|
[NAVIGATION_MENU_ATTR]: "",
|
|
178
|
+
...attachRef(this.opts.ref),
|
|
176
179
|
}));
|
|
177
180
|
}
|
|
178
181
|
class NavigationMenuListState {
|
|
@@ -186,17 +189,8 @@ class NavigationMenuListState {
|
|
|
186
189
|
constructor(opts, context) {
|
|
187
190
|
this.opts = opts;
|
|
188
191
|
this.context = context;
|
|
189
|
-
useRefById(opts);
|
|
190
|
-
useRefById({
|
|
191
|
-
id: this.wrapperId,
|
|
192
|
-
ref: this.wrapperRef,
|
|
193
|
-
onRefChange: (node) => {
|
|
194
|
-
this.context.indicatorTrackRef.current = node;
|
|
195
|
-
},
|
|
196
|
-
deps: () => this.wrapperMounted,
|
|
197
|
-
});
|
|
198
192
|
this.rovingFocusGroup = useRovingFocus({
|
|
199
|
-
|
|
193
|
+
rootNode: opts.ref,
|
|
200
194
|
candidateSelector: `[${NAVIGATION_MENU_TRIGGER_ATTR}]:not([data-disabled]), [${NAVIGATION_MENU_LINK_ATTR}]:not([data-disabled])`,
|
|
201
195
|
loop: box.with(() => false),
|
|
202
196
|
orientation: this.context.opts.orientation,
|
|
@@ -211,11 +205,13 @@ class NavigationMenuListState {
|
|
|
211
205
|
}
|
|
212
206
|
wrapperProps = $derived.by(() => ({
|
|
213
207
|
id: this.wrapperId.current,
|
|
208
|
+
...attachRef(this.wrapperRef, (v) => (this.context.indicatorTrackRef.current = v)),
|
|
214
209
|
}));
|
|
215
210
|
props = $derived.by(() => ({
|
|
216
211
|
id: this.opts.id.current,
|
|
217
212
|
"data-orientation": getDataOrientation(this.context.opts.orientation.current),
|
|
218
213
|
[NAVIGATION_MENU_LIST_ATTR]: "",
|
|
214
|
+
...attachRef(this.opts.ref),
|
|
219
215
|
}));
|
|
220
216
|
}
|
|
221
217
|
export class NavigationMenuItemState {
|
|
@@ -231,9 +227,11 @@ export class NavigationMenuItemState {
|
|
|
231
227
|
contentChildren = box(undefined);
|
|
232
228
|
contentChild = box(undefined);
|
|
233
229
|
contentProps = box({});
|
|
230
|
+
domContext;
|
|
234
231
|
constructor(opts, listContext) {
|
|
235
232
|
this.opts = opts;
|
|
236
233
|
this.listContext = listContext;
|
|
234
|
+
this.domContext = new DOMContext(opts.ref);
|
|
237
235
|
}
|
|
238
236
|
#handleContentEntry = (side = "start") => {
|
|
239
237
|
if (!this.contentNode)
|
|
@@ -241,7 +239,7 @@ export class NavigationMenuItemState {
|
|
|
241
239
|
this.restoreContentTabOrder();
|
|
242
240
|
const candidates = getTabbableCandidates(this.contentNode);
|
|
243
241
|
if (candidates.length)
|
|
244
|
-
focusFirst(side === "start" ? candidates : candidates.reverse());
|
|
242
|
+
focusFirst(side === "start" ? candidates : candidates.reverse(), () => this.domContext.getActiveElement());
|
|
245
243
|
};
|
|
246
244
|
#handleContentExit = () => {
|
|
247
245
|
if (!this.contentNode)
|
|
@@ -272,24 +270,13 @@ class NavigationMenuTriggerState {
|
|
|
272
270
|
focusProxyMounted = $state(false);
|
|
273
271
|
constructor(opts, context) {
|
|
274
272
|
this.opts = opts;
|
|
275
|
-
this.hasPointerMoveOpened = boxAutoReset(false,
|
|
273
|
+
this.hasPointerMoveOpened = boxAutoReset(false, {
|
|
274
|
+
afterMs: 300,
|
|
275
|
+
getWindow: () => getWindow(opts.ref.current),
|
|
276
|
+
});
|
|
276
277
|
this.context = context.provider;
|
|
277
278
|
this.itemContext = context.item;
|
|
278
279
|
this.listContext = context.list;
|
|
279
|
-
useRefById({
|
|
280
|
-
...opts,
|
|
281
|
-
onRefChange: (node) => {
|
|
282
|
-
this.itemContext.triggerNode = node;
|
|
283
|
-
},
|
|
284
|
-
});
|
|
285
|
-
useRefById({
|
|
286
|
-
id: this.focusProxyId,
|
|
287
|
-
ref: this.focusProxyRef,
|
|
288
|
-
onRefChange: (node) => {
|
|
289
|
-
this.itemContext.focusProxyNode = node;
|
|
290
|
-
},
|
|
291
|
-
deps: () => this.focusProxyMounted,
|
|
292
|
-
});
|
|
293
280
|
watch(() => this.opts.ref.current, () => {
|
|
294
281
|
const node = this.opts.ref.current;
|
|
295
282
|
if (!node)
|
|
@@ -366,11 +353,13 @@ class NavigationMenuTriggerState {
|
|
|
366
353
|
onpointerenter: this.onpointerenter,
|
|
367
354
|
onclick: this.onclick,
|
|
368
355
|
onkeydown: this.onkeydown,
|
|
356
|
+
...attachRef(this.opts.ref, (v) => (this.itemContext.triggerNode = v)),
|
|
369
357
|
}));
|
|
370
358
|
focusProxyProps = $derived.by(() => ({
|
|
371
359
|
id: this.focusProxyId.current,
|
|
372
360
|
tabindex: 0,
|
|
373
361
|
onfocus: this.focusProxyOnFocus,
|
|
362
|
+
...attachRef(this.focusProxyRef, (v) => (this.itemContext.focusProxyNode = v)),
|
|
374
363
|
}));
|
|
375
364
|
restructureSpanProps = $derived.by(() => ({
|
|
376
365
|
"aria-owns": this.itemContext.contentId,
|
|
@@ -391,7 +380,6 @@ class NavigationMenuLinkState {
|
|
|
391
380
|
constructor(opts, context) {
|
|
392
381
|
this.opts = opts;
|
|
393
382
|
this.context = context;
|
|
394
|
-
useRefById(opts);
|
|
395
383
|
}
|
|
396
384
|
onclick = (e) => {
|
|
397
385
|
const currTarget = e.currentTarget;
|
|
@@ -441,6 +429,7 @@ class NavigationMenuLinkState {
|
|
|
441
429
|
onpointerenter: this.onpointerenter,
|
|
442
430
|
onpointermove: this.onpointermove,
|
|
443
431
|
[NAVIGATION_MENU_LINK_ATTR]: "",
|
|
432
|
+
...attachRef(this.opts.ref),
|
|
444
433
|
}));
|
|
445
434
|
}
|
|
446
435
|
class NavigationMenuIndicatorState {
|
|
@@ -469,10 +458,6 @@ class NavigationMenuIndicatorImplState {
|
|
|
469
458
|
this.listContext = context.list;
|
|
470
459
|
useResizeObserver(() => this.activeTrigger, this.handlePositionChange);
|
|
471
460
|
useResizeObserver(() => this.context.indicatorTrackRef.current, this.handlePositionChange);
|
|
472
|
-
useRefById({
|
|
473
|
-
...opts,
|
|
474
|
-
deps: () => this.context.opts.value.current,
|
|
475
|
-
});
|
|
476
461
|
}
|
|
477
462
|
handlePositionChange = () => {
|
|
478
463
|
if (!this.activeTrigger)
|
|
@@ -505,6 +490,7 @@ class NavigationMenuIndicatorImplState {
|
|
|
505
490
|
}),
|
|
506
491
|
},
|
|
507
492
|
[NAVIGATION_MENU_INDICATOR_ATTR]: "",
|
|
493
|
+
...attachRef(this.opts.ref),
|
|
508
494
|
}));
|
|
509
495
|
}
|
|
510
496
|
class NavigationMenuContentState {
|
|
@@ -530,13 +516,6 @@ class NavigationMenuContentState {
|
|
|
530
516
|
this.context = context.provider;
|
|
531
517
|
this.itemContext = context.item;
|
|
532
518
|
this.listContext = context.list;
|
|
533
|
-
useRefById({
|
|
534
|
-
...opts,
|
|
535
|
-
onRefChange: (node) => {
|
|
536
|
-
this.itemContext.contentNode = node;
|
|
537
|
-
},
|
|
538
|
-
deps: () => this.mounted,
|
|
539
|
-
});
|
|
540
519
|
}
|
|
541
520
|
onpointerenter = (_) => {
|
|
542
521
|
this.context.onContentEnter();
|
|
@@ -550,6 +529,7 @@ class NavigationMenuContentState {
|
|
|
550
529
|
id: this.opts.id.current,
|
|
551
530
|
onpointerenter: this.onpointerenter,
|
|
552
531
|
onpointerleave: this.onpointerleave,
|
|
532
|
+
...attachRef(this.opts.ref, (v) => (this.itemContext.contentNode = v)),
|
|
553
533
|
}));
|
|
554
534
|
}
|
|
555
535
|
class NavigationMenuContentImplState {
|
|
@@ -593,15 +573,13 @@ class NavigationMenuContentImplState {
|
|
|
593
573
|
untrack(() => (this.prevMotionAttribute = attribute));
|
|
594
574
|
return attribute;
|
|
595
575
|
});
|
|
576
|
+
domContext;
|
|
596
577
|
constructor(opts, itemContext) {
|
|
597
578
|
this.opts = opts;
|
|
598
579
|
this.itemContext = itemContext;
|
|
599
580
|
this.listContext = itemContext.listContext;
|
|
600
581
|
this.context = itemContext.listContext.context;
|
|
601
|
-
|
|
602
|
-
...opts,
|
|
603
|
-
deps: () => this.context.opts.value.current,
|
|
604
|
-
});
|
|
582
|
+
this.domContext = new DOMContext(opts.ref);
|
|
605
583
|
watch([
|
|
606
584
|
() => this.itemContext.opts.value.current,
|
|
607
585
|
() => this.itemContext.triggerNode,
|
|
@@ -613,7 +591,7 @@ class NavigationMenuContentImplState {
|
|
|
613
591
|
const handleClose = () => {
|
|
614
592
|
this.context.onItemDismiss();
|
|
615
593
|
this.itemContext.onRootContentClose();
|
|
616
|
-
if (content.contains(
|
|
594
|
+
if (content.contains(this.domContext.getActiveElement())) {
|
|
617
595
|
this.itemContext.triggerNode?.focus();
|
|
618
596
|
}
|
|
619
597
|
};
|
|
@@ -661,13 +639,13 @@ class NavigationMenuContentImplState {
|
|
|
661
639
|
const isTabKey = e.key === kbd.TAB && !isMetaKey;
|
|
662
640
|
const candidates = getTabbableCandidates(e.currentTarget);
|
|
663
641
|
if (isTabKey) {
|
|
664
|
-
const focusedElement =
|
|
642
|
+
const focusedElement = this.domContext.getActiveElement();
|
|
665
643
|
const index = candidates.findIndex((candidate) => candidate === focusedElement);
|
|
666
644
|
const isMovingBackwards = e.shiftKey;
|
|
667
645
|
const nextCandidates = isMovingBackwards
|
|
668
646
|
? candidates.slice(0, index).reverse()
|
|
669
647
|
: candidates.slice(index + 1, candidates.length);
|
|
670
|
-
if (focusFirst(nextCandidates)) {
|
|
648
|
+
if (focusFirst(nextCandidates, () => this.domContext.getActiveElement())) {
|
|
671
649
|
// prevent browser tab keydown because we've handled focus
|
|
672
650
|
e.preventDefault();
|
|
673
651
|
return;
|
|
@@ -680,7 +658,7 @@ class NavigationMenuContentImplState {
|
|
|
680
658
|
return;
|
|
681
659
|
}
|
|
682
660
|
}
|
|
683
|
-
let activeEl =
|
|
661
|
+
let activeEl = this.domContext.getActiveElement();
|
|
684
662
|
if (this.itemContext.contentNode) {
|
|
685
663
|
const focusedNode = this.itemContext.contentNode.querySelector("[data-focused]");
|
|
686
664
|
if (focusedNode) {
|
|
@@ -711,6 +689,7 @@ class NavigationMenuContentImplState {
|
|
|
711
689
|
"data-state": getDataOpenClosed(this.context.opts.value.current === this.itemContext.opts.value.current),
|
|
712
690
|
onkeydown: this.onkeydown,
|
|
713
691
|
[NAVIGATION_MENU_CONTENT_ATTR]: "",
|
|
692
|
+
...attachRef(this.opts.ref),
|
|
714
693
|
}));
|
|
715
694
|
}
|
|
716
695
|
class NavigationMenuViewportState {
|
|
@@ -726,13 +705,6 @@ class NavigationMenuViewportState {
|
|
|
726
705
|
constructor(opts, context) {
|
|
727
706
|
this.opts = opts;
|
|
728
707
|
this.context = context;
|
|
729
|
-
useRefById({
|
|
730
|
-
...opts,
|
|
731
|
-
onRefChange: (node) => {
|
|
732
|
-
this.context.viewportRef.current = node;
|
|
733
|
-
},
|
|
734
|
-
deps: () => this.open,
|
|
735
|
-
});
|
|
736
708
|
watch([() => this.activeContentValue, () => this.open], () => {
|
|
737
709
|
afterTick(() => {
|
|
738
710
|
const currNode = this.context.viewportRef.current;
|
|
@@ -776,6 +748,7 @@ class NavigationMenuViewportState {
|
|
|
776
748
|
[NAVIGATION_MENU_VIEWPORT_ATTR]: "",
|
|
777
749
|
onpointerenter: this.context.onContentEnter,
|
|
778
750
|
onpointerleave: this.context.onContentLeave,
|
|
751
|
+
...attachRef(this.opts.ref, (v) => (this.context.viewportRef.current = v)),
|
|
779
752
|
}));
|
|
780
753
|
}
|
|
781
754
|
const NavigationMenuProviderContext = new Context("NavigationMenu.Root");
|
|
@@ -835,14 +808,14 @@ export function useNavigationMenuIndicator() {
|
|
|
835
808
|
return new NavigationMenuIndicatorState(NavigationMenuProviderContext.get());
|
|
836
809
|
}
|
|
837
810
|
//
|
|
838
|
-
function focusFirst(candidates) {
|
|
839
|
-
const previouslyFocusedElement =
|
|
811
|
+
function focusFirst(candidates, getActiveElement) {
|
|
812
|
+
const previouslyFocusedElement = getActiveElement();
|
|
840
813
|
return candidates.some((candidate) => {
|
|
841
814
|
// if focus is already where we want to go, we don't want to keep going through the candidates
|
|
842
815
|
if (candidate === previouslyFocusedElement)
|
|
843
816
|
return true;
|
|
844
817
|
candidate.focus();
|
|
845
|
-
return
|
|
818
|
+
return getActiveElement() !== previouslyFocusedElement;
|
|
846
819
|
});
|
|
847
820
|
}
|
|
848
821
|
function removeFromTabOrder(candidates) {
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PaginationNextButtonProps } from "../types.js";
|
|
4
4
|
import { usePaginationButton } from "../pagination.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
|
+
|
|
7
|
+
const uid = $props.id();
|
|
6
8
|
|
|
7
9
|
let {
|
|
8
|
-
id =
|
|
10
|
+
id = createId(uid),
|
|
9
11
|
child,
|
|
10
12
|
children,
|
|
11
13
|
ref = $bindable(null),
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PaginationPageProps } from "../types.js";
|
|
4
4
|
import { usePaginationPage } from "../pagination.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
|
+
|
|
7
|
+
const uid = $props.id();
|
|
6
8
|
|
|
7
9
|
let {
|
|
8
|
-
id =
|
|
10
|
+
id = createId(uid),
|
|
9
11
|
page,
|
|
10
12
|
child,
|
|
11
13
|
children,
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PaginationPrevButtonProps } from "../types.js";
|
|
4
4
|
import { usePaginationButton } from "../pagination.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
|
+
|
|
7
|
+
const uid = $props.id();
|
|
6
8
|
|
|
7
9
|
let {
|
|
8
|
-
id =
|
|
10
|
+
id = createId(uid),
|
|
9
11
|
child,
|
|
10
12
|
children,
|
|
11
13
|
ref = $bindable(null),
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PaginationRootProps } from "../types.js";
|
|
4
4
|
import { usePaginationRoot } from "../pagination.svelte.js";
|
|
5
|
-
import { useId } from "../../../internal/use-id.js";
|
|
6
5
|
import { noop } from "../../../internal/noop.js";
|
|
6
|
+
import { createId } from "../../../internal/create-id.js";
|
|
7
|
+
|
|
8
|
+
const uid = $props.id();
|
|
7
9
|
|
|
8
10
|
let {
|
|
9
|
-
id =
|
|
11
|
+
id = createId(uid),
|
|
10
12
|
count,
|
|
11
13
|
perPage = 1,
|
|
12
14
|
page = $bindable(1),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { attachRef } from "svelte-toolbelt";
|
|
2
2
|
import { Context } from "runed";
|
|
3
3
|
import { getDataOrientation } from "../../internal/attrs.js";
|
|
4
4
|
import { getElemDirection } from "../../internal/locale.js";
|
|
@@ -28,7 +28,6 @@ class PaginationRootState {
|
|
|
28
28
|
}));
|
|
29
29
|
constructor(opts) {
|
|
30
30
|
this.opts = opts;
|
|
31
|
-
useRefById(opts);
|
|
32
31
|
}
|
|
33
32
|
setPage(page) {
|
|
34
33
|
this.opts.page.current = page;
|
|
@@ -62,6 +61,7 @@ class PaginationRootState {
|
|
|
62
61
|
id: this.opts.id.current,
|
|
63
62
|
"data-orientation": getDataOrientation(this.opts.orientation.current),
|
|
64
63
|
[PAGINATION_ROOT_ATTR]: "",
|
|
64
|
+
...attachRef(this.opts.ref),
|
|
65
65
|
}));
|
|
66
66
|
}
|
|
67
67
|
class PaginationPageState {
|
|
@@ -71,7 +71,6 @@ class PaginationPageState {
|
|
|
71
71
|
constructor(opts, root) {
|
|
72
72
|
this.opts = opts;
|
|
73
73
|
this.root = root;
|
|
74
|
-
useRefById(opts);
|
|
75
74
|
this.onclick = this.onclick.bind(this);
|
|
76
75
|
this.onkeydown = this.onkeydown.bind(this);
|
|
77
76
|
}
|
|
@@ -100,6 +99,7 @@ class PaginationPageState {
|
|
|
100
99
|
//
|
|
101
100
|
onclick: this.onclick,
|
|
102
101
|
onkeydown: this.onkeydown,
|
|
102
|
+
...attachRef(this.opts.ref),
|
|
103
103
|
}));
|
|
104
104
|
}
|
|
105
105
|
class PaginationButtonState {
|
|
@@ -108,7 +108,6 @@ class PaginationButtonState {
|
|
|
108
108
|
constructor(opts, root) {
|
|
109
109
|
this.opts = opts;
|
|
110
110
|
this.root = root;
|
|
111
|
-
useRefById(opts);
|
|
112
111
|
this.onclick = this.onclick.bind(this);
|
|
113
112
|
this.onkeydown = this.onkeydown.bind(this);
|
|
114
113
|
}
|
|
@@ -148,6 +147,7 @@ class PaginationButtonState {
|
|
|
148
147
|
//
|
|
149
148
|
onclick: this.onclick,
|
|
150
149
|
onkeydown: this.onkeydown,
|
|
150
|
+
...attachRef(this.opts.ref),
|
|
151
151
|
}));
|
|
152
152
|
}
|
|
153
153
|
//
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PinInputCellProps } from "../types.js";
|
|
4
4
|
import { usePinInputCell } from "../pin-input.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
|
+
|
|
7
|
+
const uid = $props.id();
|
|
6
8
|
|
|
7
9
|
let {
|
|
8
|
-
id =
|
|
10
|
+
id = createId(uid),
|
|
9
11
|
ref = $bindable(null),
|
|
10
12
|
cell,
|
|
11
13
|
child,
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
import { box, mergeProps } from "svelte-toolbelt";
|
|
3
3
|
import type { PinInputRootProps } from "../types.js";
|
|
4
4
|
import { usePinInput } from "../pin-input.svelte.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createId } from "../../../internal/create-id.js";
|
|
6
6
|
import { noop } from "../../../internal/noop.js";
|
|
7
7
|
|
|
8
|
+
const uid = $props.id();
|
|
9
|
+
|
|
8
10
|
let {
|
|
9
|
-
id =
|
|
10
|
-
inputId =
|
|
11
|
+
id = createId(uid),
|
|
12
|
+
inputId = `${createId(uid)}-input`,
|
|
11
13
|
ref = $bindable(null),
|
|
12
14
|
maxlength = 6,
|
|
13
15
|
textalign = "left",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DOMContext } from "svelte-toolbelt";
|
|
1
2
|
import type { PinInputCell, PinInputRootProps as RootComponentProps } from "./types.js";
|
|
2
3
|
import type { ReadableBoxedValues, WritableBoxedValues } from "../../internal/box.svelte.js";
|
|
3
4
|
import type { BitsEvent, BitsFocusEvent, BitsKeyboardEvent, BitsMouseEvent, WithRefProps } from "../../internal/types.js";
|
|
@@ -21,6 +22,7 @@ type PinInputRootStateProps = WithRefProps<WritableBoxedValues<{
|
|
|
21
22
|
declare class PinInputRootState {
|
|
22
23
|
#private;
|
|
23
24
|
readonly opts: PinInputRootStateProps;
|
|
25
|
+
domContext: DOMContext;
|
|
24
26
|
constructor(opts: PinInputRootStateProps);
|
|
25
27
|
onkeydown: (e: BitsKeyboardEvent) => void;
|
|
26
28
|
rootProps: {
|
|
@@ -75,7 +77,7 @@ declare class PinInputRootState {
|
|
|
75
77
|
"data-pin-input-input": string;
|
|
76
78
|
"data-pin-input-input-mss": number | null;
|
|
77
79
|
"data-pin-input-input-mse": number | null;
|
|
78
|
-
inputmode: "none" | "
|
|
80
|
+
inputmode: "none" | "email" | "tel" | "url" | "text" | "numeric" | "decimal" | "search" | null | undefined;
|
|
79
81
|
pattern: any;
|
|
80
82
|
maxlength: number;
|
|
81
83
|
value: string;
|
|
@@ -111,7 +113,7 @@ declare class PinInputCellState {
|
|
|
111
113
|
readonly "data-inactive": "" | undefined;
|
|
112
114
|
};
|
|
113
115
|
}
|
|
114
|
-
export declare function syncTimeouts(cb: (...args: any[]) => unknown): number[];
|
|
116
|
+
export declare function syncTimeouts(cb: (...args: any[]) => unknown, domContext: DOMContext): number[];
|
|
115
117
|
export declare function usePinInput(props: PinInputRootStateProps): PinInputRootState;
|
|
116
118
|
export declare function usePinInputCell(props: PinInputCellStateProps): PinInputCellState;
|
|
117
119
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Previous, watch } from "runed";
|
|
2
2
|
import { onMount } from "svelte";
|
|
3
|
-
import { box,
|
|
3
|
+
import { box, attachRef, DOMContext } from "svelte-toolbelt";
|
|
4
4
|
import { usePasswordManagerBadge } from "./usePasswordManager.svelte.js";
|
|
5
5
|
import { getDisabled } from "../../internal/attrs.js";
|
|
6
6
|
import { on } from "svelte/events";
|
|
@@ -47,8 +47,10 @@ class PinInputRootState {
|
|
|
47
47
|
});
|
|
48
48
|
#pwmb;
|
|
49
49
|
#initialLoad;
|
|
50
|
+
domContext;
|
|
50
51
|
constructor(opts) {
|
|
51
52
|
this.opts = opts;
|
|
53
|
+
this.domContext = new DOMContext(opts.ref);
|
|
52
54
|
this.#initialLoad = {
|
|
53
55
|
value: this.opts.value,
|
|
54
56
|
isIOS: typeof window !== "undefined" &&
|
|
@@ -59,11 +61,7 @@ class PinInputRootState {
|
|
|
59
61
|
inputRef: this.#inputRef,
|
|
60
62
|
isFocused: this.#isFocused,
|
|
61
63
|
pushPasswordManagerStrategy: this.opts.pushPasswordManagerStrategy,
|
|
62
|
-
|
|
63
|
-
useRefById(opts);
|
|
64
|
-
useRefById({
|
|
65
|
-
id: this.opts.inputId,
|
|
66
|
-
ref: this.#inputRef,
|
|
64
|
+
domContext: this.domContext,
|
|
67
65
|
});
|
|
68
66
|
onMount(() => {
|
|
69
67
|
const input = this.#inputRef.current;
|
|
@@ -78,14 +76,14 @@ class PinInputRootState {
|
|
|
78
76
|
input.selectionEnd,
|
|
79
77
|
input.selectionDirection ?? "none",
|
|
80
78
|
];
|
|
81
|
-
const unsub = on(
|
|
79
|
+
const unsub = on(this.domContext.getDocument(), "selectionchange", this.#onDocumentSelectionChange, {
|
|
82
80
|
capture: true,
|
|
83
81
|
});
|
|
84
82
|
this.#onDocumentSelectionChange();
|
|
85
|
-
if (
|
|
83
|
+
if (this.domContext.getActiveElement() === input) {
|
|
86
84
|
this.#isFocused.current = true;
|
|
87
85
|
}
|
|
88
|
-
if (!
|
|
86
|
+
if (!this.domContext.getElementById("pin-input-style")) {
|
|
89
87
|
this.#applyStyles();
|
|
90
88
|
}
|
|
91
89
|
const updateRootHeight = () => {
|
|
@@ -117,7 +115,7 @@ class PinInputRootState {
|
|
|
117
115
|
this.#mirrorSelectionEnd = end;
|
|
118
116
|
this.#prevInputMetadata.prev = [start, end, dir];
|
|
119
117
|
}
|
|
120
|
-
});
|
|
118
|
+
}, this.domContext);
|
|
121
119
|
});
|
|
122
120
|
$effect(() => {
|
|
123
121
|
// invoke `onComplete` when the input is completely filled.
|
|
@@ -155,6 +153,7 @@ class PinInputRootState {
|
|
|
155
153
|
id: this.opts.id.current,
|
|
156
154
|
[ROOT_ATTR]: "",
|
|
157
155
|
style: this.#rootStyles,
|
|
156
|
+
...attachRef(this.opts.ref),
|
|
158
157
|
}));
|
|
159
158
|
inputWrapperProps = $derived.by(() => ({
|
|
160
159
|
style: {
|
|
@@ -190,9 +189,10 @@ class PinInputRootState {
|
|
|
190
189
|
fontVariantNumeric: "tabular-nums",
|
|
191
190
|
}));
|
|
192
191
|
#applyStyles() {
|
|
193
|
-
const
|
|
192
|
+
const doc = this.domContext.getDocument();
|
|
193
|
+
const styleEl = doc.createElement("style");
|
|
194
194
|
styleEl.id = "pin-input-style";
|
|
195
|
-
|
|
195
|
+
doc.head.appendChild(styleEl);
|
|
196
196
|
if (styleEl.sheet) {
|
|
197
197
|
const autoFillStyles = "background: transparent !important; color: transparent !important; border-color: transparent !important; opacity: 0 !important; box-shadow: none !important; -webkit-box-shadow: none !important; -webkit-text-fill-color: transparent !important;";
|
|
198
198
|
safeInsertRule(styleEl.sheet, "[data-pin-input-input]::selection { background: transparent !important; color: transparent !important; }");
|
|
@@ -209,7 +209,7 @@ class PinInputRootState {
|
|
|
209
209
|
const container = this.opts.ref.current;
|
|
210
210
|
if (!input || !container)
|
|
211
211
|
return;
|
|
212
|
-
if (
|
|
212
|
+
if (this.domContext.getActiveElement() !== input) {
|
|
213
213
|
this.#mirrorSelectionStart = null;
|
|
214
214
|
this.#mirrorSelectionEnd = null;
|
|
215
215
|
return;
|
|
@@ -276,7 +276,7 @@ class PinInputRootState {
|
|
|
276
276
|
// selectionchange event, we'll have to dispatch it manually.
|
|
277
277
|
// NOTE: The following line also triggers when cmd+A then pasting
|
|
278
278
|
// a value with smaller length, which is not ideal for performance.
|
|
279
|
-
|
|
279
|
+
this.domContext.getDocument().dispatchEvent(new Event("selectionchange"));
|
|
280
280
|
}
|
|
281
281
|
this.opts.value.current = newValue;
|
|
282
282
|
};
|
|
@@ -365,6 +365,7 @@ class PinInputRootState {
|
|
|
365
365
|
onmouseleave: this.onmouseleave,
|
|
366
366
|
onfocus: this.onfocus,
|
|
367
367
|
onblur: this.onblur,
|
|
368
|
+
...attachRef(this.#inputRef),
|
|
368
369
|
}));
|
|
369
370
|
#cells = $derived.by(() => Array.from({ length: this.opts.maxLength.current }).map((_, idx) => {
|
|
370
371
|
const isActive = this.#isFocused.current &&
|
|
@@ -390,23 +391,20 @@ class PinInputCellState {
|
|
|
390
391
|
opts;
|
|
391
392
|
constructor(opts) {
|
|
392
393
|
this.opts = opts;
|
|
393
|
-
useRefById({
|
|
394
|
-
id: this.opts.id,
|
|
395
|
-
ref: this.opts.ref,
|
|
396
|
-
});
|
|
397
394
|
}
|
|
398
395
|
props = $derived.by(() => ({
|
|
399
396
|
id: this.opts.id.current,
|
|
400
397
|
[CELL_ATTR]: "",
|
|
401
398
|
"data-active": this.opts.cell.current.isActive ? "" : undefined,
|
|
402
399
|
"data-inactive": !this.opts.cell.current.isActive ? "" : undefined,
|
|
400
|
+
...attachRef(this.opts.ref),
|
|
403
401
|
}));
|
|
404
402
|
}
|
|
405
403
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
406
|
-
export function syncTimeouts(cb) {
|
|
407
|
-
const t1 = setTimeout(cb, 0); // For faster machines
|
|
408
|
-
const t2 = setTimeout(cb, 1_0);
|
|
409
|
-
const t3 = setTimeout(cb, 5_0);
|
|
404
|
+
export function syncTimeouts(cb, domContext) {
|
|
405
|
+
const t1 = domContext.setTimeout(cb, 0); // For faster machines
|
|
406
|
+
const t2 = domContext.setTimeout(cb, 1_0);
|
|
407
|
+
const t3 = domContext.setTimeout(cb, 5_0);
|
|
410
408
|
return [t1, t2, t3];
|
|
411
409
|
}
|
|
412
410
|
function safeInsertRule(sheet, rule) {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DOMContext, type ReadableBox, type WritableBox } from "svelte-toolbelt";
|
|
2
2
|
import type { PinInputRootPropsWithoutHTML } from "./types.js";
|
|
3
3
|
type UsePasswordManagerBadgeProps = {
|
|
4
4
|
containerRef: WritableBox<HTMLElement | null>;
|
|
5
5
|
inputRef: WritableBox<HTMLInputElement | null>;
|
|
6
6
|
pushPasswordManagerStrategy: ReadableBox<PinInputRootPropsWithoutHTML["pushPasswordManagerStrategy"]>;
|
|
7
7
|
isFocused: ReadableBox<boolean>;
|
|
8
|
+
domContext: DOMContext;
|
|
8
9
|
};
|
|
9
|
-
export declare function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, }: UsePasswordManagerBadgeProps): {
|
|
10
|
+
export declare function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, domContext, }: UsePasswordManagerBadgeProps): {
|
|
10
11
|
readonly hasPwmBadge: boolean;
|
|
11
12
|
readonly willPushPwmBadge: boolean;
|
|
12
13
|
PWM_BADGE_SPACE_WIDTH: "40px";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getWindow } from "svelte-toolbelt";
|
|
1
2
|
const PWM_BADGE_MARGIN_RIGHT = 18;
|
|
2
3
|
const PWM_BADGE_SPACE_WIDTH_PX = 40;
|
|
3
4
|
const PWM_BADGE_SPACE_WIDTH = `${PWM_BADGE_SPACE_WIDTH_PX}px`;
|
|
@@ -7,7 +8,7 @@ const PASSWORD_MANAGER_SELECTORS = [
|
|
|
7
8
|
"[data-dashlanecreated]", // Dashlane,
|
|
8
9
|
'[style$="2147483647 !important;"]', // Bitwarden
|
|
9
10
|
].join(",");
|
|
10
|
-
export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, }) {
|
|
11
|
+
export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, domContext, }) {
|
|
11
12
|
let hasPwmBadge = $state(false);
|
|
12
13
|
let hasPwmBadgeSpace = $state(false);
|
|
13
14
|
let done = $state(false);
|
|
@@ -31,11 +32,11 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
|
|
|
31
32
|
const x = rightCornerX - PWM_BADGE_MARGIN_RIGHT;
|
|
32
33
|
const y = centeredY;
|
|
33
34
|
// do an extra search to check for all the password manager badges
|
|
34
|
-
const passwordManagerStrategy =
|
|
35
|
+
const passwordManagerStrategy = domContext.querySelectorAll(PASSWORD_MANAGER_SELECTORS);
|
|
35
36
|
// if no password manager is detected, dispatch document.elementFromPoint to
|
|
36
37
|
// identify the badges
|
|
37
38
|
if (passwordManagerStrategy.length === 0) {
|
|
38
|
-
const maybeBadgeEl =
|
|
39
|
+
const maybeBadgeEl = domContext.getDocument().elementFromPoint(x, y);
|
|
39
40
|
// if the found element is the container,
|
|
40
41
|
// then it is not a badge, most times there is no badge in this case
|
|
41
42
|
if (maybeBadgeEl === container)
|
|
@@ -50,7 +51,7 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
|
|
|
50
51
|
return;
|
|
51
52
|
// check if the pwm area is fully visible
|
|
52
53
|
function checkHasSpace() {
|
|
53
|
-
const viewportWidth =
|
|
54
|
+
const viewportWidth = getWindow(container).innerWidth;
|
|
54
55
|
const distanceToRightEdge = viewportWidth - container.getBoundingClientRect().right;
|
|
55
56
|
hasPwmBadgeSpace = distanceToRightEdge >= PWM_BADGE_SPACE_WIDTH_PX;
|
|
56
57
|
}
|
|
@@ -61,7 +62,7 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
|
|
|
61
62
|
};
|
|
62
63
|
});
|
|
63
64
|
$effect(() => {
|
|
64
|
-
const focused = isFocused.current ||
|
|
65
|
+
const focused = isFocused.current || domContext.getActiveElement() === inputRef.current;
|
|
65
66
|
if (pushPasswordManagerStrategy.current === "none" || !focused)
|
|
66
67
|
return;
|
|
67
68
|
const t1 = setTimeout(trackPwmBadge, 0);
|