@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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Popover } from '../index';
|
|
3
|
+
import type { PopoverOpenChangeDetails } from '../root/context';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
preventClose?: boolean;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
let { preventClose = true }: Props = $props();
|
|
10
|
+
|
|
11
|
+
let open = $state(true);
|
|
12
|
+
let triggerRef = $state<HTMLElement | null>(null);
|
|
13
|
+
|
|
14
|
+
function handleOpenChange(nextOpen: boolean, details: PopoverOpenChangeDetails) {
|
|
15
|
+
if (!nextOpen && preventClose) {
|
|
16
|
+
details.cancel();
|
|
17
|
+
}
|
|
18
|
+
if (!details.isCanceled) {
|
|
19
|
+
open = nextOpen;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<button bind:this={triggerRef} type="button">Standalone Trigger</button>
|
|
25
|
+
|
|
26
|
+
<Popover.Content {open} {triggerRef} onOpenChange={handleOpenChange}>
|
|
27
|
+
<div>Standalone content</div>
|
|
28
|
+
</Popover.Content>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Popover } from '../index';
|
|
3
|
+
import type { PopoverOpenChangeDetails } from '../root/context';
|
|
3
4
|
|
|
4
5
|
type Props = {
|
|
5
6
|
open?: boolean;
|
|
@@ -8,7 +9,8 @@
|
|
|
8
9
|
shouldCloseOnInteractOutside?: boolean;
|
|
9
10
|
shouldCloseOnEscape?: boolean;
|
|
10
11
|
shouldCloseOnBlur?: boolean;
|
|
11
|
-
|
|
12
|
+
class?: string;
|
|
13
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
12
14
|
};
|
|
13
15
|
|
|
14
16
|
let {
|
|
@@ -18,6 +20,7 @@
|
|
|
18
20
|
shouldCloseOnInteractOutside = true,
|
|
19
21
|
shouldCloseOnEscape = true,
|
|
20
22
|
shouldCloseOnBlur,
|
|
23
|
+
class: className = '',
|
|
21
24
|
onOpenChange
|
|
22
25
|
}: Props = $props();
|
|
23
26
|
</script>
|
|
@@ -28,7 +31,7 @@
|
|
|
28
31
|
</Popover.Trigger>
|
|
29
32
|
|
|
30
33
|
<Popover.Content
|
|
31
|
-
class=
|
|
34
|
+
class={`popover-content ${className}`.trim()}
|
|
32
35
|
{isNonModal}
|
|
33
36
|
{shouldCloseOnInteractOutside}
|
|
34
37
|
{shouldCloseOnEscape}
|
|
@@ -41,3 +44,30 @@
|
|
|
41
44
|
</div>
|
|
42
45
|
</Popover.Content>
|
|
43
46
|
</Popover.Root>
|
|
47
|
+
|
|
48
|
+
<style>
|
|
49
|
+
:global(.presence-animation) {
|
|
50
|
+
opacity: 1;
|
|
51
|
+
transition: opacity 0.2s linear;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:global(.presence-animation[data-entering]) {
|
|
55
|
+
animation: popover-enter 0.2s linear;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
:global(.presence-animation[data-exiting]) {
|
|
59
|
+
opacity: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@keyframes popover-enter {
|
|
63
|
+
from {
|
|
64
|
+
opacity: 0;
|
|
65
|
+
transform: scale(0.96);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
to {
|
|
69
|
+
opacity: 1;
|
|
70
|
+
transform: scale(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
</style>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PopoverOpenChangeDetails } from '../root/context';
|
|
1
2
|
type Props = {
|
|
2
3
|
open?: boolean;
|
|
3
4
|
defaultOpen?: boolean;
|
|
@@ -5,7 +6,8 @@ type Props = {
|
|
|
5
6
|
shouldCloseOnInteractOutside?: boolean;
|
|
6
7
|
shouldCloseOnEscape?: boolean;
|
|
7
8
|
shouldCloseOnBlur?: boolean;
|
|
8
|
-
|
|
9
|
+
class?: string;
|
|
10
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
9
11
|
};
|
|
10
12
|
declare const PopoverContentTest: import("svelte").Component<Props, {}, "">;
|
|
11
13
|
type PopoverContentTest = ReturnType<typeof PopoverContentTest>;
|
|
@@ -4,12 +4,21 @@
|
|
|
4
4
|
import { onMount, onDestroy } from 'svelte';
|
|
5
5
|
import { browser } from '$app/environment';
|
|
6
6
|
import { floating, type ExtendedPlacement } from '../../primitives/floating';
|
|
7
|
-
import { focusTrap } from '../../primitives/focus-trap';
|
|
7
|
+
import { focusTrap, type FocusTrapOptions } from '../../primitives/focus-trap';
|
|
8
8
|
import { scrollLock } from '../../primitives/scroll-lock';
|
|
9
9
|
import { clickOutside } from '../../primitives/click-outside';
|
|
10
10
|
import { ariaHideOutside } from '../../primitives/aria-hide-outside';
|
|
11
11
|
import { Portal } from '../../portal';
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
getPopoverContext,
|
|
14
|
+
type PopoverOpenChangeDetails,
|
|
15
|
+
type PopoverCloseReason
|
|
16
|
+
} from '../root/context';
|
|
17
|
+
import {
|
|
18
|
+
addTriggerBlurCleanup,
|
|
19
|
+
applyTriggerCloseFocusState,
|
|
20
|
+
clearTriggerFocusState
|
|
21
|
+
} from '../root/focus-state';
|
|
13
22
|
|
|
14
23
|
/**
|
|
15
24
|
* Popover.Content - The floating content panel.
|
|
@@ -36,17 +45,19 @@
|
|
|
36
45
|
shouldCloseOnEscape?: boolean;
|
|
37
46
|
/** Whether losing focus (blur) should close the popover. Defaults to true for non-modal popovers. */
|
|
38
47
|
shouldCloseOnBlur?: boolean;
|
|
48
|
+
/** Element or selector to focus first when modal trap activates. */
|
|
49
|
+
initialFocus?: FocusTrapOptions['initialFocus'];
|
|
39
50
|
// Standalone mode props (used when not inside Popover.Root)
|
|
40
51
|
/** Controlled open state (standalone mode). */
|
|
41
52
|
open?: boolean;
|
|
42
53
|
/** Reference to the trigger element (standalone mode). */
|
|
43
54
|
triggerRef?: HTMLElement | null;
|
|
44
55
|
/** Callback when open state changes (standalone mode). */
|
|
45
|
-
onOpenChange?: (open: boolean) => void;
|
|
56
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
46
57
|
} & Omit<HTMLAttributes<HTMLDivElement>, 'class' | 'children'>;
|
|
47
58
|
|
|
48
59
|
let {
|
|
49
|
-
offset =
|
|
60
|
+
offset = 4,
|
|
50
61
|
placement = 'bottom',
|
|
51
62
|
shouldFlip = true,
|
|
52
63
|
boundaryElement = null,
|
|
@@ -56,6 +67,7 @@
|
|
|
56
67
|
shouldCloseOnInteractOutside = true,
|
|
57
68
|
shouldCloseOnEscape = true,
|
|
58
69
|
shouldCloseOnBlur,
|
|
70
|
+
initialFocus,
|
|
59
71
|
// Standalone mode props
|
|
60
72
|
open: openProp,
|
|
61
73
|
triggerRef: triggerRefProp = null,
|
|
@@ -73,28 +85,188 @@
|
|
|
73
85
|
const shouldCloseOnBlurResolved = $derived(shouldCloseOnBlur ?? isNonModal);
|
|
74
86
|
|
|
75
87
|
let popoverRef: HTMLElement | undefined = $state();
|
|
88
|
+
let cleanupStandaloneTriggerBlurListener: (() => void) | undefined;
|
|
89
|
+
let pendingStandaloneTriggerCloseFocusFrame: number | undefined;
|
|
90
|
+
let trackedStandaloneTrigger: HTMLElement | null = null;
|
|
91
|
+
let isMounted = $state(false);
|
|
92
|
+
let isEntering = $state(false);
|
|
93
|
+
let isExiting = $state(false);
|
|
94
|
+
let resolvedPlacement = $state<'top' | 'right' | 'bottom' | 'left'>('bottom');
|
|
95
|
+
let motionTimeout: number | undefined;
|
|
96
|
+
let pendingMotionFrame: number | undefined;
|
|
97
|
+
let cleanupMotionListeners: (() => void) | undefined;
|
|
98
|
+
let motionId = 0;
|
|
76
99
|
|
|
77
|
-
function
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
100
|
+
function parseTimeList(value: string) {
|
|
101
|
+
return value
|
|
102
|
+
.split(',')
|
|
103
|
+
.map((entry) => entry.trim())
|
|
104
|
+
.filter(Boolean)
|
|
105
|
+
.map((entry) => {
|
|
106
|
+
if (entry.endsWith('ms')) return Number.parseFloat(entry);
|
|
107
|
+
if (entry.endsWith('s')) return Number.parseFloat(entry) * 1000;
|
|
108
|
+
return Number.parseFloat(entry) || 0;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function getMaxTime(duration: string, delay: string) {
|
|
113
|
+
const durations = parseTimeList(duration);
|
|
114
|
+
const delays = parseTimeList(delay);
|
|
115
|
+
const length = Math.max(durations.length, delays.length);
|
|
116
|
+
|
|
117
|
+
let maxTime = 0;
|
|
118
|
+
for (let index = 0; index < length; index += 1) {
|
|
119
|
+
const total =
|
|
120
|
+
(durations[index] ?? durations[durations.length - 1] ?? 0) +
|
|
121
|
+
(delays[index] ?? delays[delays.length - 1] ?? 0);
|
|
122
|
+
maxTime = Math.max(maxTime, total);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return maxTime;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function getMotionTime(element: HTMLElement) {
|
|
129
|
+
const styles = getComputedStyle(element);
|
|
130
|
+
const transitionTime = getMaxTime(styles.transitionDuration, styles.transitionDelay);
|
|
131
|
+
const animationTime = getMaxTime(styles.animationDuration, styles.animationDelay);
|
|
132
|
+
return Math.max(transitionTime, animationTime);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function resolvePlacementSide(value: string) {
|
|
136
|
+
const side = value.split(/[-\s]/)[0];
|
|
137
|
+
return side === 'top' || side === 'right' || side === 'left' ? side : 'bottom';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function clearMotionTracking() {
|
|
141
|
+
if (pendingMotionFrame !== undefined) {
|
|
142
|
+
cancelAnimationFrame(pendingMotionFrame);
|
|
143
|
+
pendingMotionFrame = undefined;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (motionTimeout !== undefined) {
|
|
147
|
+
clearTimeout(motionTimeout);
|
|
148
|
+
motionTimeout = undefined;
|
|
83
149
|
}
|
|
150
|
+
|
|
151
|
+
cleanupMotionListeners?.();
|
|
152
|
+
cleanupMotionListeners = undefined;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function finishEnter(id: number) {
|
|
156
|
+
if (id !== motionId) return;
|
|
157
|
+
clearMotionTracking();
|
|
158
|
+
isEntering = false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function finishExit(id: number) {
|
|
162
|
+
if (id !== motionId) return;
|
|
163
|
+
clearMotionTracking();
|
|
164
|
+
isExiting = false;
|
|
165
|
+
isMounted = false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function trackMotion(phase: 'enter' | 'exit', element: HTMLElement) {
|
|
169
|
+
clearMotionTracking();
|
|
170
|
+
const id = ++motionId;
|
|
171
|
+
|
|
172
|
+
pendingMotionFrame = requestAnimationFrame(() => {
|
|
173
|
+
pendingMotionFrame = undefined;
|
|
174
|
+
if (id !== motionId || !element.isConnected) return;
|
|
175
|
+
|
|
176
|
+
const totalMotionTime = getMotionTime(element);
|
|
177
|
+
const complete = phase === 'enter' ? () => finishEnter(id) : () => finishExit(id);
|
|
178
|
+
|
|
179
|
+
if (totalMotionTime <= 0) {
|
|
180
|
+
complete();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const handleMotionEnd = (event: Event) => {
|
|
185
|
+
if (event.target !== element) return;
|
|
186
|
+
complete();
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
element.addEventListener('animationend', handleMotionEnd);
|
|
190
|
+
element.addEventListener('transitionend', handleMotionEnd);
|
|
191
|
+
cleanupMotionListeners = () => {
|
|
192
|
+
element.removeEventListener('animationend', handleMotionEnd);
|
|
193
|
+
element.removeEventListener('transitionend', handleMotionEnd);
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
motionTimeout = window.setTimeout(() => {
|
|
197
|
+
complete();
|
|
198
|
+
}, totalMotionTime + 50);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function clearPendingStandaloneTriggerCloseFocus() {
|
|
203
|
+
if (pendingStandaloneTriggerCloseFocusFrame === undefined) return;
|
|
204
|
+
cancelAnimationFrame(pendingStandaloneTriggerCloseFocusFrame);
|
|
205
|
+
pendingStandaloneTriggerCloseFocusFrame = undefined;
|
|
84
206
|
}
|
|
85
207
|
|
|
86
|
-
function
|
|
208
|
+
function clearStandaloneTriggerTracking() {
|
|
209
|
+
clearPendingStandaloneTriggerCloseFocus();
|
|
210
|
+
cleanupStandaloneTriggerBlurListener?.();
|
|
211
|
+
cleanupStandaloneTriggerBlurListener = undefined;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function applyStandaloneTriggerCloseState(
|
|
215
|
+
trigger: HTMLElement,
|
|
216
|
+
reason: PopoverCloseReason,
|
|
217
|
+
event?: Event
|
|
218
|
+
) {
|
|
219
|
+
clearStandaloneTriggerTracking();
|
|
220
|
+
pendingStandaloneTriggerCloseFocusFrame = requestAnimationFrame(() => {
|
|
221
|
+
pendingStandaloneTriggerCloseFocusFrame = undefined;
|
|
222
|
+
if (!trigger.isConnected) return;
|
|
223
|
+
applyTriggerCloseFocusState(trigger, reason, event);
|
|
224
|
+
|
|
225
|
+
const cleanupTriggerBlur = addTriggerBlurCleanup(trigger, true);
|
|
226
|
+
const handleDocumentFocusIn = (focusEvent: FocusEvent) => {
|
|
227
|
+
const target = focusEvent.target;
|
|
228
|
+
if (target === trigger) return;
|
|
229
|
+
if (target instanceof Node && trigger.contains(target)) return;
|
|
230
|
+
clearTriggerFocusState(trigger);
|
|
231
|
+
document.removeEventListener('focusin', handleDocumentFocusIn);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
document.addEventListener('focusin', handleDocumentFocusIn);
|
|
235
|
+
cleanupStandaloneTriggerBlurListener = () => {
|
|
236
|
+
cleanupTriggerBlur();
|
|
237
|
+
document.removeEventListener('focusin', handleDocumentFocusIn);
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function close(reason: PopoverCloseReason = 'imperative-action', event?: Event) {
|
|
87
243
|
if (isStandalone) {
|
|
88
|
-
|
|
244
|
+
let canceled = false;
|
|
245
|
+
const details: PopoverOpenChangeDetails = {
|
|
246
|
+
reason,
|
|
247
|
+
event,
|
|
248
|
+
cancel: () => {
|
|
249
|
+
canceled = true;
|
|
250
|
+
},
|
|
251
|
+
get isCanceled() {
|
|
252
|
+
return canceled;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
onOpenChangeProp?.(false, details);
|
|
257
|
+
if (details.isCanceled) return;
|
|
258
|
+
if (triggerRefProp) {
|
|
259
|
+
applyStandaloneTriggerCloseState(triggerRefProp, reason, event);
|
|
260
|
+
}
|
|
89
261
|
} else {
|
|
90
|
-
ctx!.
|
|
262
|
+
ctx!.close(reason, event);
|
|
91
263
|
}
|
|
92
264
|
}
|
|
93
265
|
|
|
94
266
|
function handleKeydown(event: KeyboardEvent) {
|
|
95
267
|
if (event.key === 'Escape' && isOpen && shouldCloseOnEscape) {
|
|
96
268
|
event.preventDefault();
|
|
97
|
-
close();
|
|
269
|
+
close('escape-key', event);
|
|
98
270
|
}
|
|
99
271
|
}
|
|
100
272
|
|
|
@@ -107,7 +279,7 @@
|
|
|
107
279
|
const focusInTrigger = triggerRef?.contains(target) || target === triggerRef;
|
|
108
280
|
|
|
109
281
|
if (!focusInPopover && !focusInTrigger) {
|
|
110
|
-
|
|
282
|
+
close('focus-out', event);
|
|
111
283
|
}
|
|
112
284
|
}
|
|
113
285
|
|
|
@@ -121,10 +293,28 @@
|
|
|
121
293
|
|
|
122
294
|
// Only close on external scroll
|
|
123
295
|
if (!isInsidePopover && !isInsideTrigger) {
|
|
124
|
-
close();
|
|
296
|
+
close('outside-press', event);
|
|
125
297
|
}
|
|
126
298
|
}
|
|
127
299
|
|
|
300
|
+
$effect(() => {
|
|
301
|
+
if (!isStandalone) {
|
|
302
|
+
if (trackedStandaloneTrigger) {
|
|
303
|
+
clearTriggerFocusState(trackedStandaloneTrigger);
|
|
304
|
+
}
|
|
305
|
+
trackedStandaloneTrigger = null;
|
|
306
|
+
clearStandaloneTriggerTracking();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (trackedStandaloneTrigger && trackedStandaloneTrigger !== triggerRefProp) {
|
|
311
|
+
clearTriggerFocusState(trackedStandaloneTrigger);
|
|
312
|
+
clearStandaloneTriggerTracking();
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
trackedStandaloneTrigger = triggerRefProp;
|
|
316
|
+
});
|
|
317
|
+
|
|
128
318
|
onMount(() => {
|
|
129
319
|
if (!browser) return;
|
|
130
320
|
document.addEventListener('keydown', handleKeydown);
|
|
@@ -134,28 +324,91 @@
|
|
|
134
324
|
|
|
135
325
|
onDestroy(() => {
|
|
136
326
|
if (!browser) return;
|
|
327
|
+
if (trackedStandaloneTrigger) {
|
|
328
|
+
clearTriggerFocusState(trackedStandaloneTrigger);
|
|
329
|
+
}
|
|
330
|
+
clearMotionTracking();
|
|
331
|
+
clearStandaloneTriggerTracking();
|
|
137
332
|
document.removeEventListener('keydown', handleKeydown);
|
|
138
333
|
document.removeEventListener('focusin', handleDocumentFocusIn);
|
|
139
334
|
document.removeEventListener('scroll', handleScroll, true);
|
|
140
335
|
});
|
|
336
|
+
|
|
337
|
+
$effect(() => {
|
|
338
|
+
if (isOpen) {
|
|
339
|
+
const shouldAnimateIn = !isMounted || isExiting;
|
|
340
|
+
isMounted = true;
|
|
341
|
+
isExiting = false;
|
|
342
|
+
if (shouldAnimateIn) {
|
|
343
|
+
isEntering = true;
|
|
344
|
+
}
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (!isMounted) {
|
|
349
|
+
isEntering = false;
|
|
350
|
+
isExiting = false;
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
isEntering = false;
|
|
355
|
+
isExiting = true;
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
$effect(() => {
|
|
359
|
+
if (!isMounted || !popoverRef) {
|
|
360
|
+
clearMotionTracking();
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (isEntering) {
|
|
365
|
+
trackMotion('enter', popoverRef);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (isExiting) {
|
|
370
|
+
trackMotion('exit', popoverRef);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
clearMotionTracking();
|
|
375
|
+
});
|
|
141
376
|
</script>
|
|
142
377
|
|
|
143
|
-
{#if
|
|
378
|
+
{#if isMounted}
|
|
144
379
|
<Portal>
|
|
145
380
|
<div
|
|
146
381
|
bind:this={popoverRef}
|
|
147
382
|
class={className}
|
|
148
383
|
role="dialog"
|
|
149
|
-
aria-modal={isModal}
|
|
150
|
-
|
|
384
|
+
aria-modal={isOpen ? isModal : undefined}
|
|
385
|
+
aria-hidden={isOpen ? undefined : 'true'}
|
|
386
|
+
inert={!isOpen}
|
|
387
|
+
data-state={isOpen ? 'open' : 'closed'}
|
|
388
|
+
data-entering={isEntering || undefined}
|
|
389
|
+
data-exiting={isExiting || undefined}
|
|
390
|
+
data-placement={resolvedPlacement}
|
|
391
|
+
use:floating={{
|
|
392
|
+
anchor: triggerRef,
|
|
393
|
+
offset,
|
|
394
|
+
placement,
|
|
395
|
+
shouldFlip,
|
|
396
|
+
boundaryElement,
|
|
397
|
+
onPositionUpdate: (_, __, finalPlacement) => {
|
|
398
|
+
resolvedPlacement = resolvePlacementSide(finalPlacement);
|
|
399
|
+
}
|
|
400
|
+
}}
|
|
151
401
|
use:clickOutside={{
|
|
152
|
-
handler:
|
|
153
|
-
|
|
402
|
+
handler: (event) => {
|
|
403
|
+
event.preventDefault();
|
|
404
|
+
close('outside-press', event);
|
|
405
|
+
},
|
|
406
|
+
enabled: isOpen && shouldCloseOnInteractOutside,
|
|
154
407
|
ignore: [triggerRef]
|
|
155
408
|
}}
|
|
156
|
-
use:focusTrap={isModal}
|
|
157
|
-
use:scrollLock={isModal}
|
|
158
|
-
use:ariaHideOutside={isModal}
|
|
409
|
+
use:focusTrap={{ enabled: isOpen && isModal, restoreFocus: false, initialFocus }}
|
|
410
|
+
use:scrollLock={isOpen && isModal}
|
|
411
|
+
use:ariaHideOutside={isOpen && isModal}
|
|
159
412
|
style="position: fixed; z-index: 9999;"
|
|
160
413
|
{...restProps}
|
|
161
414
|
>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
3
|
import { type ExtendedPlacement } from '../../primitives/floating';
|
|
4
|
+
import { type FocusTrapOptions } from '../../primitives/focus-trap';
|
|
5
|
+
import { type PopoverOpenChangeDetails } from '../root/context';
|
|
4
6
|
/**
|
|
5
7
|
* Popover.Content - The floating content panel.
|
|
6
8
|
* Can be used inside Popover.Root (reads context) or standalone (props required).
|
|
@@ -26,12 +28,14 @@ type PopoverContentProps = {
|
|
|
26
28
|
shouldCloseOnEscape?: boolean;
|
|
27
29
|
/** Whether losing focus (blur) should close the popover. Defaults to true for non-modal popovers. */
|
|
28
30
|
shouldCloseOnBlur?: boolean;
|
|
31
|
+
/** Element or selector to focus first when modal trap activates. */
|
|
32
|
+
initialFocus?: FocusTrapOptions['initialFocus'];
|
|
29
33
|
/** Controlled open state (standalone mode). */
|
|
30
34
|
open?: boolean;
|
|
31
35
|
/** Reference to the trigger element (standalone mode). */
|
|
32
36
|
triggerRef?: HTMLElement | null;
|
|
33
37
|
/** Callback when open state changes (standalone mode). */
|
|
34
|
-
onOpenChange?: (open: boolean) => void;
|
|
38
|
+
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
35
39
|
} & Omit<HTMLAttributes<HTMLDivElement>, 'class' | 'children'>;
|
|
36
40
|
declare const PopoverContent: import("svelte").Component<PopoverContentProps, {}, "">;
|
|
37
41
|
type PopoverContent = ReturnType<typeof PopoverContent>;
|
package/dist/popover/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * as Popover from './index.parts.
|
|
1
|
+
export * as Popover from './index.parts.js';
|
|
2
2
|
export { default as PopoverRoot } from './root/popover-root.svelte';
|
|
3
3
|
export { default as PopoverContent } from './content/popover-content.svelte';
|
|
4
4
|
export { default as PopoverTrigger } from './trigger/popover-trigger.svelte';
|
|
5
5
|
export { default as PopoverTriggerButton } from './trigger/popover-trigger-button.svelte';
|
|
6
|
-
export { getPopoverContext, setPopoverContext, type PopoverContext,
|
|
7
|
-
import * as PopoverParts from './index.parts.
|
|
6
|
+
export { getPopoverContext, setPopoverContext, type PopoverContext, type PopoverCanonicalCloseReason, type PopoverCloseReason, type PopoverOpenReason, type PopoverChangeReason, type PopoverOpenChangeDetails } from './root/context.js';
|
|
7
|
+
import * as PopoverParts from './index.parts.js';
|
|
8
8
|
export default PopoverParts;
|
package/dist/popover/index.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
// Namespace export for component composition: <Popover.Root>, <Popover.Trigger>, etc.
|
|
2
|
-
export * as Popover from './index.parts.
|
|
2
|
+
export * as Popover from './index.parts.js';
|
|
3
3
|
// Direct named exports for individual imports
|
|
4
4
|
export { default as PopoverRoot } from './root/popover-root.svelte';
|
|
5
5
|
export { default as PopoverContent } from './content/popover-content.svelte';
|
|
6
6
|
export { default as PopoverTrigger } from './trigger/popover-trigger.svelte';
|
|
7
7
|
export { default as PopoverTriggerButton } from './trigger/popover-trigger-button.svelte';
|
|
8
8
|
// Context and types
|
|
9
|
-
export { getPopoverContext, setPopoverContext
|
|
10
|
-
// Legacy aliases
|
|
11
|
-
getPopoverTriggerContext, setPopoverTriggerContext } from './root/context.ts';
|
|
9
|
+
export { getPopoverContext, setPopoverContext } from './root/context.js';
|
|
12
10
|
// Default export as namespace object
|
|
13
|
-
import * as PopoverParts from './index.parts.
|
|
11
|
+
import * as PopoverParts from './index.parts.js';
|
|
14
12
|
export default PopoverParts;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Popover Root
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Popover.Root
|
|
6
|
+
|
|
7
|
+
Name: `Popover.Root`
|
|
8
|
+
Description: Root state container that controls open state, trigger ref, and toggle/open/close actions.
|
|
9
|
+
|
|
10
|
+
- `open`: `boolean` (default: `undefined`) — Controlled open state. Supports `bind:open`.
|
|
11
|
+
- `defaultOpen`: `boolean` (default: `false`) — Initial open state in uncontrolled mode.
|
|
12
|
+
- `onOpenChange`: `(open: boolean, details) => void` (default: `undefined`) — Called whenever open state changes. `details` includes `reason`, optional `event`, `cancel()`, and `isCanceled`.
|
|
13
|
+
- `triggerRef`: `HTMLElement | null` (default: `null`) — Trigger reference. Supports `bind:triggerRef`.
|
|
14
|
+
- `children`: `Snippet` (default: `undefined`) — Composed trigger and content parts.
|
|
15
|
+
|
|
16
|
+
### Context utilities
|
|
17
|
+
|
|
18
|
+
Name: `context.ts` helpers
|
|
19
|
+
Description: Context APIs used by trigger and content parts.
|
|
20
|
+
|
|
21
|
+
| Prop | Type | Default | Description |
|
|
22
|
+
| ------------------- | ----------------------------------- | ------- | ---------------------------------------- |
|
|
23
|
+
| `setPopoverContext` | `(ctx: PopoverContext) => void` | `-` | Registers popover context. |
|
|
24
|
+
| `getPopoverContext` | `() => PopoverContext \| undefined` | `-` | Returns popover context when available. |
|
|
25
|
+
| `PopoverContext` | `type` | `-` | Context contract with state and actions. |
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
export type PopoverCanonicalCloseReason = 'escape-key' | 'outside-press' | 'focus-out' | 'close-press' | 'imperative-action' | 'none';
|
|
2
|
+
export type PopoverCloseReason = PopoverCanonicalCloseReason;
|
|
3
|
+
export type PopoverOpenReason = 'trigger-press' | 'imperative-action' | 'none';
|
|
4
|
+
export type PopoverChangeReason = PopoverOpenReason | PopoverCloseReason;
|
|
5
|
+
export type PopoverOpenChangeDetails = {
|
|
6
|
+
reason: PopoverChangeReason;
|
|
7
|
+
event?: Event;
|
|
8
|
+
cancel: () => void;
|
|
9
|
+
isCanceled: boolean;
|
|
10
|
+
};
|
|
1
11
|
/**
|
|
2
12
|
* Context shared between Popover components (Root, Trigger, Content).
|
|
3
13
|
*/
|
|
4
14
|
export type PopoverContext = {
|
|
15
|
+
/** Reason why popover is closing */
|
|
16
|
+
closeReason: PopoverCanonicalCloseReason;
|
|
5
17
|
/** Whether the popover is open */
|
|
6
18
|
isOpen: boolean;
|
|
7
19
|
/** Reference to the trigger element */
|
|
@@ -9,16 +21,13 @@ export type PopoverContext = {
|
|
|
9
21
|
/** Set the trigger ref (used by Trigger component) */
|
|
10
22
|
setTriggerRef: (el: HTMLElement | null) => void;
|
|
11
23
|
/** Toggle popover open state */
|
|
12
|
-
toggle: () => void;
|
|
24
|
+
toggle: (reason?: PopoverOpenReason, event?: Event) => void;
|
|
13
25
|
/** Open the popover */
|
|
14
|
-
open: () => void;
|
|
26
|
+
open: (reason?: PopoverOpenReason, event?: Event) => void;
|
|
15
27
|
/** Close the popover and return focus to trigger */
|
|
16
|
-
close: () => void;
|
|
28
|
+
close: (reason?: PopoverCloseReason, event?: Event) => void;
|
|
17
29
|
/** Called when popover open state changes */
|
|
18
|
-
onOpenChange: (open: boolean) => void;
|
|
30
|
+
onOpenChange: (open: boolean, details: PopoverOpenChangeDetails) => void;
|
|
19
31
|
};
|
|
20
32
|
export declare function setPopoverContext(ctx: PopoverContext): void;
|
|
21
33
|
export declare function getPopoverContext(): PopoverContext | undefined;
|
|
22
|
-
export type PopoverTriggerContext = PopoverContext;
|
|
23
|
-
export declare const setPopoverTriggerContext: typeof setPopoverContext;
|
|
24
|
-
export declare const getPopoverTriggerContext: typeof getPopoverContext;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PopoverCloseReason } from './context';
|
|
2
|
+
export declare function clearTriggerFocusState(trigger: HTMLElement): void;
|
|
3
|
+
export declare function applyTriggerCloseFocusState(trigger: HTMLElement, reason: PopoverCloseReason, event?: Event): void;
|
|
4
|
+
export declare function addTriggerBlurCleanup(trigger: HTMLElement, once?: boolean): () => void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { focusWithModality, resolveCloseInteractionModality } from '../../primitives/input-modality';
|
|
2
|
+
export function clearTriggerFocusState(trigger) {
|
|
3
|
+
delete trigger.dataset.focused;
|
|
4
|
+
delete trigger.dataset.focusVisible;
|
|
5
|
+
}
|
|
6
|
+
export function applyTriggerCloseFocusState(trigger, reason, event) {
|
|
7
|
+
const closeModality = resolveCloseInteractionModality(reason, event);
|
|
8
|
+
focusWithModality(trigger, closeModality);
|
|
9
|
+
if (reason === 'outside-press' || reason === 'escape-key') {
|
|
10
|
+
trigger.dataset.focused = 'true';
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
delete trigger.dataset.focused;
|
|
14
|
+
}
|
|
15
|
+
if (closeModality === 'keyboard') {
|
|
16
|
+
trigger.dataset.focusVisible = 'true';
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
delete trigger.dataset.focusVisible;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function addTriggerBlurCleanup(trigger, once = false) {
|
|
23
|
+
const handleBlur = () => {
|
|
24
|
+
clearTriggerFocusState(trigger);
|
|
25
|
+
if (once) {
|
|
26
|
+
trigger.removeEventListener('blur', handleBlur);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
trigger.addEventListener('blur', handleBlur);
|
|
30
|
+
return () => {
|
|
31
|
+
trigger.removeEventListener('blur', handleBlur);
|
|
32
|
+
};
|
|
33
|
+
}
|