@devslab/dds-solid 0.22.1 → 0.24.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 (89) hide show
  1. package/README.ko.md +49 -3
  2. package/README.md +47 -3
  3. package/dist/assets/{calendar-view-1RO2mtf1.js → calendar-view-BBQGmkJ7.js} +181 -145
  4. package/dist/assets/calendar-view-BBQGmkJ7.js.map +1 -0
  5. package/dist/assets/{choice-DoXiK8nc.js → choice-DPmk9AHn.js} +41 -29
  6. package/dist/assets/choice-DPmk9AHn.js.map +1 -0
  7. package/dist/assets/choice-types-h4YVL8xH.js +24 -0
  8. package/dist/assets/choice-types-h4YVL8xH.js.map +1 -0
  9. package/dist/assets/date-only-0Ldsjp43.js +174 -0
  10. package/dist/assets/date-only-0Ldsjp43.js.map +1 -0
  11. package/dist/assets/direction-BpTqmXs-.js +24 -0
  12. package/dist/assets/direction-BpTqmXs-.js.map +1 -0
  13. package/dist/calendar-view-CZLsC57_.js +481 -0
  14. package/dist/calendar-view-CZLsC57_.js.map +1 -0
  15. package/dist/calendar-view.d.ts +10 -0
  16. package/dist/calendar-view.d.ts.map +1 -1
  17. package/dist/calendar.js +7 -6
  18. package/dist/calendar.js.map +1 -1
  19. package/dist/calendar.server.js +2 -1
  20. package/dist/calendar.server.js.map +1 -1
  21. package/dist/choice-CTNeFOVo.js +403 -0
  22. package/dist/choice-CTNeFOVo.js.map +1 -0
  23. package/dist/choice-types-kSaEnZPr.js +23 -0
  24. package/dist/choice-types-kSaEnZPr.js.map +1 -0
  25. package/dist/combobox.js +1 -1
  26. package/dist/combobox.server.js +1 -1
  27. package/dist/date-only-Bu4UmsTP.js +151 -0
  28. package/dist/date-only-Bu4UmsTP.js.map +1 -0
  29. package/dist/date-only.d.ts +92 -0
  30. package/dist/date-only.d.ts.map +1 -1
  31. package/dist/date-picker.js +51 -50
  32. package/dist/date-picker.js.map +1 -1
  33. package/dist/date-picker.server.js +2 -1
  34. package/dist/date-picker.server.js.map +1 -1
  35. package/dist/date-range-picker.d.ts +41 -0
  36. package/dist/date-range-picker.d.ts.map +1 -0
  37. package/dist/date-range-picker.js +368 -0
  38. package/dist/date-range-picker.js.map +1 -0
  39. package/dist/date-range-picker.server.js +347 -0
  40. package/dist/date-range-picker.server.js.map +1 -0
  41. package/dist/direction-CS85IDNU.js +21 -0
  42. package/dist/direction-CS85IDNU.js.map +1 -0
  43. package/dist/index.d.ts +6 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +193 -176
  46. package/dist/index.js.map +1 -1
  47. package/dist/internal/choice.d.ts +25 -3
  48. package/dist/internal/choice.d.ts.map +1 -1
  49. package/dist/month-picker.d.ts +33 -0
  50. package/dist/month-picker.d.ts.map +1 -0
  51. package/dist/month-picker.js +287 -0
  52. package/dist/month-picker.js.map +1 -0
  53. package/dist/month-picker.server.js +282 -0
  54. package/dist/month-picker.server.js.map +1 -0
  55. package/dist/number-input.d.ts +53 -0
  56. package/dist/number-input.d.ts.map +1 -0
  57. package/dist/number-input.js +267 -0
  58. package/dist/number-input.js.map +1 -0
  59. package/dist/number-input.server.js +237 -0
  60. package/dist/number-input.server.js.map +1 -0
  61. package/dist/pending-action.d.ts +36 -0
  62. package/dist/pending-action.d.ts.map +1 -0
  63. package/dist/segmented-control.d.ts +40 -0
  64. package/dist/segmented-control.d.ts.map +1 -0
  65. package/dist/segmented-control.js +133 -0
  66. package/dist/segmented-control.js.map +1 -0
  67. package/dist/segmented-control.server.js +138 -0
  68. package/dist/segmented-control.server.js.map +1 -0
  69. package/dist/select-picker.js +1 -1
  70. package/dist/select-picker.server.js +1 -1
  71. package/dist/server.js +49 -23
  72. package/dist/server.js.map +1 -1
  73. package/dist/time-only.d.ts +32 -0
  74. package/dist/time-only.d.ts.map +1 -0
  75. package/dist/time-picker-BlMWCQwk.js +113 -0
  76. package/dist/time-picker-BlMWCQwk.js.map +1 -0
  77. package/dist/time-picker.d.ts +34 -0
  78. package/dist/time-picker.d.ts.map +1 -0
  79. package/dist/time-picker.js +2 -0
  80. package/dist/time-picker.server.js +152 -0
  81. package/dist/time-picker.server.js.map +1 -0
  82. package/package.json +44 -4
  83. package/styles.css +31 -1
  84. package/dist/assets/calendar-view-1RO2mtf1.js.map +0 -1
  85. package/dist/assets/choice-DoXiK8nc.js.map +0 -1
  86. package/dist/calendar-view-CTBTPB4T.js +0 -444
  87. package/dist/calendar-view-CTBTPB4T.js.map +0 -1
  88. package/dist/choice-BPMiJlPJ.js +0 -395
  89. package/dist/choice-BPMiJlPJ.js.map +0 -1
