@devslab/dds-solid 0.21.1 → 0.22.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 (72) hide show
  1. package/README.ko.md +6 -0
  2. package/README.md +6 -0
  3. package/dist/assets/calendar-view-1RO2mtf1.js +456 -0
  4. package/dist/assets/calendar-view-1RO2mtf1.js.map +1 -0
  5. package/dist/assets/choice-DoXiK8nc.js +443 -0
  6. package/dist/assets/choice-DoXiK8nc.js.map +1 -0
  7. package/dist/assets/utils-Ou0UJRlO.js +11 -0
  8. package/dist/assets/utils-Ou0UJRlO.js.map +1 -0
  9. package/dist/calendar-view-CTBTPB4T.js +444 -0
  10. package/dist/calendar-view-CTBTPB4T.js.map +1 -0
  11. package/dist/calendar-view.d.ts +16 -0
  12. package/dist/calendar-view.d.ts.map +1 -0
  13. package/dist/calendar.d.ts +19 -0
  14. package/dist/calendar.d.ts.map +1 -0
  15. package/dist/calendar.js +95 -0
  16. package/dist/calendar.js.map +1 -0
  17. package/dist/calendar.server.js +95 -0
  18. package/dist/calendar.server.js.map +1 -0
  19. package/dist/choice-BPMiJlPJ.js +395 -0
  20. package/dist/choice-BPMiJlPJ.js.map +1 -0
  21. package/dist/choice-types.d.ts +56 -0
  22. package/dist/choice-types.d.ts.map +1 -0
  23. package/dist/combobox.d.ts +4 -0
  24. package/dist/combobox.d.ts.map +1 -0
  25. package/dist/combobox.js +10 -0
  26. package/dist/combobox.js.map +1 -0
  27. package/dist/combobox.server.js +10 -0
  28. package/dist/combobox.server.js.map +1 -0
  29. package/dist/date-only.d.ts +36 -0
  30. package/dist/date-only.d.ts.map +1 -0
  31. package/dist/date-picker.d.ts +10 -1
  32. package/dist/date-picker.d.ts.map +1 -1
  33. package/dist/date-picker.js +258 -0
  34. package/dist/date-picker.js.map +1 -0
  35. package/dist/date-picker.server.js +260 -0
  36. package/dist/date-picker.server.js.map +1 -0
  37. package/dist/dropdown-menu.d.ts +31 -0
  38. package/dist/dropdown-menu.d.ts.map +1 -0
  39. package/dist/dropdown-menu.js +101 -0
  40. package/dist/dropdown-menu.js.map +1 -0
  41. package/dist/dropdown-menu.server.js +111 -0
  42. package/dist/dropdown-menu.server.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 +232 -647
  46. package/dist/index.js.map +1 -1
  47. package/dist/input.d.ts +26 -0
  48. package/dist/input.d.ts.map +1 -0
  49. package/dist/input.js +130 -0
  50. package/dist/input.js.map +1 -0
  51. package/dist/input.server.js +120 -0
  52. package/dist/input.server.js.map +1 -0
  53. package/dist/internal/choice.d.ts +5 -0
  54. package/dist/internal/choice.d.ts.map +1 -0
  55. package/dist/popover.d.ts +22 -0
  56. package/dist/popover.d.ts.map +1 -0
  57. package/dist/popover.js +76 -0
  58. package/dist/popover.js.map +1 -0
  59. package/dist/popover.server.js +79 -0
  60. package/dist/popover.server.js.map +1 -0
  61. package/dist/select-picker.d.ts +4 -0
  62. package/dist/select-picker.d.ts.map +1 -0
  63. package/dist/select-picker.js +10 -0
  64. package/dist/select-picker.js.map +1 -0
  65. package/dist/select-picker.server.js +10 -0
  66. package/dist/select-picker.server.js.map +1 -0
  67. package/dist/server.js +28 -445
  68. package/dist/server.js.map +1 -1
  69. package/dist/utils-oKxhg9RG.js +11 -0
  70. package/dist/utils-oKxhg9RG.js.map +1 -0
  71. package/package.json +63 -6
  72. package/styles.css +10 -1
package/README.ko.md CHANGED
@@ -35,3 +35,9 @@ const [date, setDate] = createSignal("");
35
35
  ```
36
36
 
37
37
  Ark UI owns focus, selection and keyboard navigation; DDS owns styling. Controlled `value` uses `YYYY-MM-DD` or an empty string. `locale` defaults to `ko-KR`, `timeZone` to `Asia/Seoul`; optional `min`, `max` and `disabled` constrain selection. Time remains a separate field.
38
+
39
+ ## 입력·선택·메뉴·공유 달력
40
+
41
+ Input/InputGroup은 검색 전용이 아닌 일반 입력 기반이며 라벨 배치·내용 지우기를 지원합니다. Combobox/SelectPicker는 가상화를, DropdownMenu/Popover는 접근 가능한 팝업을, Calendar/DatePicker는 공유 달력을 제공합니다.
42
+
43
+ 상세 import: `@devslab/dds-solid/input`, `/combobox`, `/select-picker`, `/dropdown-menu`, `/popover`, `/calendar`, `/date-picker`. 기존 루트 import와 `styles.css`는 유지합니다. [공통 사용 가이드](https://github.com/devslab-kr/dds/blob/main/docs/components-input-choice-calendar.ko.md)를 참고하세요.
package/README.md CHANGED
@@ -34,3 +34,9 @@ const [date, setDate] = createSignal("");
34
34
  ```
35
35
 
36
36
  Ark UI owns focus, selection and keyboard navigation; DDS owns styling. Controlled `value` uses `YYYY-MM-DD` or an empty string. `locale` defaults to `ko-KR`, `timeZone` to `Asia/Seoul`; optional `min`, `max` and `disabled` constrain selection. Time remains a separate field.
