@llui/components 0.4.10 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/components/accordion.d.ts +13 -13
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +9 -9
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/alert-dialog.d.ts +8 -8
  6. package/dist/components/alert-dialog.d.ts.map +1 -1
  7. package/dist/components/alert-dialog.js +2 -2
  8. package/dist/components/alert-dialog.js.map +1 -1
  9. package/dist/components/angle-slider.d.ts +13 -13
  10. package/dist/components/angle-slider.d.ts.map +1 -1
  11. package/dist/components/angle-slider.js +11 -11
  12. package/dist/components/angle-slider.js.map +1 -1
  13. package/dist/components/async-list.d.ts +7 -7
  14. package/dist/components/async-list.d.ts.map +1 -1
  15. package/dist/components/async-list.js +5 -8
  16. package/dist/components/async-list.js.map +1 -1
  17. package/dist/components/avatar.d.ts +9 -9
  18. package/dist/components/avatar.d.ts.map +1 -1
  19. package/dist/components/avatar.js +7 -7
  20. package/dist/components/avatar.js.map +1 -1
  21. package/dist/components/carousel.d.ts +18 -18
  22. package/dist/components/carousel.d.ts.map +1 -1
  23. package/dist/components/carousel.js +12 -12
  24. package/dist/components/carousel.js.map +1 -1
  25. package/dist/components/cascade-select.d.ts +12 -12
  26. package/dist/components/cascade-select.d.ts.map +1 -1
  27. package/dist/components/cascade-select.js +8 -8
  28. package/dist/components/cascade-select.js.map +1 -1
  29. package/dist/components/checkbox.d.ts +14 -14
  30. package/dist/components/checkbox.d.ts.map +1 -1
  31. package/dist/components/checkbox.js +12 -12
  32. package/dist/components/checkbox.js.map +1 -1
  33. package/dist/components/clipboard.d.ts +8 -8
  34. package/dist/components/clipboard.d.ts.map +1 -1
  35. package/dist/components/clipboard.js +6 -6
  36. package/dist/components/clipboard.js.map +1 -1
  37. package/dist/components/collapsible.d.ts +11 -11
  38. package/dist/components/collapsible.d.ts.map +1 -1
  39. package/dist/components/collapsible.js +9 -9
  40. package/dist/components/collapsible.js.map +1 -1
  41. package/dist/components/color-picker.d.ts +19 -19
  42. package/dist/components/color-picker.d.ts.map +1 -1
  43. package/dist/components/color-picker.js +21 -21
  44. package/dist/components/color-picker.js.map +1 -1
  45. package/dist/components/combobox.d.ts +25 -25
  46. package/dist/components/combobox.d.ts.map +1 -1
  47. package/dist/components/combobox.js +54 -59
  48. package/dist/components/combobox.js.map +1 -1
  49. package/dist/components/context-menu.d.ts +14 -14
  50. package/dist/components/context-menu.d.ts.map +1 -1
  51. package/dist/components/context-menu.js +15 -19
  52. package/dist/components/context-menu.js.map +1 -1
  53. package/dist/components/date-input.d.ts +13 -13
  54. package/dist/components/date-input.d.ts.map +1 -1
  55. package/dist/components/date-input.js +11 -11
  56. package/dist/components/date-input.js.map +1 -1
  57. package/dist/components/date-picker.d.ts +11 -11
  58. package/dist/components/date-picker.d.ts.map +1 -1
  59. package/dist/components/date-picker.js +7 -7
  60. package/dist/components/date-picker.js.map +1 -1
  61. package/dist/components/dialog.d.ts +15 -15
  62. package/dist/components/dialog.d.ts.map +1 -1
  63. package/dist/components/dialog.js +45 -50
  64. package/dist/components/dialog.js.map +1 -1
  65. package/dist/components/drawer.d.ts +13 -13
  66. package/dist/components/drawer.d.ts.map +1 -1
  67. package/dist/components/drawer.js +44 -49
  68. package/dist/components/drawer.js.map +1 -1
  69. package/dist/components/editable.d.ts +11 -11
  70. package/dist/components/editable.d.ts.map +1 -1
  71. package/dist/components/editable.js +9 -9
  72. package/dist/components/editable.js.map +1 -1
  73. package/dist/components/file-upload.d.ts +19 -19
  74. package/dist/components/file-upload.d.ts.map +1 -1
  75. package/dist/components/file-upload.js +14 -14
  76. package/dist/components/file-upload.js.map +1 -1
  77. package/dist/components/floating-panel.d.ts +14 -14
  78. package/dist/components/floating-panel.d.ts.map +1 -1
  79. package/dist/components/floating-panel.js +13 -14
  80. package/dist/components/floating-panel.js.map +1 -1
  81. package/dist/components/form.d.ts +9 -9
  82. package/dist/components/form.d.ts.map +1 -1
  83. package/dist/components/form.js +7 -7
  84. package/dist/components/form.js.map +1 -1
  85. package/dist/components/hover-card.d.ts +9 -9
  86. package/dist/components/hover-card.d.ts.map +1 -1
  87. package/dist/components/hover-card.js +12 -13
  88. package/dist/components/hover-card.js.map +1 -1
  89. package/dist/components/image-cropper.d.ts +8 -8
  90. package/dist/components/image-cropper.d.ts.map +1 -1
  91. package/dist/components/image-cropper.js +7 -8
  92. package/dist/components/image-cropper.js.map +1 -1
  93. package/dist/components/in-view.d.ts +6 -6
  94. package/dist/components/in-view.d.ts.map +1 -1
  95. package/dist/components/in-view.js +2 -2
  96. package/dist/components/in-view.js.map +1 -1
  97. package/dist/components/listbox.d.ts +16 -16
  98. package/dist/components/listbox.d.ts.map +1 -1
  99. package/dist/components/listbox.js +16 -16
  100. package/dist/components/listbox.js.map +1 -1
  101. package/dist/components/marquee.d.ts +8 -8
  102. package/dist/components/marquee.d.ts.map +1 -1
  103. package/dist/components/marquee.js +8 -11
  104. package/dist/components/marquee.js.map +1 -1
  105. package/dist/components/menu.d.ts +15 -15
  106. package/dist/components/menu.d.ts.map +1 -1
  107. package/dist/components/menu.js +16 -17
  108. package/dist/components/menu.js.map +1 -1
  109. package/dist/components/navigation-menu.d.ts +12 -12
  110. package/dist/components/navigation-menu.d.ts.map +1 -1
  111. package/dist/components/navigation-menu.js +8 -8
  112. package/dist/components/navigation-menu.js.map +1 -1
  113. package/dist/components/number-input.d.ts +18 -18
  114. package/dist/components/number-input.d.ts.map +1 -1
  115. package/dist/components/number-input.js +16 -20
  116. package/dist/components/number-input.js.map +1 -1
  117. package/dist/components/pagination.d.ts +13 -13
  118. package/dist/components/pagination.d.ts.map +1 -1
  119. package/dist/components/pagination.js +11 -17
  120. package/dist/components/pagination.js.map +1 -1
  121. package/dist/components/password-input.d.ts +11 -11
  122. package/dist/components/password-input.d.ts.map +1 -1
  123. package/dist/components/password-input.js +11 -11
  124. package/dist/components/password-input.js.map +1 -1
  125. package/dist/components/pin-input.d.ts +9 -9
  126. package/dist/components/pin-input.d.ts.map +1 -1
  127. package/dist/components/pin-input.js +9 -9
  128. package/dist/components/pin-input.js.map +1 -1
  129. package/dist/components/popover.d.ts +11 -11
  130. package/dist/components/popover.d.ts.map +1 -1
  131. package/dist/components/popover.js +61 -60
  132. package/dist/components/popover.js.map +1 -1
  133. package/dist/components/presence.d.ts +7 -5
  134. package/dist/components/presence.d.ts.map +1 -1
  135. package/dist/components/presence.js +5 -3
  136. package/dist/components/presence.js.map +1 -1
  137. package/dist/components/progress.d.ts +14 -14
  138. package/dist/components/progress.d.ts.map +1 -1
  139. package/dist/components/progress.js +12 -12
  140. package/dist/components/progress.js.map +1 -1
  141. package/dist/components/qr-code.d.ts +7 -7
  142. package/dist/components/qr-code.d.ts.map +1 -1
  143. package/dist/components/qr-code.js +7 -7
  144. package/dist/components/qr-code.js.map +1 -1
  145. package/dist/components/radio-group.d.ts +15 -15
  146. package/dist/components/radio-group.d.ts.map +1 -1
  147. package/dist/components/radio-group.js +12 -13
  148. package/dist/components/radio-group.js.map +1 -1
  149. package/dist/components/rating-group.d.ts +13 -13
  150. package/dist/components/rating-group.d.ts.map +1 -1
  151. package/dist/components/rating-group.js +10 -11
  152. package/dist/components/rating-group.js.map +1 -1
  153. package/dist/components/scroll-area.d.ts +10 -10
  154. package/dist/components/scroll-area.d.ts.map +1 -1
  155. package/dist/components/scroll-area.js +10 -15
  156. package/dist/components/scroll-area.js.map +1 -1
  157. package/dist/components/select.d.ts +26 -26
  158. package/dist/components/select.d.ts.map +1 -1
  159. package/dist/components/select.js +29 -33
  160. package/dist/components/select.js.map +1 -1
  161. package/dist/components/signature-pad.d.ts +12 -12
  162. package/dist/components/signature-pad.d.ts.map +1 -1
  163. package/dist/components/signature-pad.js +10 -10
  164. package/dist/components/signature-pad.js.map +1 -1
  165. package/dist/components/slider.d.ts +22 -22
  166. package/dist/components/slider.d.ts.map +1 -1
  167. package/dist/components/slider.js +17 -17
  168. package/dist/components/slider.js.map +1 -1
  169. package/dist/components/sortable.d.ts +11 -11
  170. package/dist/components/sortable.d.ts.map +1 -1
  171. package/dist/components/sortable.js +20 -20
  172. package/dist/components/sortable.js.map +1 -1
  173. package/dist/components/splitter.d.ts +15 -15
  174. package/dist/components/splitter.d.ts.map +1 -1
  175. package/dist/components/splitter.js +15 -15
  176. package/dist/components/splitter.js.map +1 -1
  177. package/dist/components/steps.d.ts +14 -14
  178. package/dist/components/steps.d.ts.map +1 -1
  179. package/dist/components/steps.js +10 -16
  180. package/dist/components/steps.js.map +1 -1
  181. package/dist/components/switch.d.ts +12 -12
  182. package/dist/components/switch.d.ts.map +1 -1
  183. package/dist/components/switch.js +10 -10
  184. package/dist/components/switch.js.map +1 -1
  185. package/dist/components/tabs.d.ts +15 -15
  186. package/dist/components/tabs.d.ts.map +1 -1
  187. package/dist/components/tabs.js +11 -11
  188. package/dist/components/tabs.js.map +1 -1
  189. package/dist/components/tags-input.d.ts +14 -14
  190. package/dist/components/tags-input.d.ts.map +1 -1
  191. package/dist/components/tags-input.js +10 -10
  192. package/dist/components/tags-input.js.map +1 -1
  193. package/dist/components/theme-switch.d.ts +5 -5
  194. package/dist/components/theme-switch.d.ts.map +1 -1
  195. package/dist/components/theme-switch.js +3 -3
  196. package/dist/components/theme-switch.js.map +1 -1
  197. package/dist/components/time-picker.d.ts +19 -19
  198. package/dist/components/time-picker.d.ts.map +1 -1
  199. package/dist/components/time-picker.js +17 -17
  200. package/dist/components/time-picker.js.map +1 -1
  201. package/dist/components/timer.d.ts +10 -10
  202. package/dist/components/timer.d.ts.map +1 -1
  203. package/dist/components/timer.js +8 -8
  204. package/dist/components/timer.js.map +1 -1
  205. package/dist/components/toast.d.ts +8 -8
  206. package/dist/components/toast.d.ts.map +1 -1
  207. package/dist/components/toast.js +4 -4
  208. package/dist/components/toast.js.map +1 -1
  209. package/dist/components/toc.d.ts +12 -12
  210. package/dist/components/toc.d.ts.map +1 -1
  211. package/dist/components/toc.js +8 -8
  212. package/dist/components/toc.js.map +1 -1
  213. package/dist/components/toggle-group.d.ts +13 -13
  214. package/dist/components/toggle-group.d.ts.map +1 -1
  215. package/dist/components/toggle-group.js +9 -9
  216. package/dist/components/toggle-group.js.map +1 -1
  217. package/dist/components/toggle.d.ts +8 -8
  218. package/dist/components/toggle.d.ts.map +1 -1
  219. package/dist/components/toggle.js +6 -6
  220. package/dist/components/toggle.js.map +1 -1
  221. package/dist/components/tooltip.d.ts +10 -10
  222. package/dist/components/tooltip.d.ts.map +1 -1
  223. package/dist/components/tooltip.js +13 -14
  224. package/dist/components/tooltip.js.map +1 -1
  225. package/dist/components/tour.d.ts +7 -7
  226. package/dist/components/tour.d.ts.map +1 -1
  227. package/dist/components/tour.js +5 -5
  228. package/dist/components/tour.js.map +1 -1
  229. package/dist/components/tree-view.d.ts +19 -19
  230. package/dist/components/tree-view.d.ts.map +1 -1
  231. package/dist/components/tree-view.js +23 -23
  232. package/dist/components/tree-view.js.map +1 -1
  233. package/dist/patterns/confirm-dialog.d.ts +4 -4
  234. package/dist/patterns/confirm-dialog.d.ts.map +1 -1
  235. package/dist/patterns/confirm-dialog.js +7 -9
  236. package/dist/patterns/confirm-dialog.js.map +1 -1
  237. package/package.json +3 -3
  238. package/dist/components/enter-view.d.ts +0 -73
  239. package/dist/components/enter-view.d.ts.map +0 -1
  240. package/dist/components/enter-view.js +0 -51
  241. package/dist/utils/validators.d.ts +0 -34
  242. package/dist/utils/validators.d.ts.map +0 -1
  243. package/dist/utils/validators.js +0 -83
