@sectile/core 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) 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/editable.d.ts +29 -0
  78. package/dist/editable.d.ts.map +1 -0
  79. package/dist/editable.js +34 -0
  80. package/dist/editable.js.map +1 -0
  81. package/dist/feed.d.ts +49 -0
  82. package/dist/feed.d.ts.map +1 -0
  83. package/dist/feed.js +124 -0
  84. package/dist/feed.js.map +1 -0
  85. package/dist/form.d.ts +135 -0
  86. package/dist/form.d.ts.map +1 -0
  87. package/dist/form.js +627 -0
  88. package/dist/form.js.map +1 -0
  89. package/dist/index.d.ts +37 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/interaction.d.ts +15 -0
  94. package/dist/interaction.d.ts.map +1 -0
  95. package/dist/interaction.js +42 -0
  96. package/dist/interaction.js.map +1 -0
  97. package/dist/internal/composites/calendar.d.ts +36 -0
  98. package/dist/internal/composites/calendar.d.ts.map +1 -0
  99. package/dist/internal/composites/calendar.js +143 -0
  100. package/dist/internal/composites/calendar.js.map +1 -0
  101. package/dist/internal/composites/combobox.d.ts +42 -0
  102. package/dist/internal/composites/combobox.d.ts.map +1 -0
  103. package/dist/internal/composites/combobox.js +188 -0
  104. package/dist/internal/composites/combobox.js.map +1 -0
  105. package/dist/internal/composites/grid-control.d.ts +37 -0
  106. package/dist/internal/composites/grid-control.d.ts.map +1 -0
  107. package/dist/internal/composites/grid-control.js +90 -0
  108. package/dist/internal/composites/grid-control.js.map +1 -0
  109. package/dist/internal/composites/linear-action.d.ts +36 -0
  110. package/dist/internal/composites/linear-action.d.ts.map +1 -0
  111. package/dist/internal/composites/linear-action.js +96 -0
  112. package/dist/internal/composites/linear-action.js.map +1 -0
  113. package/dist/internal/composites/linear-choice.d.ts +41 -0
  114. package/dist/internal/composites/linear-choice.d.ts.map +1 -0
  115. package/dist/internal/composites/linear-choice.js +139 -0
  116. package/dist/internal/composites/linear-choice.js.map +1 -0
  117. package/dist/internal/composites/listbox.d.ts +52 -0
  118. package/dist/internal/composites/listbox.d.ts.map +1 -0
  119. package/dist/internal/composites/listbox.js +251 -0
  120. package/dist/internal/composites/listbox.js.map +1 -0
  121. package/dist/internal/composites/menu.d.ts +29 -0
  122. package/dist/internal/composites/menu.d.ts.map +1 -0
  123. package/dist/internal/composites/menu.js +76 -0
  124. package/dist/internal/composites/menu.js.map +1 -0
  125. package/dist/internal/composites/popup.d.ts +21 -0
  126. package/dist/internal/composites/popup.d.ts.map +1 -0
  127. package/dist/internal/composites/popup.js +10 -0
  128. package/dist/internal/composites/popup.js.map +1 -0
  129. package/dist/internal/composites/slider.d.ts +21 -0
  130. package/dist/internal/composites/slider.d.ts.map +1 -0
  131. package/dist/internal/composites/slider.js +73 -0
  132. package/dist/internal/composites/slider.js.map +1 -0
  133. package/dist/internal/composites/tree-grid.d.ts +67 -0
  134. package/dist/internal/composites/tree-grid.d.ts.map +1 -0
  135. package/dist/internal/composites/tree-grid.js +281 -0
  136. package/dist/internal/composites/tree-grid.js.map +1 -0
  137. package/dist/internal/composites/tree-view.d.ts +42 -0
  138. package/dist/internal/composites/tree-view.d.ts.map +1 -0
  139. package/dist/internal/composites/tree-view.js +196 -0
  140. package/dist/internal/composites/tree-view.js.map +1 -0
  141. package/dist/internal/editing/text.d.ts +66 -0
  142. package/dist/internal/editing/text.d.ts.map +1 -0
  143. package/dist/internal/editing/text.js +248 -0
  144. package/dist/internal/editing/text.js.map +1 -0
  145. package/dist/internal/kernel/decimal.d.ts +22 -0
  146. package/dist/internal/kernel/decimal.d.ts.map +1 -0
  147. package/dist/internal/kernel/decimal.js +137 -0
  148. package/dist/internal/kernel/decimal.js.map +1 -0
  149. package/dist/internal/kernel/foundation.d.ts +12 -0
  150. package/dist/internal/kernel/foundation.d.ts.map +1 -0
  151. package/dist/internal/kernel/foundation.js +132 -0
  152. package/dist/internal/kernel/foundation.js.map +1 -0
  153. package/dist/internal/kernel/indexed-sequence.d.ts +26 -0
  154. package/dist/internal/kernel/indexed-sequence.d.ts.map +1 -0
  155. package/dist/internal/kernel/indexed-sequence.js +117 -0
  156. package/dist/internal/kernel/indexed-sequence.js.map +1 -0
  157. package/dist/internal/kernel/machine.d.ts +8 -0
  158. package/dist/internal/kernel/machine.d.ts.map +1 -0
  159. package/dist/internal/kernel/machine.js +6 -0
  160. package/dist/internal/kernel/machine.js.map +1 -0
  161. package/dist/internal/runtime/revision.d.ts +23 -0
  162. package/dist/internal/runtime/revision.d.ts.map +1 -0
  163. package/dist/internal/runtime/revision.js +76 -0
  164. package/dist/internal/runtime/revision.js.map +1 -0
  165. package/dist/internal/state/checked.d.ts +22 -0
  166. package/dist/internal/state/checked.d.ts.map +1 -0
  167. package/dist/internal/state/checked.js +33 -0
  168. package/dist/internal/state/checked.js.map +1 -0
  169. package/dist/internal/state/cursor.d.ts +13 -0
  170. package/dist/internal/state/cursor.d.ts.map +1 -0
  171. package/dist/internal/state/cursor.js +24 -0
  172. package/dist/internal/state/cursor.js.map +1 -0
  173. package/dist/internal/state/expansion.d.ts +8 -0
  174. package/dist/internal/state/expansion.d.ts.map +1 -0
  175. package/dist/internal/state/expansion.js +23 -0
  176. package/dist/internal/state/expansion.js.map +1 -0
  177. package/dist/internal/state/open-state.d.ts +17 -0
  178. package/dist/internal/state/open-state.d.ts.map +1 -0
  179. package/dist/internal/state/open-state.js +29 -0
  180. package/dist/internal/state/open-state.js.map +1 -0
  181. package/dist/internal/state/selection.d.ts +23 -0
  182. package/dist/internal/state/selection.d.ts.map +1 -0
  183. package/dist/internal/state/selection.js +110 -0
  184. package/dist/internal/state/selection.js.map +1 -0
  185. package/dist/layer-stack.d.ts +47 -0
  186. package/dist/layer-stack.d.ts.map +1 -0
  187. package/dist/layer-stack.js +115 -0
  188. package/dist/layer-stack.js.map +1 -0
  189. package/dist/listbox.d.ts +3 -0
  190. package/dist/listbox.d.ts.map +1 -0
  191. package/dist/listbox.js +3 -0
  192. package/dist/listbox.js.map +1 -0
  193. package/dist/menu-button.d.ts +5 -0
  194. package/dist/menu-button.d.ts.map +1 -0
  195. package/dist/menu-button.js +5 -0
  196. package/dist/menu-button.js.map +1 -0
  197. package/dist/menu.d.ts +10 -0
  198. package/dist/menu.d.ts.map +1 -0
  199. package/dist/menu.js +9 -0
  200. package/dist/menu.js.map +1 -0
  201. package/dist/menubar.d.ts +5 -0
  202. package/dist/menubar.d.ts.map +1 -0
  203. package/dist/menubar.js +5 -0
  204. package/dist/menubar.js.map +1 -0
  205. package/dist/month-picker.d.ts +5 -0
  206. package/dist/month-picker.d.ts.map +1 -0
  207. package/dist/month-picker.js +4 -0
  208. package/dist/month-picker.js.map +1 -0
  209. package/dist/month-range-picker.d.ts +6 -0
  210. package/dist/month-range-picker.d.ts.map +1 -0
  211. package/dist/month-range-picker.js +5 -0
  212. package/dist/month-range-picker.js.map +1 -0
  213. package/dist/multi-thumb-slider.d.ts +36 -0
  214. package/dist/multi-thumb-slider.d.ts.map +1 -0
  215. package/dist/multi-thumb-slider.js +72 -0
  216. package/dist/multi-thumb-slider.js.map +1 -0
  217. package/dist/navigation-menu.d.ts +6 -0
  218. package/dist/navigation-menu.d.ts.map +1 -0
  219. package/dist/navigation-menu.js +5 -0
  220. package/dist/navigation-menu.js.map +1 -0
  221. package/dist/number-field.d.ts +51 -0
  222. package/dist/number-field.d.ts.map +1 -0
  223. package/dist/number-field.js +461 -0
  224. package/dist/number-field.js.map +1 -0
  225. package/dist/pagination.d.ts +65 -0
  226. package/dist/pagination.d.ts.map +1 -0
  227. package/dist/pagination.js +197 -0
  228. package/dist/pagination.js.map +1 -0
  229. package/dist/pin-input.d.ts +31 -0
  230. package/dist/pin-input.d.ts.map +1 -0
  231. package/dist/pin-input.js +53 -0
  232. package/dist/pin-input.js.map +1 -0
  233. package/dist/popover.d.ts +17 -0
  234. package/dist/popover.d.ts.map +1 -0
  235. package/dist/popover.js +6 -0
  236. package/dist/popover.js.map +1 -0
  237. package/dist/quantity-field.d.ts +59 -0
  238. package/dist/quantity-field.d.ts.map +1 -0
  239. package/dist/quantity-field.js +254 -0
  240. package/dist/quantity-field.js.map +1 -0
  241. package/dist/radio-group.d.ts +23 -0
  242. package/dist/radio-group.d.ts.map +1 -0
  243. package/dist/radio-group.js +20 -0
  244. package/dist/radio-group.js.map +1 -0
  245. package/dist/range-calendar.d.ts +6 -0
  246. package/dist/range-calendar.d.ts.map +1 -0
  247. package/dist/range-calendar.js +5 -0
  248. package/dist/range-calendar.js.map +1 -0
  249. package/dist/rating.d.ts +18 -0
  250. package/dist/rating.d.ts.map +1 -0
  251. package/dist/rating.js +19 -0
  252. package/dist/rating.js.map +1 -0
  253. package/dist/reorder.d.ts +47 -0
  254. package/dist/reorder.d.ts.map +1 -0
  255. package/dist/reorder.js +110 -0
  256. package/dist/reorder.js.map +1 -0
  257. package/dist/result.d.ts +10 -0
  258. package/dist/result.d.ts.map +1 -0
  259. package/dist/result.js +19 -0
  260. package/dist/result.js.map +1 -0
  261. package/dist/revision.d.ts +3 -0
  262. package/dist/revision.d.ts.map +1 -0
  263. package/dist/revision.js +3 -0
  264. package/dist/revision.js.map +1 -0
  265. package/dist/select.d.ts +31 -0
  266. package/dist/select.d.ts.map +1 -0
  267. package/dist/select.js +32 -0
  268. package/dist/select.js.map +1 -0
  269. package/dist/shared.d.ts +43 -0
  270. package/dist/shared.d.ts.map +1 -0
  271. package/dist/shared.js +3 -0
  272. package/dist/shared.js.map +1 -0
  273. package/dist/slider.d.ts +3 -0
  274. package/dist/slider.d.ts.map +1 -0
  275. package/dist/slider.js +3 -0
  276. package/dist/slider.js.map +1 -0
  277. package/dist/spin-button.d.ts +31 -0
  278. package/dist/spin-button.d.ts.map +1 -0
  279. package/dist/spin-button.js +65 -0
  280. package/dist/spin-button.js.map +1 -0
  281. package/dist/stepper.d.ts +18 -0
  282. package/dist/stepper.d.ts.map +1 -0
  283. package/dist/stepper.js +16 -0
  284. package/dist/stepper.js.map +1 -0
  285. package/dist/structures/grid.d.ts +29 -0
  286. package/dist/structures/grid.d.ts.map +1 -0
  287. package/dist/structures/grid.js +202 -0
  288. package/dist/structures/grid.js.map +1 -0
  289. package/dist/structures/range.d.ts +41 -0
  290. package/dist/structures/range.d.ts.map +1 -0
  291. package/dist/structures/range.js +249 -0
  292. package/dist/structures/range.js.map +1 -0
  293. package/dist/structures/sequence.d.ts +19 -0
  294. package/dist/structures/sequence.d.ts.map +1 -0
  295. package/dist/structures/sequence.js +28 -0
  296. package/dist/structures/sequence.js.map +1 -0
  297. package/dist/structures/tree.d.ts +33 -0
  298. package/dist/structures/tree.d.ts.map +1 -0
  299. package/dist/structures/tree.js +238 -0
  300. package/dist/structures/tree.js.map +1 -0
  301. package/dist/switch.d.ts +21 -0
  302. package/dist/switch.d.ts.map +1 -0
  303. package/dist/switch.js +8 -0
  304. package/dist/switch.js.map +1 -0
  305. package/dist/tabs.d.ts +16 -0
  306. package/dist/tabs.d.ts.map +1 -0
  307. package/dist/tabs.js +27 -0
  308. package/dist/tabs.js.map +1 -0
  309. package/dist/tags-input.d.ts +43 -0
  310. package/dist/tags-input.d.ts.map +1 -0
  311. package/dist/tags-input.js +48 -0
  312. package/dist/tags-input.js.map +1 -0
  313. package/dist/text.d.ts +4 -0
  314. package/dist/text.d.ts.map +1 -0
  315. package/dist/text.js +4 -0
  316. package/dist/text.js.map +1 -0
  317. package/dist/time-field.d.ts +48 -0
  318. package/dist/time-field.d.ts.map +1 -0
  319. package/dist/time-field.js +157 -0
  320. package/dist/time-field.js.map +1 -0
  321. package/dist/time-range-field.d.ts +53 -0
  322. package/dist/time-range-field.d.ts.map +1 -0
  323. package/dist/time-range-field.js +75 -0
  324. package/dist/time-range-field.js.map +1 -0
  325. package/dist/timer.d.ts +37 -0
  326. package/dist/timer.d.ts.map +1 -0
  327. package/dist/timer.js +84 -0
  328. package/dist/timer.js.map +1 -0
  329. package/dist/toast.d.ts +56 -0
  330. package/dist/toast.d.ts.map +1 -0
  331. package/dist/toast.js +87 -0
  332. package/dist/toast.js.map +1 -0
  333. package/dist/toggle-button.d.ts +20 -0
  334. package/dist/toggle-button.d.ts.map +1 -0
  335. package/dist/toggle-button.js +20 -0
  336. package/dist/toggle-button.js.map +1 -0
  337. package/dist/toggle-group.d.ts +25 -0
  338. package/dist/toggle-group.d.ts.map +1 -0
  339. package/dist/toggle-group.js +30 -0
  340. package/dist/toggle-group.js.map +1 -0
  341. package/dist/toolbar.d.ts +3 -0
  342. package/dist/toolbar.d.ts.map +1 -0
  343. package/dist/toolbar.js +3 -0
  344. package/dist/toolbar.js.map +1 -0
  345. package/dist/tooltip.d.ts +3 -0
  346. package/dist/tooltip.d.ts.map +1 -0
  347. package/dist/tooltip.js +3 -0
  348. package/dist/tooltip.js.map +1 -0
  349. package/dist/tree-grid.d.ts +13 -0
  350. package/dist/tree-grid.d.ts.map +1 -0
  351. package/dist/tree-grid.js +20 -0
  352. package/dist/tree-grid.js.map +1 -0
  353. package/dist/tree-view.d.ts +3 -0
  354. package/dist/tree-view.d.ts.map +1 -0
  355. package/dist/tree-view.js +3 -0
  356. package/dist/tree-view.js.map +1 -0
  357. package/dist/units.d.ts +77 -0
  358. package/dist/units.d.ts.map +1 -0
  359. package/dist/units.js +512 -0
  360. package/dist/units.js.map +1 -0
  361. package/dist/window-splitter.d.ts +3 -0
  362. package/dist/window-splitter.d.ts.map +1 -0
  363. package/dist/window-splitter.js +3 -0
  364. package/dist/window-splitter.js.map +1 -0
  365. package/dist/year-picker.d.ts +10 -0
  366. package/dist/year-picker.d.ts.map +1 -0
  367. package/dist/year-picker.js +27 -0
  368. package/dist/year-picker.js.map +1 -0
  369. package/dist/year-range-picker.d.ts +6 -0
  370. package/dist/year-range-picker.d.ts.map +1 -0
  371. package/dist/year-range-picker.js +5 -0
  372. package/dist/year-range-picker.js.map +1 -0
  373. package/package.json +1 -1
