@llui/components 0.4.10 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion.d.ts +13 -13
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +9 -9
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.d.ts +8 -8
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +2 -2
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/angle-slider.d.ts +13 -13
- package/dist/components/angle-slider.d.ts.map +1 -1
- package/dist/components/angle-slider.js +11 -11
- package/dist/components/angle-slider.js.map +1 -1
- package/dist/components/async-list.d.ts +7 -7
- package/dist/components/async-list.d.ts.map +1 -1
- package/dist/components/async-list.js +5 -8
- package/dist/components/async-list.js.map +1 -1
- package/dist/components/avatar.d.ts +9 -9
- package/dist/components/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +7 -7
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/carousel.d.ts +18 -18
- package/dist/components/carousel.d.ts.map +1 -1
- package/dist/components/carousel.js +12 -12
- package/dist/components/carousel.js.map +1 -1
- package/dist/components/cascade-select.d.ts +12 -12
- package/dist/components/cascade-select.d.ts.map +1 -1
- package/dist/components/cascade-select.js +8 -8
- package/dist/components/cascade-select.js.map +1 -1
- package/dist/components/checkbox.d.ts +14 -14
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +12 -12
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard.d.ts +8 -8
- package/dist/components/clipboard.d.ts.map +1 -1
- package/dist/components/clipboard.js +6 -6
- package/dist/components/clipboard.js.map +1 -1
- package/dist/components/collapsible.d.ts +11 -11
- package/dist/components/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible.js +9 -9
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/color-picker.d.ts +19 -19
- package/dist/components/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker.js +21 -21
- package/dist/components/color-picker.js.map +1 -1
- package/dist/components/combobox.d.ts +25 -25
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +54 -59
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/context-menu.d.ts +14 -14
- package/dist/components/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu.js +15 -19
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/date-input.d.ts +13 -13
- package/dist/components/date-input.d.ts.map +1 -1
- package/dist/components/date-input.js +11 -11
- package/dist/components/date-input.js.map +1 -1
- package/dist/components/date-picker.d.ts +11 -11
- package/dist/components/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker.js +7 -7
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dialog.d.ts +15 -15
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +45 -50
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/drawer.d.ts +13 -13
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +44 -49
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/editable.d.ts +11 -11
- package/dist/components/editable.d.ts.map +1 -1
- package/dist/components/editable.js +9 -9
- package/dist/components/editable.js.map +1 -1
- package/dist/components/file-upload.d.ts +19 -19
- package/dist/components/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload.js +14 -14
- package/dist/components/file-upload.js.map +1 -1
- package/dist/components/floating-panel.d.ts +14 -14
- package/dist/components/floating-panel.d.ts.map +1 -1
- package/dist/components/floating-panel.js +13 -14
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form.d.ts +9 -9
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/form.js +7 -7
- package/dist/components/form.js.map +1 -1
- package/dist/components/hover-card.d.ts +9 -9
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +12 -13
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/image-cropper.d.ts +8 -8
- package/dist/components/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper.js +7 -8
- package/dist/components/image-cropper.js.map +1 -1
- package/dist/components/in-view.d.ts +6 -6
- package/dist/components/in-view.d.ts.map +1 -1
- package/dist/components/in-view.js +2 -2
- package/dist/components/in-view.js.map +1 -1
- package/dist/components/listbox.d.ts +16 -16
- package/dist/components/listbox.d.ts.map +1 -1
- package/dist/components/listbox.js +16 -16
- package/dist/components/listbox.js.map +1 -1
- package/dist/components/marquee.d.ts +8 -8
- package/dist/components/marquee.d.ts.map +1 -1
- package/dist/components/marquee.js +8 -11
- package/dist/components/marquee.js.map +1 -1
- package/dist/components/menu.d.ts +15 -15
- package/dist/components/menu.d.ts.map +1 -1
- package/dist/components/menu.js +16 -17
- package/dist/components/menu.js.map +1 -1
- package/dist/components/navigation-menu.d.ts +12 -12
- 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 +18 -18
- package/dist/components/number-input.d.ts.map +1 -1
- package/dist/components/number-input.js +16 -20
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/pagination.d.ts +13 -13
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +11 -17
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/password-input.d.ts +11 -11
- package/dist/components/password-input.d.ts.map +1 -1
- package/dist/components/password-input.js +11 -11
- package/dist/components/password-input.js.map +1 -1
- package/dist/components/pin-input.d.ts +9 -9
- package/dist/components/pin-input.d.ts.map +1 -1
- package/dist/components/pin-input.js +9 -9
- package/dist/components/pin-input.js.map +1 -1
- package/dist/components/popover.d.ts +11 -11
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +61 -60
- package/dist/components/popover.js.map +1 -1
- package/dist/components/presence.d.ts +7 -5
- package/dist/components/presence.d.ts.map +1 -1
- package/dist/components/presence.js +5 -3
- package/dist/components/presence.js.map +1 -1
- package/dist/components/progress.d.ts +14 -14
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +12 -12
- package/dist/components/progress.js.map +1 -1
- package/dist/components/qr-code.d.ts +7 -7
- package/dist/components/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code.js +7 -7
- package/dist/components/qr-code.js.map +1 -1
- package/dist/components/radio-group.d.ts +15 -15
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +12 -13
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/rating-group.d.ts +13 -13
- package/dist/components/rating-group.d.ts.map +1 -1
- package/dist/components/rating-group.js +10 -11
- package/dist/components/rating-group.js.map +1 -1
- package/dist/components/scroll-area.d.ts +10 -10
- package/dist/components/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area.js +10 -15
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/select.d.ts +26 -26
- package/dist/components/select.d.ts.map +1 -1
- package/dist/components/select.js +29 -33
- package/dist/components/select.js.map +1 -1
- package/dist/components/signature-pad.d.ts +12 -12
- package/dist/components/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad.js +10 -10
- package/dist/components/signature-pad.js.map +1 -1
- package/dist/components/slider.d.ts +22 -22
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +17 -17
- package/dist/components/slider.js.map +1 -1
- package/dist/components/sortable.d.ts +11 -11
- package/dist/components/sortable.d.ts.map +1 -1
- package/dist/components/sortable.js +20 -20
- package/dist/components/sortable.js.map +1 -1
- package/dist/components/splitter.d.ts +15 -15
- package/dist/components/splitter.d.ts.map +1 -1
- package/dist/components/splitter.js +15 -15
- package/dist/components/splitter.js.map +1 -1
- package/dist/components/steps.d.ts +14 -14
- package/dist/components/steps.d.ts.map +1 -1
- package/dist/components/steps.js +10 -16
- package/dist/components/steps.js.map +1 -1
- package/dist/components/switch.d.ts +12 -12
- package/dist/components/switch.d.ts.map +1 -1
- package/dist/components/switch.js +10 -10
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.d.ts +15 -15
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +11 -11
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tags-input.d.ts +14 -14
- 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 +5 -5
- package/dist/components/theme-switch.d.ts.map +1 -1
- package/dist/components/theme-switch.js +3 -3
- package/dist/components/theme-switch.js.map +1 -1
- package/dist/components/time-picker.d.ts +19 -19
- package/dist/components/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker.js +17 -17
- package/dist/components/time-picker.js.map +1 -1
- package/dist/components/timer.d.ts +10 -10
- package/dist/components/timer.d.ts.map +1 -1
- package/dist/components/timer.js +8 -8
- package/dist/components/timer.js.map +1 -1
- package/dist/components/toast.d.ts +8 -8
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +4 -4
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toc.d.ts +12 -12
- package/dist/components/toc.d.ts.map +1 -1
- package/dist/components/toc.js +8 -8
- package/dist/components/toc.js.map +1 -1
- package/dist/components/toggle-group.d.ts +13 -13
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +9 -9
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +8 -8
- package/dist/components/toggle.d.ts.map +1 -1
- package/dist/components/toggle.js +6 -6
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tooltip.d.ts +10 -10
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +13 -14
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/tour.d.ts +7 -7
- package/dist/components/tour.d.ts.map +1 -1
- package/dist/components/tour.js +5 -5
- package/dist/components/tour.js.map +1 -1
- package/dist/components/tree-view.d.ts +19 -19
- package/dist/components/tree-view.d.ts.map +1 -1
- package/dist/components/tree-view.js +23 -23
- package/dist/components/tree-view.js.map +1 -1
- package/dist/patterns/confirm-dialog.d.ts +4 -4
- package/dist/patterns/confirm-dialog.d.ts.map +1 -1
- package/dist/patterns/confirm-dialog.js +7 -9
- package/dist/patterns/confirm-dialog.js.map +1 -1
- package/package.json +3 -3
- package/dist/components/enter-view.d.ts +0 -73
- package/dist/components/enter-view.d.ts.map +0 -1
- package/dist/components/enter-view.js +0 -51
- package/dist/utils/validators.d.ts +0 -34
- package/dist/utils/validators.d.ts.map +0 -1
- package/dist/utils/validators.js +0 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-list.js","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoDnC,MAAM,UAAU,IAAI,CAAc,OAAyB,EAAE;IAC3D,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,KAAwB,EACxB,GAAoB;IAEpB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO;YACV,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACpE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3D,KAAK,YAAY;YACf,OAAO;gBACL;oBACE,GAAG,KAAK;oBACR,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;oBACrC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;oBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,IAAI;iBACZ;gBACD,EAAE;aACH,CAAA;QACH,KAAK,YAAY;YACf,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QACjF,KAAK,UAAU;YACb,OAAO;gBACL;oBACE,GAAG,KAAK;oBACR,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;oBACrC,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,IAAI;iBACZ;gBACD,EAAE;aACH,CAAA;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,KAAwB;IACnD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAwB;IACjD,OAAO,KAAK,CAAC,MAAM,KAAK,OAAO,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAwB;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAA;AACjC,CAAC;AAoCD,MAAM,UAAU,OAAO,CACrB,
|
|
1
|
+
{"version":3,"file":"async-list.js","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send, Signal } 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 /** @intent(\"Request the next page of items\") */\n | { type: 'loadMore' }\n /** @humanOnly */\n | { type: 'pageLoaded'; items: T[]; hasMore: boolean }\n /** @humanOnly */\n | { type: 'pageFailed'; error: string }\n /** @intent(\"Discard the loaded items and reset back to page 0\") */\n | { type: 'reset' }\n /** @humanOnly */\n | { type: 'setItems'; items: T[]; hasMore?: boolean }\n /** @intent(\"Retry the last failed page request\") */\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 {\n root: {\n 'data-scope': 'async-list'\n 'data-part': 'root'\n 'data-status': Signal<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: Signal<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: Signal<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: Signal<boolean>\n }\n}\n\nexport function connect<T>(\n state: Signal<AsyncListState<T>>,\n send: Send<AsyncListMsg<T>>,\n): AsyncListParts {\n return {\n root: {\n 'data-scope': 'async-list',\n 'data-part': 'root',\n 'data-status': state.map((st) => st.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: state.map((st) => st.status === 'loading' || !st.hasMore),\n 'data-scope': 'async-list',\n 'data-part': 'load-more-trigger',\n onClick: tagSend(send, ['loadMore'], () => send({ type: 'loadMore' })),\n },\n retryTrigger: {\n type: 'button',\n 'data-scope': 'async-list',\n 'data-part': 'retry-trigger',\n hidden: state.map((st) => st.status !== 'error'),\n onClick: tagSend(send, ['retry'], () => 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: state.map((st) => st.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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Send } from '@llui/dom';
|
|
1
|
+
import type { Send, Signal } from '@llui/dom';
|
|
2
2
|
/**
|
|
3
3
|
* Avatar — image with automatic fallback. Tracks image load status so
|
|
4
4
|
* consumers can render the image, a fallback (initials, icon), or a
|
|
@@ -30,17 +30,17 @@ export interface AvatarInit {
|
|
|
30
30
|
}
|
|
31
31
|
export declare function init(opts?: AvatarInit): AvatarState;
|
|
32
32
|
export declare function update(state: AvatarState, msg: AvatarMsg): [AvatarState, never[]];
|
|
33
|
-
export interface AvatarParts
|
|
33
|
+
export interface AvatarParts {
|
|
34
34
|
root: {
|
|
35
35
|
'data-scope': 'avatar';
|
|
36
36
|
'data-part': 'root';
|
|
37
|
-
'data-status':
|
|
37
|
+
'data-status': Signal<ImageStatus>;
|
|
38
38
|
};
|
|
39
39
|
image: {
|
|
40
40
|
'data-scope': 'avatar';
|
|
41
41
|
'data-part': 'image';
|
|
42
|
-
'data-status':
|
|
43
|
-
hidden:
|
|
42
|
+
'data-status': Signal<ImageStatus>;
|
|
43
|
+
hidden: Signal<boolean>;
|
|
44
44
|
alt: string;
|
|
45
45
|
onLoad: (e: Event) => void;
|
|
46
46
|
onError: (e: Event) => void;
|
|
@@ -49,15 +49,15 @@ export interface AvatarParts<S> {
|
|
|
49
49
|
fallback: {
|
|
50
50
|
'data-scope': 'avatar';
|
|
51
51
|
'data-part': 'fallback';
|
|
52
|
-
'data-status':
|
|
53
|
-
hidden:
|
|
54
|
-
'aria-hidden':
|
|
52
|
+
'data-status': Signal<ImageStatus>;
|
|
53
|
+
hidden: Signal<boolean>;
|
|
54
|
+
'aria-hidden': Signal<'true' | undefined>;
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
export interface ConnectOptions {
|
|
58
58
|
alt?: string;
|
|
59
59
|
}
|
|
60
|
-
export declare function connect
|
|
60
|
+
export declare function connect(state: Signal<AvatarState>, send: Send<AvatarMsg>, opts?: ConnectOptions): AvatarParts;
|
|
61
61
|
export declare const avatar: {
|
|
62
62
|
init: typeof init;
|
|
63
63
|
update: typeof update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAE7C;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEjE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,MAAM,SAAS;AACnB,iBAAiB;AACf;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,iBAAiB;GACf;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iBAAiB;GACf;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,6DAA6D;GAC3D;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,UAAe,GAAG,WAAW,CAEvD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAWjF;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE;QACJ,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;KACnC,CAAA;IACD,KAAK,EAAE;QACL,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,OAAO,CAAA;QACpB,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAClC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvB,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAChC,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAClC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvB,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;KAC1C,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,GAAE,cAAmB,GACxB,WAAW,CA0Bb;AAED,eAAO,MAAM,MAAM;;;;CAA4B,CAAA"}
|
|
@@ -14,19 +14,19 @@ export function update(state, msg) {
|
|
|
14
14
|
return [{ ...state, status: 'idle' }, []];
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
export function connect(
|
|
17
|
+
export function connect(state, send, opts = {}) {
|
|
18
18
|
const alt = opts.alt ?? '';
|
|
19
19
|
return {
|
|
20
20
|
root: {
|
|
21
21
|
'data-scope': 'avatar',
|
|
22
22
|
'data-part': 'root',
|
|
23
|
-
'data-status': (s) =>
|
|
23
|
+
'data-status': state.map((s) => s.status),
|
|
24
24
|
},
|
|
25
25
|
image: {
|
|
26
26
|
'data-scope': 'avatar',
|
|
27
27
|
'data-part': 'image',
|
|
28
|
-
'data-status': (s) =>
|
|
29
|
-
hidden: (s) =>
|
|
28
|
+
'data-status': state.map((s) => s.status),
|
|
29
|
+
hidden: state.map((s) => s.status !== 'loaded'),
|
|
30
30
|
alt,
|
|
31
31
|
onLoad: tagSend(send, ['loaded'], () => send({ type: 'loaded' })),
|
|
32
32
|
onError: tagSend(send, ['error'], () => send({ type: 'error' })),
|
|
@@ -35,9 +35,9 @@ export function connect(get, send, opts = {}) {
|
|
|
35
35
|
fallback: {
|
|
36
36
|
'data-scope': 'avatar',
|
|
37
37
|
'data-part': 'fallback',
|
|
38
|
-
'data-status': (s) =>
|
|
39
|
-
hidden: (s) =>
|
|
40
|
-
'aria-hidden': (s) => (
|
|
38
|
+
'data-status': state.map((s) => s.status),
|
|
39
|
+
hidden: state.map((s) => s.status === 'loaded'),
|
|
40
|
+
'aria-hidden': state.map((s) => (s.status === 'loaded' ? 'true' : undefined)),
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BnC,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,
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BnC,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,KAA0B,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,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SAC1C;QACD,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACzC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;YAC/C,GAAG;YACH,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;SAC7E;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACzC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;YAC/C,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC9E;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send, Signal } 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 /** @humanOnly */\n | { type: 'loadStart' }\n /** @humanOnly */\n | { type: 'loaded' }\n /** @humanOnly */\n | { type: 'error' }\n /** @intent(\"Reset the avatar's load status back to idle\") */\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 {\n root: {\n 'data-scope': 'avatar'\n 'data-part': 'root'\n 'data-status': Signal<ImageStatus>\n }\n image: {\n 'data-scope': 'avatar'\n 'data-part': 'image'\n 'data-status': Signal<ImageStatus>\n hidden: Signal<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': Signal<ImageStatus>\n hidden: Signal<boolean>\n 'aria-hidden': Signal<'true' | undefined>\n }\n}\n\nexport interface ConnectOptions {\n alt?: string\n}\n\nexport function connect(\n state: Signal<AvatarState>,\n send: Send<AvatarMsg>,\n opts: ConnectOptions = {},\n): AvatarParts {\n const alt = opts.alt ?? ''\n return {\n root: {\n 'data-scope': 'avatar',\n 'data-part': 'root',\n 'data-status': state.map((s) => s.status),\n },\n image: {\n 'data-scope': 'avatar',\n 'data-part': 'image',\n 'data-status': state.map((s) => s.status),\n hidden: state.map((s) => s.status !== 'loaded'),\n alt,\n onLoad: tagSend(send, ['loaded'], () => send({ type: 'loaded' })),\n onError: tagSend(send, ['error'], () => send({ type: 'error' })),\n onLoadStart: tagSend(send, ['loadStart'], () => send({ type: 'loadStart' })),\n },\n fallback: {\n 'data-scope': 'avatar',\n 'data-part': 'fallback',\n 'data-status': state.map((s) => s.status),\n hidden: state.map((s) => s.status === 'loaded'),\n 'aria-hidden': state.map((s) => (s.status === 'loaded' ? 'true' : undefined)),\n },\n }\n}\n\nexport const avatar = { init, update, connect }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Send } from '@llui/dom';
|
|
1
|
+
import type { Send, Signal } from '@llui/dom';
|
|
2
2
|
/**
|
|
3
3
|
* Carousel — sliding content viewer with pagination. Tracks active slide
|
|
4
4
|
* index, optional autoplay with pause-on-hover, and wraparound navigation.
|
|
@@ -56,39 +56,39 @@ export declare function init(opts?: CarouselInit): CarouselState;
|
|
|
56
56
|
export declare function update(state: CarouselState, msg: CarouselMsg): [CarouselState, never[]];
|
|
57
57
|
export declare function canGoNext(state: CarouselState): boolean;
|
|
58
58
|
export declare function canGoPrev(state: CarouselState): boolean;
|
|
59
|
-
export interface CarouselSlideParts
|
|
59
|
+
export interface CarouselSlideParts {
|
|
60
60
|
slide: {
|
|
61
61
|
role: 'tabpanel';
|
|
62
62
|
id: string;
|
|
63
63
|
'aria-roledescription': 'slide';
|
|
64
|
-
'aria-label': string
|
|
64
|
+
'aria-label': string;
|
|
65
65
|
'data-scope': 'carousel';
|
|
66
66
|
'data-part': 'slide';
|
|
67
67
|
'data-index': string;
|
|
68
|
-
'data-active':
|
|
69
|
-
hidden:
|
|
68
|
+
'data-active': Signal<'' | undefined>;
|
|
69
|
+
hidden: Signal<boolean>;
|
|
70
70
|
};
|
|
71
71
|
indicator: {
|
|
72
72
|
type: 'button';
|
|
73
73
|
role: 'tab';
|
|
74
|
-
'aria-label': string
|
|
75
|
-
'aria-selected':
|
|
74
|
+
'aria-label': string;
|
|
75
|
+
'aria-selected': Signal<boolean>;
|
|
76
76
|
'aria-controls': string;
|
|
77
77
|
'data-scope': 'carousel';
|
|
78
78
|
'data-part': 'indicator';
|
|
79
79
|
'data-index': string;
|
|
80
|
-
'data-active':
|
|
80
|
+
'data-active': Signal<'' | undefined>;
|
|
81
81
|
onClick: (e: MouseEvent) => void;
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
export interface CarouselParts
|
|
84
|
+
export interface CarouselParts {
|
|
85
85
|
root: {
|
|
86
86
|
role: 'region';
|
|
87
87
|
'aria-roledescription': 'carousel';
|
|
88
|
-
'aria-label': string
|
|
88
|
+
'aria-label': string;
|
|
89
89
|
'data-scope': 'carousel';
|
|
90
90
|
'data-part': 'root';
|
|
91
|
-
'data-paused':
|
|
91
|
+
'data-paused': Signal<'' | undefined>;
|
|
92
92
|
onPointerEnter: (e: PointerEvent) => void;
|
|
93
93
|
onPointerLeave: (e: PointerEvent) => void;
|
|
94
94
|
onFocus: (e: FocusEvent) => void;
|
|
@@ -100,27 +100,27 @@ export interface CarouselParts<S> {
|
|
|
100
100
|
};
|
|
101
101
|
indicatorGroup: {
|
|
102
102
|
role: 'tablist';
|
|
103
|
-
'aria-label': string
|
|
103
|
+
'aria-label': string;
|
|
104
104
|
'data-scope': 'carousel';
|
|
105
105
|
'data-part': 'indicator-group';
|
|
106
106
|
};
|
|
107
107
|
nextTrigger: {
|
|
108
108
|
type: 'button';
|
|
109
|
-
'aria-label': string
|
|
110
|
-
disabled:
|
|
109
|
+
'aria-label': string;
|
|
110
|
+
disabled: Signal<boolean>;
|
|
111
111
|
'data-scope': 'carousel';
|
|
112
112
|
'data-part': 'next-trigger';
|
|
113
113
|
onClick: (e: MouseEvent) => void;
|
|
114
114
|
};
|
|
115
115
|
prevTrigger: {
|
|
116
116
|
type: 'button';
|
|
117
|
-
'aria-label': string
|
|
118
|
-
disabled:
|
|
117
|
+
'aria-label': string;
|
|
118
|
+
disabled: Signal<boolean>;
|
|
119
119
|
'data-scope': 'carousel';
|
|
120
120
|
'data-part': 'prev-trigger';
|
|
121
121
|
onClick: (e: MouseEvent) => void;
|
|
122
122
|
};
|
|
123
|
-
slide: (index: number) => CarouselSlideParts
|
|
123
|
+
slide: (index: number) => CarouselSlideParts;
|
|
124
124
|
}
|
|
125
125
|
export interface ConnectOptions {
|
|
126
126
|
id: string;
|
|
@@ -131,7 +131,7 @@ export interface ConnectOptions {
|
|
|
131
131
|
/** Builder for each slide's aria-label. Receives index + known count. */
|
|
132
132
|
slideLabel?: (index: number, count: number) => string;
|
|
133
133
|
}
|
|
134
|
-
export declare function connect
|
|
134
|
+
export declare function connect(state: Signal<CarouselState>, send: Send<CarouselMsg>, opts: ConnectOptions): CarouselParts;
|
|
135
135
|
export declare const carousel: {
|
|
136
136
|
init: typeof init;
|
|
137
137
|
update: typeof update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,12 +57,12 @@ export function canGoPrev(state) {
|
|
|
57
57
|
return state.count > 0;
|
|
58
58
|
return state.current > 0;
|
|
59
59
|
}
|
|
60
|
-
export function connect(
|
|
60
|
+
export function connect(state, send, opts) {
|
|
61
61
|
const locale = useContext(LocaleContext);
|
|
62
|
-
const label = opts.label ??
|
|
63
|
-
const indicatorLabel = opts.indicatorLabel ??
|
|
64
|
-
const nextLabel = opts.nextLabel ??
|
|
65
|
-
const prevLabel = opts.prevLabel ??
|
|
62
|
+
const label = opts.label ?? locale.carousel.label;
|
|
63
|
+
const indicatorLabel = opts.indicatorLabel ?? locale.carousel.indicators;
|
|
64
|
+
const nextLabel = opts.nextLabel ?? locale.carousel.next;
|
|
65
|
+
const prevLabel = opts.prevLabel ?? locale.carousel.prev;
|
|
66
66
|
const slideLabelFn = opts.slideLabel ?? en.carousel.slide;
|
|
67
67
|
const slideId = (i) => `${opts.id}:slide:${i}`;
|
|
68
68
|
return {
|
|
@@ -72,7 +72,7 @@ export function connect(get, send, opts) {
|
|
|
72
72
|
'aria-label': label,
|
|
73
73
|
'data-scope': 'carousel',
|
|
74
74
|
'data-part': 'root',
|
|
75
|
-
'data-paused': (s) => (
|
|
75
|
+
'data-paused': state.map((s) => (s.paused ? '' : undefined)),
|
|
76
76
|
onPointerEnter: tagSend(send, ['pause'], () => send({ type: 'pause' })),
|
|
77
77
|
onPointerLeave: tagSend(send, ['resume'], () => send({ type: 'resume' })),
|
|
78
78
|
onFocus: tagSend(send, ['pause'], () => send({ type: 'pause' })),
|
|
@@ -91,7 +91,7 @@ export function connect(get, send, opts) {
|
|
|
91
91
|
nextTrigger: {
|
|
92
92
|
type: 'button',
|
|
93
93
|
'aria-label': nextLabel,
|
|
94
|
-
disabled: (s) => !canGoNext(
|
|
94
|
+
disabled: state.map((s) => !canGoNext(s)),
|
|
95
95
|
'data-scope': 'carousel',
|
|
96
96
|
'data-part': 'next-trigger',
|
|
97
97
|
onClick: tagSend(send, ['next'], () => send({ type: 'next' })),
|
|
@@ -99,7 +99,7 @@ export function connect(get, send, opts) {
|
|
|
99
99
|
prevTrigger: {
|
|
100
100
|
type: 'button',
|
|
101
101
|
'aria-label': prevLabel,
|
|
102
|
-
disabled: (s) => !canGoPrev(
|
|
102
|
+
disabled: state.map((s) => !canGoPrev(s)),
|
|
103
103
|
'data-scope': 'carousel',
|
|
104
104
|
'data-part': 'prev-trigger',
|
|
105
105
|
onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),
|
|
@@ -113,19 +113,19 @@ export function connect(get, send, opts) {
|
|
|
113
113
|
'data-scope': 'carousel',
|
|
114
114
|
'data-part': 'slide',
|
|
115
115
|
'data-index': String(index),
|
|
116
|
-
'data-active': (s) => (
|
|
117
|
-
hidden: (s) =>
|
|
116
|
+
'data-active': state.map((s) => (s.current === index ? '' : undefined)),
|
|
117
|
+
hidden: state.map((s) => s.current !== index),
|
|
118
118
|
},
|
|
119
119
|
indicator: {
|
|
120
120
|
type: 'button',
|
|
121
121
|
role: 'tab',
|
|
122
122
|
'aria-label': en.carousel.goToSlide(index),
|
|
123
|
-
'aria-selected': (s) =>
|
|
123
|
+
'aria-selected': state.map((s) => s.current === index),
|
|
124
124
|
'aria-controls': slideId(index),
|
|
125
125
|
'data-scope': 'carousel',
|
|
126
126
|
'data-part': 'indicator',
|
|
127
127
|
'data-index': String(index),
|
|
128
|
-
'data-active': (s) => (
|
|
128
|
+
'data-active': state.map((s) => (s.current === index ? '' : undefined)),
|
|
129
129
|
onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', index })),
|
|
130
130
|
},
|
|
131
131
|
}),
|
|
@@ -1 +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, tagSend } 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 /** @intent(\"Jump to a specific slide by zero-based index\") */\n | { type: 'goTo'; index: number }\n /** @intent(\"Advance to the next slide (wraps if loop is enabled)\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous slide (wraps if loop is enabled)\") */\n | { type: 'prev' }\n /** @humanOnly */\n | { type: 'setCount'; count: number }\n /** @intent(\"Pause autoplay (typically while user hovers or focuses the carousel)\") */\n | { type: 'pause' }\n /** @intent(\"Resume autoplay after a pause\") */\n | { type: 'resume' }\n /** @intent(\"Turn autoplay on or off\") */\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: tagSend(send, ['pause'], () => send({ type: 'pause' })),\n onPointerLeave: tagSend(send, ['resume'], () => send({ type: 'resume' })),\n onFocus: tagSend(send, ['pause'], () => send({ type: 'pause' })),\n onBlur: tagSend(send, ['resume'], () => 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: tagSend(send, ['next'], () => 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: tagSend(send, ['prev'], () => 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: tagSend(send, ['goTo'], () => send({ type: 'goTo', index })),\n },\n }),\n }\n}\n\nexport const carousel = { init, update, connect, canGoNext, canGoPrev }\n"]}
|
|
1
|
+
{"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, Signal } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext, en } 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 /** @intent(\"Jump to a specific slide by zero-based index\") */\n | { type: 'goTo'; index: number }\n /** @intent(\"Advance to the next slide (wraps if loop is enabled)\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous slide (wraps if loop is enabled)\") */\n | { type: 'prev' }\n /** @humanOnly */\n | { type: 'setCount'; count: number }\n /** @intent(\"Pause autoplay (typically while user hovers or focuses the carousel)\") */\n | { type: 'pause' }\n /** @intent(\"Resume autoplay after a pause\") */\n | { type: 'resume' }\n /** @intent(\"Turn autoplay on or off\") */\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 {\n slide: {\n role: 'tabpanel'\n id: string\n 'aria-roledescription': 'slide'\n 'aria-label': string\n 'data-scope': 'carousel'\n 'data-part': 'slide'\n 'data-index': string\n 'data-active': Signal<'' | undefined>\n hidden: Signal<boolean>\n }\n indicator: {\n type: 'button'\n role: 'tab'\n 'aria-label': string\n 'aria-selected': Signal<boolean>\n 'aria-controls': string\n 'data-scope': 'carousel'\n 'data-part': 'indicator'\n 'data-index': string\n 'data-active': Signal<'' | undefined>\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface CarouselParts {\n root: {\n role: 'region'\n 'aria-roledescription': 'carousel'\n 'aria-label': string\n 'data-scope': 'carousel'\n 'data-part': 'root'\n 'data-paused': Signal<'' | 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\n 'data-scope': 'carousel'\n 'data-part': 'indicator-group'\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string\n disabled: Signal<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\n disabled: Signal<boolean>\n 'data-scope': 'carousel'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n slide: (index: number) => CarouselSlideParts\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(\n state: Signal<CarouselState>,\n send: Send<CarouselMsg>,\n opts: ConnectOptions,\n): CarouselParts {\n const locale = useContext(LocaleContext)\n const label = opts.label ?? locale.carousel.label\n const indicatorLabel = opts.indicatorLabel ?? locale.carousel.indicators\n const nextLabel = opts.nextLabel ?? locale.carousel.next\n const prevLabel = opts.prevLabel ?? locale.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': state.map((s) => (s.paused ? '' : undefined)),\n onPointerEnter: tagSend(send, ['pause'], () => send({ type: 'pause' })),\n onPointerLeave: tagSend(send, ['resume'], () => send({ type: 'resume' })),\n onFocus: tagSend(send, ['pause'], () => send({ type: 'pause' })),\n onBlur: tagSend(send, ['resume'], () => 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: state.map((s) => !canGoNext(s)),\n 'data-scope': 'carousel',\n 'data-part': 'next-trigger',\n onClick: tagSend(send, ['next'], () => send({ type: 'next' })),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n disabled: state.map((s) => !canGoPrev(s)),\n 'data-scope': 'carousel',\n 'data-part': 'prev-trigger',\n onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),\n },\n slide: (index: number): CarouselSlideParts => ({\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': state.map((s) => (s.current === index ? '' : undefined)),\n hidden: state.map((s) => s.current !== index),\n },\n indicator: {\n type: 'button',\n role: 'tab',\n 'aria-label': en.carousel.goToSlide(index),\n 'aria-selected': state.map((s) => s.current === index),\n 'aria-controls': slideId(index),\n 'data-scope': 'carousel',\n 'data-part': 'indicator',\n 'data-index': String(index),\n 'data-active': state.map((s) => (s.current === index ? '' : undefined)),\n onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', index })),\n },\n }),\n }\n}\n\nexport const carousel = { init, update, connect, canGoNext, canGoPrev }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Send } from '@llui/dom';
|
|
1
|
+
import type { Send, Signal } from '@llui/dom';
|
|
2
2
|
/**
|
|
3
3
|
* Cascade select — a series of dependent selects where each level's
|
|
4
4
|
* choice filters the options of the next. Classic example: country
|
|
@@ -51,7 +51,7 @@ export declare function update(state: CascadeSelectState, msg: CascadeSelectMsg)
|
|
|
51
51
|
export declare function isLevelReady(state: CascadeSelectState, levelIndex: number): boolean;
|
|
52
52
|
export declare function isComplete(state: CascadeSelectState): boolean;
|
|
53
53
|
export declare function completeValues(state: CascadeSelectState): string[] | null;
|
|
54
|
-
export interface CascadeLevelParts
|
|
54
|
+
export interface CascadeLevelParts {
|
|
55
55
|
label: {
|
|
56
56
|
for: string;
|
|
57
57
|
'data-scope': 'cascade-select';
|
|
@@ -59,37 +59,37 @@ export interface CascadeLevelParts<S> {
|
|
|
59
59
|
};
|
|
60
60
|
select: {
|
|
61
61
|
id: string;
|
|
62
|
-
disabled:
|
|
63
|
-
value:
|
|
62
|
+
disabled: Signal<boolean>;
|
|
63
|
+
value: Signal<string>;
|
|
64
64
|
'data-scope': 'cascade-select';
|
|
65
65
|
'data-part': 'level-select';
|
|
66
66
|
'data-level': string;
|
|
67
|
-
'data-ready':
|
|
67
|
+
'data-ready': Signal<'' | undefined>;
|
|
68
68
|
onChange: (e: Event) => void;
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
-
export interface CascadeSelectParts
|
|
71
|
+
export interface CascadeSelectParts {
|
|
72
72
|
root: {
|
|
73
73
|
'data-scope': 'cascade-select';
|
|
74
74
|
'data-part': 'root';
|
|
75
|
-
'data-disabled':
|
|
76
|
-
'data-complete':
|
|
75
|
+
'data-disabled': Signal<'' | undefined>;
|
|
76
|
+
'data-complete': Signal<'' | undefined>;
|
|
77
77
|
};
|
|
78
78
|
clearTrigger: {
|
|
79
79
|
type: 'button';
|
|
80
|
-
'aria-label': string
|
|
81
|
-
disabled:
|
|
80
|
+
'aria-label': string;
|
|
81
|
+
disabled: Signal<boolean>;
|
|
82
82
|
'data-scope': 'cascade-select';
|
|
83
83
|
'data-part': 'clear-trigger';
|
|
84
84
|
onClick: (e: MouseEvent) => void;
|
|
85
85
|
};
|
|
86
|
-
level: (index: number) => CascadeLevelParts
|
|
86
|
+
level: (index: number) => CascadeLevelParts;
|
|
87
87
|
}
|
|
88
88
|
export interface ConnectOptions {
|
|
89
89
|
id: string;
|
|
90
90
|
clearLabel?: string;
|
|
91
91
|
}
|
|
92
|
-
export declare function connect
|
|
92
|
+
export declare function connect(state: Signal<CascadeSelectState>, send: Send<CascadeSelectMsg>, opts: ConnectOptions): CascadeSelectParts;
|
|
93
93
|
export declare const cascadeSelect: {
|
|
94
94
|
init: typeof init;
|
|
95
95
|
update: typeof update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-select.d.ts","sourceRoot":"","sources":["../../src/components/cascade-select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"cascade-select.d.ts","sourceRoot":"","sources":["../../src/components/cascade-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,20 +53,20 @@ export function completeValues(state) {
|
|
|
53
53
|
return null;
|
|
54
54
|
return state.values;
|
|
55
55
|
}
|
|
56
|
-
export function connect(
|
|
56
|
+
export function connect(state, send, opts) {
|
|
57
57
|
const locale = useContext(LocaleContext);
|
|
58
58
|
const levelId = (i) => `${opts.id}:level:${i}`;
|
|
59
59
|
return {
|
|
60
60
|
root: {
|
|
61
61
|
'data-scope': 'cascade-select',
|
|
62
62
|
'data-part': 'root',
|
|
63
|
-
'data-disabled': (s) => (
|
|
64
|
-
'data-complete': (s) => (isComplete(
|
|
63
|
+
'data-disabled': state.map((s) => (s.disabled ? '' : undefined)),
|
|
64
|
+
'data-complete': state.map((s) => (isComplete(s) ? '' : undefined)),
|
|
65
65
|
},
|
|
66
66
|
clearTrigger: {
|
|
67
67
|
type: 'button',
|
|
68
|
-
'aria-label': opts.clearLabel ??
|
|
69
|
-
disabled: (s) =>
|
|
68
|
+
'aria-label': opts.clearLabel ?? locale.cascadeSelect.clear,
|
|
69
|
+
disabled: state.map((s) => s.values.every((v) => v === null)),
|
|
70
70
|
'data-scope': 'cascade-select',
|
|
71
71
|
'data-part': 'clear-trigger',
|
|
72
72
|
onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),
|
|
@@ -79,12 +79,12 @@ export function connect(get, send, opts) {
|
|
|
79
79
|
},
|
|
80
80
|
select: {
|
|
81
81
|
id: levelId(index),
|
|
82
|
-
disabled: (s) =>
|
|
83
|
-
value: (s) =>
|
|
82
|
+
disabled: state.map((s) => s.disabled || !isLevelReady(s, index)),
|
|
83
|
+
value: state.map((s) => s.values[index] ?? ''),
|
|
84
84
|
'data-scope': 'cascade-select',
|
|
85
85
|
'data-part': 'level-select',
|
|
86
86
|
'data-level': String(index),
|
|
87
|
-
'data-ready': (s) => (isLevelReady(
|
|
87
|
+
'data-ready': state.map((s) => (isLevelReady(s, index) ? '' : undefined)),
|
|
88
88
|
onChange: tagSend(send, ['setValue'], (e) => {
|
|
89
89
|
const el = e.target;
|
|
90
90
|
send({ type: 'setValue', levelIndex: index, value: el.value || null });
|