@llui/components 0.0.30 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/dist/components/accordion.d.ts +27 -9
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +4 -3
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/angle-slider.d.ts +15 -5
  6. package/dist/components/angle-slider.d.ts.map +1 -1
  7. package/dist/components/angle-slider.js +3 -2
  8. package/dist/components/angle-slider.js.map +1 -1
  9. package/dist/components/async-list.d.ts +18 -6
  10. package/dist/components/async-list.d.ts.map +1 -1
  11. package/dist/components/async-list.js +3 -2
  12. package/dist/components/async-list.js.map +1 -1
  13. package/dist/components/avatar.d.ts +12 -4
  14. package/dist/components/avatar.d.ts.map +1 -1
  15. package/dist/components/avatar.js +4 -3
  16. package/dist/components/avatar.js.map +1 -1
  17. package/dist/components/carousel.d.ts +21 -7
  18. package/dist/components/carousel.d.ts.map +1 -1
  19. package/dist/components/carousel.js +8 -8
  20. package/dist/components/carousel.js.map +1 -1
  21. package/dist/components/cascade-select.d.ts +9 -3
  22. package/dist/components/cascade-select.d.ts.map +1 -1
  23. package/dist/components/cascade-select.js +4 -4
  24. package/dist/components/cascade-select.js.map +1 -1
  25. package/dist/components/checkbox.d.ts +9 -3
  26. package/dist/components/checkbox.d.ts.map +1 -1
  27. package/dist/components/checkbox.js +4 -3
  28. package/dist/components/checkbox.js.map +1 -1
  29. package/dist/components/clipboard.d.ts +12 -4
  30. package/dist/components/clipboard.d.ts.map +1 -1
  31. package/dist/components/clipboard.js +3 -3
  32. package/dist/components/clipboard.js.map +1 -1
  33. package/dist/components/collapsible.d.ts +12 -4
  34. package/dist/components/collapsible.d.ts.map +1 -1
  35. package/dist/components/collapsible.js +2 -1
  36. package/dist/components/collapsible.js.map +1 -1
  37. package/dist/components/color-picker.d.ts +18 -6
  38. package/dist/components/color-picker.d.ts.map +1 -1
  39. package/dist/components/color-picker.js +5 -5
  40. package/dist/components/color-picker.js.map +1 -1
  41. package/dist/components/combobox.d.ts +39 -13
  42. package/dist/components/combobox.d.ts.map +1 -1
  43. package/dist/components/combobox.js +17 -9
  44. package/dist/components/combobox.js.map +1 -1
  45. package/dist/components/context-menu.d.ts +24 -8
  46. package/dist/components/context-menu.d.ts.map +1 -1
  47. package/dist/components/context-menu.js +8 -8
  48. package/dist/components/context-menu.js.map +1 -1
  49. package/dist/components/date-input.d.ts +21 -6
  50. package/dist/components/date-input.d.ts.map +1 -1
  51. package/dist/components/date-input.js +4 -4
  52. package/dist/components/date-input.js.map +1 -1
  53. package/dist/components/date-picker.d.ts +36 -12
  54. package/dist/components/date-picker.d.ts.map +1 -1
  55. package/dist/components/date-picker.js +15 -8
  56. package/dist/components/date-picker.js.map +1 -1
  57. package/dist/components/dialog.d.ts +12 -4
  58. package/dist/components/dialog.d.ts.map +1 -1
  59. package/dist/components/dialog.js +3 -3
  60. package/dist/components/dialog.js.map +1 -1
  61. package/dist/components/drawer.d.ts +12 -4
  62. package/dist/components/drawer.d.ts.map +1 -1
  63. package/dist/components/drawer.js +3 -3
  64. package/dist/components/drawer.js.map +1 -1
  65. package/dist/components/editable.d.ts +15 -5
  66. package/dist/components/editable.d.ts.map +1 -1
  67. package/dist/components/editable.js +14 -13
  68. package/dist/components/editable.js.map +1 -1
  69. package/dist/components/file-upload.d.ts +30 -10
  70. package/dist/components/file-upload.d.ts.map +1 -1
  71. package/dist/components/file-upload.js +10 -10
  72. package/dist/components/file-upload.js.map +1 -1
  73. package/dist/components/floating-panel.d.ts +48 -16
  74. package/dist/components/floating-panel.d.ts.map +1 -1
  75. package/dist/components/floating-panel.js +6 -6
  76. package/dist/components/floating-panel.js.map +1 -1
  77. package/dist/components/form.d.ts +18 -6
  78. package/dist/components/form.d.ts.map +1 -1
  79. package/dist/components/form.js +2 -1
  80. package/dist/components/form.js.map +1 -1
  81. package/dist/components/image-cropper.d.ts +33 -11
  82. package/dist/components/image-cropper.d.ts.map +1 -1
  83. package/dist/components/image-cropper.js +6 -6
  84. package/dist/components/image-cropper.js.map +1 -1
  85. package/dist/components/listbox.d.ts +33 -11
  86. package/dist/components/listbox.d.ts.map +1 -1
  87. package/dist/components/listbox.js +12 -4
  88. package/dist/components/listbox.js.map +1 -1
  89. package/dist/components/marquee.d.ts +21 -7
  90. package/dist/components/marquee.d.ts.map +1 -1
  91. package/dist/components/marquee.js +3 -2
  92. package/dist/components/marquee.js.map +1 -1
  93. package/dist/components/menu.d.ts +36 -12
  94. package/dist/components/menu.d.ts.map +1 -1
  95. package/dist/components/menu.js +23 -9
  96. package/dist/components/menu.js.map +1 -1
  97. package/dist/components/navigation-menu.d.ts +15 -5
  98. package/dist/components/navigation-menu.d.ts.map +1 -1
  99. package/dist/components/navigation-menu.js +8 -8
  100. package/dist/components/navigation-menu.js.map +1 -1
  101. package/dist/components/number-input.d.ts +24 -8
  102. package/dist/components/number-input.d.ts.map +1 -1
  103. package/dist/components/number-input.js +8 -8
  104. package/dist/components/number-input.js.map +1 -1
  105. package/dist/components/pagination.d.ts +21 -7
  106. package/dist/components/pagination.d.ts.map +1 -1
  107. package/dist/components/pagination.js +4 -4
  108. package/dist/components/pagination.js.map +1 -1
  109. package/dist/components/password-input.d.ts +9 -3
  110. package/dist/components/password-input.d.ts.map +1 -1
  111. package/dist/components/password-input.js +3 -3
  112. package/dist/components/password-input.js.map +1 -1
  113. package/dist/components/pin-input.d.ts +15 -5
  114. package/dist/components/pin-input.d.ts.map +1 -1
  115. package/dist/components/pin-input.js +8 -7
  116. package/dist/components/pin-input.js.map +1 -1
  117. package/dist/components/popover.d.ts +12 -4
  118. package/dist/components/popover.d.ts.map +1 -1
  119. package/dist/components/popover.js +3 -3
  120. package/dist/components/popover.js.map +1 -1
  121. package/dist/components/presence.d.ts +15 -5
  122. package/dist/components/presence.d.ts.map +1 -1
  123. package/dist/components/presence.js.map +1 -1
  124. package/dist/components/progress.d.ts +6 -2
  125. package/dist/components/progress.d.ts.map +1 -1
  126. package/dist/components/progress.js.map +1 -1
  127. package/dist/components/qr-code.d.ts +9 -3
  128. package/dist/components/qr-code.d.ts.map +1 -1
  129. package/dist/components/qr-code.js.map +1 -1
  130. package/dist/components/radio-group.d.ts +18 -6
  131. package/dist/components/radio-group.d.ts.map +1 -1
  132. package/dist/components/radio-group.js +4 -3
  133. package/dist/components/radio-group.js.map +1 -1
  134. package/dist/components/rating-group.d.ts +21 -7
  135. package/dist/components/rating-group.d.ts.map +1 -1
  136. package/dist/components/rating-group.js +8 -7
  137. package/dist/components/rating-group.js.map +1 -1
  138. package/dist/components/scroll-area.d.ts +9 -3
  139. package/dist/components/scroll-area.d.ts.map +1 -1
  140. package/dist/components/scroll-area.js +5 -4
  141. package/dist/components/scroll-area.js.map +1 -1
  142. package/dist/components/select.d.ts +42 -14
  143. package/dist/components/select.d.ts.map +1 -1
  144. package/dist/components/select.js +4 -4
  145. package/dist/components/select.js.map +1 -1
  146. package/dist/components/signature-pad.d.ts +24 -8
  147. package/dist/components/signature-pad.d.ts.map +1 -1
  148. package/dist/components/signature-pad.js +3 -3
  149. package/dist/components/signature-pad.js.map +1 -1
  150. package/dist/components/slider.d.ts +21 -7
  151. package/dist/components/slider.d.ts.map +1 -1
  152. package/dist/components/slider.js.map +1 -1
  153. package/dist/components/sortable.d.ts +18 -6
  154. package/dist/components/sortable.d.ts.map +1 -1
  155. package/dist/components/sortable.js +11 -10
  156. package/dist/components/sortable.js.map +1 -1
  157. package/dist/components/splitter.d.ts +21 -7
  158. package/dist/components/splitter.d.ts.map +1 -1
  159. package/dist/components/splitter.js +5 -4
  160. package/dist/components/splitter.js.map +1 -1
  161. package/dist/components/steps.d.ts +21 -7
  162. package/dist/components/steps.d.ts.map +1 -1
  163. package/dist/components/steps.js +4 -4
  164. package/dist/components/steps.js.map +1 -1
  165. package/dist/components/switch.d.ts +9 -3
  166. package/dist/components/switch.d.ts.map +1 -1
  167. package/dist/components/switch.js +4 -3
  168. package/dist/components/switch.js.map +1 -1
  169. package/dist/components/tabs.d.ts +24 -8
  170. package/dist/components/tabs.d.ts.map +1 -1
  171. package/dist/components/tabs.js +7 -6
  172. package/dist/components/tabs.js.map +1 -1
  173. package/dist/components/tags-input.d.ts +27 -9
  174. package/dist/components/tags-input.d.ts.map +1 -1
  175. package/dist/components/tags-input.js +10 -10
  176. package/dist/components/tags-input.js.map +1 -1
  177. package/dist/components/theme-switch.d.ts.map +1 -1
  178. package/dist/components/theme-switch.js +3 -2
  179. package/dist/components/theme-switch.js.map +1 -1
  180. package/dist/components/time-picker.d.ts +27 -9
  181. package/dist/components/time-picker.d.ts.map +1 -1
  182. package/dist/components/time-picker.js +10 -10
  183. package/dist/components/time-picker.js.map +1 -1
  184. package/dist/components/timer.d.ts +15 -5
  185. package/dist/components/timer.d.ts.map +1 -1
  186. package/dist/components/timer.js +4 -4
  187. package/dist/components/timer.js.map +1 -1
  188. package/dist/components/toast.d.ts +24 -8
  189. package/dist/components/toast.d.ts.map +1 -1
  190. package/dist/components/toast.js +6 -6
  191. package/dist/components/toast.js.map +1 -1
  192. package/dist/components/toc.d.ts +15 -5
  193. package/dist/components/toc.d.ts.map +1 -1
  194. package/dist/components/toc.js +2 -2
  195. package/dist/components/toc.js.map +1 -1
  196. package/dist/components/toggle-group.d.ts +15 -5
  197. package/dist/components/toggle-group.d.ts.map +1 -1
  198. package/dist/components/toggle-group.js +4 -3
  199. package/dist/components/toggle-group.js.map +1 -1
  200. package/dist/components/toggle.d.ts +9 -3
  201. package/dist/components/toggle.d.ts.map +1 -1
  202. package/dist/components/toggle.js +4 -3
  203. package/dist/components/toggle.js.map +1 -1
  204. package/dist/components/tooltip.d.ts +12 -4
  205. package/dist/components/tooltip.d.ts.map +1 -1
  206. package/dist/components/tooltip.js +3 -3
  207. package/dist/components/tooltip.js.map +1 -1
  208. package/dist/components/tour.d.ts +18 -6
  209. package/dist/components/tour.d.ts.map +1 -1
  210. package/dist/components/tour.js +6 -6
  211. package/dist/components/tour.js.map +1 -1
  212. package/dist/components/tree-view.d.ts +75 -25
  213. package/dist/components/tree-view.d.ts.map +1 -1
  214. package/dist/components/tree-view.js +18 -7
  215. package/dist/components/tree-view.js.map +1 -1
  216. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- import { useContext } from '@llui/dom';
