@sectile/dom 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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/accordion.d.ts +36 -0
  4. package/dist/accordion.d.ts.map +1 -0
  5. package/dist/accordion.js +143 -0
  6. package/dist/accordion.js.map +1 -0
  7. package/dist/alert-dialog.d.ts +27 -0
  8. package/dist/alert-dialog.d.ts.map +1 -0
  9. package/dist/alert-dialog.js +14 -0
  10. package/dist/alert-dialog.js.map +1 -0
  11. package/dist/calendar.d.ts +92 -0
  12. package/dist/calendar.d.ts.map +1 -0
  13. package/dist/calendar.js +296 -0
  14. package/dist/calendar.js.map +1 -0
  15. package/dist/carousel.d.ts +54 -0
  16. package/dist/carousel.d.ts.map +1 -0
  17. package/dist/carousel.js +285 -0
  18. package/dist/carousel.js.map +1 -0
  19. package/dist/checkbox-group.d.ts +22 -0
  20. package/dist/checkbox-group.d.ts.map +1 -0
  21. package/dist/checkbox-group.js +32 -0
  22. package/dist/checkbox-group.js.map +1 -0
  23. package/dist/checkbox.d.ts +18 -0
  24. package/dist/checkbox.d.ts.map +1 -0
  25. package/dist/checkbox.js +12 -0
  26. package/dist/checkbox.js.map +1 -0
  27. package/dist/combobox.d.ts +120 -0
  28. package/dist/combobox.d.ts.map +1 -0
  29. package/dist/combobox.js +386 -0
  30. package/dist/combobox.js.map +1 -0
  31. package/dist/date-field.d.ts +36 -0
  32. package/dist/date-field.d.ts.map +1 -0
  33. package/dist/date-field.js +88 -0
  34. package/dist/date-field.js.map +1 -0
  35. package/dist/date-picker.d.ts +43 -0
  36. package/dist/date-picker.d.ts.map +1 -0
  37. package/dist/date-picker.js +118 -0
  38. package/dist/date-picker.js.map +1 -0
  39. package/dist/date-range-picker.d.ts +45 -0
  40. package/dist/date-range-picker.d.ts.map +1 -0
  41. package/dist/date-range-picker.js +64 -0
  42. package/dist/date-range-picker.js.map +1 -0
  43. package/dist/date-time-field.d.ts +36 -0
  44. package/dist/date-time-field.d.ts.map +1 -0
  45. package/dist/date-time-field.js +163 -0
  46. package/dist/date-time-field.js.map +1 -0
  47. package/dist/date-time-picker.d.ts +45 -0
  48. package/dist/date-time-picker.d.ts.map +1 -0
  49. package/dist/date-time-picker.js +259 -0
  50. package/dist/date-time-picker.js.map +1 -0
  51. package/dist/date-time-range-picker.d.ts +47 -0
  52. package/dist/date-time-range-picker.d.ts.map +1 -0
  53. package/dist/date-time-range-picker.js +269 -0
  54. package/dist/date-time-range-picker.js.map +1 -0
  55. package/dist/dialog.d.ts +27 -0
  56. package/dist/dialog.d.ts.map +1 -0
  57. package/dist/dialog.js +15 -0
  58. package/dist/dialog.js.map +1 -0
  59. package/dist/disclosure.d.ts +24 -0
  60. package/dist/disclosure.d.ts.map +1 -0
  61. package/dist/disclosure.js +74 -0
  62. package/dist/disclosure.js.map +1 -0
  63. package/dist/feed.d.ts +33 -0
  64. package/dist/feed.d.ts.map +1 -0
  65. package/dist/feed.js +68 -0
  66. package/dist/feed.js.map +1 -0
  67. package/dist/grid.d.ts +43 -0
  68. package/dist/grid.d.ts.map +1 -0
  69. package/dist/grid.js +165 -0
  70. package/dist/grid.js.map +1 -0
  71. package/dist/index.d.ts +45 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +44 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/internal/checked-control.d.ts +28 -0
  76. package/dist/internal/checked-control.d.ts.map +1 -0
  77. package/dist/internal/checked-control.js +45 -0
  78. package/dist/internal/checked-control.js.map +1 -0
  79. package/dist/internal/controller.d.ts +6 -0
  80. package/dist/internal/controller.d.ts.map +1 -0
  81. package/dist/internal/controller.js +35 -0
  82. package/dist/internal/controller.js.map +1 -0
  83. package/dist/internal/delegated-event.d.ts +2 -0
  84. package/dist/internal/delegated-event.d.ts.map +1 -0
  85. package/dist/internal/delegated-event.js +11 -0
  86. package/dist/internal/delegated-event.js.map +1 -0
  87. package/dist/internal/disabled-items.d.ts +6 -0
  88. package/dist/internal/disabled-items.d.ts.map +1 -0
  89. package/dist/internal/disabled-items.js +15 -0
  90. package/dist/internal/disabled-items.js.map +1 -0
  91. package/dist/internal/facade.d.ts +44 -0
  92. package/dist/internal/facade.d.ts.map +1 -0
  93. package/dist/internal/facade.js +58 -0
  94. package/dist/internal/facade.js.map +1 -0
  95. package/dist/internal/interaction.d.ts +14 -0
  96. package/dist/internal/interaction.d.ts.map +1 -0
  97. package/dist/internal/interaction.js +25 -0
  98. package/dist/internal/interaction.js.map +1 -0
  99. package/dist/internal/menu-control.d.ts +38 -0
  100. package/dist/internal/menu-control.d.ts.map +1 -0
  101. package/dist/internal/menu-control.js +251 -0
  102. package/dist/internal/menu-control.js.map +1 -0
  103. package/dist/internal/popup-control.d.ts +39 -0
  104. package/dist/internal/popup-control.d.ts.map +1 -0
  105. package/dist/internal/popup-control.js +140 -0
  106. package/dist/internal/popup-control.js.map +1 -0
  107. package/dist/internal/semantic-controller.d.ts +20 -0
  108. package/dist/internal/semantic-controller.d.ts.map +1 -0
  109. package/dist/internal/semantic-controller.js +42 -0
  110. package/dist/internal/semantic-controller.js.map +1 -0
  111. package/dist/internal/text-element.d.ts +16 -0
  112. package/dist/internal/text-element.d.ts.map +1 -0
  113. package/dist/internal/text-element.js +215 -0
  114. package/dist/internal/text-element.js.map +1 -0
  115. package/dist/listbox.d.ts +103 -0
  116. package/dist/listbox.d.ts.map +1 -0
  117. package/dist/listbox.js +416 -0
  118. package/dist/listbox.js.map +1 -0
  119. package/dist/menu-button.d.ts +10 -0
  120. package/dist/menu-button.d.ts.map +1 -0
  121. package/dist/menu-button.js +11 -0
  122. package/dist/menu-button.js.map +1 -0
  123. package/dist/menu.d.ts +8 -0
  124. package/dist/menu.d.ts.map +1 -0
  125. package/dist/menu.js +11 -0
  126. package/dist/menu.js.map +1 -0
  127. package/dist/menubar.d.ts +8 -0
  128. package/dist/menubar.d.ts.map +1 -0
  129. package/dist/menubar.js +11 -0
  130. package/dist/menubar.js.map +1 -0
  131. package/dist/multi-thumb-slider.d.ts +38 -0
  132. package/dist/multi-thumb-slider.d.ts.map +1 -0
  133. package/dist/multi-thumb-slider.js +190 -0
  134. package/dist/multi-thumb-slider.js.map +1 -0
  135. package/dist/number-field.d.ts +45 -0
  136. package/dist/number-field.d.ts.map +1 -0
  137. package/dist/number-field.js +136 -0
  138. package/dist/number-field.js.map +1 -0
  139. package/dist/pagination.d.ts +39 -0
  140. package/dist/pagination.d.ts.map +1 -0
  141. package/dist/pagination.js +169 -0
  142. package/dist/pagination.js.map +1 -0
  143. package/dist/pin-input.d.ts +27 -0
  144. package/dist/pin-input.d.ts.map +1 -0
  145. package/dist/pin-input.js +76 -0
  146. package/dist/pin-input.js.map +1 -0
  147. package/dist/quantity-field.d.ts +46 -0
  148. package/dist/quantity-field.d.ts.map +1 -0
  149. package/dist/quantity-field.js +172 -0
  150. package/dist/quantity-field.js.map +1 -0
  151. package/dist/radio-group.d.ts +40 -0
  152. package/dist/radio-group.d.ts.map +1 -0
  153. package/dist/radio-group.js +172 -0
  154. package/dist/radio-group.js.map +1 -0
  155. package/dist/rating.d.ts +22 -0
  156. package/dist/rating.d.ts.map +1 -0
  157. package/dist/rating.js +38 -0
  158. package/dist/rating.js.map +1 -0
  159. package/dist/select.d.ts +45 -0
  160. package/dist/select.d.ts.map +1 -0
  161. package/dist/select.js +87 -0
  162. package/dist/select.js.map +1 -0
  163. package/dist/slider.d.ts +73 -0
  164. package/dist/slider.d.ts.map +1 -0
  165. package/dist/slider.js +265 -0
  166. package/dist/slider.js.map +1 -0
  167. package/dist/spin-button.d.ts +41 -0
  168. package/dist/spin-button.d.ts.map +1 -0
  169. package/dist/spin-button.js +127 -0
  170. package/dist/spin-button.js.map +1 -0
  171. package/dist/stepper.d.ts +24 -0
  172. package/dist/stepper.d.ts.map +1 -0
  173. package/dist/stepper.js +32 -0
  174. package/dist/stepper.js.map +1 -0
  175. package/dist/switch.d.ts +16 -0
  176. package/dist/switch.d.ts.map +1 -0
  177. package/dist/switch.js +12 -0
  178. package/dist/switch.js.map +1 -0
  179. package/dist/tabs.d.ts +55 -0
  180. package/dist/tabs.d.ts.map +1 -0
  181. package/dist/tabs.js +193 -0
  182. package/dist/tabs.js.map +1 -0
  183. package/dist/tags-input.d.ts +32 -0
  184. package/dist/tags-input.d.ts.map +1 -0
  185. package/dist/tags-input.js +94 -0
  186. package/dist/tags-input.js.map +1 -0
  187. package/dist/text.d.ts +80 -0
  188. package/dist/text.d.ts.map +1 -0
  189. package/dist/text.js +203 -0
  190. package/dist/text.js.map +1 -0
  191. package/dist/time-field.d.ts +36 -0
  192. package/dist/time-field.d.ts.map +1 -0
  193. package/dist/time-field.js +57 -0
  194. package/dist/time-field.js.map +1 -0
  195. package/dist/toggle-button.d.ts +16 -0
  196. package/dist/toggle-button.d.ts.map +1 -0
  197. package/dist/toggle-button.js +12 -0
  198. package/dist/toggle-button.js.map +1 -0
  199. package/dist/toolbar.d.ts +37 -0
  200. package/dist/toolbar.d.ts.map +1 -0
  201. package/dist/toolbar.js +148 -0
  202. package/dist/toolbar.js.map +1 -0
  203. package/dist/tooltip.d.ts +18 -0
  204. package/dist/tooltip.d.ts.map +1 -0
  205. package/dist/tooltip.js +14 -0
  206. package/dist/tooltip.js.map +1 -0
  207. package/dist/tree-grid.d.ts +122 -0
  208. package/dist/tree-grid.d.ts.map +1 -0
  209. package/dist/tree-grid.js +449 -0
  210. package/dist/tree-grid.js.map +1 -0
  211. package/dist/tree-view.d.ts +92 -0
  212. package/dist/tree-view.d.ts.map +1 -0
  213. package/dist/tree-view.js +309 -0
  214. package/dist/tree-view.js.map +1 -0
  215. package/dist/window-splitter.d.ts +8 -0
  216. package/dist/window-splitter.d.ts.map +1 -0
  217. package/dist/window-splitter.js +13 -0
  218. package/dist/window-splitter.js.map +1 -0
  219. package/package.json +256 -0
