@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.11
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/FOCUS_STATE_CONTRACT.md +63 -0
- package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
- package/dist/button/README.md +48 -0
- package/dist/button/TODO.md +13 -0
- package/dist/button/index.d.ts +5 -0
- package/dist/button/index.js +4 -0
- package/dist/button/index.parts.d.ts +1 -0
- package/dist/button/index.parts.js +1 -0
- package/dist/button/root/README.md +43 -0
- package/dist/button/root/button-root.svelte +362 -0
- package/dist/button/root/button-root.svelte.d.ts +21 -0
- package/dist/button/root/button-test.svelte +76 -0
- package/dist/button/root/button-test.svelte.d.ts +11 -0
- package/dist/calendar/README.md +66 -0
- package/dist/calendar/TODO.md +23 -0
- package/dist/calendar/body-cell/README.md +15 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
- package/dist/calendar/grid/README.md +13 -0
- package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
- package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
- package/dist/calendar/grid/calendar-grid.svelte +45 -0
- package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
- package/dist/calendar/grid/month-scope.d.ts +2 -0
- package/dist/calendar/grid/month-scope.js +8 -0
- package/dist/calendar/grid-body/README.md +13 -0
- package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
- package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
- package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
- package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
- package/dist/calendar/grid-header/README.md +13 -0
- package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
- package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
- package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
- package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
- package/dist/calendar/header-cell/README.md +14 -0
- package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
- package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
- package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
- package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
- package/dist/calendar/heading/README.md +13 -0
- package/dist/calendar/heading/calendar-heading.svelte +17 -0
- package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
- package/dist/calendar/index.d.ts +13 -0
- package/dist/calendar/index.js +13 -0
- package/dist/calendar/index.parts.d.ts +9 -0
- package/dist/calendar/index.parts.js +9 -0
- package/dist/calendar/root/README.md +24 -0
- package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
- package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
- package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
- package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
- package/dist/calendar/root/calendar-root-test.svelte +71 -0
- package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
- package/dist/calendar/root/calendar-root.svelte +143 -0
- package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
- package/dist/calendar/root/context.d.ts +66 -0
- package/dist/calendar/root/context.js +727 -0
- package/dist/calendar/root/date-utils.d.ts +17 -0
- package/dist/calendar/root/date-utils.js +94 -0
- package/dist/calendar/trigger-next/README.md +14 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte +43 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +9 -0
- package/dist/calendar/trigger-previous/README.md +14 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +43 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +9 -0
- package/dist/checkbox/README.md +53 -0
- package/dist/checkbox/TODO.md +16 -0
- package/dist/checkbox/index.d.ts +6 -0
- package/dist/checkbox/index.js +6 -0
- package/dist/checkbox/index.parts.d.ts +2 -0
- package/dist/checkbox/index.parts.js +2 -0
- package/dist/checkbox/indicator/README.md +23 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
- package/dist/checkbox/root/README.md +47 -0
- package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
- package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/checkbox-root.svelte +361 -0
- package/dist/checkbox/root/checkbox-root.svelte.d.ts +23 -0
- package/dist/checkbox/root/checkbox-test.svelte +59 -0
- package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/context.d.ts +21 -0
- package/dist/checkbox/root/context.js +15 -0
- package/dist/clock/README.md +75 -0
- package/dist/clock/axis/README.md +24 -0
- package/dist/clock/axis/clock-axis.svelte +37 -0
- package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
- package/dist/clock/index.d.ts +10 -0
- package/dist/clock/index.js +10 -0
- package/dist/clock/index.parts.d.ts +4 -0
- package/dist/clock/index.parts.js +4 -0
- package/dist/clock/root/README.md +38 -0
- package/dist/clock/root/clock-root-test.svelte +62 -0
- package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
- package/dist/clock/root/clock-root.svelte +329 -0
- package/dist/clock/root/clock-root.svelte.d.ts +25 -0
- package/dist/clock/root/context.d.ts +22 -0
- package/dist/clock/root/context.js +15 -0
- package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
- package/dist/clock/root/resolve-visible-columns.js +16 -0
- package/dist/clock/root/time-utils.d.ts +48 -0
- package/dist/clock/root/time-utils.js +314 -0
- package/dist/clock/root/wheel-options.d.ts +17 -0
- package/dist/clock/root/wheel-options.js +63 -0
- package/dist/clock/wheel-column/README.md +25 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
- package/dist/clock/wheel-item/README.md +17 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
- package/dist/combobox/README.md +46 -0
- package/dist/combobox/TODO.md +28 -175
- package/dist/combobox/button/README.md +20 -0
- package/dist/combobox/button/combobox-button-test.svelte +27 -0
- package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
- package/dist/combobox/button/combobox-button.svelte +10 -11
- package/dist/combobox/clear/README.md +21 -0
- package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
- package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
- package/dist/combobox/clear/combobox-clear.svelte +61 -0
- package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
- package/dist/combobox/index.d.ts +5 -3
- package/dist/combobox/index.js +5 -3
- package/dist/combobox/index.parts.d.ts +2 -0
- package/dist/combobox/index.parts.js +2 -0
- package/dist/combobox/input/README.md +16 -0
- package/dist/combobox/input/combobox-input.svelte +43 -12
- package/dist/combobox/item/README.md +27 -0
- package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
- package/dist/combobox/item/combobox-listboxitem.svelte +3 -9
- package/dist/combobox/item-indicator/README.md +15 -0
- package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
- package/dist/combobox/list/README.md +27 -0
- package/dist/combobox/list/combobox-listbox.svelte.d.ts +1 -1
- package/dist/combobox/popover/README.md +27 -0
- package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
- package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
- package/dist/combobox/popover/combobox-popover.svelte +166 -23
- package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
- package/dist/combobox/root/README.md +45 -0
- package/dist/combobox/root/combobox-multiselect-test.svelte +1 -1
- package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
- package/dist/combobox/root/combobox-test.svelte +16 -3
- package/dist/combobox/root/combobox-test.svelte.d.ts +1 -0
- package/dist/combobox/root/combobox.svelte +100 -4
- package/dist/combobox/root/combobox.svelte.d.ts +1 -0
- package/dist/combobox/root/context.d.ts +19 -1
- package/dist/combobox/tag/README.md +37 -0
- package/dist/combobox/tag-remove/README.md +14 -0
- package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
- package/dist/combobox/tags/README.md +23 -0
- package/dist/combobox/trigger/README.md +21 -0
- package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
- package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
- package/dist/datepicker/README.md +100 -0
- package/dist/datepicker/TODO.md +28 -0
- package/dist/datepicker/calendar/README.md +19 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
- package/dist/datepicker/index.d.ts +18 -0
- package/dist/datepicker/index.js +18 -0
- package/dist/datepicker/index.parts.d.ts +14 -0
- package/dist/datepicker/index.parts.js +14 -0
- package/dist/datepicker/input/README.md +15 -0
- package/dist/datepicker/input/date-picker-input.svelte +108 -0
- package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
- package/dist/datepicker/internal/strict-props.d.ts +2 -0
- package/dist/datepicker/internal/strict-props.js +28 -0
- package/dist/datepicker/popover/README.md +20 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
- package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
- package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
- package/dist/datepicker/root/README.md +38 -0
- package/dist/datepicker/root/context.d.ts +43 -0
- package/dist/datepicker/root/context.js +15 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
- package/dist/datepicker/root/date-picker-root.svelte +495 -0
- package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
- package/dist/datepicker/root/date-picker-test.svelte +86 -0
- package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
- package/dist/datepicker/root/date-utils.d.ts +17 -0
- package/dist/datepicker/root/date-utils.js +138 -0
- package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
- package/dist/datepicker/root/draft-evaluation.js +56 -0
- package/dist/datepicker/root/focus-controller.d.ts +3 -0
- package/dist/datepicker/root/focus-controller.js +15 -0
- package/dist/datepicker/root/open-change.d.ts +5 -0
- package/dist/datepicker/root/open-change.js +13 -0
- package/dist/datepicker/root/open-controller.d.ts +7 -0
- package/dist/datepicker/root/open-controller.js +15 -0
- package/dist/datepicker/root/segment-controller.d.ts +8 -0
- package/dist/datepicker/root/segment-controller.js +53 -0
- package/dist/datepicker/root/segment-state.d.ts +18 -0
- package/dist/datepicker/root/segment-state.js +134 -0
- package/dist/datepicker/root/value-commit.d.ts +4 -0
- package/dist/datepicker/root/value-commit.js +8 -0
- package/dist/datepicker/segment/README.md +14 -0
- package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
- package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
- package/dist/datepicker/trigger/README.md +14 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
- package/dist/dialog/README.md +35 -0
- package/dist/dialog/content/README.md +16 -0
- package/dist/dialog/content/dialog-content.svelte +6 -6
- package/dist/dialog/index.d.ts +3 -3
- package/dist/dialog/index.js +2 -2
- package/dist/dialog/overlay/README.md +13 -0
- package/dist/dialog/portal/README.md +12 -0
- package/dist/dialog/root/README.md +53 -0
- package/dist/dialog/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/dialog/trigger/README.md +12 -0
- package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
- package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
- package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
- package/dist/index.d.ts +31 -13
- package/dist/index.js +31 -13
- package/dist/input/README.md +38 -0
- package/dist/input/TODO.md +12 -0
- package/dist/input/input-test.svelte +43 -0
- package/dist/input/input-test.svelte.d.ts +12 -0
- package/dist/input/input.svelte +151 -7
- package/dist/input/input.svelte.d.ts +8 -2
- package/dist/listbox/README.md +26 -0
- package/dist/listbox/index.d.ts +3 -3
- package/dist/listbox/index.js +3 -3
- package/dist/listbox/item/README.md +25 -0
- package/dist/listbox/item/listbox-item.svelte +158 -2
- package/dist/listbox/item/listbox-item.svelte.d.ts +4 -0
- package/dist/listbox/root/README.md +40 -0
- package/dist/listbox/root/listbox-test.svelte +14 -2
- package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
- package/dist/listbox/root/listbox.svelte +44 -0
- package/dist/listbox/root/listbox.svelte.d.ts +2 -2
- package/dist/locale-provider/context.d.ts +8 -0
- package/dist/locale-provider/context.js +18 -0
- package/dist/locale-provider/index.d.ts +4 -0
- package/dist/locale-provider/index.js +4 -0
- package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
- package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
- package/dist/locale-provider/locale-provider-test.svelte +20 -0
- package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
- package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
- package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
- package/dist/locale-provider/locale-provider.svelte +23 -0
- package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
- package/dist/popover/README.md +42 -0
- package/dist/popover/content/README.md +36 -0
- package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
- package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
- package/dist/popover/content/popover-content-test.svelte +32 -2
- package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
- package/dist/popover/content/popover-content.svelte +277 -24
- package/dist/popover/content/popover-content.svelte.d.ts +5 -1
- package/dist/popover/index.d.ts +3 -3
- package/dist/popover/index.js +3 -5
- package/dist/popover/root/README.md +25 -0
- package/dist/popover/root/context.d.ts +16 -7
- package/dist/popover/root/context.js +0 -2
- package/dist/popover/root/focus-state.d.ts +4 -0
- package/dist/popover/root/focus-state.js +33 -0
- package/dist/popover/root/popover-root.svelte +90 -17
- package/dist/popover/root/popover-root.svelte.d.ts +2 -1
- package/dist/popover/root/popover-test.svelte +2 -1
- package/dist/popover/root/popover-test.svelte.d.ts +2 -1
- package/dist/popover/trigger/README.md +23 -0
- package/dist/popover/trigger/popover-trigger-button.svelte +14 -10
- package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
- package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
- package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
- package/dist/popover/trigger/popover-trigger.svelte +19 -7
- package/dist/portal/portal.svelte +3 -1
- package/dist/primitives/click-outside.d.ts +1 -1
- package/dist/primitives/click-outside.js +1 -1
- package/dist/primitives/floating.js +12 -4
- package/dist/primitives/focus-trap.d.ts +7 -2
- package/dist/primitives/focus-trap.js +50 -17
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/input-modality.d.ts +7 -0
- package/dist/primitives/input-modality.js +125 -0
- package/dist/table/IMPLEMENTATION_NOTES.md +8 -0
- package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
- package/dist/table/PLAN.md +924 -0
- package/dist/table/README.md +116 -0
- package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
- package/dist/table/TODO.md +100 -0
- package/dist/table/body/README.md +24 -0
- package/dist/table/body/table-body.svelte +25 -0
- package/dist/table/body/table-body.svelte.d.ts +9 -0
- package/dist/table/cell/README.md +25 -0
- package/dist/table/cell/table-cell.svelte +247 -0
- package/dist/table/cell/table-cell.svelte.d.ts +9 -0
- package/dist/table/checkbox/README.md +38 -0
- package/dist/table/checkbox/table-checkbox-test.svelte +121 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +16 -0
- package/dist/table/checkbox/table-checkbox.svelte +274 -0
- package/dist/table/checkbox/table-checkbox.svelte.d.ts +13 -0
- package/dist/table/checkbox-indicator/README.md +29 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +22 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +10 -0
- package/dist/table/column/README.md +32 -0
- package/dist/table/column/table-column.svelte +108 -0
- package/dist/table/column/table-column.svelte.d.ts +18 -0
- package/dist/table/column-header-cell/README.md +28 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte +281 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +9 -0
- package/dist/table/column-resizer/README.md +32 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +51 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +83 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte +75 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer.svelte +616 -0
- package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +11 -0
- package/dist/table/empty-state/README.md +25 -0
- package/dist/table/empty-state/table-empty-state.svelte +38 -0
- package/dist/table/empty-state/table-empty-state.svelte.d.ts +8 -0
- package/dist/table/footer/README.md +24 -0
- package/dist/table/footer/table-footer.svelte +19 -0
- package/dist/table/footer/table-footer.svelte.d.ts +9 -0
- package/dist/table/header/README.md +24 -0
- package/dist/table/header/table-header.svelte +19 -0
- package/dist/table/header/table-header.svelte.d.ts +9 -0
- package/dist/table/index.d.ts +16 -0
- package/dist/table/index.js +16 -0
- package/dist/table/index.parts.d.ts +12 -0
- package/dist/table/index.parts.js +12 -0
- package/dist/table/root/README.md +56 -0
- package/dist/table/root/context.d.ts +198 -0
- package/dist/table/root/context.js +1426 -0
- package/dist/table/root/table-reorder-test.svelte +64 -0
- package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
- package/dist/table/root/table-root.svelte +410 -0
- package/dist/table/root/table-root.svelte.d.ts +29 -0
- package/dist/table/root/table-test.svelte +165 -0
- package/dist/table/root/table-test.svelte.d.ts +25 -0
- package/dist/table/row/README.md +27 -0
- package/dist/table/row/table-row.svelte +321 -0
- package/dist/table/row/table-row.svelte.d.ts +13 -0
- package/dist/test-utils/focus-contract.d.ts +3 -0
- package/dist/test-utils/focus-contract.js +26 -0
- package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
- package/dist/timepicker/README.md +97 -0
- package/dist/timepicker/TODO.md +86 -0
- package/dist/timepicker/clock/README.md +14 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
- package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
- package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
- package/dist/timepicker/index.d.ts +14 -0
- package/dist/timepicker/index.js +14 -0
- package/dist/timepicker/index.parts.d.ts +8 -0
- package/dist/timepicker/index.parts.js +8 -0
- package/dist/timepicker/input/README.md +15 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/input/time-picker-input.svelte +109 -0
- package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
- package/dist/timepicker/internal/strict-props.d.ts +4 -0
- package/dist/timepicker/internal/strict-props.js +51 -0
- package/dist/timepicker/popover/README.md +20 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
- package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
- package/dist/timepicker/root/README.md +42 -0
- package/dist/timepicker/root/context.d.ts +51 -0
- package/dist/timepicker/root/context.js +15 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-root.svelte +625 -0
- package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
- package/dist/timepicker/root/time-picker-test.svelte +72 -0
- package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
- package/dist/timepicker/root/time-utils.d.ts +1 -0
- package/dist/timepicker/root/time-utils.js +3 -0
- package/dist/timepicker/segment/README.md +14 -0
- package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
- package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
- package/dist/timepicker/trigger/README.md +14 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
- package/dist/utils/date-only.d.ts +11 -0
- package/dist/utils/date-only.js +53 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +41 -1
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import {
|
|
3
|
+
import { onDestroy } from 'svelte';
|
|
4
|
+
import {
|
|
5
|
+
setPopoverContext,
|
|
6
|
+
type PopoverCanonicalCloseReason,
|
|
7
|
+
type PopoverChangeReason,
|
|
8
|
+
type PopoverCloseReason,
|
|
9
|
+
type PopoverOpenChangeDetails,
|
|
10
|
+
type PopoverOpenReason,
|
|
11
|
+
type PopoverContext
|
|
12
|
+
} from './context';
|
|
13
|
+
import {
|
|
14
|
+
addTriggerBlurCleanup,
|
|
15
|
+
applyTriggerCloseFocusState,
|
|
16
|
+
clearTriggerFocusState
|
|
17
|
+
} from './focus-state';
|
|
4
18
|
|
|
5
19
|
/**
|
|
6
20
|
* Popover.Root - State management wrapper for Popover components.
|
|
@@ -12,7 +26,7 @@
|
|
|
12
26
|
/** Initial open state for uncontrolled mode. */
|
|
13
27
|
defaultOpen?: boolean;
|
|
14
28
|
/** Callback when open state changes. */
|
|
15
|
-
onOpenChange?: (open: boolean) => void;
|
|
29
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
16
30
|
/** Reference to the trigger element. Can be set manually or via Popover.Trigger. */
|
|
17
31
|
triggerRef?: HTMLElement | null;
|
|
18
32
|
/** Children (Trigger and Content) */
|
|
@@ -26,6 +40,9 @@
|
|
|
26
40
|
triggerRef = $bindable<HTMLElement | null>(null),
|
|
27
41
|
children
|
|
28
42
|
}: PopoverRootProps = $props();
|
|
43
|
+
let closeReason: PopoverCanonicalCloseReason = $state('none');
|
|
44
|
+
let cleanupTriggerBlurListener: (() => void) | undefined;
|
|
45
|
+
let pendingTriggerCloseFocusFrame: number | undefined;
|
|
29
46
|
|
|
30
47
|
// Use function to capture initial value only (not reactive)
|
|
31
48
|
let isOpenInternal = $state((() => defaultOpen)());
|
|
@@ -33,39 +50,90 @@
|
|
|
33
50
|
const isControlled = $derived(open !== undefined);
|
|
34
51
|
const isOpen = $derived(isControlled ? open! : isOpenInternal);
|
|
35
52
|
|
|
36
|
-
function
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
53
|
+
function setOpenWithDetails(
|
|
54
|
+
value: boolean,
|
|
55
|
+
incomingDetails: { reason: PopoverChangeReason; event?: Event }
|
|
56
|
+
) {
|
|
57
|
+
let canceled = false;
|
|
58
|
+
const details: PopoverOpenChangeDetails = {
|
|
59
|
+
reason: incomingDetails.reason,
|
|
60
|
+
event: incomingDetails.event,
|
|
61
|
+
cancel: () => {
|
|
62
|
+
canceled = true;
|
|
63
|
+
},
|
|
64
|
+
get isCanceled() {
|
|
65
|
+
return canceled;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
onOpenChange?.(value, details);
|
|
70
|
+
if (details.isCanceled) return;
|
|
71
|
+
|
|
72
|
+
if (!isControlled) {
|
|
40
73
|
isOpenInternal = value;
|
|
41
|
-
onOpenChange?.(value);
|
|
42
74
|
}
|
|
43
|
-
|
|
75
|
+
|
|
44
76
|
open = value;
|
|
45
77
|
}
|
|
46
78
|
|
|
47
|
-
function toggle() {
|
|
48
|
-
|
|
79
|
+
function toggle(reason: PopoverOpenReason = 'trigger-press', event?: Event) {
|
|
80
|
+
setOpenWithDetails(!isOpen, { reason, event });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function openPopover(reason: PopoverOpenReason = 'imperative-action', event?: Event) {
|
|
84
|
+
closeReason = 'none';
|
|
85
|
+
setOpenWithDetails(true, { reason, event });
|
|
49
86
|
}
|
|
50
87
|
|
|
51
|
-
function
|
|
52
|
-
|
|
88
|
+
function clearPendingTriggerCloseFocus() {
|
|
89
|
+
if (pendingTriggerCloseFocusFrame === undefined) return;
|
|
90
|
+
cancelAnimationFrame(pendingTriggerCloseFocusFrame);
|
|
91
|
+
pendingTriggerCloseFocusFrame = undefined;
|
|
53
92
|
}
|
|
54
93
|
|
|
55
|
-
function
|
|
56
|
-
|
|
57
|
-
|
|
94
|
+
function scheduleTriggerCloseFocus(
|
|
95
|
+
trigger: HTMLElement,
|
|
96
|
+
reason: PopoverCanonicalCloseReason,
|
|
97
|
+
event?: Event
|
|
98
|
+
) {
|
|
99
|
+
clearPendingTriggerCloseFocus();
|
|
100
|
+
pendingTriggerCloseFocusFrame = requestAnimationFrame(() => {
|
|
101
|
+
pendingTriggerCloseFocusFrame = undefined;
|
|
102
|
+
if (!trigger.isConnected) return;
|
|
103
|
+
applyTriggerCloseFocusState(trigger, reason, event);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function closePopover(reason: PopoverCloseReason = 'imperative-action', event?: Event) {
|
|
108
|
+
closeReason = reason;
|
|
109
|
+
const wasOpen = isOpen;
|
|
110
|
+
setOpenWithDetails(false, { reason, event });
|
|
111
|
+
if (!wasOpen || isOpen) return;
|
|
112
|
+
if (!triggerRef) return;
|
|
113
|
+
scheduleTriggerCloseFocus(triggerRef, reason, event);
|
|
58
114
|
}
|
|
59
115
|
|
|
60
116
|
function setTriggerRef(el: HTMLElement | null) {
|
|
117
|
+
clearPendingTriggerCloseFocus();
|
|
118
|
+
cleanupTriggerBlurListener?.();
|
|
119
|
+
cleanupTriggerBlurListener = undefined;
|
|
120
|
+
if (triggerRef && triggerRef !== el) {
|
|
121
|
+
clearTriggerFocusState(triggerRef);
|
|
122
|
+
}
|
|
61
123
|
triggerRef = el;
|
|
124
|
+
if (!triggerRef) return;
|
|
125
|
+
const currentTrigger = triggerRef;
|
|
126
|
+
cleanupTriggerBlurListener = addTriggerBlurCleanup(currentTrigger);
|
|
62
127
|
}
|
|
63
128
|
|
|
64
|
-
function handleOpenChange(newOpen: boolean) {
|
|
65
|
-
|
|
129
|
+
function handleOpenChange(newOpen: boolean, details: PopoverOpenChangeDetails) {
|
|
130
|
+
setOpenWithDetails(newOpen, { reason: details.reason, event: details.event });
|
|
66
131
|
}
|
|
67
132
|
|
|
68
133
|
const ctx: PopoverContext = {
|
|
134
|
+
get closeReason() {
|
|
135
|
+
return closeReason;
|
|
136
|
+
},
|
|
69
137
|
get isOpen() {
|
|
70
138
|
return isOpen;
|
|
71
139
|
},
|
|
@@ -80,6 +148,11 @@
|
|
|
80
148
|
};
|
|
81
149
|
|
|
82
150
|
setPopoverContext(ctx);
|
|
151
|
+
|
|
152
|
+
onDestroy(() => {
|
|
153
|
+
clearPendingTriggerCloseFocus();
|
|
154
|
+
cleanupTriggerBlurListener?.();
|
|
155
|
+
});
|
|
83
156
|
</script>
|
|
84
157
|
|
|
85
158
|
{#if children}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type PopoverOpenChangeDetails } from './context';
|
|
2
3
|
/**
|
|
3
4
|
* Popover.Root - State management wrapper for Popover components.
|
|
4
5
|
* Provides context for Trigger and Content children.
|
|
@@ -9,7 +10,7 @@ type PopoverRootProps = {
|
|
|
9
10
|
/** Initial open state for uncontrolled mode. */
|
|
10
11
|
defaultOpen?: boolean;
|
|
11
12
|
/** Callback when open state changes. */
|
|
12
|
-
onOpenChange?: (open: boolean) => void;
|
|
13
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
13
14
|
/** Reference to the trigger element. Can be set manually or via Popover.Trigger. */
|
|
14
15
|
triggerRef?: HTMLElement | null;
|
|
15
16
|
/** Children (Trigger and Content) */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Popover } from '../index';
|
|
3
|
+
import type { PopoverOpenChangeDetails } from './context';
|
|
3
4
|
|
|
4
5
|
type Props = {
|
|
5
6
|
open?: boolean;
|
|
@@ -7,7 +8,7 @@
|
|
|
7
8
|
isNonModal?: boolean;
|
|
8
9
|
shouldCloseOnInteractOutside?: boolean;
|
|
9
10
|
shouldCloseOnEscape?: boolean;
|
|
10
|
-
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
11
12
|
};
|
|
12
13
|
|
|
13
14
|
let {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type { PopoverOpenChangeDetails } from './context';
|
|
1
2
|
type Props = {
|
|
2
3
|
open?: boolean;
|
|
3
4
|
defaultOpen?: boolean;
|
|
4
5
|
isNonModal?: boolean;
|
|
5
6
|
shouldCloseOnInteractOutside?: boolean;
|
|
6
7
|
shouldCloseOnEscape?: boolean;
|
|
7
|
-
onOpenChange?: (open: boolean) => void;
|
|
8
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
8
9
|
};
|
|
9
10
|
declare const PopoverTest: import("svelte").Component<Props, {}, "">;
|
|
10
11
|
type PopoverTest = ReturnType<typeof PopoverTest>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Popover Trigger
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Popover.Trigger
|
|
6
|
+
|
|
7
|
+
Name: `Popover.Trigger`
|
|
8
|
+
Description: Wrapper trigger part that finds a button in its children, wires it as trigger, and toggles the popover on click.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ---------- | --------- | ----------- | ------------------------------------------------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `undefined` | Child content that includes a trigger element (`button` or `[role="button"]`). |
|
|
13
|
+
|
|
14
|
+
### Popover.TriggerButton
|
|
15
|
+
|
|
16
|
+
Name: `Popover.TriggerButton`
|
|
17
|
+
Description: Pre-wired trigger button part for popover toggling.
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| -------------- | ---------------------- | ----------- | -------------------------------------------------------------------------- |
|
|
21
|
+
| `children` | `Snippet` | `undefined` | Button content. |
|
|
22
|
+
| `class` | `string` | `''` | CSS class names for the button. |
|
|
23
|
+
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes, excluding reserved trigger semantics. |
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import {
|
|
3
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
5
|
+
import { getPopoverContext } from '../root/context';
|
|
4
6
|
|
|
5
|
-
type PopoverTriggerButtonProps =
|
|
7
|
+
type PopoverTriggerButtonProps = Omit<
|
|
8
|
+
HTMLButtonAttributes,
|
|
9
|
+
// Keep the trigger semantics stable
|
|
10
|
+
'type' | 'class' | 'children' | 'onclick' | 'aria-haspopup' | 'aria-expanded'
|
|
11
|
+
> & {
|
|
6
12
|
/** Button content */
|
|
7
13
|
children?: Snippet;
|
|
8
14
|
/** Additional class */
|
|
9
15
|
class?: string;
|
|
10
|
-
/** Any other props */
|
|
11
|
-
[key: string]: unknown;
|
|
12
16
|
};
|
|
13
17
|
|
|
14
18
|
let { children, class: className = '', ...restProps }: PopoverTriggerButtonProps = $props();
|
|
15
19
|
|
|
16
20
|
let buttonRef: HTMLButtonElement | null = $state(null);
|
|
17
|
-
const ctx =
|
|
21
|
+
const ctx = getPopoverContext();
|
|
18
22
|
|
|
19
23
|
$effect(() => {
|
|
20
24
|
if (buttonRef && ctx) {
|
|
@@ -22,13 +26,13 @@
|
|
|
22
26
|
}
|
|
23
27
|
});
|
|
24
28
|
|
|
25
|
-
function handleClick() {
|
|
26
|
-
ctx?.toggle();
|
|
29
|
+
function handleClick(event: MouseEvent) {
|
|
30
|
+
ctx?.toggle('trigger-press', event);
|
|
27
31
|
}
|
|
28
32
|
</script>
|
|
29
33
|
|
|
30
|
-
<
|
|
31
|
-
bind:
|
|
34
|
+
<ButtonRoot
|
|
35
|
+
bind:element={buttonRef}
|
|
32
36
|
class={className}
|
|
33
37
|
type="button"
|
|
34
38
|
aria-expanded={ctx?.isOpen ?? false}
|
|
@@ -39,4 +43,4 @@
|
|
|
39
43
|
{#if children}
|
|
40
44
|
{@render children()}
|
|
41
45
|
{/if}
|
|
42
|
-
</
|
|
46
|
+
</ButtonRoot>
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
type
|
|
2
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
+
type PopoverTriggerButtonProps = Omit<HTMLButtonAttributes, 'type' | 'class' | 'children' | 'onclick' | 'aria-haspopup' | 'aria-expanded'> & {
|
|
3
4
|
/** Button content */
|
|
4
5
|
children?: Snippet;
|
|
5
6
|
/** Additional class */
|
|
6
7
|
class?: string;
|
|
7
|
-
/** Any other props */
|
|
8
|
-
[key: string]: unknown;
|
|
9
8
|
};
|
|
10
9
|
declare const PopoverTriggerButton: import("svelte").Component<PopoverTriggerButtonProps, {}, "">;
|
|
11
10
|
type PopoverTriggerButton = ReturnType<typeof PopoverTriggerButton>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Popover } from '../../popover';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<Popover.Root>
|
|
6
|
+
<Popover.Trigger>
|
|
7
|
+
<div>
|
|
8
|
+
<button type="button">First Popover Trigger</button>
|
|
9
|
+
<button type="button">Second Popover Trigger</button>
|
|
10
|
+
</div>
|
|
11
|
+
</Popover.Trigger>
|
|
12
|
+
|
|
13
|
+
<Popover.Content>
|
|
14
|
+
<p>Popover body</p>
|
|
15
|
+
</Popover.Content>
|
|
16
|
+
</Popover.Root>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const PopoverTriggerMultiButtonTest: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type PopoverTriggerMultiButtonTest = InstanceType<typeof PopoverTriggerMultiButtonTest>;
|
|
18
|
+
export default PopoverTriggerMultiButtonTest;
|
|
@@ -24,17 +24,26 @@
|
|
|
24
24
|
const popoverCtx = ctx;
|
|
25
25
|
|
|
26
26
|
let wrapperRef: HTMLElement | null = $state(null);
|
|
27
|
+
let activeTrigger: HTMLElement | null = null;
|
|
28
|
+
|
|
29
|
+
function setActiveTrigger(button: HTMLElement) {
|
|
30
|
+
if (activeTrigger && activeTrigger !== button) {
|
|
31
|
+
activeTrigger.setAttribute('aria-expanded', 'false');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
activeTrigger = button;
|
|
35
|
+
popoverCtx.setTriggerRef(button);
|
|
36
|
+
button.setAttribute('aria-haspopup', 'dialog');
|
|
37
|
+
button.setAttribute('aria-expanded', String(popoverCtx.isOpen));
|
|
38
|
+
}
|
|
27
39
|
|
|
28
40
|
function handleClick(event: MouseEvent) {
|
|
29
41
|
const target = event.target as HTMLElement;
|
|
30
42
|
const button = target.closest('button, [role="button"]') as HTMLElement | null;
|
|
31
43
|
|
|
32
44
|
if (button && wrapperRef?.contains(button)) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
popoverCtx.setTriggerRef(button);
|
|
36
|
-
}
|
|
37
|
-
popoverCtx.toggle();
|
|
45
|
+
setActiveTrigger(button);
|
|
46
|
+
popoverCtx.toggle('trigger-press', event);
|
|
38
47
|
}
|
|
39
48
|
}
|
|
40
49
|
|
|
@@ -43,8 +52,7 @@
|
|
|
43
52
|
// Find and set up the trigger button
|
|
44
53
|
const firstButton = wrapperRef.querySelector('button, [role="button"]') as HTMLElement | null;
|
|
45
54
|
if (firstButton) {
|
|
46
|
-
|
|
47
|
-
firstButton.setAttribute('aria-haspopup', 'dialog');
|
|
55
|
+
setActiveTrigger(firstButton);
|
|
48
56
|
}
|
|
49
57
|
}
|
|
50
58
|
|
|
@@ -59,6 +67,10 @@
|
|
|
59
67
|
|
|
60
68
|
$effect(() => {
|
|
61
69
|
if (popoverCtx.triggerRef) {
|
|
70
|
+
if (activeTrigger !== popoverCtx.triggerRef) {
|
|
71
|
+
activeTrigger = popoverCtx.triggerRef;
|
|
72
|
+
}
|
|
73
|
+
popoverCtx.triggerRef.setAttribute('aria-haspopup', 'dialog');
|
|
62
74
|
popoverCtx.triggerRef.setAttribute('aria-expanded', String(popoverCtx.isOpen));
|
|
63
75
|
}
|
|
64
76
|
});
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
if (!browser || !wrapper) return;
|
|
19
19
|
|
|
20
20
|
await tick();
|
|
21
|
+
const wrapperNode = wrapper;
|
|
22
|
+
if (!wrapperNode) return;
|
|
21
23
|
|
|
22
24
|
const targetEl = document.querySelector(target);
|
|
23
25
|
if (!targetEl) {
|
|
@@ -25,7 +27,7 @@
|
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
27
29
|
|
|
28
|
-
targetEl.appendChild(
|
|
30
|
+
targetEl.appendChild(wrapperNode);
|
|
29
31
|
});
|
|
30
32
|
|
|
31
33
|
onDestroy(() => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type ClickOutsideOptions = {
|
|
6
6
|
/** Callback when clicking outside. */
|
|
7
|
-
handler: () => void;
|
|
7
|
+
handler: (event: MouseEvent) => void;
|
|
8
8
|
/** Whether the listener is enabled. */
|
|
9
9
|
enabled?: boolean;
|
|
10
10
|
/** Elements to ignore (clicks on these won't trigger). */
|
|
@@ -41,7 +41,7 @@ export function clickOutside(node, options) {
|
|
|
41
41
|
// This prevents closing when clicking on nested popovers/dialogs
|
|
42
42
|
if (isInTopLayer(target))
|
|
43
43
|
return;
|
|
44
|
-
handler();
|
|
44
|
+
handler(event);
|
|
45
45
|
}
|
|
46
46
|
if (enabled) {
|
|
47
47
|
document.addEventListener('mousedown', handleClick, true);
|
|
@@ -84,11 +84,15 @@ export function createFloating(anchorElement, options = {}) {
|
|
|
84
84
|
size({
|
|
85
85
|
apply({ rects, availableWidth, availableHeight, elements, placement }) {
|
|
86
86
|
const floatingEl = elements.floating;
|
|
87
|
+
const clampedAvailableWidth = Math.max(0, availableWidth);
|
|
88
|
+
const clampedAvailableHeight = Math.max(0, availableHeight);
|
|
87
89
|
floatingEl.style.setProperty('--trigger-width', `${rects.reference.width}px`);
|
|
88
90
|
floatingEl.style.setProperty('--trigger-height', `${rects.reference.height}px`);
|
|
89
|
-
floatingEl.style.setProperty('--available-width', `${
|
|
90
|
-
floatingEl.style.setProperty('--available-height', `${
|
|
91
|
+
floatingEl.style.setProperty('--available-width', `${clampedAvailableWidth}px`);
|
|
92
|
+
floatingEl.style.setProperty('--available-height', `${clampedAvailableHeight}px`);
|
|
91
93
|
floatingEl.style.setProperty('--transform-origin', getTransformOrigin(placement));
|
|
94
|
+
floatingEl.style.maxWidth = `${clampedAvailableWidth}px`;
|
|
95
|
+
floatingEl.style.maxHeight = `${clampedAvailableHeight}px`;
|
|
92
96
|
}
|
|
93
97
|
})
|
|
94
98
|
];
|
|
@@ -141,11 +145,15 @@ export function floating(floatingElement, options) {
|
|
|
141
145
|
size({
|
|
142
146
|
apply({ rects, availableWidth, availableHeight, elements, placement }) {
|
|
143
147
|
const floatingEl = elements.floating;
|
|
148
|
+
const clampedAvailableWidth = Math.max(0, availableWidth);
|
|
149
|
+
const clampedAvailableHeight = Math.max(0, availableHeight);
|
|
144
150
|
floatingEl.style.setProperty('--trigger-width', `${rects.reference.width}px`);
|
|
145
151
|
floatingEl.style.setProperty('--trigger-height', `${rects.reference.height}px`);
|
|
146
|
-
floatingEl.style.setProperty('--available-width', `${
|
|
147
|
-
floatingEl.style.setProperty('--available-height', `${
|
|
152
|
+
floatingEl.style.setProperty('--available-width', `${clampedAvailableWidth}px`);
|
|
153
|
+
floatingEl.style.setProperty('--available-height', `${clampedAvailableHeight}px`);
|
|
148
154
|
floatingEl.style.setProperty('--transform-origin', getTransformOrigin(placement));
|
|
155
|
+
floatingEl.style.maxWidth = `${clampedAvailableWidth}px`;
|
|
156
|
+
floatingEl.style.maxHeight = `${clampedAvailableHeight}px`;
|
|
149
157
|
}
|
|
150
158
|
})
|
|
151
159
|
];
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* Focus trap primitive.
|
|
3
3
|
* Traps keyboard focus within a container element.
|
|
4
4
|
*/
|
|
5
|
+
export type FocusTrapOptions = {
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
restoreFocus?: boolean;
|
|
8
|
+
initialFocus?: HTMLElement | string | (() => HTMLElement | null | undefined);
|
|
9
|
+
};
|
|
5
10
|
/**
|
|
6
11
|
* Svelte action that traps focus within an element.
|
|
7
12
|
*
|
|
@@ -13,7 +18,7 @@
|
|
|
13
18
|
* </div>
|
|
14
19
|
* ```
|
|
15
20
|
*/
|
|
16
|
-
export declare function focusTrap(node: HTMLElement,
|
|
17
|
-
update(
|
|
21
|
+
export declare function focusTrap(node: HTMLElement, options?: boolean | FocusTrapOptions): {
|
|
22
|
+
update(newOptions: boolean | FocusTrapOptions): void;
|
|
18
23
|
destroy(): void;
|
|
19
24
|
};
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Focus trap primitive.
|
|
3
3
|
* Traps keyboard focus within a container element.
|
|
4
4
|
*/
|
|
5
|
+
import { focusWithModality, getInteractionModality } from './input-modality';
|
|
5
6
|
const FOCUSABLE_SELECTOR = [
|
|
6
7
|
'a[href]',
|
|
7
8
|
'button:not([disabled])',
|
|
@@ -11,8 +12,29 @@ const FOCUSABLE_SELECTOR = [
|
|
|
11
12
|
'[tabindex]:not([tabindex="-1"])',
|
|
12
13
|
'[contenteditable="true"]'
|
|
13
14
|
].join(', ');
|
|
15
|
+
function resolveEnabled(options) {
|
|
16
|
+
if (typeof options === 'boolean')
|
|
17
|
+
return options;
|
|
18
|
+
return options.enabled ?? true;
|
|
19
|
+
}
|
|
20
|
+
function resolveRestoreFocus(options) {
|
|
21
|
+
if (typeof options === 'boolean')
|
|
22
|
+
return true;
|
|
23
|
+
return options.restoreFocus ?? true;
|
|
24
|
+
}
|
|
25
|
+
function resolveInitialFocus(container, initialFocus) {
|
|
26
|
+
if (!initialFocus)
|
|
27
|
+
return null;
|
|
28
|
+
if (typeof initialFocus === 'function') {
|
|
29
|
+
return initialFocus() ?? null;
|
|
30
|
+
}
|
|
31
|
+
if (typeof initialFocus === 'string') {
|
|
32
|
+
return container.querySelector(initialFocus);
|
|
33
|
+
}
|
|
34
|
+
return initialFocus;
|
|
35
|
+
}
|
|
14
36
|
function getFocusableElements(container) {
|
|
15
|
-
return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((
|
|
37
|
+
return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((element) => element.offsetParent !== null);
|
|
16
38
|
}
|
|
17
39
|
/**
|
|
18
40
|
* Svelte action that traps focus within an element.
|
|
@@ -25,8 +47,11 @@ function getFocusableElements(container) {
|
|
|
25
47
|
* </div>
|
|
26
48
|
* ```
|
|
27
49
|
*/
|
|
28
|
-
export function focusTrap(node,
|
|
50
|
+
export function focusTrap(node, options = true) {
|
|
29
51
|
let previousActiveElement = null;
|
|
52
|
+
let enabled = resolveEnabled(options);
|
|
53
|
+
let restoreFocus = resolveRestoreFocus(options);
|
|
54
|
+
let initialFocus = typeof options === 'boolean' ? undefined : options.initialFocus;
|
|
30
55
|
function handleKeydown(event) {
|
|
31
56
|
if (event.key !== 'Tab')
|
|
32
57
|
return;
|
|
@@ -49,12 +74,11 @@ export function focusTrap(node, enabled = true) {
|
|
|
49
74
|
event.preventDefault();
|
|
50
75
|
lastElement.focus();
|
|
51
76
|
}
|
|
77
|
+
return;
|
|
52
78
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
firstElement.focus();
|
|
57
|
-
}
|
|
79
|
+
if (document.activeElement === lastElement || document.activeElement === node) {
|
|
80
|
+
event.preventDefault();
|
|
81
|
+
firstElement.focus();
|
|
58
82
|
}
|
|
59
83
|
}
|
|
60
84
|
function activate() {
|
|
@@ -62,21 +86,25 @@ export function focusTrap(node, enabled = true) {
|
|
|
62
86
|
if (!node.hasAttribute('tabindex')) {
|
|
63
87
|
node.setAttribute('tabindex', '-1');
|
|
64
88
|
}
|
|
65
|
-
// Focus first focusable element, or the container if none
|
|
66
89
|
requestAnimationFrame(() => {
|
|
90
|
+
const initialFocusTarget = resolveInitialFocus(node, initialFocus);
|
|
91
|
+
const modality = getInteractionModality();
|
|
92
|
+
if (initialFocusTarget && initialFocusTarget.isConnected) {
|
|
93
|
+
focusWithModality(initialFocusTarget, modality);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
67
96
|
const focusableElements = getFocusableElements(node);
|
|
68
97
|
if (focusableElements.length > 0) {
|
|
69
|
-
focusableElements[0]
|
|
70
|
-
|
|
71
|
-
else {
|
|
72
|
-
node.focus();
|
|
98
|
+
focusWithModality(focusableElements[0], modality);
|
|
99
|
+
return;
|
|
73
100
|
}
|
|
101
|
+
focusWithModality(node, modality);
|
|
74
102
|
});
|
|
75
103
|
document.addEventListener('keydown', handleKeydown, true);
|
|
76
104
|
}
|
|
77
105
|
function deactivate() {
|
|
78
106
|
document.removeEventListener('keydown', handleKeydown, true);
|
|
79
|
-
if (previousActiveElement && previousActiveElement.focus) {
|
|
107
|
+
if (restoreFocus && previousActiveElement && previousActiveElement.focus) {
|
|
80
108
|
previousActiveElement.focus();
|
|
81
109
|
}
|
|
82
110
|
}
|
|
@@ -84,14 +112,19 @@ export function focusTrap(node, enabled = true) {
|
|
|
84
112
|
activate();
|
|
85
113
|
}
|
|
86
114
|
return {
|
|
87
|
-
update(
|
|
88
|
-
|
|
115
|
+
update(newOptions) {
|
|
116
|
+
const nextEnabled = resolveEnabled(newOptions);
|
|
117
|
+
const nextRestoreFocus = resolveRestoreFocus(newOptions);
|
|
118
|
+
if (nextEnabled && !enabled) {
|
|
89
119
|
activate();
|
|
90
120
|
}
|
|
91
|
-
else if (!
|
|
121
|
+
else if (!nextEnabled && enabled) {
|
|
92
122
|
deactivate();
|
|
93
123
|
}
|
|
94
|
-
|
|
124
|
+
options = newOptions;
|
|
125
|
+
enabled = nextEnabled;
|
|
126
|
+
restoreFocus = nextRestoreFocus;
|
|
127
|
+
initialFocus = typeof newOptions === 'boolean' ? undefined : newOptions.initialFocus;
|
|
95
128
|
},
|
|
96
129
|
destroy() {
|
|
97
130
|
if (enabled) {
|
package/dist/primitives/index.js
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type InputModality = 'keyboard' | 'pointer' | 'virtual';
|
|
2
|
+
export declare function initInputModality(target?: HTMLElement | null): void;
|
|
3
|
+
export declare function trackInteractionModality(event?: Event, target?: HTMLElement | null): void;
|
|
4
|
+
export declare function getInteractionModality(): InputModality;
|
|
5
|
+
export declare function shouldShowFocusVisible(target: HTMLElement | null): boolean;
|
|
6
|
+
export declare function focusWithModality(target: HTMLElement, modality: InputModality, options?: FocusOptions): void;
|
|
7
|
+
export declare function resolveCloseInteractionModality(reason: string, event?: Event): InputModality;
|