@llui/components 0.0.1

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.
Files changed (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/dist/components/accordion.d.ts +115 -0
  4. package/dist/components/accordion.d.ts.map +1 -0
  5. package/dist/components/accordion.js +138 -0
  6. package/dist/components/alert-dialog.d.ts +45 -0
  7. package/dist/components/alert-dialog.d.ts.map +1 -0
  8. package/dist/components/alert-dialog.js +12 -0
  9. package/dist/components/angle-slider.d.ts +121 -0
  10. package/dist/components/angle-slider.d.ts.map +1 -0
  11. package/dist/components/angle-slider.js +145 -0
  12. package/dist/components/async-list.d.ts +104 -0
  13. package/dist/components/async-list.d.ts.map +1 -0
  14. package/dist/components/async-list.js +117 -0
  15. package/dist/components/avatar.d.ts +58 -0
  16. package/dist/components/avatar.d.ts.map +1 -0
  17. package/dist/components/avatar.js +43 -0
  18. package/dist/components/carousel.d.ts +128 -0
  19. package/dist/components/carousel.d.ts.map +1 -0
  20. package/dist/components/carousel.js +131 -0
  21. package/dist/components/cascade-select.d.ts +95 -0
  22. package/dist/components/cascade-select.d.ts.map +1 -0
  23. package/dist/components/cascade-select.js +100 -0
  24. package/dist/components/checkbox.d.ts +74 -0
  25. package/dist/components/checkbox.d.ts.map +1 -0
  26. package/dist/components/checkbox.js +73 -0
  27. package/dist/components/clipboard.d.ts +72 -0
  28. package/dist/components/clipboard.d.ts.map +1 -0
  29. package/dist/components/clipboard.js +73 -0
  30. package/dist/components/collapsible.d.ts +64 -0
  31. package/dist/components/collapsible.d.ts.map +1 -0
  32. package/dist/components/collapsible.js +51 -0
  33. package/dist/components/color-picker.d.ts +125 -0
  34. package/dist/components/color-picker.d.ts.map +1 -0
  35. package/dist/components/color-picker.js +169 -0
  36. package/dist/components/combobox.d.ts +163 -0
  37. package/dist/components/combobox.d.ts.map +1 -0
  38. package/dist/components/combobox.js +345 -0
  39. package/dist/components/context-menu.d.ts +105 -0
  40. package/dist/components/context-menu.d.ts.map +1 -0
  41. package/dist/components/context-menu.js +177 -0
  42. package/dist/components/date-input.d.ts +117 -0
  43. package/dist/components/date-input.d.ts.map +1 -0
  44. package/dist/components/date-input.js +149 -0
  45. package/dist/components/date-picker.d.ts +142 -0
  46. package/dist/components/date-picker.d.ts.map +1 -0
  47. package/dist/components/date-picker.js +294 -0
  48. package/dist/components/dialog.d.ts +152 -0
  49. package/dist/components/dialog.d.ts.map +1 -0
  50. package/dist/components/dialog.js +140 -0
  51. package/dist/components/drawer.d.ts +106 -0
  52. package/dist/components/drawer.d.ts.map +1 -0
  53. package/dist/components/drawer.js +136 -0
  54. package/dist/components/editable.d.ts +92 -0
  55. package/dist/components/editable.d.ts.map +1 -0
  56. package/dist/components/editable.js +112 -0
  57. package/dist/components/file-upload.d.ts +251 -0
  58. package/dist/components/file-upload.d.ts.map +1 -0
  59. package/dist/components/file-upload.js +324 -0
  60. package/dist/components/floating-panel.d.ts +171 -0
  61. package/dist/components/floating-panel.d.ts.map +1 -0
  62. package/dist/components/floating-panel.js +198 -0
  63. package/dist/components/hover-card.d.ts +85 -0
  64. package/dist/components/hover-card.d.ts.map +1 -0
  65. package/dist/components/hover-card.js +128 -0
  66. package/dist/components/image-cropper.d.ts +129 -0
  67. package/dist/components/image-cropper.d.ts.map +1 -0
  68. package/dist/components/image-cropper.js +208 -0
  69. package/dist/components/index.d.ts +109 -0
  70. package/dist/components/index.d.ts.map +1 -0
  71. package/dist/components/index.js +54 -0
  72. package/dist/components/listbox.d.ts +98 -0
  73. package/dist/components/listbox.d.ts.map +1 -0
  74. package/dist/components/listbox.js +174 -0
  75. package/dist/components/marquee.d.ts +84 -0
  76. package/dist/components/marquee.d.ts.map +1 -0
  77. package/dist/components/marquee.js +73 -0
  78. package/dist/components/menu.d.ts +131 -0
  79. package/dist/components/menu.d.ts.map +1 -0
  80. package/dist/components/menu.js +262 -0
  81. package/dist/components/navigation-menu.d.ts +111 -0
  82. package/dist/components/navigation-menu.d.ts.map +1 -0
  83. package/dist/components/navigation-menu.js +102 -0
  84. package/dist/components/number-input.d.ts +106 -0
  85. package/dist/components/number-input.d.ts.map +1 -0
  86. package/dist/components/number-input.js +178 -0
  87. package/dist/components/pagination.d.ts +113 -0
  88. package/dist/components/pagination.d.ts.map +1 -0
  89. package/dist/components/pagination.js +135 -0
  90. package/dist/components/password-input.d.ts +64 -0
  91. package/dist/components/password-input.d.ts.map +1 -0
  92. package/dist/components/password-input.js +52 -0
  93. package/dist/components/pin-input.d.ts +89 -0
  94. package/dist/components/pin-input.d.ts.map +1 -0
  95. package/dist/components/pin-input.js +139 -0
  96. package/dist/components/popover.d.ts +116 -0
  97. package/dist/components/popover.d.ts.map +1 -0
  98. package/dist/components/popover.js +146 -0
  99. package/dist/components/presence.d.ts +71 -0
  100. package/dist/components/presence.d.ts.map +1 -0
  101. package/dist/components/presence.js +57 -0
  102. package/dist/components/progress.d.ts +74 -0
  103. package/dist/components/progress.d.ts.map +1 -0
  104. package/dist/components/progress.js +80 -0
  105. package/dist/components/qr-code.d.ts +114 -0
  106. package/dist/components/qr-code.d.ts.map +1 -0
  107. package/dist/components/qr-code.js +108 -0
  108. package/dist/components/radio-group.d.ts +89 -0
  109. package/dist/components/radio-group.d.ts.map +1 -0
  110. package/dist/components/radio-group.js +161 -0
  111. package/dist/components/rating-group.d.ts +88 -0
  112. package/dist/components/rating-group.d.ts.map +1 -0
  113. package/dist/components/rating-group.js +122 -0
  114. package/dist/components/scroll-area.d.ts +124 -0
  115. package/dist/components/scroll-area.d.ts.map +1 -0
  116. package/dist/components/scroll-area.js +152 -0
  117. package/dist/components/select.d.ts +161 -0
  118. package/dist/components/select.d.ts.map +1 -0
  119. package/dist/components/select.js +333 -0
  120. package/dist/components/signature-pad.d.ts +138 -0
  121. package/dist/components/signature-pad.d.ts.map +1 -0
  122. package/dist/components/signature-pad.js +142 -0
  123. package/dist/components/slider.d.ts +117 -0
  124. package/dist/components/slider.d.ts.map +1 -0
  125. package/dist/components/slider.js +210 -0
  126. package/dist/components/splitter.d.ts +87 -0
  127. package/dist/components/splitter.d.ts.map +1 -0
  128. package/dist/components/splitter.js +119 -0
  129. package/dist/components/steps.d.ts +104 -0
  130. package/dist/components/steps.d.ts.map +1 -0
  131. package/dist/components/steps.js +133 -0
  132. package/dist/components/switch.d.ts +66 -0
  133. package/dist/components/switch.d.ts.map +1 -0
  134. package/dist/components/switch.js +59 -0
  135. package/dist/components/tabs.d.ts +146 -0
  136. package/dist/components/tabs.d.ts.map +1 -0
  137. package/dist/components/tabs.js +244 -0
  138. package/dist/components/tags-input.d.ts +118 -0
  139. package/dist/components/tags-input.d.ts.map +1 -0
  140. package/dist/components/tags-input.js +168 -0
  141. package/dist/components/time-picker.d.ts +121 -0
  142. package/dist/components/time-picker.d.ts.map +1 -0
  143. package/dist/components/time-picker.js +147 -0
  144. package/dist/components/timer.d.ts +131 -0
  145. package/dist/components/timer.d.ts.map +1 -0
  146. package/dist/components/timer.js +117 -0
  147. package/dist/components/toast.d.ts +119 -0
  148. package/dist/components/toast.d.ts.map +1 -0
  149. package/dist/components/toast.js +102 -0
  150. package/dist/components/toc.d.ts +119 -0
  151. package/dist/components/toc.d.ts.map +1 -0
  152. package/dist/components/toc.js +107 -0
  153. package/dist/components/toggle-group.d.ts +80 -0
  154. package/dist/components/toggle-group.d.ts.map +1 -0
  155. package/dist/components/toggle-group.js +93 -0
  156. package/dist/components/toggle.d.ts +47 -0
  157. package/dist/components/toggle.d.ts.map +1 -0
  158. package/dist/components/toggle.js +41 -0
  159. package/dist/components/tooltip.d.ts +92 -0
  160. package/dist/components/tooltip.d.ts.map +1 -0
  161. package/dist/components/tooltip.js +147 -0
  162. package/dist/components/tour.d.ts +145 -0
  163. package/dist/components/tour.d.ts.map +1 -0
  164. package/dist/components/tour.js +133 -0
  165. package/dist/components/tree-view.d.ts +216 -0
  166. package/dist/components/tree-view.d.ts.map +1 -0
  167. package/dist/components/tree-view.js +293 -0
  168. package/dist/index.d.ts +3 -0
  169. package/dist/index.d.ts.map +1 -0
  170. package/dist/index.js +4 -0
  171. package/dist/patterns/confirm-dialog.d.ts +92 -0
  172. package/dist/patterns/confirm-dialog.d.ts.map +1 -0
  173. package/dist/patterns/confirm-dialog.js +92 -0
  174. package/dist/patterns/index.d.ts +3 -0
  175. package/dist/patterns/index.d.ts.map +1 -0
  176. package/dist/patterns/index.js +1 -0
  177. package/dist/utils/anatomy.d.ts +40 -0
  178. package/dist/utils/anatomy.d.ts.map +1 -0
  179. package/dist/utils/anatomy.js +41 -0
  180. package/dist/utils/aria-hidden.d.ts +12 -0
  181. package/dist/utils/aria-hidden.d.ts.map +1 -0
  182. package/dist/utils/aria-hidden.js +72 -0
  183. package/dist/utils/dismissable.d.ts +25 -0
  184. package/dist/utils/dismissable.d.ts.map +1 -0
  185. package/dist/utils/dismissable.js +65 -0
  186. package/dist/utils/dom.d.ts +8 -0
  187. package/dist/utils/dom.d.ts.map +1 -0
  188. package/dist/utils/dom.js +21 -0
  189. package/dist/utils/floating.d.ts +44 -0
  190. package/dist/utils/floating.d.ts.map +1 -0
  191. package/dist/utils/floating.js +44 -0
  192. package/dist/utils/focus-trap.d.ts +18 -0
  193. package/dist/utils/focus-trap.d.ts.map +1 -0
  194. package/dist/utils/focus-trap.js +85 -0
  195. package/dist/utils/focusables.d.ts +6 -0
  196. package/dist/utils/focusables.d.ts.map +1 -0
  197. package/dist/utils/focusables.js +65 -0
  198. package/dist/utils/index.d.ts +18 -0
  199. package/dist/utils/index.d.ts.map +1 -0
  200. package/dist/utils/index.js +10 -0
  201. package/dist/utils/interact-outside.d.ts +26 -0
  202. package/dist/utils/interact-outside.d.ts.map +1 -0
  203. package/dist/utils/interact-outside.js +46 -0
  204. package/dist/utils/remove-scroll.d.ts +8 -0
  205. package/dist/utils/remove-scroll.d.ts.map +1 -0
  206. package/dist/utils/remove-scroll.js +37 -0
  207. package/dist/utils/tree-collection.d.ts +61 -0
  208. package/dist/utils/tree-collection.d.ts.map +1 -0
  209. package/dist/utils/tree-collection.js +137 -0
  210. package/dist/utils/typeahead.d.ts +49 -0
  211. package/dist/utils/typeahead.d.ts.map +1 -0
  212. package/dist/utils/typeahead.js +81 -0
  213. package/package.json +282 -0
@@ -0,0 +1,145 @@
1
+ import type { Send } from '@llui/dom';
2
+ /**
3
+ * Tour — guided walkthrough over a sequence of steps, each targeting
4
+ * an element on the page with a pop-up explanation. The state machine
5
+ * tracks the current step index and open/closed; positioning of the
6
+ * pop-up relative to the target selector is done in the view layer
7
+ * (typically via onMount + attachFloating).
8
+ *
9
+ * Typical shape:
10
+ *
11
+ * const t = tour.connect<State>(s => s.tour, m => send({type:'tour', msg:m}))
12
+ * ...tour.overlay<State>({
13
+ * get: s => s.tour,
14
+ * send: m => send({type:'tour', msg:m}),
15
+ * parts: t,
16
+ * content: (step) => [
17
+ * h3({ ...t.title }, [text(step.title)]),
18
+ * p({ ...t.description }, [text(step.description)]),
19
+ * button({ ...t.prevTrigger }, [text('Back')]),
20
+ * button({ ...t.nextTrigger }, [text('Next')]),
21
+ * ],
22
+ * })
23
+ */
24
+ export interface TourStep {
25
+ id: string;
26
+ title: string;
27
+ description: string;
28
+ /** CSS selector or element ref for the tour target. */
29
+ target: string;
30
+ /** Placement hint for the pop-up. */
31
+ placement?: 'top' | 'bottom' | 'left' | 'right';
32
+ /** Whether to show the highlight ring around the target. */
33
+ spotlight?: boolean;
34
+ }
35
+ export interface TourState {
36
+ steps: TourStep[];
37
+ open: boolean;
38
+ index: number;
39
+ /** Ids of steps already visited. */
40
+ visited: string[];
41
+ }
42
+ export type TourMsg = {
43
+ type: 'start';
44
+ } | {
45
+ type: 'stop';
46
+ } | {
47
+ type: 'next';
48
+ } | {
49
+ type: 'prev';
50
+ } | {
51
+ type: 'goto';
52
+ index: number;
53
+ } | {
54
+ type: 'setSteps';
55
+ steps: TourStep[];
56
+ };
57
+ export interface TourInit {
58
+ steps?: TourStep[];
59
+ open?: boolean;
60
+ index?: number;
61
+ }
62
+ export declare function init(opts?: TourInit): TourState;
63
+ export declare function update(state: TourState, msg: TourMsg): [TourState, never[]];
64
+ export declare function currentStep(state: TourState): TourStep | null;
65
+ export declare function isFirst(state: TourState): boolean;
66
+ export declare function isLast(state: TourState): boolean;
67
+ export declare function progress(state: TourState): {
68
+ current: number;
69
+ total: number;
70
+ };
71
+ export interface TourParts<S> {
72
+ root: {
73
+ role: 'dialog';
74
+ 'aria-modal': 'false';
75
+ 'aria-labelledby': string;
76
+ 'aria-describedby': string;
77
+ 'data-scope': 'tour';
78
+ 'data-part': 'root';
79
+ hidden: (s: S) => boolean;
80
+ };
81
+ backdrop: {
82
+ 'data-scope': 'tour';
83
+ 'data-part': 'backdrop';
84
+ 'aria-hidden': 'true';
85
+ onClick: (e: MouseEvent) => void;
86
+ };
87
+ spotlight: {
88
+ 'data-scope': 'tour';
89
+ 'data-part': 'spotlight';
90
+ 'aria-hidden': 'true';
91
+ };
92
+ title: {
93
+ id: string;
94
+ 'data-scope': 'tour';
95
+ 'data-part': 'title';
96
+ };
97
+ description: {
98
+ id: string;
99
+ 'data-scope': 'tour';
100
+ 'data-part': 'description';
101
+ };
102
+ progressText: {
103
+ 'data-scope': 'tour';
104
+ 'data-part': 'progress-text';
105
+ };
106
+ prevTrigger: {
107
+ type: 'button';
108
+ disabled: (s: S) => boolean;
109
+ 'data-scope': 'tour';
110
+ 'data-part': 'prev-trigger';
111
+ onClick: (e: MouseEvent) => void;
112
+ };
113
+ nextTrigger: {
114
+ type: 'button';
115
+ 'data-scope': 'tour';
116
+ 'data-part': 'next-trigger';
117
+ 'data-last': (s: S) => '' | undefined;
118
+ onClick: (e: MouseEvent) => void;
119
+ };
120
+ closeTrigger: {
121
+ type: 'button';
122
+ 'aria-label': string;
123
+ 'data-scope': 'tour';
124
+ 'data-part': 'close-trigger';
125
+ onClick: (e: MouseEvent) => void;
126
+ };
127
+ }
128
+ export interface ConnectOptions {
129
+ id: string;
130
+ closeLabel?: string;
131
+ /** Whether clicking the backdrop stops the tour. Default: false — tours
132
+ * typically require an explicit dismiss. */
133
+ closeOnBackdropClick?: boolean;
134
+ }
135
+ export declare function connect<S>(get: (s: S) => TourState, send: Send<TourMsg>, opts: ConnectOptions): TourParts<S>;
136
+ export declare const tour: {
137
+ init: typeof init;
138
+ update: typeof update;
139
+ connect: typeof connect;
140
+ currentStep: typeof currentStep;
141
+ isFirst: typeof isFirst;
142
+ isLast: typeof isLast;
143
+ progress: typeof progress;
144
+ };
145
+ //# sourceMappingURL=tour.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tour.d.ts","sourceRoot":"","sources":["../../src/components/tour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ export function init(opts = {}) {
2
+ const steps = opts.steps ?? [];
3
+ const index = Math.max(0, Math.min(opts.index ?? 0, Math.max(0, steps.length - 1)));
4
+ return {
5
+ steps,
6
+ open: opts.open ?? false,
7
+ index,
8
+ visited: opts.open && steps[index] ? [steps[index].id] : [],
9
+ };
10
+ }
11
+ export function update(state, msg) {
12
+ switch (msg.type) {
13
+ case 'start': {
14
+ if (state.steps.length === 0)
15
+ return [state, []];
16
+ const first = state.steps[0];
17
+ return [{ ...state, open: true, index: 0, visited: [first.id] }, []];
18
+ }
19
+ case 'stop':
20
+ return [{ ...state, open: false }, []];
21
+ case 'next': {
22
+ const last = state.steps.length - 1;
23
+ if (state.index >= last)
24
+ return [{ ...state, open: false }, []];
25
+ const nextIdx = state.index + 1;
26
+ const nextStep = state.steps[nextIdx];
27
+ const visited = state.visited.includes(nextStep.id)
28
+ ? state.visited
29
+ : [...state.visited, nextStep.id];
30
+ return [{ ...state, index: nextIdx, visited }, []];
31
+ }
32
+ case 'prev': {
33
+ if (state.index <= 0)
34
+ return [state, []];
35
+ return [{ ...state, index: state.index - 1 }, []];
36
+ }
37
+ case 'goto': {
38
+ if (msg.index < 0 || msg.index >= state.steps.length)
39
+ return [state, []];
40
+ const step = state.steps[msg.index];
41
+ const visited = state.visited.includes(step.id) ? state.visited : [...state.visited, step.id];
42
+ return [{ ...state, open: true, index: msg.index, visited }, []];
43
+ }
44
+ case 'setSteps':
45
+ return [{ ...state, steps: msg.steps, index: 0 }, []];
46
+ }
47
+ }
48
+ export function currentStep(state) {
49
+ return state.steps[state.index] ?? null;
50
+ }
51
+ export function isFirst(state) {
52
+ return state.index === 0;
53
+ }
54
+ export function isLast(state) {
55
+ return state.index === state.steps.length - 1;
56
+ }
57
+ export function progress(state) {
58
+ return { current: state.index + 1, total: state.steps.length };
59
+ }
60
+ export function connect(get, send, opts) {
61
+ const titleId = `${opts.id}:title`;
62
+ const descId = `${opts.id}:description`;
63
+ const closeOnBackdrop = opts.closeOnBackdropClick === true;
64
+ return {
65
+ root: {
66
+ role: 'dialog',
67
+ 'aria-modal': 'false',
68
+ 'aria-labelledby': titleId,
69
+ 'aria-describedby': descId,
70
+ 'data-scope': 'tour',
71
+ 'data-part': 'root',
72
+ hidden: (s) => !get(s).open,
73
+ },
74
+ backdrop: {
75
+ 'data-scope': 'tour',
76
+ 'data-part': 'backdrop',
77
+ 'aria-hidden': 'true',
78
+ onClick: () => {
79
+ if (closeOnBackdrop)
80
+ send({ type: 'stop' });
81
+ },
82
+ },
83
+ spotlight: {
84
+ 'data-scope': 'tour',
85
+ 'data-part': 'spotlight',
86
+ 'aria-hidden': 'true',
87
+ },
88
+ title: {
89
+ id: titleId,
90
+ 'data-scope': 'tour',
91
+ 'data-part': 'title',
92
+ },
93
+ description: {
94
+ id: descId,
95
+ 'data-scope': 'tour',
96
+ 'data-part': 'description',
97
+ },
98
+ progressText: {
99
+ 'data-scope': 'tour',
100
+ 'data-part': 'progress-text',
101
+ },
102
+ prevTrigger: {
103
+ type: 'button',
104
+ disabled: (s) => isFirst(get(s)),
105
+ 'data-scope': 'tour',
106
+ 'data-part': 'prev-trigger',
107
+ onClick: () => send({ type: 'prev' }),
108
+ },
109
+ nextTrigger: {
110
+ type: 'button',
111
+ 'data-scope': 'tour',
112
+ 'data-part': 'next-trigger',
113
+ 'data-last': (s) => (isLast(get(s)) ? '' : undefined),
114
+ onClick: () => send({ type: 'next' }),
115
+ },
116
+ closeTrigger: {
117
+ type: 'button',
118
+ 'aria-label': opts.closeLabel ?? 'Close tour',
119
+ 'data-scope': 'tour',
120
+ 'data-part': 'close-trigger',
121
+ onClick: () => send({ type: 'stop' }),
122
+ },
123
+ };
124
+ }
125
+ export const tour = {
126
+ init,
127
+ update,
128
+ connect,
129
+ currentStep,
130
+ isFirst,
131
+ isLast,
132
+ progress,
133
+ };
@@ -0,0 +1,216 @@
1
+ import type { Send } from '@llui/dom';
2
+ /**
3
+ * Tree view — hierarchical list with expand/collapse. Items are identified
4
+ * by opaque string ids; the tree structure (children relationship) is
5
+ * provided externally. The machine tracks which branches are expanded,
6
+ * which items are selected, and which item has keyboard focus.
7
+ */
8
+ export type SelectionMode = 'single' | 'multiple' | 'checkbox';
9
+ export interface TreeViewState {
10
+ /** Ids of expanded branches. */
11
+ expanded: string[];
12
+ /** Ids of selected items. */
13
+ selected: string[];
14
+ /** Ids of checked items (checkbox selection mode). */
15
+ checked: string[];
16
+ /** Ids known to be in the indeterminate tri-state (some-but-not-all
17
+ * descendants checked). Consumer-computed via propagation logic or the
18
+ * `toggleChecked` message's `descendantIds` parameter. */
19
+ indeterminate: string[];
20
+ /** Currently focused item id. */
21
+ focused: string | null;
22
+ selectionMode: SelectionMode;
23
+ /** Ordered list of currently-visible item ids (updated by consumer via setVisible). */
24
+ visibleItems: string[];
25
+ /** Parallel array of visible-item labels for typeahead. If empty, typeahead
26
+ * matches against ids directly. Updated alongside visibleItems via the
27
+ * optional `labels` field on `setVisibleItems`. */
28
+ visibleLabels: string[];
29
+ disabled: boolean;
30
+ /** Typeahead accumulator buffer. */
31
+ typeahead: string;
32
+ typeaheadExpiresAt: number;
33
+ /** Id of item currently being renamed, or null. */
34
+ renaming: string | null;
35
+ /** Draft value during rename. */
36
+ renameDraft: string;
37
+ /**
38
+ * Ids of branches currently loading their children asynchronously. Item
39
+ * parts expose `aria-busy` while loading so assistive tech announces
40
+ * the in-progress state. The consumer kicks off the fetch externally
41
+ * (in a handler that intercepts `expand`, or via an effect), dispatches
42
+ * `loadingStart` immediately, fetches the children, then dispatches
43
+ * `setVisibleItems` with the new tree contents followed by `loadingEnd`.
44
+ */
45
+ loading: string[];
46
+ }
47
+ export type TreeViewMsg = {
48
+ type: 'toggleBranch';
49
+ id: string;
50
+ } | {
51
+ type: 'expand';
52
+ id: string;
53
+ } | {
54
+ type: 'collapse';
55
+ id: string;
56
+ } | {
57
+ type: 'expandAll';
58
+ ids: string[];
59
+ } | {
60
+ type: 'collapseAll';
61
+ } | {
62
+ type: 'select';
63
+ id: string;
64
+ additive?: boolean;
65
+ } | {
66
+ type: 'setSelected';
67
+ ids: string[];
68
+ } | {
69
+ type: 'focus';
70
+ id: string | null;
71
+ } | {
72
+ type: 'focusNext';
73
+ } | {
74
+ type: 'focusPrev';
75
+ } | {
76
+ type: 'focusFirst';
77
+ } | {
78
+ type: 'focusLast';
79
+ } | {
80
+ type: 'setVisibleItems';
81
+ ids: string[];
82
+ labels?: string[];
83
+ } | {
84
+ type: 'typeahead';
85
+ char: string;
86
+ now: number;
87
+ } | {
88
+ type: 'arrowLeftFrom';
89
+ id: string;
90
+ isBranch: boolean;
91
+ parentId: string | null;
92
+ } | {
93
+ type: 'arrowRightFrom';
94
+ id: string;
95
+ } | {
96
+ type: 'toggleChecked';
97
+ id: string;
98
+ descendantIds?: string[];
99
+ } | {
100
+ type: 'setChecked';
101
+ ids: string[];
102
+ } | {
103
+ type: 'setIndeterminate';
104
+ ids: string[];
105
+ } | {
106
+ type: 'renameStart';
107
+ id: string;
108
+ initial: string;
109
+ } | {
110
+ type: 'renameChange';
111
+ value: string;
112
+ } | {
113
+ type: 'renameCommit';
114
+ } | {
115
+ type: 'renameCancel';
116
+ } | {
117
+ type: 'loadingStart';
118
+ id: string;
119
+ } | {
120
+ type: 'loadingEnd';
121
+ id: string;
122
+ };
123
+ export interface TreeViewInit {
124
+ expanded?: string[];
125
+ selected?: string[];
126
+ checked?: string[];
127
+ indeterminate?: string[];
128
+ selectionMode?: SelectionMode;
129
+ disabled?: boolean;
130
+ visibleItems?: string[];
131
+ visibleLabels?: string[];
132
+ }
133
+ export declare function init(opts?: TreeViewInit): TreeViewState;
134
+ export declare function update(state: TreeViewState, msg: TreeViewMsg): [TreeViewState, never[]];
135
+ export declare function isExpanded(state: TreeViewState, id: string): boolean;
136
+ export declare function isSelected(state: TreeViewState, id: string): boolean;
137
+ export declare function isChecked(state: TreeViewState, id: string): boolean;
138
+ export declare function isIndeterminate(state: TreeViewState, id: string): boolean;
139
+ export declare function isRenaming(state: TreeViewState, id: string): boolean;
140
+ export declare function isLoading(state: TreeViewState, id: string): boolean;
141
+ export interface TreeItemParts<S> {
142
+ item: {
143
+ role: 'treeitem';
144
+ id: string;
145
+ 'aria-expanded': (s: S) => boolean | undefined;
146
+ 'aria-selected': (s: S) => boolean | undefined;
147
+ 'aria-level': number;
148
+ 'aria-busy': (s: S) => 'true' | undefined;
149
+ tabIndex: (s: S) => number;
150
+ 'data-scope': 'tree-view';
151
+ 'data-part': 'item';
152
+ 'data-value': string;
153
+ 'data-depth': string;
154
+ 'data-selected': (s: S) => '' | undefined;
155
+ 'data-focused': (s: S) => '' | undefined;
156
+ 'data-loading': (s: S) => '' | undefined;
157
+ onClick: (e: MouseEvent) => void;
158
+ onKeyDown: (e: KeyboardEvent) => void;
159
+ onFocus: (e: FocusEvent) => void;
160
+ };
161
+ /** For branch items — expand/collapse disclosure trigger. */
162
+ branchTrigger: {
163
+ 'data-scope': 'tree-view';
164
+ 'data-part': 'branch-trigger';
165
+ 'data-state': (s: S) => 'open' | 'closed';
166
+ onClick: (e: MouseEvent) => void;
167
+ };
168
+ /**
169
+ * Checkbox element (only meaningful when `selectionMode === 'checkbox'`).
170
+ * `aria-checked` is the tri-state string ('true' | 'false' | 'mixed').
171
+ * The consumer must render a checkbox input or a visual proxy and
172
+ * dispatch `toggleChecked` via the `onClick` binding. For branches,
173
+ * pass the branch's descendant ids via `descendantIds` on the message
174
+ * so children are propagated in a single reducer step.
175
+ */
176
+ checkbox: {
177
+ role: 'checkbox';
178
+ 'aria-checked': (s: S) => 'true' | 'false' | 'mixed';
179
+ 'data-scope': 'tree-view';
180
+ 'data-part': 'checkbox';
181
+ 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate';
182
+ };
183
+ }
184
+ export interface TreeViewParts<S> {
185
+ root: {
186
+ role: 'tree';
187
+ 'aria-multiselectable': (s: S) => 'true' | undefined;
188
+ 'aria-disabled': (s: S) => 'true' | undefined;
189
+ 'data-scope': 'tree-view';
190
+ 'data-part': 'root';
191
+ 'data-disabled': (s: S) => '' | undefined;
192
+ };
193
+ item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts<S>;
194
+ }
195
+ export interface ConnectOptions {
196
+ id: string;
197
+ /**
198
+ * If true, clicking anywhere on a branch item (not just the disclosure
199
+ * caret) toggles its expanded state. Default: false — clicks on the row
200
+ * select it without toggling, consistent with most file-tree UIs.
201
+ */
202
+ expandOnClick?: boolean;
203
+ }
204
+ export declare function connect<S>(get: (s: S) => TreeViewState, send: Send<TreeViewMsg>, opts: ConnectOptions): TreeViewParts<S>;
205
+ export declare const treeView: {
206
+ init: typeof init;
207
+ update: typeof update;
208
+ connect: typeof connect;
209
+ isExpanded: typeof isExpanded;
210
+ isSelected: typeof isSelected;
211
+ isChecked: typeof isChecked;
212
+ isIndeterminate: typeof isIndeterminate;
213
+ isRenaming: typeof isRenaming;
214
+ isLoading: typeof isLoading;
215
+ };
216
+ //# sourceMappingURL=tree-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"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"}