@sectile/core 0.2.0 → 0.3.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 (377) hide show
  1. package/dist/accordion.d.ts +44 -0
  2. package/dist/accordion.d.ts.map +1 -0
  3. package/dist/accordion.js +87 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/alert-dialog.d.ts +19 -0
  6. package/dist/alert-dialog.d.ts.map +1 -0
  7. package/dist/alert-dialog.js +10 -0
  8. package/dist/alert-dialog.js.map +1 -0
  9. package/dist/calendar.d.ts +3 -0
  10. package/dist/calendar.d.ts.map +1 -0
  11. package/dist/calendar.js +3 -0
  12. package/dist/calendar.js.map +1 -0
  13. package/dist/carousel.d.ts +41 -0
  14. package/dist/carousel.d.ts.map +1 -0
  15. package/dist/carousel.js +55 -0
  16. package/dist/carousel.js.map +1 -0
  17. package/dist/cascade-select.d.ts +48 -0
  18. package/dist/cascade-select.d.ts.map +1 -0
  19. package/dist/cascade-select.js +148 -0
  20. package/dist/cascade-select.js.map +1 -0
  21. package/dist/checkbox-group.d.ts +13 -0
  22. package/dist/checkbox-group.d.ts.map +1 -0
  23. package/dist/checkbox-group.js +16 -0
  24. package/dist/checkbox-group.js.map +1 -0
  25. package/dist/checkbox.d.ts +3 -0
  26. package/dist/checkbox.d.ts.map +1 -0
  27. package/dist/checkbox.js +3 -0
  28. package/dist/checkbox.js.map +1 -0
  29. package/dist/collection-window.d.ts +51 -0
  30. package/dist/collection-window.d.ts.map +1 -0
  31. package/dist/collection-window.js +111 -0
  32. package/dist/collection-window.js.map +1 -0
  33. package/dist/color-picker.d.ts +101 -0
  34. package/dist/color-picker.d.ts.map +1 -0
  35. package/dist/color-picker.js +503 -0
  36. package/dist/color-picker.js.map +1 -0
  37. package/dist/combobox.d.ts +17 -0
  38. package/dist/combobox.d.ts.map +1 -0
  39. package/dist/combobox.js +46 -0
  40. package/dist/combobox.js.map +1 -0
  41. package/dist/date-field.d.ts +62 -0
  42. package/dist/date-field.d.ts.map +1 -0
  43. package/dist/date-field.js +245 -0
  44. package/dist/date-field.js.map +1 -0
  45. package/dist/date-picker.d.ts +76 -0
  46. package/dist/date-picker.d.ts.map +1 -0
  47. package/dist/date-picker.js +261 -0
  48. package/dist/date-picker.js.map +1 -0
  49. package/dist/date-range-field.d.ts +47 -0
  50. package/dist/date-range-field.d.ts.map +1 -0
  51. package/dist/date-range-field.js +66 -0
  52. package/dist/date-range-field.js.map +1 -0
  53. package/dist/date-range-picker.d.ts +29 -0
  54. package/dist/date-range-picker.d.ts.map +1 -0
  55. package/dist/date-range-picker.js +89 -0
  56. package/dist/date-range-picker.js.map +1 -0
  57. package/dist/date-time-field.d.ts +57 -0
  58. package/dist/date-time-field.d.ts.map +1 -0
  59. package/dist/date-time-field.js +267 -0
  60. package/dist/date-time-field.js.map +1 -0
  61. package/dist/date-time-picker.d.ts +71 -0
  62. package/dist/date-time-picker.d.ts.map +1 -0
  63. package/dist/date-time-picker.js +156 -0
  64. package/dist/date-time-picker.js.map +1 -0
  65. package/dist/date-time-range-picker.d.ts +87 -0
  66. package/dist/date-time-range-picker.d.ts.map +1 -0
  67. package/dist/date-time-range-picker.js +252 -0
  68. package/dist/date-time-range-picker.js.map +1 -0
  69. package/dist/dialog.d.ts +17 -0
  70. package/dist/dialog.d.ts.map +1 -0
  71. package/dist/dialog.js +6 -0
  72. package/dist/dialog.js.map +1 -0
  73. package/dist/disclosure.d.ts +3 -0
  74. package/dist/disclosure.d.ts.map +1 -0
  75. package/dist/disclosure.js +3 -0
  76. package/dist/disclosure.js.map +1 -0
  77. package/dist/drawer.d.ts +24 -0
  78. package/dist/drawer.d.ts.map +1 -0
  79. package/dist/drawer.js +36 -0
  80. package/dist/drawer.js.map +1 -0
  81. package/dist/editable.d.ts +29 -0
  82. package/dist/editable.d.ts.map +1 -0
  83. package/dist/editable.js +34 -0
  84. package/dist/editable.js.map +1 -0
  85. package/dist/feed.d.ts +49 -0
  86. package/dist/feed.d.ts.map +1 -0
  87. package/dist/feed.js +124 -0
  88. package/dist/feed.js.map +1 -0
  89. package/dist/form.d.ts +135 -0
  90. package/dist/form.d.ts.map +1 -0
  91. package/dist/form.js +627 -0
  92. package/dist/form.js.map +1 -0
  93. package/dist/index.d.ts +37 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +2 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/interaction.d.ts +15 -0
  98. package/dist/interaction.d.ts.map +1 -0
  99. package/dist/interaction.js +42 -0
  100. package/dist/interaction.js.map +1 -0
  101. package/dist/internal/composites/calendar.d.ts +36 -0
  102. package/dist/internal/composites/calendar.d.ts.map +1 -0
  103. package/dist/internal/composites/calendar.js +143 -0
  104. package/dist/internal/composites/calendar.js.map +1 -0
  105. package/dist/internal/composites/combobox.d.ts +42 -0
  106. package/dist/internal/composites/combobox.d.ts.map +1 -0
  107. package/dist/internal/composites/combobox.js +188 -0
  108. package/dist/internal/composites/combobox.js.map +1 -0
  109. package/dist/internal/composites/grid-control.d.ts +37 -0
  110. package/dist/internal/composites/grid-control.d.ts.map +1 -0
  111. package/dist/internal/composites/grid-control.js +90 -0
  112. package/dist/internal/composites/grid-control.js.map +1 -0
  113. package/dist/internal/composites/linear-action.d.ts +36 -0
  114. package/dist/internal/composites/linear-action.d.ts.map +1 -0
  115. package/dist/internal/composites/linear-action.js +96 -0
  116. package/dist/internal/composites/linear-action.js.map +1 -0
  117. package/dist/internal/composites/linear-choice.d.ts +41 -0
  118. package/dist/internal/composites/linear-choice.d.ts.map +1 -0
  119. package/dist/internal/composites/linear-choice.js +139 -0
  120. package/dist/internal/composites/linear-choice.js.map +1 -0
  121. package/dist/internal/composites/listbox.d.ts +52 -0
  122. package/dist/internal/composites/listbox.d.ts.map +1 -0
  123. package/dist/internal/composites/listbox.js +251 -0
  124. package/dist/internal/composites/listbox.js.map +1 -0
  125. package/dist/internal/composites/menu.d.ts +29 -0
  126. package/dist/internal/composites/menu.d.ts.map +1 -0
  127. package/dist/internal/composites/menu.js +76 -0
  128. package/dist/internal/composites/menu.js.map +1 -0
  129. package/dist/internal/composites/popup.d.ts +21 -0
  130. package/dist/internal/composites/popup.d.ts.map +1 -0
  131. package/dist/internal/composites/popup.js +10 -0
  132. package/dist/internal/composites/popup.js.map +1 -0
  133. package/dist/internal/composites/slider.d.ts +21 -0
  134. package/dist/internal/composites/slider.d.ts.map +1 -0
  135. package/dist/internal/composites/slider.js +73 -0
  136. package/dist/internal/composites/slider.js.map +1 -0
  137. package/dist/internal/composites/tree-grid.d.ts +67 -0
  138. package/dist/internal/composites/tree-grid.d.ts.map +1 -0
  139. package/dist/internal/composites/tree-grid.js +281 -0
  140. package/dist/internal/composites/tree-grid.js.map +1 -0
  141. package/dist/internal/composites/tree-view.d.ts +42 -0
  142. package/dist/internal/composites/tree-view.d.ts.map +1 -0
  143. package/dist/internal/composites/tree-view.js +196 -0
  144. package/dist/internal/composites/tree-view.js.map +1 -0
  145. package/dist/internal/editing/text.d.ts +66 -0
  146. package/dist/internal/editing/text.d.ts.map +1 -0
  147. package/dist/internal/editing/text.js +248 -0
  148. package/dist/internal/editing/text.js.map +1 -0
  149. package/dist/internal/kernel/decimal.d.ts +22 -0
  150. package/dist/internal/kernel/decimal.d.ts.map +1 -0
  151. package/dist/internal/kernel/decimal.js +137 -0
  152. package/dist/internal/kernel/decimal.js.map +1 -0
  153. package/dist/internal/kernel/foundation.d.ts +12 -0
  154. package/dist/internal/kernel/foundation.d.ts.map +1 -0
  155. package/dist/internal/kernel/foundation.js +132 -0
  156. package/dist/internal/kernel/foundation.js.map +1 -0
  157. package/dist/internal/kernel/indexed-sequence.d.ts +26 -0
  158. package/dist/internal/kernel/indexed-sequence.d.ts.map +1 -0
  159. package/dist/internal/kernel/indexed-sequence.js +117 -0
  160. package/dist/internal/kernel/indexed-sequence.js.map +1 -0
  161. package/dist/internal/kernel/machine.d.ts +8 -0
  162. package/dist/internal/kernel/machine.d.ts.map +1 -0
  163. package/dist/internal/kernel/machine.js +6 -0
  164. package/dist/internal/kernel/machine.js.map +1 -0
  165. package/dist/internal/runtime/revision.d.ts +23 -0
  166. package/dist/internal/runtime/revision.d.ts.map +1 -0
  167. package/dist/internal/runtime/revision.js +76 -0
  168. package/dist/internal/runtime/revision.js.map +1 -0
  169. package/dist/internal/state/checked.d.ts +22 -0
  170. package/dist/internal/state/checked.d.ts.map +1 -0
  171. package/dist/internal/state/checked.js +33 -0
  172. package/dist/internal/state/checked.js.map +1 -0
  173. package/dist/internal/state/cursor.d.ts +13 -0
  174. package/dist/internal/state/cursor.d.ts.map +1 -0
  175. package/dist/internal/state/cursor.js +24 -0
  176. package/dist/internal/state/cursor.js.map +1 -0
  177. package/dist/internal/state/expansion.d.ts +8 -0
  178. package/dist/internal/state/expansion.d.ts.map +1 -0
  179. package/dist/internal/state/expansion.js +23 -0
  180. package/dist/internal/state/expansion.js.map +1 -0
  181. package/dist/internal/state/open-state.d.ts +17 -0
  182. package/dist/internal/state/open-state.d.ts.map +1 -0
  183. package/dist/internal/state/open-state.js +29 -0
  184. package/dist/internal/state/open-state.js.map +1 -0
  185. package/dist/internal/state/selection.d.ts +23 -0
  186. package/dist/internal/state/selection.d.ts.map +1 -0
  187. package/dist/internal/state/selection.js +110 -0
  188. package/dist/internal/state/selection.js.map +1 -0
  189. package/dist/layer-stack.d.ts +47 -0
  190. package/dist/layer-stack.d.ts.map +1 -0
  191. package/dist/layer-stack.js +115 -0
  192. package/dist/layer-stack.js.map +1 -0
  193. package/dist/listbox.d.ts +3 -0
  194. package/dist/listbox.d.ts.map +1 -0
  195. package/dist/listbox.js +3 -0
  196. package/dist/listbox.js.map +1 -0
  197. package/dist/menu-button.d.ts +5 -0
  198. package/dist/menu-button.d.ts.map +1 -0
  199. package/dist/menu-button.js +5 -0
  200. package/dist/menu-button.js.map +1 -0
  201. package/dist/menu.d.ts +10 -0
  202. package/dist/menu.d.ts.map +1 -0
  203. package/dist/menu.js +9 -0
  204. package/dist/menu.js.map +1 -0
  205. package/dist/menubar.d.ts +5 -0
  206. package/dist/menubar.d.ts.map +1 -0
  207. package/dist/menubar.js +5 -0
  208. package/dist/menubar.js.map +1 -0
  209. package/dist/month-picker.d.ts +5 -0
  210. package/dist/month-picker.d.ts.map +1 -0
  211. package/dist/month-picker.js +4 -0
  212. package/dist/month-picker.js.map +1 -0
  213. package/dist/month-range-picker.d.ts +6 -0
  214. package/dist/month-range-picker.d.ts.map +1 -0
  215. package/dist/month-range-picker.js +5 -0
  216. package/dist/month-range-picker.js.map +1 -0
  217. package/dist/multi-thumb-slider.d.ts +36 -0
  218. package/dist/multi-thumb-slider.d.ts.map +1 -0
  219. package/dist/multi-thumb-slider.js +72 -0
  220. package/dist/multi-thumb-slider.js.map +1 -0
  221. package/dist/navigation-menu.d.ts +6 -0
  222. package/dist/navigation-menu.d.ts.map +1 -0
  223. package/dist/navigation-menu.js +5 -0
  224. package/dist/navigation-menu.js.map +1 -0
  225. package/dist/number-field.d.ts +51 -0
  226. package/dist/number-field.d.ts.map +1 -0
  227. package/dist/number-field.js +461 -0
  228. package/dist/number-field.js.map +1 -0
  229. package/dist/pagination.d.ts +65 -0
  230. package/dist/pagination.d.ts.map +1 -0
  231. package/dist/pagination.js +197 -0
  232. package/dist/pagination.js.map +1 -0
  233. package/dist/pin-input.d.ts +31 -0
  234. package/dist/pin-input.d.ts.map +1 -0
  235. package/dist/pin-input.js +53 -0
  236. package/dist/pin-input.js.map +1 -0
  237. package/dist/popover.d.ts +17 -0
  238. package/dist/popover.d.ts.map +1 -0
  239. package/dist/popover.js +6 -0
  240. package/dist/popover.js.map +1 -0
  241. package/dist/quantity-field.d.ts +59 -0
  242. package/dist/quantity-field.d.ts.map +1 -0
  243. package/dist/quantity-field.js +254 -0
  244. package/dist/quantity-field.js.map +1 -0
  245. package/dist/radio-group.d.ts +23 -0
  246. package/dist/radio-group.d.ts.map +1 -0
  247. package/dist/radio-group.js +20 -0
  248. package/dist/radio-group.js.map +1 -0
  249. package/dist/range-calendar.d.ts +6 -0
  250. package/dist/range-calendar.d.ts.map +1 -0
  251. package/dist/range-calendar.js +5 -0
  252. package/dist/range-calendar.js.map +1 -0
  253. package/dist/rating.d.ts +18 -0
  254. package/dist/rating.d.ts.map +1 -0
  255. package/dist/rating.js +19 -0
  256. package/dist/rating.js.map +1 -0
  257. package/dist/reorder.d.ts +47 -0
  258. package/dist/reorder.d.ts.map +1 -0
  259. package/dist/reorder.js +110 -0
  260. package/dist/reorder.js.map +1 -0
  261. package/dist/result.d.ts +10 -0
  262. package/dist/result.d.ts.map +1 -0
  263. package/dist/result.js +19 -0
  264. package/dist/result.js.map +1 -0
  265. package/dist/revision.d.ts +3 -0
  266. package/dist/revision.d.ts.map +1 -0
  267. package/dist/revision.js +3 -0
  268. package/dist/revision.js.map +1 -0
  269. package/dist/select.d.ts +31 -0
  270. package/dist/select.d.ts.map +1 -0
  271. package/dist/select.js +32 -0
  272. package/dist/select.js.map +1 -0
  273. package/dist/shared.d.ts +43 -0
  274. package/dist/shared.d.ts.map +1 -0
  275. package/dist/shared.js +3 -0
  276. package/dist/shared.js.map +1 -0
  277. package/dist/slider.d.ts +3 -0
  278. package/dist/slider.d.ts.map +1 -0
  279. package/dist/slider.js +3 -0
  280. package/dist/slider.js.map +1 -0
  281. package/dist/spin-button.d.ts +31 -0
  282. package/dist/spin-button.d.ts.map +1 -0
  283. package/dist/spin-button.js +65 -0
  284. package/dist/spin-button.js.map +1 -0
  285. package/dist/stepper.d.ts +18 -0
  286. package/dist/stepper.d.ts.map +1 -0
  287. package/dist/stepper.js +16 -0
  288. package/dist/stepper.js.map +1 -0
  289. package/dist/structures/grid.d.ts +29 -0
  290. package/dist/structures/grid.d.ts.map +1 -0
  291. package/dist/structures/grid.js +202 -0
  292. package/dist/structures/grid.js.map +1 -0
  293. package/dist/structures/range.d.ts +41 -0
  294. package/dist/structures/range.d.ts.map +1 -0
  295. package/dist/structures/range.js +249 -0
  296. package/dist/structures/range.js.map +1 -0
  297. package/dist/structures/sequence.d.ts +19 -0
  298. package/dist/structures/sequence.d.ts.map +1 -0
  299. package/dist/structures/sequence.js +28 -0
  300. package/dist/structures/sequence.js.map +1 -0
  301. package/dist/structures/tree.d.ts +33 -0
  302. package/dist/structures/tree.d.ts.map +1 -0
  303. package/dist/structures/tree.js +238 -0
  304. package/dist/structures/tree.js.map +1 -0
  305. package/dist/switch.d.ts +21 -0
  306. package/dist/switch.d.ts.map +1 -0
  307. package/dist/switch.js +8 -0
  308. package/dist/switch.js.map +1 -0
  309. package/dist/tabs.d.ts +16 -0
  310. package/dist/tabs.d.ts.map +1 -0
  311. package/dist/tabs.js +27 -0
  312. package/dist/tabs.js.map +1 -0
  313. package/dist/tags-input.d.ts +43 -0
  314. package/dist/tags-input.d.ts.map +1 -0
  315. package/dist/tags-input.js +48 -0
  316. package/dist/tags-input.js.map +1 -0
  317. package/dist/text.d.ts +4 -0
  318. package/dist/text.d.ts.map +1 -0
  319. package/dist/text.js +4 -0
  320. package/dist/text.js.map +1 -0
  321. package/dist/time-field.d.ts +48 -0
  322. package/dist/time-field.d.ts.map +1 -0
  323. package/dist/time-field.js +157 -0
  324. package/dist/time-field.js.map +1 -0
  325. package/dist/time-range-field.d.ts +53 -0
  326. package/dist/time-range-field.d.ts.map +1 -0
  327. package/dist/time-range-field.js +75 -0
  328. package/dist/time-range-field.js.map +1 -0
  329. package/dist/timer.d.ts +37 -0
  330. package/dist/timer.d.ts.map +1 -0
  331. package/dist/timer.js +84 -0
  332. package/dist/timer.js.map +1 -0
  333. package/dist/toast.d.ts +56 -0
  334. package/dist/toast.d.ts.map +1 -0
  335. package/dist/toast.js +87 -0
  336. package/dist/toast.js.map +1 -0
  337. package/dist/toggle-button.d.ts +20 -0
  338. package/dist/toggle-button.d.ts.map +1 -0
  339. package/dist/toggle-button.js +20 -0
  340. package/dist/toggle-button.js.map +1 -0
  341. package/dist/toggle-group.d.ts +25 -0
  342. package/dist/toggle-group.d.ts.map +1 -0
  343. package/dist/toggle-group.js +30 -0
  344. package/dist/toggle-group.js.map +1 -0
  345. package/dist/toolbar.d.ts +3 -0
  346. package/dist/toolbar.d.ts.map +1 -0
  347. package/dist/toolbar.js +3 -0
  348. package/dist/toolbar.js.map +1 -0
  349. package/dist/tooltip.d.ts +3 -0
  350. package/dist/tooltip.d.ts.map +1 -0
  351. package/dist/tooltip.js +3 -0
  352. package/dist/tooltip.js.map +1 -0
  353. package/dist/tree-grid.d.ts +13 -0
  354. package/dist/tree-grid.d.ts.map +1 -0
  355. package/dist/tree-grid.js +20 -0
  356. package/dist/tree-grid.js.map +1 -0
  357. package/dist/tree-view.d.ts +3 -0
  358. package/dist/tree-view.d.ts.map +1 -0
  359. package/dist/tree-view.js +3 -0
  360. package/dist/tree-view.js.map +1 -0
  361. package/dist/units.d.ts +77 -0
  362. package/dist/units.d.ts.map +1 -0
  363. package/dist/units.js +512 -0
  364. package/dist/units.js.map +1 -0
  365. package/dist/window-splitter.d.ts +3 -0
  366. package/dist/window-splitter.d.ts.map +1 -0
  367. package/dist/window-splitter.js +3 -0
  368. package/dist/window-splitter.js.map +1 -0
  369. package/dist/year-picker.d.ts +10 -0
  370. package/dist/year-picker.d.ts.map +1 -0
  371. package/dist/year-picker.js +27 -0
  372. package/dist/year-picker.js.map +1 -0
  373. package/dist/year-range-picker.d.ts +6 -0
  374. package/dist/year-range-picker.d.ts.map +1 -0
  375. package/dist/year-range-picker.js +5 -0
  376. package/dist/year-range-picker.js.map +1 -0
  377. package/package.json +7 -2
