@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 @@
1
+ {"version":3,"file":"tree-grid.js","sourceRoot":"","sources":["../src/tree-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAC,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAC,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,mBAAmB,EAEnB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAW5C,MAAM,UAAU,2BAA2B,CAIzC,IAAgD;IAEhD,OAAO,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAI5C,IAAgD;IAEhD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GASpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyTreeViewEvent, createTreeViewState, type TreeViewCommand, type TreeViewEvent, type TreeViewPolicies, type TreeViewSelectionMode, type TreeViewState, type TreeViewStateInput, type TreeViewUpdate, } from './internal/composites/tree-view.js';
2
+ export { tryCreateTreeViewState } from './internal/composites/tree-view.js';
3
+ //# sourceMappingURL=tree-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../src/tree-view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { applyTreeViewEvent, createTreeViewState, } from './internal/composites/tree-view.js';
2
+ export { tryCreateTreeViewState } from './internal/composites/tree-view.js';
3
+ //# sourceMappingURL=tree-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-view.js","sourceRoot":"","sources":["../src/tree-view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAQpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { Result, StableID } from './shared.js';
2
+ import { type DecimalRounding } from './internal/kernel/decimal.js';
3
+ export type UnitID = StableID;
4
+ export type Dimension = Readonly<Record<string, number>>;
5
+ export interface UnitRatio {
6
+ readonly numerator: string;
7
+ readonly denominator: string;
8
+ }
9
+ export type UnitScalar = string | UnitRatio;
10
+ export interface UnitDefinition {
11
+ readonly id: UnitID;
12
+ readonly symbol: string;
13
+ readonly aliases?: readonly string[];
14
+ readonly dimension: Dimension;
15
+ readonly scale: UnitScalar;
16
+ readonly offset?: UnitScalar;
17
+ }
18
+ export interface UnitExpressionFactor {
19
+ readonly unit: UnitID;
20
+ readonly exponent: number;
21
+ }
22
+ export interface UnitExpression {
23
+ readonly source: string;
24
+ readonly dimension: Dimension;
25
+ readonly scale: UnitScalar;
26
+ readonly offset?: UnitScalar;
27
+ readonly resolvedUnit: UnitID | null;
28
+ readonly factors: readonly UnitExpressionFactor[];
29
+ }
30
+ export interface UnitConversionOptions {
31
+ readonly precision?: number;
32
+ readonly rounding?: DecimalRounding;
33
+ }
34
+ export interface UnitConversion {
35
+ readonly value: string;
36
+ readonly from: UnitID;
37
+ readonly to: UnitID;
38
+ }
39
+ export interface UnitExpressionConversion {
40
+ readonly value: string;
41
+ readonly from: UnitExpression;
42
+ readonly to: UnitID;
43
+ }
44
+ export interface UnitRegistry {
45
+ readonly units: readonly UnitDefinition[];
46
+ get(id: UnitID): UnitDefinition | null;
47
+ compatible(left: UnitID, right: UnitID): boolean;
48
+ parse(expression: string): Result<UnitExpression>;
49
+ convert(value: string, from: UnitID, to: UnitID, options?: UnitConversionOptions): Result<UnitConversion>;
50
+ convertExpression(value: string, from: string | UnitExpression, to: UnitID, options?: UnitConversionOptions): Result<UnitExpressionConversion>;
51
+ }
52
+ export interface UnitSystemPreferenceDefinition {
53
+ readonly referenceUnit: UnitID;
54
+ readonly defaultUnit: UnitID;
55
+ readonly units: readonly UnitID[];
56
+ }
57
+ export interface UnitSystemDefinition {
58
+ readonly id: StableID;
59
+ readonly preferences: readonly UnitSystemPreferenceDefinition[];
60
+ }
61
+ export interface UnitSystemProfile {
62
+ readonly id: StableID;
63
+ getDefaultUnit(canonicalUnit: UnitID): UnitID | null;
64
+ getUnits(canonicalUnit: UnitID): readonly UnitID[];
65
+ }
66
+ export declare function createUnitRegistry(definitions: readonly UnitDefinition[]): UnitRegistry;
67
+ export declare function tryCreateUnitRegistry(definitions: readonly UnitDefinition[]): Result<UnitRegistry>;
68
+ export declare function createUnitSystemProfile(registry: UnitRegistry, definition: UnitSystemDefinition): UnitSystemProfile;
69
+ export declare function tryCreateUnitSystemProfile(registry: UnitRegistry, definition: UnitSystemDefinition): Result<UnitSystemProfile>;
70
+ export declare const standardUnitDefinitions: readonly UnitDefinition[];
71
+ export declare function createStandardUnitRegistry(): UnitRegistry;
72
+ export declare function tryCreateStandardUnitRegistry(): Result<UnitRegistry>;
73
+ export declare function createMetricUnitSystem(registry: UnitRegistry): UnitSystemProfile;
74
+ export declare function tryCreateMetricUnitSystem(registry: UnitRegistry): Result<UnitSystemProfile>;
75
+ export declare function createImperialUnitSystem(registry: UnitRegistry): UnitSystemProfile;
76
+ export declare function tryCreateImperialUnitSystem(registry: UnitRegistry): Result<UnitSystemProfile>;
77
+ //# sourceMappingURL=units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../src/units.ts"],"names":[],"mappings":"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"}
package/dist/units.js ADDED
@@ -0,0 +1,512 @@
1
+ import { unwrap } from './result.js';
2
+ import { decimalToString, divideDecimal, parseDecimal, pow10, reduceFraction, } from './internal/kernel/decimal.js';
3
+ import { fail, ok, validateSafeCeiling } from './internal/kernel/foundation.js';
4
+ export function createUnitRegistry(definitions) {
5
+ return unwrap(tryCreateUnitRegistry(definitions));
6
+ }
7
+ export function tryCreateUnitRegistry(definitions) {
8
+ if (!Array.isArray(definitions) || definitions.length === 0) {
9
+ return fail('construction', 'empty-unit-registry', 'Unit registry requires at least one definition.');
10
+ }
11
+ const units = new Map();
12
+ for (const definition of definitions) {
13
+ const normalized = normalizeUnitDefinition(definition);
14
+ if (!normalized.ok)
15
+ return normalized;
16
+ if (units.has(normalized.value.definition.id)) {
17
+ return fail('construction', 'duplicate-unit-id', 'Unit IDs must be unique.', { id: normalized.value.definition.id });
18
+ }
19
+ units.set(normalized.value.definition.id, normalized.value);
20
+ }
21
+ const publicUnits = Object.freeze([...units.values()].map(({ definition }) => definition));
22
+ const tokens = createUnitTokens(units);
23
+ if (!tokens.ok)
24
+ return tokens;
25
+ const registry = Object.freeze({
26
+ units: publicUnits,
27
+ get(id) {
28
+ return units.get(id)?.definition ?? null;
29
+ },
30
+ compatible(left, right) {
31
+ const a = units.get(left);
32
+ const b = units.get(right);
33
+ return a !== undefined && b !== undefined && a.dimensionKey === b.dimensionKey;
34
+ },
35
+ parse(expression) {
36
+ return parseUnitExpression(units, tokens.value, expression);
37
+ },
38
+ convert(value, from, to, options = {}) {
39
+ return convertUnitValue(units, value, from, to, options);
40
+ },
41
+ convertExpression(value, from, to, options = {}) {
42
+ const expression = typeof from === 'string' ? parseUnitExpression(units, tokens.value, from) : normalizeUnitExpression(units, from);
43
+ if (!expression.ok)
44
+ return expression;
45
+ return convertExpressionValue(units, value, expression.value, to, options);
46
+ },
47
+ });
48
+ return ok(registry);
49
+ }
50
+ export function createUnitSystemProfile(registry, definition) {
51
+ return unwrap(tryCreateUnitSystemProfile(registry, definition));
52
+ }
53
+ export function tryCreateUnitSystemProfile(registry, definition) {
54
+ if (typeof registry !== 'object' || registry === null || typeof registry.compatible !== 'function') {
55
+ return fail('construction', 'invalid-unit-registry', 'Unit system profile requires a unit registry.');
56
+ }
57
+ if (typeof definition !== 'object' || definition === null || typeof definition.id !== 'string' || definition.id.length === 0
58
+ || !Array.isArray(definition.preferences)) {
59
+ return fail('construction', 'invalid-unit-system', 'Unit system definition requires an ID and preferences.');
60
+ }
61
+ const preferences = new Map();
62
+ for (const preference of definition.preferences) {
63
+ if (registry.get(preference.referenceUnit) === null || registry.get(preference.defaultUnit) === null
64
+ || !Array.isArray(preference.units) || preference.units.length === 0) {
65
+ return fail('construction', 'invalid-unit-system-preference', 'Unit system preference requires registered reference, default, and display units.');
66
+ }
67
+ const displayUnits = Object.freeze([...new Set(preference.units)]);
68
+ if (!displayUnits.includes(preference.defaultUnit)
69
+ || displayUnits.some((unit) => registry.get(unit) === null || !registry.compatible(preference.referenceUnit, unit))) {
70
+ return fail('construction', 'incompatible-unit-system-preference', 'Unit system preference units must share one dimension and include the default unit.', { referenceUnit: preference.referenceUnit });
71
+ }
72
+ for (const unit of registry.units) {
73
+ if (!registry.compatible(preference.referenceUnit, unit.id))
74
+ continue;
75
+ if (preferences.has(unit.id)) {
76
+ return fail('construction', 'duplicate-unit-system-dimension', 'Unit system may declare each dimension only once.', { referenceUnit: preference.referenceUnit });
77
+ }
78
+ preferences.set(unit.id, Object.freeze({ defaultUnit: preference.defaultUnit, units: displayUnits }));
79
+ }
80
+ }
81
+ return ok(Object.freeze({
82
+ id: definition.id,
83
+ getDefaultUnit(canonicalUnit) {
84
+ return preferences.get(canonicalUnit)?.defaultUnit ?? null;
85
+ },
86
+ getUnits(canonicalUnit) {
87
+ return preferences.get(canonicalUnit)?.units ?? Object.freeze([]);
88
+ },
89
+ }));
90
+ }
91
+ function createUnitTokens(units) {
92
+ const tokens = new Map();
93
+ for (const { definition } of units.values()) {
94
+ const candidates = [definition.id, definition.symbol, ...(definition.aliases ?? [])];
95
+ for (const token of candidates) {
96
+ if (containsUnitGrammar(token))
97
+ continue;
98
+ const previous = tokens.get(token);
99
+ if (previous !== undefined && previous !== definition.id) {
100
+ return fail('construction', 'ambiguous-unit-token', 'Unit symbols and aliases must resolve to one unit.', { token, units: [previous, definition.id] });
101
+ }
102
+ tokens.set(token, definition.id);
103
+ }
104
+ }
105
+ return ok(Object.freeze([...tokens].map(([text, unit]) => Object.freeze({ text, unit }))
106
+ .sort((left, right) => right.text.length - left.text.length || left.text.localeCompare(right.text))));
107
+ }
108
+ function containsUnitGrammar(token) {
109
+ return /[*/·^⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻]/u.test(token);
110
+ }
111
+ function parseUnitExpression(units, tokens, source) {
112
+ if (typeof source !== 'string' || source.trim().length === 0) {
113
+ return fail('transition-rejection', 'empty-unit-expression', 'Unit expression must not be empty.');
114
+ }
115
+ const input = source.trim();
116
+ const factors = [];
117
+ let position = 0;
118
+ let sign = 1;
119
+ while (position < input.length) {
120
+ position = skipSpaces(input, position);
121
+ const token = tokens.find((candidate) => input.startsWith(candidate.text, position)
122
+ && isUnitBoundary(input[position + candidate.text.length]));
123
+ if (token === undefined) {
124
+ return fail('transition-rejection', 'unknown-unit-token', 'Unit expression contains an unknown or ambiguous token.', { expression: source, position });
125
+ }
126
+ position += token.text.length;
127
+ const exponent = parseUnitExponent(input, position);
128
+ if (!exponent.ok)
129
+ return exponent;
130
+ position = exponent.value.position;
131
+ const signedExponent = exponent.value.value * sign;
132
+ if (signedExponent === 0 || Math.abs(signedExponent) > 16) {
133
+ return fail('transition-rejection', 'unit-exponent-out-of-range', 'Unit exponents must be non-zero integers from -16 through 16.', { exponent: signedExponent });
134
+ }
135
+ factors.push(Object.freeze({ unit: token.unit, exponent: signedExponent }));
136
+ const beforeSpace = position;
137
+ position = skipSpaces(input, position);
138
+ if (position >= input.length)
139
+ break;
140
+ const separator = input[position];
141
+ if (separator === '/' || separator === '*' || separator === '·') {
142
+ sign = separator === '/' ? -1 : 1;
143
+ position += 1;
144
+ }
145
+ else if (position > beforeSpace) {
146
+ sign = 1;
147
+ }
148
+ else {
149
+ return fail('transition-rejection', 'invalid-unit-expression', 'Unit factors require whitespace, multiplication, or division separators.', { expression: source, position });
150
+ }
151
+ }
152
+ if (factors.length === 0)
153
+ return fail('transition-rejection', 'empty-unit-expression', 'Unit expression must contain at least one factor.');
154
+ return buildUnitExpression(units, input, factors);
155
+ }
156
+ function buildUnitExpression(units, source, factors) {
157
+ const dimensions = new Map();
158
+ let scale = normalizeFraction(1n, 1n);
159
+ let offset = normalizeFraction(0n, 1n);
160
+ for (const factor of factors) {
161
+ const unit = units.get(factor.unit);
162
+ if (unit === undefined)
163
+ return fail('transition-rejection', 'unknown-unit', 'Unit expression references an unregistered unit.', { unit: factor.unit });
164
+ if (unit.offset.numerator !== 0n) {
165
+ if (factors.length !== 1 || factor.exponent !== 1) {
166
+ return fail('transition-rejection', 'affine-unit-in-compound-expression', 'Offset units may only appear as a single unit with exponent one.', { unit: factor.unit });
167
+ }
168
+ offset = unit.offset;
169
+ }
170
+ for (const [name, exponent] of Object.entries(unit.definition.dimension)) {
171
+ dimensions.set(name, (dimensions.get(name) ?? 0) + exponent * factor.exponent);
172
+ }
173
+ scale = multiplyFractions(scale, powerFraction(unit.scale, factor.exponent));
174
+ }
175
+ const dimension = normalizeDimension(Object.fromEntries(dimensions));
176
+ if (!dimension.ok)
177
+ return dimension;
178
+ const resolved = [...units.values()].find((unit) => unit.dimensionKey === dimension.value.key
179
+ && sameFraction(unit.scale, scale) && sameFraction(unit.offset, offset));
180
+ return ok(Object.freeze({
181
+ source,
182
+ dimension: dimension.value.dimension,
183
+ scale: scalarFromFraction(scale),
184
+ ...(offset.numerator === 0n ? {} : { offset: scalarFromFraction(offset) }),
185
+ resolvedUnit: resolved?.definition.id ?? null,
186
+ factors: Object.freeze([...factors]),
187
+ }));
188
+ }
189
+ function normalizeUnitExpression(units, expression) {
190
+ if (typeof expression !== 'object' || expression === null || typeof expression.source !== 'string'
191
+ || !Array.isArray(expression.factors)) {
192
+ return fail('transition-rejection', 'invalid-unit-expression', 'Parsed unit expression must contain source text and factors.');
193
+ }
194
+ for (const factor of expression.factors) {
195
+ if (typeof factor !== 'object' || factor === null || typeof factor.unit !== 'string'
196
+ || !Number.isSafeInteger(factor.exponent) || factor.exponent === 0 || Math.abs(factor.exponent) > 16) {
197
+ return fail('transition-rejection', 'invalid-unit-expression-factor', 'Unit expression factors require a registered unit and a bounded non-zero exponent.');
198
+ }
199
+ }
200
+ return buildUnitExpression(units, expression.source, expression.factors);
201
+ }
202
+ function convertExpressionValue(units, value, expression, to, options) {
203
+ const target = units.get(to);
204
+ const parsed = parseDecimal(value);
205
+ if (target === undefined)
206
+ return fail('transition-rejection', 'unknown-unit', 'Unit conversion requires a registered target unit.', { to });
207
+ if (parsed === null)
208
+ return fail('transition-rejection', 'invalid-unit-value', 'Unit conversion value must be finite decimal text.', { value });
209
+ const dimension = normalizeDimension(expression.dimension);
210
+ const scale = parseScalar(expression.scale, 'scale', expression.resolvedUnit ?? 'expression');
211
+ const offset = parseScalar(expression.offset ?? '0', 'offset', expression.resolvedUnit ?? 'expression');
212
+ if (!dimension.ok)
213
+ return dimension;
214
+ if (!scale.ok)
215
+ return scale;
216
+ if (!offset.ok)
217
+ return offset;
218
+ if (dimension.value.key !== target.dimensionKey) {
219
+ return fail('transition-rejection', 'incompatible-unit-dimensions', 'Unit conversion requires matching dimensions.', { expression: expression.source, to });
220
+ }
221
+ const normalizedOptions = normalizeConversionOptions(options);
222
+ if (!normalizedOptions.ok)
223
+ return normalizedOptions;
224
+ const canonical = addFractions(multiplyFractions(decimalFraction(parsed), scale.value), offset.value);
225
+ const targetValue = divideFractions(subtractFractions(canonical, target.offset), target.scale);
226
+ const converted = divideDecimal({ coefficient: targetValue.numerator, scale: 0 }, { coefficient: targetValue.denominator, scale: 0 }, normalizedOptions.value.precision, normalizedOptions.value.rounding);
227
+ if (converted === null)
228
+ return fail('internal-invariant', 'unit-conversion-zero-scale', 'Normalized unit scale must not be zero.');
229
+ return ok(Object.freeze({ value: decimalToString(converted), from: expression, to }));
230
+ }
231
+ function parseUnitExponent(input, position) {
232
+ if (input[position] === '^') {
233
+ const match = /^[+-]?\d+/.exec(input.slice(position + 1));
234
+ if (match === null)
235
+ return fail('transition-rejection', 'invalid-unit-exponent', 'Caret unit exponent requires a signed integer.', { position });
236
+ return ok(Object.freeze({ value: Number(match[0]), position: position + 1 + match[0].length }));
237
+ }
238
+ const match = /^[⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻]+/u.exec(input.slice(position));
239
+ if (match === null)
240
+ return ok(Object.freeze({ value: 1, position }));
241
+ const normal = [...match[0]].map((part) => SUPERSCRIPT_DIGITS[part] ?? '').join('');
242
+ if (!/^[+-]?\d+$/.test(normal))
243
+ return fail('transition-rejection', 'invalid-unit-exponent', 'Superscript unit exponent requires a signed integer.', { position });
244
+ return ok(Object.freeze({ value: Number(normal), position: position + match[0].length }));
245
+ }
246
+ const SUPERSCRIPT_DIGITS = Object.freeze({
247
+ '⁰': '0', '¹': '1', '²': '2', '³': '3', '⁴': '4', '⁵': '5',
248
+ '⁶': '6', '⁷': '7', '⁸': '8', '⁹': '9', '⁺': '+', '⁻': '-',
249
+ });
250
+ function isUnitBoundary(value) {
251
+ return value === undefined || /[\s*/·^⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻]/u.test(value);
252
+ }
253
+ function skipSpaces(value, position) {
254
+ while (position < value.length && /\s/u.test(value[position] ?? ''))
255
+ position += 1;
256
+ return position;
257
+ }
258
+ function powerFraction(value, exponent) {
259
+ let result = normalizeFraction(1n, 1n);
260
+ const factor = exponent < 0 ? normalizeFraction(value.denominator, value.numerator) : value;
261
+ for (let index = 0; index < Math.abs(exponent); index += 1)
262
+ result = multiplyFractions(result, factor);
263
+ return result;
264
+ }
265
+ function sameFraction(left, right) {
266
+ return left.numerator === right.numerator && left.denominator === right.denominator;
267
+ }
268
+ function convertUnitValue(units, value, from, to, options) {
269
+ const source = units.get(from);
270
+ const target = units.get(to);
271
+ if (source === undefined || target === undefined) {
272
+ return fail('transition-rejection', 'unknown-unit', 'Unit conversion requires registered source and target units.', { from, to });
273
+ }
274
+ if (source.dimensionKey !== target.dimensionKey) {
275
+ return fail('transition-rejection', 'incompatible-unit-dimensions', 'Unit conversion requires matching dimensions.', { from, to });
276
+ }
277
+ const parsed = parseDecimal(value);
278
+ if (parsed === null) {
279
+ return fail('transition-rejection', 'invalid-unit-value', 'Unit conversion value must be finite decimal text.', { value });
280
+ }
281
+ const normalizedOptions = normalizeConversionOptions(options);
282
+ if (!normalizedOptions.ok)
283
+ return normalizedOptions;
284
+ if (from === to)
285
+ return ok(Object.freeze({ value: decimalToString(parsed), from, to }));
286
+ const canonical = addFractions(multiplyFractions(decimalFraction(parsed), source.scale), source.offset);
287
+ const targetValue = divideFractions(subtractFractions(canonical, target.offset), target.scale);
288
+ const converted = divideDecimal({ coefficient: targetValue.numerator, scale: 0 }, { coefficient: targetValue.denominator, scale: 0 }, normalizedOptions.value.precision, normalizedOptions.value.rounding);
289
+ if (converted === null)
290
+ return fail('internal-invariant', 'unit-conversion-zero-scale', 'Normalized unit scale must not be zero.');
291
+ return ok(Object.freeze({ value: decimalToString(converted), from, to }));
292
+ }
293
+ function normalizeUnitDefinition(definition) {
294
+ if (typeof definition !== 'object' || definition === null) {
295
+ return fail('construction', 'invalid-unit-definition', 'Unit definition must be an object.');
296
+ }
297
+ if (typeof definition.id !== 'string' || definition.id.length === 0) {
298
+ return fail('construction', 'invalid-unit-id', 'Unit ID must be non-empty text.');
299
+ }
300
+ if (typeof definition.symbol !== 'string' || definition.symbol.length === 0) {
301
+ return fail('construction', 'invalid-unit-symbol', 'Unit symbol must be non-empty text.', { id: definition.id });
302
+ }
303
+ if (definition.aliases !== undefined && (!Array.isArray(definition.aliases)
304
+ || definition.aliases.some((alias) => typeof alias !== 'string' || alias.length === 0))) {
305
+ return fail('construction', 'invalid-unit-aliases', 'Unit aliases must be non-empty text.', { id: definition.id });
306
+ }
307
+ const aliases = Object.freeze([...new Set(definition.aliases ?? [])]);
308
+ const dimension = normalizeDimension(definition.dimension);
309
+ if (!dimension.ok)
310
+ return dimension;
311
+ const scale = parseScalar(definition.scale, 'scale', definition.id);
312
+ if (!scale.ok)
313
+ return scale;
314
+ if (scale.value.numerator <= 0n) {
315
+ return fail('construction', 'invalid-unit-scale', 'Unit scale must be a positive finite decimal.', { id: definition.id, scale: definition.scale });
316
+ }
317
+ const offset = parseScalar(definition.offset ?? '0', 'offset', definition.id);
318
+ if (!offset.ok)
319
+ return offset;
320
+ const normalizedDefinition = Object.freeze({
321
+ id: definition.id,
322
+ symbol: definition.symbol,
323
+ ...(aliases.length === 0 ? {} : { aliases }),
324
+ dimension: dimension.value.dimension,
325
+ scale: scalarFromFraction(scale.value),
326
+ ...(offset.value.numerator === 0n ? {} : { offset: scalarFromFraction(offset.value) }),
327
+ });
328
+ return ok(Object.freeze({
329
+ definition: normalizedDefinition,
330
+ dimensionKey: dimension.value.key,
331
+ scale: scale.value,
332
+ offset: offset.value,
333
+ }));
334
+ }
335
+ function parseScalar(value, name, id) {
336
+ if (typeof value === 'string') {
337
+ const parsed = parseDecimal(value);
338
+ return parsed === null
339
+ ? fail('construction', `invalid-unit-${name}`, `Unit ${name} must be finite decimal text or an exact ratio.`, { id, value })
340
+ : ok(decimalFraction(parsed));
341
+ }
342
+ if (typeof value !== 'object' || value === null) {
343
+ return fail('construction', `invalid-unit-${name}`, `Unit ${name} must be finite decimal text or an exact ratio.`, { id });
344
+ }
345
+ const numerator = parseDecimal(value.numerator);
346
+ const denominator = parseDecimal(value.denominator);
347
+ if (numerator === null || denominator === null || denominator.coefficient === 0n) {
348
+ return fail('construction', `invalid-unit-${name}`, `Unit ${name} ratio requires finite decimal numerator and non-zero denominator.`, { id });
349
+ }
350
+ return ok(divideFractions(decimalFraction(numerator), decimalFraction(denominator)));
351
+ }
352
+ function decimalFraction(value) {
353
+ return normalizeFraction(value.coefficient, pow10(value.scale));
354
+ }
355
+ function scalarFromFraction(value) {
356
+ return value.denominator === 1n
357
+ ? value.numerator.toString()
358
+ : Object.freeze({ numerator: value.numerator.toString(), denominator: value.denominator.toString() });
359
+ }
360
+ function addFractions(left, right) {
361
+ return normalizeFraction(left.numerator * right.denominator + right.numerator * left.denominator, left.denominator * right.denominator);
362
+ }
363
+ function subtractFractions(left, right) {
364
+ return normalizeFraction(left.numerator * right.denominator - right.numerator * left.denominator, left.denominator * right.denominator);
365
+ }
366
+ function multiplyFractions(left, right) {
367
+ return normalizeFraction(left.numerator * right.numerator, left.denominator * right.denominator);
368
+ }
369
+ function divideFractions(left, right) {
370
+ return normalizeFraction(left.numerator * right.denominator, left.denominator * right.numerator);
371
+ }
372
+ function normalizeFraction(numerator, denominator) {
373
+ const [nextNumerator, nextDenominator] = reduceFraction(numerator, denominator);
374
+ return Object.freeze({ numerator: nextNumerator, denominator: nextDenominator });
375
+ }
376
+ function normalizeDimension(dimension) {
377
+ if (typeof dimension !== 'object' || dimension === null || Array.isArray(dimension)) {
378
+ return fail('construction', 'invalid-unit-dimension', 'Unit dimension must be an exponent record.');
379
+ }
380
+ const entries = [];
381
+ for (const [name, exponent] of Object.entries(dimension)) {
382
+ if (name.length === 0 || !Number.isSafeInteger(exponent)) {
383
+ return fail('construction', 'invalid-dimension-exponent', 'Dimension names must be non-empty and exponents must be safe integers.', { name, exponent });
384
+ }
385
+ if (exponent !== 0)
386
+ entries.push([name, exponent]);
387
+ }
388
+ entries.sort(([left], [right]) => left.localeCompare(right));
389
+ const normalized = Object.freeze(Object.fromEntries(entries));
390
+ return ok(Object.freeze({
391
+ dimension: normalized,
392
+ key: entries.map(([name, exponent]) => `${name}:${exponent}`).join('|'),
393
+ }));
394
+ }
395
+ const LENGTH = Object.freeze({ length: 1 });
396
+ const AREA = Object.freeze({ length: 2 });
397
+ const VOLUME = Object.freeze({ length: 3 });
398
+ const MASS = Object.freeze({ mass: 1 });
399
+ const TIME = Object.freeze({ time: 1 });
400
+ const TEMPERATURE = Object.freeze({ temperature: 1 });
401
+ const SPEED = Object.freeze({ length: 1, time: -1 });
402
+ const ACCELERATION = Object.freeze({ length: 1, time: -2 });
403
+ const INFORMATION = Object.freeze({ information: 1 });
404
+ export const standardUnitDefinitions = Object.freeze([
405
+ unit('millimetre', 'mm', LENGTH, '0.001', ['millimeter']),
406
+ unit('centimetre', 'cm', LENGTH, '0.01', ['centimeter']),
407
+ unit('metre', 'm', LENGTH, '1', ['meter']),
408
+ unit('kilometre', 'km', LENGTH, '1000', ['kilometer']),
409
+ unit('inch', 'in', LENGTH, '0.0254'),
410
+ unit('foot', 'ft', LENGTH, '0.3048', ['feet']),
411
+ unit('yard', 'yd', LENGTH, '0.9144'),
412
+ unit('mile', 'mi', LENGTH, '1609.344'),
413
+ unit('square-metre', 'm²', AREA, '1', ['square-meter']),
414
+ unit('hectare', 'ha', AREA, '10000'),
415
+ unit('square-foot', 'ft²', AREA, '0.09290304'),
416
+ unit('acre', 'acre', AREA, '4046.8564224'),
417
+ unit('millilitre', 'mL', VOLUME, '0.000001', ['milliliter']),
418
+ unit('litre', 'L', VOLUME, '0.001', ['liter']),
419
+ unit('cubic-metre', 'm³', VOLUME, '1', ['cubic-meter']),
420
+ unit('fluid-ounce', 'fl oz', VOLUME, '0.0000295735295625', ['floz', 'fl-oz']),
421
+ unit('cup', 'cup', VOLUME, '0.0002365882365'),
422
+ unit('gallon', 'gal', VOLUME, '0.003785411784'),
423
+ unit('milligram', 'mg', MASS, '0.000001'),
424
+ unit('gram', 'g', MASS, '0.001'),
425
+ unit('kilogram', 'kg', MASS, '1'),
426
+ unit('ounce', 'oz', MASS, '0.028349523125'),
427
+ unit('pound', 'lb', MASS, '0.45359237'),
428
+ unit('millisecond', 'ms', TIME, '0.001'),
429
+ unit('second', 's', TIME, '1', ['sec']),
430
+ unit('minute', 'min', TIME, '60'),
431
+ unit('hour', 'h', TIME, '3600', ['hr']),
432
+ unit('kelvin', 'K', TEMPERATURE, '1'),
433
+ affineUnit('celsius', '°C', TEMPERATURE, '1', '273.15', ['degC']),
434
+ affineUnit('fahrenheit', '°F', TEMPERATURE, { numerator: '5', denominator: '9' }, { numerator: '45967', denominator: '180' }, ['degF']),
435
+ unit('metre-per-second', 'm/s', SPEED, '1', ['meter-per-second']),
436
+ unit('kilometre-per-hour', 'km/h', SPEED, { numerator: '5', denominator: '18' }, ['kph']),
437
+ unit('foot-per-second', 'ft/s', SPEED, '0.3048', ['fps']),
438
+ unit('mile-per-hour', 'mph', SPEED, '0.44704'),
439
+ unit('metre-per-second-squared', 'm/s²', ACCELERATION, '1', ['meter-per-second-squared']),
440
+ unit('foot-per-second-squared', 'ft/s²', ACCELERATION, '0.3048'),
441
+ unit('bit', 'bit', INFORMATION, '0.125'),
442
+ unit('byte', 'B', INFORMATION, '1'),
443
+ unit('kilobyte', 'kB', INFORMATION, '1000'),
444
+ unit('megabyte', 'MB', INFORMATION, '1000000'),
445
+ unit('kibibyte', 'KiB', INFORMATION, '1024'),
446
+ unit('mebibyte', 'MiB', INFORMATION, '1048576'),
447
+ ]);
448
+ export function createStandardUnitRegistry() {
449
+ return unwrap(tryCreateStandardUnitRegistry());
450
+ }
451
+ export function tryCreateStandardUnitRegistry() {
452
+ return tryCreateUnitRegistry(standardUnitDefinitions);
453
+ }
454
+ export function createMetricUnitSystem(registry) {
455
+ return unwrap(tryCreateMetricUnitSystem(registry));
456
+ }
457
+ export function tryCreateMetricUnitSystem(registry) {
458
+ return tryCreateUnitSystemProfile(registry, {
459
+ id: 'metric',
460
+ preferences: [
461
+ preference('metre', 'metre', ['millimetre', 'centimetre', 'metre', 'kilometre']),
462
+ preference('square-metre', 'square-metre', ['square-metre', 'hectare']),
463
+ preference('cubic-metre', 'litre', ['millilitre', 'litre', 'cubic-metre']),
464
+ preference('kilogram', 'kilogram', ['milligram', 'gram', 'kilogram']),
465
+ preference('second', 'second', ['millisecond', 'second', 'minute', 'hour']),
466
+ preference('kelvin', 'celsius', ['celsius', 'kelvin']),
467
+ preference('metre-per-second', 'kilometre-per-hour', ['metre-per-second', 'kilometre-per-hour']),
468
+ preference('metre-per-second-squared', 'metre-per-second-squared', ['metre-per-second-squared']),
469
+ preference('byte', 'byte', ['bit', 'byte', 'kilobyte', 'megabyte', 'kibibyte', 'mebibyte']),
470
+ ],
471
+ });
472
+ }
473
+ export function createImperialUnitSystem(registry) {
474
+ return unwrap(tryCreateImperialUnitSystem(registry));
475
+ }
476
+ export function tryCreateImperialUnitSystem(registry) {
477
+ return tryCreateUnitSystemProfile(registry, {
478
+ id: 'imperial',
479
+ preferences: [
480
+ preference('metre', 'foot', ['inch', 'foot', 'yard', 'mile']),
481
+ preference('square-metre', 'square-foot', ['square-foot', 'acre']),
482
+ preference('cubic-metre', 'gallon', ['fluid-ounce', 'cup', 'gallon']),
483
+ preference('kilogram', 'pound', ['ounce', 'pound']),
484
+ preference('second', 'second', ['millisecond', 'second', 'minute', 'hour']),
485
+ preference('kelvin', 'fahrenheit', ['fahrenheit', 'kelvin']),
486
+ preference('metre-per-second', 'mile-per-hour', ['foot-per-second', 'mile-per-hour']),
487
+ preference('metre-per-second-squared', 'foot-per-second-squared', ['foot-per-second-squared']),
488
+ preference('byte', 'byte', ['bit', 'byte', 'kilobyte', 'megabyte', 'kibibyte', 'mebibyte']),
489
+ ],
490
+ });
491
+ }
492
+ function unit(id, symbol, dimension, scale, aliases = []) {
493
+ return Object.freeze({ id, symbol, dimension, scale, ...(aliases.length === 0 ? {} : { aliases: Object.freeze([...aliases]) }) });
494
+ }
495
+ function affineUnit(id, symbol, dimension, scale, offset, aliases = []) {
496
+ return Object.freeze({ ...unit(id, symbol, dimension, scale, aliases), offset });
497
+ }
498
+ function preference(referenceUnit, defaultUnit, units) {
499
+ return Object.freeze({ referenceUnit, defaultUnit, units: Object.freeze([...units]) });
500
+ }
501
+ function normalizeConversionOptions(options) {
502
+ const precision = options.precision ?? 12;
503
+ const error = validateSafeCeiling(precision, 'precision', 0);
504
+ if (error !== null)
505
+ return { ok: false, error };
506
+ const rounding = options.rounding ?? 'half-even';
507
+ if (rounding !== 'half-even' && rounding !== 'half-up' && rounding !== 'toward-zero') {
508
+ return fail('construction', 'invalid-unit-rounding', 'Unit rounding must be half-even, half-up, or toward-zero.');
509
+ }
510
+ return ok(Object.freeze({ precision, rounding }));
511
+ }
512
+ //# sourceMappingURL=units.js.map