@sectile/core 0.1.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 (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/accordion.d.ts +43 -0
  4. package/dist/accordion.d.ts.map +1 -0
  5. package/dist/accordion.js +83 -0
  6. package/dist/accordion.js.map +1 -0
  7. package/dist/alert-dialog.d.ts +18 -0
  8. package/dist/alert-dialog.d.ts.map +1 -0
  9. package/dist/alert-dialog.js +9 -0
  10. package/dist/alert-dialog.js.map +1 -0
  11. package/dist/calendar.d.ts +2 -0
  12. package/dist/calendar.d.ts.map +1 -0
  13. package/dist/calendar.js +2 -0
  14. package/dist/calendar.js.map +1 -0
  15. package/dist/carousel.d.ts +40 -0
  16. package/dist/carousel.d.ts.map +1 -0
  17. package/dist/carousel.js +51 -0
  18. package/dist/carousel.js.map +1 -0
  19. package/dist/checkbox-group.d.ts +12 -0
  20. package/dist/checkbox-group.d.ts.map +1 -0
  21. package/dist/checkbox-group.js +12 -0
  22. package/dist/checkbox-group.js.map +1 -0
  23. package/dist/checkbox.d.ts +2 -0
  24. package/dist/checkbox.d.ts.map +1 -0
  25. package/dist/checkbox.js +2 -0
  26. package/dist/checkbox.js.map +1 -0
  27. package/dist/combobox.d.ts +16 -0
  28. package/dist/combobox.d.ts.map +1 -0
  29. package/dist/combobox.js +42 -0
  30. package/dist/combobox.js.map +1 -0
  31. package/dist/date-field.d.ts +58 -0
  32. package/dist/date-field.d.ts.map +1 -0
  33. package/dist/date-field.js +233 -0
  34. package/dist/date-field.js.map +1 -0
  35. package/dist/date-picker.d.ts +53 -0
  36. package/dist/date-picker.d.ts.map +1 -0
  37. package/dist/date-picker.js +157 -0
  38. package/dist/date-picker.js.map +1 -0
  39. package/dist/date-range-picker.d.ts +28 -0
  40. package/dist/date-range-picker.d.ts.map +1 -0
  41. package/dist/date-range-picker.js +85 -0
  42. package/dist/date-range-picker.js.map +1 -0
  43. package/dist/date-time-field.d.ts +53 -0
  44. package/dist/date-time-field.d.ts.map +1 -0
  45. package/dist/date-time-field.js +253 -0
  46. package/dist/date-time-field.js.map +1 -0
  47. package/dist/date-time-picker.d.ts +54 -0
  48. package/dist/date-time-picker.d.ts.map +1 -0
  49. package/dist/date-time-picker.js +151 -0
  50. package/dist/date-time-picker.js.map +1 -0
  51. package/dist/date-time-range-picker.d.ts +67 -0
  52. package/dist/date-time-range-picker.d.ts.map +1 -0
  53. package/dist/date-time-range-picker.js +226 -0
  54. package/dist/date-time-range-picker.js.map +1 -0
  55. package/dist/dialog.d.ts +16 -0
  56. package/dist/dialog.d.ts.map +1 -0
  57. package/dist/dialog.js +5 -0
  58. package/dist/dialog.js.map +1 -0
  59. package/dist/disclosure.d.ts +2 -0
  60. package/dist/disclosure.d.ts.map +1 -0
  61. package/dist/disclosure.js +2 -0
  62. package/dist/disclosure.js.map +1 -0
  63. package/dist/feed.d.ts +29 -0
  64. package/dist/feed.d.ts.map +1 -0
  65. package/dist/feed.js +26 -0
  66. package/dist/feed.js.map +1 -0
  67. package/dist/index.d.ts +17 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +2 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/interaction.d.ts +14 -0
  72. package/dist/interaction.d.ts.map +1 -0
  73. package/dist/interaction.js +38 -0
  74. package/dist/interaction.js.map +1 -0
  75. package/dist/internal/composites/calendar.d.ts +35 -0
  76. package/dist/internal/composites/calendar.d.ts.map +1 -0
  77. package/dist/internal/composites/calendar.js +139 -0
  78. package/dist/internal/composites/calendar.js.map +1 -0
  79. package/dist/internal/composites/combobox.d.ts +41 -0
  80. package/dist/internal/composites/combobox.d.ts.map +1 -0
  81. package/dist/internal/composites/combobox.js +184 -0
  82. package/dist/internal/composites/combobox.js.map +1 -0
  83. package/dist/internal/composites/grid-control.d.ts +36 -0
  84. package/dist/internal/composites/grid-control.d.ts.map +1 -0
  85. package/dist/internal/composites/grid-control.js +86 -0
  86. package/dist/internal/composites/grid-control.js.map +1 -0
  87. package/dist/internal/composites/linear-action.d.ts +35 -0
  88. package/dist/internal/composites/linear-action.d.ts.map +1 -0
  89. package/dist/internal/composites/linear-action.js +92 -0
  90. package/dist/internal/composites/linear-action.js.map +1 -0
  91. package/dist/internal/composites/linear-choice.d.ts +41 -0
  92. package/dist/internal/composites/linear-choice.d.ts.map +1 -0
  93. package/dist/internal/composites/linear-choice.js +139 -0
  94. package/dist/internal/composites/linear-choice.js.map +1 -0
  95. package/dist/internal/composites/listbox.d.ts +50 -0
  96. package/dist/internal/composites/listbox.d.ts.map +1 -0
  97. package/dist/internal/composites/listbox.js +243 -0
  98. package/dist/internal/composites/listbox.js.map +1 -0
  99. package/dist/internal/composites/menu.d.ts +28 -0
  100. package/dist/internal/composites/menu.d.ts.map +1 -0
  101. package/dist/internal/composites/menu.js +72 -0
  102. package/dist/internal/composites/menu.js.map +1 -0
  103. package/dist/internal/composites/popup.d.ts +20 -0
  104. package/dist/internal/composites/popup.d.ts.map +1 -0
  105. package/dist/internal/composites/popup.js +8 -0
  106. package/dist/internal/composites/popup.js.map +1 -0
  107. package/dist/internal/composites/slider.d.ts +20 -0
  108. package/dist/internal/composites/slider.d.ts.map +1 -0
  109. package/dist/internal/composites/slider.js +69 -0
  110. package/dist/internal/composites/slider.js.map +1 -0
  111. package/dist/internal/composites/tree-grid.d.ts +65 -0
  112. package/dist/internal/composites/tree-grid.d.ts.map +1 -0
  113. package/dist/internal/composites/tree-grid.js +274 -0
  114. package/dist/internal/composites/tree-grid.js.map +1 -0
  115. package/dist/internal/composites/tree-view.d.ts +39 -0
  116. package/dist/internal/composites/tree-view.d.ts.map +1 -0
  117. package/dist/internal/composites/tree-view.js +175 -0
  118. package/dist/internal/composites/tree-view.js.map +1 -0
  119. package/dist/internal/editing/text.d.ts +64 -0
  120. package/dist/internal/editing/text.d.ts.map +1 -0
  121. package/dist/internal/editing/text.js +238 -0
  122. package/dist/internal/editing/text.js.map +1 -0
  123. package/dist/internal/kernel/decimal.d.ts +22 -0
  124. package/dist/internal/kernel/decimal.d.ts.map +1 -0
  125. package/dist/internal/kernel/decimal.js +137 -0
  126. package/dist/internal/kernel/decimal.js.map +1 -0
  127. package/dist/internal/kernel/foundation.d.ts +12 -0
  128. package/dist/internal/kernel/foundation.d.ts.map +1 -0
  129. package/dist/internal/kernel/foundation.js +132 -0
  130. package/dist/internal/kernel/foundation.js.map +1 -0
  131. package/dist/internal/kernel/indexed-sequence.d.ts +26 -0
  132. package/dist/internal/kernel/indexed-sequence.d.ts.map +1 -0
  133. package/dist/internal/kernel/indexed-sequence.js +117 -0
  134. package/dist/internal/kernel/indexed-sequence.js.map +1 -0
  135. package/dist/internal/kernel/machine.d.ts +8 -0
  136. package/dist/internal/kernel/machine.d.ts.map +1 -0
  137. package/dist/internal/kernel/machine.js +6 -0
  138. package/dist/internal/kernel/machine.js.map +1 -0
  139. package/dist/internal/runtime/revision.d.ts +22 -0
  140. package/dist/internal/runtime/revision.d.ts.map +1 -0
  141. package/dist/internal/runtime/revision.js +72 -0
  142. package/dist/internal/runtime/revision.js.map +1 -0
  143. package/dist/internal/state/checked.d.ts +21 -0
  144. package/dist/internal/state/checked.d.ts.map +1 -0
  145. package/dist/internal/state/checked.js +29 -0
  146. package/dist/internal/state/checked.js.map +1 -0
  147. package/dist/internal/state/cursor.d.ts +13 -0
  148. package/dist/internal/state/cursor.d.ts.map +1 -0
  149. package/dist/internal/state/cursor.js +24 -0
  150. package/dist/internal/state/cursor.js.map +1 -0
  151. package/dist/internal/state/expansion.d.ts +8 -0
  152. package/dist/internal/state/expansion.d.ts.map +1 -0
  153. package/dist/internal/state/expansion.js +23 -0
  154. package/dist/internal/state/expansion.js.map +1 -0
  155. package/dist/internal/state/open-state.d.ts +16 -0
  156. package/dist/internal/state/open-state.d.ts.map +1 -0
  157. package/dist/internal/state/open-state.js +25 -0
  158. package/dist/internal/state/open-state.js.map +1 -0
  159. package/dist/internal/state/selection.d.ts +23 -0
  160. package/dist/internal/state/selection.d.ts.map +1 -0
  161. package/dist/internal/state/selection.js +110 -0
  162. package/dist/internal/state/selection.js.map +1 -0
  163. package/dist/listbox.d.ts +2 -0
  164. package/dist/listbox.d.ts.map +1 -0
  165. package/dist/listbox.js +2 -0
  166. package/dist/listbox.js.map +1 -0
  167. package/dist/menu-button.d.ts +3 -0
  168. package/dist/menu-button.d.ts.map +1 -0
  169. package/dist/menu-button.js +3 -0
  170. package/dist/menu-button.js.map +1 -0
  171. package/dist/menu.d.ts +8 -0
  172. package/dist/menu.d.ts.map +1 -0
  173. package/dist/menu.js +4 -0
  174. package/dist/menu.js.map +1 -0
  175. package/dist/menubar.d.ts +3 -0
  176. package/dist/menubar.d.ts.map +1 -0
  177. package/dist/menubar.js +3 -0
  178. package/dist/menubar.js.map +1 -0
  179. package/dist/multi-thumb-slider.d.ts +35 -0
  180. package/dist/multi-thumb-slider.d.ts.map +1 -0
  181. package/dist/multi-thumb-slider.js +68 -0
  182. package/dist/multi-thumb-slider.js.map +1 -0
  183. package/dist/number-field.d.ts +49 -0
  184. package/dist/number-field.d.ts.map +1 -0
  185. package/dist/number-field.js +454 -0
  186. package/dist/number-field.js.map +1 -0
  187. package/dist/pagination.d.ts +63 -0
  188. package/dist/pagination.d.ts.map +1 -0
  189. package/dist/pagination.js +190 -0
  190. package/dist/pagination.js.map +1 -0
  191. package/dist/pin-input.d.ts +29 -0
  192. package/dist/pin-input.d.ts.map +1 -0
  193. package/dist/pin-input.js +49 -0
  194. package/dist/pin-input.js.map +1 -0
  195. package/dist/quantity-field.d.ts +58 -0
  196. package/dist/quantity-field.d.ts.map +1 -0
  197. package/dist/quantity-field.js +250 -0
  198. package/dist/quantity-field.js.map +1 -0
  199. package/dist/radio-group.d.ts +22 -0
  200. package/dist/radio-group.d.ts.map +1 -0
  201. package/dist/radio-group.js +16 -0
  202. package/dist/radio-group.js.map +1 -0
  203. package/dist/rating.d.ts +17 -0
  204. package/dist/rating.d.ts.map +1 -0
  205. package/dist/rating.js +15 -0
  206. package/dist/rating.js.map +1 -0
  207. package/dist/result.d.ts +10 -0
  208. package/dist/result.d.ts.map +1 -0
  209. package/dist/result.js +19 -0
  210. package/dist/result.js.map +1 -0
  211. package/dist/revision.d.ts +2 -0
  212. package/dist/revision.d.ts.map +1 -0
  213. package/dist/revision.js +2 -0
  214. package/dist/revision.js.map +1 -0
  215. package/dist/select.d.ts +30 -0
  216. package/dist/select.d.ts.map +1 -0
  217. package/dist/select.js +28 -0
  218. package/dist/select.js.map +1 -0
  219. package/dist/shared.d.ts +42 -0
  220. package/dist/shared.d.ts.map +1 -0
  221. package/dist/shared.js +3 -0
  222. package/dist/shared.js.map +1 -0
  223. package/dist/slider.d.ts +2 -0
  224. package/dist/slider.d.ts.map +1 -0
  225. package/dist/slider.js +2 -0
  226. package/dist/slider.js.map +1 -0
  227. package/dist/spin-button.d.ts +29 -0
  228. package/dist/spin-button.d.ts.map +1 -0
  229. package/dist/spin-button.js +61 -0
  230. package/dist/spin-button.js.map +1 -0
  231. package/dist/stepper.d.ts +17 -0
  232. package/dist/stepper.d.ts.map +1 -0
  233. package/dist/stepper.js +12 -0
  234. package/dist/stepper.js.map +1 -0
  235. package/dist/structures/grid.d.ts +27 -0
  236. package/dist/structures/grid.d.ts.map +1 -0
  237. package/dist/structures/grid.js +197 -0
  238. package/dist/structures/grid.js.map +1 -0
  239. package/dist/structures/range.d.ts +39 -0
  240. package/dist/structures/range.d.ts.map +1 -0
  241. package/dist/structures/range.js +242 -0
  242. package/dist/structures/range.js.map +1 -0
  243. package/dist/structures/sequence.d.ts +17 -0
  244. package/dist/structures/sequence.d.ts.map +1 -0
  245. package/dist/structures/sequence.js +24 -0
  246. package/dist/structures/sequence.js.map +1 -0
  247. package/dist/structures/tree.d.ts +32 -0
  248. package/dist/structures/tree.d.ts.map +1 -0
  249. package/dist/structures/tree.js +234 -0
  250. package/dist/structures/tree.js.map +1 -0
  251. package/dist/switch.d.ts +20 -0
  252. package/dist/switch.d.ts.map +1 -0
  253. package/dist/switch.js +4 -0
  254. package/dist/switch.js.map +1 -0
  255. package/dist/tabs.d.ts +15 -0
  256. package/dist/tabs.d.ts.map +1 -0
  257. package/dist/tabs.js +23 -0
  258. package/dist/tabs.js.map +1 -0
  259. package/dist/tags-input.d.ts +41 -0
  260. package/dist/tags-input.d.ts.map +1 -0
  261. package/dist/tags-input.js +44 -0
  262. package/dist/tags-input.js.map +1 -0
  263. package/dist/text.d.ts +2 -0
  264. package/dist/text.d.ts.map +1 -0
  265. package/dist/text.js +2 -0
  266. package/dist/text.js.map +1 -0
  267. package/dist/time-field.d.ts +46 -0
  268. package/dist/time-field.d.ts.map +1 -0
  269. package/dist/time-field.js +148 -0
  270. package/dist/time-field.js.map +1 -0
  271. package/dist/toggle-button.d.ts +19 -0
  272. package/dist/toggle-button.d.ts.map +1 -0
  273. package/dist/toggle-button.js +16 -0
  274. package/dist/toggle-button.js.map +1 -0
  275. package/dist/toolbar.d.ts +2 -0
  276. package/dist/toolbar.d.ts.map +1 -0
  277. package/dist/toolbar.js +2 -0
  278. package/dist/toolbar.js.map +1 -0
  279. package/dist/tooltip.d.ts +2 -0
  280. package/dist/tooltip.d.ts.map +1 -0
  281. package/dist/tooltip.js +2 -0
  282. package/dist/tooltip.js.map +1 -0
  283. package/dist/tree-grid.d.ts +10 -0
  284. package/dist/tree-grid.d.ts.map +1 -0
  285. package/dist/tree-grid.js +14 -0
  286. package/dist/tree-grid.js.map +1 -0
  287. package/dist/tree-view.d.ts +2 -0
  288. package/dist/tree-view.d.ts.map +1 -0
  289. package/dist/tree-view.js +2 -0
  290. package/dist/tree-view.js.map +1 -0
  291. package/dist/units.d.ts +72 -0
  292. package/dist/units.d.ts.map +1 -0
  293. package/dist/units.js +496 -0
  294. package/dist/units.js.map +1 -0
  295. package/dist/window-splitter.d.ts +2 -0
  296. package/dist/window-splitter.d.ts.map +1 -0
  297. package/dist/window-splitter.js +2 -0
  298. package/dist/window-splitter.js.map +1 -0
  299. package/package.json +304 -0
@@ -0,0 +1,454 @@
1
+ import { addDecimal, compareDecimal, decimalToString, divideDecimal, multiplyDecimal, negateDecimal, parseDecimal, subtractDecimal, } from './internal/kernel/decimal.js';
2
+ import { fail, ok, validateSafeCeiling } from './internal/kernel/foundation.js';
3
+ import { createMachineUpdate } from './internal/kernel/machine.js';
4
+ import { applyTextEvent, createTextEditingState, normalizeTextEditingState, } from './text.js';
5
+ export function createCalculatorExpression(options = {}) {
6
+ const limits = normalizeCalculatorLimits(options);
7
+ if (!limits.ok)
8
+ return limits;
9
+ return ok(Object.freeze({
10
+ evaluate(expression) {
11
+ return evaluateCalculator(expression, limits.value);
12
+ },
13
+ }));
14
+ }
15
+ export function createNumberFieldState(value = null, inputState) {
16
+ if (value !== null && typeof value !== 'string') {
17
+ return fail('construction', 'invalid-number-field-value', 'Number field value must be decimal text or null.');
18
+ }
19
+ const parsed = value === null ? null : parseDecimal(value);
20
+ if (value !== null && parsed === null) {
21
+ return fail('construction', 'invalid-number-field-value', 'Number field value must be finite decimal text.', { value });
22
+ }
23
+ const canonicalValue = parsed === null ? null : decimalToString(parsed);
24
+ const input = inputState === undefined
25
+ ? createCommittedInput(canonicalValue)
26
+ : normalizeTextEditingState(inputState);
27
+ if (!input.ok)
28
+ return input;
29
+ return ok(Object.freeze({
30
+ value: canonicalValue,
31
+ inputState: input.value,
32
+ }));
33
+ }
34
+ export function applyNumberFieldEvent(state, event, policies = {}) {
35
+ const valid = createNumberFieldState(state.value, state.inputState);
36
+ if (!valid.ok)
37
+ return { ok: false, error: { ...valid.error, class: 'transition-rejection' } };
38
+ const bounds = normalizeBounds(policies);
39
+ if (!bounds.ok)
40
+ return bounds;
41
+ if (typeof event === 'object') {
42
+ if (event.type !== 'text' || typeof event.event !== 'object' || event.event === null) {
43
+ return fail('transition-rejection', 'invalid-number-field-text-event', 'Number field input must be a semantic text event.');
44
+ }
45
+ const edited = applyTextEvent(valid.value.inputState, event.event);
46
+ if (!edited.ok)
47
+ return edited;
48
+ return createMachineUpdate(Object.freeze({ value: valid.value.value, inputState: edited.value.state }), [{ type: 'input-state-changed', value: edited.value.state }]);
49
+ }
50
+ if (event === 'cancel') {
51
+ const restored = createCommittedInput(valid.value.value);
52
+ if (!restored.ok)
53
+ return restored;
54
+ if (sameTextState(restored.value, valid.value.inputState))
55
+ return createMachineUpdate(valid.value);
56
+ return createMachineUpdate(Object.freeze({ value: valid.value.value, inputState: restored.value }), [{ type: 'input-state-changed', value: restored.value }]);
57
+ }
58
+ if (event !== 'commit') {
59
+ return fail('transition-rejection', 'unsupported-number-field-event', 'Number field event is unsupported.');
60
+ }
61
+ if (valid.value.inputState.composition !== null) {
62
+ return fail('transition-rejection', 'number-field-composition-active', 'Number field cannot commit while text composition is active.');
63
+ }
64
+ const expression = valid.value.inputState.snapshot.text.trim();
65
+ if (expression.length === 0) {
66
+ if (policies.required === true) {
67
+ return fail('transition-rejection', 'number-field-value-required', 'Number field requires a value.');
68
+ }
69
+ const input = createCommittedInput(null);
70
+ if (!input.ok)
71
+ return input;
72
+ return createMachineUpdate(Object.freeze({ value: null, inputState: input.value }), [
73
+ { type: 'input-state-changed', value: input.value },
74
+ { type: 'value-committed', value: null, expression },
75
+ ]);
76
+ }
77
+ const evaluated = safelyEvaluate(policies.evaluator ?? literalEvaluator, expression);
78
+ if (!evaluated.ok)
79
+ return evaluated;
80
+ const parsed = parseDecimal(evaluated.value.value);
81
+ if (parsed === null) {
82
+ return fail('transition-rejection', 'invalid-number-field-evaluation', 'Number evaluator must return finite decimal text.');
83
+ }
84
+ if (bounds.value.min !== null && compareDecimal(parsed, bounds.value.min) < 0) {
85
+ return fail('transition-rejection', 'number-field-value-below-minimum', 'Number field value is below its minimum.', { value: evaluated.value.value, min: policies.min });
86
+ }
87
+ if (bounds.value.max !== null && compareDecimal(parsed, bounds.value.max) > 0) {
88
+ return fail('transition-rejection', 'number-field-value-above-maximum', 'Number field value is above its maximum.', { value: evaluated.value.value, max: policies.max });
89
+ }
90
+ const value = decimalToString(parsed);
91
+ const input = createCommittedInput(value);
92
+ if (!input.ok)
93
+ return input;
94
+ return createMachineUpdate(Object.freeze({ value, inputState: input.value }), [
95
+ { type: 'input-state-changed', value: input.value },
96
+ { type: 'value-committed', value, expression: evaluated.value.expression },
97
+ ]);
98
+ }
99
+ function createCommittedInput(value) {
100
+ const text = value ?? '';
101
+ return createTextEditingState(text, {
102
+ anchorCodeUnitOffset: text.length,
103
+ focusCodeUnitOffset: text.length,
104
+ });
105
+ }
106
+ function sameTextState(left, right) {
107
+ return JSON.stringify(left) === JSON.stringify(right);
108
+ }
109
+ const literalEvaluator = Object.freeze({
110
+ evaluate(expression) {
111
+ const value = parseDecimal(expression);
112
+ return value === null
113
+ ? fail('transition-rejection', 'invalid-number-literal', 'Number field draft must be a finite decimal literal.', { expression })
114
+ : ok(Object.freeze({ expression, value: decimalToString(value) }));
115
+ },
116
+ });
117
+ function safelyEvaluate(evaluator, expression) {
118
+ if (typeof evaluator !== 'object' || evaluator === null || typeof evaluator.evaluate !== 'function') {
119
+ return fail('construction', 'invalid-number-evaluator', 'Number field evaluator must expose evaluate(expression).');
120
+ }
121
+ try {
122
+ return evaluator.evaluate(expression);
123
+ }
124
+ catch (error) {
125
+ return fail('transition-rejection', 'number-evaluator-threw', 'Number field evaluator threw while evaluating its draft.', { cause: error instanceof Error ? error.message : String(error) });
126
+ }
127
+ }
128
+ function normalizeBounds(policies) {
129
+ const min = policies.min === undefined ? null : parseDecimal(policies.min);
130
+ const max = policies.max === undefined ? null : parseDecimal(policies.max);
131
+ if (policies.min !== undefined && min === null)
132
+ return fail('construction', 'invalid-number-field-minimum', 'Number field minimum must be finite decimal text.');
133
+ if (policies.max !== undefined && max === null)
134
+ return fail('construction', 'invalid-number-field-maximum', 'Number field maximum must be finite decimal text.');
135
+ if (min !== null && max !== null && compareDecimal(min, max) > 0)
136
+ return fail('construction', 'inverted-number-field-bounds', 'Number field minimum must not exceed its maximum.');
137
+ return ok(Object.freeze({ min, max }));
138
+ }
139
+ function normalizeCalculatorLimits(options) {
140
+ const values = {
141
+ precision: options.precision ?? 12,
142
+ maxCodeUnits: options.maxCodeUnits ?? 1_024,
143
+ maxTokens: options.maxTokens ?? 256,
144
+ maxDepth: options.maxDepth ?? 32,
145
+ maxOperations: options.maxOperations ?? 256,
146
+ maxExponent: options.maxExponent ?? 1_000,
147
+ };
148
+ for (const [name, value, minimum] of [
149
+ ['precision', values.precision, 0],
150
+ ['maxCodeUnits', values.maxCodeUnits, 1],
151
+ ['maxTokens', values.maxTokens, 1],
152
+ ['maxDepth', values.maxDepth, 1],
153
+ ['maxOperations', values.maxOperations, 1],
154
+ ['maxExponent', values.maxExponent, 0],
155
+ ]) {
156
+ const error = validateSafeCeiling(value, name, minimum);
157
+ if (error !== null)
158
+ return { ok: false, error };
159
+ }
160
+ const rounding = options.rounding ?? 'half-even';
161
+ if (rounding !== 'half-even' && rounding !== 'half-up' && rounding !== 'toward-zero') {
162
+ return fail('construction', 'invalid-decimal-rounding', 'Calculator rounding must be half-even, half-up, or toward-zero.');
163
+ }
164
+ return ok(Object.freeze({ ...values, rounding }));
165
+ }
166
+ function evaluateCalculator(expression, limits) {
167
+ if (typeof expression !== 'string') {
168
+ return fail('transition-rejection', 'invalid-calculator-expression', 'Calculator expression must be text.');
169
+ }
170
+ if (expression.length === 0) {
171
+ return fail('transition-rejection', 'empty-calculator-expression', 'Calculator expression must not be empty.');
172
+ }
173
+ if (expression.length > limits.maxCodeUnits) {
174
+ return fail('resource-rejection', 'calculator-code-unit-ceiling-exceeded', 'Calculator expression exceeds maxCodeUnits.', { codeUnits: expression.length, maxCodeUnits: limits.maxCodeUnits });
175
+ }
176
+ const tokens = tokenize(expression, limits.maxTokens);
177
+ if (!tokens.ok)
178
+ return tokens;
179
+ const parser = new ExpressionParser(tokens.value, limits);
180
+ const parsed = parser.parse();
181
+ if (!parsed.ok)
182
+ return parsed;
183
+ const evaluated = evaluateNode(parsed.value, limits, { operations: 0 });
184
+ if (!evaluated.ok)
185
+ return evaluated;
186
+ const value = decimalToString(evaluated.value);
187
+ if (value.length > limits.maxCodeUnits) {
188
+ return fail('resource-rejection', 'calculator-result-ceiling-exceeded', 'Calculator result exceeds maxCodeUnits.', { codeUnits: value.length, maxCodeUnits: limits.maxCodeUnits });
189
+ }
190
+ return ok(Object.freeze({ expression, value }));
191
+ }
192
+ function tokenize(expression, maxTokens) {
193
+ const tokens = [];
194
+ let offset = 0;
195
+ while (offset < expression.length) {
196
+ const character = expression[offset] ?? '';
197
+ if (/\s/u.test(character)) {
198
+ offset += 1;
199
+ continue;
200
+ }
201
+ if (/\d|\./u.test(character)) {
202
+ const start = offset;
203
+ let dots = 0;
204
+ while (offset < expression.length && /\d|\./u.test(expression[offset] ?? '')) {
205
+ if (expression[offset] === '.')
206
+ dots += 1;
207
+ offset += 1;
208
+ }
209
+ const text = expression.slice(start, offset);
210
+ if (dots > 1 || parseDecimal(text) === null) {
211
+ return fail('transition-rejection', 'invalid-calculator-number', 'Calculator expression contains an invalid number.', { text, offset: start });
212
+ }
213
+ tokens.push(Object.freeze({ type: 'number', text, offset: start }));
214
+ }
215
+ else if ('+-*/^'.includes(character) || character === '×' || character === '÷' || character === '−') {
216
+ const operator = character === '×' ? '*' : character === '÷' ? '/' : character === '−' ? '-' : character;
217
+ tokens.push(Object.freeze({ type: 'operator', operator, offset }));
218
+ offset += 1;
219
+ }
220
+ else if (character === '%') {
221
+ tokens.push(Object.freeze({ type: 'percent', offset }));
222
+ offset += 1;
223
+ }
224
+ else if (character === '(') {
225
+ tokens.push(Object.freeze({ type: 'left', offset }));
226
+ offset += 1;
227
+ }
228
+ else if (character === ')') {
229
+ tokens.push(Object.freeze({ type: 'right', offset }));
230
+ offset += 1;
231
+ }
232
+ else
233
+ return fail('transition-rejection', 'unsupported-calculator-token', 'Calculator expression contains an unsupported token.', { character, offset });
234
+ if (tokens.length > maxTokens)
235
+ return fail('resource-rejection', 'calculator-token-ceiling-exceeded', 'Calculator expression exceeds maxTokens.', { maxTokens });
236
+ }
237
+ tokens.push(Object.freeze({ type: 'end', offset }));
238
+ return ok(Object.freeze(tokens));
239
+ }
240
+ class ExpressionParser {
241
+ #tokens;
242
+ #limits;
243
+ #index = 0;
244
+ #depth = 0;
245
+ #operations = 0;
246
+ constructor(tokens, limits) {
247
+ this.#tokens = tokens;
248
+ this.#limits = limits;
249
+ }
250
+ parse() {
251
+ const expression = this.#parseAdditive();
252
+ if (!expression.ok)
253
+ return expression;
254
+ const token = this.#current();
255
+ return token.type === 'end'
256
+ ? expression
257
+ : fail('transition-rejection', 'unexpected-calculator-token', 'Calculator expression has an unexpected trailing token.', { offset: token.offset });
258
+ }
259
+ #parseAdditive() {
260
+ let left = this.#parseMultiplicative();
261
+ if (!left.ok)
262
+ return left;
263
+ while (this.#operator('+') || this.#operator('-')) {
264
+ const operator = this.#take().operator;
265
+ const right = this.#parseMultiplicative();
266
+ if (!right.ok)
267
+ return right;
268
+ const combined = this.#binary(operator, left.value, right.value);
269
+ if (!combined.ok)
270
+ return combined;
271
+ left = combined;
272
+ }
273
+ return left;
274
+ }
275
+ #parseMultiplicative() {
276
+ let left = this.#parseUnary();
277
+ if (!left.ok)
278
+ return left;
279
+ while (this.#operator('*') || this.#operator('/')) {
280
+ const operator = this.#take().operator;
281
+ const right = this.#parseUnary();
282
+ if (!right.ok)
283
+ return right;
284
+ const combined = this.#binary(operator, left.value, right.value);
285
+ if (!combined.ok)
286
+ return combined;
287
+ left = combined;
288
+ }
289
+ return left;
290
+ }
291
+ #parseUnary() {
292
+ if (this.#operator('+') || this.#operator('-')) {
293
+ const operator = this.#take().operator;
294
+ const operand = this.#parseUnary();
295
+ if (!operand.ok)
296
+ return operand;
297
+ const operation = this.#countOperation();
298
+ return operation.ok ? ok(Object.freeze({ type: 'unary', operator, operand: operand.value })) : operation;
299
+ }
300
+ return this.#parsePower();
301
+ }
302
+ #parsePower() {
303
+ const left = this.#parsePostfix();
304
+ if (!left.ok || !this.#operator('^'))
305
+ return left;
306
+ this.#take();
307
+ const right = this.#parseUnary();
308
+ if (!right.ok)
309
+ return right;
310
+ return this.#binary('^', left.value, right.value);
311
+ }
312
+ #parsePostfix() {
313
+ const primary = this.#parsePrimary();
314
+ if (!primary.ok)
315
+ return primary;
316
+ let operand = primary.value;
317
+ while (this.#current().type === 'percent') {
318
+ this.#take();
319
+ const operation = this.#countOperation();
320
+ if (!operation.ok)
321
+ return operation;
322
+ operand = Object.freeze({ type: 'percent', operand });
323
+ }
324
+ return ok(operand);
325
+ }
326
+ #parsePrimary() {
327
+ const token = this.#current();
328
+ if (token.type === 'number') {
329
+ this.#take();
330
+ return ok(Object.freeze({ type: 'number', value: parseDecimal(token.text) }));
331
+ }
332
+ if (token.type !== 'left') {
333
+ return fail('transition-rejection', 'calculator-operand-expected', 'Calculator expression requires a number or parenthesized expression.', { offset: token.offset });
334
+ }
335
+ this.#take();
336
+ this.#depth += 1;
337
+ if (this.#depth > this.#limits.maxDepth) {
338
+ return fail('resource-rejection', 'calculator-depth-ceiling-exceeded', 'Calculator expression exceeds maxDepth.', { maxDepth: this.#limits.maxDepth });
339
+ }
340
+ const expression = this.#parseAdditive();
341
+ this.#depth -= 1;
342
+ if (!expression.ok)
343
+ return expression;
344
+ const closing = this.#current();
345
+ if (closing.type !== 'right') {
346
+ return fail('transition-rejection', 'calculator-closing-parenthesis-expected', 'Calculator expression is missing a closing parenthesis.', { offset: closing.offset });
347
+ }
348
+ this.#take();
349
+ return expression;
350
+ }
351
+ #binary(operator, left, right) {
352
+ const operation = this.#countOperation();
353
+ return operation.ok ? ok(Object.freeze({ type: 'binary', operator, left, right })) : operation;
354
+ }
355
+ #countOperation() {
356
+ this.#operations += 1;
357
+ return this.#operations > this.#limits.maxOperations
358
+ ? fail('resource-rejection', 'calculator-operation-ceiling-exceeded', 'Calculator expression exceeds maxOperations.', { maxOperations: this.#limits.maxOperations })
359
+ : ok(true);
360
+ }
361
+ #operator(operator) {
362
+ const token = this.#current();
363
+ return token.type === 'operator' && token.operator === operator;
364
+ }
365
+ #current() { return this.#tokens[this.#index]; }
366
+ #take() { const token = this.#current(); this.#index += 1; return token; }
367
+ }
368
+ function evaluateNode(node, limits, budget) {
369
+ if (node.type === 'number')
370
+ return ok(node.value);
371
+ budget.operations += 1;
372
+ if (budget.operations > limits.maxOperations) {
373
+ return fail('resource-rejection', 'calculator-operation-ceiling-exceeded', 'Calculator evaluation exceeds maxOperations.', { maxOperations: limits.maxOperations });
374
+ }
375
+ if (node.type === 'unary') {
376
+ const operand = evaluateNode(node.operand, limits, budget);
377
+ return operand.ok ? ok(node.operator === '-' ? negateDecimal(operand.value) : operand.value) : operand;
378
+ }
379
+ if (node.type === 'percent') {
380
+ const operand = evaluateNode(node.operand, limits, budget);
381
+ if (!operand.ok)
382
+ return operand;
383
+ return divide(operand.value, { coefficient: 100n, scale: 0 }, limits);
384
+ }
385
+ const left = evaluateNode(node.left, limits, budget);
386
+ if (!left.ok)
387
+ return left;
388
+ if ((node.operator === '+' || node.operator === '-') && node.right.type === 'percent') {
389
+ const percentage = evaluateNode(node.right.operand, limits, budget);
390
+ if (!percentage.ok)
391
+ return percentage;
392
+ const ratio = divide(percentage.value, { coefficient: 100n, scale: 0 }, limits);
393
+ if (!ratio.ok)
394
+ return ratio;
395
+ const delta = multiplyDecimal(left.value, ratio.value);
396
+ return checkedDecimal(node.operator === '+' ? addDecimal(left.value, delta) : subtractDecimal(left.value, delta), limits);
397
+ }
398
+ const right = evaluateNode(node.right, limits, budget);
399
+ if (!right.ok)
400
+ return right;
401
+ if (node.operator === '+')
402
+ return checkedDecimal(addDecimal(left.value, right.value), limits);
403
+ if (node.operator === '-')
404
+ return checkedDecimal(subtractDecimal(left.value, right.value), limits);
405
+ if (node.operator === '*')
406
+ return checkedDecimal(multiplyDecimal(left.value, right.value), limits);
407
+ if (node.operator === '/')
408
+ return divide(left.value, right.value, limits);
409
+ return power(left.value, right.value, limits);
410
+ }
411
+ function divide(numerator, denominator, limits) {
412
+ const value = divideDecimal(numerator, denominator, limits.precision, limits.rounding);
413
+ return value === null
414
+ ? fail('transition-rejection', 'calculator-division-by-zero', 'Calculator expression cannot divide by zero.')
415
+ : checkedDecimal(value, limits);
416
+ }
417
+ function power(base, exponent, limits) {
418
+ if (exponent.scale !== 0) {
419
+ return fail('transition-rejection', 'calculator-fractional-exponent', 'Calculator exponent must be an integer.', { exponent: decimalToString(exponent) });
420
+ }
421
+ const maximum = BigInt(limits.maxExponent);
422
+ const absolute = exponent.coefficient < 0n ? -exponent.coefficient : exponent.coefficient;
423
+ if (absolute > maximum) {
424
+ return fail('resource-rejection', 'calculator-exponent-ceiling-exceeded', 'Calculator exponent exceeds maxExponent.', { exponent: exponent.coefficient.toString(), maxExponent: limits.maxExponent });
425
+ }
426
+ let result = { coefficient: 1n, scale: 0 };
427
+ let factor = base;
428
+ let remaining = absolute;
429
+ while (remaining > 0n) {
430
+ if (remaining % 2n === 1n) {
431
+ result = multiplyDecimal(result, factor);
432
+ const checked = checkedDecimal(result, limits);
433
+ if (!checked.ok)
434
+ return checked;
435
+ }
436
+ remaining /= 2n;
437
+ if (remaining > 0n) {
438
+ factor = multiplyDecimal(factor, factor);
439
+ const checked = checkedDecimal(factor, limits);
440
+ if (!checked.ok)
441
+ return checked;
442
+ }
443
+ }
444
+ return exponent.coefficient < 0n
445
+ ? divide({ coefficient: 1n, scale: 0 }, result, limits)
446
+ : checkedDecimal(result, limits);
447
+ }
448
+ function checkedDecimal(value, limits) {
449
+ const text = decimalToString(value);
450
+ return text.length > limits.maxCodeUnits
451
+ ? fail('resource-rejection', 'calculator-result-ceiling-exceeded', 'Calculator intermediate result exceeds maxCodeUnits.', { codeUnits: text.length, maxCodeUnits: limits.maxCodeUnits })
452
+ : ok(value);
453
+ }
454
+ //# sourceMappingURL=number-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field.js","sourceRoot":"","sources":["../src/number-field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Result } from './shared.js';
2
+ export type PaginationControl = 'first-page' | 'previous-page' | 'next-page' | 'last-page';
3
+ export type PaginationEvent = PaginationControl | {
4
+ readonly type: 'go-to-page';
5
+ readonly page: number;
6
+ } | {
7
+ readonly type: 'set-items-per-page';
8
+ readonly itemsPerPage: number;
9
+ };
10
+ export type PaginationCommand = {
11
+ readonly type: 'page-changed';
12
+ readonly page: number;
13
+ } | {
14
+ readonly type: 'items-per-page-changed';
15
+ readonly itemsPerPage: number;
16
+ };
17
+ export type PaginationItem = {
18
+ readonly type: 'page';
19
+ readonly page: number;
20
+ readonly selected: boolean;
21
+ } | {
22
+ readonly type: 'ellipsis';
23
+ readonly side: 'start' | 'end';
24
+ } | {
25
+ readonly type: 'control';
26
+ readonly control: PaginationControl;
27
+ readonly targetPage: number;
28
+ readonly disabled: boolean;
29
+ };
30
+ export interface PaginationItemRange {
31
+ readonly start: number;
32
+ readonly end: number;
33
+ readonly total: number;
34
+ }
35
+ export interface PaginationModelOptions {
36
+ readonly total: number;
37
+ readonly itemsPerPage?: number;
38
+ readonly siblingCount?: number;
39
+ readonly showEdges?: boolean;
40
+ readonly showControls?: boolean;
41
+ }
42
+ export interface PaginationModel {
43
+ readonly total: number;
44
+ readonly itemsPerPage: number;
45
+ readonly siblingCount: number;
46
+ readonly showEdges: boolean;
47
+ readonly showControls: boolean;
48
+ }
49
+ export interface PaginationState {
50
+ readonly page: number;
51
+ readonly itemsPerPage: number;
52
+ }
53
+ export interface PaginationUpdate {
54
+ readonly state: PaginationState;
55
+ readonly commands: readonly PaginationCommand[];
56
+ }
57
+ export declare function createPaginationModel(options: PaginationModelOptions): Result<PaginationModel>;
58
+ export declare function createPaginationState(model: PaginationModel, page?: number, itemsPerPage?: number): Result<PaginationState>;
59
+ export declare function applyPaginationEvent(model: PaginationModel, state: PaginationState, event: PaginationEvent): Result<PaginationUpdate>;
60
+ export declare function getPaginationPageCount(model: PaginationModel, state: PaginationState): Result<number>;
61
+ export declare function getPaginationItems(model: PaginationModel, state: PaginationState): Result<readonly PaginationItem[]>;
62
+ export declare function getPaginationItemRange(model: PaginationModel, state: PaginationState): Result<PaginationItemRange>;
63
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAIxD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,eAAe,GAAG,WAAW,GAAG,WAAW,CAAC;AAE3F,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAC3C;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAA;CAAE,GAC7D;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEN,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AACD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAAC,eAAe,CAAC,CAgC9F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,IAAI,SAAI,EACR,YAAY,GAAE,MAA2B,GACxC,MAAM,CAAC,eAAe,CAAC,CAezB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,MAAM,CAAC,gBAAgB,CAAC,CAyC1B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,MAAM,CAAC,MAAM,CAAC,CAKhB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,MAAM,CAAC,SAAS,cAAc,EAAE,CAAC,CAwBnC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,MAAM,CAAC,mBAAmB,CAAC,CAO7B"}