37
+
38
+ ## Inputs, choices, overlays and shared calendars
39
+
40
+ Input/InputGroup are general-purpose native inputs, not search-only, with label placement and clear actions. Combobox/SelectPicker support fixed-row virtualization; DropdownMenu/Popover provide accessible overlays; Calendar/DatePicker share a calendar view.
41
+
42
+ Use explicit subpaths `@devslab/dds-solid/input`, `/combobox`, `/select-picker`, `/dropdown-menu`, `/popover`, `/calendar`, `/date-picker`, or the existing root exports. Keep importing `styles.css` once. See the [common usage guide](https://github.com/devslab-kr/dds/blob/main/docs/components-input-choice-calendar.md).
@@ -0,0 +1,456 @@
1
+ import { n as describedBy, t as classes } from "./utils-Ou0UJRlO.js";
2
+ import { For, Show, createSignal, createUniqueId, splitProps } from "solid-js";
3
+ import { createComponent, escape, mergeProps as mergeProps$1, ssr, ssrAttribute, ssrElement, ssrHydrationKey } from "solid-js/web";
4
+ import { useCheckbox } from "@ark-ui/solid/checkbox";
5
+ import { useSwitch } from "@ark-ui/solid/switch";
6
+ import { Field } from "@ark-ui/solid/field";
7
+ import { DatePicker } from "@ark-ui/solid/date-picker";
8
+ //#region src/controllable.ts
9
+ function createControllableSignal(options) {
10
+ const [internal, setInternal] = createSignal(options.defaultValue);
11
+ const value = () => options.value() ?? internal();
12
+ const setInternalValue = setInternal;
13
+ const setValue = (next) => {
14
+ const resolved = typeof next === "function" ? next(value()) : next;
15
+ if (options.value() === void 0) setInternalValue(() => resolved);
16
+ options.onChange?.(resolved);
17
+ return resolved;
18
+ };
19
+ return [value, setValue];
20
+ }
21
+ //#endregion
22
+ //#region src/controls.tsx
23
+ var _tmpl$$1 = ["<span", " class=\"dds-spinner\" aria-hidden=\"true\"></span>"];
24
+ var _tmpl$2$1 = ["<span", " aria-hidden=\"true\"> *</span>"];
25
+ var _tmpl$3 = [
26
+ "<span",
27
+ ">",
28
+ "</span>"
29
+ ];
30
+ var _tmpl$4 = [
31
+ "<label",
32
+ ">",
33
+ "<span>",
34
+ "</span></label>"
35
+ ];
36
+ function Button(props) {
37
+ const [local, rest] = splitProps(props, [
38
+ "class",
39
+ "tone",
40
+ "size",
41
+ "loading",
42
+ "disabled",
43
+ "type",
44
+ "children"
45
+ ]);
46
+ return ssrElement("button", mergeProps$1(rest, {
47
+ get type() {
48
+ return local.type ?? "button";
49
+ },
50
+ get ["class"]() {
51
+ return classes("dds-btn", `dds-btn--${local.tone ?? "primary"}`, local.size !== "md" && local.size ? `dds-btn--${local.size}` : void 0, local.class);
52
+ },
53
+ get disabled() {
54
+ return local.disabled || local.loading;
55
+ },
56
+ get ["aria-busy"]() {
57
+ return local.loading ? "true" : void 0;
58
+ }
59
+ }), () => [
60
+ "<!--$-->",
61
+ local.loading && _tmpl$$1[0] + ssrHydrationKey() + _tmpl$$1[1],
62
+ "<!--/-->",
63
+ "<!--$-->",
64
+ escape(local.children),
65
+ "<!--/-->"
66
+ ], true);
67
+ }
68
+ function IconButton(props) {
69
+ const [local, rest] = splitProps(props, [
70
+ "class",
71
+ "tone",
72
+ "size",
73
+ "loading",
74
+ "disabled",
75
+ "type",
76
+ "children"
77
+ ]);
78
+ return ssrElement("button", mergeProps$1(rest, {
79
+ get type() {
80
+ return local.type ?? "button";
81
+ },
82
+ get ["class"]() {
83
+ return classes("dds-iconbtn", local.tone && local.tone !== "ghost" ? `dds-iconbtn--${local.tone}` : void 0, local.size !== "md" && local.size ? `dds-iconbtn--${local.size}` : void 0, local.class);
84
+ },
85
+ get disabled() {
86
+ return local.disabled || local.loading;
87
+ },
88
+ get ["aria-busy"]() {
89
+ return local.loading ? "true" : void 0;
90
+ }
91
+ }), () => local.loading ? _tmpl$$1[0] + ssrHydrationKey() + _tmpl$$1[1] : escape(local.children), true);
92
+ }
93
+ function Field$1(props) {
94
+ const generated = createUniqueId();
95
+ const id = () => props.id ?? `dds-field-${generated}`;
96
+ const helpId = () => props.helpText ? `${id()}-help` : void 0;
97
+ const errorId = () => props.error ? `${id()}-error` : void 0;
98
+ const control = () => ({
99
+ id: id(),
100
+ "aria-describedby": describedBy(helpId(), errorId()),
101
+ "aria-invalid": props.error ? "true" : void 0,
102
+ "aria-required": props.required ? "true" : void 0
103
+ });
104
+ return createComponent(Field.Root, {
105
+ get id() {
106
+ return id();
107
+ },
108
+ get required() {
109
+ return props.required ?? false;
110
+ },
111
+ get invalid() {
112
+ return Boolean(props.error);
113
+ },
114
+ get ids() {
115
+ return {
116
+ control: `${id()}-root`,
117
+ helperText: `${id()}-help`,
118
+ errorText: `${id()}-error`
119
+ };
120
+ },
121
+ get ["class"]() {
122
+ return classes("dds-field", props.error ? "dds-field--error" : void 0, props.class);
123
+ },
124
+ get children() {
125
+ return [
126
+ createComponent(Field.Label, {
127
+ "class": "dds-field__label",
128
+ get ["for"]() {
129
+ return id();
130
+ },
131
+ get children() {
132
+ return [props.label, props.required && ssr(_tmpl$2$1, ssrHydrationKey())];
133
+ }
134
+ }),
135
+ typeof props.children === "function" ? props.children(control()) : props.children,
136
+ props.helpText && createComponent(Field.HelperText, {
137
+ "class": "dds-field__help",
138
+ get children() {
139
+ return props.helpText;
140
+ }
141
+ }),
142
+ props.error && createComponent(Field.ErrorText, {
143
+ "class": "dds-field__error",
144
+ role: "alert",
145
+ get children() {
146
+ return props.error;
147
+ }
148
+ })
149
+ ];
150
+ }
151
+ });
152
+ }
153
+ function Select(props) {
154
+ const [local, rest] = splitProps(props, [
155
+ "class",
156
+ "invalid",
157
+ "children"
158
+ ]);
159
+ return ssr(_tmpl$3, ssrHydrationKey() + ssrAttribute("class", escape(classes("dds-select", local.class), true), false), ssrElement("select", mergeProps$1(rest, {
160
+ "class": "dds-select__input",
161
+ get ["aria-invalid"]() {
162
+ return local.invalid ? "true" : void 0;
163
+ }
164
+ }), () => escape(local.children), false));
165
+ }
166
+ function Checkable(props) {
167
+ const [local, rest] = splitProps(props, [
168
+ "checked",
169
+ "defaultChecked",
170
+ "onCheckedChange",
171
+ "label",
172
+ "class",
173
+ "inputClass",
174
+ "type",
175
+ "role"
176
+ ]);
177
+ const [checked, setChecked] = createControllableSignal({
178
+ value: () => local.checked,
179
+ defaultValue: local.defaultChecked ?? false,
180
+ onChange: local.onCheckedChange
181
+ });
182
+ return ssr(_tmpl$4, ssrHydrationKey() + ssrAttribute("class", escape(classes(local.role === "switch" ? "dds-switch" : "dds-check", local.class), true), false), ssrElement("input", mergeProps$1(rest, {
183
+ get type() {
184
+ return local.type;
185
+ },
186
+ get role() {
187
+ return local.role;
188
+ },
189
+ get ["class"]() {
190
+ return classes(local.role === "switch" ? "dds-switch__input" : "dds-check__input", local.inputClass);
191
+ },
192
+ get checked() {
193
+ return checked();
194
+ }
195
+ }), void 0, false), escape(local.label));
196
+ }
197
+ var Checkbox = (props) => createComponent(ArkCheckable, mergeProps$1(props, { kind: "checkbox" }));
198
+ var Radio = (props) => createComponent(Checkable, mergeProps$1(props, { type: "radio" }));
199
+ var Switch = (props) => createComponent(ArkCheckable, mergeProps$1(props, { kind: "switch" }));
200
+ function ArkCheckable(props) {
201
+ const generated = createUniqueId();
202
+ const [local, rest] = splitProps(props, [
203
+ "checked",
204
+ "defaultChecked",
205
+ "onCheckedChange",
206
+ "label",
207
+ "class",
208
+ "inputClass",
209
+ "kind",
210
+ "id",
211
+ "onClick",
212
+ "onFocusIn",
213
+ "onFocusOut",
214
+ "style"
215
+ ]);
216
+ const options = () => ({
217
+ id: `dds-check-${generated}`,
218
+ ids: { hiddenInput: local.id ?? `dds-check-${generated}-input` },
219
+ checked: local.checked,
220
+ defaultChecked: local.defaultChecked,
221
+ onCheckedChange: (details) => local.onCheckedChange?.(details.checked === true),
222
+ disabled: rest.disabled,
223
+ required: rest.required,
224
+ readOnly: rest.readonly,
225
+ name: rest.name,
226
+ form: rest.form,
227
+ value: String(rest.value ?? "on")
228
+ });
229
+ const api = local.kind === "switch" ? useSwitch(options) : useCheckbox(options);
230
+ const inputClass = () => local.kind === "switch" ? "dds-switch__input" : "dds-check__input";
231
+ const rootProps = () => {
232
+ const [, attributes] = splitProps(api().getRootProps(), ["onClick"]);
233
+ return attributes;
234
+ };
235
+ return ssrElement("label", mergeProps$1(rootProps, { get ["class"]() {
236
+ return classes(local.kind === "switch" ? "dds-switch" : "dds-check", local.class);
237
+ } }), () => [ssrElement("input", mergeProps$1(() => api().getHiddenInputProps(), rest, {
238
+ type: "checkbox",
239
+ get role() {
240
+ return local.kind === "switch" ? "switch" : void 0;
241
+ },
242
+ get ["class"]() {
243
+ return classes(inputClass(), local.inputClass);
244
+ },
245
+ get style() {
246
+ return local.style ?? {};
247
+ },
248
+ get checked() {
249
+ return api().checked;
250
+ }
251
+ }), void 0, false), ssrElement("span", api().getLabelProps(), () => escape(local.label), false)], true);
252
+ }
253
+ //#endregion
254
+ //#region src/date-only.ts
255
+ function isCalendarDate(value) {
256
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
257
+ const year = Number(value.slice(0, 4)), month = Number(value.slice(5, 7)), day = Number(value.slice(8, 10));
258
+ if (year < 1 || month < 1 || month > 12 || day < 1) return false;
259
+ return day <= [
260
+ 31,
261
+ year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28,
262
+ 31,
263
+ 30,
264
+ 31,
265
+ 30,
266
+ 31,
267
+ 31,
268
+ 30,
269
+ 31,
270
+ 30,
271
+ 31
272
+ ][month - 1];
273
+ }
274
+ function isKorean(locale) {
275
+ return /^ko(?:-|$)/i.test(locale);
276
+ }
277
+ function displayDate(value, locale) {
278
+ return isKorean(locale) && isCalendarDate(value) ? value.replaceAll("-", "/") : value;
279
+ }
280
+ function canonicalInput(inputValue, locale) {
281
+ return isKorean(locale) && /^\d{4}\/\d{2}\/\d{2}$/.test(inputValue) ? inputValue.replaceAll("/", "-") : inputValue;
282
+ }
283
+ function validateInput(inputValue, required, min, max, locale = "en-US") {
284
+ const canonical = canonicalInput(inputValue, locale);
285
+ const incomplete = inputValue.length < 10 && (/^\d{0,4}(?:-\d{0,2}(?:-\d{0,2})?)?$/.test(inputValue) || isKorean(locale) && /^\d{0,4}(?:\/\d{0,2}(?:\/\d{0,2})?)?$/.test(inputValue));
286
+ let reason = "valid";
287
+ if (inputValue === "") reason = required ? "required" : "valid";
288
+ else if (!isCalendarDate(canonical)) reason = incomplete ? "incomplete" : "invalid";
289
+ else if (min && !isCalendarDate(min) || max && !isCalendarDate(max) || min && max && min > max) reason = "invalid";
290
+ else if (min && canonical < min) reason = "rangeUnderflow";
291
+ else if (max && canonical > max) reason = "rangeOverflow";
292
+ return {
293
+ inputValue,
294
+ value: reason === "valid" ? canonical : null,
295
+ valid: reason === "valid",
296
+ reason
297
+ };
298
+ }
299
+ function dateMessages(locale, messages = {}) {
300
+ const ko = isKorean(locale);
301
+ return {
302
+ previousMonth: ko ? "이전 달" : "Previous month",
303
+ nextMonth: ko ? "다음 달" : "Next month",
304
+ today: ko ? "오늘" : "Today",
305
+ clear: ko ? "선택 날짜 지우기" : "Clear selected date",
306
+ openCalendar: ko ? "달력 열기" : "Open calendar",
307
+ selectDate: (text) => ko ? `${text} 선택` : `Choose ${text}`,
308
+ required: ko ? "날짜를 입력해 주세요." : "Enter a date.",
309
+ invalid: ko ? "YYYY/MM/DD 형식의 유효한 범위 내 날짜를 입력해 주세요." : "Enter a valid date within the allowed range (YYYY-MM-DD).",
310
+ ...messages
311
+ };
312
+ }
313
+ /** Today is the sole timestamp boundary; stored dates remain Gregorian date-only strings. */
314
+ function todayDate(timeZone) {
315
+ const parts = new Intl.DateTimeFormat("en-US-u-ca-gregory-nu-latn", {
316
+ timeZone,
317
+ year: "numeric",
318
+ month: "2-digit",
319
+ day: "2-digit"
320
+ }).formatToParts(/* @__PURE__ */ new Date());
321
+ const part = (type) => parts.find((item) => item.type === type).value;
322
+ return `${part("year").padStart(4, "0")}-${part("month")}-${part("day")}`;
323
+ }
324
+ //#endregion
325
+ //#region src/calendar-view.tsx
326
+ var _tmpl$ = [
327
+ "<svg",
328
+ " width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><path",
329
+ "></path></svg>"
330
+ ];
331
+ var _tmpl$2 = [
332
+ "<div",
333
+ " class=\"dds-date-picker-footer\"><!--$-->",
334
+ "<!--/--><!--$-->",
335
+ "<!--/--></div>"
336
+ ];
337
+ function Chevron(props) {
338
+ return ssr(_tmpl$, ssrHydrationKey(), ssrAttribute("d", props.next ? "m9 5 7 7-7 7" : "m15 5-7 7 7 7", false));
339
+ }
340
+ /** Internal view: the caller owns the single Ark root and its selection. */
341
+ function CalendarView(props) {
342
+ const text = () => dateMessages(props.locale ?? "ko-KR", props.messages), locked = () => props.disabled || props.readOnly;
343
+ return createComponent(DatePicker.View, {
344
+ view: "day",
345
+ get children() {
346
+ return createComponent(DatePicker.Context, { children: (picker) => [
347
+ createComponent(DatePicker.ViewControl, {
348
+ "class": "dds-date-picker-header",
349
+ get children() {
350
+ return [
351
+ createComponent(DatePicker.PrevTrigger, {
352
+ "class": "dds-btn dds-btn--secondary",
353
+ get ["aria-label"]() {
354
+ return text().previousMonth;
355
+ },
356
+ get children() {
357
+ return createComponent(Chevron, {});
358
+ }
359
+ }),
360
+ createComponent(DatePicker.RangeText, {}),
361
+ createComponent(DatePicker.NextTrigger, {
362
+ "class": "dds-btn dds-btn--secondary",
363
+ get ["aria-label"]() {
364
+ return text().nextMonth;
365
+ },
366
+ get children() {
367
+ return createComponent(Chevron, { next: true });
368
+ }
369
+ })
370
+ ];
371
+ }
372
+ }),
373
+ createComponent(DatePicker.Table, {
374
+ "class": "dds-date-picker-table",
375
+ get children() {
376
+ return [createComponent(DatePicker.TableHead, { get children() {
377
+ return createComponent(DatePicker.TableRow, { get children() {
378
+ return createComponent(For, {
379
+ get each() {
380
+ return picker().weekDays;
381
+ },
382
+ children: (day) => createComponent(DatePicker.TableHeader, { get children() {
383
+ return day.short;
384
+ } })
385
+ });
386
+ } });
387
+ } }), createComponent(DatePicker.TableBody, { get children() {
388
+ return createComponent(For, {
389
+ get each() {
390
+ return picker().weeks;
391
+ },
392
+ children: (week) => createComponent(DatePicker.TableRow, { get children() {
393
+ return createComponent(For, {
394
+ each: week,
395
+ children: (day) => createComponent(DatePicker.TableCell, {
396
+ value: day,
397
+ get children() {
398
+ return createComponent(DatePicker.TableCellTrigger, { get children() {
399
+ return day.day;
400
+ } });
401
+ }
402
+ })
403
+ });
404
+ } })
405
+ });
406
+ } })];
407
+ }
408
+ }),
409
+ ssr(_tmpl$2, ssrHydrationKey(), escape(createComponent(Show, {
410
+ get when() {
411
+ return props.showToday !== false;
412
+ },
413
+ get children() {
414
+ return createComponent(Button, {
415
+ type: "button",
416
+ tone: "secondary",
417
+ get disabled() {
418
+ return locked() || !validateInput(todayDate(props.timeZone ?? "Asia/Seoul"), false, props.min, props.max, props.locale).valid;
419
+ },
420
+ onClick: () => {
421
+ if (!locked() && validateInput(todayDate(props.timeZone ?? "Asia/Seoul"), false, props.min, props.max, props.locale).valid) picker().selectToday();
422
+ },
423
+ get children() {
424
+ return text().today;
425
+ }
426
+ });
427
+ }
428
+ })), escape(createComponent(Show, {
429
+ get when() {
430
+ return props.showClear !== false;
431
+ },
432
+ get children() {
433
+ return createComponent(DatePicker.ClearTrigger, {
434
+ hidden: false,
435
+ "class": "dds-btn dds-btn--secondary",
436
+ get disabled() {
437
+ return locked();
438
+ },
439
+ onPointerDown: (event) => event.preventDefault(),
440
+ onClick: () => {
441
+ if (!locked()) props.onClear?.();
442
+ },
443
+ get children() {
444
+ return text().clear;
445
+ }
446
+ });
447
+ }
448
+ })))
449
+ ] });
450
+ }
451
+ });
452
+ }
453
+ //#endregion
454
+ export { isCalendarDate as a, Button as c, IconButton as d, Radio as f, createControllableSignal as h, displayDate as i, Checkbox as l, Switch as m, canonicalInput as n, isKorean as o, Select as p, dateMessages as r, validateInput as s, CalendarView as t, Field$1 as u };
455
+
456
+ //# sourceMappingURL=calendar-view-1RO2mtf1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-view-1RO2mtf1.js","names":["createUniqueId","splitProps","JSX","ParentProps","createControllableSignal","useCheckbox","useSwitch","Field","ArkField","classes","describedBy","ButtonTone","ControlSize","ButtonProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","class","tone","size","loading","Button","props","local","rest","_$ssrElement","_$mergeProps","type","undefined","disabled","aria-busy","_tmpl$","_$ssrHydrationKey","_$escape","children","IconButtonProps","Element","IconButton","FieldControlProps","id","FieldProps","label","helpText","error","required","generated","helpId","errorId","control","_$createComponent","Root","invalid","Boolean","ids","helperText","errorText","Label","for","_$ssr","_tmpl$2","HelperText","ErrorText","role","SelectProps","SelectHTMLAttributes","HTMLSelectElement","Select","_tmpl$3","_$ssrAttribute","aria-invalid","CheckableProps","InputHTMLAttributes","HTMLInputElement","checked","defaultChecked","onCheckedChange","inputClass","Checkable","setChecked","value","defaultValue","onChange","_tmpl$4","CheckboxProps","Checkbox","ArkCheckable","kind","RadioProps","Radio","SwitchProps","Switch","options","hiddenInput","details","readOnly","readonly","name","form","String","api","rootProps","attributes","getRootProps","getHiddenInputProps","style","getLabelProps","callInputHandler","handler","FocusEventHandlerUnion","FocusEvent","event","currentTarget","target","DatePicker","ArkDatePicker","For","Show","Button","dateMessages","todayDate","validateInput","CalendarMessages","Chevron","props","next","_$ssr","_tmpl$","_$ssrHydrationKey","_$ssrAttribute","CalendarViewProps","timeZone","min","max","locale","messages","disabled","readOnly","showToday","showClear","onClear","CalendarView","text","locked","_$createComponent","View","view","children","Context","picker","ViewControl","PrevTrigger","aria-label","previousMonth","RangeText","NextTrigger","nextMonth","Table","TableHead","TableRow","each","weekDays","day","TableHeader","short","TableBody","weeks","week","TableCell","value","TableCellTrigger","_tmpl$2","_$escape","when","type","tone","valid","onClick","selectToday","today","ClearTrigger","hidden","onPointerDown","event","preventDefault","clear"],"sources":["../../src/controllable.ts","../../src/controls.tsx","../../src/date-only.ts","../../src/calendar-view.tsx"],"sourcesContent":["import { createSignal, type Accessor } from \"solid-js\";\n\nexport interface ControllableOptions<T> {\n value: Accessor<T | undefined>;\n defaultValue: T;\n onChange: ((value: T) => void) | undefined;\n}\n\nexport type ControllableSetter<T> = (next: T | ((previous: T) => T)) => T;\n\nexport function createControllableSignal<T>(options: ControllableOptions<T>): [Accessor<T>, ControllableSetter<T>] {\n const [internal, setInternal] = createSignal(options.defaultValue);\n const value: Accessor<T> = () => options.value() ?? internal();\n const setInternalValue = setInternal as unknown as ControllableSetter<T>;\n const setValue: ControllableSetter<T> = (next) => {\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(value())\n : next;\n if (options.value() === undefined) setInternalValue(() => resolved);\n options.onChange?.(resolved);\n return resolved;\n };\n return [value, setValue];\n}\n","import {\n createUniqueId,\n splitProps,\n type JSX,\n type ParentProps,\n} from \"solid-js\";\n\nimport { createControllableSignal } from \"./controllable\";\nimport { useCheckbox } from \"@ark-ui/solid/checkbox\";\nimport { useSwitch } from \"@ark-ui/solid/switch\";\nimport { Field as ArkField } from \"@ark-ui/solid/field\";\nimport { classes, describedBy } from \"./utils\";\n\nexport type ButtonTone = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ControlSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"class\"> {\n class?: string;\n tone?: ButtonTone;\n size?: ControlSize;\n loading?: boolean;\n}\n\nexport function Button(props: ParentProps<ButtonProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"tone\", \"size\", \"loading\", \"disabled\", \"type\", \"children\"]);\n return (\n <button\n {...rest}\n type={local.type ?? \"button\"}\n class={classes(\"dds-btn\", `dds-btn--${local.tone ?? \"primary\"}`, local.size !== \"md\" && local.size ? `dds-btn--${local.size}` : undefined, local.class)}\n disabled={local.disabled || local.loading}\n aria-busy={local.loading ? \"true\" : undefined}\n >\n {local.loading && <span class=\"dds-spinner\" aria-hidden=\"true\" />}\n {local.children}\n </button>\n );\n}\n\nexport interface IconButtonProps extends Omit<ButtonProps, \"tone\" | \"children\"> {\n \"aria-label\": string;\n tone?: \"ghost\" | \"secondary\" | \"danger\";\n children: JSX.Element;\n}\n\nexport function IconButton(props: IconButtonProps) {\n const [local, rest] = splitProps(props, [\"class\", \"tone\", \"size\", \"loading\", \"disabled\", \"type\", \"children\"]);\n return (\n <button\n {...rest}\n type={local.type ?? \"button\"}\n class={classes(\"dds-iconbtn\", local.tone && local.tone !== \"ghost\" ? `dds-iconbtn--${local.tone}` : undefined, local.size !== \"md\" && local.size ? `dds-iconbtn--${local.size}` : undefined, local.class)}\n disabled={local.disabled || local.loading}\n aria-busy={local.loading ? \"true\" : undefined}\n >\n {local.loading ? <span class=\"dds-spinner\" aria-hidden=\"true\" /> : local.children}\n </button>\n );\n}\n\nexport interface FieldControlProps {\n id: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": \"true\" | undefined;\n \"aria-required\": \"true\" | undefined;\n}\n\nexport interface FieldProps {\n id?: string;\n label: JSX.Element;\n helpText?: JSX.Element;\n error?: JSX.Element;\n required?: boolean;\n class?: string;\n children: JSX.Element | ((props: FieldControlProps) => JSX.Element);\n}\n\nexport function Field(props: FieldProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-field-${generated}`;\n const helpId = () => props.helpText ? `${id()}-help` : undefined;\n const errorId = () => props.error ? `${id()}-error` : undefined;\n const control = (): FieldControlProps => ({\n id: id(),\n \"aria-describedby\": describedBy(helpId(), errorId()),\n \"aria-invalid\": props.error ? \"true\" : undefined,\n \"aria-required\": props.required ? \"true\" : undefined,\n });\n return (\n <ArkField.Root id={id()} required={props.required ?? false} invalid={Boolean(props.error)} ids={{ control: `${id()}-root`, helperText: `${id()}-help`, errorText: `${id()}-error` }} class={classes(\"dds-field\", props.error ? \"dds-field--error\" : undefined, props.class)}>\n <ArkField.Label class=\"dds-field__label\" for={id()}>{props.label}{props.required && <span aria-hidden=\"true\"> *</span>}</ArkField.Label>\n {typeof props.children === \"function\" ? props.children(control()) : props.children}\n {props.helpText && <ArkField.HelperText class=\"dds-field__help\">{props.helpText}</ArkField.HelperText>}\n {props.error && <ArkField.ErrorText class=\"dds-field__error\" role=\"alert\">{props.error}</ArkField.ErrorText>}\n </ArkField.Root>\n );\n}\n\nexport interface SelectProps extends Omit<JSX.SelectHTMLAttributes<HTMLSelectElement>, \"class\"> {\n class?: string;\n invalid?: boolean;\n}\n\nexport function Select(props: ParentProps<SelectProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"invalid\", \"children\"]);\n return (\n <span class={classes(\"dds-select\", local.class)}>\n <select {...rest} class=\"dds-select__input\" aria-invalid={local.invalid ? \"true\" : undefined}>\n {local.children}\n </select>\n </span>\n );\n}\n\ninterface CheckableProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, \"checked\" | \"class\" | \"onChange\" | \"role\" | \"type\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n label: JSX.Element;\n class?: string;\n inputClass?: string;\n}\n\nfunction Checkable(props: CheckableProps & { type: \"checkbox\" | \"radio\"; role?: \"switch\" }) {\n const [local, rest] = splitProps(props, [\"checked\", \"defaultChecked\", \"onCheckedChange\", \"label\", \"class\", \"inputClass\", \"type\", \"role\"]);\n const [checked, setChecked] = createControllableSignal({\n value: () => local.checked,\n defaultValue: local.defaultChecked ?? false,\n onChange: local.onCheckedChange,\n });\n return (\n <label class={classes(local.role === \"switch\" ? \"dds-switch\" : \"dds-check\", local.class)}>\n <input\n {...rest}\n type={local.type}\n role={local.role}\n class={classes(local.role === \"switch\" ? \"dds-switch__input\" : \"dds-check__input\", local.inputClass)}\n checked={checked()}\n onChange={(event) => setChecked(event.currentTarget.checked)}\n />\n <span>{local.label}</span>\n </label>\n );\n}\n\nexport type CheckboxProps = CheckableProps;\nexport const Checkbox = (props: CheckboxProps) => <ArkCheckable {...props} kind=\"checkbox\" />;\n\nexport type RadioProps = CheckableProps;\nexport const Radio = (props: RadioProps) => <Checkable {...props} type=\"radio\" />;\n\nexport type SwitchProps = CheckableProps;\nexport const Switch = (props: SwitchProps) => <ArkCheckable {...props} kind=\"switch\" />;\n\nfunction ArkCheckable(props: CheckableProps & { kind: \"checkbox\" | \"switch\" }) {\n const generated = createUniqueId();\n const [local, rest] = splitProps(props, [\"checked\", \"defaultChecked\", \"onCheckedChange\", \"label\", \"class\", \"inputClass\", \"kind\", \"id\", \"onClick\", \"onFocusIn\", \"onFocusOut\", \"style\"]);\n const options = () => ({\n id: `dds-check-${generated}`,\n ids: { hiddenInput: local.id ?? `dds-check-${generated}-input` },\n checked: local.checked, defaultChecked: local.defaultChecked,\n onCheckedChange: (details: { checked: boolean | \"indeterminate\" }) => local.onCheckedChange?.(details.checked === true),\n disabled: rest.disabled, required: rest.required, readOnly: rest.readonly,\n name: rest.name, form: rest.form, value: String(rest.value ?? \"on\"),\n });\n const api = local.kind === \"switch\" ? useSwitch(options) : useCheckbox(options);\n const inputClass = () => local.kind === \"switch\" ? \"dds-switch__input\" : \"dds-check__input\";\n const rootProps = () => {\n const [, attributes] = splitProps(api().getRootProps(), [\"onClick\"]);\n return attributes;\n };\n return <label {...rootProps()} class={classes(local.kind === \"switch\" ? \"dds-switch\" : \"dds-check\", local.class)}>\n <input {...api().getHiddenInputProps()} {...rest}\n ref={(input) => {\n // Ark normalizes defaultChecked to checked. Preserve the native reset\n // baseline as well when rendering its input visibly with DDS CSS.\n input.defaultChecked = local.checked ?? local.defaultChecked ?? false;\n if (typeof rest.ref === \"function\") rest.ref(input);\n }}\n type=\"checkbox\" role={local.kind === \"switch\" ? \"switch\" : undefined}\n class={classes(inputClass(), local.inputClass)}\n style={local.style ?? {}} checked={api().checked}\n onFocusIn={(event) => {\n callInputHandler(api().getHiddenInputProps().onFocusIn, event);\n callInputHandler(local.onFocusIn, event);\n }}\n onFocusOut={(event) => {\n callInputHandler(api().getHiddenInputProps().onFocusOut, event);\n callInputHandler(local.onFocusOut, event);\n }}\n onClick={(event) => {\n if (typeof local.onClick === \"function\") local.onClick(event);\n else if (local.onClick) local.onClick[0](local.onClick[1], event);\n if (!event.defaultPrevented) {\n const handler = api().getHiddenInputProps().onClick;\n if (typeof handler === \"function\") handler(event);\n else if (handler) handler[0](handler[1], event);\n }\n }}\n />\n <span {...api().getLabelProps()}>{local.label}</span>\n </label>;\n}\n\nfunction callInputHandler(handler: JSX.FocusEventHandlerUnion<HTMLInputElement, FocusEvent> | undefined, event: FocusEvent & { currentTarget: HTMLInputElement; target: HTMLInputElement }) {\n if (typeof handler === \"function\") handler(event);\n else if (handler) handler[0](handler[1], event);\n}\n","export interface DatePickerValidity {\n /** Exact displayed draft; never persist this display text as an API date. */\n inputValue: string;\n /** Valid ISO date, optional empty string, or null when invalid/incomplete. */\n value: string | null;\n valid: boolean;\n reason:\n | \"valid\"\n | \"required\"\n | \"incomplete\"\n | \"invalid\"\n | \"rangeUnderflow\"\n | \"rangeOverflow\";\n}\n// Date-only Gregorian validation: never let a permissive parser repair user text.\nexport function isCalendarDate(value: string) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const year = Number(value.slice(0, 4)),\n month = Number(value.slice(5, 7)),\n day = Number(value.slice(8, 10));\n if (year < 1 || month < 1 || month > 12 || day < 1) return false;\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return (\n day <=\n [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]!\n );\n}\nexport function isKorean(locale: string) {\n return /^ko(?:-|$)/i.test(locale);\n}\nexport function displayDate(value: string, locale: string) {\n return isKorean(locale) && isCalendarDate(value)\n ? value.replaceAll(\"-\", \"/\")\n : value;\n}\nexport function canonicalInput(inputValue: string, locale: string) {\n return isKorean(locale) && /^\\d{4}\\/\\d{2}\\/\\d{2}$/.test(inputValue)\n ? inputValue.replaceAll(\"/\", \"-\")\n : inputValue;\n}\nexport function validateInput(\n inputValue: string,\n required: boolean,\n min?: string,\n max?: string,\n locale = \"en-US\",\n): DatePickerValidity {\n const canonical = canonicalInput(inputValue, locale);\n const incomplete =\n inputValue.length < 10 &&\n (/^\\d{0,4}(?:-\\d{0,2}(?:-\\d{0,2})?)?$/.test(inputValue) ||\n (isKorean(locale) &&\n /^\\d{0,4}(?:\\/\\d{0,2}(?:\\/\\d{0,2})?)?$/.test(inputValue)));\n let reason: DatePickerValidity[\"reason\"] = \"valid\";\n if (inputValue === \"\") reason = required ? \"required\" : \"valid\";\n else if (!isCalendarDate(canonical))\n reason = incomplete ? \"incomplete\" : \"invalid\";\n else if (\n (min && !isCalendarDate(min)) ||\n (max && !isCalendarDate(max)) ||\n (min && max && min > max)\n )\n reason = \"invalid\";\n else if (min && canonical < min) reason = \"rangeUnderflow\";\n else if (max && canonical > max) reason = \"rangeOverflow\";\n return {\n inputValue,\n value: reason === \"valid\" ? canonical : null,\n valid: reason === \"valid\",\n reason,\n };\n}\n\nexport interface CalendarMessages {\n previousMonth?: string;\n nextMonth?: string;\n today?: string;\n clear?: string;\n openCalendar?: string;\n selectDate?: (dateText: string) => string;\n required?: string;\n invalid?: string;\n}\nexport function dateMessages(locale: string, messages: CalendarMessages = {}) {\n const ko = isKorean(locale);\n return {\n previousMonth: ko ? \"이전 달\" : \"Previous month\",\n nextMonth: ko ? \"다음 달\" : \"Next month\",\n today: ko ? \"오늘\" : \"Today\",\n clear: ko ? \"선택 날짜 지우기\" : \"Clear selected date\",\n openCalendar: ko ? \"달력 열기\" : \"Open calendar\",\n selectDate: (text: string) => (ko ? `${text} 선택` : `Choose ${text}`),\n required: ko ? \"날짜를 입력해 주세요.\" : \"Enter a date.\",\n invalid: ko\n ? \"YYYY/MM/DD 형식의 유효한 범위 내 날짜를 입력해 주세요.\"\n : \"Enter a valid date within the allowed range (YYYY-MM-DD).\",\n ...messages,\n };\n}\n\n/** Today is the sole timestamp boundary; stored dates remain Gregorian date-only strings. */\nexport function todayDate(timeZone: string) {\n const parts = new Intl.DateTimeFormat(\"en-US-u-ca-gregory-nu-latn\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).formatToParts(new Date());\n const part = (type: string) =>\n parts.find((item) => item.type === type)!.value;\n return `${part(\"year\").padStart(4, \"0\")}-${part(\"month\")}-${part(\"day\")}`;\n}\n","import { DatePicker as ArkDatePicker } from \"@ark-ui/solid/date-picker\";\nimport { For, Show } from \"solid-js\";\nimport { Button } from \"./controls\";\nimport {\n dateMessages,\n todayDate,\n validateInput,\n type CalendarMessages,\n} from \"./date-only\";\nfunction Chevron(props: { next?: boolean }) {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path d={props.next ? \"m9 5 7 7-7 7\" : \"m15 5-7 7 7 7\"} />\n </svg>\n );\n}\nexport interface CalendarViewProps {\n timeZone?: string | undefined;\n min?: string | undefined;\n max?: string | undefined;\n locale?: string | undefined;\n messages?: CalendarMessages | undefined;\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n showToday?: boolean | undefined;\n showClear?: boolean | undefined;\n onClear?: (() => void) | undefined;\n}\n/** Internal view: the caller owns the single Ark root and its selection. */\nexport function CalendarView(props: CalendarViewProps) {\n const text = () => dateMessages(props.locale ?? \"ko-KR\", props.messages),\n locked = () => props.disabled || props.readOnly;\n return (\n <ArkDatePicker.View view=\"day\">\n <ArkDatePicker.Context>\n {(picker) => (\n <>\n <ArkDatePicker.ViewControl class=\"dds-date-picker-header\">\n <ArkDatePicker.PrevTrigger\n class=\"dds-btn dds-btn--secondary\"\n aria-label={text().previousMonth}\n >\n <Chevron />\n </ArkDatePicker.PrevTrigger>\n <ArkDatePicker.RangeText />\n <ArkDatePicker.NextTrigger\n class=\"dds-btn dds-btn--secondary\"\n aria-label={text().nextMonth}\n >\n <Chevron next />\n </ArkDatePicker.NextTrigger>\n </ArkDatePicker.ViewControl>\n <ArkDatePicker.Table class=\"dds-date-picker-table\">\n <ArkDatePicker.TableHead>\n <ArkDatePicker.TableRow>\n <For each={picker().weekDays}>\n {(day) => (\n <ArkDatePicker.TableHeader>\n {day.short}\n </ArkDatePicker.TableHeader>\n )}\n </For>\n </ArkDatePicker.TableRow>\n </ArkDatePicker.TableHead>\n <ArkDatePicker.TableBody>\n <For each={picker().weeks}>\n {(week) => (\n <ArkDatePicker.TableRow>\n <For each={week}>\n {(day) => (\n <ArkDatePicker.TableCell value={day}>\n <ArkDatePicker.TableCellTrigger>\n {day.day}\n </ArkDatePicker.TableCellTrigger>\n </ArkDatePicker.TableCell>\n )}\n </For>\n </ArkDatePicker.TableRow>\n )}\n </For>\n </ArkDatePicker.TableBody>\n </ArkDatePicker.Table>\n <div class=\"dds-date-picker-footer\">\n <Show when={props.showToday !== false}>\n <Button\n type=\"button\"\n tone=\"secondary\"\n disabled={\n locked() ||\n !validateInput(\n todayDate(props.timeZone ?? \"Asia/Seoul\"),\n false,\n props.min,\n props.max,\n props.locale,\n ).valid\n }\n onClick={() => {\n if (\n !locked() &&\n validateInput(\n todayDate(props.timeZone ?? \"Asia/Seoul\"),\n false,\n props.min,\n props.max,\n props.locale,\n ).valid\n )\n picker().selectToday();\n }}\n >\n {text().today}\n </Button>\n </Show>\n <Show when={props.showClear !== false}>\n <ArkDatePicker.ClearTrigger\n hidden={false}\n class=\"dds-btn dds-btn--secondary\"\n disabled={locked()}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n if (!locked()) props.onClear?.();\n }}\n >\n {text().clear}\n </ArkDatePicker.ClearTrigger>\n </Show>\n </div>\n </>\n )}\n </ArkDatePicker.Context>\n </ArkDatePicker.View>\n );\n}\n"],"mappings":"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"}