@llui/components 0.0.11 → 0.0.14
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/components/accordion.js +1 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +1 -1
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +2 -1
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/angle-slider.js +2 -1
- package/dist/components/angle-slider.js.map +1 -0
- package/dist/components/async-list.js +1 -0
- package/dist/components/async-list.js.map +1 -0
- package/dist/components/avatar.js +1 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/carousel.js +2 -1
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/cascade-select.js +2 -1
- package/dist/components/cascade-select.js.map +1 -0
- package/dist/components/checkbox.js +1 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/clipboard.js +2 -1
- package/dist/components/clipboard.js.map +1 -0
- package/dist/components/collapsible.js +1 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/color-picker.js +2 -1
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +4 -3
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/context-menu.js +2 -1
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/date-input.js +2 -1
- package/dist/components/date-input.js.map +1 -0
- package/dist/components/date-picker.js +3 -2
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.js +6 -5
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.js +6 -5
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/editable.js +1 -0
- package/dist/components/editable.js.map +1 -0
- package/dist/components/file-upload.js +2 -1
- package/dist/components/file-upload.js.map +1 -0
- package/dist/components/floating-panel.js +2 -1
- package/dist/components/floating-panel.js.map +1 -0
- package/dist/components/form.js +1 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/hover-card.d.ts +1 -1
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +2 -1
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/image-cropper.js +2 -1
- package/dist/components/image-cropper.js.map +1 -0
- package/dist/components/in-view.js +1 -0
- package/dist/components/in-view.js.map +1 -0
- package/dist/components/index.d.ts +119 -119
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +62 -61
- package/dist/components/index.js.map +1 -0
- package/dist/components/listbox.js +2 -1
- package/dist/components/listbox.js.map +1 -0
- package/dist/components/marquee.js +1 -0
- package/dist/components/marquee.js.map +1 -0
- package/dist/components/menu.d.ts +1 -1
- package/dist/components/menu.d.ts.map +1 -1
- package/dist/components/menu.js +4 -3
- package/dist/components/menu.js.map +1 -0
- package/dist/components/navigation-menu.js +2 -1
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/number-input.js +2 -1
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/pagination.js +2 -1
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/password-input.js +2 -1
- package/dist/components/password-input.js.map +1 -0
- package/dist/components/pin-input.js +3 -2
- package/dist/components/pin-input.js.map +1 -0
- package/dist/components/popover.d.ts +1 -1
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +5 -4
- package/dist/components/popover.js.map +1 -0
- package/dist/components/presence.js +1 -0
- package/dist/components/presence.js.map +1 -0
- package/dist/components/progress.js +2 -1
- package/dist/components/progress.js.map +1 -0
- package/dist/components/qr-code.js +2 -1
- package/dist/components/qr-code.js.map +1 -0
- package/dist/components/radio-group.js +2 -1
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/rating-group.js +2 -1
- package/dist/components/rating-group.js.map +1 -0
- package/dist/components/scroll-area.js +1 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +1 -1
- package/dist/components/select.d.ts.map +1 -1
- package/dist/components/select.js +4 -3
- package/dist/components/select.js.map +1 -0
- package/dist/components/signature-pad.js +2 -1
- package/dist/components/signature-pad.js.map +1 -0
- package/dist/components/slider.js +2 -1
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sortable.js +1 -0
- package/dist/components/sortable.js.map +1 -0
- package/dist/components/splitter.js +2 -1
- package/dist/components/splitter.js.map +1 -0
- package/dist/components/steps.js +2 -1
- package/dist/components/steps.js.map +1 -0
- package/dist/components/switch.js +1 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.js +2 -1
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/tags-input.js +3 -2
- package/dist/components/tags-input.js.map +1 -0
- package/dist/components/theme-switch.js +1 -0
- package/dist/components/theme-switch.js.map +1 -0
- package/dist/components/time-picker.js +2 -1
- package/dist/components/time-picker.js.map +1 -0
- package/dist/components/timer.js +2 -1
- package/dist/components/timer.js.map +1 -0
- package/dist/components/toast.js +2 -1
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toc.js +2 -1
- package/dist/components/toc.js.map +1 -0
- package/dist/components/toggle-group.js +2 -1
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.js +1 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.d.ts +1 -1
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +2 -1
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tour.js +2 -1
- package/dist/components/tour.js.map +1 -0
- package/dist/components/tree-view.js +3 -2
- package/dist/components/tree-view.js.map +1 -0
- package/dist/format/cache.js +1 -0
- package/dist/format/cache.js.map +1 -0
- package/dist/format/defaults.js +1 -0
- package/dist/format/defaults.js.map +1 -0
- package/dist/format/format-date.js +3 -2
- package/dist/format/format-date.js.map +1 -0
- package/dist/format/format-display-name.js +3 -2
- package/dist/format/format-display-name.js.map +1 -0
- package/dist/format/format-file-size.js +3 -2
- package/dist/format/format-file-size.js.map +1 -0
- package/dist/format/format-list.js +3 -2
- package/dist/format/format-list.js.map +1 -0
- package/dist/format/format-number.js +3 -2
- package/dist/format/format-number.js.map +1 -0
- package/dist/format/format-plural.js +3 -2
- package/dist/format/format-plural.js.map +1 -0
- package/dist/format/format-relative-time.js +3 -2
- package/dist/format/format-relative-time.js.map +1 -0
- package/dist/format/index.d.ts +7 -7
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +8 -7
- package/dist/format/index.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -0
- package/dist/locale.js +1 -0
- package/dist/locale.js.map +1 -0
- package/dist/patterns/confirm-dialog.d.ts +1 -1
- package/dist/patterns/confirm-dialog.d.ts.map +1 -1
- package/dist/patterns/confirm-dialog.js +2 -1
- package/dist/patterns/confirm-dialog.js.map +1 -0
- package/dist/patterns/index.d.ts +2 -2
- package/dist/patterns/index.d.ts.map +1 -1
- package/dist/patterns/index.js +2 -1
- package/dist/patterns/index.js.map +1 -0
- package/dist/styles/classes/accordion.d.ts +1 -1
- package/dist/styles/classes/accordion.d.ts.map +1 -1
- package/dist/styles/classes/accordion.js +2 -1
- package/dist/styles/classes/accordion.js.map +1 -0
- package/dist/styles/classes/angle-slider.d.ts +1 -1
- package/dist/styles/classes/angle-slider.d.ts.map +1 -1
- package/dist/styles/classes/angle-slider.js +2 -1
- package/dist/styles/classes/angle-slider.js.map +1 -0
- package/dist/styles/classes/async-list.d.ts +1 -1
- package/dist/styles/classes/async-list.d.ts.map +1 -1
- package/dist/styles/classes/async-list.js +1 -0
- package/dist/styles/classes/async-list.js.map +1 -0
- package/dist/styles/classes/avatar.d.ts +1 -1
- package/dist/styles/classes/avatar.d.ts.map +1 -1
- package/dist/styles/classes/avatar.js +2 -1
- package/dist/styles/classes/avatar.js.map +1 -0
- package/dist/styles/classes/carousel.d.ts +1 -1
- package/dist/styles/classes/carousel.d.ts.map +1 -1
- package/dist/styles/classes/carousel.js +2 -1
- package/dist/styles/classes/carousel.js.map +1 -0
- package/dist/styles/classes/cascade-select.d.ts +1 -1
- package/dist/styles/classes/cascade-select.d.ts.map +1 -1
- package/dist/styles/classes/cascade-select.js +2 -1
- package/dist/styles/classes/cascade-select.js.map +1 -0
- package/dist/styles/classes/checkbox.d.ts +1 -1
- package/dist/styles/classes/checkbox.d.ts.map +1 -1
- package/dist/styles/classes/checkbox.js +2 -1
- package/dist/styles/classes/checkbox.js.map +1 -0
- package/dist/styles/classes/clipboard.d.ts +1 -1
- package/dist/styles/classes/clipboard.d.ts.map +1 -1
- package/dist/styles/classes/clipboard.js +1 -0
- package/dist/styles/classes/clipboard.js.map +1 -0
- package/dist/styles/classes/collapsible.d.ts +1 -1
- package/dist/styles/classes/collapsible.d.ts.map +1 -1
- package/dist/styles/classes/collapsible.js +2 -1
- package/dist/styles/classes/collapsible.js.map +1 -0
- package/dist/styles/classes/color-picker.d.ts +1 -1
- package/dist/styles/classes/color-picker.d.ts.map +1 -1
- package/dist/styles/classes/color-picker.js +1 -0
- package/dist/styles/classes/color-picker.js.map +1 -0
- package/dist/styles/classes/combobox.d.ts +1 -1
- package/dist/styles/classes/combobox.d.ts.map +1 -1
- package/dist/styles/classes/combobox.js +2 -1
- package/dist/styles/classes/combobox.js.map +1 -0
- package/dist/styles/classes/context-menu.d.ts +1 -1
- package/dist/styles/classes/context-menu.d.ts.map +1 -1
- package/dist/styles/classes/context-menu.js +2 -1
- package/dist/styles/classes/context-menu.js.map +1 -0
- package/dist/styles/classes/date-input.d.ts +1 -1
- package/dist/styles/classes/date-input.d.ts.map +1 -1
- package/dist/styles/classes/date-input.js +2 -1
- package/dist/styles/classes/date-input.js.map +1 -0
- package/dist/styles/classes/date-picker.d.ts +1 -1
- package/dist/styles/classes/date-picker.d.ts.map +1 -1
- package/dist/styles/classes/date-picker.js +2 -1
- package/dist/styles/classes/date-picker.js.map +1 -0
- package/dist/styles/classes/dialog.d.ts +1 -1
- package/dist/styles/classes/dialog.d.ts.map +1 -1
- package/dist/styles/classes/dialog.js +2 -1
- package/dist/styles/classes/dialog.js.map +1 -0
- package/dist/styles/classes/drawer.d.ts +1 -1
- package/dist/styles/classes/drawer.d.ts.map +1 -1
- package/dist/styles/classes/drawer.js +2 -1
- package/dist/styles/classes/drawer.js.map +1 -0
- package/dist/styles/classes/editable.d.ts +1 -1
- package/dist/styles/classes/editable.d.ts.map +1 -1
- package/dist/styles/classes/editable.js +2 -1
- package/dist/styles/classes/editable.js.map +1 -0
- package/dist/styles/classes/file-upload.d.ts +1 -1
- package/dist/styles/classes/file-upload.d.ts.map +1 -1
- package/dist/styles/classes/file-upload.js +1 -0
- package/dist/styles/classes/file-upload.js.map +1 -0
- package/dist/styles/classes/floating-panel.d.ts +1 -1
- package/dist/styles/classes/floating-panel.d.ts.map +1 -1
- package/dist/styles/classes/floating-panel.js +2 -1
- package/dist/styles/classes/floating-panel.js.map +1 -0
- package/dist/styles/classes/hover-card.d.ts +1 -1
- package/dist/styles/classes/hover-card.d.ts.map +1 -1
- package/dist/styles/classes/hover-card.js +2 -1
- package/dist/styles/classes/hover-card.js.map +1 -0
- package/dist/styles/classes/image-cropper.d.ts +1 -1
- package/dist/styles/classes/image-cropper.d.ts.map +1 -1
- package/dist/styles/classes/image-cropper.js +1 -0
- package/dist/styles/classes/image-cropper.js.map +1 -0
- package/dist/styles/classes/index.d.ts +53 -53
- package/dist/styles/classes/index.d.ts.map +1 -1
- package/dist/styles/classes/index.js +54 -53
- package/dist/styles/classes/index.js.map +1 -0
- package/dist/styles/classes/listbox.d.ts +1 -1
- package/dist/styles/classes/listbox.d.ts.map +1 -1
- package/dist/styles/classes/listbox.js +2 -1
- package/dist/styles/classes/listbox.js.map +1 -0
- package/dist/styles/classes/marquee.d.ts +1 -1
- package/dist/styles/classes/marquee.d.ts.map +1 -1
- package/dist/styles/classes/marquee.js +1 -0
- package/dist/styles/classes/marquee.js.map +1 -0
- package/dist/styles/classes/menu.d.ts +1 -1
- package/dist/styles/classes/menu.d.ts.map +1 -1
- package/dist/styles/classes/menu.js +2 -1
- package/dist/styles/classes/menu.js.map +1 -0
- package/dist/styles/classes/navigation-menu.d.ts +1 -1
- package/dist/styles/classes/navigation-menu.d.ts.map +1 -1
- package/dist/styles/classes/navigation-menu.js +1 -0
- package/dist/styles/classes/navigation-menu.js.map +1 -0
- package/dist/styles/classes/number-input.d.ts +1 -1
- package/dist/styles/classes/number-input.d.ts.map +1 -1
- package/dist/styles/classes/number-input.js +2 -1
- package/dist/styles/classes/number-input.js.map +1 -0
- package/dist/styles/classes/pagination.d.ts +1 -1
- package/dist/styles/classes/pagination.d.ts.map +1 -1
- package/dist/styles/classes/pagination.js +2 -1
- package/dist/styles/classes/pagination.js.map +1 -0
- package/dist/styles/classes/password-input.d.ts +1 -1
- package/dist/styles/classes/password-input.d.ts.map +1 -1
- package/dist/styles/classes/password-input.js +2 -1
- package/dist/styles/classes/password-input.js.map +1 -0
- package/dist/styles/classes/pin-input.d.ts +1 -1
- package/dist/styles/classes/pin-input.d.ts.map +1 -1
- package/dist/styles/classes/pin-input.js +2 -1
- package/dist/styles/classes/pin-input.js.map +1 -0
- package/dist/styles/classes/popover.d.ts +1 -1
- package/dist/styles/classes/popover.d.ts.map +1 -1
- package/dist/styles/classes/popover.js +2 -1
- package/dist/styles/classes/popover.js.map +1 -0
- package/dist/styles/classes/presence.d.ts +1 -1
- package/dist/styles/classes/presence.d.ts.map +1 -1
- package/dist/styles/classes/presence.js +1 -0
- package/dist/styles/classes/presence.js.map +1 -0
- package/dist/styles/classes/progress.d.ts +1 -1
- package/dist/styles/classes/progress.d.ts.map +1 -1
- package/dist/styles/classes/progress.js +2 -1
- package/dist/styles/classes/progress.js.map +1 -0
- package/dist/styles/classes/qr-code.d.ts +1 -1
- package/dist/styles/classes/qr-code.d.ts.map +1 -1
- package/dist/styles/classes/qr-code.js +1 -0
- package/dist/styles/classes/qr-code.js.map +1 -0
- package/dist/styles/classes/radio-group.d.ts +1 -1
- package/dist/styles/classes/radio-group.d.ts.map +1 -1
- package/dist/styles/classes/radio-group.js +2 -1
- package/dist/styles/classes/radio-group.js.map +1 -0
- package/dist/styles/classes/rating-group.d.ts +1 -1
- package/dist/styles/classes/rating-group.d.ts.map +1 -1
- package/dist/styles/classes/rating-group.js +2 -1
- package/dist/styles/classes/rating-group.js.map +1 -0
- package/dist/styles/classes/scroll-area.d.ts +1 -1
- package/dist/styles/classes/scroll-area.d.ts.map +1 -1
- package/dist/styles/classes/scroll-area.js +1 -0
- package/dist/styles/classes/scroll-area.js.map +1 -0
- package/dist/styles/classes/select.d.ts +1 -1
- package/dist/styles/classes/select.d.ts.map +1 -1
- package/dist/styles/classes/select.js +2 -1
- package/dist/styles/classes/select.js.map +1 -0
- package/dist/styles/classes/signature-pad.d.ts +1 -1
- package/dist/styles/classes/signature-pad.d.ts.map +1 -1
- package/dist/styles/classes/signature-pad.js +1 -0
- package/dist/styles/classes/signature-pad.js.map +1 -0
- package/dist/styles/classes/slider.d.ts +1 -1
- package/dist/styles/classes/slider.d.ts.map +1 -1
- package/dist/styles/classes/slider.js +2 -1
- package/dist/styles/classes/slider.js.map +1 -0
- package/dist/styles/classes/splitter.d.ts +1 -1
- package/dist/styles/classes/splitter.d.ts.map +1 -1
- package/dist/styles/classes/splitter.js +2 -1
- package/dist/styles/classes/splitter.js.map +1 -0
- package/dist/styles/classes/steps.d.ts +1 -1
- package/dist/styles/classes/steps.d.ts.map +1 -1
- package/dist/styles/classes/steps.js +2 -1
- package/dist/styles/classes/steps.js.map +1 -0
- package/dist/styles/classes/switch.d.ts +1 -1
- package/dist/styles/classes/switch.d.ts.map +1 -1
- package/dist/styles/classes/switch.js +2 -1
- package/dist/styles/classes/switch.js.map +1 -0
- package/dist/styles/classes/tabs.d.ts +1 -1
- package/dist/styles/classes/tabs.d.ts.map +1 -1
- package/dist/styles/classes/tabs.js +2 -1
- package/dist/styles/classes/tabs.js.map +1 -0
- package/dist/styles/classes/tags-input.d.ts +1 -1
- package/dist/styles/classes/tags-input.d.ts.map +1 -1
- package/dist/styles/classes/tags-input.js +2 -1
- package/dist/styles/classes/tags-input.js.map +1 -0
- package/dist/styles/classes/time-picker.d.ts +1 -1
- package/dist/styles/classes/time-picker.d.ts.map +1 -1
- package/dist/styles/classes/time-picker.js +2 -1
- package/dist/styles/classes/time-picker.js.map +1 -0
- package/dist/styles/classes/timer.d.ts +1 -1
- package/dist/styles/classes/timer.d.ts.map +1 -1
- package/dist/styles/classes/timer.js +2 -1
- package/dist/styles/classes/timer.js.map +1 -0
- package/dist/styles/classes/toast.d.ts +1 -1
- package/dist/styles/classes/toast.d.ts.map +1 -1
- package/dist/styles/classes/toast.js +2 -1
- package/dist/styles/classes/toast.js.map +1 -0
- package/dist/styles/classes/toc.d.ts +1 -1
- package/dist/styles/classes/toc.d.ts.map +1 -1
- package/dist/styles/classes/toc.js +2 -1
- package/dist/styles/classes/toc.js.map +1 -0
- package/dist/styles/classes/toggle-group.d.ts +1 -1
- package/dist/styles/classes/toggle-group.d.ts.map +1 -1
- package/dist/styles/classes/toggle-group.js +2 -1
- package/dist/styles/classes/toggle-group.js.map +1 -0
- package/dist/styles/classes/toggle.d.ts +1 -1
- package/dist/styles/classes/toggle.d.ts.map +1 -1
- package/dist/styles/classes/toggle.js +2 -1
- package/dist/styles/classes/toggle.js.map +1 -0
- package/dist/styles/classes/tooltip.d.ts +1 -1
- package/dist/styles/classes/tooltip.d.ts.map +1 -1
- package/dist/styles/classes/tooltip.js +2 -1
- package/dist/styles/classes/tooltip.js.map +1 -0
- package/dist/styles/classes/tour.d.ts +1 -1
- package/dist/styles/classes/tour.d.ts.map +1 -1
- package/dist/styles/classes/tour.js +1 -0
- package/dist/styles/classes/tour.js.map +1 -0
- package/dist/styles/classes/tree-view.d.ts +1 -1
- package/dist/styles/classes/tree-view.d.ts.map +1 -1
- package/dist/styles/classes/tree-view.js +2 -1
- package/dist/styles/classes/tree-view.js.map +1 -0
- package/dist/styles/index.d.ts +4 -4
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +3 -2
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/theme.js +1 -0
- package/dist/styles/theme.js.map +1 -0
- package/dist/styles/utils/cx.js +1 -0
- package/dist/styles/utils/cx.js.map +1 -0
- package/dist/styles/utils/index.d.ts +2 -2
- package/dist/styles/utils/index.d.ts.map +1 -1
- package/dist/styles/utils/index.js +3 -2
- package/dist/styles/utils/index.js.map +1 -0
- package/dist/styles/utils/variants.js +2 -1
- package/dist/styles/utils/variants.js.map +1 -0
- package/dist/utils/anatomy.js +1 -0
- package/dist/utils/anatomy.js.map +1 -0
- package/dist/utils/aria-hidden.js +1 -0
- package/dist/utils/aria-hidden.js.map +1 -0
- package/dist/utils/direction.js +1 -0
- package/dist/utils/direction.js.map +1 -0
- package/dist/utils/dismissable.d.ts +1 -1
- package/dist/utils/dismissable.d.ts.map +1 -1
- package/dist/utils/dismissable.js +2 -1
- package/dist/utils/dismissable.js.map +1 -0
- package/dist/utils/dom.js +1 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/floating.js +1 -0
- package/dist/utils/floating.js.map +1 -0
- package/dist/utils/focus-trap.d.ts +1 -1
- package/dist/utils/focus-trap.d.ts.map +1 -1
- package/dist/utils/focus-trap.js +3 -2
- package/dist/utils/focus-trap.js.map +1 -0
- package/dist/utils/focusables.js +1 -0
- package/dist/utils/focusables.js.map +1 -0
- package/dist/utils/index.d.ts +18 -18
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +12 -11
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/interact-outside.d.ts +1 -1
- package/dist/utils/interact-outside.d.ts.map +1 -1
- package/dist/utils/interact-outside.js +2 -1
- package/dist/utils/interact-outside.js.map +1 -0
- package/dist/utils/remove-scroll.js +1 -0
- package/dist/utils/remove-scroll.js.map +1 -0
- package/dist/utils/tree-collection.js +1 -0
- package/dist/utils/tree-collection.js.map +1 -0
- package/dist/utils/typeahead.js +1 -0
- package/dist/utils/typeahead.js.map +1 -0
- package/package.json +12 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/components/accordion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Accordion — a stack of expandable panels. Items are identified by a string\n * value. Either a single item is expandable at a time (default) or many\n * (`multiple: true`). `collapsible: false` prevents closing the only open\n * item in single mode.\n *\n * Items themselves are provided by the user's view (accordion is agnostic to\n * item data). The `connect()` API returns a `root` prop set and an `item(value)`\n * factory that produces `trigger` and `content` prop sets scoped to that item.\n */\n\nexport interface AccordionState {\n /** Values of currently-expanded items. */\n value: string[]\n multiple: boolean\n collapsible: boolean\n disabled: boolean\n /** Ordered list of item values (for keyboard navigation). */\n items: string[]\n}\n\nexport type AccordionMsg =\n | { type: 'toggle'; value: string }\n | { type: 'open'; value: string }\n | { type: 'close'; value: string }\n | { type: 'setValue'; value: string[] }\n | { type: 'setItems'; items: string[] }\n | { type: 'focusNext'; value: string }\n | { type: 'focusPrev'; value: string }\n | { type: 'focusFirst' }\n | { type: 'focusLast' }\n\nexport interface AccordionInit {\n value?: string[]\n multiple?: boolean\n collapsible?: boolean\n disabled?: boolean\n items?: string[]\n}\n\nexport function init(opts: AccordionInit = {}): AccordionState {\n return {\n value: opts.value ?? [],\n multiple: opts.multiple ?? false,\n collapsible: opts.collapsible ?? true,\n disabled: opts.disabled ?? false,\n items: opts.items ?? [],\n }\n}\n\nfunction toggleValue(state: AccordionState, value: string): string[] {\n const isOpen = state.value.includes(value)\n if (state.multiple) {\n return isOpen ? state.value.filter((v) => v !== value) : [...state.value, value]\n }\n // single mode\n if (isOpen) {\n return state.collapsible ? [] : state.value\n }\n return [value]\n}\n\nexport function update(state: AccordionState, msg: AccordionMsg): [AccordionState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'toggle':\n return [{ ...state, value: toggleValue(state, msg.value) }, []]\n case 'open':\n if (state.value.includes(msg.value)) return [state, []]\n return [{ ...state, value: state.multiple ? [...state.value, msg.value] : [msg.value] }, []]\n case 'close':\n if (!state.value.includes(msg.value)) return [state, []]\n if (!state.multiple && !state.collapsible) return [state, []]\n return [{ ...state, value: state.value.filter((v) => v !== msg.value) }, []]\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'setItems':\n return [{ ...state, items: msg.items }, []]\n // Focus messages don't mutate state but are emitted so user handlers can respond.\n case 'focusNext':\n case 'focusPrev':\n case 'focusFirst':\n case 'focusLast':\n return [state, []]\n }\n}\n\nexport interface AccordionItemParts<S> {\n trigger: {\n type: 'button'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'accordion'\n 'data-part': 'trigger'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n content: {\n role: 'region'\n id: string\n 'aria-labelledby': string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'accordion'\n 'data-part': 'content'\n hidden: (s: S) => boolean\n }\n item: {\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'accordion'\n 'data-part': 'item'\n 'data-value': string\n }\n}\n\nexport interface AccordionParts<S> {\n root: {\n role: 'region'\n 'data-scope': 'accordion'\n 'data-part': 'root'\n 'data-orientation': 'vertical'\n }\n item: (value: string) => AccordionItemParts<S>\n}\n\nexport interface ConnectOptions {\n /** Namespace prefix for part ids (for ARIA wiring). Should be unique per instance. */\n id: string\n}\n\nexport function connect<S>(\n get: (s: S) => AccordionState,\n send: Send<AccordionMsg>,\n opts: ConnectOptions,\n): AccordionParts<S> {\n const base = opts.id\n const triggerId = (v: string): string => `${base}:trigger:${v}`\n const contentId = (v: string): string => `${base}:content:${v}`\n\n return {\n root: {\n role: 'region',\n 'data-scope': 'accordion',\n 'data-part': 'root',\n 'data-orientation': 'vertical',\n },\n item: (value: string): AccordionItemParts<S> => ({\n trigger: {\n type: 'button',\n 'aria-expanded': (s) => get(s).value.includes(value),\n 'aria-controls': contentId(value),\n id: triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n disabled: (s) => get(s).disabled,\n 'data-scope': 'accordion',\n 'data-part': 'trigger',\n 'data-value': value,\n onClick: () => send({ type: 'toggle', value }),\n onKeyDown: (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext', value })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev', value })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case ' ':\n case 'Enter':\n e.preventDefault()\n send({ type: 'toggle', value })\n return\n }\n },\n },\n content: {\n role: 'region',\n id: contentId(value),\n 'aria-labelledby': triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-scope': 'accordion',\n 'data-part': 'content',\n hidden: (s) => !get(s).value.includes(value),\n },\n item: {\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'accordion',\n 'data-part': 'item',\n 'data-value': value,\n },\n }),\n }\n}\n\n/**\n * Helper: compute the next/prev item value given a focus message + current state.\n * Users' view/onMount can use this to move DOM focus to the correct trigger.\n */\nexport function focusTarget(\n state: AccordionState,\n msg: Extract<AccordionMsg, { type: `focus${string}` }>,\n): string | null {\n const items = state.items\n if (items.length === 0) return null\n if (msg.type === 'focusFirst') return items[0]!\n if (msg.type === 'focusLast') return items[items.length - 1]!\n const idx = items.indexOf(msg.value)\n if (idx === -1) return null\n if (msg.type === 'focusNext') return items[(idx + 1) % items.length]!\n // focusPrev\n return items[(idx - 1 + items.length) % items.length]!\n}\n\nexport const accordion = { init, update, connect, focusTarget }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Send, TransitionOptions } from '@llui/dom';
|
|
2
|
-
import { init, update, type DialogState, type DialogMsg, type DialogParts, type ConnectOptions as DialogConnectOptions } from './dialog';
|
|
2
|
+
import { init, update, type DialogState, type DialogMsg, type DialogParts, type ConnectOptions as DialogConnectOptions } from './dialog.js';
|
|
3
3
|
/**
|
|
4
4
|
* Alert dialog — a variant of dialog for destructive confirmations or
|
|
5
5
|
* blocking messages. Uses `role="alertdialog"` and defaults to:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EACL,IAAI,EACJ,MAAM,EAGN,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,IAAI,oBAAoB,EAC5C,MAAM,
|
|
1
|
+
{"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EACL,IAAI,EACJ,MAAM,EAGN,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,IAAI,oBAAoB,EAC5C,MAAM,aAAa,CAAA;AAEpB;;;;;;;;GAQG;AAEH,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,SAAS,IAAI,cAAc,EAAE,CAAA;AAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvB,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACnF,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;AAEhD,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,EAAE,yBAAyB,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAErB;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;IAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC1B,OAAO,EAAE,MAAM,IAAI,EAAE,CAAA;IACrB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAKrE;AAED,eAAO,MAAM,WAAW;;;;;CAAqC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { init, update, connect as dialogConnect, overlay as dialogOverlay, } from './dialog';
|
|
1
|
+
import { init, update, connect as dialogConnect, overlay as dialogOverlay, } from './dialog.js';
|
|
2
2
|
export { init, update };
|
|
3
3
|
export function connect(get, send, opts) {
|
|
4
4
|
return dialogConnect(get, send, { ...opts, role: 'alertdialog' });
|
|
@@ -10,3 +10,4 @@ export function overlay(opts) {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
export const alertDialog = { init, update, connect, overlay };
|
|
13
|
+
//# sourceMappingURL=alert-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-dialog.js","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,OAAO,IAAI,aAAa,EACxB,OAAO,IAAI,aAAa,GAKzB,MAAM,aAAa,CAAA;AAcpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAWvB,MAAM,UAAU,OAAO,CACrB,GAA0B,EAC1B,IAAqB,EACrB,IAA+B;IAE/B,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;AACnE,CAAC;AAmBD,MAAM,UAAU,OAAO,CAAI,IAAkC;IAC3D,OAAO,aAAa,CAAC;QACnB,GAAG,IAAI;QACP,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,KAAK;KACvD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport {\n init,\n update,\n connect as dialogConnect,\n overlay as dialogOverlay,\n type DialogState,\n type DialogMsg,\n type DialogParts,\n type ConnectOptions as DialogConnectOptions,\n} from './dialog.js'\n\n/**\n * Alert dialog — a variant of dialog for destructive confirmations or\n * blocking messages. Uses `role=\"alertdialog\"` and defaults to:\n * - `closeOnOutsideClick: false` (user must choose an action explicitly)\n *\n * Shares state, messages, and part structure with `dialog`. Render a\n * `cancelTrigger` alongside the `closeTrigger` and let the application\n * dispatch a follow-up action after the dialog closes.\n */\n\nexport type { DialogState as AlertDialogState, DialogMsg as AlertDialogMsg }\n\nexport { init, update }\n\nexport interface AlertDialogConnectOptions extends Omit<DialogConnectOptions, 'role'> {\n /** Accessible label for the cancel button (default: 'Cancel'). */\n cancelLabel?: string\n /** Accessible label for the confirm button (default: 'Confirm'). */\n confirmLabel?: string\n}\n\nexport type AlertDialogParts<S> = DialogParts<S>\n\nexport function connect<S>(\n get: (s: S) => DialogState,\n send: Send<DialogMsg>,\n opts: AlertDialogConnectOptions,\n): AlertDialogParts<S> {\n return dialogConnect(get, send, { ...opts, role: 'alertdialog' })\n}\n\nexport interface AlertDialogOverlayOptions<S> {\n get: (s: S) => DialogState\n send: Send<DialogMsg>\n parts: AlertDialogParts<S>\n content: () => Node[]\n transition?: TransitionOptions\n closeOnEscape?: boolean\n /** Whether outside-click should dismiss (default: false for alert dialogs). */\n closeOnOutsideClick?: boolean\n trapFocus?: boolean\n lockScroll?: boolean\n hideSiblings?: boolean\n target?: string | HTMLElement\n initialFocus?: Element | (() => Element | null)\n restoreFocus?: boolean\n}\n\nexport function overlay<S>(opts: AlertDialogOverlayOptions<S>): Node[] {\n return dialogOverlay({\n ...opts,\n closeOnOutsideClick: opts.closeOnOutsideClick ?? false,\n })\n}\n\nexport const alertDialog = { init, update, connect, overlay }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { flipArrow } from '../utils/direction';
|
|
1
|
+
import { flipArrow } from '../utils/direction.js';
|
|
2
2
|
function clamp(v, min, max) {
|
|
3
3
|
return Math.max(min, Math.min(max, v));
|
|
4
4
|
}
|
|
@@ -145,3 +145,4 @@ export function connect(get, send, opts = {}) {
|
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
147
|
export const angleSlider = { init, update, connect, angleFromPoint, pointFromAngle };
|
|
148
|
+
//# sourceMappingURL=angle-slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angle-slider.js","sourceRoot":"","sources":["../../src/components/angle-slider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Angle slider — a circular input that selects a value in 0..360 degrees\n * by dragging a thumb around a control. The state machine tracks the\n * current angle; the view layer computes angles from pointer positions\n * (helpers exported for that purpose).\n *\n * Typical view wiring: on pointerdown/pointermove, read the control\n * element's bounding rect, compute the angle from `(pointerX, pointerY)`\n * to the rect center via `angleFromPoint()`, and dispatch `setValue`.\n *\n * Keyboard: Arrow keys adjust by `step`; Home/End jump to min/max;\n * PageUp/PageDown adjust by `step * 10`.\n */\n\nexport interface AngleSliderState {\n value: number\n min: number\n max: number\n step: number\n disabled: boolean\n readOnly: boolean\n}\n\nexport type AngleSliderMsg =\n | { type: 'setValue'; value: number }\n | { type: 'increment'; steps?: number }\n | { type: 'decrement'; steps?: number }\n | { type: 'setMin'; min: number }\n | { type: 'setMax'; max: number }\n\nexport interface AngleSliderInit {\n value?: number\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n readOnly?: boolean\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v))\n}\n\nfunction roundToStep(value: number, step: number, min: number): number {\n if (step <= 0) return value\n return min + Math.round((value - min) / step) * step\n}\n\nexport function init(opts: AngleSliderInit = {}): AngleSliderState {\n const min = opts.min ?? 0\n const max = opts.max ?? 360\n const step = opts.step ?? 1\n return {\n value: clamp(roundToStep(opts.value ?? 0, step, min), min, max),\n min,\n max,\n step,\n disabled: opts.disabled ?? false,\n readOnly: opts.readOnly ?? false,\n }\n}\n\nexport function update(state: AngleSliderState, msg: AngleSliderMsg): [AngleSliderState, never[]] {\n if (state.disabled || state.readOnly) {\n if (msg.type === 'setValue' || msg.type === 'increment' || msg.type === 'decrement') {\n return [state, []]\n }\n }\n switch (msg.type) {\n case 'setValue': {\n const v = clamp(roundToStep(msg.value, state.step, state.min), state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'increment': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value + state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'decrement': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value - state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'setMin':\n return [{ ...state, min: msg.min, value: clamp(state.value, msg.min, state.max) }, []]\n case 'setMax':\n return [{ ...state, max: msg.max, value: clamp(state.value, state.min, msg.max) }, []]\n }\n}\n\n/**\n * Compute the angle in degrees from the center of a rect to a point.\n * 0° = up (12 o'clock), increases clockwise. Result is in 0..360.\n *\n * Useful inside a pointermove handler:\n * const rect = control.getBoundingClientRect()\n * const angle = angleFromPoint(rect, e.clientX, e.clientY)\n * send({ type: 'setValue', value: angle })\n */\nexport function angleFromPoint(rect: DOMRect, x: number, y: number): number {\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dx = x - cx\n const dy = y - cy\n // atan2 gives 0° at east growing counter-clockwise; we want 0° at north\n // growing clockwise, so rotate by 90° and negate.\n const rad = Math.atan2(dy, dx)\n let deg = (rad * 180) / Math.PI + 90\n if (deg < 0) deg += 360\n return deg % 360\n}\n\n/** Convert an angle to (x, y) on a unit circle (radius 1 at origin). */\nexport function pointFromAngle(angleDeg: number): { x: number; y: number } {\n const rad = ((angleDeg - 90) * Math.PI) / 180\n return { x: Math.cos(rad), y: Math.sin(rad) }\n}\n\nexport interface AngleSliderParts<S> {\n root: {\n role: 'slider'\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-valuetext': (s: S) => string\n 'aria-orientation': 'horizontal'\n 'aria-disabled': (s: S) => 'true' | undefined\n 'aria-readonly': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'angle-slider'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n onKeyDown: (e: KeyboardEvent) => void\n }\n control: {\n 'data-scope': 'angle-slider'\n 'data-part': 'control'\n }\n /**\n * The draggable thumb element. Its position is typically computed via\n * CSS custom properties `--angle` (0..360) that the consumer sets from\n * `state.value` using pointFromAngle() or a CSS `transform: rotate()`.\n */\n thumb: {\n 'data-scope': 'angle-slider'\n 'data-part': 'thumb'\n 'data-value': (s: S) => string\n }\n valueText: {\n 'data-scope': 'angle-slider'\n 'data-part': 'value-text'\n }\n /** A hidden input for form participation. */\n hiddenInput: {\n type: 'hidden'\n value: (s: S) => string\n name?: string\n 'data-scope': 'angle-slider'\n 'data-part': 'hidden-input'\n }\n}\n\nexport interface ConnectOptions {\n /** Name for the hidden input (form integration). */\n name?: string\n /** Formatter for aria-valuetext (default: \"{value}°\"). */\n format?: (value: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => AngleSliderState,\n send: Send<AngleSliderMsg>,\n opts: ConnectOptions = {},\n): AngleSliderParts<S> {\n const fmt = opts.format ?? ((v: number) => `${Math.round(v)}°`)\n\n return {\n root: {\n role: 'slider',\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).value,\n 'aria-valuetext': (s) => fmt(get(s).value),\n 'aria-orientation': 'horizontal',\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'aria-readonly': (s) => (get(s).readOnly ? 'true' : undefined),\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n 'data-scope': 'angle-slider',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'increment' })\n return\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'decrement' })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', steps: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', steps: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'setValue', value: -Infinity })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'setValue', value: Infinity })\n return\n }\n },\n },\n control: {\n 'data-scope': 'angle-slider',\n 'data-part': 'control',\n },\n thumb: {\n 'data-scope': 'angle-slider',\n 'data-part': 'thumb',\n 'data-value': (s) => String(get(s).value),\n },\n valueText: {\n 'data-scope': 'angle-slider',\n 'data-part': 'value-text',\n },\n hiddenInput: {\n type: 'hidden',\n value: (s) => String(get(s).value),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n 'data-scope': 'angle-slider',\n 'data-part': 'hidden-input',\n },\n }\n}\n\nexport const angleSlider = { init, update, connect, angleFromPoint, pointFromAngle }\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-list.js","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Async list — paginated/infinite-scroll list that accumulates pages.\n * The machine is generic over the item type; the consumer runs the\n * actual fetch in response to `loadMore` (via a custom handler or\n * effect) and dispatches `pageLoaded`/`pageFailed` when the request\n * completes.\n *\n * Typical flow in consumer's update handler:\n *\n * (state, msg) => {\n * if (msg.type === 'loadMore') {\n * fetch(`/api/items?page=${state.list.page + 1}`)\n * .then(r => r.json())\n * .then(items => send({type: 'pageLoaded', items, hasMore: items.length === PAGE_SIZE}))\n * .catch(e => send({type: 'pageFailed', error: String(e)}))\n * }\n * }\n */\n\nexport type AsyncStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AsyncListState<T = unknown> {\n items: T[]\n page: number\n hasMore: boolean\n status: AsyncStatus\n error: string | null\n}\n\nexport type AsyncListMsg<T = unknown> =\n | { type: 'loadMore' }\n | { type: 'pageLoaded'; items: T[]; hasMore: boolean }\n | { type: 'pageFailed'; error: string }\n | { type: 'reset' }\n | { type: 'setItems'; items: T[]; hasMore?: boolean }\n | { type: 'retry' }\n\nexport interface AsyncListInit<T = unknown> {\n items?: T[]\n page?: number\n hasMore?: boolean\n}\n\nexport function init<T = unknown>(opts: AsyncListInit<T> = {}): AsyncListState<T> {\n return {\n items: opts.items ?? [],\n page: opts.page ?? 0,\n hasMore: opts.hasMore ?? true,\n status: 'idle',\n error: null,\n }\n}\n\nexport function update<T>(\n state: AsyncListState<T>,\n msg: AsyncListMsg<T>,\n): [AsyncListState<T>, never[]] {\n switch (msg.type) {\n case 'loadMore':\n case 'retry':\n if (state.status === 'loading' || !state.hasMore) return [state, []]\n return [{ ...state, status: 'loading', error: null }, []]\n case 'pageLoaded':\n return [\n {\n ...state,\n items: [...state.items, ...msg.items],\n page: state.page + 1,\n hasMore: msg.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n case 'pageFailed':\n return [{ ...state, status: 'error', error: msg.error }, []]\n case 'reset':\n return [{ items: [], page: 0, hasMore: true, status: 'idle', error: null }, []]\n case 'setItems':\n return [\n {\n ...state,\n items: msg.items,\n hasMore: msg.hasMore ?? state.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n }\n}\n\nexport function isLoading<T>(state: AsyncListState<T>): boolean {\n return state.status === 'loading'\n}\n\nexport function isError<T>(state: AsyncListState<T>): boolean {\n return state.status === 'error'\n}\n\nexport function isEmpty<T>(state: AsyncListState<T>): boolean {\n return state.items.length === 0\n}\n\nexport interface AsyncListParts<S, _T> {\n root: {\n 'data-scope': 'async-list'\n 'data-part': 'root'\n 'data-status': (s: S) => AsyncStatus\n }\n sentinel: {\n 'data-scope': 'async-list'\n 'data-part': 'sentinel'\n 'aria-hidden': 'true'\n }\n loadMoreTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'async-list'\n 'data-part': 'load-more-trigger'\n onClick: (e: MouseEvent) => void\n }\n retryTrigger: {\n type: 'button'\n 'data-scope': 'async-list'\n 'data-part': 'retry-trigger'\n hidden: (s: S) => boolean\n onClick: (e: MouseEvent) => void\n }\n errorText: {\n role: 'alert'\n 'aria-live': 'polite'\n 'data-scope': 'async-list'\n 'data-part': 'error-text'\n hidden: (s: S) => boolean\n }\n}\n\nexport function connect<S, T>(\n get: (s: S) => AsyncListState<T>,\n send: Send<AsyncListMsg<T>>,\n): AsyncListParts<S, T> {\n return {\n root: {\n 'data-scope': 'async-list',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n sentinel: {\n 'data-scope': 'async-list',\n 'data-part': 'sentinel',\n 'aria-hidden': 'true',\n },\n loadMoreTrigger: {\n type: 'button',\n disabled: (s) => {\n const st = get(s)\n return st.status === 'loading' || !st.hasMore\n },\n 'data-scope': 'async-list',\n 'data-part': 'load-more-trigger',\n onClick: () => send({ type: 'loadMore' }),\n },\n retryTrigger: {\n type: 'button',\n 'data-scope': 'async-list',\n 'data-part': 'retry-trigger',\n hidden: (s) => get(s).status !== 'error',\n onClick: () => send({ type: 'retry' }),\n },\n errorText: {\n role: 'alert',\n 'aria-live': 'polite',\n 'data-scope': 'async-list',\n 'data-part': 'error-text',\n hidden: (s) => get(s).status !== 'error',\n },\n }\n}\n\n/**\n * Install an IntersectionObserver on the sentinel element that auto-dispatches\n * `loadMore` whenever the sentinel scrolls into view. Call from onMount.\n */\nexport function watchSentinel<T>(\n send: Send<AsyncListMsg<T>>,\n sentinel: Element,\n rootMargin: string = '200px',\n): () => void {\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting) {\n send({ type: 'loadMore' })\n return\n }\n }\n },\n { rootMargin },\n )\n io.observe(sentinel)\n return () => io.disconnect()\n}\n\nexport const asyncList = {\n init,\n update,\n connect,\n isLoading,\n isError,\n isEmpty,\n watchSentinel,\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,IAAI,CAAC,OAAmB,EAAE;IACxC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,GAAc;IACvD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9C,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AA+BD,MAAM,UAAU,OAAO,CACrB,GAA0B,EAC1B,IAAqB,EACrB,OAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;IAC1B,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;SACpC;QACD,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,GAAG;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACtC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC/C;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;SACxE;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Avatar — image with automatic fallback. Tracks image load status so\n * consumers can render the image, a fallback (initials, icon), or a\n * loading placeholder.\n */\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AvatarState {\n status: ImageStatus\n}\n\nexport type AvatarMsg =\n | { type: 'loadStart' }\n | { type: 'loaded' }\n | { type: 'error' }\n | { type: 'reset' }\n\nexport interface AvatarInit {\n status?: ImageStatus\n}\n\nexport function init(opts: AvatarInit = {}): AvatarState {\n return { status: opts.status ?? 'idle' }\n}\n\nexport function update(state: AvatarState, msg: AvatarMsg): [AvatarState, never[]] {\n switch (msg.type) {\n case 'loadStart':\n return [{ ...state, status: 'loading' }, []]\n case 'loaded':\n return [{ ...state, status: 'loaded' }, []]\n case 'error':\n return [{ ...state, status: 'error' }, []]\n case 'reset':\n return [{ ...state, status: 'idle' }, []]\n }\n}\n\nexport interface AvatarParts<S> {\n root: {\n 'data-scope': 'avatar'\n 'data-part': 'root'\n 'data-status': (s: S) => ImageStatus\n }\n image: {\n 'data-scope': 'avatar'\n 'data-part': 'image'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n alt: string\n onLoad: (e: Event) => void\n onError: (e: Event) => void\n onLoadStart: (e: Event) => void\n }\n fallback: {\n 'data-scope': 'avatar'\n 'data-part': 'fallback'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n 'aria-hidden': (s: S) => 'true' | undefined\n }\n}\n\nexport interface ConnectOptions {\n alt?: string\n}\n\nexport function connect<S>(\n get: (s: S) => AvatarState,\n send: Send<AvatarMsg>,\n opts: ConnectOptions = {},\n): AvatarParts<S> {\n const alt = opts.alt ?? ''\n return {\n root: {\n 'data-scope': 'avatar',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n image: {\n 'data-scope': 'avatar',\n 'data-part': 'image',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status !== 'loaded',\n alt,\n onLoad: () => send({ type: 'loaded' }),\n onError: () => send({ type: 'error' }),\n onLoadStart: () => send({ type: 'loadStart' }),\n },\n fallback: {\n 'data-scope': 'avatar',\n 'data-part': 'fallback',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status === 'loaded',\n 'aria-hidden': (s) => (get(s).status === 'loaded' ? 'true' : undefined),\n },\n }\n}\n\nexport const avatar = { init, update, connect }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from '@llui/dom';
|
|
2
|
-
import { LocaleContext, en } from '../locale';
|
|
2
|
+
import { LocaleContext, en } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return {
|
|
5
5
|
current: opts.current ?? 0,
|
|
@@ -132,3 +132,4 @@ export function connect(get, send, opts) {
|
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
export const carousel = { init, update, connect, canGoNext, canGoPrev };
|
|
135
|
+
//# sourceMappingURL=carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Carousel — sliding content viewer with pagination. Tracks active slide\n * index, optional autoplay with pause-on-hover, and wraparound navigation.\n */\n\nexport interface CarouselState {\n current: number\n count: number\n loop: boolean\n autoplay: boolean\n interval: number\n paused: boolean\n /** Direction of the last transition — useful for entry animations. */\n direction: 'forward' | 'backward'\n}\n\nexport type CarouselMsg =\n | { type: 'goTo'; index: number }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'setCount'; count: number }\n | { type: 'pause' }\n | { type: 'resume' }\n | { type: 'setAutoplay'; autoplay: boolean }\n\nexport interface CarouselInit {\n current?: number\n count?: number\n loop?: boolean\n autoplay?: boolean\n interval?: number\n}\n\nexport function init(opts: CarouselInit = {}): CarouselState {\n return {\n current: opts.current ?? 0,\n count: opts.count ?? 0,\n loop: opts.loop ?? true,\n autoplay: opts.autoplay ?? false,\n interval: opts.interval ?? 5000,\n paused: false,\n direction: 'forward',\n }\n}\n\nfunction clampIndex(state: CarouselState, next: number): number {\n if (state.count === 0) return 0\n if (state.loop) return ((next % state.count) + state.count) % state.count\n return Math.max(0, Math.min(state.count - 1, next))\n}\n\nexport function update(state: CarouselState, msg: CarouselMsg): [CarouselState, never[]] {\n switch (msg.type) {\n case 'goTo': {\n const next = clampIndex(state, msg.index)\n return [\n { ...state, current: next, direction: next >= state.current ? 'forward' : 'backward' },\n [],\n ]\n }\n case 'next': {\n const next = clampIndex(state, state.current + 1)\n return [{ ...state, current: next, direction: 'forward' }, []]\n }\n case 'prev': {\n const prev = clampIndex(state, state.current - 1)\n return [{ ...state, current: prev, direction: 'backward' }, []]\n }\n case 'setCount': {\n const current = Math.min(state.current, Math.max(0, msg.count - 1))\n return [{ ...state, count: msg.count, current }, []]\n }\n case 'pause':\n return [{ ...state, paused: true }, []]\n case 'resume':\n return [{ ...state, paused: false }, []]\n case 'setAutoplay':\n return [{ ...state, autoplay: msg.autoplay }, []]\n }\n}\n\nexport function canGoNext(state: CarouselState): boolean {\n if (state.loop) return state.count > 0\n return state.current < state.count - 1\n}\n\nexport function canGoPrev(state: CarouselState): boolean {\n if (state.loop) return state.count > 0\n return state.current > 0\n}\n\nexport interface CarouselSlideParts<S> {\n slide: {\n role: 'tabpanel'\n id: string\n 'aria-roledescription': 'slide'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'carousel'\n 'data-part': 'slide'\n 'data-index': string\n 'data-active': (s: S) => '' | undefined\n hidden: (s: S) => boolean\n }\n indicator: {\n type: 'button'\n role: 'tab'\n 'aria-label': string | ((s: S) => string)\n 'aria-selected': (s: S) => boolean\n 'aria-controls': string\n 'data-scope': 'carousel'\n 'data-part': 'indicator'\n 'data-index': string\n 'data-active': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface CarouselParts<S> {\n root: {\n role: 'region'\n 'aria-roledescription': 'carousel'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'carousel'\n 'data-part': 'root'\n 'data-paused': (s: S) => '' | undefined\n onPointerEnter: (e: PointerEvent) => void\n onPointerLeave: (e: PointerEvent) => void\n onFocus: (e: FocusEvent) => void\n onBlur: (e: FocusEvent) => void\n }\n viewport: {\n 'data-scope': 'carousel'\n 'data-part': 'viewport'\n }\n indicatorGroup: {\n role: 'tablist'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'carousel'\n 'data-part': 'indicator-group'\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'carousel'\n 'data-part': 'next-trigger'\n onClick: (e: MouseEvent) => void\n }\n prevTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'carousel'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n slide: (index: number) => CarouselSlideParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n label?: string\n indicatorLabel?: string\n nextLabel?: string\n prevLabel?: string\n /** Builder for each slide's aria-label. Receives index + known count. */\n slideLabel?: (index: number, count: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => CarouselState,\n send: Send<CarouselMsg>,\n opts: ConnectOptions,\n): CarouselParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const label: string | ((s: S) => string) = opts.label ?? ((s: S) => locale(s).carousel.label)\n const indicatorLabel: string | ((s: S) => string) =\n opts.indicatorLabel ?? ((s: S) => locale(s).carousel.indicators)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).carousel.next)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).carousel.prev)\n const slideLabelFn = opts.slideLabel ?? en.carousel.slide\n const slideId = (i: number): string => `${opts.id}:slide:${i}`\n\n return {\n root: {\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'aria-label': label,\n 'data-scope': 'carousel',\n 'data-part': 'root',\n 'data-paused': (s) => (get(s).paused ? '' : undefined),\n onPointerEnter: () => send({ type: 'pause' }),\n onPointerLeave: () => send({ type: 'resume' }),\n onFocus: () => send({ type: 'pause' }),\n onBlur: () => send({ type: 'resume' }),\n },\n viewport: {\n 'data-scope': 'carousel',\n 'data-part': 'viewport',\n },\n indicatorGroup: {\n role: 'tablist',\n 'aria-label': indicatorLabel,\n 'data-scope': 'carousel',\n 'data-part': 'indicator-group',\n },\n nextTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n disabled: (s) => !canGoNext(get(s)),\n 'data-scope': 'carousel',\n 'data-part': 'next-trigger',\n onClick: () => send({ type: 'next' }),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n disabled: (s) => !canGoPrev(get(s)),\n 'data-scope': 'carousel',\n 'data-part': 'prev-trigger',\n onClick: () => send({ type: 'prev' }),\n },\n slide: (index: number): CarouselSlideParts<S> => ({\n slide: {\n role: 'tabpanel',\n id: slideId(index),\n 'aria-roledescription': 'slide',\n 'aria-label': slideLabelFn(index, 0),\n 'data-scope': 'carousel',\n 'data-part': 'slide',\n 'data-index': String(index),\n 'data-active': (s) => (get(s).current === index ? '' : undefined),\n hidden: (s) => get(s).current !== index,\n },\n indicator: {\n type: 'button',\n role: 'tab',\n 'aria-label': en.carousel.goToSlide(index),\n 'aria-selected': (s) => get(s).current === index,\n 'aria-controls': slideId(index),\n 'data-scope': 'carousel',\n 'data-part': 'indicator',\n 'data-index': String(index),\n 'data-active': (s) => (get(s).current === index ? '' : undefined),\n onClick: () => send({ type: 'goTo', index }),\n },\n }),\n }\n}\n\nexport const carousel = { init, update, connect, canGoNext, canGoPrev }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from '@llui/dom';
|
|
2
|
-
import { LocaleContext } from '../locale';
|
|
2
|
+
import { LocaleContext } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
const levels = opts.levels ?? [];
|
|
5
5
|
const values = opts.values ?? new Array(levels.length).fill(null);
|
|
@@ -101,3 +101,4 @@ export const cascadeSelect = {
|
|
|
101
101
|
isComplete,
|
|
102
102
|
completeValues,
|
|
103
103
|
};
|
|
104
|
+
//# sourceMappingURL=cascade-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade-select.js","sourceRoot":"","sources":["../../src/components/cascade-select.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Cascade select — a series of dependent selects where each level's\n * choice filters the options of the next. Classic example: country\n * → state → city. The machine stores a flat list of selections\n * (one per level, or null) and the options at each level; filtering\n * logic is left to the view/consumer.\n *\n * Level shape: the consumer passes an array of Level descriptors on\n * setLevels, each with its own options. Selecting at level N clears\n * selections at levels > N.\n */\n\nexport interface CascadeLevel {\n id: string\n label: string\n options: Array<{ value: string; label: string; disabled?: boolean }>\n}\n\nexport interface CascadeSelectState {\n levels: CascadeLevel[]\n /** Parallel to levels: one value per level, or null. */\n values: (string | null)[]\n disabled: boolean\n}\n\nexport type CascadeSelectMsg =\n | { type: 'setLevels'; levels: CascadeLevel[] }\n | { type: 'setValue'; levelIndex: number; value: string | null }\n | { type: 'clear' }\n\nexport interface CascadeSelectInit {\n levels?: CascadeLevel[]\n values?: (string | null)[]\n disabled?: boolean\n}\n\nexport function init(opts: CascadeSelectInit = {}): CascadeSelectState {\n const levels = opts.levels ?? []\n const values = opts.values ?? new Array<string | null>(levels.length).fill(null)\n // Normalize: pad or trim values array to match levels length\n const normalized: (string | null)[] = []\n for (let i = 0; i < levels.length; i++) {\n normalized.push(values[i] ?? null)\n }\n return {\n levels,\n values: normalized,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function update(\n state: CascadeSelectState,\n msg: CascadeSelectMsg,\n): [CascadeSelectState, never[]] {\n if (state.disabled && msg.type !== 'clear') return [state, []]\n switch (msg.type) {\n case 'setLevels': {\n const values = new Array<string | null>(msg.levels.length).fill(null)\n return [{ ...state, levels: msg.levels, values }, []]\n }\n case 'setValue': {\n if (msg.levelIndex < 0 || msg.levelIndex >= state.levels.length) return [state, []]\n // Setting a level clears all levels below it.\n const next = state.values.slice()\n next[msg.levelIndex] = msg.value\n for (let i = msg.levelIndex + 1; i < next.length; i++) {\n next[i] = null\n }\n return [{ ...state, values: next }, []]\n }\n case 'clear':\n return [{ ...state, values: new Array<string | null>(state.levels.length).fill(null) }, []]\n }\n}\n\nexport function isLevelReady(state: CascadeSelectState, levelIndex: number): boolean {\n // A level is ready to accept input if all prior levels have values.\n for (let i = 0; i < levelIndex; i++) {\n if (state.values[i] === null) return false\n }\n return true\n}\n\nexport function isComplete(state: CascadeSelectState): boolean {\n return state.values.every((v) => v !== null)\n}\n\nexport function completeValues(state: CascadeSelectState): string[] | null {\n if (!isComplete(state)) return null\n return state.values as string[]\n}\n\nexport interface CascadeLevelParts<S> {\n label: {\n for: string\n 'data-scope': 'cascade-select'\n 'data-part': 'level-label'\n }\n select: {\n id: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'cascade-select'\n 'data-part': 'level-select'\n 'data-level': string\n 'data-ready': (s: S) => '' | undefined\n onChange: (e: Event) => void\n }\n}\n\nexport interface CascadeSelectParts<S> {\n root: {\n 'data-scope': 'cascade-select'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n 'data-complete': (s: S) => '' | undefined\n }\n clearTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'cascade-select'\n 'data-part': 'clear-trigger'\n onClick: (e: MouseEvent) => void\n }\n level: (index: number) => CascadeLevelParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n clearLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => CascadeSelectState,\n send: Send<CascadeSelectMsg>,\n opts: ConnectOptions,\n): CascadeSelectParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const levelId = (i: number): string => `${opts.id}:level:${i}`\n\n return {\n root: {\n 'data-scope': 'cascade-select',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-complete': (s) => (isComplete(get(s)) ? '' : undefined),\n },\n clearTrigger: {\n type: 'button',\n 'aria-label': opts.clearLabel ?? ((s: S) => locale(s).cascadeSelect.clear),\n disabled: (s) => get(s).values.every((v) => v === null),\n 'data-scope': 'cascade-select',\n 'data-part': 'clear-trigger',\n onClick: () => send({ type: 'clear' }),\n },\n level: (index: number): CascadeLevelParts<S> => ({\n label: {\n for: levelId(index),\n 'data-scope': 'cascade-select',\n 'data-part': 'level-label',\n },\n select: {\n id: levelId(index),\n disabled: (s) => get(s).disabled || !isLevelReady(get(s), index),\n value: (s) => get(s).values[index] ?? '',\n 'data-scope': 'cascade-select',\n 'data-part': 'level-select',\n 'data-level': String(index),\n 'data-ready': (s) => (isLevelReady(get(s), index) ? '' : undefined),\n onChange: (e) => {\n const el = e.target as HTMLSelectElement\n send({ type: 'setValue', levelIndex: index, value: el.value || null })\n },\n },\n }),\n }\n}\n\nexport const cascadeSelect = {\n init,\n update,\n connect,\n isLevelReady,\n isComplete,\n completeValues,\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/components/checkbox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Checkbox — a tri-state form control (checked / unchecked / indeterminate).\n * The `indeterminate` state is a visual-only state used to represent \"partial\"\n * selection (e.g. a parent whose children are mixed checked).\n *\n * Rendering typically uses two elements: a visual indicator (the styled box)\n * and a hidden native `<input type=\"checkbox\">` for form participation +\n * accessibility. `connect()` returns props for both.\n */\n\nexport type CheckedState = boolean | 'indeterminate'\n\nexport interface CheckboxState {\n checked: CheckedState\n disabled: boolean\n required: boolean\n}\n\nexport type CheckboxMsg =\n | { type: 'toggle' }\n | { type: 'setChecked'; checked: CheckedState }\n | { type: 'setDisabled'; disabled: boolean }\n\nexport interface CheckboxInit {\n checked?: CheckedState\n disabled?: boolean\n required?: boolean\n}\n\nexport function init(opts: CheckboxInit = {}): CheckboxState {\n return {\n checked: opts.checked ?? false,\n disabled: opts.disabled ?? false,\n required: opts.required ?? false,\n }\n}\n\nexport function update(state: CheckboxState, msg: CheckboxMsg): [CheckboxState, never[]] {\n switch (msg.type) {\n case 'toggle':\n if (state.disabled) return [state, []]\n // Tri-state toggle: indeterminate → checked, otherwise flip boolean\n if (state.checked === 'indeterminate') return [{ ...state, checked: true }, []]\n return [{ ...state, checked: !state.checked }, []]\n case 'setChecked':\n return [{ ...state, checked: msg.checked }, []]\n case 'setDisabled':\n return [{ ...state, disabled: msg.disabled }, []]\n }\n}\n\nfunction ariaChecked(c: CheckedState): 'true' | 'false' | 'mixed' {\n if (c === 'indeterminate') return 'mixed'\n return c ? 'true' : 'false'\n}\n\nfunction dataState(c: CheckedState): 'checked' | 'unchecked' | 'indeterminate' {\n if (c === 'indeterminate') return 'indeterminate'\n return c ? 'checked' : 'unchecked'\n}\n\nexport interface CheckboxParts<S> {\n /** The visual box/container — `role=\"checkbox\"` for accessibility. */\n root: {\n role: 'checkbox'\n 'aria-checked': (s: S) => 'true' | 'false' | 'mixed'\n 'aria-disabled': (s: S) => 'true' | undefined\n 'aria-required': (s: S) => 'true' | undefined\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'checkbox'\n 'data-part': 'root'\n tabIndex: (s: S) => number\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n /** A native hidden input for form participation. */\n hiddenInput: {\n type: 'checkbox'\n 'aria-hidden': 'true'\n tabIndex: -1\n style: string\n checked: (s: S) => boolean\n indeterminate: (s: S) => boolean\n disabled: (s: S) => boolean\n required: (s: S) => boolean\n 'data-scope': 'checkbox'\n 'data-part': 'hidden-input'\n }\n /** Optional indicator child (the checkmark). */\n indicator: {\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n 'data-scope': 'checkbox'\n 'data-part': 'indicator'\n }\n}\n\nconst HIDDEN_STYLE =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'\n\nexport function connect<S>(\n get: (s: S) => CheckboxState,\n send: Send<CheckboxMsg>,\n): CheckboxParts<S> {\n return {\n root: {\n role: 'checkbox',\n 'aria-checked': (s) => ariaChecked(get(s).checked),\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'aria-required': (s) => (get(s).required ? 'true' : undefined),\n 'data-state': (s) => dataState(get(s).checked),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'checkbox',\n 'data-part': 'root',\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n onClick: () => send({ type: 'toggle' }),\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === ' ') {\n e.preventDefault()\n send({ type: 'toggle' })\n }\n },\n },\n hiddenInput: {\n type: 'checkbox',\n 'aria-hidden': 'true',\n tabIndex: -1,\n style: HIDDEN_STYLE,\n checked: (s) => get(s).checked === true,\n indeterminate: (s) => get(s).checked === 'indeterminate',\n disabled: (s) => get(s).disabled,\n required: (s) => get(s).required,\n 'data-scope': 'checkbox',\n 'data-part': 'hidden-input',\n },\n indicator: {\n 'data-state': (s) => dataState(get(s).checked),\n 'data-scope': 'checkbox',\n 'data-part': 'indicator',\n },\n }\n}\n\nexport const checkbox = { init, update, connect }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from '@llui/dom';
|
|
2
|
-
import { LocaleContext } from '../locale';
|
|
2
|
+
import { LocaleContext } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return { value: opts.value ?? '', copied: false };
|
|
5
5
|
}
|
|
@@ -74,3 +74,4 @@ export function connect(get, send, opts = {}) {
|
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
76
|
export const clipboard = { init, update, connect, copyToClipboard };
|
|
77
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/components/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Clipboard — copy-to-clipboard with transient \"copied\" feedback. The\n * actual clipboard write is performed by the consumer via an effect (or\n * inline in the trigger's onClick handler). Reducer tracks the success\n * state flag and an auto-reset timestamp.\n */\n\nexport interface ClipboardState {\n value: string\n copied: boolean\n}\n\nexport type ClipboardMsg =\n | { type: 'setValue'; value: string }\n | { type: 'copy' }\n | { type: 'copied' }\n | { type: 'reset' }\n\nexport interface ClipboardInit {\n value?: string\n}\n\nexport function init(opts: ClipboardInit = {}): ClipboardState {\n return { value: opts.value ?? '', copied: false }\n}\n\nexport function update(state: ClipboardState, msg: ClipboardMsg): [ClipboardState, never[]] {\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value, copied: false }, []]\n case 'copy':\n case 'copied':\n return [{ ...state, copied: true }, []]\n case 'reset':\n return [{ ...state, copied: false }, []]\n }\n}\n\n/**\n * Attempt to copy the value to the clipboard. Returns a Promise that resolves\n * on success. Consumer dispatches `copied` or `reset` based on the result.\n */\nexport async function copyToClipboard(value: string): Promise<void> {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(value)\n return\n }\n // Fallback: ephemeral textarea\n const textarea = document.createElement('textarea')\n textarea.value = value\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n try {\n document.execCommand('copy')\n } finally {\n document.body.removeChild(textarea)\n }\n}\n\nexport interface ClipboardParts<S> {\n root: {\n 'data-scope': 'clipboard'\n 'data-part': 'root'\n 'data-copied': (s: S) => '' | undefined\n }\n trigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'clipboard'\n 'data-part': 'trigger'\n 'data-copied': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n input: {\n type: 'text'\n readOnly: true\n value: (s: S) => string\n 'data-scope': 'clipboard'\n 'data-part': 'input'\n onFocus: (e: FocusEvent) => void\n }\n indicator: {\n 'data-scope': 'clipboard'\n 'data-part': 'indicator'\n 'data-copied': (s: S) => '' | undefined\n 'aria-live': 'polite'\n }\n}\n\nexport interface ConnectOptions {\n copyLabel?: string\n onCopy?: (value: string) => void\n}\n\nexport function connect<S>(\n get: (s: S) => ClipboardState,\n send: Send<ClipboardMsg>,\n opts: ConnectOptions = {},\n): ClipboardParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const copyLabel: string | ((s: S) => string) =\n opts.copyLabel ?? ((s: S) => locale(s).clipboard.copy)\n return {\n root: {\n 'data-scope': 'clipboard',\n 'data-part': 'root',\n 'data-copied': (s) => (get(s).copied ? '' : undefined),\n },\n trigger: {\n type: 'button',\n 'aria-label': copyLabel,\n 'data-scope': 'clipboard',\n 'data-part': 'trigger',\n 'data-copied': (s) => (get(s).copied ? '' : undefined),\n onClick: () => {\n send({ type: 'copy' })\n opts.onCopy?.('')\n },\n },\n input: {\n type: 'text',\n readOnly: true,\n value: (s) => get(s).value,\n 'data-scope': 'clipboard',\n 'data-part': 'input',\n onFocus: (e) => (e.currentTarget as HTMLInputElement).select(),\n },\n indicator: {\n 'data-scope': 'clipboard',\n 'data-part': 'indicator',\n 'data-copied': (s) => (get(s).copied ? '' : undefined),\n 'aria-live': 'polite',\n },\n }\n}\n\nexport const clipboard = { init, update, connect, copyToClipboard }\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapsible.js","sourceRoot":"","sources":["../../src/components/collapsible.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Collapsible — a single expandable/collapsible section. Simpler than\n * accordion (no grouping, no keyboard navigation between siblings).\n */\n\nexport interface CollapsibleState {\n open: boolean\n disabled: boolean\n}\n\nexport type CollapsibleMsg =\n | { type: 'toggle' }\n | { type: 'open' }\n | { type: 'close' }\n | { type: 'setOpen'; open: boolean }\n\nexport interface CollapsibleInit {\n open?: boolean\n disabled?: boolean\n}\n\nexport function init(opts: CollapsibleInit = {}): CollapsibleState {\n return { open: opts.open ?? false, disabled: opts.disabled ?? false }\n}\n\nexport function update(state: CollapsibleState, msg: CollapsibleMsg): [CollapsibleState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'toggle':\n return [{ ...state, open: !state.open }, []]\n case 'open':\n return [{ ...state, open: true }, []]\n case 'close':\n return [{ ...state, open: false }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\nexport interface CollapsibleParts<S> {\n root: {\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'collapsible'\n 'data-part': 'root'\n }\n trigger: {\n type: 'button'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n disabled: (s: S) => boolean\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'collapsible'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n content: {\n role: 'region'\n id: string\n 'aria-labelledby': string\n hidden: (s: S) => boolean\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'collapsible'\n 'data-part': 'content'\n }\n}\n\nexport interface ConnectOptions {\n id: string\n}\n\nexport function connect<S>(\n get: (s: S) => CollapsibleState,\n send: Send<CollapsibleMsg>,\n opts: ConnectOptions,\n): CollapsibleParts<S> {\n const triggerId = `${opts.id}:trigger`\n const contentId = `${opts.id}:content`\n\n return {\n root: {\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'collapsible',\n 'data-part': 'root',\n },\n trigger: {\n type: 'button',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n id: triggerId,\n disabled: (s) => get(s).disabled,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'collapsible',\n 'data-part': 'trigger',\n onClick: () => send({ type: 'toggle' }),\n },\n content: {\n role: 'region',\n id: contentId,\n 'aria-labelledby': triggerId,\n hidden: (s) => !get(s).open,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'collapsible',\n 'data-part': 'content',\n },\n }\n}\n\nexport const collapsible = { init, update, connect }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from '@llui/dom';
|
|
2
|
-
import { LocaleContext } from '../locale';
|
|
2
|
+
import { LocaleContext } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return {
|
|
5
5
|
hsl: opts.hsl ?? { h: 0, s: 100, l: 50 },
|
|
@@ -178,3 +178,4 @@ export function connect(get, send, opts = {}) {
|
|
|
178
178
|
};
|
|
179
179
|
}
|
|
180
180
|
export const colorPicker = { init, update, connect, toHex, hexToHsl, hslToRgb };
|
|
181
|
+
//# sourceMappingURL=color-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picker.js","sourceRoot":"","sources":["../../src/components/color-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Color picker — HSL/HSV color selection. Tracks hue (0-360), saturation\n * (0-100), and lightness (0-100). Emits hex strings for convenience.\n */\n\nexport interface Hsl {\n h: number\n s: number\n l: number\n}\n\nexport interface ColorPickerState {\n hsl: Hsl\n /** Alpha channel 0..1. */\n alpha: number\n disabled: boolean\n}\n\nexport type ColorPickerMsg =\n | { type: 'setHsl'; hsl: Hsl }\n | { type: 'setHue'; h: number }\n | { type: 'setSaturation'; s: number }\n | { type: 'setLightness'; l: number }\n | { type: 'setAlpha'; alpha: number }\n | { type: 'setHex'; hex: string }\n\nexport interface ColorPickerInit {\n hsl?: Hsl\n alpha?: number\n disabled?: boolean\n}\n\nexport function init(opts: ColorPickerInit = {}): ColorPickerState {\n return {\n hsl: opts.hsl ?? { h: 0, s: 100, l: 50 },\n alpha: opts.alpha ?? 1,\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n))\n}\n\nexport function update(state: ColorPickerState, msg: ColorPickerMsg): [ColorPickerState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setHsl':\n return [{ ...state, hsl: msg.hsl }, []]\n case 'setHue':\n return [{ ...state, hsl: { ...state.hsl, h: ((msg.h % 360) + 360) % 360 } }, []]\n case 'setSaturation':\n return [{ ...state, hsl: { ...state.hsl, s: clamp(msg.s, 0, 100) } }, []]\n case 'setLightness':\n return [{ ...state, hsl: { ...state.hsl, l: clamp(msg.l, 0, 100) } }, []]\n case 'setAlpha':\n return [{ ...state, alpha: clamp(msg.alpha, 0, 1) }, []]\n case 'setHex': {\n const hsl = hexToHsl(msg.hex)\n return hsl ? [{ ...state, hsl }, []] : [state, []]\n }\n }\n}\n\n/** Convert HSL (h 0-360, s/l 0-100) to RGB (0-255 each). */\nexport function hslToRgb(hsl: Hsl): { r: number; g: number; b: number } {\n const s = hsl.s / 100\n const l = hsl.l / 100\n const c = (1 - Math.abs(2 * l - 1)) * s\n const x = c * (1 - Math.abs(((hsl.h / 60) % 2) - 1))\n const m = l - c / 2\n let r: number\n let g: number\n let b: number\n const h = hsl.h\n if (h < 60) [r, g, b] = [c, x, 0]\n else if (h < 120) [r, g, b] = [x, c, 0]\n else if (h < 180) [r, g, b] = [0, c, x]\n else if (h < 240) [r, g, b] = [0, x, c]\n else if (h < 300) [r, g, b] = [x, 0, c]\n else [r, g, b] = [c, 0, x]\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n }\n}\n\nexport function toHex(hsl: Hsl): string {\n const { r, g, b } = hslToRgb(hsl)\n const hex = (n: number): string => n.toString(16).padStart(2, '0')\n return `#${hex(r)}${hex(g)}${hex(b)}`\n}\n\nexport function hexToHsl(hex: string): Hsl | null {\n const normalized = hex.trim().replace(/^#/, '')\n if (!/^[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(normalized)) return null\n let r: number\n let g: number\n let b: number\n if (normalized.length === 3) {\n r = parseInt(normalized[0]! + normalized[0]!, 16)\n g = parseInt(normalized[1]! + normalized[1]!, 16)\n b = parseInt(normalized[2]! + normalized[2]!, 16)\n } else {\n r = parseInt(normalized.slice(0, 2), 16)\n g = parseInt(normalized.slice(2, 4), 16)\n b = parseInt(normalized.slice(4, 6), 16)\n }\n const rf = r / 255\n const gf = g / 255\n const bf = b / 255\n const max = Math.max(rf, gf, bf)\n const min = Math.min(rf, gf, bf)\n const d = max - min\n let h = 0\n if (d !== 0) {\n if (max === rf) h = ((gf - bf) / d) % 6\n else if (max === gf) h = (bf - rf) / d + 2\n else h = (rf - gf) / d + 4\n h *= 60\n if (h < 0) h += 360\n }\n const l = (max + min) / 2\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n return {\n h: Math.round(h),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n }\n}\n\nexport interface ColorPickerParts<S> {\n root: {\n 'data-scope': 'color-picker'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n hueSlider: {\n type: 'range'\n min: 0\n max: 360\n step: 1\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'color-picker'\n 'data-part': 'hue-slider'\n onInput: (e: Event) => void\n }\n saturationSlider: {\n type: 'range'\n min: 0\n max: 100\n step: 1\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n value: (s: S) => string\n style: (s: S) => string\n 'data-scope': 'color-picker'\n 'data-part': 'saturation-slider'\n onInput: (e: Event) => void\n }\n lightnessSlider: {\n type: 'range'\n min: 0\n max: 100\n step: 1\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n value: (s: S) => string\n style: (s: S) => string\n 'data-scope': 'color-picker'\n 'data-part': 'lightness-slider'\n onInput: (e: Event) => void\n }\n hexInput: {\n type: 'text'\n autoComplete: 'off'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'color-picker'\n 'data-part': 'hex-input'\n onInput: (e: Event) => void\n }\n swatch: {\n 'data-scope': 'color-picker'\n 'data-part': 'swatch'\n 'aria-hidden': 'true'\n style: (s: S) => string\n }\n}\n\nexport interface ConnectOptions {\n hueLabel?: string\n saturationLabel?: string\n lightnessLabel?: string\n hexLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => ColorPickerState,\n send: Send<ColorPickerMsg>,\n opts: ConnectOptions = {},\n): ColorPickerParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n return {\n root: {\n 'data-scope': 'color-picker',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n hueSlider: {\n type: 'range',\n min: 0,\n max: 360,\n step: 1,\n 'aria-label': opts.hueLabel ?? ((s: S) => locale(s).colorPicker.hue),\n disabled: (s) => get(s).disabled,\n value: (s) => String(get(s).hsl.h),\n 'data-scope': 'color-picker',\n 'data-part': 'hue-slider',\n onInput: (e) => send({ type: 'setHue', h: Number((e.target as HTMLInputElement).value) }),\n },\n saturationSlider: {\n type: 'range',\n min: 0,\n max: 100,\n step: 1,\n 'aria-label': opts.saturationLabel ?? ((s: S) => locale(s).colorPicker.saturation),\n disabled: (s) => get(s).disabled,\n value: (s) => String(get(s).hsl.s),\n style: (s) => {\n const { h, l } = get(s).hsl\n return `background: linear-gradient(to right, hsl(${h} 0% ${l}%), hsl(${h} 100% ${l}%))`\n },\n 'data-scope': 'color-picker',\n 'data-part': 'saturation-slider',\n onInput: (e) =>\n send({ type: 'setSaturation', s: Number((e.target as HTMLInputElement).value) }),\n },\n lightnessSlider: {\n type: 'range',\n min: 0,\n max: 100,\n step: 1,\n 'aria-label': opts.lightnessLabel ?? ((s: S) => locale(s).colorPicker.lightness),\n disabled: (s) => get(s).disabled,\n value: (s) => String(get(s).hsl.l),\n style: (s) => {\n const { h, s: sat } = get(s).hsl\n return `background: linear-gradient(to right, hsl(${h} ${sat}% 0%), hsl(${h} ${sat}% 50%), hsl(${h} ${sat}% 100%))`\n },\n 'data-scope': 'color-picker',\n 'data-part': 'lightness-slider',\n onInput: (e) =>\n send({ type: 'setLightness', l: Number((e.target as HTMLInputElement).value) }),\n },\n hexInput: {\n type: 'text',\n autoComplete: 'off',\n 'aria-label': opts.hexLabel ?? ((s: S) => locale(s).colorPicker.hex),\n disabled: (s) => get(s).disabled,\n value: (s) => toHex(get(s).hsl),\n 'data-scope': 'color-picker',\n 'data-part': 'hex-input',\n onInput: (e) => send({ type: 'setHex', hex: (e.target as HTMLInputElement).value }),\n },\n swatch: {\n 'data-scope': 'color-picker',\n 'data-part': 'swatch',\n 'aria-hidden': 'true',\n style: (s) => `background-color:${toHex(get(s).hsl)};`,\n },\n }\n}\n\nexport const colorPicker = { init, update, connect, toHex, hexToHsl, hslToRgb }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Send, TransitionOptions } from '@llui/dom';
|
|
2
|
-
import { type Placement } from '../utils/floating';
|
|
2
|
+
import { type Placement } from '../utils/floating.js';
|
|
3
3
|
/**
|
|
4
4
|
* Combobox — text input paired with a filtered listbox dropdown. User
|
|
5
5
|
* types to filter items, arrow keys navigate the filtered set, Enter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAKxD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { show, portal, onMount, div, useContext } from '@llui/dom';
|
|
2
|
-
import { LocaleContext } from '../locale';
|
|
3
|
-
import { pushDismissable } from '../utils/dismissable';
|
|
4
|
-
import { attachFloating } from '../utils/floating';
|
|
2
|
+
import { LocaleContext } from '../locale.js';
|
|
3
|
+
import { pushDismissable } from '../utils/dismissable.js';
|
|
4
|
+
import { attachFloating } from '../utils/floating.js';
|
|
5
5
|
export function init(opts = {}) {
|
|
6
6
|
const items = opts.items ?? [];
|
|
7
7
|
const disabledItems = opts.disabledItems ?? [];
|
|
@@ -345,3 +345,4 @@ export function overlay(opts) {
|
|
|
345
345
|
});
|
|
346
346
|
}
|
|
347
347
|
export const combobox = { init, update, connect, overlay };
|
|
348
|
+
//# sourceMappingURL=combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\nimport { pushDismissable } from '../utils/dismissable.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Combobox — text input paired with a filtered listbox dropdown. User\n * types to filter items, arrow keys navigate the filtered set, Enter\n * selects. Supports single and multiple selection.\n */\n\nexport type SelectionMode = 'single' | 'multiple'\n\nexport interface ComboboxState {\n open: boolean\n value: string[]\n inputValue: string\n items: string[]\n disabledItems: string[]\n filteredItems: string[]\n highlightedIndex: number | null\n selectionMode: SelectionMode\n disabled: boolean\n}\n\nexport type ComboboxMsg =\n | { type: 'open' }\n | { type: 'close' }\n | { type: 'setInputValue'; value: string }\n | { type: 'selectOption'; value: string }\n | { type: 'setValue'; value: string[] }\n | { type: 'clear' }\n | { type: 'highlightNext' }\n | { type: 'highlightPrev' }\n | { type: 'highlightFirst' }\n | { type: 'highlightLast' }\n | { type: 'highlight'; index: number | null }\n | { type: 'selectHighlighted' }\n | { type: 'setItems'; items: string[]; disabled?: string[] }\n\nexport interface ComboboxInit {\n value?: string[]\n inputValue?: string\n items?: string[]\n disabledItems?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n}\n\nexport function init(opts: ComboboxInit = {}): ComboboxState {\n const items = opts.items ?? []\n const disabledItems = opts.disabledItems ?? []\n const inputValue = opts.inputValue ?? ''\n return {\n open: false,\n value: opts.value ?? [],\n inputValue,\n items,\n disabledItems,\n filteredItems: filterItems(items, inputValue),\n highlightedIndex: null,\n selectionMode: opts.selectionMode ?? 'single',\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction filterItems(items: string[], query: string): string[] {\n if (query === '') return items\n const q = query.toLowerCase()\n return items.filter((item) => item.toLowerCase().includes(q))\n}\n\nfunction nextEnabledIndex(\n items: string[],\n disabled: string[],\n from: number | null,\n delta: 1 | -1,\n): number | null {\n if (items.length === 0) return null\n const start = from === null ? (delta === 1 ? -1 : items.length) : from\n const n = items.length\n for (let i = 1; i <= n; i++) {\n const idx = (start + delta * i + n * n) % n\n if (!disabled.includes(items[idx]!)) return idx\n }\n return null\n}\n\nfunction firstEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = 0; i < items.length; i++) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction lastEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = items.length - 1; i >= 0; i--) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction applySelection(state: ComboboxState, value: string): string[] {\n if (state.disabledItems.includes(value)) return state.value\n if (state.selectionMode === 'single') return [value]\n const isActive = state.value.includes(value)\n return isActive ? state.value.filter((v) => v !== value) : [...state.value, value]\n}\n\nexport function update(state: ComboboxState, msg: ComboboxMsg): [ComboboxState, never[]] {\n if (state.disabled && msg.type !== 'setItems') return [state, []]\n switch (msg.type) {\n case 'open':\n return [\n {\n ...state,\n open: true,\n highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems),\n },\n [],\n ]\n case 'close':\n return [{ ...state, open: false, highlightedIndex: null }, []]\n case 'setInputValue': {\n const filteredItems = filterItems(state.items, msg.value)\n return [\n {\n ...state,\n inputValue: msg.value,\n filteredItems,\n open: true,\n highlightedIndex: firstEnabledIndex(filteredItems, state.disabledItems),\n },\n [],\n ]\n }\n case 'selectOption': {\n const value = applySelection(state, msg.value)\n const inputValue = state.selectionMode === 'single' ? msg.value : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'clear':\n return [\n { ...state, value: [], inputValue: '', filteredItems: state.items, highlightedIndex: null },\n [],\n ]\n case 'highlight':\n return [{ ...state, highlightedIndex: msg.index }, []]\n case 'highlightNext':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n 1,\n ),\n },\n [],\n ]\n case 'highlightPrev':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n -1,\n ),\n },\n [],\n ]\n case 'highlightFirst':\n return [\n { ...state, highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'highlightLast':\n return [\n { ...state, highlightedIndex: lastEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'selectHighlighted': {\n if (state.highlightedIndex === null) return [state, []]\n const v = state.filteredItems[state.highlightedIndex]\n if (v === undefined) return [state, []]\n const value = applySelection(state, v)\n const inputValue = state.selectionMode === 'single' ? v : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setItems': {\n const disabled = msg.disabled ?? state.disabledItems\n const value = state.value.filter((v) => msg.items.includes(v) && !disabled.includes(v))\n return [\n {\n ...state,\n items: msg.items,\n disabledItems: disabled,\n filteredItems: filterItems(msg.items, state.inputValue),\n value,\n },\n [],\n ]\n }\n }\n}\n\nexport interface ComboboxItemParts<S> {\n item: {\n role: 'option'\n id: string\n 'aria-selected': (s: S) => boolean\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-state': (s: S) => 'selected' | undefined\n 'data-highlighted': (s: S) => '' | undefined\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'combobox'\n 'data-part': 'item'\n 'data-value': string\n 'data-index': string\n onClick: (e: MouseEvent) => void\n onPointerMove: (e: PointerEvent) => void\n }\n}\n\nexport interface ComboboxParts<S> {\n root: {\n role: 'combobox'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n 'aria-haspopup': 'listbox'\n 'data-scope': 'combobox'\n 'data-part': 'root'\n 'data-state': (s: S) => 'open' | 'closed'\n }\n input: {\n type: 'text'\n role: 'combobox'\n autoComplete: 'off'\n 'aria-autocomplete': 'list'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n 'aria-activedescendant': (s: S) => string | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n id: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'combobox'\n 'data-part': 'input'\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n trigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n tabIndex: -1\n 'data-scope': 'combobox'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'combobox'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'listbox'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'combobox'\n 'data-part': 'content'\n }\n item: (value: string, index: number) => ComboboxItemParts<S>\n empty: {\n 'data-scope': 'combobox'\n 'data-part': 'empty'\n }\n}\n\nexport interface ConnectOptions {\n id: string\n triggerLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => ComboboxState,\n send: Send<ComboboxMsg>,\n opts: ConnectOptions,\n): ComboboxParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const inputId = `${base}:input`\n const contentId = `${base}:content`\n const itemId = (index: number): string => `${base}:item:${index}`\n const triggerLabel: string | ((s: S) => string) =\n opts.triggerLabel ?? ((s: S) => locale(s).combobox.toggle)\n\n return {\n root: {\n role: 'combobox',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'listbox',\n 'data-scope': 'combobox',\n 'data-part': 'root',\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n },\n input: {\n type: 'text',\n role: 'combobox',\n autoComplete: 'off',\n 'aria-autocomplete': 'list',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n 'aria-activedescendant': (s) => {\n const idx = get(s).highlightedIndex\n return idx === null ? undefined : itemId(idx)\n },\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n id: inputId,\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).inputValue,\n 'data-scope': 'combobox',\n 'data-part': 'input',\n onInput: (e) => {\n const value = (e.target as HTMLInputElement).value\n send({ type: 'setInputValue', value })\n },\n onKeyDown: (e) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightPrev' })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'highlightFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'highlightLast' })\n return\n case 'Enter':\n e.preventDefault()\n send({ type: 'selectHighlighted' })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'close' })\n return\n }\n },\n onFocus: () => send({ type: 'open' }),\n },\n trigger: {\n type: 'button',\n 'aria-label': triggerLabel,\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n tabIndex: -1,\n 'data-scope': 'combobox',\n 'data-part': 'trigger',\n onClick: () => send({ type: 'open' }),\n },\n positioner: {\n 'data-scope': 'combobox',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'listbox',\n id: contentId,\n 'aria-labelledby': inputId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'combobox',\n 'data-part': 'content',\n },\n item: (value: string, index: number): ComboboxItemParts<S> => ({\n item: {\n role: 'option',\n id: itemId(index),\n 'aria-selected': (s) => get(s).value.includes(value),\n 'aria-disabled': (s) => (get(s).disabledItems.includes(value) ? 'true' : undefined),\n 'data-state': (s) => (get(s).value.includes(value) ? 'selected' : undefined),\n 'data-highlighted': (s) => (get(s).highlightedIndex === index ? '' : undefined),\n 'data-disabled': (s) => (get(s).disabledItems.includes(value) ? '' : undefined),\n 'data-scope': 'combobox',\n 'data-part': 'item',\n 'data-value': value,\n 'data-index': String(index),\n onClick: () => send({ type: 'selectOption', value }),\n onPointerMove: () => send({ type: 'highlight', index }),\n },\n }),\n empty: {\n 'data-scope': 'combobox',\n 'data-part': 'empty',\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => ComboboxState\n send: Send<ComboboxMsg>\n parts: ComboboxParts<S>\n content: () => Node[]\n placement?: Placement\n offset?: number\n flip?: boolean\n shift?: boolean\n sameWidth?: boolean\n transition?: TransitionOptions\n target?: string | HTMLElement\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom-start'\n const offset = opts.offset ?? 4\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const sameWidth = opts.sameWidth !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const inputId = parts.input.id\n\n return show<S, ComboboxMsg>({\n when: (s) => opts.get(s).open,\n render: () =>\n portal({\n target,\n render: () => {\n onMount(() => {\n const contentEl = document.getElementById(contentId)\n const inputEl = document.getElementById(inputId)\n if (!contentEl || !inputEl) return\n\n const cleanups: Array<() => void> = []\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n if (sameWidth) {\n floatingEl.style.minWidth = `${inputEl.offsetWidth}px`\n }\n cleanups.push(\n attachFloating({\n anchor: inputEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n }),\n )\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [inputEl],\n onDismiss: () => opts.send({ type: 'close' }),\n }),\n )\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) cleanups[i]!()\n }\n })\n return [div(parts.positioner, opts.content())]\n },\n }),\n enter: opts.transition?.enter,\n leave: opts.transition?.leave,\n })\n}\n\nexport const combobox = { init, update, connect, overlay }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { show, portal, onMount, div } from '@llui/dom';
|
|
2
|
-
import { pushDismissable } from '../utils/dismissable';
|
|
2
|
+
import { pushDismissable } from '../utils/dismissable.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return {
|
|
5
5
|
open: false,
|
|
@@ -175,3 +175,4 @@ export function overlay(opts) {
|
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
export const contextMenu = { init, update, connect, overlay };
|
|
178
|
+
//# sourceMappingURL=context-menu.js.map
|