@@ -0,0 +1,251 @@
1
+ import { unwrap } from '../../result.js';
2
+ import { createCursorState } from '../state/cursor.js';
3
+ import { fail, ok } from '../kernel/foundation.js';
4
+ import { findEligibleFromEdge } from '../kernel/indexed-sequence.js';
5
+ import { createMachineUpdate } from '../kernel/machine.js';
6
+ import { clearSelection, createSelectionState, selectOne, toggleMultipleSelection, } from '../state/selection.js';
7
+ export function createListboxState(domain, input = {}, selectionMode = 'multiple') {
8
+ return unwrap(tryCreateListboxState(domain, input, selectionMode));
9
+ }
10
+ export function tryCreateListboxState(domain, input = {}, selectionMode = 'multiple') {
11
+ const current = input.current ?? null;
12
+ if (current !== null && !domain.contains(current)) {
13
+ return fail('construction', 'listbox-cursor-outside-domain', 'Listbox cursor must exist in the sequence domain.', { current });
14
+ }
15
+ const selection = createSelectionState(domain, selectionMode, input);
16
+ if (!selection.ok)
17
+ return selection;
18
+ return ok(listboxState(createCursorState(current), selection.value));
19
+ }
20
+ export function applyListboxEvent(domain, state, event, policies = {}) {
21
+ const stateError = validateListboxState(domain, state);
22
+ if (stateError !== null)
23
+ return { ok: false, error: stateError };
24
+ if (!isListboxEvent(event)) {
25
+ return fail('transition-rejection', 'invalid-listbox-event', 'Listbox event must be next, previous, first, last, toggle, activate, or clear.', { event });
26
+ }
27
+ const boundary = policies.boundary ?? 'stop';
28
+ if (boundary !== 'stop' && boundary !== 'wrap') {
29
+ return fail('transition-rejection', 'invalid-listbox-boundary', 'Listbox boundary must be stop or wrap.', { boundary });
30
+ }
31
+ const selectionFollowsFocus = policies.selectionFollowsFocus ?? false;
32
+ if (typeof selectionFollowsFocus !== 'boolean') {
33
+ return fail('transition-rejection', 'invalid-selection-follows-focus', 'selectionFollowsFocus must be boolean.', { selectionFollowsFocus });
34
+ }
35
+ const deselectable = policies.deselectable ?? false;
36
+ if (typeof deselectable !== 'boolean') {
37
+ return fail('transition-rejection', 'invalid-deselectable-policy', 'deselectable must be boolean.', { deselectable });
38
+ }
39
+ if (policies.eligible !== undefined && typeof policies.eligible !== 'function') {
40
+ return fail('transition-rejection', 'invalid-eligibility-policy', 'Listbox eligibility policy must be a function.');
41
+ }
42
+ const selectionMode = policies.selectionMode ?? 'multiple';
43
+ if (selectionMode !== 'single' && selectionMode !== 'multiple') {
44
+ return fail('transition-rejection', 'invalid-selection-mode', 'Listbox selection mode must be single or multiple.', { selectionMode });
45
+ }
46
+ if (selectionMode === 'single' && state.selection.size > 1) {
47
+ return fail('transition-rejection', 'invalid-selection-cardinality', 'Single-selection listbox state permits at most one selected identity.', { selectedCount: state.selection.size });
48
+ }
49
+ if (typeof event === 'object') {
50
+ if (!domain.contains(event.id) || policies.eligible?.(event.id) === false) {
51
+ return fail('transition-rejection', 'listbox-target-unavailable', 'Direct listbox events require an eligible identity in the domain.', { id: event.id });
52
+ }
53
+ if (event.type === 'focus') {
54
+ const selection = selectionFollowsFocus
55
+ ? selectOne(state.selection, event.id, domain)
56
+ : state.selection;
57
+ return createMachineUpdate(listboxState(createCursorState(event.id), selection), [{ type: 'focus', id: event.id }]);
58
+ }
59
+ if (event.type === 'toggle') {
60
+ return createMachineUpdate(listboxState(createCursorState(event.id), selectForMode(state.selection, event.id, domain, selectionMode, deselectable)), [{ type: 'focus', id: event.id }]);
61
+ }
62
+ return createMachineUpdate(listboxState(createCursorState(event.id), selectOne(state.selection, event.id, domain)), [{ type: 'focus', id: event.id }, { type: 'activate', id: event.id }]);
63
+ }
64
+ switch (event) {
65
+ case 'next':
66
+ return moveListbox(domain, state, 1, boundary, selectionFollowsFocus, policies);
67
+ case 'previous':
68
+ return moveListbox(domain, state, -1, boundary, selectionFollowsFocus, policies);
69
+ case 'first':
70
+ return moveListboxToEdge(domain, state, 1, selectionFollowsFocus, policies);
71
+ case 'last':
72
+ return moveListboxToEdge(domain, state, -1, selectionFollowsFocus, policies);
73
+ case 'toggle': {
74
+ const current = state.cursor.current;
75
+ if (current === null)
76
+ return noCursor();
77
+ return createMachineUpdate(listboxState(state.cursor, selectForMode(state.selection, current, domain, selectionMode, deselectable)));
78
+ }
79
+ case 'activate': {
80
+ const current = state.cursor.current;
81
+ if (current === null)
82
+ return noCursor();
83
+ return createMachineUpdate(listboxState(state.cursor, selectOne(state.selection, current, domain)), [{ type: 'activate', id: current }]);
84
+ }
85
+ case 'clear': {
86
+ const selection = clearSelection(state.selection);
87
+ return createMachineUpdate(selection === state.selection ? state : listboxState(state.cursor, selection));
88
+ }
89
+ }
90
+ }
91
+ export function findListboxTypeaheadMatch(domain, current, query, options) {
92
+ if (typeof query !== 'string' || query.length === 0)
93
+ return ok(null);
94
+ if (typeof options.textValue !== 'function') {
95
+ return fail('transition-rejection', 'invalid-typeahead-text-value', 'Listbox typeahead requires a textValue function.');
96
+ }
97
+ if (options.eligible !== undefined && typeof options.eligible !== 'function') {
98
+ return fail('transition-rejection', 'invalid-eligibility-policy', 'Listbox typeahead eligibility must be a function.');
99
+ }
100
+ if (options.normalize !== undefined && typeof options.normalize !== 'function') {
101
+ return fail('transition-rejection', 'invalid-typeahead-normalizer', 'Listbox typeahead normalize must be a function.');
102
+ }
103
+ if (options.maxScan !== undefined
104
+ && (!Number.isSafeInteger(options.maxScan) || options.maxScan < 0)) {
105
+ return fail('resource-rejection', 'invalid-scan-ceiling', 'Listbox typeahead maxScan must be a non-negative safe integer.');
106
+ }
107
+ if (current !== null && !domain.contains(current)) {
108
+ return fail('transition-rejection', 'listbox-cursor-outside-domain', 'Listbox typeahead cursor must exist in the sequence domain.', { current });
109
+ }
110
+ const normalize = options.normalize ?? ((text) => text.toLowerCase());
111
+ const needle = normalize(query);
112
+ if (needle.length === 0 || domain.size === 0)
113
+ return ok(null);
114
+ const eligible = options.eligible ?? (() => true);
115
+ const maxScan = options.maxScan ?? Number.MAX_SAFE_INTEGER;
116
+ const start = current === null ? 0 : (domain.indexOf(current) + 1) % domain.size;
117
+ let scanned = 0;
118
+ for (let offset = 0; offset < domain.size; offset += 1) {
119
+ if (scanned === maxScan) {
120
+ return fail('resource-rejection', 'scan-ceiling-reached', 'Listbox typeahead reached maxScan before its result was determined.', { maxScan });
121
+ }
122
+ const id = domain.at((start + offset) % domain.size);
123
+ scanned += 1;
124
+ if (id !== null && eligible(id) && normalize(options.textValue(id)).startsWith(needle)) {
125
+ return ok(id);
126
+ }
127
+ }
128
+ return ok(null);
129
+ }
130
+ function moveListbox(domain, state, direction, boundary, selectionFollowsFocus, policies) {
131
+ const eligible = policies.eligible ?? (() => true);
132
+ const current = state.cursor.current;
133
+ let target;
134
+ if (current === null) {
135
+ const initial = findEligibleFromEdge(domain, direction, {
136
+ eligible,
137
+ ...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
138
+ });
139
+ if (!initial.ok)
140
+ return initial;
141
+ target = initial.value;
142
+ }
143
+ else {
144
+ const movement = domain.move(current, direction, boundary, {
145
+ eligible,
146
+ ...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
147
+ });
148
+ if (movement.kind === 'resource-rejected')
149
+ return { ok: false, error: movement.error };
150
+ target = movement.kind === 'found' ? movement.id : null;
151
+ }
152
+ if (target === null)
153
+ return createMachineUpdate(state);
154
+ const cursor = createCursorState(target);
155
+ const selection = selectionFollowsFocus
156
+ ? selectOne(state.selection, target, domain)
157
+ : state.selection;
158
+ return createMachineUpdate(listboxState(cursor, selection), [{ type: 'focus', id: target }]);
159
+ }
160
+ function moveListboxToEdge(domain, state, direction, selectionFollowsFocus, policies) {
161
+ const target = findEligibleFromEdge(domain, direction, {
162
+ eligible: policies.eligible ?? (() => true),
163
+ ...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
164
+ });
165
+ if (!target.ok)
166
+ return target;
167
+ if (target.value === null || target.value === state.cursor.current) {
168
+ return createMachineUpdate(state);
169
+ }
170
+ return createMachineUpdate(listboxState(createCursorState(target.value), selectionFollowsFocus ? selectOne(state.selection, target.value, domain) : state.selection), [{ type: 'focus', id: target.value }]);
171
+ }
172
+ function selectForMode(state, id, domain, selectionMode, deselectable) {
173
+ return selectionMode === 'single'
174
+ ? deselectable && state.has(id) ? clearSelection(state) : selectOne(state, id, domain)
175
+ : toggleMultipleSelection(state, id, domain);
176
+ }
177
+ function validateListboxState(domain, state) {
178
+ if (state.cursor.current !== null && !domain.contains(state.cursor.current)) {
179
+ return {
180
+ class: 'transition-rejection',
181
+ code: 'listbox-cursor-outside-domain',
182
+ message: 'Listbox cursor must exist in the sequence domain.',
183
+ details: { current: state.cursor.current },
184
+ };
185
+ }
186
+ const unique = new Set(state.selection.selected);
187
+ if (unique.size !== state.selection.selected.length || state.selection.size !== unique.size) {
188
+ return {
189
+ class: 'transition-rejection',
190
+ code: 'invalid-listbox-selection',
191
+ message: 'Listbox selection must contain unique identities with a matching size.',
192
+ };
193
+ }
194
+ let previousIndex = -1;
195
+ for (const id of unique) {
196
+ const index = domain.indexOf(id);
197
+ if (index === null) {
198
+ return {
199
+ class: 'transition-rejection',
200
+ code: 'listbox-selection-outside-domain',
201
+ message: 'Listbox selection identities must exist in the sequence domain.',
202
+ details: { id },
203
+ };
204
+ }
205
+ if (index <= previousIndex || !state.selection.has(id)) {
206
+ return {
207
+ class: 'transition-rejection',
208
+ code: 'invalid-listbox-selection',
209
+ message: 'Listbox selection observations must match canonical sequence order.',
210
+ };
211
+ }
212
+ previousIndex = index;
213
+ }
214
+ for (const id of domain.ids) {
215
+ if (state.selection.has(id) !== unique.has(id)) {
216
+ return {
217
+ class: 'transition-rejection',
218
+ code: 'invalid-listbox-selection',
219
+ message: 'Listbox selection membership observations must agree.',
220
+ };
221
+ }
222
+ }
223
+ if (state.selection.anchor !== null && !domain.contains(state.selection.anchor)) {
224
+ return {
225
+ class: 'transition-rejection',
226
+ code: 'listbox-anchor-outside-domain',
227
+ message: 'Listbox selection anchor must exist in the sequence domain.',
228
+ details: { anchor: state.selection.anchor },
229
+ };
230
+ }
231
+ return null;
232
+ }
233
+ function listboxState(cursor, selection) {
234
+ return Object.freeze({ cursor, selection });
235
+ }
236
+ function noCursor() {
237
+ return fail('transition-rejection', 'no-cursor', 'Listbox toggle and activate require a current cursor.');
238
+ }
239
+ function isListboxEvent(value) {
240
+ return typeof value === 'string' ? (value === 'next' ||
241
+ value === 'previous' ||
242
+ value === 'first' ||
243
+ value === 'last' ||
244
+ value === 'toggle' ||
245
+ value === 'activate' ||
246
+ value === 'clear') : typeof value === 'object' && value !== null
247
+ && 'type' in value && 'id' in value
248
+ && (value.type === 'focus' || value.type === 'toggle' || value.type === 'activate')
249
+ && typeof value.id === 'string';
250
+ }
251
+ //# sourceMappingURL=listbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listbox.js","sourceRoot":"","sources":["../../../src/internal/composites/listbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Result, StableID } from '../../shared.js';
2
+ import type { Tree } from '../../structures/tree.js';
3
+ import { type CursorState } from '../state/cursor.js';
4
+ export interface MenuState<ID extends StableID = StableID> {
5
+ readonly open: boolean;
6
+ readonly cursor: CursorState<ID>;
7
+ readonly openPath: readonly ID[];
8
+ }
9
+ export type MenuEvent<ID extends StableID = StableID> = 'open-popup' | 'close-popup' | 'next' | 'previous' | 'first' | 'last' | 'open-submenu' | 'close-submenu' | 'invoke' | 'escape' | {
10
+ readonly type: 'focus';
11
+ readonly id: ID;
12
+ };
13
+ export type MenuCommand<ID extends StableID = StableID> = {
14
+ readonly type: 'focus' | 'invoke';
15
+ readonly id: ID;
16
+ } | {
17
+ readonly type: 'restore-focus';
18
+ };
19
+ export interface MenuUpdate<ID extends StableID = StableID> {
20
+ readonly state: MenuState<ID>;
21
+ readonly commands: readonly MenuCommand<ID>[];
22
+ }
23
+ export interface MenuPolicies<ID extends StableID = StableID> {
24
+ readonly disabled?: (id: ID) => boolean;
25
+ }
26
+ export declare function createMenuState<ID extends StableID>(tree: Tree<ID>, open?: boolean, current?: ID | null, openPath?: readonly ID[]): MenuState<ID>;
27
+ export declare function tryCreateMenuState<ID extends StableID>(tree: Tree<ID>, open?: boolean, current?: ID | null, openPath?: readonly ID[]): Result<MenuState<ID>>;
28
+ export declare function applyMenuEvent<ID extends StableID>(tree: Tree<ID>, state: MenuState<ID>, event: MenuEvent<ID>, policies?: MenuPolicies<ID>): Result<MenuUpdate<ID>>;
29
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/internal/composites/menu.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,SAAS,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;CAAE;AACzJ,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AACrO,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AACtJ,MAAM,WAAW,UAAU,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAAI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,CAAC,EAAE,CAAC,EAAE,CAAA;CAAE;AAC5I,MAAM,WAAW,YAAY,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAA;CAAE;AAEzG,wBAAgB,eAAe,CAAC,EAAE,SAAS,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,UAAQ,EAAE,OAAO,GAAE,EAAE,GAAG,IAAW,EAAE,QAAQ,GAAE,SAAS,EAAE,EAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAEzJ;AAED,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,UAAQ,EAAE,OAAO,GAAE,EAAE,GAAG,IAAW,EAAE,QAAQ,GAAE,SAAS,EAAE,EAAO,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAOpK;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAE,YAAY,CAAC,EAAE,CAAM,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAcvK"}
@@ -0,0 +1,76 @@
1
+ import { unwrap } from '../../result.js';
2
+ import { fail, ok } from '../kernel/foundation.js';
3
+ import { createMachineUpdate } from '../kernel/machine.js';
4
+ import { createCursorState } from '../state/cursor.js';
5
+ export function createMenuState(tree, open = false, current = null, openPath = []) {
6
+ return unwrap(tryCreateMenuState(tree, open, current, openPath));
7
+ }
8
+ export function tryCreateMenuState(tree, open = false, current = null, openPath = []) {
9
+ const normalized = tree.normalizeExpansion(openPath).ids;
10
+ if (normalized.length !== openPath.length || normalized.some((id, index) => id !== openPath[index]))
11
+ return fail('construction', 'invalid-menu-open-path', 'Menu open path must contain ordered branch identities.');
12
+ for (let index = 1; index < openPath.length; index += 1)
13
+ if (tree.parentOf(openPath[index]) !== openPath[index - 1])
14
+ return fail('construction', 'disconnected-menu-open-path', 'Menu open path must be one ancestor chain.');
15
+ if (!open && (current !== null || openPath.length > 0))
16
+ return fail('construction', 'closed-menu-has-active-state', 'Closed menu cannot own a cursor or submenu path.');
17
+ if (open && current !== null && !tree.visible(openPath).contains(current))
18
+ return fail('construction', 'menu-cursor-hidden', 'Menu cursor must be visible.');
19
+ return ok(Object.freeze({ open, cursor: createCursorState(current), openPath: Object.freeze([...openPath]) }));
20
+ }
21
+ export function applyMenuEvent(tree, state, event, policies = {}) {
22
+ const valid = tryCreateMenuState(tree, state.open, state.cursor.current, state.openPath);
23
+ if (!valid.ok)
24
+ return { ok: false, error: { ...valid.error, class: 'transition-rejection' } };
25
+ if (event === 'open-popup') {
26
+ if (state.open)
27
+ return createMachineUpdate(state);
28
+ const id = tree.roots.at(0);
29
+ return createMachineUpdate(menuState(true, id, []), id === null ? [] : [{ type: 'focus', id }]);
30
+ }
31
+ if (event === 'close-popup')
32
+ return createMachineUpdate(menuState(false, null, []), state.open ? [{ type: 'restore-focus' }] : []);
33
+ if (!state.open)
34
+ return fail('transition-rejection', 'menu-closed', 'Menu events require an open menu.');
35
+ if (typeof event === 'object') {
36
+ if (!tree.visible(state.openPath).contains(event.id))
37
+ return fail('transition-rejection', 'menu-target-hidden', 'Direct menu focus requires a visible item.');
38
+ return createMachineUpdate(menuState(true, event.id, pathFor(tree, event.id, state.openPath)), [{ type: 'focus', id: event.id }]);
39
+ }
40
+ const current = state.cursor.current;
41
+ if (event === 'escape')
42
+ return closeLevel(tree, state);
43
+ if (current === null) {
44
+ const id = tree.roots.at(event === 'last' ? tree.roots.size - 1 : 0);
45
+ return createMachineUpdate(menuState(true, id, []), id === null ? [] : [{ type: 'focus', id }]);
46
+ }
47
+ if (event === 'next' || event === 'previous' || event === 'first' || event === 'last') {
48
+ const siblings = tree.parentOf(current) === null ? tree.roots : tree.childrenOf(tree.parentOf(current));
49
+ if (siblings === null || siblings.size === 0)
50
+ return createMachineUpdate(state);
51
+ const index = siblings.indexOf(current) ?? 0;
52
+ const target = event === 'first' ? 0 : event === 'last' ? siblings.size - 1 : (index + (event === 'next' ? 1 : -1) + siblings.size) % siblings.size;
53
+ const id = siblings.at(target);
54
+ return id === null ? createMachineUpdate(state) : createMachineUpdate(menuState(true, id, state.openPath), [{ type: 'focus', id }]);
55
+ }
56
+ if (event === 'open-submenu') {
57
+ if (policies.disabled?.(current) === true)
58
+ return createMachineUpdate(state);
59
+ const child = tree.childrenOf(current)?.at(0) ?? null;
60
+ if (child === null)
61
+ return createMachineUpdate(state);
62
+ const path = [...(tree.ancestorsOf(current) ?? [])].reverse().filter((id) => tree.isLeaf(id) === false);
63
+ path.push(current);
64
+ return createMachineUpdate(menuState(true, child, path), [{ type: 'focus', id: child }]);
65
+ }
66
+ if (event === 'close-submenu')
67
+ return closeLevel(tree, state);
68
+ if (tree.isLeaf(current) !== true || policies.disabled?.(current) === true)
69
+ return createMachineUpdate(state);
70
+ return createMachineUpdate(menuState(false, null, []), [{ type: 'invoke', id: current }, { type: 'restore-focus' }]);
71
+ }
72
+ function closeLevel(tree, state) { const current = state.cursor.current; const parent = current === null ? null : tree.parentOf(current); if (parent === null)
73
+ return createMachineUpdate(menuState(false, null, []), [{ type: 'restore-focus' }]); const path = state.openPath.filter((id) => id !== parent && !(tree.ancestorsOf(id) ?? []).includes(parent)); return createMachineUpdate(menuState(true, parent, path), [{ type: 'focus', id: parent }]); }
74
+ function pathFor(tree, id, currentPath) { const ancestors = new Set(tree.ancestorsOf(id) ?? []); return currentPath.filter((branch) => ancestors.has(branch)); }
75
+ function menuState(open, current, openPath) { return Object.freeze({ open, cursor: createCursorState(current), openPath: Object.freeze([...openPath]) }); }
76
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/internal/composites/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Result } from '../../shared.js';
2
+ export interface PopupState {
3
+ readonly open: boolean;
4
+ }
5
+ export type PopupEvent = 'open' | 'close' | 'toggle' | {
6
+ readonly type: 'set-open';
7
+ readonly open: boolean;
8
+ };
9
+ export type PopupCommand = {
10
+ readonly type: 'popup-opened';
11
+ } | {
12
+ readonly type: 'popup-closed';
13
+ };
14
+ export interface PopupUpdate {
15
+ readonly state: PopupState;
16
+ readonly commands: readonly PopupCommand[];
17
+ }
18
+ export declare function createPopupState(open?: boolean): PopupState;
19
+ export declare function tryCreatePopupState(open?: boolean): Result<PopupState>;
20
+ export declare function applyPopupEvent(state: PopupState, event: PopupEvent): Result<PopupUpdate>;
21
+ //# sourceMappingURL=popup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup.d.ts","sourceRoot":"","sources":["../../../src/internal/composites/popup.ts"],"names":[],"mappings":"AACA,OAAO,KAAI,EAAC,MAAM,EAAC,MAAI,iBAAiB,CAAC;AACzC,MAAM,WAAW,UAAU;IAAC,QAAQ,CAAC,IAAI,EAAC,OAAO,CAAA;CAAC;AAAA,MAAM,MAAM,UAAU,GAAC,MAAM,GAAC,OAAO,GAAC,QAAQ,GAAC;IAAC,QAAQ,CAAC,IAAI,EAAC,UAAU,CAAC;IAAA,QAAQ,CAAC,IAAI,EAAC,OAAO,CAAA;CAAC,CAAC;AAAA,MAAM,MAAM,YAAY,GAAC;IAAC,QAAQ,CAAC,IAAI,EAAC,cAAc,CAAA;CAAC,GAAC;IAAC,QAAQ,CAAC,IAAI,EAAC,cAAc,CAAA;CAAC,CAAC;AAAA,MAAM,WAAW,WAAW;IAAC,QAAQ,CAAC,KAAK,EAAC,UAAU,CAAC;IAAA,QAAQ,CAAC,QAAQ,EAAC,SAAS,YAAY,EAAE,CAAA;CAAC;AAC1U,wBAAgB,gBAAgB,CAAC,IAAI,UAAM,GAAE,UAAU,CAA0C;AACjG,wBAAgB,mBAAmB,CAAC,IAAI,UAAM,GAAE,MAAM,CAAC,UAAU,CAAC,CAAyI;AAC3M,wBAAgB,eAAe,CAAC,KAAK,EAAC,UAAU,EAAC,KAAK,EAAC,UAAU,GAAE,MAAM,CAAC,WAAW,CAAC,CAAwjB"}
@@ -0,0 +1,10 @@
1
+ import { unwrap } from '../../result.js';
2
+ import { fail, ok } from '../kernel/foundation.js';
3
+ import { createMachineUpdate } from '../kernel/machine.js';
4
+ export function createPopupState(open = false) { return unwrap(tryCreatePopupState(open)); }
5
+ export function tryCreatePopupState(open = false) { return typeof open === 'boolean' ? ok(Object.freeze({ open })) : fail('construction', 'invalid-popup-state', 'Popup open state must be boolean.'); }
6
+ export function applyPopupEvent(state, event) { if (typeof state.open !== 'boolean')
7
+ return fail('transition-rejection', 'invalid-popup-state', 'Popup open state must be boolean.'); const next = typeof event === 'object' ? event.type === 'set-open' && typeof event.open === 'boolean' ? event.open : null : event === 'toggle' ? !state.open : event === 'open' ? true : event === 'close' ? false : null; if (next === null)
8
+ return fail('transition-rejection', 'invalid-popup-event', 'Popup event is not accepted.'); if (next === state.open)
9
+ return createMachineUpdate(state); return createMachineUpdate(Object.freeze({ open: next }), [{ type: next ? 'popup-opened' : 'popup-closed' }]); }
10
+ //# sourceMappingURL=popup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup.js","sourceRoot":"","sources":["../../../src/internal/composites/popup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACA,OAAM,EAAC,IAAI,EAAC,EAAE,EAAC,MAAI,yBAAyB,CAAC;AAAA,OAAM,EAAC,mBAAmB,EAAC,MAAI,sBAAsB,CAAC;AAE5I,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAC,KAAK,IAAa,OAAO,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA,CAAA,CAAC;AACjG,MAAM,UAAU,mBAAmB,CAAC,IAAI,GAAC,KAAK,IAAqB,OAAO,OAAO,IAAI,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,cAAc,EAAC,qBAAqB,EAAC,mCAAmC,CAAC,CAAA,CAAA,CAAC;AAC3M,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAC,KAAgB,IAAsB,IAAG,OAAO,KAAK,CAAC,IAAI,KAAG,SAAS;IAAC,OAAO,IAAI,CAAC,sBAAsB,EAAC,qBAAqB,EAAC,mCAAmC,CAAC,CAAC,CAAA,MAAM,IAAI,GAAC,OAAO,KAAK,KAAG,QAAQ,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,KAAG,UAAU,IAAE,OAAO,KAAK,CAAC,IAAI,KAAG,SAAS,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,KAAK,KAAG,QAAQ,CAAA,CAAC,CAAA,CAAC,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,KAAK,KAAG,MAAM,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,KAAK,KAAG,OAAO,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,IAAI,CAAC,CAAA,IAAG,IAAI,KAAG,IAAI;IAAC,OAAO,IAAI,CAAC,sBAAsB,EAAC,qBAAqB,EAAC,8BAA8B,CAAC,CAAC,CAAA,IAAG,IAAI,KAAG,KAAK,CAAC,IAAI;IAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,IAAI,CAAA,CAAC,CAAA,cAAc,CAAA,CAAC,CAAA,cAAc,EAAC,CAAC,CAAC,CAAA,CAAA,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Result } from '../../shared.js';
2
+ import type { QuantizedRange } from '../../structures/range.js';
3
+ export type SliderEvent = 'increment' | 'decrement' | 'page-up' | 'page-down' | 'home' | 'end' | {
4
+ readonly type: 'set-tick';
5
+ readonly tick: number;
6
+ };
7
+ export interface SliderState {
8
+ readonly tick: number;
9
+ }
10
+ export interface SliderCommand {
11
+ readonly type: 'announce-tick';
12
+ readonly tick: number;
13
+ }
14
+ export interface SliderUpdate {
15
+ readonly state: SliderState;
16
+ readonly commands: readonly SliderCommand[];
17
+ }
18
+ export declare function createSliderState(range: QuantizedRange, tick?: number): SliderState;
19
+ export declare function tryCreateSliderState(range: QuantizedRange, tick?: number): Result<SliderState>;
20
+ export declare function applySliderEvent(range: QuantizedRange, state: SliderState, event: SliderEvent, page?: number): Result<SliderUpdate>;
21
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/internal/composites/slider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,WAAW,GACX,SAAS,GACT,WAAW,GACX,MAAM,GACN,KAAK,GACL;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,IAAI,SAAI,GACP,WAAW,CAEb;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,IAAI,SAAI,GACP,MAAM,CAAC,WAAW,CAAC,CAUrB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,IAAI,SAAI,GACP,MAAM,CAAC,YAAY,CAAC,CAgEtB"}
@@ -0,0 +1,73 @@
1
+ import { unwrap } from '../../result.js';
2
+ import { fail, ok } from '../kernel/foundation.js';
3
+ import { createMachineUpdate } from '../kernel/machine.js';
4
+ export function createSliderState(range, tick = 0) {
5
+ return unwrap(tryCreateSliderState(range, tick));
6
+ }
7
+ export function tryCreateSliderState(range, tick = 0) {
8
+ if (!isSliderTick(range, tick)) {
9
+ return fail('construction', 'slider-tick-outside-range', 'Slider tick must be a safe integer inside the quantized range.', { tick, count: range.count });
10
+ }
11
+ return ok(sliderState(tick));
12
+ }
13
+ export function applySliderEvent(range, state, event, page = 2) {
14
+ if (!isSliderTick(range, state.tick)) {
15
+ return fail('transition-rejection', 'slider-tick-outside-range', 'Slider tick must be a safe integer inside the quantized range.', { tick: state.tick, count: range.count });
16
+ }
17
+ if (!isSliderEvent(event)) {
18
+ return fail('transition-rejection', 'invalid-slider-event', 'Slider event must be increment, decrement, page-up, page-down, home, or end.', { event });
19
+ }
20
+ if (!Number.isSafeInteger(page) || page < 1) {
21
+ return fail('transition-rejection', 'invalid-slider-page', 'Slider page must be a positive safe integer.', { page });
22
+ }
23
+ if (typeof event === 'object') {
24
+ if (!isSliderTick(range, event.tick)) {
25
+ return fail('transition-rejection', 'slider-tick-outside-range', 'Direct slider input requires a tick inside the quantized range.', { tick: event.tick, count: range.count });
26
+ }
27
+ if (event.tick === state.tick)
28
+ return createMachineUpdate(state);
29
+ return createMachineUpdate(sliderState(event.tick), [{ type: 'announce-tick', tick: event.tick }]);
30
+ }
31
+ let tick;
32
+ switch (event) {
33
+ case 'increment':
34
+ tick = state.tick === range.count ? range.count : state.tick + 1;
35
+ break;
36
+ case 'decrement':
37
+ tick = state.tick === 0 ? 0 : state.tick - 1;
38
+ break;
39
+ case 'page-up':
40
+ tick = page >= range.count - state.tick ? range.count : state.tick + page;
41
+ break;
42
+ case 'page-down':
43
+ tick = page >= state.tick ? 0 : state.tick - page;
44
+ break;
45
+ case 'home':
46
+ tick = 0;
47
+ break;
48
+ case 'end':
49
+ tick = range.count;
50
+ break;
51
+ }
52
+ if (tick === state.tick)
53
+ return createMachineUpdate(state);
54
+ const next = sliderState(tick);
55
+ return createMachineUpdate(next, [{ type: 'announce-tick', tick }]);
56
+ }
57
+ function isSliderTick(range, tick) {
58
+ return Number.isSafeInteger(tick) && tick >= 0 && tick <= range.count;
59
+ }
60
+ function isSliderEvent(value) {
61
+ return typeof value === 'string' ? (value === 'increment' ||
62
+ value === 'decrement' ||
63
+ value === 'page-up' ||
64
+ value === 'page-down' ||
65
+ value === 'home' ||
66
+ value === 'end') : typeof value === 'object' && value !== null
67
+ && 'type' in value && value.type === 'set-tick'
68
+ && 'tick' in value && typeof value.tick === 'number';
69
+ }
70
+ function sliderState(tick) {
71
+ return Object.freeze({ tick });
72
+ }
73
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../../src/internal/composites/slider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { AxisBoundaryPolicy, GridDirection, Result, StableID } from '../../shared.js';
2
+ import type { Grid } from '../../structures/grid.js';
3
+ import type { Tree } from '../../structures/tree.js';
4
+ import { type CursorState } from '../state/cursor.js';
5
+ import { type ExpansionState } from '../state/expansion.js';
6
+ import { type SelectionSnapshotInput, type SelectionState } from '../state/selection.js';
7
+ export type TreeGridEditMode = 'navigation' | 'editing';
8
+ export type TreeGridEvent<RowID extends StableID = StableID, CellID extends StableID = StableID> = GridDirection | 'expand' | 'collapse' | 'select' | 'start-edit' | 'commit-edit' | 'cancel-edit' | {
9
+ readonly type: 'focus';
10
+ readonly id: CellID;
11
+ } | {
12
+ readonly type: 'select';
13
+ readonly id: CellID;
14
+ } | {
15
+ readonly type: 'start-edit';
16
+ readonly id: CellID;
17
+ } | {
18
+ readonly type: 'set-expanded';
19
+ readonly id: RowID;
20
+ readonly open: boolean;
21
+ };
22
+ export type TreeGridCommand<CellID extends StableID = StableID> = {
23
+ readonly type: 'focus';
24
+ readonly id: CellID;
25
+ } | {
26
+ readonly type: 'begin-edit';
27
+ readonly id: CellID;
28
+ } | {
29
+ readonly type: 'commit-edit';
30
+ readonly id: CellID;
31
+ } | {
32
+ readonly type: 'cancel-edit';
33
+ readonly id: CellID;
34
+ };
35
+ export interface TreeGridModel<RowID extends StableID = StableID, CellID extends StableID = StableID> {
36
+ readonly tree: Tree<RowID>;
37
+ readonly grid: Grid<CellID>;
38
+ readonly rowIDs: readonly RowID[];
39
+ rowIndexOf(id: RowID): number | null;
40
+ rowOfCell(id: CellID): RowID | null;
41
+ }
42
+ export interface TreeGridState<RowID extends StableID = StableID, CellID extends StableID = StableID> {
43
+ readonly expansion: ExpansionState<RowID>;
44
+ readonly cursor: CursorState<CellID>;
45
+ readonly selection: SelectionState<CellID>;
46
+ readonly editMode: TreeGridEditMode;
47
+ }
48
+ export interface TreeGridStateInput<RowID extends StableID = StableID, CellID extends StableID = StableID> extends SelectionSnapshotInput<CellID> {
49
+ readonly expanded?: Iterable<RowID>;
50
+ readonly current?: CellID | null;
51
+ readonly editMode?: TreeGridEditMode;
52
+ }
53
+ export interface TreeGridPolicies<CellID extends StableID = StableID> {
54
+ readonly eligible?: (id: CellID) => boolean;
55
+ readonly boundary?: AxisBoundaryPolicy;
56
+ readonly maxScan?: number;
57
+ }
58
+ export interface TreeGridUpdate<RowID extends StableID = StableID, CellID extends StableID = StableID> {
59
+ readonly state: TreeGridState<RowID, CellID>;
60
+ readonly commands: readonly TreeGridCommand<CellID>[];
61
+ }
62
+ export declare function createTreeGridModel<RowID extends StableID, CellID extends StableID>(tree: Tree<RowID>, grid: Grid<CellID>, rowIDs: readonly RowID[]): TreeGridModel<RowID, CellID>;
63
+ export declare function tryCreateTreeGridModel<RowID extends StableID, CellID extends StableID>(tree: Tree<RowID>, grid: Grid<CellID>, rowIDs: readonly RowID[]): Result<TreeGridModel<RowID, CellID>>;
64
+ export declare function createTreeGridState<RowID extends StableID, CellID extends StableID>(model: TreeGridModel<RowID, CellID>, input?: TreeGridStateInput<RowID, CellID>): TreeGridState<RowID, CellID>;
65
+ export declare function tryCreateTreeGridState<RowID extends StableID, CellID extends StableID>(model: TreeGridModel<RowID, CellID>, input?: TreeGridStateInput<RowID, CellID>): Result<TreeGridState<RowID, CellID>>;
66
+ export declare function applyTreeGridEvent<RowID extends StableID, CellID extends StableID>(model: TreeGridModel<RowID, CellID>, state: TreeGridState<RowID, CellID>, event: TreeGridEvent<RowID, CellID>, policies?: TreeGridPolicies<CellID>): Result<TreeGridUpdate<RowID, CellID>>;
67
+ //# sourceMappingURL=tree-grid.d.ts.map