@@ -0,0 +1,347 @@
1
+ import { l as createControllableSignal, t as CalendarView } from "./assets/calendar-view-BBQGmkJ7.js";
2
+ import { n as describedBy } from "./assets/utils-Ou0UJRlO.js";
3
+ import { c as isKorean, d as rangeMessages, h as validateRange, i as displayDate, o as isCalendarDate, t as canonicalInput } from "./assets/date-only-0Ldsjp43.js";
4
+ import { Show, createEffect, createMemo, createSignal, createUniqueId, on, onCleanup, onMount } from "solid-js";
5
+ import { Portal, createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
6
+ import { DatePicker, parseDate } from "@ark-ui/solid/date-picker";
7
+ //#region src/date-range-picker.tsx
8
+ var _tmpl$ = ["<svg", " width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2\"></rect><path d=\"M7.5 3v5M16.5 3v5M3.5 10.5h17\"></path></svg>"];
9
+ var _tmpl$2 = ["<span", " aria-hidden=\"true\"> *</span>"];
10
+ var _tmpl$3 = [
11
+ "<label",
12
+ " class=\"dds-field__label\"",
13
+ "><!--$-->",
14
+ "<!--/--><!--$-->",
15
+ "<!--/--></label>"
16
+ ];
17
+ var _tmpl$4 = [
18
+ "<div",
19
+ " class=\"dds-date-range-box\"",
20
+ "><input type=\"text\" class=\"dds-date-range-input\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"",
21
+ "",
22
+ "",
23
+ "><span class=\"dds-date-range-separator\" aria-hidden=\"true\">~</span><input type=\"text\" class=\"dds-date-range-input\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"",
24
+ "",
25
+ "",
26
+ "></div>"
27
+ ];
28
+ var _tmpl$5 = [
29
+ "<input",
30
+ " type=\"hidden\"",
31
+ "",
32
+ ">"
33
+ ];
34
+ var _tmpl$6 = [
35
+ "<span",
36
+ " class=\"dds-field__error\" role=\"alert\">",
37
+ "</span>"
38
+ ];
39
+ var _tmpl$7 = [
40
+ "<div",
41
+ " class=\"",
42
+ "\" role=\"group\"",
43
+ "><!--$-->",
44
+ "<!--/--><!--$-->",
45
+ "<!--/--><!--$-->",
46
+ "<!--/--><!--$-->",
47
+ "<!--/--><!--$-->",
48
+ "<!--/--></div>"
49
+ ];
50
+ var EMPTY = {
51
+ start: "",
52
+ end: ""
53
+ };
54
+ var same = (a, b) => a.start === b.start && a.end === b.end;
55
+ function selectionOf(range) {
56
+ if (!isCalendarDate(range.start)) return [];
57
+ const start = parseDate(range.start);
58
+ return isCalendarDate(range.end) && range.start <= range.end ? [start, parseDate(range.end)] : [start];
59
+ }
60
+ function CalendarIcon() {
61
+ return ssr(_tmpl$, ssrHydrationKey());
62
+ }
63
+ function DateRangePicker(props) {
64
+ const locale = () => props.locale ?? "ko-KR", id = props.id ?? `dds-date-range-${createUniqueId()}`, endId = `${id}-end`, labelId = `${id}-label`, errorId = `${id}-error`;
65
+ const text = () => rangeMessages(locale(), props.messages);
66
+ const [value, setValue] = createControllableSignal({
67
+ value: () => props.value,
68
+ defaultValue: props.defaultValue ?? EMPTY,
69
+ onChange: void 0
70
+ });
71
+ const display = (range) => ({
72
+ start: displayDate(range.start, locale()),
73
+ end: displayDate(range.end, locale())
74
+ });
75
+ const [draftState, setDraftState] = createSignal({
76
+ ...display(value()),
77
+ locale: locale()
78
+ });
79
+ const relocalize = (draft, from) => {
80
+ const canonical = canonicalInput(draft, from);
81
+ return from !== locale() && isCalendarDate(canonical) ? displayDate(canonical, locale()) : draft;
82
+ };
83
+ const drafts = createMemo(() => {
84
+ const state = draftState();
85
+ return {
86
+ start: relocalize(state.start, state.locale),
87
+ end: relocalize(state.end, state.locale)
88
+ };
89
+ });
90
+ const setDrafts = (next) => setDraftState({
91
+ ...next,
92
+ locale: locale()
93
+ });
94
+ const [selection, setSelection] = createSignal(selectionOf(value()));
95
+ const [open, setOpen] = createSignal(false);
96
+ let endInput, emitted = value(), focusFrame;
97
+ const [portalMount, setPortalMount] = createSignal();
98
+ onMount(() => {});
99
+ const blocked = () => props.disabled || props.readOnly;
100
+ const validity = createMemo(() => validateRange(drafts().start, drafts().end, props.required ?? false, props.min, props.max, locale()));
101
+ const messageFor = (reason) => reason === "required" ? text().required : reason === "order" ? text().order : text().invalid;
102
+ const error = () => validity().valid ? void 0 : messageFor(validity().reason);
103
+ const startInvalid = () => props.invalid || !validity().start.valid;
104
+ const endInvalid = () => props.invalid || !validity().end.valid || validity().reason === "order";
105
+ const fieldName = () => props.label ?? props["aria-label"] ?? "";
106
+ createEffect(on(() => [value().start, value().end], ([start, end]) => {
107
+ if (same({
108
+ start,
109
+ end
110
+ }, emitted)) return;
111
+ emitted = {
112
+ start,
113
+ end
114
+ };
115
+ setDrafts(display(emitted));
116
+ setSelection(selectionOf(emitted));
117
+ }, { defer: true }));
118
+ createEffect(() => {
119
+ validity();
120
+ });
121
+ createEffect(() => {
122
+ if (blocked()) {
123
+ setOpen(false);
124
+ if (focusFrame !== void 0) cancelAnimationFrame(focusFrame);
125
+ }
126
+ });
127
+ onMount(() => {});
128
+ onCleanup(() => {
129
+ if (focusFrame !== void 0) cancelAnimationFrame(focusFrame);
130
+ });
131
+ function focusSoon(target, frames = 1) {
132
+ if (focusFrame !== void 0) cancelAnimationFrame(focusFrame);
133
+ const run = (left) => {
134
+ focusFrame = requestAnimationFrame(() => {
135
+ if (left > 1) return run(left - 1);
136
+ if (!blocked()) target()?.focus({ preventScroll: true });
137
+ });
138
+ };
139
+ run(frames);
140
+ }
141
+ function commit(next) {
142
+ if (blocked()) return;
143
+ setSelection(selectionOf(next));
144
+ if (same(next, emitted)) return;
145
+ emitted = next;
146
+ setValue(next);
147
+ props.onValueChange?.(next);
148
+ }
149
+ function choose(range) {
150
+ setDrafts(display(range));
151
+ commit(range);
152
+ }
153
+ const presets = () => (props.presets ?? []).map((preset) => {
154
+ const state = () => validateRange(preset.value.start, preset.value.end, false, props.min, props.max, "en-US");
155
+ return {
156
+ label: preset.label,
157
+ disabled: !state().valid,
158
+ onSelect: () => {
159
+ const checked = state();
160
+ if (blocked() || !checked.valid) return;
161
+ choose(checked.value);
162
+ setOpen(false);
163
+ focusSoon(() => endInput, 2);
164
+ }
165
+ };
166
+ });
167
+ return ssr(_tmpl$7, ssrHydrationKey(), `dds-field dds-date-picker dds-date-range-picker dds-date-picker--${escape(props.labelPlacement ?? "outside", true)}${error() ? " dds-field--error" : ""}`, ssrAttribute("aria-labelledby", escape(props["aria-labelledby"] ?? (props.label ? labelId : void 0), true), false) + ssrAttribute("aria-label", props.label || props["aria-labelledby"] ? escape(void 0, true) : escape(props["aria-label"], true), false) + ssrAttribute("data-filled", drafts().start !== "" || drafts().end !== "" ? "true" : escape(void 0, true), false) + ssrAttribute("data-invalid", startInvalid() || endInvalid() ? "" : escape(void 0, true), false) + ssrAttribute("data-disabled", props.disabled ? "" : escape(void 0, true), false), escape(createComponent(Show, {
168
+ get when() {
169
+ return props.label;
170
+ },
171
+ get children() {
172
+ return ssr(_tmpl$3, ssrHydrationKey() + ssrAttribute("id", escape(labelId, true), false), ssrAttribute("for", escape(id, true), false), escape(props.label), escape(createComponent(Show, {
173
+ get when() {
174
+ return props.required;
175
+ },
176
+ get children() {
177
+ return ssr(_tmpl$2, ssrHydrationKey());
178
+ }
179
+ })));
180
+ }
181
+ })), escape(createComponent(DatePicker.Root, {
182
+ get locale() {
183
+ return locale();
184
+ },
185
+ get timeZone() {
186
+ return props.timeZone ?? "Asia/Seoul";
187
+ },
188
+ selectionMode: "range",
189
+ get disabled() {
190
+ return props.disabled;
191
+ },
192
+ get readOnly() {
193
+ return props.readOnly;
194
+ },
195
+ get required() {
196
+ return props.required;
197
+ },
198
+ get invalid() {
199
+ return props.invalid || !validity().valid;
200
+ },
201
+ get open() {
202
+ return memo(() => !!open())() && !blocked();
203
+ },
204
+ onOpenChange: (details) => {
205
+ setOpen(details.open && !blocked());
206
+ if (!details.open) setSelection(selectionOf(emitted));
207
+ },
208
+ get min() {
209
+ return memo(() => !!(props.min && isCalendarDate(props.min)))() ? parseDate(props.min) : void 0;
210
+ },
211
+ get max() {
212
+ return memo(() => !!(props.max && isCalendarDate(props.max)))() ? parseDate(props.max) : void 0;
213
+ },
214
+ get startOfWeek() {
215
+ return props.startOfWeek ?? 0;
216
+ },
217
+ minView: "day",
218
+ maxView: "day",
219
+ fixedWeeks: true,
220
+ get translations() {
221
+ return {
222
+ dayCell: (state) => text().selectDate(state.valueText),
223
+ clearTrigger: text().clear
224
+ };
225
+ },
226
+ get value() {
227
+ return selection();
228
+ },
229
+ onValueChange: (details) => {
230
+ if (blocked()) return;
231
+ setSelection(details.value);
232
+ if (details.value.length < 2) return;
233
+ const [start, end] = details.value.map((day) => day.toString()).sort();
234
+ const checked = validateRange(start, end, false, props.min, props.max, "en-US");
235
+ if (!checked.valid) return;
236
+ choose(checked.value);
237
+ focusSoon(() => endInput, 2);
238
+ },
239
+ get positioning() {
240
+ return {
241
+ placement: "bottom-start",
242
+ gutter: 8,
243
+ strategy: portalMount()?.matches("[role=\"dialog\"], [role=\"alertdialog\"]") ? "fixed" : "absolute",
244
+ hideWhenDetached: !!portalMount()?.matches("[role=\"dialog\"], [role=\"alertdialog\"]")
245
+ };
246
+ },
247
+ get children() {
248
+ return [createComponent(DatePicker.Control, {
249
+ "class": "dds-date-picker-control",
250
+ get children() {
251
+ return [ssr(_tmpl$4, ssrHydrationKey(), ssrAttribute("data-invalid", startInvalid() || endInvalid() ? "" : escape(void 0, true), false) + ssrAttribute("data-disabled", props.disabled ? "" : escape(void 0, true), false), ssrAttribute("placeholder", isKorean(locale()) ? "YYYY/MM/DD" : "YYYY-MM-DD", false) + ssrAttribute("id", escape(id, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("aria-label", escape(text().startLabel, true), false) + ssrAttribute("aria-invalid", startInvalid() ? "true" : escape(void 0, true), false) + ssrAttribute("aria-required", props.required ? "true" : escape(void 0, true), false) + ssrAttribute("aria-describedby", escape(describedBy(props["aria-describedby"], error() && errorId), true), false) + ssrAttribute("value", escape(drafts().start, true), false), ssrAttribute("required", props.required, true) + ssrAttribute("readonly", escape(props.readOnly, true), false), ssrAttribute("disabled", props.disabled, true), ssrAttribute("placeholder", isKorean(locale()) ? "YYYY/MM/DD" : "YYYY-MM-DD", false) + ssrAttribute("id", escape(endId, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("aria-label", escape(text().endLabel, true), false) + ssrAttribute("aria-invalid", endInvalid() ? "true" : escape(void 0, true), false) + ssrAttribute("aria-required", props.required ? "true" : escape(void 0, true), false) + ssrAttribute("aria-describedby", escape(describedBy(props["aria-describedby"], error() && errorId), true), false) + ssrAttribute("value", escape(drafts().end, true), false), ssrAttribute("required", props.required, true) + ssrAttribute("readonly", escape(props.readOnly, true), false), ssrAttribute("disabled", props.disabled, true)), createComponent(DatePicker.Trigger, {
252
+ "class": "dds-btn dds-btn--secondary",
253
+ get ["aria-label"]() {
254
+ return `${fieldName()} ${text().openCalendar}`.trim();
255
+ },
256
+ get children() {
257
+ return createComponent(CalendarIcon, {});
258
+ }
259
+ })];
260
+ }
261
+ }), createComponent(Show, {
262
+ get when() {
263
+ return portalMount();
264
+ },
265
+ children: (mount) => createComponent(Portal, {
266
+ get mount() {
267
+ return mount();
268
+ },
269
+ get children() {
270
+ return createComponent(DatePicker.Positioner, {
271
+ "class": "dds-date-picker-positioner",
272
+ get children() {
273
+ return createComponent(DatePicker.Content, {
274
+ "class": "dds-date-picker-content dds-date-range-content",
275
+ get ["aria-label"]() {
276
+ return `${fieldName()} ${text().chooseRange}`.trim();
277
+ },
278
+ get children() {
279
+ return createComponent(CalendarView, {
280
+ get timeZone() {
281
+ return props.timeZone;
282
+ },
283
+ get min() {
284
+ return props.min;
285
+ },
286
+ get max() {
287
+ return props.max;
288
+ },
289
+ get locale() {
290
+ return locale();
291
+ },
292
+ get messages() {
293
+ return text();
294
+ },
295
+ get disabled() {
296
+ return props.disabled;
297
+ },
298
+ get readOnly() {
299
+ return props.readOnly;
300
+ },
301
+ showToday: false,
302
+ get showClear() {
303
+ return props.clearable;
304
+ },
305
+ get presets() {
306
+ return presets();
307
+ },
308
+ get presetsLabel() {
309
+ return text().presets;
310
+ },
311
+ onClear: () => choose(EMPTY)
312
+ });
313
+ }
314
+ });
315
+ }
316
+ });
317
+ }
318
+ })
319
+ })];
320
+ }
321
+ })), escape(createComponent(Show, {
322
+ get when() {
323
+ return props.startName;
324
+ },
325
+ get children() {
326
+ return ssr(_tmpl$5, ssrHydrationKey(), ssrAttribute("name", escape(props.startName, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("value", escape(value().start, true), false), ssrAttribute("disabled", props.disabled, true));
327
+ }
328
+ })), escape(createComponent(Show, {
329
+ get when() {
330
+ return props.endName;
331
+ },
332
+ get children() {
333
+ return ssr(_tmpl$5, ssrHydrationKey(), ssrAttribute("name", escape(props.endName, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("value", escape(value().end, true), false), ssrAttribute("disabled", props.disabled, true));
334
+ }
335
+ })), escape(createComponent(Show, {
336
+ get when() {
337
+ return error();
338
+ },
339
+ get children() {
340
+ return ssr(_tmpl$6, ssrHydrationKey() + ssrAttribute("id", escape(errorId, true), false), escape(error()));
341
+ }
342
+ })));
343
+ }
344
+ //#endregion
345
+ export { DateRangePicker };
346
+
347
+ //# sourceMappingURL=date-range-picker.server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-picker.server.js","names":["DatePicker","ArkDatePicker","parseDate","DateValue","Portal","createEffect","createMemo","createSignal","createUniqueId","on","onCleanup","onMount","Show","CalendarView","createControllableSignal","canonicalInput","displayDate","isCalendarDate","isKorean","rangeMessages","validateRange","DateRange","DateRangeMessages","describedBy","DateRangeValidity","DateRangePreset","label","value","DateRangePickerProps","labelPlacement","id","defaultValue","onValueChange","next","locale","timeZone","min","max","startOfWeek","messages","clearable","presets","required","disabled","readOnly","invalid","startName","endName","form","EMPTY","start","end","same","a","b","selectionOf","range","CalendarIcon","_$ssr","_tmpl$","_$ssrHydrationKey","DateRangePicker","props","endId","labelId","errorId","text","setValue","onChange","undefined","display","draftState","setDraftState","relocalize","draft","from","canonical","drafts","state","setDrafts","selection","setSelection","open","setOpen","startInput","HTMLInputElement","endInput","trigger","HTMLButtonElement","emitted","focusFrame","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","blocked","validity","messageFor","reason","order","error","valid","startInvalid","endInvalid","fieldName","const","defer","setCustomValidity","cancelAnimationFrame","doc","reset","event","Event","getElementById","target","setTimeout","defaultPrevented","shown","addEventListener","removeEventListener","focusSoon","frames","run","left","requestAnimationFrame","focus","preventScroll","commit","changeDraft","side","typed","loose","part","choose","map","preset","onSelect","checked","_tmpl$7","_$escape","_$ssrAttribute","_$createComponent","when","children","_tmpl$3","_tmpl$2","Root","selectionMode","_$memo","onOpenChange","details","minView","maxView","fixedWeeks","translations","dayCell","selectDate","valueText","clearTrigger","clear","length","day","toString","sort","positioning","placement","gutter","strategy","matches","hideWhenDetached","Control","_tmpl$4","startLabel","endLabel","Trigger","aria-label","openCalendar","trim","mount","Positioner","Content","chooseRange","showToday","showClear","presetsLabel","onClear","_tmpl$5","_tmpl$6"],"sources":["../src/date-range-picker.tsx"],"sourcesContent":["import {\n DatePicker as ArkDatePicker,\n parseDate,\n type DateValue,\n} from \"@ark-ui/solid/date-picker\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n on,\n onCleanup,\n onMount,\n Show,\n} from \"solid-js\";\nimport { CalendarView } from \"./calendar-view\";\nimport { createControllableSignal } from \"./controllable\";\nimport {\n canonicalInput,\n displayDate,\n isCalendarDate,\n isKorean,\n rangeMessages,\n validateRange,\n type DateRange,\n type DateRangeMessages,\n} from \"./date-only\";\nimport { describedBy } from \"./utils\";\nexport type {\n DateRange,\n DateRangeMessages,\n DateRangeValidity,\n} from \"./date-only\";\n\n/** A consumer-supplied shortcut shown in the calendar footer. DDS ships no built-in list. */\nexport interface DateRangePreset {\n label: string;\n value: DateRange;\n}\n\nexport interface DateRangePickerProps {\n label?: string;\n /** Two inputs share one field label; \"inside\" is not offered. */\n labelPlacement?: \"outside\" | \"hidden\";\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n /** Id of the start input; the end input receives `${id}-end`. */\n id?: string;\n value?: DateRange;\n defaultValue?: DateRange;\n /** Called on user changes only, with YYYY-MM-DD or \"\" on each side; never with start after end. */\n onValueChange?: (next: DateRange) => void;\n locale?: string;\n timeZone?: string;\n min?: string;\n max?: string;\n startOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n messages?: DateRangeMessages;\n clearable?: boolean;\n presets?: DateRangePreset[];\n /** Both dates are required. */\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n invalid?: boolean;\n /** Form field name submitting the start date (YYYY-MM-DD or \"\"). */\n startName?: string;\n /** Form field name submitting the end date (YYYY-MM-DD or \"\"). */\n endName?: string;\n form?: string;\n}\n\nconst EMPTY: DateRange = { start: \"\", end: \"\" };\nconst same = (a: DateRange, b: DateRange) =>\n a.start === b.start && a.end === b.end;\n\nfunction selectionOf(range: DateRange): DateValue[] {\n if (!isCalendarDate(range.start)) return [];\n const start = parseDate(range.start);\n return isCalendarDate(range.end) && range.start <= range.end\n ? [start, parseDate(range.end)]\n : [start];\n}\n\nfunction CalendarIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2\" />\n <path d=\"M7.5 3v5M16.5 3v5M3.5 10.5h17\" />\n </svg>\n );\n}\n\nexport function DateRangePicker(props: DateRangePickerProps) {\n const locale = () => props.locale ?? \"ko-KR\",\n id = props.id ?? `dds-date-range-${createUniqueId()}`,\n endId = `${id}-end`,\n labelId = `${id}-label`,\n errorId = `${id}-error`;\n const text = () => rangeMessages(locale(), props.messages);\n const [value, setValue] = createControllableSignal<DateRange>({\n value: () => props.value,\n defaultValue: props.defaultValue ?? EMPTY,\n onChange: undefined,\n });\n const display = (range: DateRange) => ({\n start: displayDate(range.start, locale()),\n end: displayDate(range.end, locale()),\n });\n // Drafts keep their formatting locale so a locale change re-displays complete dates only.\n const [draftState, setDraftState] = createSignal({\n ...display(value()),\n locale: locale(),\n });\n const relocalize = (draft: string, from: string) => {\n const canonical = canonicalInput(draft, from);\n return from !== locale() && isCalendarDate(canonical)\n ? displayDate(canonical, locale())\n : draft;\n };\n const drafts = createMemo(() => {\n const state = draftState();\n return {\n start: relocalize(state.start, state.locale),\n end: relocalize(state.end, state.locale),\n };\n });\n const setDrafts = (next: DateRange) =>\n setDraftState({ ...next, locale: locale() });\n const [selection, setSelection] = createSignal(selectionOf(value()));\n const [open, setOpen] = createSignal(false);\n let startInput: HTMLInputElement | undefined,\n endInput: HTMLInputElement | undefined,\n trigger: HTMLButtonElement | undefined,\n emitted = value(),\n focusFrame: number | undefined;\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n if (startInput)\n setPortalMount(\n startInput.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n startInput.ownerDocument.body,\n );\n });\n const blocked = () => props.disabled || props.readOnly;\n const validity = createMemo(() =>\n validateRange(\n drafts().start,\n drafts().end,\n props.required ?? false,\n props.min,\n props.max,\n locale(),\n ),\n );\n const messageFor = (reason: string) =>\n reason === \"required\"\n ? text().required\n : reason === \"order\"\n ? text().order\n : text().invalid;\n const error = () =>\n validity().valid ? undefined : messageFor(validity().reason);\n const startInvalid = () => props.invalid || !validity().start.valid;\n const endInvalid = () =>\n props.invalid || !validity().end.valid || validity().reason === \"order\";\n const fieldName = () => props.label ?? props[\"aria-label\"] ?? \"\";\n\n createEffect(\n on(\n () => [value().start, value().end] as const,\n ([start, end]) => {\n if (same({ start, end }, emitted)) return;\n emitted = { start, end };\n setDrafts(display(emitted));\n setSelection(selectionOf(emitted));\n },\n { defer: true },\n ),\n );\n createEffect(() => {\n const state = validity();\n startInput?.setCustomValidity(\n state.start.valid ? \"\" : messageFor(state.start.reason),\n );\n endInput?.setCustomValidity(\n !state.end.valid\n ? messageFor(state.end.reason)\n : state.reason === \"order\"\n ? text().order\n : \"\",\n );\n });\n createEffect(() => {\n if (blocked()) {\n setOpen(false);\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n }\n });\n // Resolve the owning form when a reset happens: the field may mount before it joins its form.\n onMount(() => {\n const doc = startInput?.ownerDocument;\n if (!doc) return;\n const reset = (event: Event) => {\n const form = props.form ? doc.getElementById(props.form) : startInput?.form;\n if (!form || event.target !== form) return;\n // A task, not a microtask: a user-triggered reset runs its listeners before rewriting the controls.\n setTimeout(() => {\n if (event.defaultPrevented) return;\n const next = props.value ?? props.defaultValue ?? EMPTY;\n emitted = next;\n setValue(next);\n const shown = display(next);\n setDrafts(shown);\n setSelection(selectionOf(next));\n // Native reset rewrote the visible inputs; the drafts may not have changed.\n if (startInput) startInput.value = shown.start;\n if (endInput) endInput.value = shown.end;\n }, 0);\n };\n doc.addEventListener(\"reset\", reset, true);\n onCleanup(() => doc.removeEventListener(\"reset\", reset, true));\n });\n onCleanup(() => {\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n });\n\n function focusSoon(target: () => HTMLElement | undefined, frames = 1) {\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n const run = (left: number) => {\n focusFrame = requestAnimationFrame(() => {\n if (left > 1) return run(left - 1);\n if (!blocked()) target()?.focus({ preventScroll: true });\n });\n };\n run(frames);\n }\n function commit(next: DateRange) {\n if (blocked()) return;\n setSelection(selectionOf(next));\n if (same(next, emitted)) return;\n emitted = next;\n setValue(next);\n props.onValueChange?.(next);\n }\n /** Committing ignores `required` like DatePicker: an emptied side is still reported. */\n function changeDraft(side: \"start\" | \"end\", typed: string) {\n if (blocked()) return;\n const next = { ...drafts(), [side]: typed };\n const loose = validateRange(\n next.start,\n next.end,\n false,\n props.min,\n props.max,\n locale(),\n );\n const part = loose[side];\n if (part.valid) next[side] = displayDate(part.value ?? \"\", locale());\n setDrafts(next);\n if (loose.valid) commit(loose.value!);\n }\n function choose(range: DateRange) {\n setDrafts(display(range));\n commit(range);\n }\n const presets = () =>\n (props.presets ?? []).map((preset) => {\n const state = () =>\n validateRange(\n preset.value.start,\n preset.value.end,\n false,\n props.min,\n props.max,\n \"en-US\",\n );\n return {\n label: preset.label,\n disabled: !state().valid,\n onSelect: () => {\n const checked = state();\n if (blocked() || !checked.valid) return;\n choose(checked.value!);\n setOpen(false);\n focusSoon(() => endInput, 2);\n },\n };\n });\n\n\n return (\n <div\n class={`dds-field dds-date-picker dds-date-range-picker dds-date-picker--${props.labelPlacement ?? \"outside\"}${error() ? \" dds-field--error\" : \"\"}`}\n role=\"group\"\n aria-labelledby={\n props[\"aria-labelledby\"] ?? (props.label ? labelId : undefined)\n }\n aria-label={\n props.label || props[\"aria-labelledby\"] ? undefined : props[\"aria-label\"]\n }\n data-filled={drafts().start !== \"\" || drafts().end !== \"\" ? \"true\" : undefined}\n data-invalid={startInvalid() || endInvalid() ? \"\" : undefined}\n data-disabled={props.disabled ? \"\" : undefined}\n >\n <Show when={props.label}>\n <label id={labelId} class=\"dds-field__label\" for={id}>\n {props.label}\n <Show when={props.required}>\n <span aria-hidden=\"true\"> *</span>\n </Show>\n </label>\n </Show>\n <ArkDatePicker.Root\n locale={locale()}\n timeZone={props.timeZone ?? \"Asia/Seoul\"}\n selectionMode=\"range\"\n disabled={props.disabled}\n readOnly={props.readOnly}\n required={props.required}\n invalid={props.invalid || !validity().valid}\n open={open() && !blocked()}\n onOpenChange={(details) => {\n setOpen(details.open && !blocked());\n // A half-chosen period is not a value: closing restores the committed one.\n if (!details.open) setSelection(selectionOf(emitted));\n }}\n min={\n props.min && isCalendarDate(props.min)\n ? parseDate(props.min)\n : undefined\n }\n max={\n props.max && isCalendarDate(props.max)\n ? parseDate(props.max)\n : undefined\n }\n startOfWeek={props.startOfWeek ?? 0}\n minView=\"day\"\n maxView=\"day\"\n fixedWeeks\n translations={{\n dayCell: (state) => text().selectDate(state.valueText),\n clearTrigger: text().clear,\n }}\n value={selection()}\n onValueChange={(details) => {\n if (blocked()) return;\n setSelection(details.value);\n if (details.value.length < 2) return;\n const [start, end] = details.value.map((day) => day.toString()).sort();\n const checked = validateRange(\n start!,\n end!,\n false,\n props.min,\n props.max,\n \"en-US\",\n );\n if (!checked.valid) return;\n choose(checked.value!);\n focusSoon(() => endInput, 2);\n }}\n positioning={{\n placement: \"bottom-start\",\n gutter: 8,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? \"fixed\"\n : \"absolute\",\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n }}\n >\n <ArkDatePicker.Control class=\"dds-date-picker-control\">\n <div\n class=\"dds-date-range-box\"\n data-invalid={startInvalid() || endInvalid() ? \"\" : undefined}\n data-disabled={props.disabled ? \"\" : undefined}\n >\n <input\n type=\"text\"\n class=\"dds-date-range-input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n spellcheck={false}\n placeholder={isKorean(locale()) ? \"YYYY/MM/DD\" : \"YYYY-MM-DD\"}\n id={id}\n ref={startInput}\n form={props.form}\n aria-label={text().startLabel}\n aria-invalid={startInvalid() ? \"true\" : undefined}\n aria-required={props.required ? \"true\" : undefined}\n aria-describedby={describedBy(\n props[\"aria-describedby\"],\n error() && errorId,\n )}\n value={drafts().start}\n required={props.required}\n readOnly={props.readOnly}\n disabled={props.disabled}\n on:input={(event) => {\n event.stopPropagation();\n changeDraft(\"start\", event.currentTarget.value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.isComposing) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n />\n <span class=\"dds-date-range-separator\" aria-hidden=\"true\">\n ~\n </span>\n <input\n type=\"text\"\n class=\"dds-date-range-input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n spellcheck={false}\n placeholder={isKorean(locale()) ? \"YYYY/MM/DD\" : \"YYYY-MM-DD\"}\n id={endId}\n ref={endInput}\n form={props.form}\n aria-label={text().endLabel}\n aria-invalid={endInvalid() ? \"true\" : undefined}\n aria-required={props.required ? \"true\" : undefined}\n aria-describedby={describedBy(\n props[\"aria-describedby\"],\n error() && errorId,\n )}\n value={drafts().end}\n required={props.required}\n readOnly={props.readOnly}\n disabled={props.disabled}\n on:input={(event) => {\n event.stopPropagation();\n changeDraft(\"end\", event.currentTarget.value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.isComposing) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n />\n </div>\n <ArkDatePicker.Trigger\n ref={trigger}\n class=\"dds-btn dds-btn--secondary\"\n aria-label={`${fieldName()} ${text().openCalendar}`.trim()}\n >\n <CalendarIcon />\n </ArkDatePicker.Trigger>\n </ArkDatePicker.Control>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <ArkDatePicker.Positioner class=\"dds-date-picker-positioner\">\n <ArkDatePicker.Content\n ref={(node) => {\n const restoreTrigger = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") focusSoon(() => trigger, 2);\n };\n node.addEventListener(\"keydown\", restoreTrigger, true);\n onCleanup(() =>\n node.removeEventListener(\"keydown\", restoreTrigger, true),\n );\n }}\n class=\"dds-date-picker-content dds-date-range-content\"\n aria-label={`${fieldName()} ${text().chooseRange}`.trim()}\n >\n <CalendarView\n timeZone={props.timeZone}\n min={props.min}\n max={props.max}\n locale={locale()}\n messages={text()}\n disabled={props.disabled}\n readOnly={props.readOnly}\n showToday={false}\n showClear={props.clearable}\n presets={presets()}\n presetsLabel={text().presets}\n onClear={() => choose(EMPTY)}\n />\n </ArkDatePicker.Content>\n </ArkDatePicker.Positioner>\n </Portal>\n )}\n </Show>\n </ArkDatePicker.Root>\n <Show when={props.startName}>\n <input\n type=\"hidden\"\n name={props.startName}\n form={props.form}\n value={value().start}\n disabled={props.disabled}\n />\n </Show>\n <Show when={props.endName}>\n <input\n type=\"hidden\"\n name={props.endName}\n form={props.form}\n value={value().end}\n disabled={props.disabled}\n />\n </Show>\n <Show when={error()}>\n <span id={errorId} class=\"dds-field__error\" role=\"alert\">\n {error()}\n </span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { createSignal as e, onCleanup as t, onMount as n } from "solid-js";
2
+ //#region src/direction.ts
3
+ function r(r, i) {
4
+ let [a, o] = e("ltr");
5
+ return n(() => {
6
+ let e = r()?.parentElement;
7
+ if (!e) return;
8
+ let n = () => o(getComputedStyle(e).direction === "rtl" ? "rtl" : "ltr");
9
+ n();
10
+ let i = new MutationObserver(n);
11
+ i.observe(e.ownerDocument.documentElement, {
12
+ attributes: !0,
13
+ subtree: !0,
14
+ attributeFilter: ["dir"]
15
+ }), t(() => i.disconnect());
16
+ }), () => i() ?? a();
17
+ }
18
+ //#endregion
19
+ export { r as t };
20
+
21
+ //# sourceMappingURL=direction-CS85IDNU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direction-CS85IDNU.js","names":[],"sources":["../src/direction.ts"],"sourcesContent":["import { createSignal, onCleanup, onMount, type Accessor } from \"solid-js\";\n\nexport type Direction = \"ltr\" | \"rtl\";\n\n/** SSR callers may supply direction; clients also inherit their containing DOM. */\nexport function useDirection(element: () => HTMLElement | undefined, explicit: Accessor<Direction | undefined>) {\n const [ambient, setAmbient] = createSignal<Direction>(\"ltr\");\n onMount(() => {\n const parent = element()?.parentElement;\n if (!parent) return;\n const update = () => setAmbient(getComputedStyle(parent).direction === \"rtl\" ? \"rtl\" : \"ltr\");\n update();\n const observer = new MutationObserver(update);\n observer.observe(parent.ownerDocument.documentElement, { attributes: true, subtree: true, attributeFilter: [\"dir\"] });\n onCleanup(() => observer.disconnect());\n });\n return () => explicit() ?? ambient();\n}\n"],"mappings":";;AAKA,SAAgB,EAAa,GAAwC,GAA2C;CAC9G,IAAM,CAAC,GAAS,KAAc,EAAwB,KAAK;CAU3D,OATA,QAAc;EACZ,IAAM,IAAS,EAAQ,CAAC,EAAE;EAC1B,IAAI,CAAC,GAAQ;EACb,IAAM,UAAe,EAAW,iBAAiB,CAAM,CAAC,CAAC,cAAc,QAAQ,QAAQ,KAAK;EAC5F,EAAO;EACP,IAAM,IAAW,IAAI,iBAAiB,CAAM;EAE5C,AADA,EAAS,QAAQ,EAAO,cAAc,iBAAiB;GAAE,YAAY;GAAM,SAAS;GAAM,iBAAiB,CAAC,KAAK;EAAE,CAAC,GACpH,QAAgB,EAAS,WAAW,CAAC;CACvC,CAAC,SACY,EAAS,KAAK,EAAQ;AACrC"}
package/dist/index.d.ts CHANGED
@@ -4,16 +4,22 @@ export { ConsoleShell, type ConsoleHeader, type ConsoleNavGroup, type ConsoleNav
4
4
  export { Dialog, type DialogProps, type DialogFrameParts } from "./dialog";
5
5
  export { RadioGroup, type RadioGroupProps, type RadioOption } from "./radio-group";
6
6
  export { Icon, type IconProps } from "./icon";
7
+ export { createPendingAction, type PendingAction, type PendingActionRunOptions } from "./pending-action";
7
8
  export { createStatusPill } from "./status-pill";
8
9
  export type { StatusTone } from "./status-pill";
9
10
  export { Tab, TabList, TabPanel, Tabs, type TabPanelProps, type TabProps, type TabsProps } from "./tabs";
10
11
  export { ToastProvider, useToast, type ToastApi, type ToastInput, type ToastProviderProps, type ToastTone } from "./toast";
11
12
  export { Tooltip, type TooltipProps, type TooltipTriggerProps } from "./tooltip";
12
13
  export { DatePicker, type DatePickerProps } from "./date-picker";
14
+ export { TimePicker, type TimePickerProps, type TimeMessages } from "./time-picker";
15
+ export * from "./date-range-picker";
16
+ export * from "./month-picker";
13
17
  export * from "./input";
14
18
  export * from "./combobox";
15
19
  export * from "./select-picker";
16
20
  export * from "./dropdown-menu";
17
21
  export * from "./popover";
18
22
  export * from "./calendar";
23
+ export { SegmentedControl, validateSegmentedItems, type SegmentedControlItem, type SegmentedControlProps, } from "./segmented-control";
24
+ export { NumberInput, normalizeNumberText, numberInputMessages, type NumberInputMessages, type NumberInputProps, } from "./number-input";
19
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,MAAM,EACN,QAAQ,EACR,KAAK,EACL,UAAU,EACV,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/J,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEjE,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,MAAM,EACN,QAAQ,EACR,KAAK,EACL,UAAU,EACV,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/J,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACpF,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC"}