1
+ import { useContext, tagSend } from '@llui/dom';
2
2
  import { LocaleContext } from '../locale.js';
3
3
  export function init(opts = {}) {
4
4
  const steps = opts.steps ?? [];
@@ -78,10 +78,10 @@ export function connect(get, send, opts) {
78
78
  'data-scope': 'tour',
79
79
  'data-part': 'backdrop',
80
80
  'aria-hidden': 'true',
81
- onClick: () => {
81
+ onClick: tagSend(send, ['stop'], () => {
82
82
  if (closeOnBackdrop)
83
83
  send({ type: 'stop' });
84
- },
84
+ }),
85
85
  },
86
86
  spotlight: {
87
87
  'data-scope': 'tour',
@@ -107,21 +107,21 @@ export function connect(get, send, opts) {
107
107
  disabled: (s) => isFirst(get(s)),
108
108
  'data-scope': 'tour',
109
109
  'data-part': 'prev-trigger',
110
- onClick: () => send({ type: 'prev' }),
110
+ onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),
111
111
  },
112
112
  nextTrigger: {
113
113
  type: 'button',
114
114
  'data-scope': 'tour',
115
115
  'data-part': 'next-trigger',
116
116
  'data-last': (s) => (isLast(get(s)) ? '' : undefined),
117
- onClick: () => send({ type: 'next' }),
117
+ onClick: tagSend(send, ['next'], () => send({ type: 'next' })),
118
118
  },
119
119
  closeTrigger: {
120
120
  type: 'button',
121
121
  'aria-label': opts.closeLabel ?? ((s) => locale(s).tour.close),
122
122
  'data-scope': 'tour',
123
123
  'data-part': 'close-trigger',
124
- onClick: () => send({ type: 'stop' }),
124
+ onClick: tagSend(send, ['stop'], () => send({ type: 'stop' })),
125
125
  },
126
126
  };
