@llui/components 0.0.30 → 0.0.33
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.d.ts +27 -9
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +4 -3
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/angle-slider.d.ts +15 -5
- package/dist/components/angle-slider.d.ts.map +1 -1
- package/dist/components/angle-slider.js +3 -2
- package/dist/components/angle-slider.js.map +1 -1
- package/dist/components/async-list.d.ts +18 -6
- package/dist/components/async-list.d.ts.map +1 -1
- package/dist/components/async-list.js +3 -2
- package/dist/components/async-list.js.map +1 -1
- package/dist/components/avatar.d.ts +12 -4
- package/dist/components/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +4 -3
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/carousel.d.ts +21 -7
- package/dist/components/carousel.d.ts.map +1 -1
- package/dist/components/carousel.js +8 -8
- package/dist/components/carousel.js.map +1 -1
- package/dist/components/cascade-select.d.ts +9 -3
- package/dist/components/cascade-select.d.ts.map +1 -1
- package/dist/components/cascade-select.js +4 -4
- package/dist/components/cascade-select.js.map +1 -1
- package/dist/components/checkbox.d.ts +9 -3
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +4 -3
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard.d.ts +12 -4
- package/dist/components/clipboard.d.ts.map +1 -1
- package/dist/components/clipboard.js +3 -3
- package/dist/components/clipboard.js.map +1 -1
- package/dist/components/collapsible.d.ts +12 -4
- package/dist/components/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible.js +2 -1
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/color-picker.d.ts +18 -6
- package/dist/components/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker.js +5 -5
- package/dist/components/color-picker.js.map +1 -1
- package/dist/components/combobox.d.ts +39 -13
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +17 -9
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/context-menu.d.ts +24 -8
- package/dist/components/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu.js +8 -8
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/date-input.d.ts +21 -6
- package/dist/components/date-input.d.ts.map +1 -1
- package/dist/components/date-input.js +4 -4
- package/dist/components/date-input.js.map +1 -1
- package/dist/components/date-picker.d.ts +36 -12
- package/dist/components/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker.js +15 -8
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dialog.d.ts +12 -4
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +3 -3
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/drawer.d.ts +12 -4
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +3 -3
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/editable.d.ts +15 -5
- package/dist/components/editable.d.ts.map +1 -1
- package/dist/components/editable.js +14 -13
- package/dist/components/editable.js.map +1 -1
- package/dist/components/file-upload.d.ts +30 -10
- package/dist/components/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload.js +10 -10
- package/dist/components/file-upload.js.map +1 -1
- package/dist/components/floating-panel.d.ts +48 -16
- package/dist/components/floating-panel.d.ts.map +1 -1
- package/dist/components/floating-panel.js +6 -6
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form.d.ts +18 -6
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/form.js +2 -1
- package/dist/components/form.js.map +1 -1
- package/dist/components/image-cropper.d.ts +33 -11
- package/dist/components/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper.js +6 -6
- package/dist/components/image-cropper.js.map +1 -1
- package/dist/components/listbox.d.ts +33 -11
- package/dist/components/listbox.d.ts.map +1 -1
- package/dist/components/listbox.js +12 -4
- package/dist/components/listbox.js.map +1 -1
- package/dist/components/marquee.d.ts +21 -7
- package/dist/components/marquee.d.ts.map +1 -1
- package/dist/components/marquee.js +3 -2
- package/dist/components/marquee.js.map +1 -1
- package/dist/components/menu.d.ts +36 -12
- package/dist/components/menu.d.ts.map +1 -1
- package/dist/components/menu.js +23 -9
- package/dist/components/menu.js.map +1 -1
- package/dist/components/navigation-menu.d.ts +15 -5
- package/dist/components/navigation-menu.d.ts.map +1 -1
- package/dist/components/navigation-menu.js +8 -8
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/number-input.d.ts +24 -8
- package/dist/components/number-input.d.ts.map +1 -1
- package/dist/components/number-input.js +8 -8
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/pagination.d.ts +21 -7
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +4 -4
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/password-input.d.ts +9 -3
- package/dist/components/password-input.d.ts.map +1 -1
- package/dist/components/password-input.js +3 -3
- package/dist/components/password-input.js.map +1 -1
- package/dist/components/pin-input.d.ts +15 -5
- package/dist/components/pin-input.d.ts.map +1 -1
- package/dist/components/pin-input.js +8 -7
- package/dist/components/pin-input.js.map +1 -1
- package/dist/components/popover.d.ts +12 -4
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +3 -3
- package/dist/components/popover.js.map +1 -1
- package/dist/components/presence.d.ts +15 -5
- package/dist/components/presence.d.ts.map +1 -1
- package/dist/components/presence.js.map +1 -1
- package/dist/components/progress.d.ts +6 -2
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js.map +1 -1
- package/dist/components/qr-code.d.ts +9 -3
- package/dist/components/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code.js.map +1 -1
- package/dist/components/radio-group.d.ts +18 -6
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +4 -3
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/rating-group.d.ts +21 -7
- package/dist/components/rating-group.d.ts.map +1 -1
- package/dist/components/rating-group.js +8 -7
- package/dist/components/rating-group.js.map +1 -1
- package/dist/components/scroll-area.d.ts +9 -3
- package/dist/components/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area.js +5 -4
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/select.d.ts +42 -14
- package/dist/components/select.d.ts.map +1 -1
- package/dist/components/select.js +4 -4
- package/dist/components/select.js.map +1 -1
- package/dist/components/signature-pad.d.ts +24 -8
- package/dist/components/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad.js +3 -3
- package/dist/components/signature-pad.js.map +1 -1
- package/dist/components/slider.d.ts +21 -7
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/sortable.d.ts +18 -6
- package/dist/components/sortable.d.ts.map +1 -1
- package/dist/components/sortable.js +11 -10
- package/dist/components/sortable.js.map +1 -1
- package/dist/components/splitter.d.ts +21 -7
- package/dist/components/splitter.d.ts.map +1 -1
- package/dist/components/splitter.js +5 -4
- package/dist/components/splitter.js.map +1 -1
- package/dist/components/steps.d.ts +21 -7
- package/dist/components/steps.d.ts.map +1 -1
- package/dist/components/steps.js +4 -4
- package/dist/components/steps.js.map +1 -1
- package/dist/components/switch.d.ts +9 -3
- package/dist/components/switch.d.ts.map +1 -1
- package/dist/components/switch.js +4 -3
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.d.ts +24 -8
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +7 -6
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tags-input.d.ts +27 -9
- package/dist/components/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input.js +10 -10
- package/dist/components/tags-input.js.map +1 -1
- package/dist/components/theme-switch.d.ts.map +1 -1
- package/dist/components/theme-switch.js +3 -2
- package/dist/components/theme-switch.js.map +1 -1
- package/dist/components/time-picker.d.ts +27 -9
- package/dist/components/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker.js +10 -10
- package/dist/components/time-picker.js.map +1 -1
- package/dist/components/timer.d.ts +15 -5
- package/dist/components/timer.d.ts.map +1 -1
- package/dist/components/timer.js +4 -4
- package/dist/components/timer.js.map +1 -1
- package/dist/components/toast.d.ts +24 -8
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +6 -6
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toc.d.ts +15 -5
- package/dist/components/toc.d.ts.map +1 -1
- package/dist/components/toc.js +2 -2
- package/dist/components/toc.js.map +1 -1
- package/dist/components/toggle-group.d.ts +15 -5
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +4 -3
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +9 -3
- package/dist/components/toggle.d.ts.map +1 -1
- package/dist/components/toggle.js +4 -3
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tooltip.d.ts +12 -4
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +3 -3
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/tour.d.ts +18 -6
- package/dist/components/tour.d.ts.map +1 -1
- package/dist/components/tour.js +6 -6
- package/dist/components/tour.js.map +1 -1
- package/dist/components/tree-view.d.ts +75 -25
- package/dist/components/tree-view.d.ts.map +1 -1
- package/dist/components/tree-view.js +18 -7
- package/dist/components/tree-view.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKrC;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useContext } from '@llui/dom';
|
|
1
|
+
import { useContext, tagSend } from '@llui/dom';
|
|
2
2
|
import { LocaleContext, en } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return {
|
|
@@ -100,7 +100,7 @@ export function connect(get, send, opts = {}) {
|
|
|
100
100
|
disabled: (s) => get(s).page <= 1 || get(s).disabled,
|
|
101
101
|
'data-scope': 'pagination',
|
|
102
102
|
'data-part': 'prev-trigger',
|
|
103
|
-
onClick: () => send({ type: 'prev' }),
|
|
103
|
+
onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),
|
|
104
104
|
},
|
|
105
105
|
nextTrigger: {
|
|
106
106
|
type: 'button',
|
|
@@ -115,7 +115,7 @@ export function connect(get, send, opts = {}) {
|
|
|
115
115
|
},
|
|
116
116
|
'data-scope': 'pagination',
|
|
117
117
|
'data-part': 'next-trigger',
|
|
118
|
-
onClick: () => send({ type: 'next' }),
|
|
118
|
+
onClick: tagSend(send, ['next'], () => send({ type: 'next' })),
|
|
119
119
|
},
|
|
120
120
|
item: (page) => ({
|
|
121
121
|
type: 'button',
|
|
@@ -125,7 +125,7 @@ export function connect(get, send, opts = {}) {
|
|
|
125
125
|
'data-scope': 'pagination',
|
|
126
126
|
'data-part': 'item',
|
|
127
127
|
'data-value': String(page),
|
|
128
|
-
onClick: () => send({ type: 'goTo', page }),
|
|
128
|
+
onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', page })),
|
|
129
129
|
}),
|
|
130
130
|
ellipsis: (position) => ({
|
|
131
131
|
'aria-hidden': 'true',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAoChD,MAAM,UAAU,IAAI,CAAC,OAAuB,EAAE;IAC5C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;QACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;QAC5B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;KACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAsB,EAAE,GAAkB;IAC/D,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7D,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACnE,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACnE,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,oDAAoD;YACpD,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;YACpE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxF,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;YACpE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;AACH,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAsB;IAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE1B,yEAAyE;IACzE,0BAA0B;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3E,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IACxD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAEjD,wDAAwD;IACxD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAqDD,MAAM,UAAU,OAAO,CACrB,GAA8B,EAC9B,IAAyB,EACzB,OAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,UAAU,CAAY,aAAa,CAAC,CAAA;IACnD,MAAM,KAAK,GAAgC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/F,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACzD,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAA;IAEtD,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC3D;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAClF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ;YACpD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtC;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;gBACrB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;gBACjB,OAAO,EAAE,CAAC,IAAI,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;YACtE,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;gBACjB,OAAO,EAAE,CAAC,IAAI,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAA;YACjD,CAAC;YACD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtC;QACD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC;YAC7B,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAClE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC5C,CAAC;QACF,QAAQ,EAAE,CAAC,QAAyB,EAAE,EAAE,CAAC,CAAC;YACxC,aAAa,EAAE,MAAM;YACrB,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,UAAU;YACvB,eAAe,EAAE,QAAQ;SAC1B,CAAC;KACH,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA","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 * Pagination — page navigation with ellipses for large ranges.\n * `page` is 1-based. Siblings are the count of pages shown on each side\n * of the current page. Boundaries are shown at the start/end.\n */\n\nexport interface PaginationState {\n page: number\n pageSize: number\n total: number\n siblings: number\n boundaries: number\n disabled: boolean\n}\n\nexport type PaginationMsg =\n | { type: 'goTo'; page: number }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'first' }\n | { type: 'last' }\n | { type: 'setPageSize'; pageSize: number }\n | { type: 'setTotal'; total: number }\n\nexport interface PaginationInit {\n page?: number\n pageSize?: number\n total?: number\n siblings?: number\n boundaries?: number\n disabled?: boolean\n}\n\nexport function init(opts: PaginationInit = {}): PaginationState {\n return {\n page: opts.page ?? 1,\n pageSize: opts.pageSize ?? 10,\n total: opts.total ?? 0,\n siblings: opts.siblings ?? 1,\n boundaries: opts.boundaries ?? 1,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function totalPages(state: PaginationState): number {\n if (state.pageSize <= 0 || state.total <= 0) return 0\n return Math.max(1, Math.ceil(state.total / state.pageSize))\n}\n\nfunction clampPage(page: number, total: number): number {\n if (total === 0) return 1\n return Math.max(1, Math.min(page, total))\n}\n\nexport function update(state: PaginationState, msg: PaginationMsg): [PaginationState, never[]] {\n if (state.disabled) return [state, []]\n const pages = totalPages(state)\n switch (msg.type) {\n case 'goTo':\n return [{ ...state, page: clampPage(msg.page, pages) }, []]\n case 'next':\n return [{ ...state, page: clampPage(state.page + 1, pages) }, []]\n case 'prev':\n return [{ ...state, page: clampPage(state.page - 1, pages) }, []]\n case 'first':\n return [{ ...state, page: 1 }, []]\n case 'last':\n return [{ ...state, page: pages }, []]\n case 'setPageSize': {\n // Preserve first visible item when pageSize changes\n const firstItem = (state.page - 1) * state.pageSize\n const nextPage = Math.floor(firstItem / msg.pageSize) + 1\n const nextPages = Math.max(1, Math.ceil(state.total / msg.pageSize))\n return [{ ...state, pageSize: msg.pageSize, page: Math.min(nextPage, nextPages) }, []]\n }\n case 'setTotal': {\n const nextPages = Math.max(1, Math.ceil(msg.total / state.pageSize))\n return [{ ...state, total: msg.total, page: Math.min(state.page, nextPages) }, []]\n }\n }\n}\n\nexport type PageItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; position: 'start' | 'end' }\n\n/**\n * Compute the visible page buttons with ellipses:\n * `[first ..boundaries] … [siblings around current] … [boundaries ..last]`.\n */\nexport function pageItems(state: PaginationState): PageItem[] {\n const pages = totalPages(state)\n if (pages === 0) return []\n\n // Build the set of pages we want to show: first boundary, last boundary,\n // and current ± siblings.\n const pageSet = new Set<number>()\n for (let i = 1; i <= Math.min(state.boundaries, pages); i++) pageSet.add(i)\n for (let i = Math.max(pages - state.boundaries + 1, 1); i <= pages; i++) pageSet.add(i)\n const start = Math.max(1, state.page - state.siblings)\n const end = Math.min(pages, state.page + state.siblings)\n for (let i = start; i <= end; i++) pageSet.add(i)\n\n // Emit items in order, inserting ellipses for gaps > 1.\n const sorted = [...pageSet].sort((a, b) => a - b)\n const items: PageItem[] = []\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!\n items.push({ type: 'page', page })\n if (i < sorted.length - 1 && sorted[i + 1]! - page > 1) {\n items.push({ type: 'ellipsis', position: page < state.page ? 'start' : 'end' })\n }\n }\n return items\n}\n\nexport interface PaginationParts<S> {\n root: {\n role: 'navigation'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'pagination'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n prevTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'next-trigger'\n onClick: (e: MouseEvent) => void\n }\n item: (page: number) => {\n type: 'button'\n 'aria-label': string\n 'aria-current': (s: S) => 'page' | undefined\n 'data-selected': (s: S) => '' | undefined\n 'data-scope': 'pagination'\n 'data-part': 'item'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n }\n ellipsis: (position: 'start' | 'end') => {\n 'aria-hidden': 'true'\n 'data-scope': 'pagination'\n 'data-part': 'ellipsis'\n 'data-position': 'start' | 'end'\n }\n}\n\nexport interface ConnectOptions {\n label?: string\n prevLabel?: string\n nextLabel?: string\n pageLabel?: (page: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => PaginationState,\n send: Send<PaginationMsg>,\n opts: ConnectOptions = {},\n): PaginationParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const label: string | ((s: S) => string) = opts.label ?? ((s: S) => locale(s).pagination.label)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).pagination.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).pagination.next)\n const pageLabel = opts.pageLabel ?? en.pagination.page\n\n return {\n root: {\n role: 'navigation',\n 'aria-label': label,\n 'data-scope': 'pagination',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n 'aria-disabled': (s) => (get(s).page <= 1 || get(s).disabled ? 'true' : undefined),\n disabled: (s) => get(s).page <= 1 || get(s).disabled,\n 'data-scope': 'pagination',\n 'data-part': 'prev-trigger',\n onClick: () => send({ type: 'prev' }),\n },\n nextTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n 'aria-disabled': (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled ? 'true' : undefined\n },\n disabled: (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled\n },\n 'data-scope': 'pagination',\n 'data-part': 'next-trigger',\n onClick: () => send({ type: 'next' }),\n },\n item: (page: number) => ({\n type: 'button',\n 'aria-label': pageLabel(page),\n 'aria-current': (s) => (get(s).page === page ? 'page' : undefined),\n 'data-selected': (s) => (get(s).page === page ? '' : undefined),\n 'data-scope': 'pagination',\n 'data-part': 'item',\n 'data-value': String(page),\n onClick: () => send({ type: 'goTo', page }),\n }),\n ellipsis: (position: 'start' | 'end') => ({\n 'aria-hidden': 'true',\n 'data-scope': 'pagination',\n 'data-part': 'ellipsis',\n 'data-position': position,\n }),\n }\n}\n\nexport const pagination = { init, update, connect, totalPages, pageItems }\n"]}
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Pagination — page navigation with ellipses for large ranges.\n * `page` is 1-based. Siblings are the count of pages shown on each side\n * of the current page. Boundaries are shown at the start/end.\n */\n\nexport interface PaginationState {\n page: number\n pageSize: number\n total: number\n siblings: number\n boundaries: number\n disabled: boolean\n}\n\nexport type PaginationMsg =\n /** @intent(\"Jump to a specific 1-based page number\") */\n | { type: 'goTo'; page: number }\n /** @intent(\"Advance to the next page\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous page\") */\n | { type: 'prev' }\n /** @intent(\"Jump to the first page\") */\n | { type: 'first' }\n /** @intent(\"Jump to the last page\") */\n | { type: 'last' }\n /** @intent(\"Change how many items each page contains\") */\n | { type: 'setPageSize'; pageSize: number }\n /** @humanOnly */\n | { type: 'setTotal'; total: number }\n\nexport interface PaginationInit {\n page?: number\n pageSize?: number\n total?: number\n siblings?: number\n boundaries?: number\n disabled?: boolean\n}\n\nexport function init(opts: PaginationInit = {}): PaginationState {\n return {\n page: opts.page ?? 1,\n pageSize: opts.pageSize ?? 10,\n total: opts.total ?? 0,\n siblings: opts.siblings ?? 1,\n boundaries: opts.boundaries ?? 1,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function totalPages(state: PaginationState): number {\n if (state.pageSize <= 0 || state.total <= 0) return 0\n return Math.max(1, Math.ceil(state.total / state.pageSize))\n}\n\nfunction clampPage(page: number, total: number): number {\n if (total === 0) return 1\n return Math.max(1, Math.min(page, total))\n}\n\nexport function update(state: PaginationState, msg: PaginationMsg): [PaginationState, never[]] {\n if (state.disabled) return [state, []]\n const pages = totalPages(state)\n switch (msg.type) {\n case 'goTo':\n return [{ ...state, page: clampPage(msg.page, pages) }, []]\n case 'next':\n return [{ ...state, page: clampPage(state.page + 1, pages) }, []]\n case 'prev':\n return [{ ...state, page: clampPage(state.page - 1, pages) }, []]\n case 'first':\n return [{ ...state, page: 1 }, []]\n case 'last':\n return [{ ...state, page: pages }, []]\n case 'setPageSize': {\n // Preserve first visible item when pageSize changes\n const firstItem = (state.page - 1) * state.pageSize\n const nextPage = Math.floor(firstItem / msg.pageSize) + 1\n const nextPages = Math.max(1, Math.ceil(state.total / msg.pageSize))\n return [{ ...state, pageSize: msg.pageSize, page: Math.min(nextPage, nextPages) }, []]\n }\n case 'setTotal': {\n const nextPages = Math.max(1, Math.ceil(msg.total / state.pageSize))\n return [{ ...state, total: msg.total, page: Math.min(state.page, nextPages) }, []]\n }\n }\n}\n\nexport type PageItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; position: 'start' | 'end' }\n\n/**\n * Compute the visible page buttons with ellipses:\n * `[first ..boundaries] … [siblings around current] … [boundaries ..last]`.\n */\nexport function pageItems(state: PaginationState): PageItem[] {\n const pages = totalPages(state)\n if (pages === 0) return []\n\n // Build the set of pages we want to show: first boundary, last boundary,\n // and current ± siblings.\n const pageSet = new Set<number>()\n for (let i = 1; i <= Math.min(state.boundaries, pages); i++) pageSet.add(i)\n for (let i = Math.max(pages - state.boundaries + 1, 1); i <= pages; i++) pageSet.add(i)\n const start = Math.max(1, state.page - state.siblings)\n const end = Math.min(pages, state.page + state.siblings)\n for (let i = start; i <= end; i++) pageSet.add(i)\n\n // Emit items in order, inserting ellipses for gaps > 1.\n const sorted = [...pageSet].sort((a, b) => a - b)\n const items: PageItem[] = []\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!\n items.push({ type: 'page', page })\n if (i < sorted.length - 1 && sorted[i + 1]! - page > 1) {\n items.push({ type: 'ellipsis', position: page < state.page ? 'start' : 'end' })\n }\n }\n return items\n}\n\nexport interface PaginationParts<S> {\n root: {\n role: 'navigation'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'pagination'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n prevTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'next-trigger'\n onClick: (e: MouseEvent) => void\n }\n item: (page: number) => {\n type: 'button'\n 'aria-label': string\n 'aria-current': (s: S) => 'page' | undefined\n 'data-selected': (s: S) => '' | undefined\n 'data-scope': 'pagination'\n 'data-part': 'item'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n }\n ellipsis: (position: 'start' | 'end') => {\n 'aria-hidden': 'true'\n 'data-scope': 'pagination'\n 'data-part': 'ellipsis'\n 'data-position': 'start' | 'end'\n }\n}\n\nexport interface ConnectOptions {\n label?: string\n prevLabel?: string\n nextLabel?: string\n pageLabel?: (page: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => PaginationState,\n send: Send<PaginationMsg>,\n opts: ConnectOptions = {},\n): PaginationParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const label: string | ((s: S) => string) = opts.label ?? ((s: S) => locale(s).pagination.label)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).pagination.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).pagination.next)\n const pageLabel = opts.pageLabel ?? en.pagination.page\n\n return {\n root: {\n role: 'navigation',\n 'aria-label': label,\n 'data-scope': 'pagination',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n 'aria-disabled': (s) => (get(s).page <= 1 || get(s).disabled ? 'true' : undefined),\n disabled: (s) => get(s).page <= 1 || get(s).disabled,\n 'data-scope': 'pagination',\n 'data-part': 'prev-trigger',\n onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),\n },\n nextTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n 'aria-disabled': (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled ? 'true' : undefined\n },\n disabled: (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled\n },\n 'data-scope': 'pagination',\n 'data-part': 'next-trigger',\n onClick: tagSend(send, ['next'], () => send({ type: 'next' })),\n },\n item: (page: number) => ({\n type: 'button',\n 'aria-label': pageLabel(page),\n 'aria-current': (s) => (get(s).page === page ? 'page' : undefined),\n 'data-selected': (s) => (get(s).page === page ? '' : undefined),\n 'data-scope': 'pagination',\n 'data-part': 'item',\n 'data-value': String(page),\n onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', page })),\n }),\n ellipsis: (position: 'start' | 'end') => ({\n 'aria-hidden': 'true',\n 'data-scope': 'pagination',\n 'data-part': 'ellipsis',\n 'data-position': position,\n }),\n }\n}\n\nexport const pagination = { init, update, connect, totalPages, pageItems }\n"]}
|
|
@@ -7,12 +7,18 @@ export interface PasswordInputState {
|
|
|
7
7
|
visible: boolean;
|
|
8
8
|
disabled: boolean;
|
|
9
9
|
}
|
|
10
|
-
export type PasswordInputMsg =
|
|
10
|
+
export type PasswordInputMsg =
|
|
11
|
+
/** @intent("Update the password value as the user types") */
|
|
12
|
+
{
|
|
11
13
|
type: 'setValue';
|
|
12
14
|
value: string;
|
|
13
|
-
}
|
|
15
|
+
}
|
|
16
|
+
/** @intent("Toggle the show/hide-password state") */
|
|
17
|
+
| {
|
|
14
18
|
type: 'toggleVisibility';
|
|
15
|
-
}
|
|
19
|
+
}
|
|
20
|
+
/** @intent("Set the show/hide-password state to a specific value") */
|
|
21
|
+
| {
|
|
16
22
|
type: 'setVisible';
|
|
17
23
|
visible: boolean;
|
|
18
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-input.d.ts","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKrC;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"password-input.d.ts","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKrC;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB;AAC1B,6DAA6D;AAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrC,qDAAqD;GACnD;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE;AAC9B,sEAAsE;GACpE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,CAMrE;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,gBAAgB,GACpB,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAU/B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,EAAE;QACJ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;KAC1C,CAAA;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,UAAU,CAAA;QACnC,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACvB,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,OAAO,CAAA;QACpB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAC5B,CAAA;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAC9B,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACjC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,QAAQ,EAAE,CAAC,CAAC,CAAA;QACZ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,oBAAoB,CAAA;QACjC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAkB,EACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC5B,IAAI,GAAE,cAAmB,GACxB,kBAAkB,CAAC,CAAC,CAAC,CAsCvB;AAED,eAAO,MAAM,aAAa;;;;CAA4B,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useContext } from '@llui/dom';
|
|
1
|
+
import { useContext, tagSend } from '@llui/dom';
|
|
2
2
|
import { LocaleContext } from '../locale.js';
|
|
3
3
|
export function init(opts = {}) {
|
|
4
4
|
return {
|
|
@@ -38,7 +38,7 @@ export function connect(get, send, opts = {}) {
|
|
|
38
38
|
value: (s) => get(s).value,
|
|
39
39
|
'data-scope': 'password-input',
|
|
40
40
|
'data-part': 'input',
|
|
41
|
-
onInput: (e) => send({ type: 'setValue', value: e.target.value }),
|
|
41
|
+
onInput: tagSend(send, ['setValue'], (e) => send({ type: 'setValue', value: e.target.value })),
|
|
42
42
|
},
|
|
43
43
|
visibilityTrigger: {
|
|
44
44
|
type: 'button',
|
|
@@ -50,7 +50,7 @@ export function connect(get, send, opts = {}) {
|
|
|
50
50
|
tabIndex: -1,
|
|
51
51
|
'data-scope': 'password-input',
|
|
52
52
|
'data-part': 'visibility-trigger',
|
|
53
|
-
onClick: () => send({ type: 'toggleVisibility' }),
|
|
53
|
+
onClick: tagSend(send, ['toggleVisibility'], () => send({ type: 'toggleVisibility' })),
|
|
54
54
|
},
|
|
55
55
|
};
|
|
56
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-input.js","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"password-input.js","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Password input — text input with show/hide visibility toggle.\n */\n\nexport interface PasswordInputState {\n value: string\n visible: boolean\n disabled: boolean\n}\n\nexport type PasswordInputMsg =\n /** @intent(\"Update the password value as the user types\") */\n | { type: 'setValue'; value: string }\n /** @intent(\"Toggle the show/hide-password state\") */\n | { type: 'toggleVisibility' }\n /** @intent(\"Set the show/hide-password state to a specific value\") */\n | { type: 'setVisible'; visible: boolean }\n\nexport interface PasswordInputInit {\n value?: string\n visible?: boolean\n disabled?: boolean\n}\n\nexport function init(opts: PasswordInputInit = {}): PasswordInputState {\n return {\n value: opts.value ?? '',\n visible: opts.visible ?? false,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function update(\n state: PasswordInputState,\n msg: PasswordInputMsg,\n): [PasswordInputState, never[]] {\n if (state.disabled && msg.type !== 'setValue') return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'toggleVisibility':\n return [{ ...state, visible: !state.visible }, []]\n case 'setVisible':\n return [{ ...state, visible: msg.visible }, []]\n }\n}\n\nexport interface PasswordInputParts<S> {\n root: {\n 'data-scope': 'password-input'\n 'data-part': 'root'\n 'data-visible': (s: S) => '' | undefined\n 'data-disabled': (s: S) => '' | undefined\n }\n input: {\n type: (s: S) => 'text' | 'password'\n autoComplete: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'password-input'\n 'data-part': 'input'\n onInput: (e: Event) => void\n }\n visibilityTrigger: {\n type: 'button'\n 'aria-label': (s: S) => string\n 'aria-pressed': (s: S) => boolean\n disabled: (s: S) => boolean\n tabIndex: -1\n 'data-scope': 'password-input'\n 'data-part': 'visibility-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n autoComplete?: string\n showLabel?: string\n hideLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PasswordInputState,\n send: Send<PasswordInputMsg>,\n opts: ConnectOptions = {},\n): PasswordInputParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const autoComplete = opts.autoComplete ?? 'current-password'\n const showLabel = opts.showLabel\n const hideLabel = opts.hideLabel\n\n return {\n root: {\n 'data-scope': 'password-input',\n 'data-part': 'root',\n 'data-visible': (s) => (get(s).visible ? '' : undefined),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n input: {\n type: (s) => (get(s).visible ? 'text' : 'password'),\n autoComplete,\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).value,\n 'data-scope': 'password-input',\n 'data-part': 'input',\n onInput: tagSend(send, ['setValue'], (e) =>\n send({ type: 'setValue', value: (e.target as HTMLInputElement).value }),\n ),\n },\n visibilityTrigger: {\n type: 'button',\n 'aria-label': (s) =>\n get(s).visible\n ? (hideLabel ?? locale(s).passwordInput.hide)\n : (showLabel ?? locale(s).passwordInput.show),\n 'aria-pressed': (s) => get(s).visible,\n disabled: (s) => get(s).disabled,\n tabIndex: -1,\n 'data-scope': 'password-input',\n 'data-part': 'visibility-trigger',\n onClick: tagSend(send, ['toggleVisibility'], () => send({ type: 'toggleVisibility' })),\n },\n }\n}\n\nexport const passwordInput = { init, update, connect }\n"]}
|
|
@@ -13,19 +13,29 @@ export interface PinInputState {
|
|
|
13
13
|
disabled: boolean;
|
|
14
14
|
focusedIndex: number;
|
|
15
15
|
}
|
|
16
|
-
export type PinInputMsg =
|
|
16
|
+
export type PinInputMsg =
|
|
17
|
+
/** @intent("Set the character at a given field index (auto-advances focus on accept)") */
|
|
18
|
+
{
|
|
17
19
|
type: 'setValue';
|
|
18
20
|
index: number;
|
|
19
21
|
value: string;
|
|
20
|
-
}
|
|
22
|
+
}
|
|
23
|
+
/** @intent("Replace every field at once (typically from paste)") */
|
|
24
|
+
| {
|
|
21
25
|
type: 'setAll';
|
|
22
26
|
values: string[];
|
|
23
|
-
}
|
|
27
|
+
}
|
|
28
|
+
/** @humanOnly */
|
|
29
|
+
| {
|
|
24
30
|
type: 'focus';
|
|
25
31
|
index: number;
|
|
26
|
-
}
|
|
32
|
+
}
|
|
33
|
+
/** @intent("Clear every field") */
|
|
34
|
+
| {
|
|
27
35
|
type: 'clear';
|
|
28
|
-
}
|
|
36
|
+
}
|
|
37
|
+
/** @humanOnly */
|
|
38
|
+
| {
|
|
29
39
|
type: 'backspace';
|
|
30
40
|
index: number;
|
|
31
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin-input.d.ts","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pin-input.d.ts","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { tagSend } from '@llui/dom';
|
|
1
2
|
import { flipArrow } from '../utils/direction.js';
|
|
2
3
|
import { en } from '../locale.js';
|
|
3
4
|
export function init(opts = {}) {
|
|
@@ -107,7 +108,7 @@ export function connect(get, send, opts) {
|
|
|
107
108
|
'data-scope': 'pin-input',
|
|
108
109
|
'data-part': 'input',
|
|
109
110
|
'data-index': String(index),
|
|
110
|
-
onInput: (e) => {
|
|
111
|
+
onInput: tagSend(send, ['setValue'], (e) => {
|
|
111
112
|
const value = e.target.value;
|
|
112
113
|
if (validate && value !== '') {
|
|
113
114
|
const errors = validate(value.slice(-1));
|
|
@@ -115,8 +116,8 @@ export function connect(get, send, opts) {
|
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
118
|
send({ type: 'setValue', index, value });
|
|
118
|
-
},
|
|
119
|
-
onKeyDown: (e) => {
|
|
119
|
+
}),
|
|
120
|
+
onKeyDown: tagSend(send, ['backspace', 'focus'], (e) => {
|
|
120
121
|
const key = flipArrow(e.key, e.currentTarget);
|
|
121
122
|
if (key === 'Backspace') {
|
|
122
123
|
send({ type: 'backspace', index });
|
|
@@ -129,13 +130,13 @@ export function connect(get, send, opts) {
|
|
|
129
130
|
e.preventDefault();
|
|
130
131
|
send({ type: 'focus', index: index + 1 });
|
|
131
132
|
}
|
|
132
|
-
},
|
|
133
|
-
onFocus: () => send({ type: 'focus', index }),
|
|
134
|
-
onPaste: (e) => {
|
|
133
|
+
}),
|
|
134
|
+
onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', index })),
|
|
135
|
+
onPaste: tagSend(send, ['setAll'], (e) => {
|
|
135
136
|
e.preventDefault();
|
|
136
137
|
const text = e.clipboardData?.getData('text') ?? '';
|
|
137
138
|
send({ type: 'setAll', values: text.split('') });
|
|
138
|
-
},
|
|
139
|
+
}),
|
|
139
140
|
}),
|
|
140
141
|
};
|
|
141
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin-input.js","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { en } from '../locale.js'\n\n/**\n * Pin input — a sequence of single-character fields for OTP codes, etc.\n * Auto-advances on input, handles backspace to previous field, supports\n * paste-to-fill across multiple fields.\n */\n\nexport type PinType = 'numeric' | 'alphanumeric' | 'alphabetic'\n\nexport interface PinInputState {\n values: string[]\n length: number\n type: PinType\n mask: boolean\n disabled: boolean\n focusedIndex: number\n}\n\nexport type PinInputMsg =\n | { type: 'setValue'; index: number; value: string }\n | { type: 'setAll'; values: string[] }\n | { type: 'focus'; index: number }\n | { type: 'clear' }\n | { type: 'backspace'; index: number }\n\nexport interface PinInputInit {\n length?: number\n type?: PinType\n mask?: boolean\n disabled?: boolean\n values?: string[]\n}\n\nexport function init(opts: PinInputInit = {}): PinInputState {\n const length = opts.length ?? 4\n const values = opts.values ?? new Array<string>(length).fill('')\n return {\n values,\n length,\n type: opts.type ?? 'numeric',\n mask: opts.mask ?? false,\n disabled: opts.disabled ?? false,\n focusedIndex: 0,\n }\n}\n\nfunction sanitize(char: string, type: PinType): string {\n if (char.length !== 1) return ''\n if (type === 'numeric' && !/\\d/.test(char)) return ''\n if (type === 'alphabetic' && !/[a-zA-Z]/.test(char)) return ''\n if (type === 'alphanumeric' && !/[a-zA-Z0-9]/.test(char)) return ''\n return char\n}\n\nexport function update(state: PinInputState, msg: PinInputMsg): [PinInputState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue': {\n const char = sanitize(msg.value.slice(-1), state.type)\n if (!char && msg.value !== '') return [state, []]\n const values = [...state.values]\n values[msg.index] = char\n // Auto-advance\n const nextIndex = char ? Math.min(msg.index + 1, state.length - 1) : msg.index\n return [{ ...state, values, focusedIndex: nextIndex }, []]\n }\n case 'setAll': {\n const values = new Array<string>(state.length).fill('')\n for (let i = 0; i < Math.min(msg.values.length, state.length); i++) {\n values[i] = sanitize(msg.values[i]!, state.type)\n }\n const lastFilled = values.findIndex((v) => v === '')\n const focusedIndex = lastFilled === -1 ? state.length - 1 : lastFilled\n return [{ ...state, values, focusedIndex }, []]\n }\n case 'focus':\n return [{ ...state, focusedIndex: Math.max(0, Math.min(msg.index, state.length - 1)) }, []]\n case 'clear':\n return [{ ...state, values: new Array<string>(state.length).fill(''), focusedIndex: 0 }, []]\n case 'backspace': {\n const values = [...state.values]\n if (values[msg.index]) {\n values[msg.index] = ''\n return [{ ...state, values }, []]\n }\n // Field is empty — move focus back and clear prior\n const prev = Math.max(0, msg.index - 1)\n values[prev] = ''\n return [{ ...state, values, focusedIndex: prev }, []]\n }\n }\n}\n\nexport function isComplete(state: PinInputState): boolean {\n return state.values.every((v) => v !== '')\n}\n\nexport function getValue(state: PinInputState): string {\n return state.values.join('')\n}\n\nexport interface PinInputParts<S> {\n root: {\n role: 'group'\n 'aria-labelledby': string\n 'data-scope': 'pin-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n label: {\n id: string\n 'data-scope': 'pin-input'\n 'data-part': 'label'\n }\n /** Props for the input at a given index. */\n input: (index: number) => {\n type: (s: S) => 'text' | 'password'\n inputMode: (s: S) => 'numeric' | 'text'\n pattern: (s: S) => string\n maxLength: 1\n autoComplete: 'off'\n 'aria-label': string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'pin-input'\n 'data-part': 'input'\n 'data-index': string\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n onPaste: (e: ClipboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n inputLabel?: (index: number) => string\n /** Validate each character before setting. Non-empty array blocks setDigit. */\n validate?: (value: string) => string[] | null\n}\n\nexport function connect<S>(\n get: (s: S) => PinInputState,\n send: Send<PinInputMsg>,\n opts: ConnectOptions,\n): PinInputParts<S> {\n const labelId = `${opts.id}:label`\n const inputLabel = opts.inputLabel ?? en.pinInput.input\n const validate = opts.validate\n\n return {\n root: {\n role: 'group',\n 'aria-labelledby': labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n label: {\n id: labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'label',\n },\n input: (index: number) => ({\n type: (s) => (get(s).mask ? 'password' : 'text'),\n inputMode: (s) => (get(s).type === 'numeric' ? 'numeric' : 'text'),\n pattern: (s) => {\n switch (get(s).type) {\n case 'numeric':\n return '[0-9]*'\n case 'alphabetic':\n return '[a-zA-Z]*'\n case 'alphanumeric':\n return '[a-zA-Z0-9]*'\n }\n },\n maxLength: 1,\n autoComplete: 'off',\n 'aria-label': inputLabel(index),\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).values[index] ?? '',\n 'data-scope': 'pin-input',\n 'data-part': 'input',\n 'data-index': String(index),\n onInput: (e) => {\n const value = (e.target as HTMLInputElement).value\n if (validate && value !== '') {\n const errors = validate(value.slice(-1))\n if (errors && errors.length > 0) return\n }\n send({ type: 'setValue', index, value })\n },\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n if (key === 'Backspace') {\n send({ type: 'backspace', index })\n } else if (key === 'ArrowLeft') {\n e.preventDefault()\n send({ type: 'focus', index: index - 1 })\n } else if (key === 'ArrowRight') {\n e.preventDefault()\n send({ type: 'focus', index: index + 1 })\n }\n },\n onFocus: () => send({ type: 'focus', index }),\n onPaste: (e) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text') ?? ''\n send({ type: 'setAll', values: text.split('') })\n },\n }),\n }\n}\n\nexport const pinInput = { init, update, connect, isComplete, getValue }\n"]}
|
|
1
|
+
{"version":3,"file":"pin-input.js","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { en } from '../locale.js'\n\n/**\n * Pin input — a sequence of single-character fields for OTP codes, etc.\n * Auto-advances on input, handles backspace to previous field, supports\n * paste-to-fill across multiple fields.\n */\n\nexport type PinType = 'numeric' | 'alphanumeric' | 'alphabetic'\n\nexport interface PinInputState {\n values: string[]\n length: number\n type: PinType\n mask: boolean\n disabled: boolean\n focusedIndex: number\n}\n\nexport type PinInputMsg =\n /** @intent(\"Set the character at a given field index (auto-advances focus on accept)\") */\n | { type: 'setValue'; index: number; value: string }\n /** @intent(\"Replace every field at once (typically from paste)\") */\n | { type: 'setAll'; values: string[] }\n /** @humanOnly */\n | { type: 'focus'; index: number }\n /** @intent(\"Clear every field\") */\n | { type: 'clear' }\n /** @humanOnly */\n | { type: 'backspace'; index: number }\n\nexport interface PinInputInit {\n length?: number\n type?: PinType\n mask?: boolean\n disabled?: boolean\n values?: string[]\n}\n\nexport function init(opts: PinInputInit = {}): PinInputState {\n const length = opts.length ?? 4\n const values = opts.values ?? new Array<string>(length).fill('')\n return {\n values,\n length,\n type: opts.type ?? 'numeric',\n mask: opts.mask ?? false,\n disabled: opts.disabled ?? false,\n focusedIndex: 0,\n }\n}\n\nfunction sanitize(char: string, type: PinType): string {\n if (char.length !== 1) return ''\n if (type === 'numeric' && !/\\d/.test(char)) return ''\n if (type === 'alphabetic' && !/[a-zA-Z]/.test(char)) return ''\n if (type === 'alphanumeric' && !/[a-zA-Z0-9]/.test(char)) return ''\n return char\n}\n\nexport function update(state: PinInputState, msg: PinInputMsg): [PinInputState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue': {\n const char = sanitize(msg.value.slice(-1), state.type)\n if (!char && msg.value !== '') return [state, []]\n const values = [...state.values]\n values[msg.index] = char\n // Auto-advance\n const nextIndex = char ? Math.min(msg.index + 1, state.length - 1) : msg.index\n return [{ ...state, values, focusedIndex: nextIndex }, []]\n }\n case 'setAll': {\n const values = new Array<string>(state.length).fill('')\n for (let i = 0; i < Math.min(msg.values.length, state.length); i++) {\n values[i] = sanitize(msg.values[i]!, state.type)\n }\n const lastFilled = values.findIndex((v) => v === '')\n const focusedIndex = lastFilled === -1 ? state.length - 1 : lastFilled\n return [{ ...state, values, focusedIndex }, []]\n }\n case 'focus':\n return [{ ...state, focusedIndex: Math.max(0, Math.min(msg.index, state.length - 1)) }, []]\n case 'clear':\n return [{ ...state, values: new Array<string>(state.length).fill(''), focusedIndex: 0 }, []]\n case 'backspace': {\n const values = [...state.values]\n if (values[msg.index]) {\n values[msg.index] = ''\n return [{ ...state, values }, []]\n }\n // Field is empty — move focus back and clear prior\n const prev = Math.max(0, msg.index - 1)\n values[prev] = ''\n return [{ ...state, values, focusedIndex: prev }, []]\n }\n }\n}\n\nexport function isComplete(state: PinInputState): boolean {\n return state.values.every((v) => v !== '')\n}\n\nexport function getValue(state: PinInputState): string {\n return state.values.join('')\n}\n\nexport interface PinInputParts<S> {\n root: {\n role: 'group'\n 'aria-labelledby': string\n 'data-scope': 'pin-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n label: {\n id: string\n 'data-scope': 'pin-input'\n 'data-part': 'label'\n }\n /** Props for the input at a given index. */\n input: (index: number) => {\n type: (s: S) => 'text' | 'password'\n inputMode: (s: S) => 'numeric' | 'text'\n pattern: (s: S) => string\n maxLength: 1\n autoComplete: 'off'\n 'aria-label': string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'pin-input'\n 'data-part': 'input'\n 'data-index': string\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n onPaste: (e: ClipboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n inputLabel?: (index: number) => string\n /** Validate each character before setting. Non-empty array blocks setDigit. */\n validate?: (value: string) => string[] | null\n}\n\nexport function connect<S>(\n get: (s: S) => PinInputState,\n send: Send<PinInputMsg>,\n opts: ConnectOptions,\n): PinInputParts<S> {\n const labelId = `${opts.id}:label`\n const inputLabel = opts.inputLabel ?? en.pinInput.input\n const validate = opts.validate\n\n return {\n root: {\n role: 'group',\n 'aria-labelledby': labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n label: {\n id: labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'label',\n },\n input: (index: number) => ({\n type: (s) => (get(s).mask ? 'password' : 'text'),\n inputMode: (s) => (get(s).type === 'numeric' ? 'numeric' : 'text'),\n pattern: (s) => {\n switch (get(s).type) {\n case 'numeric':\n return '[0-9]*'\n case 'alphabetic':\n return '[a-zA-Z]*'\n case 'alphanumeric':\n return '[a-zA-Z0-9]*'\n }\n },\n maxLength: 1,\n autoComplete: 'off',\n 'aria-label': inputLabel(index),\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).values[index] ?? '',\n 'data-scope': 'pin-input',\n 'data-part': 'input',\n 'data-index': String(index),\n onInput: tagSend(send, ['setValue'], (e) => {\n const value = (e.target as HTMLInputElement).value\n if (validate && value !== '') {\n const errors = validate(value.slice(-1))\n if (errors && errors.length > 0) return\n }\n send({ type: 'setValue', index, value })\n }),\n onKeyDown: tagSend(send, ['backspace', 'focus'], (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n if (key === 'Backspace') {\n send({ type: 'backspace', index })\n } else if (key === 'ArrowLeft') {\n e.preventDefault()\n send({ type: 'focus', index: index - 1 })\n } else if (key === 'ArrowRight') {\n e.preventDefault()\n send({ type: 'focus', index: index + 1 })\n }\n }),\n onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', index })),\n onPaste: tagSend(send, ['setAll'], (e) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text') ?? ''\n send({ type: 'setAll', values: text.split('') })\n }),\n }),\n }\n}\n\nexport const pinInput = { init, update, connect, isComplete, getValue }\n"]}
|
|
@@ -10,13 +10,21 @@ import { type Placement } from '../utils/floating.js';
|
|
|
10
10
|
export interface PopoverState {
|
|
11
11
|
open: boolean;
|
|
12
12
|
}
|
|
13
|
-
export type PopoverMsg =
|
|
13
|
+
export type PopoverMsg =
|
|
14
|
+
/** @intent("Open the popover") */
|
|
15
|
+
{
|
|
14
16
|
type: 'open';
|
|
15
|
-
}
|
|
17
|
+
}
|
|
18
|
+
/** @intent("Close the popover") */
|
|
19
|
+
| {
|
|
16
20
|
type: 'close';
|
|
17
|
-
}
|
|
21
|
+
}
|
|
22
|
+
/** @intent("Toggle the popover open/closed") */
|
|
23
|
+
| {
|
|
18
24
|
type: 'toggle';
|
|
19
|
-
}
|
|
25
|
+
}
|
|
26
|
+
/** @intent("Set the popover's open state to a specific value") */
|
|
27
|
+
| {
|
|
20
28
|
type: 'setOpen';
|
|
21
29
|
open: boolean;
|
|
22
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAMxD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErE;;;;;;GAMG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { show, portal, onMount, div, useContext } from '@llui/dom';
|
|
1
|
+
import { show, portal, onMount, div, useContext, tagSend } from '@llui/dom';
|
|
2
2
|
import { LocaleContext } from '../locale.js';
|
|
3
3
|
import { pushDismissable } from '../utils/dismissable.js';
|
|
4
4
|
import { pushFocusTrap } from '../utils/focus-trap.js';
|
|
@@ -36,7 +36,7 @@ export function connect(get, send, opts) {
|
|
|
36
36
|
'data-state': (s) => (get(s).open ? 'open' : 'closed'),
|
|
37
37
|
'data-scope': 'popover',
|
|
38
38
|
'data-part': 'trigger',
|
|
39
|
-
onClick: () => send({ type: 'toggle' }),
|
|
39
|
+
onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle' })),
|
|
40
40
|
},
|
|
41
41
|
positioner: {
|
|
42
42
|
'data-scope': 'popover',
|
|
@@ -71,7 +71,7 @@ export function connect(get, send, opts) {
|
|
|
71
71
|
'aria-label': closeLabel,
|
|
72
72
|
'data-scope': 'popover',
|
|
73
73
|
'data-part': 'close-trigger',
|
|
74
|
-
onClick: () => send({ type: 'close' }),
|
|
74
|
+
onClick: tagSend(send, ['close'], () => send({ type: 'close' })),
|
|
75
75
|
},
|
|
76
76
|
};
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.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 { pushFocusTrap } from '../utils/focus-trap.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Popover — click-triggered, non-modal floating overlay anchored to its\n * trigger. Use for menus, date pickers, color pickers, filters, etc.\n *\n * Like dialog, has a pure state machine + a view helper (`overlay()`) that\n * wires floating-ui positioning, dismissable, and optional focus trapping.\n */\n\nexport interface PopoverState {\n open: boolean\n}\n\nexport type PopoverMsg =\n | { type: 'open' }\n | { type: 'close' }\n | { type: 'toggle' }\n | { type: 'setOpen'; open: boolean }\n\nexport interface PopoverInit {\n open?: boolean\n}\n\nexport function init(opts: PopoverInit = {}): PopoverState {\n return { open: opts.open ?? false }\n}\n\nexport function update(state: PopoverState, msg: PopoverMsg): [PopoverState, never[]] {\n switch (msg.type) {\n case 'open':\n return [{ ...state, open: true }, []]\n case 'close':\n return [{ ...state, open: false }, []]\n case 'toggle':\n return [{ ...state, open: !state.open }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\nexport interface PopoverParts<S> {\n trigger: {\n type: 'button'\n 'aria-haspopup': 'dialog'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'popover'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'dialog'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'content'\n }\n title: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'description'\n }\n arrow: {\n 'data-scope': 'popover'\n 'data-part': 'arrow'\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'popover'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PopoverState,\n send: Send<PopoverMsg>,\n opts: ConnectOptions,\n): PopoverParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const triggerId = `${base}:trigger`\n const contentId = `${base}:content`\n const titleId = `${base}:title`\n const descId = `${base}:description`\n const closeLabel: string | ((s: S) => string) =\n opts.closeLabel ?? ((s: S) => locale(s).popover.close)\n\n return {\n trigger: {\n type: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n id: triggerId,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'trigger',\n onClick: () => send({ type: 'toggle' }),\n },\n positioner: {\n 'data-scope': 'popover',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'dialog',\n id: contentId,\n 'aria-labelledby': titleId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'content',\n },\n title: {\n id: titleId,\n 'data-scope': 'popover',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'popover',\n 'data-part': 'description',\n },\n arrow: {\n 'data-scope': 'popover',\n 'data-part': 'arrow',\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': closeLabel,\n 'data-scope': 'popover',\n 'data-part': 'close-trigger',\n onClick: () => send({ type: 'close' }),\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => PopoverState\n send: Send<PopoverMsg>\n parts: PopoverParts<S>\n content: () => Node[]\n /** Placement preference — bottom | top | right | left with -start/-end variants. */\n placement?: Placement\n /** Offset between trigger and content, px (default: 8). */\n offset?: number\n /** Auto-flip to opposite side (default: true). */\n flip?: boolean\n /** Shift to keep in viewport (default: true). */\n shift?: boolean\n /** Optional transition. */\n transition?: TransitionOptions\n /** Close on Escape (default: true). */\n closeOnEscape?: boolean\n /** Close on outside click (default: true). */\n closeOnOutsideClick?: boolean\n /** Trap focus inside popover while open (default: false — non-modal). */\n trapFocus?: boolean\n /** Restore focus to trigger on close (default: true). */\n restoreFocus?: boolean\n /** Portal target (default: 'body'). */\n target?: string | HTMLElement\n /** Arrow element selector within content (optional). */\n arrowSelector?: string\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom'\n const offset = opts.offset ?? 8\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const closeOnEscape = opts.closeOnEscape !== false\n const closeOnOutsideClick = opts.closeOnOutsideClick !== false\n const trapFocus = opts.trapFocus === true\n const restoreFocus = opts.restoreFocus !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const triggerId = parts.trigger.id\n\n return show<S, PopoverMsg>({\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 triggerEl = document.getElementById(triggerId)\n if (!contentEl || !triggerEl) return\n\n const cleanups: Array<() => void> = []\n\n // Position content relative to trigger\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n const arrow = opts.arrowSelector\n ? (contentEl.querySelector(opts.arrowSelector) as HTMLElement | null)\n : null\n cleanups.push(\n attachFloating({\n anchor: triggerEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n arrow: arrow ?? undefined,\n }),\n )\n\n if (trapFocus) {\n cleanups.push(\n pushFocusTrap({\n container: contentEl,\n restoreFocus,\n }),\n )\n }\n\n if (closeOnEscape || closeOnOutsideClick) {\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [triggerEl],\n disableEscape: !closeOnEscape,\n disableOutside: !closeOnOutsideClick,\n onDismiss: () => {\n opts.send({ type: 'close' })\n if (restoreFocus) triggerEl.focus()\n },\n }),\n )\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 popover = { init, update, connect, overlay }\n"]}
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\nimport { pushDismissable } from '../utils/dismissable.js'\nimport { pushFocusTrap } from '../utils/focus-trap.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Popover — click-triggered, non-modal floating overlay anchored to its\n * trigger. Use for menus, date pickers, color pickers, filters, etc.\n *\n * Like dialog, has a pure state machine + a view helper (`overlay()`) that\n * wires floating-ui positioning, dismissable, and optional focus trapping.\n */\n\nexport interface PopoverState {\n open: boolean\n}\n\nexport type PopoverMsg =\n /** @intent(\"Open the popover\") */\n | { type: 'open' }\n /** @intent(\"Close the popover\") */\n | { type: 'close' }\n /** @intent(\"Toggle the popover open/closed\") */\n | { type: 'toggle' }\n /** @intent(\"Set the popover's open state to a specific value\") */\n | { type: 'setOpen'; open: boolean }\n\nexport interface PopoverInit {\n open?: boolean\n}\n\nexport function init(opts: PopoverInit = {}): PopoverState {\n return { open: opts.open ?? false }\n}\n\nexport function update(state: PopoverState, msg: PopoverMsg): [PopoverState, never[]] {\n switch (msg.type) {\n case 'open':\n return [{ ...state, open: true }, []]\n case 'close':\n return [{ ...state, open: false }, []]\n case 'toggle':\n return [{ ...state, open: !state.open }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\nexport interface PopoverParts<S> {\n trigger: {\n type: 'button'\n 'aria-haspopup': 'dialog'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'popover'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'dialog'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'content'\n }\n title: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'description'\n }\n arrow: {\n 'data-scope': 'popover'\n 'data-part': 'arrow'\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'popover'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PopoverState,\n send: Send<PopoverMsg>,\n opts: ConnectOptions,\n): PopoverParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const triggerId = `${base}:trigger`\n const contentId = `${base}:content`\n const titleId = `${base}:title`\n const descId = `${base}:description`\n const closeLabel: string | ((s: S) => string) =\n opts.closeLabel ?? ((s: S) => locale(s).popover.close)\n\n return {\n trigger: {\n type: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n id: triggerId,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'trigger',\n onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle' })),\n },\n positioner: {\n 'data-scope': 'popover',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'dialog',\n id: contentId,\n 'aria-labelledby': titleId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'content',\n },\n title: {\n id: titleId,\n 'data-scope': 'popover',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'popover',\n 'data-part': 'description',\n },\n arrow: {\n 'data-scope': 'popover',\n 'data-part': 'arrow',\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': closeLabel,\n 'data-scope': 'popover',\n 'data-part': 'close-trigger',\n onClick: tagSend(send, ['close'], () => send({ type: 'close' })),\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => PopoverState\n send: Send<PopoverMsg>\n parts: PopoverParts<S>\n content: () => Node[]\n /** Placement preference — bottom | top | right | left with -start/-end variants. */\n placement?: Placement\n /** Offset between trigger and content, px (default: 8). */\n offset?: number\n /** Auto-flip to opposite side (default: true). */\n flip?: boolean\n /** Shift to keep in viewport (default: true). */\n shift?: boolean\n /** Optional transition. */\n transition?: TransitionOptions\n /** Close on Escape (default: true). */\n closeOnEscape?: boolean\n /** Close on outside click (default: true). */\n closeOnOutsideClick?: boolean\n /** Trap focus inside popover while open (default: false — non-modal). */\n trapFocus?: boolean\n /** Restore focus to trigger on close (default: true). */\n restoreFocus?: boolean\n /** Portal target (default: 'body'). */\n target?: string | HTMLElement\n /** Arrow element selector within content (optional). */\n arrowSelector?: string\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom'\n const offset = opts.offset ?? 8\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const closeOnEscape = opts.closeOnEscape !== false\n const closeOnOutsideClick = opts.closeOnOutsideClick !== false\n const trapFocus = opts.trapFocus === true\n const restoreFocus = opts.restoreFocus !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const triggerId = parts.trigger.id\n\n return show<S, PopoverMsg>({\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 triggerEl = document.getElementById(triggerId)\n if (!contentEl || !triggerEl) return\n\n const cleanups: Array<() => void> = []\n\n // Position content relative to trigger\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n const arrow = opts.arrowSelector\n ? (contentEl.querySelector(opts.arrowSelector) as HTMLElement | null)\n : null\n cleanups.push(\n attachFloating({\n anchor: triggerEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n arrow: arrow ?? undefined,\n }),\n )\n\n if (trapFocus) {\n cleanups.push(\n pushFocusTrap({\n container: contentEl,\n restoreFocus,\n }),\n )\n }\n\n if (closeOnEscape || closeOnOutsideClick) {\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [triggerEl],\n disableEscape: !closeOnEscape,\n disableOutside: !closeOnOutsideClick,\n onDismiss: () => {\n opts.send({ type: 'close' })\n if (restoreFocus) triggerEl.focus()\n },\n }),\n )\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 popover = { init, update, connect, overlay }\n"]}
|
|
@@ -24,15 +24,25 @@ export interface PresenceState {
|
|
|
24
24
|
status: PresenceStatus;
|
|
25
25
|
unmountOnExit: boolean;
|
|
26
26
|
}
|
|
27
|
-
export type PresenceMsg =
|
|
27
|
+
export type PresenceMsg =
|
|
28
|
+
/** @intent("Begin opening the element (closed → opening, plays enter animation)") */
|
|
29
|
+
{
|
|
28
30
|
type: 'open';
|
|
29
|
-
}
|
|
31
|
+
}
|
|
32
|
+
/** @intent("Begin closing the element (open → closing, plays exit animation)") */
|
|
33
|
+
| {
|
|
30
34
|
type: 'close';
|
|
31
|
-
}
|
|
35
|
+
}
|
|
36
|
+
/** @intent("Toggle between open and closed states") */
|
|
37
|
+
| {
|
|
32
38
|
type: 'toggle';
|
|
33
|
-
}
|
|
39
|
+
}
|
|
40
|
+
/** @humanOnly */
|
|
41
|
+
| {
|
|
34
42
|
type: 'animationEnd';
|
|
35
|
-
}
|
|
43
|
+
}
|
|
44
|
+
/** @intent("Set the desired presence directly (true = open, false = closed)") */
|
|
45
|
+
| {
|
|
36
46
|
type: 'setPresent';
|
|
37
47
|
present: boolean;
|
|
38
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/components/presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/components/presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,WAAW;AACrB,qFAAqF;AACnF;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,kFAAkF;GAChF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,uDAAuD;GACrD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iBAAiB;GACf;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE;AAC1B,iFAAiF;GAC/E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,YAAiB,GAAG,aAAa,CAK3D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAmBvF;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGvD;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE;QACJ,YAAY,EAAE,UAAU,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAA;QACtC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;QAC3C,eAAe,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAA;KAC9C,CAAA;CACF;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,EAC5B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,aAAa,CAAC,CAAC,CAAC,CAYlB;AAED,eAAO,MAAM,QAAQ;;;;;;;CAA+D,CAAA"}
|