@@ -1 +1 @@
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"]}
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, Signal } 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 {\n item: {\n role: 'treeitem'\n id: string\n 'aria-expanded': Signal<boolean | undefined>\n 'aria-selected': Signal<boolean | undefined>\n 'aria-level': number\n 'aria-busy': Signal<'true' | undefined>\n tabIndex: Signal<number>\n 'data-scope': 'tree-view'\n 'data-part': 'item'\n 'data-value': string\n 'data-depth': string\n 'data-selected': Signal<'' | undefined>\n 'data-focused': Signal<'' | undefined>\n 'data-loading': Signal<'' | 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': Signal<'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': Signal<'true' | 'false' | 'mixed'>\n 'data-scope': 'tree-view'\n 'data-part': 'checkbox'\n 'data-state': Signal<'checked' | 'unchecked' | 'indeterminate'>\n }\n}\n\nexport interface TreeViewParts {\n root: {\n role: 'tree'\n 'aria-owns': Signal<string | undefined>\n 'aria-multiselectable': Signal<'true' | undefined>\n 'aria-disabled': Signal<'true' | undefined>\n 'data-scope': 'tree-view'\n 'data-part': 'root'\n 'data-disabled': Signal<'' | undefined>\n }\n item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts\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(\n state: Signal<TreeViewState>,\n send: Send<TreeViewMsg>,\n opts: ConnectOptions,\n): TreeViewParts {\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': state.map((s) => {\n const items = s.visibleItems\n if (items.length === 0) return undefined\n return items.map((id) => itemId(id)).join(' ')\n }),\n 'aria-multiselectable': state.map((s) =>\n s.selectionMode === 'multiple' ? 'true' : undefined,\n ),\n 'aria-disabled': state.map((s) => (s.disabled ? 'true' : undefined)),\n 'data-scope': 'tree-view',\n 'data-part': 'root',\n 'data-disabled': state.map((s) => (s.disabled ? '' : undefined)),\n },\n item: (\n id: string,\n depth: number,\n isBranch: boolean,\n parentId: string | null = null,\n ): TreeItemParts => ({\n item: {\n role: 'treeitem',\n id: itemId(id),\n 'aria-expanded': state.map((s) => (isBranch ? isExpanded(s, id) : undefined)),\n 'aria-selected': state.map((s) =>\n s.selectionMode === 'single' ? isSelected(s, id) : undefined,\n ),\n 'aria-level': depth + 1,\n 'aria-busy': state.map((s) => (isLoading(s, id) ? 'true' : undefined)),\n tabIndex: state.map((s) => (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': state.map((s) => (isSelected(s, id) ? '' : undefined)),\n 'data-focused': state.map((s) => (s.focused === id ? '' : undefined)),\n 'data-loading': state.map((s) => (isLoading(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': state.map((s) => (isExpanded(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': state.map((s) => {\n if (isIndeterminate(s, id)) return 'mixed'\n return isChecked(s, id) ? 'true' : 'false'\n }),\n 'data-scope': 'tree-view',\n 'data-part': 'checkbox',\n 'data-state': state.map((s) => {\n if (isIndeterminate(s, id)) return 'indeterminate'\n return isChecked(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,4 +1,4 @@
1
- import type { Send, TransitionOptions } from '@llui/dom';
1
+ import type { Send, Signal, TransitionOptions } from '@llui/dom';
2
2
  import { init as dialogInit, update as dialogUpdate } from '../components/dialog.js';
3
3
  /**
4
4
  * ConfirmDialog — a pre-wired dialog pattern for confirmations.
@@ -63,8 +63,8 @@ export declare function update(state: ConfirmDialogState, msg: ConfirmDialogMsg)
63
63
  * the dialog is open, renders default content (title/description/buttons).
64
64
  * Uses role="alertdialog" for destructive confirms.
65
65
  */
66
- export interface ConfirmDialogViewOptions<S> {
67
- get: (s: S) => ConfirmDialogState;
66
+ export interface ConfirmDialogViewOptions {
67
+ state: Signal<ConfirmDialogState>;
68
68
  send: Send<ConfirmDialogMsg>;
69
69
  id: string;
70
70
  transition?: TransitionOptions;
@@ -73,7 +73,7 @@ export interface ConfirmDialogViewOptions<S> {
73
73
  /** Custom class for destructive confirm button. */
74
74
  destructiveClass?: string;
75
75
  }
76
- export declare function view<S>(opts: ConfirmDialogViewOptions<S>): Node[];
76
+ export declare function view(opts: ConfirmDialogViewOptions): Node;
77
77
  /** Helper to create an openWith message builder. */
78
78
  export declare function openWith(tag: string, opts: {
79
79
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/patterns/confirm-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAExD,OAAO,EACL,IAAI,IAAI,UAAU,EAClB,MAAM,IAAI,YAAY,EAIvB,MAAM,yBAAyB,CAAA;AAEhC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,GACD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,CAUrE;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,gBAAgB,GACpB,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAuB/B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAkB,CAAA;IACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAkDjE;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,GACA,gBAAgB,CAUlB;AAED,eAAO,MAAM,aAAa;;;;;CAAmC,CAAA;AAG7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/patterns/confirm-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,EACL,IAAI,IAAI,UAAU,EAClB,MAAM,IAAI,YAAY,EAIvB,MAAM,yBAAyB,CAAA;AAEhC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,GACD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,CAUrE;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,gBAAgB,GACpB,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAuB/B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAA;IACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAiDzD;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,GACA,gBAAgB,CAUlB;AAED,eAAO,MAAM,aAAa;;;;;CAAmC,CAAA;AAG7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAA"}
@@ -39,11 +39,11 @@ export function view(opts) {
39
39
  // Build dialog parts — role='alertdialog' for proper modal semantics.
40
40
  // Trigger + closeTrigger parts are unused (we provide our own buttons);
41
41
  // their send is a no-op.
42
- const parts = dialogConnect((s) => ({ open: opts.get(s).open }), () => {
42
+ const parts = dialogConnect(opts.state.map((s) => ({ open: s.open })), () => {
43
43
  /* unused — our buttons dispatch directly via opts.send */
44
44
  }, { id: opts.id, role: 'alertdialog', closeLabel: 'Cancel' });
45
45
  return dialogOverlay({
46
- get: (s) => ({ open: opts.get(s).open }),
46
+ state: opts.state.map((s) => ({ open: s.open })),
47
47
  // Dismissable (Esc/outside-click) dispatches dialog.close, which we
48
48
  // translate into confirm-dialog.cancel.
49
49
  send: (m) => {
@@ -53,21 +53,19 @@ export function view(opts) {
53
53
  parts,
54
54
  content: () => [
55
55
  div({ ...parts.content, class: opts.contentClass ?? 'confirm-dialog' }, [
56
- h2({ ...parts.title }, [text((s) => opts.get(s).title)]),
57
- p({ ...parts.description }, [text((s) => opts.get(s).description)]),
56
+ h2({ ...parts.title }, [text(opts.state.map((s) => s.title))]),
57
+ p({ ...parts.description }, [text(opts.state.map((s) => s.description))]),
58
58
  div({ class: 'confirm-dialog__actions' }, [
59
59
  button({
60
60
  type: 'button',
61
61
  class: 'btn btn-secondary',
62
62
  onClick: () => opts.send({ type: 'cancel' }),
63
- }, [text((s) => opts.get(s).cancelLabel)]),
63
+ }, [text(opts.state.map((s) => s.cancelLabel))]),
64
64
  button({
65
65
  type: 'button',
66
- class: (s) => opts.get(s).destructive
67
- ? (opts.destructiveClass ?? 'btn btn-danger')
68
- : 'btn btn-primary',
66
+ class: opts.state.map((s) => s.destructive ? (opts.destructiveClass ?? 'btn btn-danger') : 'btn btn-primary'),
69
67
  onClick: () => opts.send({ type: 'confirm' }),
70
- }, [text((s) => opts.get(s).confirmLabel)]),
68
+ }, [text(opts.state.map((s) => s.confirmLabel))]),
71
69
  ]),
72
70
  ]),
73
71
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/patterns/confirm-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { button, text, div, h2, p } from '@llui/dom'\nimport {\n init as dialogInit,\n update as dialogUpdate,\n connect as dialogConnect,\n overlay as dialogOverlay,\n type DialogParts,\n} from '../components/dialog.js'\n\n/**\n * ConfirmDialog — a pre-wired dialog pattern for confirmations.\n *\n * Composes `dialog` with conventional content: title, description, cancel,\n * confirm. Carries an opaque `tag` so the consumer's update handler can\n * recognize which confirmation resolved.\n *\n * Usage in consumer's update:\n *\n * ```ts\n * case 'confirm': {\n * const [s, fx] = confirmDialog.update(state.confirm, msg.msg)\n * // When the user clicks confirm, branch on the tag:\n * if (msg.msg.type === 'confirm') {\n * switch (state.confirm.tag) {\n * case 'delete-user': return [{ ...state, confirm: s, users: ... }, fx]\n * case 'logout': return [{ ...state, confirm: s }, [...fx, logoutEffect]]\n * }\n * }\n * return [{ ...state, confirm: s }, fx]\n * }\n * ```\n */\n\nexport interface ConfirmDialogState {\n open: boolean\n tag: string\n title: string\n description: string\n confirmLabel: string\n cancelLabel: string\n destructive: boolean\n}\n\nexport type ConfirmDialogMsg =\n | {\n type: 'openWith'\n tag: string\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n }\n | { type: 'confirm' }\n | { type: 'cancel' }\n | { type: 'setOpen'; open: boolean }\n\nexport interface ConfirmDialogInit {\n tag?: string\n title?: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n}\n\nexport function init(opts: ConfirmDialogInit = {}): ConfirmDialogState {\n return {\n open: false,\n tag: opts.tag ?? '',\n title: opts.title ?? '',\n description: opts.description ?? '',\n confirmLabel: opts.confirmLabel ?? 'Confirm',\n cancelLabel: opts.cancelLabel ?? 'Cancel',\n destructive: opts.destructive ?? false,\n }\n}\n\nexport function update(\n state: ConfirmDialogState,\n msg: ConfirmDialogMsg,\n): [ConfirmDialogState, never[]] {\n switch (msg.type) {\n case 'openWith':\n return [\n {\n ...state,\n open: true,\n tag: msg.tag,\n title: msg.title,\n description: msg.description ?? '',\n confirmLabel: msg.confirmLabel ?? state.confirmLabel,\n cancelLabel: msg.cancelLabel ?? state.cancelLabel,\n destructive: msg.destructive ?? false,\n },\n [],\n ]\n case 'confirm':\n return [{ ...state, open: false }, []]\n case 'cancel':\n return [{ ...state, open: false }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\n/**\n * View the ConfirmDialog. Returns a `show`-wrapped tree that appears when\n * the dialog is open, renders default content (title/description/buttons).\n * Uses role=\"alertdialog\" for destructive confirms.\n */\nexport interface ConfirmDialogViewOptions<S> {\n get: (s: S) => ConfirmDialogState\n send: Send<ConfirmDialogMsg>\n id: string\n transition?: TransitionOptions\n /** Custom class for content root. */\n contentClass?: string\n /** Custom class for destructive confirm button. */\n destructiveClass?: string\n}\n\nexport function view<S>(opts: ConfirmDialogViewOptions<S>): Node[] {\n // Build dialog parts — role='alertdialog' for proper modal semantics.\n // Trigger + closeTrigger parts are unused (we provide our own buttons);\n // their send is a no-op.\n const parts: DialogParts<S> = dialogConnect<S>(\n (s) => ({ open: opts.get(s).open }),\n () => {\n /* unused — our buttons dispatch directly via opts.send */\n },\n { id: opts.id, role: 'alertdialog', closeLabel: 'Cancel' },\n )\n\n return dialogOverlay<S>({\n get: (s) => ({ open: opts.get(s).open }),\n // Dismissable (Esc/outside-click) dispatches dialog.close, which we\n // translate into confirm-dialog.cancel.\n send: (m) => {\n if (m.type === 'close') opts.send({ type: 'cancel' })\n },\n parts,\n content: () => [\n div({ ...parts.content, class: opts.contentClass ?? 'confirm-dialog' }, [\n h2({ ...parts.title }, [text((s: S) => opts.get(s).title)]),\n p({ ...parts.description }, [text((s: S) => opts.get(s).description)]),\n div({ class: 'confirm-dialog__actions' }, [\n button(\n {\n type: 'button',\n class: 'btn btn-secondary',\n onClick: () => opts.send({ type: 'cancel' }),\n },\n [text((s: S) => opts.get(s).cancelLabel)],\n ),\n button(\n {\n type: 'button',\n class: (s: S) =>\n opts.get(s).destructive\n ? (opts.destructiveClass ?? 'btn btn-danger')\n : 'btn btn-primary',\n onClick: () => opts.send({ type: 'confirm' }),\n },\n [text((s: S) => opts.get(s).confirmLabel)],\n ),\n ]),\n ]),\n ],\n transition: opts.transition,\n closeOnOutsideClick: false, // alertdialog default\n })\n}\n\n/** Helper to create an openWith message builder. */\nexport function openWith(\n tag: string,\n opts: {\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n },\n): ConfirmDialogMsg {\n return {\n type: 'openWith',\n tag,\n title: opts.title,\n description: opts.description,\n confirmLabel: opts.confirmLabel,\n cancelLabel: opts.cancelLabel,\n destructive: opts.destructive,\n }\n}\n\nexport const confirmDialog = { init, update, view, openWith }\n\n// Re-exported dialog primitives (available for advanced use cases)\nexport { dialogInit, dialogUpdate }\n"]}
1
+ {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/patterns/confirm-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, Signal, TransitionOptions } from '@llui/dom'\nimport { button, text, div, h2, p } from '@llui/dom'\nimport {\n init as dialogInit,\n update as dialogUpdate,\n connect as dialogConnect,\n overlay as dialogOverlay,\n type DialogParts,\n} from '../components/dialog.js'\n\n/**\n * ConfirmDialog — a pre-wired dialog pattern for confirmations.\n *\n * Composes `dialog` with conventional content: title, description, cancel,\n * confirm. Carries an opaque `tag` so the consumer's update handler can\n * recognize which confirmation resolved.\n *\n * Usage in consumer's update:\n *\n * ```ts\n * case 'confirm': {\n * const [s, fx] = confirmDialog.update(state.confirm, msg.msg)\n * // When the user clicks confirm, branch on the tag:\n * if (msg.msg.type === 'confirm') {\n * switch (state.confirm.tag) {\n * case 'delete-user': return [{ ...state, confirm: s, users: ... }, fx]\n * case 'logout': return [{ ...state, confirm: s }, [...fx, logoutEffect]]\n * }\n * }\n * return [{ ...state, confirm: s }, fx]\n * }\n * ```\n */\n\nexport interface ConfirmDialogState {\n open: boolean\n tag: string\n title: string\n description: string\n confirmLabel: string\n cancelLabel: string\n destructive: boolean\n}\n\nexport type ConfirmDialogMsg =\n | {\n type: 'openWith'\n tag: string\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n }\n | { type: 'confirm' }\n | { type: 'cancel' }\n | { type: 'setOpen'; open: boolean }\n\nexport interface ConfirmDialogInit {\n tag?: string\n title?: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n}\n\nexport function init(opts: ConfirmDialogInit = {}): ConfirmDialogState {\n return {\n open: false,\n tag: opts.tag ?? '',\n title: opts.title ?? '',\n description: opts.description ?? '',\n confirmLabel: opts.confirmLabel ?? 'Confirm',\n cancelLabel: opts.cancelLabel ?? 'Cancel',\n destructive: opts.destructive ?? false,\n }\n}\n\nexport function update(\n state: ConfirmDialogState,\n msg: ConfirmDialogMsg,\n): [ConfirmDialogState, never[]] {\n switch (msg.type) {\n case 'openWith':\n return [\n {\n ...state,\n open: true,\n tag: msg.tag,\n title: msg.title,\n description: msg.description ?? '',\n confirmLabel: msg.confirmLabel ?? state.confirmLabel,\n cancelLabel: msg.cancelLabel ?? state.cancelLabel,\n destructive: msg.destructive ?? false,\n },\n [],\n ]\n case 'confirm':\n return [{ ...state, open: false }, []]\n case 'cancel':\n return [{ ...state, open: false }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\n/**\n * View the ConfirmDialog. Returns a `show`-wrapped tree that appears when\n * the dialog is open, renders default content (title/description/buttons).\n * Uses role=\"alertdialog\" for destructive confirms.\n */\nexport interface ConfirmDialogViewOptions {\n state: Signal<ConfirmDialogState>\n send: Send<ConfirmDialogMsg>\n id: string\n transition?: TransitionOptions\n /** Custom class for content root. */\n contentClass?: string\n /** Custom class for destructive confirm button. */\n destructiveClass?: string\n}\n\nexport function view(opts: ConfirmDialogViewOptions): Node {\n // Build dialog parts — role='alertdialog' for proper modal semantics.\n // Trigger + closeTrigger parts are unused (we provide our own buttons);\n // their send is a no-op.\n const parts: DialogParts = dialogConnect(\n opts.state.map((s) => ({ open: s.open })),\n () => {\n /* unused — our buttons dispatch directly via opts.send */\n },\n { id: opts.id, role: 'alertdialog', closeLabel: 'Cancel' },\n )\n\n return dialogOverlay({\n state: opts.state.map((s) => ({ open: s.open })),\n // Dismissable (Esc/outside-click) dispatches dialog.close, which we\n // translate into confirm-dialog.cancel.\n send: (m) => {\n if (m.type === 'close') opts.send({ type: 'cancel' })\n },\n parts,\n content: () => [\n div({ ...parts.content, class: opts.contentClass ?? 'confirm-dialog' }, [\n h2({ ...parts.title }, [text(opts.state.map((s) => s.title))]),\n p({ ...parts.description }, [text(opts.state.map((s) => s.description))]),\n div({ class: 'confirm-dialog__actions' }, [\n button(\n {\n type: 'button',\n class: 'btn btn-secondary',\n onClick: () => opts.send({ type: 'cancel' }),\n },\n [text(opts.state.map((s) => s.cancelLabel))],\n ),\n button(\n {\n type: 'button',\n class: opts.state.map((s) =>\n s.destructive ? (opts.destructiveClass ?? 'btn btn-danger') : 'btn btn-primary',\n ),\n onClick: () => opts.send({ type: 'confirm' }),\n },\n [text(opts.state.map((s) => s.confirmLabel))],\n ),\n ]),\n ]),\n ],\n transition: opts.transition,\n closeOnOutsideClick: false, // alertdialog default\n })\n}\n\n/** Helper to create an openWith message builder. */\nexport function openWith(\n tag: string,\n opts: {\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n },\n): ConfirmDialogMsg {\n return {\n type: 'openWith',\n tag,\n title: opts.title,\n description: opts.description,\n confirmLabel: opts.confirmLabel,\n cancelLabel: opts.cancelLabel,\n destructive: opts.destructive,\n }\n}\n\nexport const confirmDialog = { init, update, view, openWith }\n\n// Re-exported dialog primitives (available for advanced use cases)\nexport { dialogInit, dialogUpdate }\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llui/components",
3
- "version": "0.4.10",
3
+ "version": "0.5.0",
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.4.10"
460
+ "@llui/dom": "^0.5.0"
461
461
  },
462
462
  "devDependencies": {
463
463
  "typescript": "^6.0.0",
464
464
  "vitest": "^4.1.2",
465
- "@llui/dom": "0.4.10"
465
+ "@llui/dom": "0.5.0"
466
466
  },
467
467
  "sideEffects": [
468
468
  "./dist/styles/theme.css",
@@ -1,73 +0,0 @@
1
- import type { Send } from '@llui/dom';
2
- /**
3
- * Enter View — tracks whether an element is visible in the viewport
4
- * using IntersectionObserver.
5
- *
6
- * State machine: `{ visible: false }` → enter → `{ visible: true }` → leave → …
7
- *
8
- * With `once: true`, the observer disconnects after the first enter,
9
- * keeping `visible: true` permanently. Useful for lazy-load and
10
- * scroll-triggered animations.
11
- *
12
- * ```ts
13
- * const parts = enterView.connect<State>(s => s.ev, sendEv, {
14
- * id: 'hero',
15
- * threshold: 0.5,
16
- * once: true,
17
- * })
18
- *
19
- * view: () => [
20
- * div({ ...parts.root, class: (s) => s.ev.visible ? 'fade-in' : '' }, [
21
- * // content that animates on scroll
22
- * ]),
23
- * ]
24
- * ```
25
- *
26
- * Wire up the observer in `onMount`:
27
- * ```ts
28
- * onMount((el) => enterView.createObserver(el, sendEv, { threshold: 0.5, once: true }))
29
- * ```
30
- */
31
- export interface EnterViewState {
32
- visible: boolean;
33
- }
34
- export type EnterViewMsg = {
35
- type: 'enter';
36
- } | {
37
- type: 'leave';
38
- };
39
- export declare function init(): EnterViewState;
40
- export declare function update(state: EnterViewState, msg: EnterViewMsg): [EnterViewState, never[]];
41
- export interface EnterViewParts<S> {
42
- root: {
43
- 'data-scope': 'enter-view';
44
- 'data-part': 'root';
45
- 'data-state': (s: S) => 'visible' | 'hidden';
46
- };
47
- }
48
- export interface ConnectOptions {
49
- id: string;
50
- }
51
- export declare function connect<S>(get: (s: S) => EnterViewState, _send: Send<EnterViewMsg>, _opts: ConnectOptions): EnterViewParts<S>;
52
- export interface ObserverOptions {
53
- threshold?: number;
54
- rootMargin?: string;
55
- once?: boolean;
56
- }
57
- /**
58
- * Create an IntersectionObserver for the given element. Returns a cleanup
59
- * function that disconnects the observer.
60
- *
61
- * Call this inside `onMount`:
62
- * ```ts
63
- * onMount((el) => enterView.createObserver(el, send, { once: true }))
64
- * ```
65
- */
66
- export declare function createObserver(el: Element, send: Send<EnterViewMsg>, opts?: ObserverOptions): () => void;
67
- export declare const enterView: {
68
- init: typeof init;
69
- update: typeof update;
70
- connect: typeof connect;
71
- createObserver: typeof createObserver;
72
- };
73
- //# sourceMappingURL=enter-view.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enter-view.d.ts","sourceRoot":"","sources":["../../src/components/enter-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEhE,wBAAgB,IAAI,IAAI,cAAc,CAErC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAO1F;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,YAAY,CAAA;QAC1B,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,GAAG,QAAQ,CAAA;KAC7C,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;CACX;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,EAC7B,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EACzB,KAAK,EAAE,cAAc,GACpB,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EACxB,IAAI,GAAE,eAAoB,GACzB,MAAM,IAAI,CAuBZ;AAED,eAAO,MAAM,SAAS;;;;;CAA4C,CAAA"}
@@ -1,51 +0,0 @@
1
- export function init() {
2
- return { visible: false };
3
- }
4
- export function update(state, msg) {
5
- switch (msg.type) {
6
- case 'enter':
7
- return state.visible ? [state, []] : [{ visible: true }, []];
8
- case 'leave':
9
- return state.visible ? [{ visible: false }, []] : [state, []];
10
- }
11
- }
12
- export function connect(get, _send, _opts) {
13
- return {
14
- root: {
15
- 'data-scope': 'enter-view',
16
- 'data-part': 'root',
17
- 'data-state': (s) => (get(s).visible ? 'visible' : 'hidden'),
18
- },
19
- };
20
- }
21
- /**
22
- * Create an IntersectionObserver for the given element. Returns a cleanup
23
- * function that disconnects the observer.
24
- *
25
- * Call this inside `onMount`:
26
- * ```ts
27
- * onMount((el) => enterView.createObserver(el, send, { once: true }))
28
- * ```
29
- */
30
- export function createObserver(el, send, opts = {}) {
31
- const observer = new IntersectionObserver((entries) => {
32
- for (const entry of entries) {
33
- if (entry.isIntersecting) {
34
- send({ type: 'enter' });
35
- if (opts.once) {
36
- observer.disconnect();
37
- return;
38
- }
39
- }
40
- else {
41
- send({ type: 'leave' });
42
- }
43
- }
44
- }, {
45
- threshold: opts.threshold ?? 0,
46
- rootMargin: opts.rootMargin ?? '0px',
47
- });
48
- observer.observe(el);
49
- return () => observer.disconnect();
50
- }
51
- export const enterView = { init, update, connect, createObserver };
@@ -1,34 +0,0 @@
1
- /**
2
- * Composable validators returning `string | null` (null = valid).
3
- *
4
- * Use `compose(v1, v2, ...)` to run until first failure (short-circuit),
5
- * or `validateAll(v1, v2, ...)` to collect all errors as `string[]`.
6
- *
7
- * ```ts
8
- * const username = compose(required(), minLength(3), pattern(/^[a-z]+$/i))
9
- * username('') // 'Required'
10
- * username('ab') // 'Must be at least 3 characters'
11
- * username('foo') // null
12
- * ```
13
- */
14
- export type Validator<T> = (value: T) => string | null;
15
- export declare function required(message?: string): Validator<unknown>;
16
- export declare function minLength(n: number, message?: string): Validator<string>;
17
- export declare function maxLength(n: number, message?: string): Validator<string>;
18
- export declare function pattern(regex: RegExp, message?: string): Validator<string>;
19
- export declare function email(message?: string): Validator<string>;
20
- export declare function url(message?: string): Validator<string>;
21
- export declare function min(n: number, message?: string): Validator<number>;
22
- export declare function max(n: number, message?: string): Validator<number>;
23
- export declare function integer(message?: string): Validator<number>;
24
- export declare function positive(message?: string): Validator<number>;
25
- /**
26
- * Run validators in order, returning the first error (or null if all pass).
27
- */
28
- export declare function compose<T>(...validators: Validator<T>[]): Validator<T>;
29
- /**
30
- * Run every validator and collect all errors. Returns empty array when valid.
31
- * Use when you want to display multiple errors at once (e.g. password rules).
32
- */
33
- export declare function validateAll<T>(...validators: Validator<T>[]): (value: T) => string[];
34
- //# sourceMappingURL=validators.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAA;AAStD,wBAAgB,QAAQ,CAAC,OAAO,SAAa,GAAG,SAAS,CAAC,OAAO,CAAC,CAEjE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAGxE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAGxE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAmB,GAAG,SAAS,CAAC,MAAM,CAAC,CAEpF;AAKD,wBAAgB,KAAK,CAAC,OAAO,SAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,CAElE;AAED,wBAAgB,GAAG,CAAC,OAAO,SAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAU9D;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAGlE;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAGlE;AAED,wBAAgB,OAAO,CAAC,OAAO,SAAuB,GAAG,SAAS,CAAC,MAAM,CAAC,CAEzE;AAED,wBAAgB,QAAQ,CAAC,OAAO,SAAqB,GAAG,SAAS,CAAC,MAAM,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAQtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CASpF"}
@@ -1,83 +0,0 @@
1
- function isEmpty(v) {
2
- if (v === null || v === undefined)
3
- return true;
4
- if (typeof v === 'string' && v.length === 0)
5
- return true;
6
- if (Array.isArray(v) && v.length === 0)
7
- return true;
8
- return false;
9
- }
10
- export function required(message = 'Required') {
11
- return (value) => (isEmpty(value) ? message : null);
12
- }
13
- export function minLength(n, message) {
14
- const msg = message ?? `Must be at least ${n} characters`;
15
- return (value) => (value.length < n ? msg : null);
16
- }
17
- export function maxLength(n, message) {
18
- const msg = message ?? `Must be at most ${n} characters`;
19
- return (value) => (value.length > n ? msg : null);
20
- }
21
- export function pattern(regex, message = 'Invalid format') {
22
- return (value) => (regex.test(value) ? null : message);
23
- }
24
- // RFC 5322 simplified — accepts most valid emails, rejects obvious garbage
25
- const EMAIL_RE = /^[^\s@]+@[^\s@.]+(\.[^\s@.]+)+$/;
26
- export function email(message = 'Invalid email') {
27
- return (value) => (EMAIL_RE.test(value) ? null : message);
28
- }
29
- export function url(message = 'Invalid URL') {
30
- return (value) => {
31
- try {
32
- const u = new URL(value);
33
- if (u.protocol !== 'http:' && u.protocol !== 'https:')
34
- return message;
35
- return null;
36
- }
37
- catch {
38
- return message;
39
- }
40
- };
41
- }
42
- export function min(n, message) {
43
- const msg = message ?? `Must be at least ${n}`;
44
- return (value) => (value < n ? msg : null);
45
- }
46
- export function max(n, message) {
47
- const msg = message ?? `Must be at most ${n}`;
48
- return (value) => (value > n ? msg : null);
49
- }
50
- export function integer(message = 'Must be an integer') {
51
- return (value) => (Number.isInteger(value) ? null : message);
52
- }
53
- export function positive(message = 'Must be positive') {
54
- return (value) => (value > 0 ? null : message);
55
- }
56
- /**
57
- * Run validators in order, returning the first error (or null if all pass).
58
- */
59
- export function compose(...validators) {
60
- return (value) => {
61
- for (const v of validators) {
62
- const err = v(value);
63
- if (err !== null)
64
- return err;
65
- }
66
- return null;
67
- };
68
- }
69
- /**
70
- * Run every validator and collect all errors. Returns empty array when valid.
71
- * Use when you want to display multiple errors at once (e.g. password rules).
72
- */
73
- export function validateAll(...validators) {
74
- return (value) => {
75
- const errors = [];
76
- for (const v of validators) {
77
- const err = v(value);
78
- if (err !== null)
79
- errors.push(err);
80
- }
81
- return errors;
82
- };
83
- }