127
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tour.js","sourceRoot":"","sources":["../../src/components/tour.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AA4D5C,MAAM,UAAU,IAAI,CAAC,OAAiB,EAAE;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnF,OAAO;QACL,KAAK;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;KAC5D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAgB,EAAE,GAAY;IACnD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;YAC7B,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACtE,CAAC;QACD,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;YACnC,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI;gBAAE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;YAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAA;YAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAE,CAAA;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;YACnC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;gBAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACxC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAE,CAAA;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;YAC7F,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,KAAK,UAAU;YACb,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,OAAO,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;AAChE,CAAC;AAoED,MAAM,UAAU,OAAO,CACrB,GAAwB,EACxB,IAAmB,EACnB,IAAoB;IAEpB,MAAM,MAAM,GAAG,UAAU,CAAY,aAAa,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,QAAQ,CAAA;IAClC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,cAAc,CAAA;IACvC,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAA;IAE1D,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,OAAO;YAC1B,kBAAkB,EAAE,MAAM;YAC1B,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;SAC5B;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,eAAe;oBAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;YAC7C,CAAC;SACF;QACD,SAAS,EAAE;YACT,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,MAAM;SACtB;QACD,KAAK,EAAE;YACL,EAAE,EAAE,OAAO;YACX,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,OAAO;SACrB;QACD,WAAW,EAAE;YACX,EAAE,EAAE,MAAM;YACV,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,aAAa;SAC3B;QACD,YAAY,EAAE;YACZ,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,eAAe;SAC7B;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtC;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,cAAc;YAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtC;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACjE,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,IAAI;IACJ,MAAM;IACN,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,QAAQ;CACT,CAAA","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Tour — guided walkthrough over a sequence of steps, each targeting\n * an element on the page with a pop-up explanation. The state machine\n * tracks the current step index and open/closed; positioning of the\n * pop-up relative to the target selector is done in the view layer\n * (typically via onMount + attachFloating).\n *\n * Typical shape:\n *\n * const t = tour.connect<State>(s => s.tour, m => send({type:'tour', msg:m}))\n * ...tour.overlay<State>({\n * get: s => s.tour,\n * send: m => send({type:'tour', msg:m}),\n * parts: t,\n * content: (step) => [\n * h3({ ...t.title }, [text(step.title)]),\n * p({ ...t.description }, [text(step.description)]),\n * button({ ...t.prevTrigger }, [text('Back')]),\n * button({ ...t.nextTrigger }, [text('Next')]),\n * ],\n * })\n */\n\nexport interface TourStep {\n id: string\n title: string\n description: string\n /** CSS selector or element ref for the tour target. */\n target: string\n /** Placement hint for the pop-up. */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Whether to show the highlight ring around the target. */\n spotlight?: boolean\n}\n\nexport interface TourState {\n steps: TourStep[]\n open: boolean\n index: number\n /** Ids of steps already visited. */\n visited: string[]\n}\n\nexport type TourMsg =\n | { type: 'start' }\n | { type: 'stop' }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'goto'; index: number }\n | { type: 'setSteps'; steps: TourStep[] }\n\nexport interface TourInit {\n steps?: TourStep[]\n open?: boolean\n index?: number\n}\n\nexport function init(opts: TourInit = {}): TourState {\n const steps = opts.steps ?? []\n const index = Math.max(0, Math.min(opts.index ?? 0, Math.max(0, steps.length - 1)))\n return {\n steps,\n open: opts.open ?? false,\n index,\n visited: opts.open && steps[index] ? [steps[index].id] : [],\n }\n}\n\nexport function update(state: TourState, msg: TourMsg): [TourState, never[]] {\n switch (msg.type) {\n case 'start': {\n if (state.steps.length === 0) return [state, []]\n const first = state.steps[0]!\n return [{ ...state, open: true, index: 0, visited: [first.id] }, []]\n }\n case 'stop':\n return [{ ...state, open: false }, []]\n case 'next': {\n const last = state.steps.length - 1\n if (state.index >= last) return [{ ...state, open: false }, []]\n const nextIdx = state.index + 1\n const nextStep = state.steps[nextIdx]!\n const visited = state.visited.includes(nextStep.id)\n ? state.visited\n : [...state.visited, nextStep.id]\n return [{ ...state, index: nextIdx, visited }, []]\n }\n case 'prev': {\n if (state.index <= 0) return [state, []]\n return [{ ...state, index: state.index - 1 }, []]\n }\n case 'goto': {\n if (msg.index < 0 || msg.index >= state.steps.length) return [state, []]\n const step = state.steps[msg.index]!\n const visited = state.visited.includes(step.id) ? state.visited : [...state.visited, step.id]\n return [{ ...state, open: true, index: msg.index, visited }, []]\n }\n case 'setSteps':\n return [{ ...state, steps: msg.steps, index: 0 }, []]\n }\n}\n\nexport function currentStep(state: TourState): TourStep | null {\n return state.steps[state.index] ?? null\n}\n\nexport function isFirst(state: TourState): boolean {\n return state.index === 0\n}\n\nexport function isLast(state: TourState): boolean {\n return state.index === state.steps.length - 1\n}\n\nexport function progress(state: TourState): { current: number; total: number } {\n return { current: state.index + 1, total: state.steps.length }\n}\n\nexport interface TourParts<S> {\n root: {\n role: 'dialog'\n 'aria-modal': 'false'\n 'aria-labelledby': string\n 'aria-describedby': string\n 'data-scope': 'tour'\n 'data-part': 'root'\n hidden: (s: S) => boolean\n }\n backdrop: {\n 'data-scope': 'tour'\n 'data-part': 'backdrop'\n 'aria-hidden': 'true'\n onClick: (e: MouseEvent) => void\n }\n spotlight: {\n 'data-scope': 'tour'\n 'data-part': 'spotlight'\n 'aria-hidden': 'true'\n }\n title: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'description'\n }\n progressText: {\n 'data-scope': 'tour'\n 'data-part': 'progress-text'\n }\n prevTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'tour'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'data-scope': 'tour'\n 'data-part': 'next-trigger'\n 'data-last': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'tour'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n /** Whether clicking the backdrop stops the tour. Default: false — tours\n * typically require an explicit dismiss. */\n closeOnBackdropClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TourState,\n send: Send<TourMsg>,\n opts: ConnectOptions,\n): TourParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const titleId = `${opts.id}:title`\n const descId = `${opts.id}:description`\n const closeOnBackdrop = opts.closeOnBackdropClick === true\n\n return {\n root: {\n role: 'dialog',\n 'aria-modal': 'false',\n 'aria-labelledby': titleId,\n 'aria-describedby': descId,\n 'data-scope': 'tour',\n 'data-part': 'root',\n hidden: (s) => !get(s).open,\n },\n backdrop: {\n 'data-scope': 'tour',\n 'data-part': 'backdrop',\n 'aria-hidden': 'true',\n onClick: () => {\n if (closeOnBackdrop) send({ type: 'stop' })\n },\n },\n spotlight: {\n 'data-scope': 'tour',\n 'data-part': 'spotlight',\n 'aria-hidden': 'true',\n },\n title: {\n id: titleId,\n 'data-scope': 'tour',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'tour',\n 'data-part': 'description',\n },\n progressText: {\n 'data-scope': 'tour',\n 'data-part': 'progress-text',\n },\n prevTrigger: {\n type: 'button',\n disabled: (s) => isFirst(get(s)),\n 'data-scope': 'tour',\n 'data-part': 'prev-trigger',\n onClick: () => send({ type: 'prev' }),\n },\n nextTrigger: {\n type: 'button',\n 'data-scope': 'tour',\n 'data-part': 'next-trigger',\n 'data-last': (s) => (isLast(get(s)) ? '' : undefined),\n onClick: () => send({ type: 'next' }),\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': opts.closeLabel ?? ((s: S) => locale(s).tour.close),\n 'data-scope': 'tour',\n 'data-part': 'close-trigger',\n onClick: () => send({ type: 'stop' }),\n },\n }\n}\n\nexport const tour = {\n init,\n update,\n connect,\n currentStep,\n isFirst,\n isLast,\n progress,\n}\n"]}
1
+ {"version":3,"file":"tour.js","sourceRoot":"","sources":["../../src/components/tour.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Tour — guided walkthrough over a sequence of steps, each targeting\n * an element on the page with a pop-up explanation. The state machine\n * tracks the current step index and open/closed; positioning of the\n * pop-up relative to the target selector is done in the view layer\n * (typically via onMount + attachFloating).\n *\n * Typical shape:\n *\n * const t = tour.connect<State>(s => s.tour, m => send({type:'tour', msg:m}))\n * ...tour.overlay<State>({\n * get: s => s.tour,\n * send: m => send({type:'tour', msg:m}),\n * parts: t,\n * content: (step) => [\n * h3({ ...t.title }, [text(step.title)]),\n * p({ ...t.description }, [text(step.description)]),\n * button({ ...t.prevTrigger }, [text('Back')]),\n * button({ ...t.nextTrigger }, [text('Next')]),\n * ],\n * })\n */\n\nexport interface TourStep {\n id: string\n title: string\n description: string\n /** CSS selector or element ref for the tour target. */\n target: string\n /** Placement hint for the pop-up. */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Whether to show the highlight ring around the target. */\n spotlight?: boolean\n}\n\nexport interface TourState {\n steps: TourStep[]\n open: boolean\n index: number\n /** Ids of steps already visited. */\n visited: string[]\n}\n\nexport type TourMsg =\n /** @intent(\"Begin the tour at the first step (or current index if resuming)\") */\n | { type: 'start' }\n /** @intent(\"Close the tour without finishing (does not reset progress)\") */\n | { type: 'stop' }\n /** @intent(\"Advance to the next step (closes the tour after the last step)\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous step\") */\n | { type: 'prev' }\n /** @intent(\"Jump to a specific step by zero-based index\") */\n | { type: 'goto'; index: number }\n /** @humanOnly */\n | { type: 'setSteps'; steps: TourStep[] }\n\nexport interface TourInit {\n steps?: TourStep[]\n open?: boolean\n index?: number\n}\n\nexport function init(opts: TourInit = {}): TourState {\n const steps = opts.steps ?? []\n const index = Math.max(0, Math.min(opts.index ?? 0, Math.max(0, steps.length - 1)))\n return {\n steps,\n open: opts.open ?? false,\n index,\n visited: opts.open && steps[index] ? [steps[index].id] : [],\n }\n}\n\nexport function update(state: TourState, msg: TourMsg): [TourState, never[]] {\n switch (msg.type) {\n case 'start': {\n if (state.steps.length === 0) return [state, []]\n const first = state.steps[0]!\n return [{ ...state, open: true, index: 0, visited: [first.id] }, []]\n }\n case 'stop':\n return [{ ...state, open: false }, []]\n case 'next': {\n const last = state.steps.length - 1\n if (state.index >= last) return [{ ...state, open: false }, []]\n const nextIdx = state.index + 1\n const nextStep = state.steps[nextIdx]!\n const visited = state.visited.includes(nextStep.id)\n ? state.visited\n : [...state.visited, nextStep.id]\n return [{ ...state, index: nextIdx, visited }, []]\n }\n case 'prev': {\n if (state.index <= 0) return [state, []]\n return [{ ...state, index: state.index - 1 }, []]\n }\n case 'goto': {\n if (msg.index < 0 || msg.index >= state.steps.length) return [state, []]\n const step = state.steps[msg.index]!\n const visited = state.visited.includes(step.id) ? state.visited : [...state.visited, step.id]\n return [{ ...state, open: true, index: msg.index, visited }, []]\n }\n case 'setSteps':\n return [{ ...state, steps: msg.steps, index: 0 }, []]\n }\n}\n\nexport function currentStep(state: TourState): TourStep | null {\n return state.steps[state.index] ?? null\n}\n\nexport function isFirst(state: TourState): boolean {\n return state.index === 0\n}\n\nexport function isLast(state: TourState): boolean {\n return state.index === state.steps.length - 1\n}\n\nexport function progress(state: TourState): { current: number; total: number } {\n return { current: state.index + 1, total: state.steps.length }\n}\n\nexport interface TourParts<S> {\n root: {\n role: 'dialog'\n 'aria-modal': 'false'\n 'aria-labelledby': string\n 'aria-describedby': string\n 'data-scope': 'tour'\n 'data-part': 'root'\n hidden: (s: S) => boolean\n }\n backdrop: {\n 'data-scope': 'tour'\n 'data-part': 'backdrop'\n 'aria-hidden': 'true'\n onClick: (e: MouseEvent) => void\n }\n spotlight: {\n 'data-scope': 'tour'\n 'data-part': 'spotlight'\n 'aria-hidden': 'true'\n }\n title: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'tour'\n 'data-part': 'description'\n }\n progressText: {\n 'data-scope': 'tour'\n 'data-part': 'progress-text'\n }\n prevTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'tour'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'data-scope': 'tour'\n 'data-part': 'next-trigger'\n 'data-last': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'tour'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n /** Whether clicking the backdrop stops the tour. Default: false — tours\n * typically require an explicit dismiss. */\n closeOnBackdropClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TourState,\n send: Send<TourMsg>,\n opts: ConnectOptions,\n): TourParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const titleId = `${opts.id}:title`\n const descId = `${opts.id}:description`\n const closeOnBackdrop = opts.closeOnBackdropClick === true\n\n return {\n root: {\n role: 'dialog',\n 'aria-modal': 'false',\n 'aria-labelledby': titleId,\n 'aria-describedby': descId,\n 'data-scope': 'tour',\n 'data-part': 'root',\n hidden: (s) => !get(s).open,\n },\n backdrop: {\n 'data-scope': 'tour',\n 'data-part': 'backdrop',\n 'aria-hidden': 'true',\n onClick: tagSend(send, ['stop'], () => {\n if (closeOnBackdrop) send({ type: 'stop' })\n }),\n },\n spotlight: {\n 'data-scope': 'tour',\n 'data-part': 'spotlight',\n 'aria-hidden': 'true',\n },\n title: {\n id: titleId,\n 'data-scope': 'tour',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'tour',\n 'data-part': 'description',\n },\n progressText: {\n 'data-scope': 'tour',\n 'data-part': 'progress-text',\n },\n prevTrigger: {\n type: 'button',\n disabled: (s) => isFirst(get(s)),\n 'data-scope': 'tour',\n 'data-part': 'prev-trigger',\n onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),\n },\n nextTrigger: {\n type: 'button',\n 'data-scope': 'tour',\n 'data-part': 'next-trigger',\n 'data-last': (s) => (isLast(get(s)) ? '' : undefined),\n onClick: tagSend(send, ['next'], () => send({ type: 'next' })),\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': opts.closeLabel ?? ((s: S) => locale(s).tour.close),\n 'data-scope': 'tour',\n 'data-part': 'close-trigger',\n onClick: tagSend(send, ['stop'], () => send({ type: 'stop' })),\n },\n }\n}\n\nexport const tour = {\n init,\n update,\n connect,\n currentStep,\n isFirst,\n isLast,\n progress,\n}\n"]}
@@ -44,79 +44,129 @@ export interface TreeViewState {
44
44
  */
45
45
  loading: string[];
46
46
  }
47
- export type TreeViewMsg = {
47
+ export type TreeViewMsg =
48
+ /** @intent("Toggle the branch with the given id expanded/collapsed") */
49
+ {
48
50
  type: 'toggleBranch';
49
51
  id: string;
50
- } | {
52
+ }
53
+ /** @intent("Expand the branch with the given id") */
54
+ | {
51
55
  type: 'expand';
52
56
  id: string;
53
- } | {
57
+ }
58
+ /** @intent("Collapse the branch with the given id") */
59
+ | {
54
60
  type: 'collapse';
55
61
  id: string;
56
- } | {
62
+ }
63
+ /** @intent("Expand every branch in the provided id list") */
64
+ | {
57
65
  type: 'expandAll';
58
66
  ids: string[];
59
- } | {
67
+ }
68
+ /** @intent("Collapse every expanded branch") */
69
+ | {
60
70
  type: 'collapseAll';
61
- } | {
71
+ }
72
+ /** @intent("Select the item with the given id (additive=true extends multi-selection)") */
73
+ | {
62
74
  type: 'select';
63
75
  id: string;
64
76
  additive?: boolean;
65
- } | {
77
+ }
78
+ /** @intent("Replace the selected-id set with the provided list") */
79
+ | {
66
80
  type: 'setSelected';
67
81
  ids: string[];
68
- } | {
82
+ }
83
+ /** @humanOnly */
84
+ | {
69
85
  type: 'focus';
70
86
  id: string | null;
71
- } | {
87
+ }
88
+ /** @humanOnly */
89
+ | {
72
90
  type: 'focusNext';
73
- } | {
91
+ }
92
+ /** @humanOnly */
93
+ | {
74
94
  type: 'focusPrev';
75
- } | {
95
+ }
96
+ /** @humanOnly */
97
+ | {
76
98
  type: 'focusFirst';
77
- } | {
99
+ }
100
+ /** @humanOnly */
101
+ | {
78
102
  type: 'focusLast';
79
- } | {
103
+ }
104
+ /** @humanOnly */
105
+ | {
80
106
  type: 'setVisibleItems';
81
107
  ids: string[];
82
108
  labels?: string[];
83
- } | {
109
+ }
110
+ /** @humanOnly */
111
+ | {
84
112
  type: 'typeahead';
85
113
  char: string;
86
114
  now: number;
87
- } | {
115
+ }
116
+ /** @humanOnly */
117
+ | {
88
118
  type: 'arrowLeftFrom';
89
119
  id: string;
90
120
  isBranch: boolean;
91
121
  parentId: string | null;
92
- } | {
122
+ }
123
+ /** @humanOnly */
124
+ | {
93
125
  type: 'arrowRightFrom';
94
126
  id: string;
95
- } | {
127
+ }
128
+ /** @intent("Toggle the checkbox on the item with the given id (descendantIds drives recursive check)") */
129
+ | {
96
130
  type: 'toggleChecked';
97
131
  id: string;
98
132
  descendantIds?: string[];
99
- } | {
133
+ }
134
+ /** @intent("Replace the checked-id set with the provided list") */
135
+ | {
100
136
  type: 'setChecked';
101
137
  ids: string[];
102
- } | {
138
+ }
139
+ /** @humanOnly */
140
+ | {
103
141
  type: 'setIndeterminate';
104
142
  ids: string[];
105
- } | {
143
+ }
144
+ /** @intent("Begin renaming the item with the given id (seeds the rename input with `initial`)") */
145
+ | {
106
146
  type: 'renameStart';
107
147
  id: string;
108
148
  initial: string;
109
- } | {
149
+ }
150
+ /** @intent("Update the rename draft as the user types") */
151
+ | {
110
152
  type: 'renameChange';
111
153
  value: string;
112
- } | {
154
+ }
155
+ /** @intent("Commit the in-progress rename (clears the rename state)") */
156
+ | {
113
157
  type: 'renameCommit';
114
- } | {
158
+ }
159
+ /** @intent("Cancel the in-progress rename without applying changes") */
160
+ | {
115
161
  type: 'renameCancel';
116
- } | {
162
+ }
163
+ /** @intent("Mark the branch with the given id as loading children (typically before an async fetch)") */
164
+ | {
117
165
  type: 'loadingStart';
118
166
  id: string;
119
- } | {
167
+ }
168
+ /** @intent("Clear the loading state for the given branch id (after async fetch completes)") */
169
+ | {
120
170
  type: 'loadingEnd';
121
171
  id: string;
122
172
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AASrC;;;;;GAKG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;AAE9D,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;+DAE2D;IAC3D,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,iCAAiC;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,uFAAuF;IACvF,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB;;wDAEoD;IACpD,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,MAAM,WAAW;AACrB,wEAAwE;AACtE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACtC,qDAAqD;GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAChC,uDAAuD;GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAClC,6DAA6D;GAC3D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE;AACtC,gDAAgD;GAC9C;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE;AACzB,2FAA2F;GACzF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACpD,oEAAoE;GAClE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE;AACxC,iBAAiB;GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACtC,iBAAiB;GACf;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,iBAAiB;GACf;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,iBAAiB;GACf;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE;AACxB,iBAAiB;GACf;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,iBAAiB;GACf;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;AAC/D,iBAAiB;GACf;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAClD,iBAAiB;GACf;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACnF,iBAAiB;GACf;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACxC,0GAA0G;GACxG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;AACjE,mEAAmE;GACjE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE;AACvC,iBAAiB;GACf;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE;AAC7C,mGAAmG;GACjG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACtD,2DAA2D;GACzD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACzC,yEAAyE;GACvE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE;AAC1B,wEAAwE;GACtE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE;AAC1B,yGAAyG;GACvG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACtC,+FAA+F;GAC7F;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,YAAiB,GAAG,aAAa,CAiB3D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAiIvF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU,CAAA;QAChB,EAAE,EAAE,MAAM,CAAA;QACV,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,GAAG,SAAS,CAAA;QAC9C,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,GAAG,SAAS,CAAA;QAC9C,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAC1B,YAAY,EAAE,WAAW,CAAA;QACzB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;QACpB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACzC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;QAChC,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;QACrC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;IACD,6DAA6D;IAC7D,aAAa,EAAE;QACb,YAAY,EAAE,WAAW,CAAA;QACzB,WAAW,EAAE,gBAAgB,CAAA;QAC7B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;IACD;;;;;;;OAOG;IACH,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU,CAAA;QAChB,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;QACpD,YAAY,EAAE,WAAW,CAAA;QACzB,WAAW,EAAE,UAAU,CAAA;QACvB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,GAAG,WAAW,GAAG,eAAe,CAAA;KAClE,CAAA;CACF;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QACzC,sBAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QACpD,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC7C,YAAY,EAAE,WAAW,CAAA;QACzB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;KAC1C,CAAA;IACD,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;CACnG;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,EAC5B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EACvB,IAAI,EAAE,cAAc,GACnB,aAAa,CAAC,CAAC,CAAC,CAiIlB;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;CAUpB,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  import { flipArrow } from '../utils/direction.js';
2
3
  import { typeaheadAccumulate, typeaheadMatch, isTypeaheadKey, TYPEAHEAD_TIMEOUT_MS, } from '../utils/typeahead.js';
3
4
  export function init(opts = {}) {
@@ -207,13 +208,23 @@ export function connect(get, send, opts) {
207
208
  'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),
208
209
  'data-focused': (s) => (get(s).focused === id ? '' : undefined),
209
210
  'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),
210
- onClick: (e) => {
211
+ onClick: tagSend(send, ['select', 'toggleBranch'], (e) => {
211
212
  send({ type: 'select', id, additive: e.metaKey || e.ctrlKey });
212
213
  if (expandOnClick && isBranch)
213
214
  send({ type: 'toggleBranch', id });
214
- },
215
- onFocus: () => send({ type: 'focus', id }),
216
- onKeyDown: (e) => {
215
+ }),
216
+ onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', id })),
217
+ onKeyDown: tagSend(send, [
218
+ 'focusNext',
219
+ 'focusPrev',
220
+ 'arrowRightFrom',
221
+ 'arrowLeftFrom',
222
+ 'focusFirst',
223
+ 'focusLast',
224
+ 'select',
225
+ 'toggleBranch',
226
+ 'typeahead',
227
+ ], (e) => {
217
228
  const key = flipArrow(e.key, e.currentTarget);
218
229
  switch (key) {
219
230
  case 'ArrowDown':
@@ -259,16 +270,16 @@ export function connect(get, send, opts) {
259
270
  send({ type: 'typeahead', char: e.key, now: Date.now() });
260
271
  }
261
272
  }
262
- },
273
+ }),
263
274
  },
264
275
  branchTrigger: {
265
276
  'data-scope': 'tree-view',
266
277
  'data-part': 'branch-trigger',
267
278
  'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),
268
- onClick: (e) => {
279
+ onClick: tagSend(send, ['toggleBranch'], (e) => {
269
280
  e.stopPropagation();
270
281
  send({ type: 'toggleBranch', id });
271
- },
282
+ }),
272
283
  },
273
284
  checkbox: {
274
285
  role: 'checkbox',
@@ -1 +1 @@
1
- {"version":3,"file":"tree-view.js","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport {\n typeaheadAccumulate,\n typeaheadMatch,\n isTypeaheadKey,\n TYPEAHEAD_TIMEOUT_MS,\n} from '../utils/typeahead.js'\n\n/**\n * Tree view — hierarchical list with expand/collapse. Items are identified\n * by opaque string ids; the tree structure (children relationship) is\n * provided externally. The machine tracks which branches are expanded,\n * which items are selected, and which item has keyboard focus.\n */\n\nexport type SelectionMode = 'single' | 'multiple' | 'checkbox'\n\nexport interface TreeViewState {\n /** Ids of expanded branches. */\n expanded: string[]\n /** Ids of selected items. */\n selected: string[]\n /** Ids of checked items (checkbox selection mode). */\n checked: string[]\n /** Ids known to be in the indeterminate tri-state (some-but-not-all\n * descendants checked). Consumer-computed via propagation logic or the\n * `toggleChecked` message's `descendantIds` parameter. */\n indeterminate: string[]\n /** Currently focused item id. */\n focused: string | null\n selectionMode: SelectionMode\n /** Ordered list of currently-visible item ids (updated by consumer via setVisible). */\n visibleItems: string[]\n /** Parallel array of visible-item labels for typeahead. If empty, typeahead\n * matches against ids directly. Updated alongside visibleItems via the\n * optional `labels` field on `setVisibleItems`. */\n visibleLabels: string[]\n disabled: boolean\n /** Typeahead accumulator buffer. */\n typeahead: string\n typeaheadExpiresAt: number\n /** Id of item currently being renamed, or null. */\n renaming: string | null\n /** Draft value during rename. */\n renameDraft: string\n /**\n * Ids of branches currently loading their children asynchronously. Item\n * parts expose `aria-busy` while loading so assistive tech announces\n * the in-progress state. The consumer kicks off the fetch externally\n * (in a handler that intercepts `expand`, or via an effect), dispatches\n * `loadingStart` immediately, fetches the children, then dispatches\n * `setVisibleItems` with the new tree contents followed by `loadingEnd`.\n */\n loading: string[]\n}\n\nexport type TreeViewMsg =\n | { type: 'toggleBranch'; id: string }\n | { type: 'expand'; id: string }\n | { type: 'collapse'; id: string }\n | { type: 'expandAll'; ids: string[] }\n | { type: 'collapseAll' }\n | { type: 'select'; id: string; additive?: boolean }\n | { type: 'setSelected'; ids: string[] }\n | { type: 'focus'; id: string | null }\n | { type: 'focusNext' }\n | { type: 'focusPrev' }\n | { type: 'focusFirst' }\n | { type: 'focusLast' }\n | { type: 'setVisibleItems'; ids: string[]; labels?: string[] }\n | { type: 'typeahead'; char: string; now: number }\n | { type: 'arrowLeftFrom'; id: string; isBranch: boolean; parentId: string | null }\n | { type: 'arrowRightFrom'; id: string }\n | { type: 'toggleChecked'; id: string; descendantIds?: string[] }\n | { type: 'setChecked'; ids: string[] }\n | { type: 'setIndeterminate'; ids: string[] }\n | { type: 'renameStart'; id: string; initial: string }\n | { type: 'renameChange'; value: string }\n | { type: 'renameCommit' }\n | { type: 'renameCancel' }\n | { type: 'loadingStart'; id: string }\n | { type: 'loadingEnd'; id: string }\n\nexport interface TreeViewInit {\n expanded?: string[]\n selected?: string[]\n checked?: string[]\n indeterminate?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n visibleItems?: string[]\n visibleLabels?: string[]\n}\n\nexport function init(opts: TreeViewInit = {}): TreeViewState {\n return {\n expanded: opts.expanded ?? [],\n selected: opts.selected ?? [],\n checked: opts.checked ?? [],\n indeterminate: opts.indeterminate ?? [],\n focused: null,\n selectionMode: opts.selectionMode ?? 'single',\n visibleItems: opts.visibleItems ?? [],\n visibleLabels: opts.visibleLabels ?? [],\n disabled: opts.disabled ?? false,\n typeahead: '',\n typeaheadExpiresAt: 0,\n renaming: null,\n renameDraft: '',\n loading: [],\n }\n}\n\nexport function update(state: TreeViewState, msg: TreeViewMsg): [TreeViewState, never[]] {\n if (state.disabled && msg.type !== 'setVisibleItems') return [state, []]\n switch (msg.type) {\n case 'toggleBranch': {\n const expanded = state.expanded.includes(msg.id)\n ? state.expanded.filter((id) => id !== msg.id)\n : [...state.expanded, msg.id]\n return [{ ...state, expanded }, []]\n }\n case 'expand':\n if (state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n case 'collapse':\n if (!state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n case 'expandAll':\n return [{ ...state, expanded: msg.ids }, []]\n case 'collapseAll':\n return [{ ...state, expanded: [] }, []]\n case 'select': {\n if (state.selectionMode === 'single') {\n return [{ ...state, selected: [msg.id] }, []]\n }\n if (msg.additive) {\n const isSelected = state.selected.includes(msg.id)\n const selected = isSelected\n ? state.selected.filter((id) => id !== msg.id)\n : [...state.selected, msg.id]\n return [{ ...state, selected }, []]\n }\n return [{ ...state, selected: [msg.id] }, []]\n }\n case 'setSelected':\n return [{ ...state, selected: msg.ids }, []]\n case 'focus':\n return [{ ...state, focused: msg.id }, []]\n case 'focusNext': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused ? state.visibleItems.indexOf(state.focused) : -1\n const next = state.visibleItems[Math.min(idx + 1, state.visibleItems.length - 1)]\n return [{ ...state, focused: next ?? state.focused }, []]\n }\n case 'focusPrev': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused\n ? state.visibleItems.indexOf(state.focused)\n : state.visibleItems.length\n const prev = state.visibleItems[Math.max(0, idx - 1)]\n return [{ ...state, focused: prev ?? state.focused }, []]\n }\n case 'focusFirst':\n return [{ ...state, focused: state.visibleItems[0] ?? null }, []]\n case 'focusLast':\n return [{ ...state, focused: state.visibleItems[state.visibleItems.length - 1] ?? null }, []]\n case 'setVisibleItems':\n return [\n { ...state, visibleItems: msg.ids, visibleLabels: msg.labels ?? state.visibleLabels },\n [],\n ]\n case 'arrowLeftFrom': {\n // If this is an expanded branch, collapse it and stay focused.\n if (msg.isBranch && state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n }\n // Otherwise, move focus to parent if provided (WAI-ARIA).\n if (msg.parentId !== null) {\n return [{ ...state, focused: msg.parentId }, []]\n }\n return [state, []]\n }\n case 'arrowRightFrom': {\n // If this branch is closed, expand it; otherwise focus the first\n // visible child (the next item in depth-first visibleItems order).\n if (!state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n }\n const idx = state.visibleItems.indexOf(msg.id)\n if (idx === -1 || idx === state.visibleItems.length - 1) return [state, []]\n const next = state.visibleItems[idx + 1]!\n return [{ ...state, focused: next }, []]\n }\n case 'typeahead': {\n if (state.visibleItems.length === 0) return [state, []]\n const acc = typeaheadAccumulate(state.typeahead, msg.char, msg.now, state.typeaheadExpiresAt)\n // Fall back to matching ids if labels weren't provided.\n const labels = state.visibleLabels.length > 0 ? state.visibleLabels : state.visibleItems\n const disabledMask = new Array<boolean>(labels.length).fill(false)\n const startIdx = state.focused ? state.visibleItems.indexOf(state.focused) : null\n const matchIdx = typeaheadMatch(labels, disabledMask, acc, startIdx)\n const focused =\n matchIdx === null ? state.focused : (state.visibleItems[matchIdx] ?? state.focused)\n return [\n { ...state, typeahead: acc, typeaheadExpiresAt: msg.now + TYPEAHEAD_TIMEOUT_MS, focused },\n [],\n ]\n }\n case 'toggleChecked': {\n // Toggle the item's checked state, propagating to descendants if any.\n // The caller passes `descendantIds` for branches; for leaves, pass\n // an empty list or omit. Indeterminate flag is cleared on the id\n // (a deliberate toggle is a definite state). The caller is\n // responsible for recomputing `indeterminate` on ancestors via\n // setIndeterminate after this message.\n const desc = msg.descendantIds ?? []\n const all = [msg.id, ...desc]\n const isChecked = state.checked.includes(msg.id)\n const next = isChecked\n ? state.checked.filter((id) => !all.includes(id))\n : Array.from(new Set([...state.checked, ...all]))\n const indeterminate = state.indeterminate.filter((id) => !all.includes(id))\n return [{ ...state, checked: next, indeterminate }, []]\n }\n case 'setChecked':\n return [{ ...state, checked: msg.ids }, []]\n case 'setIndeterminate':\n return [{ ...state, indeterminate: msg.ids }, []]\n case 'renameStart':\n return [{ ...state, renaming: msg.id, renameDraft: msg.initial }, []]\n case 'renameChange':\n return [{ ...state, renameDraft: msg.value }, []]\n case 'renameCommit':\n case 'renameCancel':\n return [{ ...state, renaming: null, renameDraft: '' }, []]\n case 'loadingStart':\n if (state.loading.includes(msg.id)) return [state, []]\n return [{ ...state, loading: [...state.loading, msg.id] }, []]\n case 'loadingEnd':\n return [{ ...state, loading: state.loading.filter((id) => id !== msg.id) }, []]\n }\n}\n\nexport function isExpanded(state: TreeViewState, id: string): boolean {\n return state.expanded.includes(id)\n}\n\nexport function isSelected(state: TreeViewState, id: string): boolean {\n return state.selected.includes(id)\n}\n\nexport function isChecked(state: TreeViewState, id: string): boolean {\n return state.checked.includes(id)\n}\n\nexport function isIndeterminate(state: TreeViewState, id: string): boolean {\n return state.indeterminate.includes(id)\n}\n\nexport function isRenaming(state: TreeViewState, id: string): boolean {\n return state.renaming === id\n}\n\nexport function isLoading(state: TreeViewState, id: string): boolean {\n return state.loading.includes(id)\n}\n\nexport interface TreeItemParts<S> {\n item: {\n role: 'treeitem'\n id: string\n 'aria-expanded': (s: S) => boolean | undefined\n 'aria-selected': (s: S) => boolean | undefined\n 'aria-level': number\n 'aria-busy': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'tree-view'\n 'data-part': 'item'\n 'data-value': string\n 'data-depth': string\n 'data-selected': (s: S) => '' | undefined\n 'data-focused': (s: S) => '' | undefined\n 'data-loading': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n /** For branch items — expand/collapse disclosure trigger. */\n branchTrigger: {\n 'data-scope': 'tree-view'\n 'data-part': 'branch-trigger'\n 'data-state': (s: S) => 'open' | 'closed'\n onClick: (e: MouseEvent) => void\n }\n /**\n * Checkbox element (only meaningful when `selectionMode === 'checkbox'`).\n * `aria-checked` is the tri-state string ('true' | 'false' | 'mixed').\n * The consumer must render a checkbox input or a visual proxy and\n * dispatch `toggleChecked` via the `onClick` binding. For branches,\n * pass the branch's descendant ids via `descendantIds` on the message\n * so children are propagated in a single reducer step.\n */\n checkbox: {\n role: 'checkbox'\n 'aria-checked': (s: S) => 'true' | 'false' | 'mixed'\n 'data-scope': 'tree-view'\n 'data-part': 'checkbox'\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n }\n}\n\nexport interface TreeViewParts<S> {\n root: {\n role: 'tree'\n 'aria-owns': (s: S) => string | undefined\n 'aria-multiselectable': (s: S) => 'true' | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'tree-view'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * If true, clicking anywhere on a branch item (not just the disclosure\n * caret) toggles its expanded state. Default: false — clicks on the row\n * select it without toggling, consistent with most file-tree UIs.\n */\n expandOnClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TreeViewState,\n send: Send<TreeViewMsg>,\n opts: ConnectOptions,\n): TreeViewParts<S> {\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n const expandOnClick = opts.expandOnClick === true\n\n return {\n root: {\n role: 'tree',\n 'aria-owns': (s) => {\n const items = get(s).visibleItems\n if (items.length === 0) return undefined\n return items.map((id) => itemId(id)).join(' ')\n },\n 'aria-multiselectable': (s) => (get(s).selectionMode === 'multiple' ? 'true' : undefined),\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'tree-view',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n item: (\n id: string,\n depth: number,\n isBranch: boolean,\n parentId: string | null = null,\n ): TreeItemParts<S> => ({\n item: {\n role: 'treeitem',\n id: itemId(id),\n 'aria-expanded': (s) => (isBranch ? isExpanded(get(s), id) : undefined),\n 'aria-selected': (s) =>\n get(s).selectionMode === 'single' ? isSelected(get(s), id) : undefined,\n 'aria-level': depth + 1,\n 'aria-busy': (s) => (isLoading(get(s), id) ? 'true' : undefined),\n tabIndex: (s) => (get(s).focused === id ? 0 : -1),\n 'data-scope': 'tree-view',\n 'data-part': 'item',\n 'data-value': id,\n 'data-depth': String(depth),\n 'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),\n 'data-focused': (s) => (get(s).focused === id ? '' : undefined),\n 'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),\n onClick: (e) => {\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (expandOnClick && isBranch) send({ type: 'toggleBranch', id })\n },\n onFocus: () => send({ type: 'focus', id }),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev' })\n return\n case 'ArrowRight':\n // WAI-ARIA: closed branch → expand (stay); open branch →\n // focus first child. Leaf → nothing. The reducer decides\n // based on current expanded state.\n if (!isBranch) return\n e.preventDefault()\n send({ type: 'arrowRightFrom', id })\n return\n case 'ArrowLeft':\n // WAI-ARIA: open branch → collapse (stay); closed branch or\n // leaf → focus parent (if known). Root end-nodes → nothing.\n e.preventDefault()\n send({ type: 'arrowLeftFrom', id, isBranch, parentId })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (isBranch) send({ type: 'toggleBranch', id })\n return\n default:\n if (isTypeaheadKey(e)) {\n send({ type: 'typeahead', char: e.key, now: Date.now() })\n }\n }\n },\n },\n branchTrigger: {\n 'data-scope': 'tree-view',\n 'data-part': 'branch-trigger',\n 'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),\n onClick: (e) => {\n e.stopPropagation()\n send({ type: 'toggleBranch', id })\n },\n },\n checkbox: {\n role: 'checkbox',\n 'aria-checked': (s) => {\n if (isIndeterminate(get(s), id)) return 'mixed'\n return isChecked(get(s), id) ? 'true' : 'false'\n },\n 'data-scope': 'tree-view',\n 'data-part': 'checkbox',\n 'data-state': (s) => {\n if (isIndeterminate(get(s), id)) return 'indeterminate'\n return isChecked(get(s), id) ? 'checked' : 'unchecked'\n },\n },\n }),\n }\n}\n\nexport const treeView = {\n init,\n update,\n connect,\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isRenaming,\n isLoading,\n}\n"]}
1
+ {"version":3,"file":"tree-view.js","sourceRoot":"","sources":["../../src/components/tree-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport {\n typeaheadAccumulate,\n typeaheadMatch,\n isTypeaheadKey,\n TYPEAHEAD_TIMEOUT_MS,\n} from '../utils/typeahead.js'\n\n/**\n * Tree view — hierarchical list with expand/collapse. Items are identified\n * by opaque string ids; the tree structure (children relationship) is\n * provided externally. The machine tracks which branches are expanded,\n * which items are selected, and which item has keyboard focus.\n */\n\nexport type SelectionMode = 'single' | 'multiple' | 'checkbox'\n\nexport interface TreeViewState {\n /** Ids of expanded branches. */\n expanded: string[]\n /** Ids of selected items. */\n selected: string[]\n /** Ids of checked items (checkbox selection mode). */\n checked: string[]\n /** Ids known to be in the indeterminate tri-state (some-but-not-all\n * descendants checked). Consumer-computed via propagation logic or the\n * `toggleChecked` message's `descendantIds` parameter. */\n indeterminate: string[]\n /** Currently focused item id. */\n focused: string | null\n selectionMode: SelectionMode\n /** Ordered list of currently-visible item ids (updated by consumer via setVisible). */\n visibleItems: string[]\n /** Parallel array of visible-item labels for typeahead. If empty, typeahead\n * matches against ids directly. Updated alongside visibleItems via the\n * optional `labels` field on `setVisibleItems`. */\n visibleLabels: string[]\n disabled: boolean\n /** Typeahead accumulator buffer. */\n typeahead: string\n typeaheadExpiresAt: number\n /** Id of item currently being renamed, or null. */\n renaming: string | null\n /** Draft value during rename. */\n renameDraft: string\n /**\n * Ids of branches currently loading their children asynchronously. Item\n * parts expose `aria-busy` while loading so assistive tech announces\n * the in-progress state. The consumer kicks off the fetch externally\n * (in a handler that intercepts `expand`, or via an effect), dispatches\n * `loadingStart` immediately, fetches the children, then dispatches\n * `setVisibleItems` with the new tree contents followed by `loadingEnd`.\n */\n loading: string[]\n}\n\nexport type TreeViewMsg =\n /** @intent(\"Toggle the branch with the given id expanded/collapsed\") */\n | { type: 'toggleBranch'; id: string }\n /** @intent(\"Expand the branch with the given id\") */\n | { type: 'expand'; id: string }\n /** @intent(\"Collapse the branch with the given id\") */\n | { type: 'collapse'; id: string }\n /** @intent(\"Expand every branch in the provided id list\") */\n | { type: 'expandAll'; ids: string[] }\n /** @intent(\"Collapse every expanded branch\") */\n | { type: 'collapseAll' }\n /** @intent(\"Select the item with the given id (additive=true extends multi-selection)\") */\n | { type: 'select'; id: string; additive?: boolean }\n /** @intent(\"Replace the selected-id set with the provided list\") */\n | { type: 'setSelected'; ids: string[] }\n /** @humanOnly */\n | { type: 'focus'; id: string | null }\n /** @humanOnly */\n | { type: 'focusNext' }\n /** @humanOnly */\n | { type: 'focusPrev' }\n /** @humanOnly */\n | { type: 'focusFirst' }\n /** @humanOnly */\n | { type: 'focusLast' }\n /** @humanOnly */\n | { type: 'setVisibleItems'; ids: string[]; labels?: string[] }\n /** @humanOnly */\n | { type: 'typeahead'; char: string; now: number }\n /** @humanOnly */\n | { type: 'arrowLeftFrom'; id: string; isBranch: boolean; parentId: string | null }\n /** @humanOnly */\n | { type: 'arrowRightFrom'; id: string }\n /** @intent(\"Toggle the checkbox on the item with the given id (descendantIds drives recursive check)\") */\n | { type: 'toggleChecked'; id: string; descendantIds?: string[] }\n /** @intent(\"Replace the checked-id set with the provided list\") */\n | { type: 'setChecked'; ids: string[] }\n /** @humanOnly */\n | { type: 'setIndeterminate'; ids: string[] }\n /** @intent(\"Begin renaming the item with the given id (seeds the rename input with `initial`)\") */\n | { type: 'renameStart'; id: string; initial: string }\n /** @intent(\"Update the rename draft as the user types\") */\n | { type: 'renameChange'; value: string }\n /** @intent(\"Commit the in-progress rename (clears the rename state)\") */\n | { type: 'renameCommit' }\n /** @intent(\"Cancel the in-progress rename without applying changes\") */\n | { type: 'renameCancel' }\n /** @intent(\"Mark the branch with the given id as loading children (typically before an async fetch)\") */\n | { type: 'loadingStart'; id: string }\n /** @intent(\"Clear the loading state for the given branch id (after async fetch completes)\") */\n | { type: 'loadingEnd'; id: string }\n\nexport interface TreeViewInit {\n expanded?: string[]\n selected?: string[]\n checked?: string[]\n indeterminate?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n visibleItems?: string[]\n visibleLabels?: string[]\n}\n\nexport function init(opts: TreeViewInit = {}): TreeViewState {\n return {\n expanded: opts.expanded ?? [],\n selected: opts.selected ?? [],\n checked: opts.checked ?? [],\n indeterminate: opts.indeterminate ?? [],\n focused: null,\n selectionMode: opts.selectionMode ?? 'single',\n visibleItems: opts.visibleItems ?? [],\n visibleLabels: opts.visibleLabels ?? [],\n disabled: opts.disabled ?? false,\n typeahead: '',\n typeaheadExpiresAt: 0,\n renaming: null,\n renameDraft: '',\n loading: [],\n }\n}\n\nexport function update(state: TreeViewState, msg: TreeViewMsg): [TreeViewState, never[]] {\n if (state.disabled && msg.type !== 'setVisibleItems') return [state, []]\n switch (msg.type) {\n case 'toggleBranch': {\n const expanded = state.expanded.includes(msg.id)\n ? state.expanded.filter((id) => id !== msg.id)\n : [...state.expanded, msg.id]\n return [{ ...state, expanded }, []]\n }\n case 'expand':\n if (state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n case 'collapse':\n if (!state.expanded.includes(msg.id)) return [state, []]\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n case 'expandAll':\n return [{ ...state, expanded: msg.ids }, []]\n case 'collapseAll':\n return [{ ...state, expanded: [] }, []]\n case 'select': {\n if (state.selectionMode === 'single') {\n return [{ ...state, selected: [msg.id] }, []]\n }\n if (msg.additive) {\n const isSelected = state.selected.includes(msg.id)\n const selected = isSelected\n ? state.selected.filter((id) => id !== msg.id)\n : [...state.selected, msg.id]\n return [{ ...state, selected }, []]\n }\n return [{ ...state, selected: [msg.id] }, []]\n }\n case 'setSelected':\n return [{ ...state, selected: msg.ids }, []]\n case 'focus':\n return [{ ...state, focused: msg.id }, []]\n case 'focusNext': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused ? state.visibleItems.indexOf(state.focused) : -1\n const next = state.visibleItems[Math.min(idx + 1, state.visibleItems.length - 1)]\n return [{ ...state, focused: next ?? state.focused }, []]\n }\n case 'focusPrev': {\n if (state.visibleItems.length === 0) return [state, []]\n const idx = state.focused\n ? state.visibleItems.indexOf(state.focused)\n : state.visibleItems.length\n const prev = state.visibleItems[Math.max(0, idx - 1)]\n return [{ ...state, focused: prev ?? state.focused }, []]\n }\n case 'focusFirst':\n return [{ ...state, focused: state.visibleItems[0] ?? null }, []]\n case 'focusLast':\n return [{ ...state, focused: state.visibleItems[state.visibleItems.length - 1] ?? null }, []]\n case 'setVisibleItems':\n return [\n { ...state, visibleItems: msg.ids, visibleLabels: msg.labels ?? state.visibleLabels },\n [],\n ]\n case 'arrowLeftFrom': {\n // If this is an expanded branch, collapse it and stay focused.\n if (msg.isBranch && state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: state.expanded.filter((id) => id !== msg.id) }, []]\n }\n // Otherwise, move focus to parent if provided (WAI-ARIA).\n if (msg.parentId !== null) {\n return [{ ...state, focused: msg.parentId }, []]\n }\n return [state, []]\n }\n case 'arrowRightFrom': {\n // If this branch is closed, expand it; otherwise focus the first\n // visible child (the next item in depth-first visibleItems order).\n if (!state.expanded.includes(msg.id)) {\n return [{ ...state, expanded: [...state.expanded, msg.id] }, []]\n }\n const idx = state.visibleItems.indexOf(msg.id)\n if (idx === -1 || idx === state.visibleItems.length - 1) return [state, []]\n const next = state.visibleItems[idx + 1]!\n return [{ ...state, focused: next }, []]\n }\n case 'typeahead': {\n if (state.visibleItems.length === 0) return [state, []]\n const acc = typeaheadAccumulate(state.typeahead, msg.char, msg.now, state.typeaheadExpiresAt)\n // Fall back to matching ids if labels weren't provided.\n const labels = state.visibleLabels.length > 0 ? state.visibleLabels : state.visibleItems\n const disabledMask = new Array<boolean>(labels.length).fill(false)\n const startIdx = state.focused ? state.visibleItems.indexOf(state.focused) : null\n const matchIdx = typeaheadMatch(labels, disabledMask, acc, startIdx)\n const focused =\n matchIdx === null ? state.focused : (state.visibleItems[matchIdx] ?? state.focused)\n return [\n { ...state, typeahead: acc, typeaheadExpiresAt: msg.now + TYPEAHEAD_TIMEOUT_MS, focused },\n [],\n ]\n }\n case 'toggleChecked': {\n // Toggle the item's checked state, propagating to descendants if any.\n // The caller passes `descendantIds` for branches; for leaves, pass\n // an empty list or omit. Indeterminate flag is cleared on the id\n // (a deliberate toggle is a definite state). The caller is\n // responsible for recomputing `indeterminate` on ancestors via\n // setIndeterminate after this message.\n const desc = msg.descendantIds ?? []\n const all = [msg.id, ...desc]\n const isChecked = state.checked.includes(msg.id)\n const next = isChecked\n ? state.checked.filter((id) => !all.includes(id))\n : Array.from(new Set([...state.checked, ...all]))\n const indeterminate = state.indeterminate.filter((id) => !all.includes(id))\n return [{ ...state, checked: next, indeterminate }, []]\n }\n case 'setChecked':\n return [{ ...state, checked: msg.ids }, []]\n case 'setIndeterminate':\n return [{ ...state, indeterminate: msg.ids }, []]\n case 'renameStart':\n return [{ ...state, renaming: msg.id, renameDraft: msg.initial }, []]\n case 'renameChange':\n return [{ ...state, renameDraft: msg.value }, []]\n case 'renameCommit':\n case 'renameCancel':\n return [{ ...state, renaming: null, renameDraft: '' }, []]\n case 'loadingStart':\n if (state.loading.includes(msg.id)) return [state, []]\n return [{ ...state, loading: [...state.loading, msg.id] }, []]\n case 'loadingEnd':\n return [{ ...state, loading: state.loading.filter((id) => id !== msg.id) }, []]\n }\n}\n\nexport function isExpanded(state: TreeViewState, id: string): boolean {\n return state.expanded.includes(id)\n}\n\nexport function isSelected(state: TreeViewState, id: string): boolean {\n return state.selected.includes(id)\n}\n\nexport function isChecked(state: TreeViewState, id: string): boolean {\n return state.checked.includes(id)\n}\n\nexport function isIndeterminate(state: TreeViewState, id: string): boolean {\n return state.indeterminate.includes(id)\n}\n\nexport function isRenaming(state: TreeViewState, id: string): boolean {\n return state.renaming === id\n}\n\nexport function isLoading(state: TreeViewState, id: string): boolean {\n return state.loading.includes(id)\n}\n\nexport interface TreeItemParts<S> {\n item: {\n role: 'treeitem'\n id: string\n 'aria-expanded': (s: S) => boolean | undefined\n 'aria-selected': (s: S) => boolean | undefined\n 'aria-level': number\n 'aria-busy': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'tree-view'\n 'data-part': 'item'\n 'data-value': string\n 'data-depth': string\n 'data-selected': (s: S) => '' | undefined\n 'data-focused': (s: S) => '' | undefined\n 'data-loading': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n /** For branch items — expand/collapse disclosure trigger. */\n branchTrigger: {\n 'data-scope': 'tree-view'\n 'data-part': 'branch-trigger'\n 'data-state': (s: S) => 'open' | 'closed'\n onClick: (e: MouseEvent) => void\n }\n /**\n * Checkbox element (only meaningful when `selectionMode === 'checkbox'`).\n * `aria-checked` is the tri-state string ('true' | 'false' | 'mixed').\n * The consumer must render a checkbox input or a visual proxy and\n * dispatch `toggleChecked` via the `onClick` binding. For branches,\n * pass the branch's descendant ids via `descendantIds` on the message\n * so children are propagated in a single reducer step.\n */\n checkbox: {\n role: 'checkbox'\n 'aria-checked': (s: S) => 'true' | 'false' | 'mixed'\n 'data-scope': 'tree-view'\n 'data-part': 'checkbox'\n 'data-state': (s: S) => 'checked' | 'unchecked' | 'indeterminate'\n }\n}\n\nexport interface TreeViewParts<S> {\n root: {\n role: 'tree'\n 'aria-owns': (s: S) => string | undefined\n 'aria-multiselectable': (s: S) => 'true' | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'tree-view'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n item: (id: string, depth: number, isBranch: boolean, parentId?: string | null) => TreeItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * If true, clicking anywhere on a branch item (not just the disclosure\n * caret) toggles its expanded state. Default: false — clicks on the row\n * select it without toggling, consistent with most file-tree UIs.\n */\n expandOnClick?: boolean\n}\n\nexport function connect<S>(\n get: (s: S) => TreeViewState,\n send: Send<TreeViewMsg>,\n opts: ConnectOptions,\n): TreeViewParts<S> {\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n const expandOnClick = opts.expandOnClick === true\n\n return {\n root: {\n role: 'tree',\n 'aria-owns': (s) => {\n const items = get(s).visibleItems\n if (items.length === 0) return undefined\n return items.map((id) => itemId(id)).join(' ')\n },\n 'aria-multiselectable': (s) => (get(s).selectionMode === 'multiple' ? 'true' : undefined),\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'tree-view',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n item: (\n id: string,\n depth: number,\n isBranch: boolean,\n parentId: string | null = null,\n ): TreeItemParts<S> => ({\n item: {\n role: 'treeitem',\n id: itemId(id),\n 'aria-expanded': (s) => (isBranch ? isExpanded(get(s), id) : undefined),\n 'aria-selected': (s) =>\n get(s).selectionMode === 'single' ? isSelected(get(s), id) : undefined,\n 'aria-level': depth + 1,\n 'aria-busy': (s) => (isLoading(get(s), id) ? 'true' : undefined),\n tabIndex: (s) => (get(s).focused === id ? 0 : -1),\n 'data-scope': 'tree-view',\n 'data-part': 'item',\n 'data-value': id,\n 'data-depth': String(depth),\n 'data-selected': (s) => (isSelected(get(s), id) ? '' : undefined),\n 'data-focused': (s) => (get(s).focused === id ? '' : undefined),\n 'data-loading': (s) => (isLoading(get(s), id) ? '' : undefined),\n onClick: tagSend(send, ['select', 'toggleBranch'], (e) => {\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (expandOnClick && isBranch) send({ type: 'toggleBranch', id })\n }),\n onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', id })),\n onKeyDown: tagSend(\n send,\n [\n 'focusNext',\n 'focusPrev',\n 'arrowRightFrom',\n 'arrowLeftFrom',\n 'focusFirst',\n 'focusLast',\n 'select',\n 'toggleBranch',\n 'typeahead',\n ],\n (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev' })\n return\n case 'ArrowRight':\n // WAI-ARIA: closed branch → expand (stay); open branch →\n // focus first child. Leaf → nothing. The reducer decides\n // based on current expanded state.\n if (!isBranch) return\n e.preventDefault()\n send({ type: 'arrowRightFrom', id })\n return\n case 'ArrowLeft':\n // WAI-ARIA: open branch → collapse (stay); closed branch or\n // leaf → focus parent (if known). Root end-nodes → nothing.\n e.preventDefault()\n send({ type: 'arrowLeftFrom', id, isBranch, parentId })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'select', id, additive: e.metaKey || e.ctrlKey })\n if (isBranch) send({ type: 'toggleBranch', id })\n return\n default:\n if (isTypeaheadKey(e)) {\n send({ type: 'typeahead', char: e.key, now: Date.now() })\n }\n }\n },\n ),\n },\n branchTrigger: {\n 'data-scope': 'tree-view',\n 'data-part': 'branch-trigger',\n 'data-state': (s) => (isExpanded(get(s), id) ? 'open' : 'closed'),\n onClick: tagSend(send, ['toggleBranch'], (e) => {\n e.stopPropagation()\n send({ type: 'toggleBranch', id })\n }),\n },\n checkbox: {\n role: 'checkbox',\n 'aria-checked': (s) => {\n if (isIndeterminate(get(s), id)) return 'mixed'\n return isChecked(get(s), id) ? 'true' : 'false'\n },\n 'data-scope': 'tree-view',\n 'data-part': 'checkbox',\n 'data-state': (s) => {\n if (isIndeterminate(get(s), id)) return 'indeterminate'\n return isChecked(get(s), id) ? 'checked' : 'unchecked'\n },\n },\n }),\n }\n}\n\nexport const treeView = {\n init,\n update,\n connect,\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isRenaming,\n isLoading,\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llui/components",
3
- "version": "0.0.30",
3
+ "version": "0.0.33",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -457,12 +457,12 @@
457
457
  }
458
458
  },
459
459
  "peerDependencies": {
460
- "@llui/dom": "^0.0.30"
460
+ "@llui/dom": "^0.0.33"
461
461
  },
462
462
  "devDependencies": {
463
463
  "typescript": "^6.0.0",
464
464
  "vitest": "^4.1.2",
465
- "@llui/dom": "0.0.30"
465
+ "@llui/dom": "0.0.33"
466
466
  },
467
467
  "sideEffects": [
468
468
  "./dist/styles/theme.css",