@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,233 @@
1
+ import { fail, ok } from './internal/kernel/foundation.js';
2
+ import { createMachineUpdate } from './internal/kernel/machine.js';
3
+ import { applyTextEvent, createTextEditingState, normalizeTextEditingState, } from './text.js';
4
+ const DATE_FIELD_MAX_CODE_UNITS = 10;
5
+ export function createDateValue(year, month, day) {
6
+ if (!Number.isSafeInteger(year) || year < 1 || year > 9_999) {
7
+ return fail('construction', 'invalid-date-year', 'Date year must be an integer from 1 through 9999.', { year });
8
+ }
9
+ if (!Number.isSafeInteger(month) || month < 1 || month > 12) {
10
+ return fail('construction', 'invalid-date-month', 'Date month must be an integer from 1 through 12.', { month });
11
+ }
12
+ const maximum = daysInMonth(year, month);
13
+ if (!Number.isSafeInteger(day) || day < 1 || day > maximum) {
14
+ return fail('construction', 'invalid-date-day', 'Date day must exist in its Gregorian month.', { year, month, day });
15
+ }
16
+ return ok(Object.freeze({ year, month, day }));
17
+ }
18
+ export function parseDateValue(text) {
19
+ if (typeof text !== 'string')
20
+ return fail('construction', 'invalid-date-text', 'Date text must be a string.');
21
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(text);
22
+ return match === null
23
+ ? fail('transition-rejection', 'invalid-date-format', 'Date text must use YYYY-MM-DD.', { text })
24
+ : createDateValue(Number(match[1]), Number(match[2]), Number(match[3]));
25
+ }
26
+ export function formatDateValue(value) {
27
+ return `${String(value.year).padStart(4, '0')}-${String(value.month).padStart(2, '0')}-${String(value.day).padStart(2, '0')}`;
28
+ }
29
+ export function compareDateValues(left, right) {
30
+ const leftDay = dateToOrdinal(left);
31
+ const rightDay = dateToOrdinal(right);
32
+ return leftDay < rightDay ? -1 : leftDay > rightDay ? 1 : 0;
33
+ }
34
+ export function differenceInDateDays(left, right) {
35
+ return dateToOrdinal(left) - dateToOrdinal(right);
36
+ }
37
+ /** ISO weekday: Monday is 1 and Sunday is 7. */
38
+ export function dateDayOfWeek(value) {
39
+ const thursday = dateToOrdinal(Object.freeze({ year: 1970, month: 1, day: 1 }));
40
+ return (((dateToOrdinal(value) - thursday + 3) % 7 + 7) % 7 + 1);
41
+ }
42
+ export function addDateDays(value, amount) {
43
+ if (!Number.isSafeInteger(amount))
44
+ return fail('transition-rejection', 'invalid-date-day-delta', 'Date day delta must be a safe integer.');
45
+ const result = ordinalToDate(dateToOrdinal(value) + amount);
46
+ return result.year < 1 || result.year > 9_999
47
+ ? fail('transition-rejection', 'date-outside-supported-range', 'Date arithmetic must remain between years 1 and 9999.')
48
+ : ok(result);
49
+ }
50
+ export function addDateMonths(value, amount) {
51
+ if (!Number.isSafeInteger(amount))
52
+ return fail('transition-rejection', 'invalid-date-month-delta', 'Date month delta must be a safe integer.');
53
+ const absolute = value.year * 12 + value.month - 1 + amount;
54
+ const year = Math.floor(absolute / 12);
55
+ const month = absolute - year * 12 + 1;
56
+ if (year < 1 || year > 9_999)
57
+ return fail('transition-rejection', 'date-outside-supported-range', 'Date arithmetic must remain between years 1 and 9999.');
58
+ return createDateValue(year, month, Math.min(value.day, daysInMonth(year, month)));
59
+ }
60
+ export function addDateYears(value, amount) {
61
+ if (!Number.isSafeInteger(amount))
62
+ return fail('transition-rejection', 'invalid-date-year-delta', 'Date year delta must be a safe integer.');
63
+ const year = value.year + amount;
64
+ if (year < 1 || year > 9_999)
65
+ return fail('transition-rejection', 'date-outside-supported-range', 'Date arithmetic must remain between years 1 and 9999.');
66
+ return createDateValue(year, value.month, Math.min(value.day, daysInMonth(year, value.month)));
67
+ }
68
+ export function createDateRange(start, end) {
69
+ const validStart = createDateValue(start.year, start.month, start.day);
70
+ if (!validStart.ok)
71
+ return validStart;
72
+ const validEnd = createDateValue(end.year, end.month, end.day);
73
+ if (!validEnd.ok)
74
+ return validEnd;
75
+ if (compareDateValues(validStart.value, validEnd.value) > 0) {
76
+ return fail('construction', 'inverted-date-range', 'Date range start must not follow its end.');
77
+ }
78
+ return ok(Object.freeze({ start: validStart.value, end: validEnd.value }));
79
+ }
80
+ export function dateRangeContains(range, value) {
81
+ return compareDateValues(range.start, value) <= 0 && compareDateValues(value, range.end) <= 0;
82
+ }
83
+ export function createDateFieldState(value = null, inputState) {
84
+ const valid = value === null ? ok(null) : createDateValue(value.year, value.month, value.day);
85
+ if (!valid.ok)
86
+ return valid;
87
+ const input = inputState === undefined
88
+ ? committedInput(valid.value)
89
+ : normalizeTextEditingState(inputState);
90
+ if (!input.ok)
91
+ return input;
92
+ if (input.value.snapshot.text.length > DATE_FIELD_MAX_CODE_UNITS) {
93
+ return fail('construction', 'date-field-draft-too-long', 'Date field drafts must fit YYYY-MM-DD.');
94
+ }
95
+ return ok(Object.freeze({ value: valid.value, inputState: input.value }));
96
+ }
97
+ export function applyDateFieldEvent(state, event, policies = {}) {
98
+ const valid = createDateFieldState(state.value, state.inputState);
99
+ if (!valid.ok)
100
+ return transitionFailure(valid);
101
+ const bounds = validatePolicies(policies);
102
+ if (!bounds.ok)
103
+ return bounds;
104
+ if (typeof event === 'object' && event.type === 'text') {
105
+ const edited = applyTextEvent(valid.value.inputState, event.event);
106
+ if (!edited.ok)
107
+ return edited;
108
+ if (edited.value.state.snapshot.text.length > DATE_FIELD_MAX_CODE_UNITS) {
109
+ return fail('transition-rejection', 'date-field-draft-too-long', 'Date field drafts must fit YYYY-MM-DD.');
110
+ }
111
+ return createMachineUpdate(Object.freeze({ value: valid.value.value, inputState: edited.value.state }), [
112
+ { type: 'input-state-changed', value: edited.value.state },
113
+ ]);
114
+ }
115
+ if (typeof event === 'object' && event.type === 'set-value') {
116
+ return commitValue(event.value, policies);
117
+ }
118
+ if (event === 'cancel') {
119
+ const input = committedInput(valid.value.value);
120
+ if (!input.ok)
121
+ return input;
122
+ return createMachineUpdate(Object.freeze({ value: valid.value.value, inputState: input.value }), [
123
+ { type: 'input-state-changed', value: input.value },
124
+ ]);
125
+ }
126
+ if (event === 'increment-segment' || event === 'decrement-segment') {
127
+ const draft = parseDateValue(valid.value.inputState.snapshot.text);
128
+ if (!draft.ok)
129
+ return draft;
130
+ const base = draft.value;
131
+ const amount = event === 'increment-segment' ? 1 : -1;
132
+ const segment = dateSegmentAt(valid.value.inputState.snapshot.selection.focusCodeUnitOffset);
133
+ const adjusted = segment === 'year' ? addDateYears(base, amount)
134
+ : segment === 'month' ? addDateMonths(base, amount)
135
+ : addDateDays(base, amount);
136
+ return adjusted.ok ? commitValue(adjusted.value, policies, segment) : adjusted;
137
+ }
138
+ if (event !== 'commit')
139
+ return fail('transition-rejection', 'unsupported-date-field-event', 'Date field event is unsupported.');
140
+ if (valid.value.inputState.composition !== null)
141
+ return fail('transition-rejection', 'date-field-composition-active', 'Date field cannot commit while text composition is active.');
142
+ const text = valid.value.inputState.snapshot.text.trim();
143
+ if (text.length === 0)
144
+ return commitValue(null, policies);
145
+ const parsed = parseDateValue(text);
146
+ return parsed.ok ? commitValue(parsed.value, policies) : parsed;
147
+ }
148
+ export function dateSegmentAt(offset) {
149
+ return offset <= 4 ? 'year' : offset <= 7 ? 'month' : 'day';
150
+ }
151
+ export function daysInMonth(year, month) {
152
+ return month === 2 ? (isLeapYear(year) ? 29 : 28) : (month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31);
153
+ }
154
+ export function isLeapYear(year) {
155
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
156
+ }
157
+ function commitValue(value, policies, segment) {
158
+ if (value === null) {
159
+ if (policies.required === true)
160
+ return fail('transition-rejection', 'date-field-value-required', 'Date field requires a value.');
161
+ }
162
+ else {
163
+ const valid = createDateValue(value.year, value.month, value.day);
164
+ if (!valid.ok)
165
+ return transitionFailure(valid);
166
+ value = valid.value;
167
+ if (policies.min !== undefined && compareDateValues(value, policies.min) < 0)
168
+ return fail('transition-rejection', 'date-field-value-below-minimum', 'Date field value is below its minimum.');
169
+ if (policies.max !== undefined && compareDateValues(value, policies.max) > 0)
170
+ return fail('transition-rejection', 'date-field-value-above-maximum', 'Date field value is above its maximum.');
171
+ if (policies.unavailable?.(value) === true)
172
+ return fail('transition-rejection', 'date-field-value-unavailable', 'Date field value is unavailable.');
173
+ }
174
+ const input = committedInput(value, segment);
175
+ if (!input.ok)
176
+ return input;
177
+ return createMachineUpdate(Object.freeze({ value, inputState: input.value }), [
178
+ { type: 'input-state-changed', value: input.value },
179
+ { type: 'value-committed', value },
180
+ ]);
181
+ }
182
+ function committedInput(value, segment) {
183
+ const text = value === null ? '' : formatDateValue(value);
184
+ const selection = segment === undefined ? { anchorCodeUnitOffset: text.length, focusCodeUnitOffset: text.length }
185
+ : segment === 'year' ? { anchorCodeUnitOffset: 0, focusCodeUnitOffset: 4 }
186
+ : segment === 'month' ? { anchorCodeUnitOffset: 5, focusCodeUnitOffset: 7 }
187
+ : { anchorCodeUnitOffset: 8, focusCodeUnitOffset: 10 };
188
+ return createTextEditingState(text, selection);
189
+ }
190
+ function validatePolicies(policies) {
191
+ if (policies.unavailable !== undefined && typeof policies.unavailable !== 'function')
192
+ return fail('construction', 'invalid-date-unavailable-policy', 'Date unavailable policy must be a function.');
193
+ if (policies.min !== undefined) {
194
+ const min = createDateValue(policies.min.year, policies.min.month, policies.min.day);
195
+ if (!min.ok)
196
+ return min;
197
+ }
198
+ if (policies.max !== undefined) {
199
+ const max = createDateValue(policies.max.year, policies.max.month, policies.max.day);
200
+ if (!max.ok)
201
+ return max;
202
+ }
203
+ if (policies.min !== undefined && policies.max !== undefined && compareDateValues(policies.min, policies.max) > 0)
204
+ return fail('construction', 'inverted-date-field-bounds', 'Date field minimum must not follow its maximum.');
205
+ return ok(true);
206
+ }
207
+ function transitionFailure(result) {
208
+ return result.ok ? fail('internal-invariant', 'unexpected-valid-result', 'Expected an invalid result.') : { ok: false, error: { ...result.error, class: 'transition-rejection' } };
209
+ }
210
+ function dateToOrdinal(value) {
211
+ let year = value.year;
212
+ const month = value.month;
213
+ year -= month <= 2 ? 1 : 0;
214
+ const era = Math.floor(year / 400);
215
+ const yearOfEra = year - era * 400;
216
+ const monthPrime = month + (month > 2 ? -3 : 9);
217
+ const dayOfYear = Math.floor((153 * monthPrime + 2) / 5) + value.day - 1;
218
+ const dayOfEra = yearOfEra * 365 + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100) + dayOfYear;
219
+ return era * 146097 + dayOfEra;
220
+ }
221
+ function ordinalToDate(ordinal) {
222
+ const era = Math.floor(ordinal / 146097);
223
+ const dayOfEra = ordinal - era * 146097;
224
+ const yearOfEra = Math.floor((dayOfEra - Math.floor(dayOfEra / 1460) + Math.floor(dayOfEra / 36524) - Math.floor(dayOfEra / 146096)) / 365);
225
+ let year = yearOfEra + era * 400;
226
+ const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));
227
+ const monthPrime = Math.floor((5 * dayOfYear + 2) / 153);
228
+ const day = dayOfYear - Math.floor((153 * monthPrime + 2) / 5) + 1;
229
+ const month = monthPrime + (monthPrime < 10 ? 3 : -9);
230
+ year += month <= 2 ? 1 : 0;
231
+ return Object.freeze({ year, month, day });
232
+ }
233
+ //# sourceMappingURL=date-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-field.js","sourceRoot":"","sources":["../src/date-field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Result } from './shared.js';
2
+ import { type DateValue } from './date-field.js';
3
+ export interface DatePickerView {
4
+ readonly year: number;
5
+ readonly month: number;
6
+ }
7
+ export interface DatePickerState {
8
+ readonly value: DateValue | null;
9
+ readonly highlighted: DateValue;
10
+ readonly view: DatePickerView;
11
+ readonly open: boolean;
12
+ }
13
+ export type DatePickerEvent = 'open' | 'close' | 'toggle' | 'previous-month' | 'next-month' | 'previous-year' | 'next-year' | 'previous-day' | 'next-day' | 'previous-week' | 'next-week' | 'start-of-week' | 'end-of-week' | 'select-highlighted' | {
14
+ readonly type: 'select';
15
+ readonly value: DateValue;
16
+ } | {
17
+ readonly type: 'set-value';
18
+ readonly value: DateValue | null;
19
+ };
20
+ export type DatePickerCommand = {
21
+ readonly type: 'value-committed';
22
+ readonly value: DateValue | null;
23
+ } | {
24
+ readonly type: 'highlight-changed';
25
+ readonly value: DateValue;
26
+ } | {
27
+ readonly type: 'open-changed';
28
+ readonly open: boolean;
29
+ };
30
+ export interface DatePickerPolicies {
31
+ readonly min?: DateValue;
32
+ readonly max?: DateValue;
33
+ readonly required?: boolean;
34
+ readonly unavailable?: (value: DateValue) => boolean;
35
+ readonly weekStartsOn?: 1 | 2 | 3 | 4 | 5 | 6 | 7;
36
+ readonly maxScan?: number;
37
+ }
38
+ export interface DatePickerUpdate {
39
+ readonly state: DatePickerState;
40
+ readonly commands: readonly DatePickerCommand[];
41
+ }
42
+ export interface DatePickerStateInput {
43
+ readonly value?: DateValue | null;
44
+ readonly highlighted?: DateValue;
45
+ readonly view?: DatePickerView;
46
+ readonly open?: boolean;
47
+ }
48
+ export declare function createDatePickerState(input?: DatePickerStateInput): Result<DatePickerState>;
49
+ export declare function applyDatePickerEvent(state: DatePickerState, event: DatePickerEvent, policies?: DatePickerPolicies): Result<DatePickerUpdate>;
50
+ export declare function createDatePickerMonth(view: DatePickerView, weekStartsOn?: 1 | 2 | 3 | 4 | 5 | 6 | 7): Result<readonly (readonly DateValue[])[]>;
51
+ export declare function isDatePickerValueAvailable(value: DateValue, policies?: DatePickerPolicies): boolean;
52
+ export declare function datePickerID(value: DateValue): string;
53
+ //# sourceMappingURL=date-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../src/date-picker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { fail, freezeArray, ok } from './internal/kernel/foundation.js';
2
+ import { createMachineUpdate } from './internal/kernel/machine.js';
3
+ import { addDateDays, addDateMonths, addDateYears, compareDateValues, createDateValue, dateDayOfWeek, formatDateValue, } from './date-field.js';
4
+ export function createDatePickerState(input = {}) {
5
+ const value = input.value ?? null;
6
+ if (value !== null) {
7
+ const valid = createDateValue(value.year, value.month, value.day);
8
+ if (!valid.ok)
9
+ return valid;
10
+ }
11
+ const fallback = value ?? Object.freeze({ year: 1970, month: 1, day: 1 });
12
+ const highlighted = input.highlighted ?? fallback;
13
+ const validHighlight = createDateValue(highlighted.year, highlighted.month, highlighted.day);
14
+ if (!validHighlight.ok)
15
+ return validHighlight;
16
+ const view = input.view ?? Object.freeze({ year: validHighlight.value.year, month: validHighlight.value.month });
17
+ const validView = createDateValue(view.year, view.month, 1);
18
+ if (!validView.ok)
19
+ return validView;
20
+ if (typeof input.open !== 'undefined' && typeof input.open !== 'boolean')
21
+ return fail('construction', 'invalid-date-picker-open', 'Date picker open state must be boolean.');
22
+ return ok(pickerState(value, validHighlight.value, Object.freeze({ year: view.year, month: view.month }), input.open ?? false));
23
+ }
24
+ export function applyDatePickerEvent(state, event, policies = {}) {
25
+ const valid = createDatePickerState(state);
26
+ if (!valid.ok)
27
+ return invalidTransition(valid);
28
+ const policy = validatePolicies(policies);
29
+ if (!policy.ok)
30
+ return policy;
31
+ if (event === 'open' || event === 'close' || event === 'toggle') {
32
+ const open = event === 'toggle' ? !state.open : event === 'open';
33
+ if (open === state.open)
34
+ return createMachineUpdate(state);
35
+ return createMachineUpdate(pickerState(state.value, state.highlighted, state.view, open), [{ type: 'open-changed', open }]);
36
+ }
37
+ if (typeof event === 'object' && event.type === 'set-value')
38
+ return commit(event.value, state, policies, false);
39
+ if (typeof event === 'object' && event.type === 'select')
40
+ return commit(event.value, state, policies, true);
41
+ if (event === 'select-highlighted')
42
+ return commit(state.highlighted, state, policies, true);
43
+ let moved;
44
+ if (event === 'previous-month' || event === 'next-month')
45
+ moved = addDateMonths(state.highlighted, event === 'previous-month' ? -1 : 1);
46
+ else if (event === 'previous-year' || event === 'next-year')
47
+ moved = addDateYears(state.highlighted, event === 'previous-year' ? -1 : 1);
48
+ else if (event === 'previous-day' || event === 'next-day')
49
+ moved = addDateDays(state.highlighted, event === 'previous-day' ? -1 : 1);
50
+ else if (event === 'previous-week' || event === 'next-week')
51
+ moved = addDateDays(state.highlighted, event === 'previous-week' ? -7 : 7);
52
+ else if (event === 'start-of-week' || event === 'end-of-week') {
53
+ const start = policies.weekStartsOn ?? 1;
54
+ const relative = (dateDayOfWeek(state.highlighted) - start + 7) % 7;
55
+ moved = addDateDays(state.highlighted, event === 'start-of-week' ? -relative : 6 - relative);
56
+ }
57
+ else
58
+ return fail('transition-rejection', 'unsupported-date-picker-event', 'Date picker event is unsupported.');
59
+ if (!moved.ok)
60
+ return moved;
61
+ const direction = compareDateValues(moved.value, state.highlighted) < 0 ? -1 : 1;
62
+ const eligible = findEligible(moved.value, direction, policies);
63
+ if (!eligible.ok)
64
+ return eligible;
65
+ if (eligible.value === null || compareDateValues(eligible.value, state.highlighted) === 0)
66
+ return createMachineUpdate(state);
67
+ const view = Object.freeze({ year: eligible.value.year, month: eligible.value.month });
68
+ return createMachineUpdate(pickerState(state.value, eligible.value, view, state.open), [{ type: 'highlight-changed', value: eligible.value }]);
69
+ }
70
+ export function createDatePickerMonth(view, weekStartsOn = 1) {
71
+ const first = createDateValue(view.year, view.month, 1);
72
+ if (!first.ok)
73
+ return first;
74
+ if (!Number.isSafeInteger(weekStartsOn) || weekStartsOn < 1 || weekStartsOn > 7)
75
+ return fail('construction', 'invalid-week-start', 'Week start must be an ISO weekday from 1 through 7.');
76
+ const offset = (dateDayOfWeek(first.value) - weekStartsOn + 7) % 7;
77
+ const start = addDateDays(first.value, -offset);
78
+ if (!start.ok)
79
+ return start;
80
+ const rows = [];
81
+ for (let row = 0; row < 6; row += 1) {
82
+ const cells = [];
83
+ for (let column = 0; column < 7; column += 1) {
84
+ const value = addDateDays(start.value, row * 7 + column);
85
+ if (!value.ok)
86
+ return value;
87
+ cells.push(value.value);
88
+ }
89
+ rows.push(cells);
90
+ }
91
+ return ok(freezeArray(rows.map((row) => freezeArray(row))));
92
+ }
93
+ export function isDatePickerValueAvailable(value, policies = {}) {
94
+ return !(policies.min !== undefined && compareDateValues(value, policies.min) < 0)
95
+ && !(policies.max !== undefined && compareDateValues(value, policies.max) > 0)
96
+ && policies.unavailable?.(value) !== true;
97
+ }
98
+ export function datePickerID(value) { return formatDateValue(value); }
99
+ function commit(value, state, policies, close) {
100
+ if (value === null) {
101
+ if (policies.required === true)
102
+ return fail('transition-rejection', 'date-picker-value-required', 'Date picker requires a value.');
103
+ const open = close ? false : state.open;
104
+ return createMachineUpdate(pickerState(null, state.highlighted, state.view, open), [
105
+ { type: 'value-committed', value: null },
106
+ ...openChanged(state.open, open),
107
+ ]);
108
+ }
109
+ const valid = createDateValue(value.year, value.month, value.day);
110
+ if (!valid.ok)
111
+ return invalidTransition(valid);
112
+ if (!isDatePickerValueAvailable(valid.value, policies))
113
+ return fail('transition-rejection', 'date-picker-value-unavailable', 'Date picker value is outside its selectable domain.');
114
+ const open = close ? false : state.open;
115
+ const view = Object.freeze({ year: valid.value.year, month: valid.value.month });
116
+ return createMachineUpdate(pickerState(valid.value, valid.value, view, open), [
117
+ { type: 'value-committed', value: valid.value },
118
+ { type: 'highlight-changed', value: valid.value },
119
+ ...openChanged(state.open, open),
120
+ ]);
121
+ }
122
+ function findEligible(start, direction, policies) {
123
+ const limit = policies.maxScan ?? 366;
124
+ if (!Number.isSafeInteger(limit) || limit < 1)
125
+ return fail('construction', 'invalid-date-picker-max-scan', 'Date picker max scan must be a positive safe integer.');
126
+ let candidate = start;
127
+ for (let scanned = 0; scanned < limit; scanned += 1) {
128
+ if (isDatePickerValueAvailable(candidate, policies))
129
+ return ok(candidate);
130
+ const next = addDateDays(candidate, direction);
131
+ if (!next.ok)
132
+ return ok(null);
133
+ candidate = next.value;
134
+ }
135
+ return fail('resource-rejection', 'date-picker-scan-exhausted', 'Date picker did not find an available date within maxScan.', { maxScan: limit });
136
+ }
137
+ function validatePolicies(policies) {
138
+ if (policies.unavailable !== undefined && typeof policies.unavailable !== 'function')
139
+ return fail('construction', 'invalid-date-picker-unavailable-policy', 'Date picker unavailable policy must be a function.');
140
+ if (policies.min !== undefined) {
141
+ const min = createDateValue(policies.min.year, policies.min.month, policies.min.day);
142
+ if (!min.ok)
143
+ return min;
144
+ }
145
+ if (policies.max !== undefined) {
146
+ const max = createDateValue(policies.max.year, policies.max.month, policies.max.day);
147
+ if (!max.ok)
148
+ return max;
149
+ }
150
+ if (policies.min !== undefined && policies.max !== undefined && compareDateValues(policies.min, policies.max) > 0)
151
+ return fail('construction', 'inverted-date-picker-bounds', 'Date picker minimum must not follow its maximum.');
152
+ return ok(true);
153
+ }
154
+ function pickerState(value, highlighted, view, open) { return Object.freeze({ value, highlighted, view, open }); }
155
+ function openChanged(previous, next) { return previous === next ? [] : [{ type: 'open-changed', open: next }]; }
156
+ function invalidTransition(result) { return result.ok ? fail('internal-invariant', 'unexpected-valid-result', 'Expected an invalid result.') : { ok: false, error: { ...result.error, class: 'transition-rejection' } }; }
157
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../src/date-picker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Result } from './shared.js';
2
+ import { type DateRange, type DateValue } from './date-field.js';
3
+ import { type DatePickerCommand, type DatePickerEvent, type DatePickerPolicies, type DatePickerState } from './date-picker.js';
4
+ export interface DateRangePickerState {
5
+ readonly value: DateRange | null;
6
+ readonly anchor: DateValue | null;
7
+ readonly calendar: DatePickerState;
8
+ }
9
+ export type DateRangePickerEvent = DatePickerEvent | 'clear';
10
+ export type DateRangePickerCommand = DatePickerCommand | {
11
+ readonly type: 'range-committed';
12
+ readonly value: DateRange | null;
13
+ } | {
14
+ readonly type: 'range-anchor-changed';
15
+ readonly value: DateValue | null;
16
+ };
17
+ export interface DateRangePickerUpdate {
18
+ readonly state: DateRangePickerState;
19
+ readonly commands: readonly DateRangePickerCommand[];
20
+ }
21
+ export interface DateRangePickerStateInput {
22
+ readonly value?: DateRange | null;
23
+ readonly anchor?: DateValue | null;
24
+ readonly calendar?: Partial<DatePickerState>;
25
+ }
26
+ export declare function createDateRangePickerState(input?: DateRangePickerStateInput): Result<DateRangePickerState>;
27
+ export declare function applyDateRangePickerEvent(state: DateRangePickerState, event: DateRangePickerEvent, policies?: DatePickerPolicies): Result<DateRangePickerUpdate>;
28
+ //# sourceMappingURL=date-range-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../src/date-range-picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAuD,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtH,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,OAAO,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAC9B,iBAAiB,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAC9C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,GAAE,yBAA8B,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAqB9G;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,GAAE,kBAAuB,GAChC,MAAM,CAAC,qBAAqB,CAAC,CAoB/B"}
@@ -0,0 +1,85 @@
1
+ import { fail, ok } from './internal/kernel/foundation.js';
2
+ import { createMachineUpdate } from './internal/kernel/machine.js';
3
+ import { compareDateValues, createDateRange, createDateValue } from './date-field.js';
4
+ import { applyDatePickerEvent, createDatePickerState, isDatePickerValueAvailable, } from './date-picker.js';
5
+ export function createDateRangePickerState(input = {}) {
6
+ let value = null;
7
+ if (input.value !== undefined && input.value !== null) {
8
+ const valid = createDateRange(input.value.start, input.value.end);
9
+ if (!valid.ok)
10
+ return valid;
11
+ value = valid.value;
12
+ }
13
+ let anchor = null;
14
+ if (input.anchor !== undefined && input.anchor !== null) {
15
+ const valid = createDateValue(input.anchor.year, input.anchor.month, input.anchor.day);
16
+ if (!valid.ok)
17
+ return valid;
18
+ anchor = valid.value;
19
+ }
20
+ const fallback = anchor ?? value?.end;
21
+ const calendar = createDatePickerState({
22
+ value: null,
23
+ ...(input.calendar?.highlighted === undefined && fallback !== undefined ? { highlighted: fallback } : {}),
24
+ ...input.calendar,
25
+ });
26
+ if (!calendar.ok)
27
+ return calendar;
28
+ return ok(Object.freeze({ value, anchor, calendar: calendar.value }));
29
+ }
30
+ export function applyDateRangePickerEvent(state, event, policies = {}) {
31
+ const valid = createDateRangePickerState(state);
32
+ if (!valid.ok)
33
+ return invalidTransition(valid);
34
+ if (event === 'clear') {
35
+ if (policies.required === true)
36
+ return fail('transition-rejection', 'date-range-picker-value-required', 'Date range picker requires a range.');
37
+ return createMachineUpdate(Object.freeze({ value: null, anchor: null, calendar: state.calendar }), [
38
+ { type: 'range-committed', value: null },
39
+ { type: 'range-anchor-changed', value: null },
40
+ ]);
41
+ }
42
+ const selected = event === 'select-highlighted' ? state.calendar.highlighted
43
+ : typeof event === 'object' && event.type === 'select' ? event.value
44
+ : null;
45
+ if (selected !== null)
46
+ return selectDate(state, selected, policies);
47
+ if (typeof event === 'object' && event.type === 'set-value') {
48
+ return fail('transition-rejection', 'unsupported-date-range-picker-set-value', 'Date range picker values must be synchronized as ranges.');
49
+ }
50
+ const update = applyDatePickerEvent(state.calendar, event, policies);
51
+ if (!update.ok)
52
+ return update;
53
+ return createMachineUpdate(Object.freeze({ value: state.value, anchor: state.anchor, calendar: update.value.state }), update.value.commands);
54
+ }
55
+ function selectDate(state, requested, policies) {
56
+ const valid = createDateValue(requested.year, requested.month, requested.day);
57
+ if (!valid.ok)
58
+ return invalidTransition(valid);
59
+ if (!isDatePickerValueAvailable(valid.value, policies))
60
+ return fail('transition-rejection', 'date-range-picker-value-unavailable', 'Date range endpoint is outside its selectable domain.');
61
+ if (state.anchor === null) {
62
+ const calendar = createDatePickerState({ ...state.calendar, value: null, highlighted: valid.value, view: { year: valid.value.year, month: valid.value.month }, open: true });
63
+ if (!calendar.ok)
64
+ return calendar;
65
+ return createMachineUpdate(Object.freeze({ value: state.value, anchor: valid.value, calendar: calendar.value }), [
66
+ { type: 'highlight-changed', value: valid.value },
67
+ { type: 'range-anchor-changed', value: valid.value },
68
+ ]);
69
+ }
70
+ const start = compareDateValues(state.anchor, valid.value) <= 0 ? state.anchor : valid.value;
71
+ const end = compareDateValues(state.anchor, valid.value) <= 0 ? valid.value : state.anchor;
72
+ const range = createDateRange(start, end);
73
+ if (!range.ok)
74
+ return range;
75
+ const calendar = createDatePickerState({ value: null, highlighted: valid.value, view: { year: valid.value.year, month: valid.value.month }, open: state.calendar.open });
76
+ if (!calendar.ok)
77
+ return calendar;
78
+ return createMachineUpdate(Object.freeze({ value: range.value, anchor: null, calendar: calendar.value }), [
79
+ { type: 'range-committed', value: range.value },
80
+ { type: 'range-anchor-changed', value: null },
81
+ { type: 'highlight-changed', value: valid.value },
82
+ ]);
83
+ }
84
+ function invalidTransition(result) { return result.ok ? fail('internal-invariant', 'unexpected-valid-result', 'Expected an invalid result.') : { ok: false, error: { ...result.error, class: 'transition-rejection' } }; }
85
+ //# sourceMappingURL=date-range-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-picker.js","sourceRoot":"","sources":["../src/date-range-picker.ts"],"names":[],"mappings":"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"}