@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
package/dist/components/tour.js
CHANGED
|
@@ -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
|
const steps = opts.steps ?? [];
|
|
@@ -78,10 +78,10 @@ export function connect(get, send, opts) {
|
|
|
78
78
|
'data-scope': 'tour',
|
|
79
79
|
'data-part': 'backdrop',
|
|
80
80
|
'aria-hidden': 'true',
|
|
81
|
-
onClick: () => {
|
|
81
|
+
onClick: tagSend(send, ['stop'], () => {
|
|
82
82
|
if (closeOnBackdrop)
|
|
83
83
|
send({ type: 'stop' });
|
|
84
|
-
},
|
|
84
|
+
}),
|
|
85
85
|
},
|
|
86
86
|
spotlight: {
|
|
87
87
|
'data-scope': 'tour',
|
|
@@ -107,21 +107,21 @@ export function connect(get, send, opts) {
|
|
|
107
107
|
disabled: (s) => isFirst(get(s)),
|
|
108
108
|
'data-scope': 'tour',
|
|
109
109
|
'data-part': 'prev-trigger',
|
|
110
|
-
onClick: () => send({ type: 'prev' }),
|
|
110
|
+
onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),
|
|
111
111
|
},
|
|
112
112
|
nextTrigger: {
|
|
113
113
|
type: 'button',
|
|
114
114
|
'data-scope': 'tour',
|
|
115
115
|
'data-part': 'next-trigger',
|
|
116
116
|
'data-last': (s) => (isLast(get(s)) ? '' : undefined),
|
|
117
|
-
onClick: () => send({ type: 'next' }),
|
|
117
|
+
onClick: tagSend(send, ['next'], () => send({ type: 'next' })),
|
|
118
118
|
},
|
|
119
119
|
closeTrigger: {
|
|
120
120
|
type: 'button',
|
|
121
121
|
'aria-label': opts.closeLabel ?? ((s) => locale(s).tour.close),
|
|
122
122
|
'data-scope': 'tour',
|
|
123
123
|
'data-part': 'close-trigger',
|
|
124
|
-
onClick: () => send({ type: 'stop' }),
|
|
124
|
+
onClick: tagSend(send, ['stop'], () => send({ type: 'stop' })),
|
|
125
125
|
},
|
|
126
126
|
};
|
|
127
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tour.js","sourceRoot":"","sources":["../../src/components/tour.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Tour — guided walkthrough over a sequence of steps, each targeting\n * an element on the page with a pop-up explanation. The state machine\n * tracks the current step index and open/closed; positioning of the\n * pop-up relative to the target selector is done in the view layer\n * (typically via onMount + attachFloating).\n *\n * Typical shape:\n *\n * const t = tour.connect<State>(s => s.tour, m => send({type:'tour', msg:m}))\n * ...tour.overlay<State>({\n * get: s => s.tour,\n * send: m => send({type:'tour', msg:m}),\n * parts: t,\n * content: (step) => [\n * h3({ ...t.title }, [text(step.title)]),\n * p({ ...t.description }, [text(step.description)]),\n * button({ ...t.prevTrigger }, [text('Back')]),\n * button({ ...t.nextTrigger }, [text('Next')]),\n * ],\n * })\n */\n\nexport interface TourStep {\n id: string\n title: string\n description: string\n /** CSS selector or element ref for the tour target. */\n target: string\n /** Placement hint for the pop-up. */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Whether to show the highlight ring around the target. */\n spotlight?: boolean\n}\n\nexport interface TourState {\n steps: TourStep[]\n open: boolean\n index: number\n /** Ids of steps already visited. */\n visited: string[]\n}\n\nexport type TourMsg =\n | { type: 'start' }\n | { type: 'stop' }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'goto'; index: number }\n | { type: 'setSteps'; steps: TourStep[] }\n\nexport interface TourInit {\n steps?: TourStep[]\n open?: boolean\n index?: number\n}\n\nexport function init(opts: TourInit = {}): TourState {\n const steps = opts.steps ?? []\n const index = Math.max(0, Math.min(opts.index ?? 0, Math.max(0, steps.length - 1)))\n return {\n steps,\n open: opts.open ?? false,\n index,\n visited: opts.open && steps[index] ? [steps[index].id] : [],\n }\n}\n\nexport function update(state: TourState, msg: TourMsg): [TourState, never[]] {\n switch (msg.type) {\n case 'start': {\n if (state.steps.length === 0) return [state, []]\n const first = state.steps[0]!\n return [{ ...state, open: true, index: 0, visited: [first.id] }, []]\n }\n case 'stop':\n return [{ ...state, open: false }, []]\n case 'next': {\n const last = state.steps.length - 1\n if (state.index >= last) return [{ ...state, open: false }, []]\n const nextIdx = state.index + 1\n const nextStep = state.steps[nextIdx]!\n const visited = state.visited.includes(nextStep.id)\n ? state.visited\n : [...state.visited, nextStep.id]\n return [{ ...state, index: nextIdx, visited }, []]\n }\n case 'prev': {\n if (state.index <= 0) return [state, []]\n return [{ ...state, index: state.index - 1 }, []]\n }\n case 'goto': {\n if (msg.index < 0 || msg.index >= state.steps.length) return [state, []]\n const step = state.steps[msg.index]!\n const visited = state.visited.includes(step.id) ? state.visited : [...state.visited, step.id]\n return [{ ...state, open: true, index: msg.index, visited }, []]\n }\n case 'setSteps':\n return [{ ...state, steps: msg.steps, index: 0 }, []]\n }\n}\n\nexport function currentStep(state: TourState): TourStep | null {\n return state.steps[state.index] ?? null\n}\n\nexport function isFirst(state: TourState): boolean {\n return state.index === 0\n}\n\nexport function isLast(state: TourState): boolean {\n return state.index === state.steps.length - 1\n}\n\nexport function progress(state: TourState): { current: number; total: number } {\n return { current: state.index + 1, total: state.steps.length }\n}\n\nexport interface TourParts<S> {\n root: {\n role: 'dialog'\n 'aria-modal': 'false'\n 'aria-labelledby': string\n 'aria-describedby': string\n 'data-scope': 'tour'\n 'data-part': 'root'\n hidden: (s: S) => boolean\n }\n backdrop: {\n 'data-scope': 'tour'\n 'data-part': 'backdrop'\n 'aria-hidden': 'true'\n onClick: (e: MouseEvent) => void\n }\n spotlight: {\n 'data-scope': 'tour'\n 'data-part': 'spotlight'\n 'aria-hidden': 'true'\n }\n title: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'description'\n }\n progressText: {\n 'data-scope': 'tour'\n 'data-part': 'progress-text'\n }\n prevTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'tour'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'data-scope': 'tour'\n 'data-part': 'next-trigger'\n 'data-last': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'tour'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n /** Whether clicking the backdrop stops the tour. Default: false — tours\n * typically require an explicit dismiss. */\n closeOnBackdropClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TourState,\n send: Send<TourMsg>,\n opts: ConnectOptions,\n): TourParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const titleId = `${opts.id}:title`\n const descId = `${opts.id}:description`\n const closeOnBackdrop = opts.closeOnBackdropClick === true\n\n return {\n root: {\n role: 'dialog',\n 'aria-modal': 'false',\n 'aria-labelledby': titleId,\n 'aria-describedby': descId,\n 'data-scope': 'tour',\n 'data-part': 'root',\n hidden: (s) => !get(s).open,\n },\n backdrop: {\n 'data-scope': 'tour',\n 'data-part': 'backdrop',\n 'aria-hidden': 'true',\n onClick: () => {\n if (closeOnBackdrop) send({ type: 'stop' })\n },\n },\n spotlight: {\n 'data-scope': 'tour',\n 'data-part': 'spotlight',\n 'aria-hidden': 'true',\n },\n title: {\n id: titleId,\n 'data-scope': 'tour',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'tour',\n 'data-part': 'description',\n },\n progressText: {\n 'data-scope': 'tour',\n 'data-part': 'progress-text',\n },\n prevTrigger: {\n type: 'button',\n disabled: (s) => isFirst(get(s)),\n 'data-scope': 'tour',\n 'data-part': 'prev-trigger',\n onClick: () => send({ type: 'prev' }),\n },\n nextTrigger: {\n type: 'button',\n 'data-scope': 'tour',\n 'data-part': 'next-trigger',\n 'data-last': (s) => (isLast(get(s)) ? '' : undefined),\n onClick: () => send({ type: 'next' }),\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': opts.closeLabel ?? ((s: S) => locale(s).tour.close),\n 'data-scope': 'tour',\n 'data-part': 'close-trigger',\n onClick: () => send({ type: 'stop' }),\n },\n }\n}\n\nexport const tour = {\n init,\n update,\n connect,\n currentStep,\n isFirst,\n isLast,\n progress,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tour.js","sourceRoot":"","sources":["../../src/components/tour.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 * Tour — guided walkthrough over a sequence of steps, each targeting\n * an element on the page with a pop-up explanation. The state machine\n * tracks the current step index and open/closed; positioning of the\n * pop-up relative to the target selector is done in the view layer\n * (typically via onMount + attachFloating).\n *\n * Typical shape:\n *\n * const t = tour.connect<State>(s => s.tour, m => send({type:'tour', msg:m}))\n * ...tour.overlay<State>({\n * get: s => s.tour,\n * send: m => send({type:'tour', msg:m}),\n * parts: t,\n * content: (step) => [\n * h3({ ...t.title }, [text(step.title)]),\n * p({ ...t.description }, [text(step.description)]),\n * button({ ...t.prevTrigger }, [text('Back')]),\n * button({ ...t.nextTrigger }, [text('Next')]),\n * ],\n * })\n */\n\nexport interface TourStep {\n id: string\n title: string\n description: string\n /** CSS selector or element ref for the tour target. */\n target: string\n /** Placement hint for the pop-up. */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Whether to show the highlight ring around the target. */\n spotlight?: boolean\n}\n\nexport interface TourState {\n steps: TourStep[]\n open: boolean\n index: number\n /** Ids of steps already visited. */\n visited: string[]\n}\n\nexport type TourMsg =\n /** @intent(\"Begin the tour at the first step (or current index if resuming)\") */\n | { type: 'start' }\n /** @intent(\"Close the tour without finishing (does not reset progress)\") */\n | { type: 'stop' }\n /** @intent(\"Advance to the next step (closes the tour after the last step)\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous step\") */\n | { type: 'prev' }\n /** @intent(\"Jump to a specific step by zero-based index\") */\n | { type: 'goto'; index: number }\n /** @humanOnly */\n | { type: 'setSteps'; steps: TourStep[] }\n\nexport interface TourInit {\n steps?: TourStep[]\n open?: boolean\n index?: number\n}\n\nexport function init(opts: TourInit = {}): TourState {\n const steps = opts.steps ?? []\n const index = Math.max(0, Math.min(opts.index ?? 0, Math.max(0, steps.length - 1)))\n return {\n steps,\n open: opts.open ?? false,\n index,\n visited: opts.open && steps[index] ? [steps[index].id] : [],\n }\n}\n\nexport function update(state: TourState, msg: TourMsg): [TourState, never[]] {\n switch (msg.type) {\n case 'start': {\n if (state.steps.length === 0) return [state, []]\n const first = state.steps[0]!\n return [{ ...state, open: true, index: 0, visited: [first.id] }, []]\n }\n case 'stop':\n return [{ ...state, open: false }, []]\n case 'next': {\n const last = state.steps.length - 1\n if (state.index >= last) return [{ ...state, open: false }, []]\n const nextIdx = state.index + 1\n const nextStep = state.steps[nextIdx]!\n const visited = state.visited.includes(nextStep.id)\n ? state.visited\n : [...state.visited, nextStep.id]\n return [{ ...state, index: nextIdx, visited }, []]\n }\n case 'prev': {\n if (state.index <= 0) return [state, []]\n return [{ ...state, index: state.index - 1 }, []]\n }\n case 'goto': {\n if (msg.index < 0 || msg.index >= state.steps.length) return [state, []]\n const step = state.steps[msg.index]!\n const visited = state.visited.includes(step.id) ? state.visited : [...state.visited, step.id]\n return [{ ...state, open: true, index: msg.index, visited }, []]\n }\n case 'setSteps':\n return [{ ...state, steps: msg.steps, index: 0 }, []]\n }\n}\n\nexport function currentStep(state: TourState): TourStep | null {\n return state.steps[state.index] ?? null\n}\n\nexport function isFirst(state: TourState): boolean {\n return state.index === 0\n}\n\nexport function isLast(state: TourState): boolean {\n return state.index === state.steps.length - 1\n}\n\nexport function progress(state: TourState): { current: number; total: number } {\n return { current: state.index + 1, total: state.steps.length }\n}\n\nexport interface TourParts<S> {\n root: {\n role: 'dialog'\n 'aria-modal': 'false'\n 'aria-labelledby': string\n 'aria-describedby': string\n 'data-scope': 'tour'\n 'data-part': 'root'\n hidden: (s: S) => boolean\n }\n backdrop: {\n 'data-scope': 'tour'\n 'data-part': 'backdrop'\n 'aria-hidden': 'true'\n onClick: (e: MouseEvent) => void\n }\n spotlight: {\n 'data-scope': 'tour'\n 'data-part': 'spotlight'\n 'aria-hidden': 'true'\n }\n title: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'description'\n }\n progressText: {\n 'data-scope': 'tour'\n 'data-part': 'progress-text'\n }\n prevTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'tour'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'data-scope': 'tour'\n 'data-part': 'next-trigger'\n 'data-last': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'tour'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n /** Whether clicking the backdrop stops the tour. Default: false — tours\n * typically require an explicit dismiss. */\n closeOnBackdropClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TourState,\n send: Send<TourMsg>,\n opts: ConnectOptions,\n): TourParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const titleId = `${opts.id}:title`\n const descId = `${opts.id}:description`\n const closeOnBackdrop = opts.closeOnBackdropClick === true\n\n return {\n root: {\n role: 'dialog',\n 'aria-modal': 'false',\n 'aria-labelledby': titleId,\n 'aria-describedby': descId,\n 'data-scope': 'tour',\n 'data-part': 'root',\n hidden: (s) => !get(s).open,\n },\n backdrop: {\n 'data-scope': 'tour',\n 'data-part': 'backdrop',\n 'aria-hidden': 'true',\n onClick: tagSend(send, ['stop'], () => {\n if (closeOnBackdrop) send({ type: 'stop' })\n }),\n },\n spotlight: {\n 'data-scope': 'tour',\n 'data-part': 'spotlight',\n 'aria-hidden': 'true',\n },\n title: {\n id: titleId,\n 'data-scope': 'tour',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'tour',\n 'data-part': 'description',\n },\n progressText: {\n 'data-scope': 'tour',\n 'data-part': 'progress-text',\n },\n prevTrigger: {\n type: 'button',\n disabled: (s) => isFirst(get(s)),\n 'data-scope': 'tour',\n 'data-part': 'prev-trigger',\n onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),\n },\n nextTrigger: {\n type: 'button',\n 'data-scope': 'tour',\n 'data-part': 'next-trigger',\n 'data-last': (s) => (isLast(get(s)) ? '' : undefined),\n onClick: tagSend(send, ['next'], () => send({ type: 'next' })),\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': opts.closeLabel ?? ((s: S) => locale(s).tour.close),\n 'data-scope': 'tour',\n 'data-part': 'close-trigger',\n onClick: tagSend(send, ['stop'], () => send({ type: 'stop' })),\n },\n }\n}\n\nexport const tour = {\n init,\n update,\n connect,\n currentStep,\n isFirst,\n isLast,\n progress,\n}\n"]}
|
|
@@ -44,79 +44,129 @@ export interface TreeViewState {
|
|
|
44
44
|
*/
|
|
45
45
|
loading: string[];
|
|
46
46
|
}
|
|
47
|
-
export type TreeViewMsg =
|
|
47
|
+
export type TreeViewMsg =
|
|
48
|
+
/** @intent("Toggle the branch with the given id expanded/collapsed") */
|
|
49
|
+
{
|
|
48
50
|
type: 'toggleBranch';
|
|
49
51
|
id: string;
|
|
50
|
-
}
|
|
52
|
+
}
|
|
53
|
+
/** @intent("Expand the branch with the given id") */
|
|
54
|
+
| {
|
|
51
55
|
type: 'expand';
|
|
52
56
|
id: string;
|
|
53
|
-
}
|
|
57
|
+
}
|
|
58
|
+
/** @intent("Collapse the branch with the given id") */
|
|
59
|
+
| {
|
|
54
60
|
type: 'collapse';
|
|
55
61
|
id: string;
|
|
56
|
-
}
|
|
62
|
+
}
|
|
63
|
+
/** @intent("Expand every branch in the provided id list") */
|
|
64
|
+
| {
|
|
57
65
|
type: 'expandAll';
|
|
58
66
|
ids: string[];
|
|
59
|
-
}
|
|
67
|
+
}
|
|
68
|
+
/** @intent("Collapse every expanded branch") */
|
|
69
|
+
| {
|
|
60
70
|
type: 'collapseAll';
|
|
61
|
-
}
|
|
71
|
+
}
|
|
72
|
+
/** @intent("Select the item with the given id (additive=true extends multi-selection)") */
|
|
73
|
+
| {
|
|
62
74
|
type: 'select';
|
|
63
75
|
id: string;
|
|
64
76
|
additive?: boolean;
|
|
65
|
-
}
|
|
77
|
+
}
|
|
78
|
+
/** @intent("Replace the selected-id set with the provided list") */
|
|
79
|
+
| {
|
|
66
80
|
type: 'setSelected';
|
|
67
81
|
ids: string[];
|
|
68
|
-
}
|
|
82
|
+
}
|
|
83
|
+
/** @humanOnly */
|
|
84
|
+
| {
|
|
69
85
|
type: 'focus';
|
|
70
86
|
id: string | null;
|
|
71
|
-
}
|
|
87
|
+
}
|
|
88
|
+
/** @humanOnly */
|
|
89
|
+
| {
|
|
72
90
|
type: 'focusNext';
|
|
73
|
-
}
|
|
91
|
+
}
|
|
92
|
+
/** @humanOnly */
|
|
93
|
+
| {
|
|
74
94
|
type: 'focusPrev';
|
|
75
|
-
}
|
|
95
|
+
}
|
|
96
|
+
/** @humanOnly */
|
|
97
|
+
| {
|
|
76
98
|
type: 'focusFirst';
|
|
77
|
-
}
|
|
99
|
+
}
|
|
100
|
+
/** @humanOnly */
|
|
101
|
+
| {
|
|
78
102
|
type: 'focusLast';
|
|
79
|
-
}
|
|
103
|
+
}
|
|
104
|
+
/** @humanOnly */
|
|
105
|
+
| {
|
|
80
106
|
type: 'setVisibleItems';
|
|
81
107
|
ids: string[];
|
|
82
108
|
labels?: string[];
|
|
83
|
-
}
|
|
109
|
+
}
|
|
110
|
+
/** @humanOnly */
|
|
111
|
+
| {
|
|
84
112
|
type: 'typeahead';
|
|
85
113
|
char: string;
|
|
86
114
|
now: number;
|
|
87
|
-
}
|
|
115
|
+
}
|
|
116
|
+
/** @humanOnly */
|
|
117
|
+
| {
|
|
88
118
|
type: 'arrowLeftFrom';
|
|
89
119
|
id: string;
|
|
90
120
|
isBranch: boolean;
|
|
91
121
|
parentId: string | null;
|
|
92
|
-
}
|
|
122
|
+
}
|
|
123
|
+
/** @humanOnly */
|
|
124
|
+
| {
|
|
93
125
|
type: 'arrowRightFrom';
|
|
94
126
|
id: string;
|
|
95
|
-
}
|
|
127
|
+
}
|
|
128
|
+
/** @intent("Toggle the checkbox on the item with the given id (descendantIds drives recursive check)") */
|
|
129
|
+
| {
|
|
96
130
|
type: 'toggleChecked';
|
|
97
131
|
id: string;
|
|
98
132
|
descendantIds?: string[];
|
|
99
|
-
}
|
|
133
|
+
}
|
|
134
|
+
/** @intent("Replace the checked-id set with the provided list") */
|
|
135
|
+
| {
|
|
100
136
|
type: 'setChecked';
|
|
101
137
|
ids: string[];
|
|
102
|
-
}
|
|
138
|
+
}
|
|
139
|
+
/** @humanOnly */
|
|
140
|
+
| {
|
|
103
141
|
type: 'setIndeterminate';
|
|
104
142
|
ids: string[];
|
|
105
|
-
}
|
|
143
|
+
}
|
|
144
|
+
/** @intent("Begin renaming the item with the given id (seeds the rename input with `initial`)") */
|
|
145
|
+
| {
|
|
106
146
|
type: 'renameStart';
|
|
107
147
|
id: string;
|
|
108
148
|
initial: string;
|
|
109
|
-
}
|
|
149
|
+
}
|
|
150
|
+
/** @intent("Update the rename draft as the user types") */
|
|
151
|
+
| {
|
|
110
152
|
type: 'renameChange';
|
|
111
153
|
value: string;
|
|
112
|
-
}
|
|
154
|
+
}
|
|
155
|
+
/** @intent("Commit the in-progress rename (clears the rename state)") */
|
|
156
|
+
| {
|
|
113
157
|
type: 'renameCommit';
|
|
114
|
-
}
|
|
158
|
+
}
|
|
159
|
+
/** @intent("Cancel the in-progress rename without applying changes") */
|
|
160
|
+
| {
|
|
115
161
|
type: 'renameCancel';
|
|
116
|
-
}
|
|
162
|
+
}
|
|
163
|
+
/** @intent("Mark the branch with the given id as loading children (typically before an async fetch)") */
|
|
164
|
+
| {
|
|
117
165
|
type: 'loadingStart';
|
|
118
166
|
id: string;
|
|
119
|
-
}
|
|
167
|
+
}
|
|
168
|
+
/** @intent("Clear the loading state for the given branch id (after async fetch completes)") */
|
|
169
|
+
| {
|
|
120
170
|
type: 'loadingEnd';
|
|
121
171
|
id: string;
|
|
122
172
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../src/components/tree-view.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 { typeaheadAccumulate, typeaheadMatch, isTypeaheadKey, TYPEAHEAD_TIMEOUT_MS, } from '../utils/typeahead.js';
|
|
3
4
|
export function init(opts = {}) {
|
|
@@ -207,13 +208,23 @@ export function connect(get, send, opts) {
|
|
|
207
208
|
'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),
|
|
208
209
|
'data-focused': (s) => (get(s).focused === id ? '' : undefined),
|
|
209
210
|
'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),
|
|
210
|
-
onClick: (e) => {
|
|
211
|
+
onClick: tagSend(send, ['select', 'toggleBranch'], (e) => {
|
|
211
212
|
send({ type: 'select', id, additive: e.metaKey || e.ctrlKey });
|
|
212
213
|
if (expandOnClick && isBranch)
|
|
213
214
|
send({ type: 'toggleBranch', id });
|
|
214
|
-
},
|
|
215
|
-
onFocus: () => send({ type: 'focus', id }),
|
|
216
|
-
onKeyDown: (
|
|
215
|
+
}),
|
|
216
|
+
onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', id })),
|
|
217
|
+
onKeyDown: tagSend(send, [
|
|
218
|
+
'focusNext',
|
|
219
|
+
'focusPrev',
|
|
220
|
+
'arrowRightFrom',
|
|
221
|
+
'arrowLeftFrom',
|
|
222
|
+
'focusFirst',
|
|
223
|
+
'focusLast',
|
|
224
|
+
'select',
|
|
225
|
+
'toggleBranch',
|
|
226
|
+
'typeahead',
|
|
227
|
+
], (e) => {
|
|
217
228
|
const key = flipArrow(e.key, e.currentTarget);
|
|
218
229
|
switch (key) {
|
|
219
230
|
case 'ArrowDown':
|
|
@@ -259,16 +270,16 @@ export function connect(get, send, opts) {
|
|
|
259
270
|
send({ type: 'typeahead', char: e.key, now: Date.now() });
|
|
260
271
|
}
|
|
261
272
|
}
|
|
262
|
-
},
|
|
273
|
+
}),
|
|
263
274
|
},
|
|
264
275
|
branchTrigger: {
|
|
265
276
|
'data-scope': 'tree-view',
|
|
266
277
|
'data-part': 'branch-trigger',
|
|
267
278
|
'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),
|
|
268
|
-
onClick: (e) => {
|
|
279
|
+
onClick: tagSend(send, ['toggleBranch'], (e) => {
|
|
269
280
|
e.stopPropagation();
|
|
270
281
|
send({ type: 'toggleBranch', id });
|
|
271
|
-
},
|
|
282
|
+
}),
|
|
272
283
|
},
|
|
273
284
|
checkbox: {
|
|
274
285
|
role: 'checkbox',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.js","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport {\n typeaheadAccumulate,\n typeaheadMatch,\n isTypeaheadKey,\n TYPEAHEAD_TIMEOUT_MS,\n} from '../utils/typeahead.js'\n\n/**\n * Tree view — hierarchical list with expand/collapse. Items are identified\n * by opaque string ids; the tree structure (children relationship) is\n * provided externally. The machine tracks which branches are expanded,\n * which items are selected, and which item has keyboard focus.\n */\n\nexport type SelectionMode = 'single' | 'multiple' | 'checkbox'\n\nexport interface TreeViewState {\n /** Ids of expanded branches. */\n expanded: string[]\n /** Ids of selected items. */\n selected: string[]\n /** Ids of checked items (checkbox selection mode). */\n checked: string[]\n /** Ids known to be in the indeterminate tri-state (some-but-not-all\n * descendants checked). Consumer-computed via propagation logic or the\n * `toggleChecked` message's `descendantIds` parameter. */\n indeterminate: string[]\n /** Currently focused item id. */\n focused: string | null\n selectionMode: SelectionMode\n /** Ordered list of currently-visible item ids (updated by consumer via setVisible). */\n visibleItems: string[]\n /** Parallel array of visible-item labels for typeahead. If empty, typeahead\n * matches against ids directly. Updated alongside visibleItems via the\n * optional `labels` field on `setVisibleItems`. */\n visibleLabels: string[]\n disabled: boolean\n /** Typeahead accumulator buffer. */\n typeahead: string\n typeaheadExpiresAt: number\n /** Id of item currently being renamed, or null. */\n renaming: string | null\n /** Draft value during rename. */\n renameDraft: string\n /**\n * Ids of branches currently loading their children asynchronously. Item\n * parts expose `aria-busy` while loading so assistive tech announces\n * the in-progress state. The consumer kicks off the fetch externally\n * (in a handler that intercepts `expand`, or via an effect), dispatches\n * `loadingStart` immediately, fetches the children, then dispatches\n * `setVisibleItems` with the new tree contents followed by `loadingEnd`.\n */\n loading: string[]\n}\n\nexport type TreeViewMsg =\n | { type: 'toggleBranch'; id: string }\n | { type: 'expand'; id: string }\n | { type: 'collapse'; id: string }\n | { type: 'expandAll'; ids: string[] }\n | { type: 'collapseAll' }\n | { type: 'select'; id: string; additive?: boolean }\n | { type: 'setSelected'; ids: string[] }\n | { type: 'focus'; id: string | null }\n | { type: 'focusNext' }\n | { type: 'focusPrev' }\n | { type: 'focusFirst' }\n | { type: 'focusLast' }\n | { type: 'setVisibleItems'; ids: string[]; labels?: string[] }\n | { type: 'typeahead'; char: string; now: number }\n | { type: 'arrowLeftFrom'; id: string; isBranch: boolean; parentId: string | null }\n | { type: 'arrowRightFrom'; id: string }\n | { type: 'toggleChecked'; id: string; descendantIds?: string[] }\n | { type: 'setChecked'; ids: string[] }\n | { type: 'setIndeterminate'; ids: string[] }\n | { type: 'renameStart'; id: string; initial: string }\n | { type: 'renameChange'; value: string }\n | { type: 'renameCommit' }\n | { type: 'renameCancel' }\n | { type: 'loadingStart'; id: string }\n | { type: 'loadingEnd'; id: string }\n\nexport interface TreeViewInit {\n expanded?: string[]\n selected?: string[]\n checked?: string[]\n indeterminate?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n visibleItems?: string[]\n visibleLabels?: string[]\n}\n\nexport function init(opts: TreeViewInit = {}): TreeViewState {\n return {\n expanded: opts.expanded ?? [],\n selected: opts.selected ?? [],\n checked: opts.checked ?? [],\n indeterminate: opts.indeterminate ?? [],\n focused: null,\n selectionMode: opts.selectionMode ?? 'single',\n visibleItems: opts.visibleItems ?? [],\n visibleLabels: opts.visibleLabels ?? [],\n disabled: opts.disabled ?? false,\n typeahead: '',\n typeaheadExpiresAt: 0,\n renaming: null,\n renameDraft: '',\n loading: [],\n }\n}\n\nexport function update(state: TreeViewState, msg: TreeViewMsg): [TreeViewState, never[]] {\n if (state.disabled && msg.type !== 'setVisibleItems') return [state, []]\n switch (msg.type) {\n case 'toggleBranch': {\n const expanded = state.expanded.includes(msg.id)\n ? state.expanded.filter((id) => id !== msg.id)\n : [...state.expanded, msg.id]\n return [{ ...state, expanded }, []]\n }\n case 'expand':\n if (state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n case 'collapse':\n if (!state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n case 'expandAll':\n return [{ ...state, expanded: msg.ids }, []]\n case 'collapseAll':\n return [{ ...state, expanded: [] }, []]\n case 'select': {\n if (state.selectionMode === 'single') {\n return [{ ...state, selected: [msg.id] }, []]\n }\n if (msg.additive) {\n const isSelected = state.selected.includes(msg.id)\n const selected = isSelected\n ? state.selected.filter((id) => id !== msg.id)\n : [...state.selected, msg.id]\n return [{ ...state, selected }, []]\n }\n return [{ ...state, selected: [msg.id] }, []]\n }\n case 'setSelected':\n return [{ ...state, selected: msg.ids }, []]\n case 'focus':\n return [{ ...state, focused: msg.id }, []]\n case 'focusNext': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused ? state.visibleItems.indexOf(state.focused) : -1\n const next = state.visibleItems[Math.min(idx + 1, state.visibleItems.length - 1)]\n return [{ ...state, focused: next ?? state.focused }, []]\n }\n case 'focusPrev': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused\n ? state.visibleItems.indexOf(state.focused)\n : state.visibleItems.length\n const prev = state.visibleItems[Math.max(0, idx - 1)]\n return [{ ...state, focused: prev ?? state.focused }, []]\n }\n case 'focusFirst':\n return [{ ...state, focused: state.visibleItems[0] ?? null }, []]\n case 'focusLast':\n return [{ ...state, focused: state.visibleItems[state.visibleItems.length - 1] ?? null }, []]\n case 'setVisibleItems':\n return [\n { ...state, visibleItems: msg.ids, visibleLabels: msg.labels ?? state.visibleLabels },\n [],\n ]\n case 'arrowLeftFrom': {\n // If this is an expanded branch, collapse it and stay focused.\n if (msg.isBranch && state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n }\n // Otherwise, move focus to parent if provided (WAI-ARIA).\n if (msg.parentId !== null) {\n return [{ ...state, focused: msg.parentId }, []]\n }\n return [state, []]\n }\n case 'arrowRightFrom': {\n // If this branch is closed, expand it; otherwise focus the first\n // visible child (the next item in depth-first visibleItems order).\n if (!state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n }\n const idx = state.visibleItems.indexOf(msg.id)\n if (idx === -1 || idx === state.visibleItems.length - 1) return [state, []]\n const next = state.visibleItems[idx + 1]!\n return [{ ...state, focused: next }, []]\n }\n case 'typeahead': {\n if (state.visibleItems.length === 0) return [state, []]\n const acc = typeaheadAccumulate(state.typeahead, msg.char, msg.now, state.typeaheadExpiresAt)\n // Fall back to matching ids if labels weren't provided.\n const labels = state.visibleLabels.length > 0 ? state.visibleLabels : state.visibleItems\n const disabledMask = new Array<boolean>(labels.length).fill(false)\n const startIdx = state.focused ? state.visibleItems.indexOf(state.focused) : null\n const matchIdx = typeaheadMatch(labels, disabledMask, acc, startIdx)\n const focused =\n matchIdx === null ? state.focused : (state.visibleItems[matchIdx] ?? state.focused)\n return [\n { ...state, typeahead: acc, typeaheadExpiresAt: msg.now + TYPEAHEAD_TIMEOUT_MS, focused },\n [],\n ]\n }\n case 'toggleChecked': {\n // Toggle the item's checked state, propagating to descendants if any.\n // The caller passes `descendantIds` for branches; for leaves, pass\n // an empty list or omit. Indeterminate flag is cleared on the id\n // (a deliberate toggle is a definite state). The caller is\n // responsible for recomputing `indeterminate` on ancestors via\n // setIndeterminate after this message.\n const desc = msg.descendantIds ?? []\n const all = [msg.id, ...desc]\n const isChecked = state.checked.includes(msg.id)\n const next = isChecked\n ? state.checked.filter((id) => !all.includes(id))\n : Array.from(new Set([...state.checked, ...all]))\n const indeterminate = state.indeterminate.filter((id) => !all.includes(id))\n return [{ ...state, checked: next, indeterminate }, []]\n }\n case 'setChecked':\n return [{ ...state, checked: msg.ids }, []]\n case 'setIndeterminate':\n return [{ ...state, indeterminate: msg.ids }, []]\n case 'renameStart':\n return [{ ...state, renaming: msg.id, renameDraft: msg.initial }, []]\n case 'renameChange':\n return [{ ...state, renameDraft: msg.value }, []]\n case 'renameCommit':\n case 'renameCancel':\n return [{ ...state, renaming: null, renameDraft: '' }, []]\n case 'loadingStart':\n if (state.loading.includes(msg.id)) return [state, []]\n return [{ ...state, loading: [...state.loading, msg.id] }, []]\n case 'loadingEnd':\n return [{ ...state, loading: state.loading.filter((id) => id !== msg.id) }, []]\n }\n}\n\nexport function isExpanded(state: TreeViewState, id: string): boolean {\n return state.expanded.includes(id)\n}\n\nexport function isSelected(state: TreeViewState, id: string): boolean {\n return state.selected.includes(id)\n}\n\nexport function isChecked(state: TreeViewState, id: string): boolean {\n return state.checked.includes(id)\n}\n\nexport function isIndeterminate(state: TreeViewState, id: string): boolean {\n return state.indeterminate.includes(id)\n}\n\nexport function isRenaming(state: TreeViewState, id: string): boolean {\n return state.renaming === id\n}\n\nexport function isLoading(state: TreeViewState, id: string): boolean {\n return state.loading.includes(id)\n}\n\nexport interface TreeItemParts<S> {\n item: {\n role: 'treeitem'\n id: string\n 'aria-expanded': (s: S) => boolean | undefined\n 'aria-selected': (s: S) => boolean | undefined\n 'aria-level': number\n 'aria-busy': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'tree-view'\n 'data-part': 'item'\n 'data-value': string\n 'data-depth': string\n 'data-selected': (s: S) => '' | undefined\n 'data-focused': (s: S) => '' | undefined\n 'data-loading': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n /** For branch items — expand/collapse disclosure trigger. */\n branchTrigger: {\n 'data-scope': 'tree-view'\n 'data-part': 'branch-trigger'\n 'data-state': (s: S) => 'open' | 'closed'\n onClick: (e: MouseEvent) => void\n }\n /**\n * Checkbox element (only meaningful when `selectionMode === 'checkbox'`).\n * `aria-checked` is the tri-state string ('true' | 'false' | 'mixed').\n * The consumer must render a checkbox input or a visual proxy and\n * dispatch `toggleChecked` via the `onClick` binding. For branches,\n * pass the branch's descendant ids via `descendantIds` on the message\n * so children are propagated in a single reducer step.\n */\n checkbox: {\n role: 'checkbox'\n 'aria-checked': (s: S) => 'true' | 'false' | 'mixed'\n 'data-scope': 'tree-view'\n 'data-part': 'checkbox'\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n }\n}\n\nexport interface TreeViewParts<S> {\n root: {\n role: 'tree'\n 'aria-owns': (s: S) => string | undefined\n 'aria-multiselectable': (s: S) => 'true' | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'tree-view'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * If true, clicking anywhere on a branch item (not just the disclosure\n * caret) toggles its expanded state. Default: false — clicks on the row\n * select it without toggling, consistent with most file-tree UIs.\n */\n expandOnClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TreeViewState,\n send: Send<TreeViewMsg>,\n opts: ConnectOptions,\n): TreeViewParts<S> {\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n const expandOnClick = opts.expandOnClick === true\n\n return {\n root: {\n role: 'tree',\n 'aria-owns': (s) => {\n const items = get(s).visibleItems\n if (items.length === 0) return undefined\n return items.map((id) => itemId(id)).join(' ')\n },\n 'aria-multiselectable': (s) => (get(s).selectionMode === 'multiple' ? 'true' : undefined),\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'tree-view',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n item: (\n id: string,\n depth: number,\n isBranch: boolean,\n parentId: string | null = null,\n ): TreeItemParts<S> => ({\n item: {\n role: 'treeitem',\n id: itemId(id),\n 'aria-expanded': (s) => (isBranch ? isExpanded(get(s), id) : undefined),\n 'aria-selected': (s) =>\n get(s).selectionMode === 'single' ? isSelected(get(s), id) : undefined,\n 'aria-level': depth + 1,\n 'aria-busy': (s) => (isLoading(get(s), id) ? 'true' : undefined),\n tabIndex: (s) => (get(s).focused === id ? 0 : -1),\n 'data-scope': 'tree-view',\n 'data-part': 'item',\n 'data-value': id,\n 'data-depth': String(depth),\n 'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),\n 'data-focused': (s) => (get(s).focused === id ? '' : undefined),\n 'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),\n onClick: (e) => {\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (expandOnClick && isBranch) send({ type: 'toggleBranch', id })\n },\n onFocus: () => send({ type: 'focus', id }),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev' })\n return\n case 'ArrowRight':\n // WAI-ARIA: closed branch → expand (stay); open branch →\n // focus first child. Leaf → nothing. The reducer decides\n // based on current expanded state.\n if (!isBranch) return\n e.preventDefault()\n send({ type: 'arrowRightFrom', id })\n return\n case 'ArrowLeft':\n // WAI-ARIA: open branch → collapse (stay); closed branch or\n // leaf → focus parent (if known). Root end-nodes → nothing.\n e.preventDefault()\n send({ type: 'arrowLeftFrom', id, isBranch, parentId })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (isBranch) send({ type: 'toggleBranch', id })\n return\n default:\n if (isTypeaheadKey(e)) {\n send({ type: 'typeahead', char: e.key, now: Date.now() })\n }\n }\n },\n },\n branchTrigger: {\n 'data-scope': 'tree-view',\n 'data-part': 'branch-trigger',\n 'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),\n onClick: (e) => {\n e.stopPropagation()\n send({ type: 'toggleBranch', id })\n },\n },\n checkbox: {\n role: 'checkbox',\n 'aria-checked': (s) => {\n if (isIndeterminate(get(s), id)) return 'mixed'\n return isChecked(get(s), id) ? 'true' : 'false'\n },\n 'data-scope': 'tree-view',\n 'data-part': 'checkbox',\n 'data-state': (s) => {\n if (isIndeterminate(get(s), id)) return 'indeterminate'\n return isChecked(get(s), id) ? 'checked' : 'unchecked'\n },\n },\n }),\n }\n}\n\nexport const treeView = {\n init,\n update,\n connect,\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isRenaming,\n isLoading,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tree-view.js","sourceRoot":"","sources":["../../src/components/tree-view.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 {\n typeaheadAccumulate,\n typeaheadMatch,\n isTypeaheadKey,\n TYPEAHEAD_TIMEOUT_MS,\n} from '../utils/typeahead.js'\n\n/**\n * Tree view — hierarchical list with expand/collapse. Items are identified\n * by opaque string ids; the tree structure (children relationship) is\n * provided externally. The machine tracks which branches are expanded,\n * which items are selected, and which item has keyboard focus.\n */\n\nexport type SelectionMode = 'single' | 'multiple' | 'checkbox'\n\nexport interface TreeViewState {\n /** Ids of expanded branches. */\n expanded: string[]\n /** Ids of selected items. */\n selected: string[]\n /** Ids of checked items (checkbox selection mode). */\n checked: string[]\n /** Ids known to be in the indeterminate tri-state (some-but-not-all\n * descendants checked). Consumer-computed via propagation logic or the\n * `toggleChecked` message's `descendantIds` parameter. */\n indeterminate: string[]\n /** Currently focused item id. */\n focused: string | null\n selectionMode: SelectionMode\n /** Ordered list of currently-visible item ids (updated by consumer via setVisible). */\n visibleItems: string[]\n /** Parallel array of visible-item labels for typeahead. If empty, typeahead\n * matches against ids directly. Updated alongside visibleItems via the\n * optional `labels` field on `setVisibleItems`. */\n visibleLabels: string[]\n disabled: boolean\n /** Typeahead accumulator buffer. */\n typeahead: string\n typeaheadExpiresAt: number\n /** Id of item currently being renamed, or null. */\n renaming: string | null\n /** Draft value during rename. */\n renameDraft: string\n /**\n * Ids of branches currently loading their children asynchronously. Item\n * parts expose `aria-busy` while loading so assistive tech announces\n * the in-progress state. The consumer kicks off the fetch externally\n * (in a handler that intercepts `expand`, or via an effect), dispatches\n * `loadingStart` immediately, fetches the children, then dispatches\n * `setVisibleItems` with the new tree contents followed by `loadingEnd`.\n */\n loading: string[]\n}\n\nexport type TreeViewMsg =\n /** @intent(\"Toggle the branch with the given id expanded/collapsed\") */\n | { type: 'toggleBranch'; id: string }\n /** @intent(\"Expand the branch with the given id\") */\n | { type: 'expand'; id: string }\n /** @intent(\"Collapse the branch with the given id\") */\n | { type: 'collapse'; id: string }\n /** @intent(\"Expand every branch in the provided id list\") */\n | { type: 'expandAll'; ids: string[] }\n /** @intent(\"Collapse every expanded branch\") */\n | { type: 'collapseAll' }\n /** @intent(\"Select the item with the given id (additive=true extends multi-selection)\") */\n | { type: 'select'; id: string; additive?: boolean }\n /** @intent(\"Replace the selected-id set with the provided list\") */\n | { type: 'setSelected'; ids: string[] }\n /** @humanOnly */\n | { type: 'focus'; id: string | null }\n /** @humanOnly */\n | { type: 'focusNext' }\n /** @humanOnly */\n | { type: 'focusPrev' }\n /** @humanOnly */\n | { type: 'focusFirst' }\n /** @humanOnly */\n | { type: 'focusLast' }\n /** @humanOnly */\n | { type: 'setVisibleItems'; ids: string[]; labels?: string[] }\n /** @humanOnly */\n | { type: 'typeahead'; char: string; now: number }\n /** @humanOnly */\n | { type: 'arrowLeftFrom'; id: string; isBranch: boolean; parentId: string | null }\n /** @humanOnly */\n | { type: 'arrowRightFrom'; id: string }\n /** @intent(\"Toggle the checkbox on the item with the given id (descendantIds drives recursive check)\") */\n | { type: 'toggleChecked'; id: string; descendantIds?: string[] }\n /** @intent(\"Replace the checked-id set with the provided list\") */\n | { type: 'setChecked'; ids: string[] }\n /** @humanOnly */\n | { type: 'setIndeterminate'; ids: string[] }\n /** @intent(\"Begin renaming the item with the given id (seeds the rename input with `initial`)\") */\n | { type: 'renameStart'; id: string; initial: string }\n /** @intent(\"Update the rename draft as the user types\") */\n | { type: 'renameChange'; value: string }\n /** @intent(\"Commit the in-progress rename (clears the rename state)\") */\n | { type: 'renameCommit' }\n /** @intent(\"Cancel the in-progress rename without applying changes\") */\n | { type: 'renameCancel' }\n /** @intent(\"Mark the branch with the given id as loading children (typically before an async fetch)\") */\n | { type: 'loadingStart'; id: string }\n /** @intent(\"Clear the loading state for the given branch id (after async fetch completes)\") */\n | { type: 'loadingEnd'; id: string }\n\nexport interface TreeViewInit {\n expanded?: string[]\n selected?: string[]\n checked?: string[]\n indeterminate?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n visibleItems?: string[]\n visibleLabels?: string[]\n}\n\nexport function init(opts: TreeViewInit = {}): TreeViewState {\n return {\n expanded: opts.expanded ?? [],\n selected: opts.selected ?? [],\n checked: opts.checked ?? [],\n indeterminate: opts.indeterminate ?? [],\n focused: null,\n selectionMode: opts.selectionMode ?? 'single',\n visibleItems: opts.visibleItems ?? [],\n visibleLabels: opts.visibleLabels ?? [],\n disabled: opts.disabled ?? false,\n typeahead: '',\n typeaheadExpiresAt: 0,\n renaming: null,\n renameDraft: '',\n loading: [],\n }\n}\n\nexport function update(state: TreeViewState, msg: TreeViewMsg): [TreeViewState, never[]] {\n if (state.disabled && msg.type !== 'setVisibleItems') return [state, []]\n switch (msg.type) {\n case 'toggleBranch': {\n const expanded = state.expanded.includes(msg.id)\n ? state.expanded.filter((id) => id !== msg.id)\n : [...state.expanded, msg.id]\n return [{ ...state, expanded }, []]\n }\n case 'expand':\n if (state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n case 'collapse':\n if (!state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n case 'expandAll':\n return [{ ...state, expanded: msg.ids }, []]\n case 'collapseAll':\n return [{ ...state, expanded: [] }, []]\n case 'select': {\n if (state.selectionMode === 'single') {\n return [{ ...state, selected: [msg.id] }, []]\n }\n if (msg.additive) {\n const isSelected = state.selected.includes(msg.id)\n const selected = isSelected\n ? state.selected.filter((id) => id !== msg.id)\n : [...state.selected, msg.id]\n return [{ ...state, selected }, []]\n }\n return [{ ...state, selected: [msg.id] }, []]\n }\n case 'setSelected':\n return [{ ...state, selected: msg.ids }, []]\n case 'focus':\n return [{ ...state, focused: msg.id }, []]\n case 'focusNext': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused ? state.visibleItems.indexOf(state.focused) : -1\n const next = state.visibleItems[Math.min(idx + 1, state.visibleItems.length - 1)]\n return [{ ...state, focused: next ?? state.focused }, []]\n }\n case 'focusPrev': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused\n ? state.visibleItems.indexOf(state.focused)\n : state.visibleItems.length\n const prev = state.visibleItems[Math.max(0, idx - 1)]\n return [{ ...state, focused: prev ?? state.focused }, []]\n }\n case 'focusFirst':\n return [{ ...state, focused: state.visibleItems[0] ?? null }, []]\n case 'focusLast':\n return [{ ...state, focused: state.visibleItems[state.visibleItems.length - 1] ?? null }, []]\n case 'setVisibleItems':\n return [\n { ...state, visibleItems: msg.ids, visibleLabels: msg.labels ?? state.visibleLabels },\n [],\n ]\n case 'arrowLeftFrom': {\n // If this is an expanded branch, collapse it and stay focused.\n if (msg.isBranch && state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n }\n // Otherwise, move focus to parent if provided (WAI-ARIA).\n if (msg.parentId !== null) {\n return [{ ...state, focused: msg.parentId }, []]\n }\n return [state, []]\n }\n case 'arrowRightFrom': {\n // If this branch is closed, expand it; otherwise focus the first\n // visible child (the next item in depth-first visibleItems order).\n if (!state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n }\n const idx = state.visibleItems.indexOf(msg.id)\n if (idx === -1 || idx === state.visibleItems.length - 1) return [state, []]\n const next = state.visibleItems[idx + 1]!\n return [{ ...state, focused: next }, []]\n }\n case 'typeahead': {\n if (state.visibleItems.length === 0) return [state, []]\n const acc = typeaheadAccumulate(state.typeahead, msg.char, msg.now, state.typeaheadExpiresAt)\n // Fall back to matching ids if labels weren't provided.\n const labels = state.visibleLabels.length > 0 ? state.visibleLabels : state.visibleItems\n const disabledMask = new Array<boolean>(labels.length).fill(false)\n const startIdx = state.focused ? state.visibleItems.indexOf(state.focused) : null\n const matchIdx = typeaheadMatch(labels, disabledMask, acc, startIdx)\n const focused =\n matchIdx === null ? state.focused : (state.visibleItems[matchIdx] ?? state.focused)\n return [\n { ...state, typeahead: acc, typeaheadExpiresAt: msg.now + TYPEAHEAD_TIMEOUT_MS, focused },\n [],\n ]\n }\n case 'toggleChecked': {\n // Toggle the item's checked state, propagating to descendants if any.\n // The caller passes `descendantIds` for branches; for leaves, pass\n // an empty list or omit. Indeterminate flag is cleared on the id\n // (a deliberate toggle is a definite state). The caller is\n // responsible for recomputing `indeterminate` on ancestors via\n // setIndeterminate after this message.\n const desc = msg.descendantIds ?? []\n const all = [msg.id, ...desc]\n const isChecked = state.checked.includes(msg.id)\n const next = isChecked\n ? state.checked.filter((id) => !all.includes(id))\n : Array.from(new Set([...state.checked, ...all]))\n const indeterminate = state.indeterminate.filter((id) => !all.includes(id))\n return [{ ...state, checked: next, indeterminate }, []]\n }\n case 'setChecked':\n return [{ ...state, checked: msg.ids }, []]\n case 'setIndeterminate':\n return [{ ...state, indeterminate: msg.ids }, []]\n case 'renameStart':\n return [{ ...state, renaming: msg.id, renameDraft: msg.initial }, []]\n case 'renameChange':\n return [{ ...state, renameDraft: msg.value }, []]\n case 'renameCommit':\n case 'renameCancel':\n return [{ ...state, renaming: null, renameDraft: '' }, []]\n case 'loadingStart':\n if (state.loading.includes(msg.id)) return [state, []]\n return [{ ...state, loading: [...state.loading, msg.id] }, []]\n case 'loadingEnd':\n return [{ ...state, loading: state.loading.filter((id) => id !== msg.id) }, []]\n }\n}\n\nexport function isExpanded(state: TreeViewState, id: string): boolean {\n return state.expanded.includes(id)\n}\n\nexport function isSelected(state: TreeViewState, id: string): boolean {\n return state.selected.includes(id)\n}\n\nexport function isChecked(state: TreeViewState, id: string): boolean {\n return state.checked.includes(id)\n}\n\nexport function isIndeterminate(state: TreeViewState, id: string): boolean {\n return state.indeterminate.includes(id)\n}\n\nexport function isRenaming(state: TreeViewState, id: string): boolean {\n return state.renaming === id\n}\n\nexport function isLoading(state: TreeViewState, id: string): boolean {\n return state.loading.includes(id)\n}\n\nexport interface TreeItemParts<S> {\n item: {\n role: 'treeitem'\n id: string\n 'aria-expanded': (s: S) => boolean | undefined\n 'aria-selected': (s: S) => boolean | undefined\n 'aria-level': number\n 'aria-busy': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'tree-view'\n 'data-part': 'item'\n 'data-value': string\n 'data-depth': string\n 'data-selected': (s: S) => '' | undefined\n 'data-focused': (s: S) => '' | undefined\n 'data-loading': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n /** For branch items — expand/collapse disclosure trigger. */\n branchTrigger: {\n 'data-scope': 'tree-view'\n 'data-part': 'branch-trigger'\n 'data-state': (s: S) => 'open' | 'closed'\n onClick: (e: MouseEvent) => void\n }\n /**\n * Checkbox element (only meaningful when `selectionMode === 'checkbox'`).\n * `aria-checked` is the tri-state string ('true' | 'false' | 'mixed').\n * The consumer must render a checkbox input or a visual proxy and\n * dispatch `toggleChecked` via the `onClick` binding. For branches,\n * pass the branch's descendant ids via `descendantIds` on the message\n * so children are propagated in a single reducer step.\n */\n checkbox: {\n role: 'checkbox'\n 'aria-checked': (s: S) => 'true' | 'false' | 'mixed'\n 'data-scope': 'tree-view'\n 'data-part': 'checkbox'\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n }\n}\n\nexport interface TreeViewParts<S> {\n root: {\n role: 'tree'\n 'aria-owns': (s: S) => string | undefined\n 'aria-multiselectable': (s: S) => 'true' | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'tree-view'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * If true, clicking anywhere on a branch item (not just the disclosure\n * caret) toggles its expanded state. Default: false — clicks on the row\n * select it without toggling, consistent with most file-tree UIs.\n */\n expandOnClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TreeViewState,\n send: Send<TreeViewMsg>,\n opts: ConnectOptions,\n): TreeViewParts<S> {\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n const expandOnClick = opts.expandOnClick === true\n\n return {\n root: {\n role: 'tree',\n 'aria-owns': (s) => {\n const items = get(s).visibleItems\n if (items.length === 0) return undefined\n return items.map((id) => itemId(id)).join(' ')\n },\n 'aria-multiselectable': (s) => (get(s).selectionMode === 'multiple' ? 'true' : undefined),\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'tree-view',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n item: (\n id: string,\n depth: number,\n isBranch: boolean,\n parentId: string | null = null,\n ): TreeItemParts<S> => ({\n item: {\n role: 'treeitem',\n id: itemId(id),\n 'aria-expanded': (s) => (isBranch ? isExpanded(get(s), id) : undefined),\n 'aria-selected': (s) =>\n get(s).selectionMode === 'single' ? isSelected(get(s), id) : undefined,\n 'aria-level': depth + 1,\n 'aria-busy': (s) => (isLoading(get(s), id) ? 'true' : undefined),\n tabIndex: (s) => (get(s).focused === id ? 0 : -1),\n 'data-scope': 'tree-view',\n 'data-part': 'item',\n 'data-value': id,\n 'data-depth': String(depth),\n 'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),\n 'data-focused': (s) => (get(s).focused === id ? '' : undefined),\n 'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),\n onClick: tagSend(send, ['select', 'toggleBranch'], (e) => {\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (expandOnClick && isBranch) send({ type: 'toggleBranch', id })\n }),\n onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', id })),\n onKeyDown: tagSend(\n send,\n [\n 'focusNext',\n 'focusPrev',\n 'arrowRightFrom',\n 'arrowLeftFrom',\n 'focusFirst',\n 'focusLast',\n 'select',\n 'toggleBranch',\n 'typeahead',\n ],\n (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev' })\n return\n case 'ArrowRight':\n // WAI-ARIA: closed branch → expand (stay); open branch →\n // focus first child. Leaf → nothing. The reducer decides\n // based on current expanded state.\n if (!isBranch) return\n e.preventDefault()\n send({ type: 'arrowRightFrom', id })\n return\n case 'ArrowLeft':\n // WAI-ARIA: open branch → collapse (stay); closed branch or\n // leaf → focus parent (if known). Root end-nodes → nothing.\n e.preventDefault()\n send({ type: 'arrowLeftFrom', id, isBranch, parentId })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (isBranch) send({ type: 'toggleBranch', id })\n return\n default:\n if (isTypeaheadKey(e)) {\n send({ type: 'typeahead', char: e.key, now: Date.now() })\n }\n }\n },\n ),\n },\n branchTrigger: {\n 'data-scope': 'tree-view',\n 'data-part': 'branch-trigger',\n 'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),\n onClick: tagSend(send, ['toggleBranch'], (e) => {\n e.stopPropagation()\n send({ type: 'toggleBranch', id })\n }),\n },\n checkbox: {\n role: 'checkbox',\n 'aria-checked': (s) => {\n if (isIndeterminate(get(s), id)) return 'mixed'\n return isChecked(get(s), id) ? 'true' : 'false'\n },\n 'data-scope': 'tree-view',\n 'data-part': 'checkbox',\n 'data-state': (s) => {\n if (isIndeterminate(get(s), id)) return 'indeterminate'\n return isChecked(get(s), id) ? 'checked' : 'unchecked'\n },\n },\n }),\n }\n}\n\nexport const treeView = {\n init,\n update,\n connect,\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isRenaming,\n isLoading,\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llui/components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.33",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -457,12 +457,12 @@
|
|
|
457
457
|
}
|
|
458
458
|
},
|
|
459
459
|
"peerDependencies": {
|
|
460
|
-
"@llui/dom": "^0.0.
|
|
460
|
+
"@llui/dom": "^0.0.33"
|
|
461
461
|
},
|
|
462
462
|
"devDependencies": {
|
|
463
463
|
"typescript": "^6.0.0",
|
|
464
464
|
"vitest": "^4.1.2",
|
|
465
|
-
"@llui/dom": "0.0.
|
|
465
|
+
"@llui/dom": "0.0.33"
|
|
466
466
|
},
|
|
467
467
|
"sideEffects": [
|
|
468
468
|
"./dist/styles/theme.css",
|