@@ -0,0 +1,386 @@
1
+ import { createFacadeConnection } from './internal/facade.js';
2
+ import { unwrap } from '@sectile/core/result';
3
+ import { createInteractionState, requireInteraction } from '@sectile/core/interaction';
4
+ import { applyComboboxEvent, createComboboxState, } from '@sectile/core/combobox';
5
+ import { createRevisionSnapshot, rejectRevisionInput, } from '@sectile/core/revision';
6
+ import { createSequence } from '@sectile/core/sequence';
7
+ import { createTextEditingState, } from '@sectile/core/text';
8
+ import { applyControllerEvent, sameControllerState, synchronizeControllerState, } from './internal/controller.js';
9
+ import { toTextEvent } from './text.js';
10
+ import { DOMTextElementBinding } from './internal/text-element.js';
11
+ import { setInteractionAttributes } from './internal/interaction.js';
12
+ import { findDelegatedID } from './internal/delegated-event.js';
13
+ export function createComboboxController(options) {
14
+ const value = options.value !== undefined ? options.value : options.defaultValue ?? null;
15
+ const requestedInput = options.inputState !== undefined
16
+ ? options.inputState
17
+ : options.defaultInputState;
18
+ const inputState = requestedInput === undefined
19
+ ? createTextEditingState()
20
+ : { ok: true, value: requestedInput };
21
+ if (!inputState.ok)
22
+ return inputState;
23
+ const initial = createComboboxState(options.domain, {
24
+ text: inputState.value,
25
+ popupOpen: options.open !== undefined ? options.open : options.defaultOpen ?? false,
26
+ current: options.highlightedValue !== undefined
27
+ ? options.highlightedValue
28
+ : options.defaultHighlightedValue ?? null,
29
+ selected: value === null ? [] : [value],
30
+ anchor: value,
31
+ });
32
+ if (!initial.ok)
33
+ return initial;
34
+ const snapshot = createRevisionSnapshot(initial.value);
35
+ if (!snapshot.ok)
36
+ return snapshot;
37
+ const interaction = createInteractionState(options);
38
+ if (!interaction.ok)
39
+ return interaction;
40
+ return { ok: true, value: new DOMComboboxController(options, interaction.value, snapshot.value) };
41
+ }
42
+ export function createCombobox(options) {
43
+ return unwrap(tryCreateCombobox(options));
44
+ }
45
+ export function tryCreateCombobox(options) {
46
+ return createFacadeConnection(options, (options) => tryCreateComboboxConnection(options));
47
+ }
48
+ function tryCreateComboboxConnection(options) {
49
+ const domain = createSequence(options.items.map((item) => item.id));
50
+ if (!domain.ok)
51
+ return domain;
52
+ const labels = new Map(options.items.map((item) => [item.id, item.label]));
53
+ const controller = createComboboxController({ ...options, domain: domain.value, labels });
54
+ if (!controller.ok)
55
+ return controller;
56
+ return { ok: true, value: connectCombobox({ ...options, controller: controller.value }) };
57
+ }
58
+ export function connectCombobox(options) {
59
+ return new DOMComboboxConnection(options);
60
+ }
61
+ export function toComboboxEvent(input) {
62
+ if (input.isComposing === true)
63
+ return null;
64
+ if (input.altKey === true || input.ctrlKey === true || input.metaKey === true)
65
+ return null;
66
+ if (input.key === 'ArrowDown')
67
+ return 'next';
68
+ if (input.key === 'ArrowUp')
69
+ return 'previous';
70
+ if (input.key === 'Escape')
71
+ return 'close';
72
+ if (input.key === 'Enter')
73
+ return 'accept';
74
+ return null;
75
+ }
76
+ export function toComboboxTextEvent(input) {
77
+ const event = toTextEvent(input);
78
+ return event === null ? null : Object.freeze({ type: 'text', event });
79
+ }
80
+ export function toComboboxEffect(command) {
81
+ return Object.freeze(command.type === 'focus'
82
+ ? { type: 'set-active-descendant', id: command.id }
83
+ : { type: 'dispatch-accept', id: command.id });
84
+ }
85
+ class DOMComboboxConnection {
86
+ domain;
87
+ labels;
88
+ #controller;
89
+ #input;
90
+ #popup;
91
+ #getItemElementID;
92
+ #onAccept;
93
+ #onTransition;
94
+ #onUpdate;
95
+ #binding;
96
+ #handleKeydown;
97
+ #handleClick;
98
+ constructor(options) {
99
+ this.#controller = options.controller;
100
+ this.domain = options.controller.domain;
101
+ this.labels = options.controller.labels;
102
+ this.#input = options.input;
103
+ this.#popup = options.popup;
104
+ this.#getItemElementID = options.getItemElementID
105
+ ?? ((id) => `sectile-combobox-${String(id)}`);
106
+ this.#onAccept = options.onAccept;
107
+ this.#onTransition = options.onTransition;
108
+ this.#onUpdate = options.onUpdate;
109
+ this.#binding = new DOMTextElementBinding({
110
+ element: this.#input,
111
+ getState: () => this.#controller.getSnapshot().state.text,
112
+ dispatch: (input) => this.#dispatchTextInput(input).ok,
113
+ });
114
+ this.#handleKeydown = (event) => {
115
+ if (this.handleKeyboardEvent(event))
116
+ event.preventDefault();
117
+ };
118
+ this.#handleClick = (event) => {
119
+ if (this.#popup === undefined)
120
+ return;
121
+ const id = findDelegatedID(event.target, this.#popup, 'comboboxId');
122
+ if (id !== null)
123
+ this.handleEvent({ type: 'accept', id: id });
124
+ };
125
+ this.#input.addEventListener('keydown', this.#handleKeydown);
126
+ this.#popup?.addEventListener('click', this.#handleClick);
127
+ setInteractionAttributes(this.#input, options, { native: true, readOnly: true });
128
+ this.render();
129
+ }
130
+ getSnapshot() {
131
+ return this.#controller.getSnapshot();
132
+ }
133
+ syncControlledValues(values) {
134
+ const result = this.#controller.syncControlledValues(values);
135
+ if (result.ok) {
136
+ this.render();
137
+ this.#onUpdate?.();
138
+ }
139
+ return result;
140
+ }
141
+ setInputAttributes(label) {
142
+ const state = this.#controller.getSnapshot().state;
143
+ this.#input.setAttribute('role', 'combobox');
144
+ this.#input.setAttribute('aria-autocomplete', 'list');
145
+ this.#input.setAttribute('aria-expanded', String(state.popupOpen));
146
+ if (this.#popup?.id)
147
+ this.#input.setAttribute('aria-controls', this.#popup.id);
148
+ else
149
+ this.#input.removeAttribute('aria-controls');
150
+ if (state.cursor.current === null)
151
+ this.#input.removeAttribute('aria-activedescendant');
152
+ else {
153
+ this.#input.setAttribute('aria-activedescendant', this.#getItemElementID(state.cursor.current));
154
+ }
155
+ if (label === undefined)
156
+ this.#input.removeAttribute('aria-label');
157
+ else
158
+ this.#input.setAttribute('aria-label', label);
159
+ }
160
+ setPopupAttributes(label) {
161
+ if (this.#popup === undefined)
162
+ return;
163
+ this.#popup.setAttribute('role', 'listbox');
164
+ this.#popup.hidden = !this.#controller.getSnapshot().state.popupOpen;
165
+ if (label === undefined)
166
+ this.#popup.removeAttribute('aria-label');
167
+ else
168
+ this.#popup.setAttribute('aria-label', label);
169
+ }
170
+ setItemAttributes(element, attributes) {
171
+ const state = this.#controller.getSnapshot().state;
172
+ element.id = this.#getItemElementID(attributes.id);
173
+ element.dataset['comboboxId'] = String(attributes.id);
174
+ element.setAttribute('role', 'option');
175
+ element.setAttribute('aria-selected', String(state.selection.has(attributes.id)));
176
+ if (attributes.disabled === true)
177
+ element.setAttribute('aria-disabled', 'true');
178
+ else
179
+ element.removeAttribute('aria-disabled');
180
+ }
181
+ handleKeyboardEvent(event) {
182
+ const input = {
183
+ key: event.key,
184
+ altKey: event.altKey,
185
+ ctrlKey: event.ctrlKey,
186
+ metaKey: event.metaKey,
187
+ isComposing: event.isComposing || this.#binding.isComposing,
188
+ };
189
+ const semanticEvent = toComboboxEvent(input);
190
+ if (semanticEvent === null)
191
+ return false;
192
+ return this.handleEvent(semanticEvent);
193
+ }
194
+ handleEvent(event) {
195
+ const result = this.#controller.handleEvent(event);
196
+ if (result.ok)
197
+ this.#applyEffects(result.commands);
198
+ this.#onTransition?.(Object.freeze({ event, result }));
199
+ this.render();
200
+ if (result.ok)
201
+ this.#onUpdate?.();
202
+ return result.ok;
203
+ }
204
+ handleBeforeInput(event) {
205
+ return this.#binding.handleBeforeInput(event);
206
+ }
207
+ render() {
208
+ this.#binding.render();
209
+ this.setInputAttributes(this.#input.getAttribute('aria-label') ?? undefined);
210
+ this.setPopupAttributes(this.#popup?.getAttribute('aria-label') ?? undefined);
211
+ }
212
+ disconnect() {
213
+ this.#binding.disconnect();
214
+ this.#input.removeEventListener('keydown', this.#handleKeydown);
215
+ this.#popup?.removeEventListener('click', this.#handleClick);
216
+ }
217
+ #dispatchTextInput(input) {
218
+ const event = toComboboxTextEvent(input);
219
+ const result = event === null
220
+ ? this.#controller.handleTextInput(input)
221
+ : this.#controller.handleEvent(event);
222
+ if (result.ok)
223
+ this.#applyEffects(result.commands);
224
+ if (event !== null)
225
+ this.#onTransition?.(Object.freeze({ event, result }));
226
+ if (result.ok)
227
+ this.#onUpdate?.();
228
+ return result;
229
+ }
230
+ #applyEffects(effects) {
231
+ for (const effect of effects) {
232
+ if (effect.type === 'dispatch-accept')
233
+ this.#onAccept?.(effect.id);
234
+ }
235
+ }
236
+ }
237
+ class DOMComboboxController {
238
+ domain;
239
+ labels;
240
+ #domain;
241
+ #labels;
242
+ #policies;
243
+ #interaction;
244
+ #valueControlled;
245
+ #inputStateControlled;
246
+ #openControlled;
247
+ #highlightControlled;
248
+ #onValueChange;
249
+ #onInputStateChange;
250
+ #onOpenChange;
251
+ #onHighlightedValueChange;
252
+ #snapshot;
253
+ constructor(options, interaction, snapshot) {
254
+ this.domain = options.domain;
255
+ this.labels = options.labels;
256
+ this.#domain = options.domain;
257
+ this.#labels = options.labels;
258
+ this.#policies = options.policies ?? {};
259
+ this.#interaction = interaction;
260
+ this.#valueControlled = options.value !== undefined;
261
+ this.#inputStateControlled = options.inputState !== undefined;
262
+ this.#openControlled = options.open !== undefined;
263
+ this.#highlightControlled = options.highlightedValue !== undefined;
264
+ this.#onValueChange = options.onValueChange;
265
+ this.#onInputStateChange = options.onInputStateChange;
266
+ this.#onOpenChange = options.onOpenChange;
267
+ this.#onHighlightedValueChange = options.onHighlightedValueChange;
268
+ this.#snapshot = snapshot;
269
+ }
270
+ getSnapshot() {
271
+ return this.#snapshot;
272
+ }
273
+ syncControlledValues(values) {
274
+ const error = controlledInputError(this.#valueControlled, this.#inputStateControlled, this.#openControlled, this.#highlightControlled, values);
275
+ if (error !== null)
276
+ return { ok: false, error };
277
+ const selected = this.#valueControlled
278
+ ? values.value
279
+ : selectedValue(this.#snapshot.state);
280
+ const state = createComboboxState(this.#domain, {
281
+ text: this.#inputStateControlled
282
+ ? values.inputState
283
+ : this.#snapshot.state.text,
284
+ popupOpen: this.#openControlled
285
+ ? values.open
286
+ : this.#snapshot.state.popupOpen,
287
+ current: this.#highlightControlled
288
+ ? values.highlightedValue
289
+ : this.#snapshot.state.cursor.current,
290
+ selected: selected === null ? [] : [selected],
291
+ anchor: this.#valueControlled ? selected : this.#snapshot.state.selection.anchor,
292
+ });
293
+ const snapshot = synchronizeControllerState(this.#snapshot, state);
294
+ if (!snapshot.ok)
295
+ return snapshot;
296
+ this.#snapshot = snapshot.value;
297
+ return snapshot;
298
+ }
299
+ handleKeyboardInput(input, expectedRevision = this.#snapshot.revision) {
300
+ const event = toComboboxEvent(input);
301
+ return event === null
302
+ ? rejectRevisionInput(this.#snapshot, {
303
+ class: 'transition-rejection',
304
+ code: 'unsupported-dom-key',
305
+ message: 'DOM keyboard input does not map to a combobox semantic event.',
306
+ details: { key: input.key },
307
+ })
308
+ : this.handleEvent(event, expectedRevision);
309
+ }
310
+ handleTextInput(input, expectedRevision = this.#snapshot.revision) {
311
+ const event = toComboboxTextEvent(input);
312
+ return event === null
313
+ ? rejectRevisionInput(this.#snapshot, {
314
+ class: 'transition-rejection',
315
+ code: 'unsupported-dom-text-input',
316
+ message: 'DOM text input does not map to a combobox semantic event.',
317
+ })
318
+ : this.handleEvent(event, expectedRevision);
319
+ }
320
+ handleEvent(event, expectedRevision = this.#snapshot.revision) {
321
+ const permitted = requireInteraction(this.#interaction, comboboxIntent(event));
322
+ if (!permitted.ok)
323
+ return rejectRevisionInput(this.#snapshot, permitted.error);
324
+ const result = applyControllerEvent(this.#snapshot, expectedRevision, event, (state, semanticEvent) => applyComboboxEvent(this.#domain, this.#labels, state, semanticEvent, this.#policies), (previous, proposed) => controlledState(this.#domain, previous, proposed, this.#valueControlled, this.#inputStateControlled, this.#openControlled, this.#highlightControlled), (previous, proposed) => this.#notify(previous, proposed), toComboboxEffect);
325
+ if (result.ok)
326
+ this.#snapshot = result.snapshot;
327
+ return result;
328
+ }
329
+ #notify(previous, proposed) {
330
+ const previousValue = selectedValue(previous);
331
+ const value = selectedValue(proposed);
332
+ if (previousValue !== value)
333
+ this.#onValueChange?.(Object.freeze({ value, previousValue }));
334
+ if (!sameControllerState(previous.text, proposed.text)) {
335
+ this.#onInputStateChange?.(Object.freeze({
336
+ value: proposed.text,
337
+ previousValue: previous.text,
338
+ }));
339
+ }
340
+ if (previous.popupOpen !== proposed.popupOpen) {
341
+ this.#onOpenChange?.(Object.freeze({
342
+ value: proposed.popupOpen,
343
+ previousValue: previous.popupOpen,
344
+ }));
345
+ }
346
+ if (previous.cursor.current !== proposed.cursor.current) {
347
+ this.#onHighlightedValueChange?.(Object.freeze({
348
+ value: proposed.cursor.current,
349
+ previousValue: previous.cursor.current,
350
+ }));
351
+ }
352
+ }
353
+ }
354
+ function comboboxIntent(event) {
355
+ return event === 'next' || event === 'previous' || event === 'close' ? 'navigate' : 'mutate';
356
+ }
357
+ function controlledState(domain, previous, proposed, valueControlled, inputStateControlled, openControlled, highlightControlled) {
358
+ return createComboboxState(domain, {
359
+ text: inputStateControlled ? previous.text : proposed.text,
360
+ popupOpen: openControlled ? previous.popupOpen : proposed.popupOpen,
361
+ current: highlightControlled ? previous.cursor.current : proposed.cursor.current,
362
+ selected: valueControlled ? previous.selection.selected : proposed.selection.selected,
363
+ anchor: valueControlled ? previous.selection.anchor : proposed.selection.anchor,
364
+ });
365
+ }
366
+ function selectedValue(state) {
367
+ return state.selection.selected[0] ?? null;
368
+ }
369
+ function controlledInputError(valueControlled, inputStateControlled, openControlled, highlightControlled, values) {
370
+ return fieldError(valueControlled, values.value !== undefined, 'value', 'combobox value')
371
+ ?? fieldError(inputStateControlled, values.inputState !== undefined, 'input-state', 'combobox input state')
372
+ ?? fieldError(openControlled, values.open !== undefined, 'open', 'combobox open state')
373
+ ?? fieldError(highlightControlled, values.highlightedValue !== undefined, 'highlighted-value', 'combobox highlight');
374
+ }
375
+ function fieldError(controlled, provided, codeName, label) {
376
+ if (controlled === provided)
377
+ return null;
378
+ return {
379
+ class: 'construction',
380
+ code: controlled ? `controlled-${codeName}-required` : `uncontrolled-${codeName}-update`,
381
+ message: controlled
382
+ ? `Controlled ${label} sync requires its external value.`
383
+ : `Uncontrolled ${label} cannot be synchronized externally.`,
384
+ };
385
+ }
386
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","sourceRoot":"","sources":["../src/combobox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAyB,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAKpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AACvE,OAAO,EACL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmIhE,MAAM,UAAU,wBAAwB,CACtC,OAAsC;IAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IACzF,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS;QACrD,CAAC,CAAC,OAAO,CAAC,UAAU;QACpB,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAC9B,MAAM,UAAU,GAAG,cAAc,KAAK,SAAS;QAC7C,CAAC,CAAC,sBAAsB,EAAE;QAC1B,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE;QAClD,IAAI,EAAE,UAAU,CAAC,KAAK;QACtB,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK;QACnF,OAAO,EAAE,OAAO,CAAC,gBAAgB,KAAK,SAAS;YAC7C,CAAC,CAAC,OAAO,CAAC,gBAAgB;YAC1B,CAAC,CAAC,OAAO,CAAC,uBAAuB,IAAI,IAAI;QAC3C,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvC,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC;IACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAA4B;IAE5B,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAA4B;IAE5B,OAAO,sBAAsB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,2BAA2B,CAClC,OAA4B;IAE5B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAU,CAAC,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1F,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAsC;IAEtC,OAAO,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAoB;IAEpB,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAgB;IAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAA4B;IAE5B,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;QAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;QACnD,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,qBAAqB;IACT,MAAM,CAAe;IACrB,MAAM,CAA0B;IACvC,WAAW,CAAyB;IACpC,MAAM,CAAc;IACpB,MAAM,CAA0B;IAChC,iBAAiB,CAAqB;IACtC,SAAS,CAAiC;IAC1C,aAAa,CAAiE;IAC9E,SAAS,CAA2B;IACpC,QAAQ,CAAwB;IAChC,cAAc,CAAyB;IACvC,YAAY,CAA8B;IAEnD,YAAmB,OAAsC;QACvD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB;eAC5C,CAAC,CAAC,EAAE,EAAU,EAAE,CAAC,oBAAoB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAqB,CAAC;YACxC,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI;YACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE;SACvD,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,EAAQ,EAAE;YACpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAsB,CAAC;gBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;QAC/E,CAAC,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,EAAQ,EAAE;YAClC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO;YACtC,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACpE,IAAI,EAAE,KAAK,IAAI;gBAAE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAQ,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC;IAEM,oBAAoB,CACzB,MAAoC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,kBAAkB,CAAC,KAAc;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;YAC1E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;aACnF,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,YAAY,CACtB,uBAAuB,EACvB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAC7C,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;;YAC9D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAEM,kBAAkB,CAAC,KAAc;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACtC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;QACrE,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;;YAC9D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAEM,iBAAiB,CACtB,OAAoB,EACpB,UAAsC;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;QACnD,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;;YAC3E,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC;IAEM,mBAAmB,CAAC,KAAoB;QAC7C,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW;SAC5D,CAAC;QACF,MAAM,aAAa,GAAG,eAAe,CAAK,KAAK,CAAC,CAAC;QACjD,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAEM,WAAW,CAAC,KAAwB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC;IAEM,iBAAiB,CAAC,KAAiB;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC;IAChF,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;IAED,kBAAkB,CAChB,KAAgB;QAEhB,MAAM,KAAK,GAAG,mBAAmB,CAAK,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI;YAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,KAAK,KAAK,IAAI;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa,CAAC,OAAsC;QAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF;AAED,MAAM,qBAAqB;IACT,MAAM,CAAe;IACrB,MAAM,CAA0B;IACvC,OAAO,CAAe;IACtB,OAAO,CAA0B;IACjC,SAAS,CAAuB;IAChC,YAAY,CAAmB;IAC/B,gBAAgB,CAAU;IAC1B,qBAAqB,CAAU;IAC/B,eAAe,CAAU;IACzB,oBAAoB,CAAU;IAC9B,cAAc,CAAiE;IAC/E,mBAAmB,CAEd;IACL,aAAa,CAA4D;IACzE,yBAAyB,CAEpB;IACd,SAAS,CAAsC;IAE/C,YACE,OAAsC,EACtC,WAA6B,EAC7B,QAA6C;QAE7C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC;QACpD,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;QAClD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC;QACnE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,oBAAoB,CACzB,MAAoC;QAEpC,MAAM,KAAK,GAAG,oBAAoB,CAChC,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,oBAAoB,EACzB,MAAM,CACP,CAAC;QACF,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB;YACpC,CAAC,CAAE,MAAM,CAAC,KAAmB;YAC7B,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;YAC9C,IAAI,EAAE,IAAI,CAAC,qBAAqB;gBAC9B,CAAC,CAAC,MAAM,CAAC,UAA8B;gBACvC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;YAC7B,SAAS,EAAE,IAAI,CAAC,eAAe;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAe;gBACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS;YAClC,OAAO,EAAE,IAAI,CAAC,oBAAoB;gBAChC,CAAC,CAAC,MAAM,CAAC,gBAA6B;gBACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;YACvC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;SACjF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;QAChC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,mBAAmB,CACxB,KAAoB,EACpB,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;QAE1C,MAAM,KAAK,GAAG,eAAe,CAAK,KAAK,CAAC,CAAC;QACzC,OAAO,KAAK,KAAK,IAAI;YACnB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE;gBAClC,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,+DAA+D;gBACxE,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;aAC5B,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAEM,eAAe,CACpB,KAAgB,EAChB,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;QAE1C,MAAM,KAAK,GAAG,mBAAmB,CAAK,KAAK,CAAC,CAAC;QAC7C,OAAO,KAAK,KAAK,IAAI;YACnB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE;gBAClC,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,4BAA4B;gBAClC,OAAO,EAAE,2DAA2D;aACrE,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAEM,WAAW,CAChB,KAAwB,EACxB,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;QAE1C,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,oBAAoB,CACjC,IAAI,CAAC,SAAS,EACd,gBAAgB,EAChB,KAAK,EACL,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAC1C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,aAAa,EACb,IAAI,CAAC,SAAS,CACf,EACD,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,eAAe,CACrC,IAAI,CAAC,OAAO,EACZ,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,oBAAoB,CAC1B,EACD,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACxD,gBAAgB,CACjB,CAAC;QACF,IAAI,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,QAA2B,EAAE,QAA2B;QAC9D,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,aAAa,KAAK,KAAK;YAAE,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBACvC,KAAK,EAAE,QAAQ,CAAC,IAAI;gBACpB,aAAa,EAAE,QAAQ,CAAC,IAAI;aAC7B,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBACjC,KAAK,EAAE,QAAQ,CAAC,SAAS;gBACzB,aAAa,EAAE,QAAQ,CAAC,SAAS;aAClC,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxD,IAAI,CAAC,yBAAyB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAC9B,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;aACvC,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;CACF;AAED,SAAS,cAAc,CAAsB,KAAwB;IACnE,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/F,CAAC;AAED,SAAS,eAAe,CACtB,MAAoB,EACpB,QAA2B,EAC3B,QAA2B,EAC3B,eAAwB,EACxB,oBAA6B,EAC7B,cAAuB,EACvB,mBAA4B;IAE5B,OAAO,mBAAmB,CAAC,MAAM,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;QAC1D,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS;QACnE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;QAChF,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ;QACrF,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM;KAChF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAsB,KAAwB;IAClE,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAC3B,eAAwB,EACxB,oBAA6B,EAC7B,cAAuB,EACvB,mBAA4B,EAC5B,MAAoC;IAEpC,OAAO,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC;WACpF,UAAU,CACX,oBAAoB,EACpB,MAAM,CAAC,UAAU,KAAK,SAAS,EAC/B,aAAa,EACb,sBAAsB,CACvB;WACE,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,MAAM,EAAE,qBAAqB,CAAC;WACpF,UAAU,CACX,mBAAmB,EACnB,MAAM,CAAC,gBAAgB,KAAK,SAAS,EACrC,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CACjB,UAAmB,EACnB,QAAiB,EACjB,QAAgB,EAChB,KAAa;IAEb,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,QAAQ,WAAW,CAAC,CAAC,CAAC,gBAAgB,QAAQ,SAAS;QACxF,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,cAAc,KAAK,oCAAoC;YACzD,CAAC,CAAC,gBAAgB,KAAK,qCAAqC;KAC/D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Result } from '@sectile/core';
2
+ import type { RevisionSnapshot } from '@sectile/core/revision';
3
+ import type { TextEditingState } from '@sectile/core/text';
4
+ import { type DateFieldEvent, type DateFieldPolicies, type DateFieldState, type DateValue } from '@sectile/core/date-field';
5
+ import { type FacadeConnection } from './internal/facade.js';
6
+ export interface DateFieldOptions {
7
+ readonly input: HTMLInputElement;
8
+ readonly policies?: DateFieldPolicies;
9
+ readonly value?: DateValue | null;
10
+ readonly defaultValue?: DateValue | null;
11
+ readonly inputState?: TextEditingState;
12
+ readonly defaultInputState?: TextEditingState;
13
+ readonly disabled?: boolean;
14
+ readonly readOnly?: boolean;
15
+ readonly required?: boolean;
16
+ readonly label?: string;
17
+ readonly onValueChange?: (value: DateValue | null) => void;
18
+ readonly onInputStateChange?: (value: TextEditingState, previousValue: TextEditingState) => void;
19
+ readonly onUpdate?: () => void;
20
+ }
21
+ export interface DateFieldControlledValues {
22
+ readonly value?: DateValue | null;
23
+ readonly inputState?: TextEditingState;
24
+ }
25
+ export interface DateFieldConnection {
26
+ getSnapshot(): RevisionSnapshot<DateFieldState>;
27
+ getText(): string;
28
+ getValue(): DateValue | null;
29
+ syncControlledValues(values: DateFieldControlledValues): Result<RevisionSnapshot<DateFieldState>>;
30
+ handleEvent(event: DateFieldEvent): boolean;
31
+ refresh(): void;
32
+ disconnect(): void;
33
+ }
34
+ export declare function createDateField(options: DateFieldOptions): FacadeConnection<DateFieldConnection>;
35
+ export declare function tryCreateDateField(options: DateFieldOptions): Result<FacadeConnection<DateFieldConnection>>;
36
+ //# sourceMappingURL=date-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-field.d.ts","sourceRoot":"","sources":["../src/date-field.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAoE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC9L,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAMrF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAAE;AACzH,MAAM,WAAW,mBAAmB;IAClC,WAAW,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAChD,OAAO,IAAI,MAAM,CAAC;IAClB,QAAQ,IAAI,SAAS,GAAG,IAAI,CAAC;IAC7B,oBAAoB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IAClG,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC;IAC5C,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAgD;AACjJ,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAuD"}
@@ -0,0 +1,88 @@
1
+ import { unwrap } from '@sectile/core/result';
2
+ import { applyDateFieldEvent, createDateFieldState } from '@sectile/core/date-field';
3
+ import { createFacadeConnection } from './internal/facade.js';
4
+ import { createSemanticController } from './internal/semantic-controller.js';
5
+ import { setFieldValidity, setInteractionAttributes } from './internal/interaction.js';
6
+ import { DOMTextElementBinding } from './internal/text-element.js';
7
+ import { toTextEvent } from './text.js';
8
+ export function createDateField(options) { return unwrap(tryCreateDateField(options)); }
9
+ export function tryCreateDateField(options) { return createFacadeConnection(options, construct); }
10
+ function construct(options) {
11
+ const valueControlled = options.value !== undefined;
12
+ const inputControlled = options.inputState !== undefined;
13
+ const policies = Object.freeze({ ...options.policies, ...(options.required === undefined ? {} : { required: options.required }) });
14
+ const runtime = createSemanticController({
15
+ initial: createDateFieldState(options.value !== undefined ? options.value : options.defaultValue ?? null, options.inputState !== undefined ? options.inputState : options.defaultInputState),
16
+ reducer: (state, event) => applyDateFieldEvent(state, event, policies),
17
+ reconcile: (previous, proposed) => createDateFieldState(valueControlled ? previous.value : proposed.value, inputControlled ? previous.inputState : proposed.inputState),
18
+ notify: (previous, proposed) => { if (JSON.stringify(previous.inputState) !== JSON.stringify(proposed.inputState))
19
+ options.onInputStateChange?.(proposed.inputState, previous.inputState); },
20
+ toEffect: (command) => command,
21
+ interaction: options,
22
+ });
23
+ return runtime.ok ? { ok: true, value: new DOMDateField(options, runtime.value, valueControlled, inputControlled) } : runtime;
24
+ }
25
+ class DOMDateField {
26
+ options;
27
+ runtime;
28
+ valueControlled;
29
+ inputControlled;
30
+ #binding;
31
+ #keydown = (event) => {
32
+ if (this.#binding.isComposing || event.isComposing)
33
+ return;
34
+ const semantic = event.key === 'ArrowUp' ? 'increment-segment' : event.key === 'ArrowDown' ? 'decrement-segment' : event.key === 'Enter' ? 'commit' : event.key === 'Escape' ? 'cancel' : null;
35
+ if (semantic !== null) {
36
+ event.preventDefault();
37
+ if (semantic === 'increment-segment' || semantic === 'decrement-segment')
38
+ this.#syncSelection();
39
+ this.handleEvent(semantic);
40
+ }
41
+ };
42
+ #blur = () => {
43
+ if (!this.#binding.isComposing && !this.handleEvent('commit'))
44
+ this.handleEvent('cancel');
45
+ };
46
+ constructor(options, runtime, valueControlled, inputControlled) {
47
+ this.options = options;
48
+ this.runtime = runtime;
49
+ this.valueControlled = valueControlled;
50
+ this.inputControlled = inputControlled;
51
+ this.#binding = new DOMTextElementBinding({ element: options.input, getState: () => this.getSnapshot().state.inputState, dispatch: (input) => this.#text(input) });
52
+ options.input.addEventListener('keydown', this.#keydown);
53
+ options.input.addEventListener('blur', this.#blur);
54
+ this.refresh();
55
+ }
56
+ getSnapshot() { return this.runtime.getSnapshot(); }
57
+ getText() { return this.getSnapshot().state.inputState.snapshot.text; }
58
+ getValue() { return this.getSnapshot().state.value; }
59
+ syncControlledValues(values) {
60
+ if (this.valueControlled !== (values.value !== undefined) || this.inputControlled !== (values.inputState !== undefined))
61
+ return { ok: false, error: { class: 'construction', code: 'controlled-shape-mismatch', message: 'Controlled date field values must preserve their construction-time shape.' } };
62
+ const state = this.getSnapshot().state;
63
+ const result = this.runtime.replace(createDateFieldState(this.valueControlled ? values.value : state.value, this.inputControlled ? values.inputState : state.inputState));
64
+ if (result.ok) {
65
+ this.refresh();
66
+ this.options.onUpdate?.();
67
+ }
68
+ return result;
69
+ }
70
+ handleEvent(event) {
71
+ const result = this.runtime.handle(event);
72
+ setFieldValidity(this.options.input, result);
73
+ if (result.ok) {
74
+ for (const command of result.commands)
75
+ if (command.type === 'value-committed')
76
+ this.options.onValueChange?.(command.value);
77
+ this.refresh();
78
+ this.options.onUpdate?.();
79
+ }
80
+ return result.ok;
81
+ }
82
+ refresh() { const input = this.options.input; input.type = 'text'; input.inputMode = 'numeric'; input.placeholder = 'YYYY-MM-DD'; input.required = this.options.required ?? this.options.policies?.required ?? false; setInteractionAttributes(input, this.options, { native: true, readOnly: true }); if (this.options.label !== undefined)
83
+ input.setAttribute('aria-label', this.options.label); this.#binding.render(); }
84
+ disconnect() { this.#binding.disconnect(); this.options.input.removeEventListener('keydown', this.#keydown); this.options.input.removeEventListener('blur', this.#blur); }
85
+ #text(input) { const event = toTextEvent(input); return event !== null && this.handleEvent({ type: 'text', event }); }
86
+ #syncSelection() { const input = this.options.input; const start = input.selectionStart ?? 0; const end = input.selectionEnd ?? start; const backward = input.selectionDirection === 'backward'; this.handleEvent({ type: 'text', event: { type: 'replace', startCodeUnitOffset: backward ? end : start, endCodeUnitOffset: backward ? end : start, text: '', selection: { anchorCodeUnitOffset: backward ? end : start, focusCodeUnitOffset: backward ? start : end } } }); }
87
+ }
88
+ //# 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,43 @@
1
+ import type { Result } from '@sectile/core';
2
+ import type { RevisionSnapshot } from '@sectile/core/revision';
3
+ import { type DateValue } from '@sectile/core/date-field';
4
+ import { type DatePickerEvent, type DatePickerPolicies, type DatePickerState } from '@sectile/core/date-picker';
5
+ import { type FacadeConnection } from './internal/facade.js';
6
+ export interface DatePickerOptions {
7
+ readonly root: HTMLElement;
8
+ readonly grid: HTMLElement;
9
+ readonly trigger: HTMLElement;
10
+ readonly input?: HTMLInputElement;
11
+ readonly policies?: DatePickerPolicies;
12
+ readonly value?: DateValue | null;
13
+ readonly defaultValue?: DateValue | null;
14
+ readonly highlightedValue?: DateValue;
15
+ readonly defaultHighlightedValue?: DateValue;
16
+ readonly open?: boolean;
17
+ readonly defaultOpen?: boolean;
18
+ readonly disabled?: boolean;
19
+ readonly readOnly?: boolean;
20
+ readonly required?: boolean;
21
+ readonly label?: string;
22
+ readonly onValueChange?: (value: DateValue | null) => void;
23
+ readonly onHighlightedValueChange?: (value: DateValue) => void;
24
+ readonly onOpenChange?: (open: boolean) => void;
25
+ readonly onUpdate?: () => void;
26
+ }
27
+ export interface DatePickerControlledValues {
28
+ readonly value?: DateValue | null;
29
+ readonly highlightedValue?: DateValue;
30
+ readonly open?: boolean;
31
+ }
32
+ export interface DatePickerConnection {
33
+ getSnapshot(): RevisionSnapshot<DatePickerState>;
34
+ getMonth(): readonly (readonly DateValue[])[];
35
+ syncControlledValues(values: DatePickerControlledValues): Result<RevisionSnapshot<DatePickerState>>;
36
+ setCellAttributes(element: HTMLElement, value: DateValue): void;
37
+ handleEvent(event: DatePickerEvent): boolean;
38
+ refresh(): void;
39
+ disconnect(): void;
40
+ }
41
+ export declare function createDatePicker(options: DatePickerOptions): FacadeConnection<DatePickerConnection>;
42
+ export declare function tryCreateDatePicker(options: DatePickerOptions): Result<FacadeConnection<DatePickerConnection>>;
43
+ //# 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":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAwI,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACtP,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IACtC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,SAAS,CAAC;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AACD,MAAM,WAAW,0BAA0B;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CAAE;AAClJ,MAAM,WAAW,oBAAoB;IACnC,WAAW,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACjD,QAAQ,IAAI,SAAS,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC;IAC9C,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;IACpG,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAChE,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;CACpB;AACD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAiD;AACrJ,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAuD"}