@@ -0,0 +1,75 @@
1
+ import { unwrap } from './result.js';
2
+ import { fail, ok } from './internal/kernel/foundation.js';
3
+ import { createMachineUpdate } from './internal/kernel/machine.js';
4
+ import { applyTimeFieldEvent, compareTimeValues, createTimeFieldState, createTimeValue, tryCreateTimeFieldState, tryCreateTimeValue } from './time-field.js';
5
+ export function createTimeRange(start, end) {
6
+ return unwrap(tryCreateTimeRange(start, end));
7
+ }
8
+ export function tryCreateTimeRange(start, end) {
9
+ const validStart = tryCreateTimeValue(start.hour, start.minute, start.second, start.millisecond);
10
+ if (!validStart.ok)
11
+ return validStart;
12
+ const validEnd = tryCreateTimeValue(end.hour, end.minute, end.second, end.millisecond);
13
+ if (!validEnd.ok)
14
+ return validEnd;
15
+ return compareTimeValues(validStart.value, validEnd.value) <= 0 ? ok(Object.freeze({ start: validStart.value, end: validEnd.value })) : fail('construction', 'inverted-time-range', 'Time range start must not be after end.');
16
+ }
17
+ export function createTimeRangeFieldState(input = {}) {
18
+ return unwrap(tryCreateTimeRangeFieldState(input));
19
+ }
20
+ export function tryCreateTimeRangeFieldState(input = {}) {
21
+ const range = input.value === undefined || input.value === null ? ok(null) : completeRange(input.value.start, input.value.end, 'construction');
22
+ if (!range.ok)
23
+ return range;
24
+ const startValue = input.startValue !== undefined ? input.startValue : range.value?.start ?? null;
25
+ const endValue = input.endValue !== undefined ? input.endValue : range.value?.end ?? null;
26
+ const start = tryCreateTimeFieldState(startValue, input.startInputState);
27
+ if (!start.ok)
28
+ return start;
29
+ const end = tryCreateTimeFieldState(endValue, input.endInputState);
30
+ if (!end.ok)
31
+ return end;
32
+ const value = completeRange(start.value.value, end.value.value, 'construction');
33
+ if (!value.ok)
34
+ return value;
35
+ const active = input.active ?? 'start';
36
+ if (active !== 'start' && active !== 'end')
37
+ return fail('construction', 'invalid-time-range-field-endpoint', 'Time range field active endpoint must be start or end.');
38
+ return ok(Object.freeze({ value: value.value, start: start.value, end: end.value, active }));
39
+ }
40
+ export function applyTimeRangeFieldEvent(state, event, policies = {}) {
41
+ const valid = tryCreateTimeRangeFieldState({ startValue: state.start.value, endValue: state.end.value, startInputState: state.start.inputState, endInputState: state.end.inputState, active: state.active });
42
+ if (!valid.ok)
43
+ return invalidTransition(valid);
44
+ if (event === 'cancel') {
45
+ const start = applyTimeFieldEvent(valid.value.start, 'cancel', endpointPolicies(policies));
46
+ if (!start.ok)
47
+ return start;
48
+ const end = applyTimeFieldEvent(valid.value.end, 'cancel', endpointPolicies(policies));
49
+ if (!end.ok)
50
+ return end;
51
+ return composeState(start.value.state, end.value.state, valid.value.active, [{ type: 'input-state-changed', endpoint: 'start', value: start.value.state.inputState }, { type: 'input-state-changed', endpoint: 'end', value: end.value.state.inputState }]);
52
+ }
53
+ if (event.type === 'focus')
54
+ return createMachineUpdate(Object.freeze({ ...valid.value, active: event.endpoint }), [{ type: 'focus-endpoint', endpoint: event.endpoint }]);
55
+ const active = event.endpoint;
56
+ const changed = applyTimeFieldEvent(active === 'start' ? valid.value.start : valid.value.end, event.event, endpointPolicies(policies));
57
+ if (!changed.ok)
58
+ return changed;
59
+ const start = active === 'start' ? changed.value.state : valid.value.start;
60
+ const end = active === 'end' ? changed.value.state : valid.value.end;
61
+ const next = completeRange(start.value, end.value);
62
+ if (!next.ok)
63
+ return next;
64
+ const commands = changed.value.commands.filter((command) => command.type === 'input-state-changed').map((command) => ({ type: 'input-state-changed', endpoint: active, value: command.value }));
65
+ if ((event.event === 'commit' || typeof event.event === 'object' && event.event.type === 'set-value') && !sameRange(valid.value.value, next.value))
66
+ commands.push({ type: 'range-committed', value: next.value });
67
+ return composeState(start, end, active, commands);
68
+ }
69
+ function composeState(start, end, active, commands) { const value = completeRange(start.value, end.value); return value.ok ? createMachineUpdate(Object.freeze({ value: value.value, start, end, active }), commands) : value; }
70
+ function completeRange(start, end, errorClass = 'transition-rejection') { if (start === null || end === null)
71
+ return ok(null); const range = tryCreateTimeRange(start, end); return range.ok ? ok(range.value) : fail(errorClass, 'inverted-time-range-field', 'Time range field start must not be after end.'); }
72
+ function endpointPolicies(policies) { const { required: _required, ...rest } = policies; return rest; }
73
+ function sameRange(left, right) { return left === null || right === null ? left === right : compareTimeValues(left.start, right.start) === 0 && compareTimeValues(left.end, right.end) === 0; }
74
+ function invalidTransition(result) { return result.ok ? fail('internal-invariant', 'unexpected-valid-result', 'Expected an invalid result.') : { ok: false, error: { ...result.error, class: 'transition-rejection' } }; }
75
+ //# sourceMappingURL=time-range-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-range-field.js","sourceRoot":"","sources":["../src/time-range-field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Result } from './shared.js';
2
+ export interface TimerPolicies {
3
+ readonly countdown?: boolean;
4
+ readonly startMs?: number;
5
+ /** `null` leaves an elapsed timer unbounded. Countdown timers default to zero. */
6
+ readonly targetMs?: number | null;
7
+ }
8
+ export interface TimerState {
9
+ readonly valueMs: number;
10
+ readonly running: boolean;
11
+ readonly completed: boolean;
12
+ }
13
+ export type TimerEvent = 'start' | 'pause' | 'resume' | 'reset' | 'restart' | 'toggle' | {
14
+ readonly type: 'tick';
15
+ readonly elapsedMs: number;
16
+ };
17
+ export type TimerCommand = {
18
+ readonly type: 'timer-completed';
19
+ readonly valueMs: number;
20
+ };
21
+ export interface TimerUpdate {
22
+ readonly state: TimerState;
23
+ readonly commands: readonly TimerCommand[];
24
+ }
25
+ export interface TimerParts {
26
+ readonly days: number;
27
+ readonly hours: number;
28
+ readonly minutes: number;
29
+ readonly seconds: number;
30
+ readonly milliseconds: number;
31
+ }
32
+ export declare function createTimerState(policies?: TimerPolicies, valueMs?: number, running?: boolean): TimerState;
33
+ export declare function tryCreateTimerState(policies?: TimerPolicies, valueMs?: number, running?: boolean): Result<TimerState>;
34
+ export declare function applyTimerEvent(state: TimerState, event: TimerEvent, policies?: TimerPolicies): Result<TimerUpdate>;
35
+ export declare function getTimerParts(valueMs: number): Result<TimerParts>;
36
+ export declare function getTimerProgress(state: TimerState, policies?: TimerPolicies): Result<number | null>;
37
+ //# sourceMappingURL=timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AACD,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAChH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/I,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1F,MAAM,WAAW,WAAW;IAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE;AACvG,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE;AAEhK,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,aAAkB,EAAE,OAAO,GAAE,MAA8B,EAAE,OAAO,UAAQ,GAAG,UAAU,CAEnI;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,aAAkB,EAAE,OAAO,GAAE,MAA8B,EAAE,OAAO,UAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAS9I;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,aAAkB,GAAG,MAAM,CAAC,WAAW,CAAC,CAgBvH;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAUjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,aAAkB,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvG"}
package/dist/timer.js ADDED
@@ -0,0 +1,84 @@
1
+ import { unwrap } from './result.js';
2
+ import { fail, ok } from './internal/kernel/foundation.js';
3
+ export function createTimerState(policies = {}, valueMs = policies.startMs ?? 0, running = false) {
4
+ return unwrap(tryCreateTimerState(policies, valueMs, running));
5
+ }
6
+ export function tryCreateTimerState(policies = {}, valueMs = policies.startMs ?? 0, running = false) {
7
+ const valid = validatePolicies(policies);
8
+ if (!valid.ok)
9
+ return valid;
10
+ if (!Number.isFinite(valueMs) || valueMs < 0)
11
+ return fail('construction', 'timer-value-invalid', 'Timer value must be finite and non-negative.');
12
+ const target = getTarget(policies);
13
+ const completed = target !== null && valueMs === target;
14
+ if (policies.countdown === true && target !== null && valueMs < target)
15
+ return fail('construction', 'timer-value-before-target', 'Countdown value must not be below its target.');
16
+ if (policies.countdown !== true && target !== null && valueMs > target)
17
+ return fail('construction', 'timer-value-after-target', 'Elapsed timer value must not exceed its target.');
18
+ return ok(Object.freeze({ valueMs, running: running && !completed, completed }));
19
+ }
20
+ export function applyTimerEvent(state, event, policies = {}) {
21
+ const valid = tryCreateTimerState(policies, state.valueMs, state.running);
22
+ if (!valid.ok)
23
+ return fail('transition-rejection', valid.error.code, valid.error.message);
24
+ const startMs = policies.startMs ?? 0;
25
+ if (event === 'reset')
26
+ return update(Object.freeze({ valueMs: startMs, running: false, completed: isComplete(startMs, policies) }));
27
+ if (event === 'restart')
28
+ return update(Object.freeze({ valueMs: startMs, running: !isComplete(startMs, policies), completed: isComplete(startMs, policies) }));
29
+ if (event === 'pause')
30
+ return update(Object.freeze({ ...state, running: false }));
31
+ if (event === 'start' || event === 'resume')
32
+ return state.completed ? update(state) : update(Object.freeze({ ...state, running: true }));
33
+ if (event === 'toggle')
34
+ return state.completed ? update(state) : update(Object.freeze({ ...state, running: !state.running }));
35
+ if (!Number.isFinite(event.elapsedMs) || event.elapsedMs < 0)
36
+ return fail('transition-rejection', 'timer-elapsed-invalid', 'Timer elapsed time must be finite and non-negative.');
37
+ if (!state.running || event.elapsedMs === 0)
38
+ return update(state);
39
+ const target = getTarget(policies);
40
+ const raw = policies.countdown === true ? state.valueMs - event.elapsedMs : state.valueMs + event.elapsedMs;
41
+ const valueMs = policies.countdown === true ? Math.max(target ?? 0, raw) : target === null ? raw : Math.min(target, raw);
42
+ const completed = target !== null && valueMs === target;
43
+ return update(Object.freeze({ valueMs, running: !completed, completed }), completed && !state.completed ? [{ type: 'timer-completed', valueMs }] : []);
44
+ }
45
+ export function getTimerParts(valueMs) {
46
+ if (!Number.isFinite(valueMs) || valueMs < 0)
47
+ return fail('construction', 'timer-value-invalid', 'Timer value must be finite and non-negative.');
48
+ const whole = Math.floor(valueMs);
49
+ return ok(Object.freeze({
50
+ days: Math.floor(whole / 86_400_000),
51
+ hours: Math.floor(whole / 3_600_000) % 24,
52
+ minutes: Math.floor(whole / 60_000) % 60,
53
+ seconds: Math.floor(whole / 1_000) % 60,
54
+ milliseconds: whole % 1_000,
55
+ }));
56
+ }
57
+ export function getTimerProgress(state, policies = {}) {
58
+ const valid = tryCreateTimerState(policies, state.valueMs, state.running);
59
+ if (!valid.ok)
60
+ return valid;
61
+ const start = policies.startMs ?? 0;
62
+ const target = getTarget(policies);
63
+ if (target === null || target === start)
64
+ return ok(target === start ? 100 : null);
65
+ const progress = policies.countdown === true ? (start - state.valueMs) / (start - target) : (state.valueMs - start) / (target - start);
66
+ return ok(Math.max(0, Math.min(100, progress * 100)));
67
+ }
68
+ function validatePolicies(policies) {
69
+ const start = policies.startMs ?? 0;
70
+ const target = getTarget(policies);
71
+ if (!Number.isFinite(start) || start < 0)
72
+ return fail('construction', 'timer-start-invalid', 'Timer start must be finite and non-negative.');
73
+ if (target !== null && (!Number.isFinite(target) || target < 0))
74
+ return fail('construction', 'timer-target-invalid', 'Timer target must be finite and non-negative, or null.');
75
+ if (policies.countdown === true && target !== null && start < target)
76
+ return fail('construction', 'timer-countdown-order-invalid', 'Countdown start must not be below its target.');
77
+ if (policies.countdown !== true && target !== null && start > target)
78
+ return fail('construction', 'timer-countup-order-invalid', 'Elapsed timer start must not exceed its target.');
79
+ return ok(true);
80
+ }
81
+ function getTarget(policies) { return policies.targetMs === undefined ? policies.countdown === true ? 0 : null : policies.targetMs; }
82
+ function isComplete(valueMs, policies) { const target = getTarget(policies); return target !== null && valueMs === target; }
83
+ function update(state, commands = []) { return ok(Object.freeze({ state, commands: Object.freeze([...commands]) })); }
84
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { Result, StableID } from './shared.js';
2
+ export type ToastKind = 'info' | 'success' | 'warning' | 'error';
3
+ export interface ToastInput<ID extends StableID = StableID> {
4
+ readonly id: ID;
5
+ readonly title: string;
6
+ readonly description?: string;
7
+ readonly kind?: ToastKind; /** `null` keeps the toast until dismissed. */
8
+ readonly durationMs?: number | null;
9
+ }
10
+ export interface ToastItem<ID extends StableID = StableID> {
11
+ readonly id: ID;
12
+ readonly title: string;
13
+ readonly description: string | null;
14
+ readonly kind: ToastKind;
15
+ readonly durationMs: number | null;
16
+ readonly remainingMs: number | null;
17
+ }
18
+ export interface ToastState<ID extends StableID = StableID> {
19
+ readonly items: readonly ToastItem<ID>[];
20
+ readonly paused: boolean;
21
+ }
22
+ export type ToastEvent<ID extends StableID = StableID> = {
23
+ readonly type: 'push';
24
+ readonly toast: ToastInput<ID>;
25
+ } | {
26
+ readonly type: 'update';
27
+ readonly id: ID;
28
+ readonly toast: Partial<Omit<ToastInput<ID>, 'id'>>;
29
+ } | {
30
+ readonly type: 'dismiss';
31
+ readonly id: ID;
32
+ } | {
33
+ readonly type: 'tick';
34
+ readonly elapsedMs: number;
35
+ } | 'dismiss-all' | 'pause' | 'resume';
36
+ export type ToastCommand<ID extends StableID = StableID> = {
37
+ readonly type: 'announce-toast';
38
+ readonly id: ID;
39
+ readonly kind: ToastKind;
40
+ } | {
41
+ readonly type: 'toast-dismissed';
42
+ readonly id: ID;
43
+ readonly reason: 'manual' | 'timeout' | 'overflow';
44
+ };
45
+ export interface ToastPolicies {
46
+ readonly defaultDurationMs?: number | null;
47
+ readonly maxVisible?: number;
48
+ }
49
+ export interface ToastUpdate<ID extends StableID = StableID> {
50
+ readonly state: ToastState<ID>;
51
+ readonly commands: readonly ToastCommand<ID>[];
52
+ }
53
+ export declare function createToastState<ID extends StableID>(items?: readonly ToastInput<ID>[], paused?: boolean, policies?: ToastPolicies): ToastState<ID>;
54
+ export declare function tryCreateToastState<ID extends StableID>(items?: readonly ToastInput<ID>[], paused?: boolean, policies?: ToastPolicies): Result<ToastState<ID>>;
55
+ export declare function applyToastEvent<ID extends StableID>(state: ToastState<ID>, event: ToastEvent<ID>, policies?: ToastPolicies): Result<ToastUpdate<ID>>;
56
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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"}
package/dist/toast.js ADDED
@@ -0,0 +1,87 @@
1
+ import { unwrap } from './result.js';
2
+ import { fail, ok } from './internal/kernel/foundation.js';
3
+ export function createToastState(items = [], paused = false, policies = {}) {
4
+ return unwrap(tryCreateToastState(items, paused, policies));
5
+ }
6
+ export function tryCreateToastState(items = [], paused = false, policies = {}) {
7
+ const normalized = [];
8
+ for (const item of items) {
9
+ const result = normalizeToast(item, policies.defaultDurationMs ?? 5_000);
10
+ if (!result.ok)
11
+ return result;
12
+ if (normalized.some((candidate) => candidate.id === item.id))
13
+ return fail('construction', 'toast-id-duplicate', 'Toast identifiers must be unique.');
14
+ normalized.push(result.value);
15
+ }
16
+ const maxVisible = policies.maxVisible ?? Number.POSITIVE_INFINITY;
17
+ if (maxVisible !== Number.POSITIVE_INFINITY && (!Number.isInteger(maxVisible) || maxVisible < 1))
18
+ return fail('construction', 'toast-max-visible-invalid', 'Toast maxVisible must be a positive integer.');
19
+ return ok(Object.freeze({ items: Object.freeze(normalized.slice(-maxVisible)), paused }));
20
+ }
21
+ export function applyToastEvent(state, event, policies = {}) {
22
+ const valid = tryCreateToastState(state.items.map((item) => ({ id: item.id, title: item.title, ...(item.description === null ? {} : { description: item.description }), kind: item.kind, durationMs: item.durationMs })), state.paused, policies);
23
+ if (!valid.ok)
24
+ return fail('transition-rejection', valid.error.code, valid.error.message);
25
+ if (event === 'pause' || event === 'resume')
26
+ return update(Object.freeze({ items: state.items, paused: event === 'pause' }));
27
+ if (event === 'dismiss-all')
28
+ return update(Object.freeze({ items: Object.freeze([]), paused: state.paused }), state.items.map((item) => ({ type: 'toast-dismissed', id: item.id, reason: 'manual' })));
29
+ if (event.type === 'dismiss') {
30
+ if (!state.items.some((item) => item.id === event.id))
31
+ return fail('transition-rejection', 'toast-id-missing', 'The toast to dismiss does not exist.');
32
+ return update(Object.freeze({ items: Object.freeze(state.items.filter((item) => item.id !== event.id)), paused: state.paused }), [{ type: 'toast-dismissed', id: event.id, reason: 'manual' }]);
33
+ }
34
+ if (event.type === 'push') {
35
+ if (state.items.some((item) => item.id === event.toast.id))
36
+ return fail('transition-rejection', 'toast-id-duplicate', 'Toast identifiers must be unique.');
37
+ const normalized = normalizeToast(event.toast, policies.defaultDurationMs ?? 5_000);
38
+ if (!normalized.ok)
39
+ return fail('transition-rejection', normalized.error.code, normalized.error.message);
40
+ const maxVisible = policies.maxVisible ?? Number.POSITIVE_INFINITY;
41
+ if (maxVisible !== Number.POSITIVE_INFINITY && (!Number.isInteger(maxVisible) || maxVisible < 1))
42
+ return fail('transition-rejection', 'toast-max-visible-invalid', 'Toast maxVisible must be a positive integer.');
43
+ const next = [...state.items, normalized.value];
44
+ const overflow = next.length > maxVisible ? next.splice(0, next.length - maxVisible) : [];
45
+ return update(Object.freeze({ items: Object.freeze(next), paused: state.paused }), [...overflow.map((item) => ({ type: 'toast-dismissed', id: item.id, reason: 'overflow' })), { type: 'announce-toast', id: normalized.value.id, kind: normalized.value.kind }]);
46
+ }
47
+ if (event.type === 'update') {
48
+ const index = state.items.findIndex((item) => item.id === event.id);
49
+ if (index < 0)
50
+ return fail('transition-rejection', 'toast-id-missing', 'The toast to update does not exist.');
51
+ const current = state.items[index];
52
+ const description = event.toast.description ?? current.description;
53
+ const normalized = normalizeToast({ id: current.id, title: event.toast.title ?? current.title, ...(description === null ? {} : { description }), kind: event.toast.kind ?? current.kind, durationMs: event.toast.durationMs === undefined ? current.durationMs : event.toast.durationMs }, policies.defaultDurationMs ?? 5_000);
54
+ if (!normalized.ok)
55
+ return fail('transition-rejection', normalized.error.code, normalized.error.message);
56
+ const items = [...state.items];
57
+ items[index] = normalized.value;
58
+ return update(Object.freeze({ items: Object.freeze(items), paused: state.paused }));
59
+ }
60
+ if (!Number.isFinite(event.elapsedMs) || event.elapsedMs < 0)
61
+ return fail('transition-rejection', 'toast-elapsed-invalid', 'Toast elapsed time must be finite and non-negative.');
62
+ if (state.paused || event.elapsedMs === 0)
63
+ return update(state);
64
+ const dismissed = [];
65
+ const items = state.items.flatMap((item) => {
66
+ if (item.remainingMs === null)
67
+ return [item];
68
+ const remainingMs = Math.max(0, item.remainingMs - event.elapsedMs);
69
+ if (remainingMs === 0) {
70
+ dismissed.push({ type: 'toast-dismissed', id: item.id, reason: 'timeout' });
71
+ return [];
72
+ }
73
+ return [Object.freeze({ ...item, remainingMs })];
74
+ });
75
+ return update(Object.freeze({ items: Object.freeze(items), paused: state.paused }), dismissed);
76
+ }
77
+ function normalizeToast(input, defaultDurationMs) {
78
+ const title = input.title.trim();
79
+ if (title.length === 0)
80
+ return fail('construction', 'toast-title-empty', 'Toast title must not be empty.');
81
+ const durationMs = input.durationMs === undefined ? defaultDurationMs : input.durationMs;
82
+ if (durationMs !== null && (!Number.isFinite(durationMs) || durationMs <= 0))
83
+ return fail('construction', 'toast-duration-invalid', 'Toast duration must be positive and finite, or null.');
84
+ return ok(Object.freeze({ id: input.id, title, description: input.description?.trim() || null, kind: input.kind ?? 'info', durationMs, remainingMs: durationMs }));
85
+ }
86
+ function update(state, commands = []) { return ok(Object.freeze({ state, commands: Object.freeze([...commands]) })); }
87
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Result } from './shared.js';
2
+ export interface ToggleButtonState {
3
+ readonly pressed: boolean;
4
+ }
5
+ export type ToggleButtonEvent = 'toggle' | {
6
+ readonly type: 'set-pressed';
7
+ readonly pressed: boolean;
8
+ };
9
+ export type ToggleButtonCommand = {
10
+ readonly type: 'pressed-changed';
11
+ readonly pressed: boolean;
12
+ };
13
+ export interface ToggleButtonUpdate {
14
+ readonly state: ToggleButtonState;
15
+ readonly commands: readonly ToggleButtonCommand[];
16
+ }
17
+ export declare function createToggleButtonState(pressed?: boolean): ToggleButtonState;
18
+ export declare function tryCreateToggleButtonState(pressed?: boolean): Result<ToggleButtonState>;
19
+ export declare function applyToggleButtonEvent(state: ToggleButtonState, event: ToggleButtonEvent): Result<ToggleButtonUpdate>;
20
+ //# sourceMappingURL=toggle-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-button.d.ts","sourceRoot":"","sources":["../src/toggle-button.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAChE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AACvG,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAClG,MAAM,WAAW,kBAAkB;IAAG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE;AAC5H,wBAAgB,uBAAuB,CAAC,OAAO,UAAQ,GAAG,iBAAiB,CAE1E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,UAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAGrF;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAQrH"}
@@ -0,0 +1,20 @@
1
+ import { unwrap } from './result.js';
2
+ import { applyCheckedEvent, createCheckedState, tryCreateCheckedState } from './internal/state/checked.js';
3
+ export function createToggleButtonState(pressed = false) {
4
+ return unwrap(tryCreateToggleButtonState(pressed));
5
+ }
6
+ export function tryCreateToggleButtonState(pressed = false) {
7
+ const result = tryCreateCheckedState(pressed, { allowMixed: false });
8
+ return result.ok ? { ok: true, value: Object.freeze({ pressed: result.value.checked }) } : result;
9
+ }
10
+ export function applyToggleButtonEvent(state, event) {
11
+ const mapped = event === 'toggle' ? event : { type: 'set-checked', checked: event.pressed };
12
+ const result = applyCheckedEvent({ checked: state.pressed }, mapped, { allowMixed: false });
13
+ if (!result.ok)
14
+ return result;
15
+ return { ok: true, value: Object.freeze({
16
+ state: Object.freeze({ pressed: result.value.state.checked }),
17
+ commands: Object.freeze(result.value.commands.map((command) => ({ type: 'pressed-changed', pressed: command.checked }))),
18
+ }) };
19
+ }
20
+ //# sourceMappingURL=toggle-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-button.js","sourceRoot":"","sources":["../src/toggle-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAC,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAK1G,MAAM,UAAU,uBAAuB,CAAC,OAAO,GAAG,KAAK;IACrD,OAAO,MAAM,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAO,GAAG,KAAK;IACxD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAkB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/G,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,KAAwB,EAAE,KAAwB;IACvF,MAAM,MAAM,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACrG,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAkB,EAAE,CAAC;YACxE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iBAA0B,EAAE,OAAO,EAAE,OAAO,CAAC,OAAkB,EAAE,CAAC,CAAC,CAAC;SAC7I,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Result, StableID } from './shared.js';
2
+ import type { Sequence } from './structures/sequence.js';
3
+ import { type ListboxCommand, type ListboxPolicies, type ListboxState, type ListboxStateInput, type ListboxUpdate } from './internal/composites/listbox.js';
4
+ export type ToggleGroupEvent<ID extends StableID = StableID> = 'next' | 'previous' | 'first' | 'last' | 'press' | {
5
+ readonly type: 'focus';
6
+ readonly id: ID;
7
+ } | {
8
+ readonly type: 'press';
9
+ readonly id: ID;
10
+ };
11
+ export type ToggleGroupCommand<ID extends StableID = StableID> = Extract<ListboxCommand<ID>, {
12
+ readonly type: 'focus';
13
+ }>;
14
+ export type ToggleGroupState<ID extends StableID = StableID> = ListboxState<ID>;
15
+ export type ToggleGroupStateInput<ID extends StableID = StableID> = ListboxStateInput<ID>;
16
+ export type ToggleGroupUpdate<ID extends StableID = StableID> = Omit<ListboxUpdate<ID>, 'commands'> & {
17
+ readonly commands: readonly ToggleGroupCommand<ID>[];
18
+ };
19
+ export type ToggleGroupPolicies<ID extends StableID = StableID> = Omit<ListboxPolicies<ID>, 'selectionMode' | 'selectionFollowsFocus'> & {
20
+ readonly multiple?: boolean;
21
+ };
22
+ export declare function createToggleGroupState<ID extends StableID>(domain: Sequence<ID>, input?: ToggleGroupStateInput<ID>, multiple?: boolean): ToggleGroupState<ID>;
23
+ export declare function tryCreateToggleGroupState<ID extends StableID>(domain: Sequence<ID>, input?: ToggleGroupStateInput<ID>, multiple?: boolean): Result<ToggleGroupState<ID>>;
24
+ export declare function applyToggleGroupEvent<ID extends StableID>(domain: Sequence<ID>, state: ToggleGroupState<ID>, event: ToggleGroupEvent<ID>, policies?: ToggleGroupPolicies<ID>): Result<ToggleGroupUpdate<ID>>;
25
+ //# sourceMappingURL=toggle-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-group.d.ts","sourceRoot":"","sources":["../src/toggle-group.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,gBAAgB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IACvD,MAAM,GACN,UAAU,GACV,OAAO,GACP,MAAM,GACN,OAAO,GACP;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAChD,MAAM,MAAM,kBAAkB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAC3D,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC1D,MAAM,MAAM,gBAAgB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAC1F,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAC1D,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,GACjC;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC;AAC7D,MAAM,MAAM,mBAAmB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAC5D,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAAC,GAClE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpC,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,QAAQ,EACxD,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EACpB,KAAK,GAAE,qBAAqB,CAAC,EAAE,CAAM,EACrC,QAAQ,UAAQ,GACf,gBAAgB,CAAC,EAAE,CAAC,CAEtB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,SAAS,QAAQ,EAC3D,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EACpB,KAAK,GAAE,qBAAqB,CAAC,EAAE,CAAM,EACrC,QAAQ,UAAQ,GACf,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAK9B;AAED,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,QAAQ,EACvD,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EACpB,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAC3B,QAAQ,GAAE,mBAAmB,CAAC,EAAE,CAAM,GACrC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAgB/B"}
@@ -0,0 +1,30 @@
1
+ import { unwrap } from './result.js';
2
+ import { fail } from './internal/kernel/foundation.js';
3
+ import { applyListboxEvent, createListboxState, tryCreateListboxState, } from './internal/composites/listbox.js';
4
+ export function createToggleGroupState(domain, input = {}, multiple = false) {
5
+ return unwrap(tryCreateToggleGroupState(domain, input, multiple));
6
+ }
7
+ export function tryCreateToggleGroupState(domain, input = {}, multiple = false) {
8
+ if (typeof multiple !== 'boolean') {
9
+ return fail('construction', 'invalid-toggle-group-multiple', 'Toggle group multiple must be boolean.');
10
+ }
11
+ return tryCreateListboxState(domain, input, multiple ? 'multiple' : 'single');
12
+ }
13
+ export function applyToggleGroupEvent(domain, state, event, policies = {}) {
14
+ const { multiple = false, ...listboxPolicies } = policies;
15
+ if (typeof multiple !== 'boolean') {
16
+ return fail('transition-rejection', 'invalid-toggle-group-multiple', 'Toggle group multiple must be boolean.');
17
+ }
18
+ const mapped = typeof event === 'object'
19
+ ? event.type === 'press' ? { type: 'toggle', id: event.id } : event
20
+ : event === 'press' ? 'toggle' : event;
21
+ const result = applyListboxEvent(domain, state, mapped, {
22
+ ...listboxPolicies,
23
+ boundary: policies.boundary ?? 'wrap',
24
+ deselectable: policies.deselectable ?? true,
25
+ selectionMode: multiple ? 'multiple' : 'single',
26
+ selectionFollowsFocus: false,
27
+ });
28
+ return result;
29
+ }
30
+ //# sourceMappingURL=toggle-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-group.js","sourceRoot":"","sources":["../src/toggle-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAMlB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAqB1C,MAAM,UAAU,sBAAsB,CACpC,MAAoB,EACpB,KAAK,GAA8B,EAAE,EACrC,QAAQ,GAAG,KAAK;IAEhB,OAAO,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAoB,EACpB,KAAK,GAA8B,EAAE,EACrC,QAAQ,GAAG,KAAK;IAEhB,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,cAAc,EAAE,+BAA+B,EAAE,wCAAwC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAoB,EACpB,KAA2B,EAC3B,KAA2B,EAC3B,QAAQ,GAA4B,EAAE;IAEtC,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,eAAe,EAAE,GAAG,QAAQ,CAAC;IAC1D,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,sBAAsB,EAAE,+BAA+B,EAAE,wCAAwC,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ;QACtC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QAC5E,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,QAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QACtD,GAAG,eAAe;QAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,MAAM;QACrC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;QAC3C,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;QAC/C,qBAAqB,EAAE,KAAK;KAC7B,CAAC,CAAC;IACH,OAAO,MAAuC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyLinearActionEvent as applyToolbarEvent, createLinearActionState as createToolbarState, type LinearActionCommand as ToolbarCommand, type LinearActionEvent as ToolbarEvent, type LinearActionPolicies as ToolbarPolicies, type LinearActionState as ToolbarState, type LinearActionStateInput as ToolbarStateInput, type LinearActionUpdate as ToolbarUpdate, } from './internal/composites/linear-action.js';
2
+ export { tryCreateLinearActionState as tryCreateToolbarState } from './internal/composites/linear-action.js';
3
+ //# sourceMappingURL=toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../src/toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,IAAI,iBAAiB,EAC3C,uBAAuB,IAAI,kBAAkB,EAC7C,KAAK,mBAAmB,IAAI,cAAc,EAC1C,KAAK,iBAAiB,IAAI,YAAY,EACtC,KAAK,oBAAoB,IAAI,eAAe,EAC5C,KAAK,iBAAiB,IAAI,YAAY,EACtC,KAAK,sBAAsB,IAAI,iBAAiB,EAChD,KAAK,kBAAkB,IAAI,aAAa,GACzC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,0BAA0B,IAAI,qBAAqB,EAAE,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyLinearActionEvent as applyToolbarEvent, createLinearActionState as createToolbarState, } from './internal/composites/linear-action.js';
2
+ export { tryCreateLinearActionState as tryCreateToolbarState } from './internal/composites/linear-action.js';
3
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../src/toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,IAAI,iBAAiB,EAC3C,uBAAuB,IAAI,kBAAkB,GAO9C,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,0BAA0B,IAAI,qBAAqB,EAAE,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyOpenEvent as applyTooltipEvent, createOpenState as createTooltipState, type OpenCommand as TooltipCommand, type OpenEvent as TooltipEvent, type OpenState as TooltipState } from './internal/state/open-state.js';
2
+ export { tryCreateOpenState as tryCreateTooltipState } from './internal/state/open-state.js';
3
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,OAAM,EAAC,cAAc,IAAI,iBAAiB,EAAC,eAAe,IAAI,kBAAkB,EAAC,KAAK,WAAW,IAAI,cAAc,EAAC,KAAK,SAAS,IAAI,YAAY,EAAC,KAAK,SAAS,IAAI,YAAY,EAAC,MAAI,gCAAgC,CAAC;AAEvN,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyOpenEvent as applyTooltipEvent, createOpenState as createTooltipState } from './internal/state/open-state.js';
2
+ export { tryCreateOpenState as tryCreateTooltipState } from './internal/state/open-state.js';
3
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,OAAM,EAAC,cAAc,IAAI,iBAAiB,EAAC,eAAe,IAAI,kBAAkB,EAAkG,MAAI,gCAAgC,CAAC;AAEvN,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Result, StableID } from './shared.js';
2
+ import { type TreeGridModel } from './internal/composites/tree-grid.js';
3
+ export interface TreeGridRowInput<RowID extends StableID = StableID, CellID extends StableID = StableID> {
4
+ readonly id: RowID;
5
+ readonly parentID: RowID | null;
6
+ readonly cells: readonly (CellID | null)[];
7
+ }
8
+ export declare function createTreeGridModelFromRows<RowID extends StableID, CellID extends StableID>(rows: readonly TreeGridRowInput<RowID, CellID>[]): TreeGridModel<RowID, CellID>;
9
+ export declare function tryCreateTreeGridModelFromRows<RowID extends StableID, CellID extends StableID>(rows: readonly TreeGridRowInput<RowID, CellID>[]): Result<TreeGridModel<RowID, CellID>>;
10
+ export { applyTreeGridEvent, createTreeGridModel, createTreeGridState, type TreeGridCommand, type TreeGridEditMode, type TreeGridEvent, type TreeGridModel, type TreeGridPolicies, type TreeGridState, type TreeGridStateInput, type TreeGridUpdate, } from './internal/composites/tree-grid.js';
11
+ export { tryCreateTreeGridModel } from './internal/composites/tree-grid.js';
12
+ export { tryCreateTreeGridState } from './internal/composites/tree-grid.js';
13
+ //# sourceMappingURL=tree-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-grid.d.ts","sourceRoot":"","sources":["../src/tree-grid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,gBAAgB,CAC/B,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IAElC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC5C;AAED,wBAAgB,2BAA2B,CACzC,KAAK,SAAS,QAAQ,EACtB,MAAM,SAAS,QAAQ,EAEvB,IAAI,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAC/C,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAE9B;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,SAAS,QAAQ,EACtB,MAAM,SAAS,QAAQ,EAEvB,IAAI,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAC/C,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAMtC;AAED,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { unwrap } from './result.js';
2
+ import { createGrid, tryCreateGrid } from './structures/grid.js';
3
+ import { createTree, tryCreateTree } from './structures/tree.js';
4
+ import { createTreeGridModel, tryCreateTreeGridModel, } from './internal/composites/tree-grid.js';
5
+ export function createTreeGridModelFromRows(rows) {
6
+ return unwrap(tryCreateTreeGridModelFromRows(rows));
7
+ }
8
+ export function tryCreateTreeGridModelFromRows(rows) {
9
+ const tree = tryCreateTree(rows.map((row) => ({ id: row.id, parentID: row.parentID })));
10
+ if (!tree.ok)
11
+ return tree;
12
+ const grid = tryCreateGrid(rows.map((row) => row.cells));
13
+ if (!grid.ok)
14
+ return grid;
15
+ return tryCreateTreeGridModel(tree.value, grid.value, rows.map((row) => row.id));
16
+ }
17
+ export { applyTreeGridEvent, createTreeGridModel, createTreeGridState, } from './internal/composites/tree-grid.js';
18
+ export { tryCreateTreeGridModel } from './internal/composites/tree-grid.js';
19
+ export { tryCreateTreeGridState } from './internal/composites/tree-grid.js';
20
+ //# sourceMappingURL=tree-grid.js.map