@devslab/dds-solid 0.21.2 → 0.22.1

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
@@ -0,0 +1,443 @@
1
+ import { For, Show, createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, untrack } from "solid-js";
2
+ import { Portal, createComponent, escape, memo, mergeProps as mergeProps$1, ssr, ssrAttribute, ssrHydrationKey, ssrStyle, ssrStyleProperty } from "solid-js/web";
3
+ import { Combobox, createListCollection } from "@ark-ui/solid/combobox";
4
+ import { Select } from "@ark-ui/solid/select";
5
+ import { createVirtualizer, defaultRangeExtractor } from "@tanstack/solid-virtual";
6
+ //#region src/choice-types.ts
7
+ function validateOptions(items) {
8
+ const ids = /* @__PURE__ */ new Set();
9
+ for (const item of items) {
10
+ if (!item.value || ids.has(item.value)) throw new Error(`DDS choice: option IDs must be nonempty and unique (${JSON.stringify(item.value)})`);
11
+ ids.add(item.value);
12
+ }
13
+ }
14
+ var choiceMessages = {
15
+ open: "선택 열기",
16
+ clear: "선택 지우기",
17
+ loading: "불러오는 중",
18
+ empty: "결과 없음",
19
+ error: "불러오지 못했습니다",
20
+ retry: "다시 시도"
21
+ };
22
+ /** Read the consumer environment at runtime, rather than the library build mode. */
23
+ function choiceWarningsEnabled() {
24
+ return globalThis.process?.env?.NODE_ENV !== "production";
25
+ }
26
+ //#endregion
27
+ //#region src/internal/choice.tsx
28
+ var _tmpl$ = [
29
+ "<button",
30
+ " class=\"dds-choice-clear\" type=\"button\"",
31
+ ">×</button>"
32
+ ];
33
+ var _tmpl$2 = [
34
+ "<input",
35
+ " class=\"dds-choice-validation\" style=\"",
36
+ "\" tabindex=\"-1\" aria-hidden=\"true\"",
37
+ "",
38
+ "",
39
+ ">"
40
+ ];
41
+ var _tmpl$3 = [
42
+ "<button",
43
+ " class=\"dds-choice-retry\" type=\"button\">",
44
+ "</button>"
45
+ ];
46
+ var _tmpl$4 = [
47
+ "<div",
48
+ " class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\"><!--$-->",
49
+ "<!--/--><!--$-->",
50
+ "<!--/--></div>"
51
+ ];
52
+ var _tmpl$5 = [
53
+ "<span",
54
+ " class=\"dds-choice-value\">",
55
+ "</span>"
56
+ ];
57
+ var _tmpl$6 = [
58
+ "<div",
59
+ " style=\"",
60
+ "\">",
61
+ "</div>"
62
+ ];
63
+ var _tmpl$7 = [
64
+ "<span",
65
+ " class=\"dds-choice-description\">",
66
+ "</span>"
67
+ ];
68
+ function Choice(props) {
69
+ const id = createUniqueId();
70
+ const [internal, setInternal] = createSignal(props.defaultValue ?? "");
71
+ const value = () => props.value ?? internal();
72
+ const label = createMemo(() => props.items.find((item) => item.value === value())?.label ?? (props.selectedOption?.value === value() ? props.selectedOption.label : value()));
73
+ const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());
74
+ const inputValue = () => props.inputValue ?? draft();
75
+ const [open, setOpen] = createSignal(false), [highlight, setHighlight] = createSignal(null);
76
+ let visible;
77
+ const [scroll, setScroll] = createSignal(null);
78
+ const [portalMount, setPortalMount] = createSignal();
79
+ onMount(() => {});
80
+ let composing = false;
81
+ let pendingRestore = null;
82
+ const resolveLabel = (id) => props.items.find((item) => item.value === id)?.label ?? (props.selectedOption?.value === id ? props.selectedOption.label : id);
83
+ const blocked = () => props.disabled || props.readOnly;
84
+ const messages = () => ({
85
+ ...choiceMessages,
86
+ ...props.messages
87
+ });
88
+ const setInput = (next) => {
89
+ if (pendingRestore?.from === inputValue() && pendingRestore.to === next) return;
90
+ pendingRestore = null;
91
+ if (props.inputValue === void 0) setDraft(next);
92
+ props.onInputValueChange?.(next);
93
+ };
94
+ const restoreInput = (next) => {
95
+ const current = inputValue();
96
+ if (next === current) return;
97
+ if (pendingRestore?.from === current && pendingRestore.to === next) return;
98
+ pendingRestore = {
99
+ from: current,
100
+ to: next
101
+ };
102
+ if (props.inputValue === void 0) setDraft(next);
103
+ else props.onInputValueChange?.(next);
104
+ };
105
+ const setValue = (next) => {
106
+ if (props.value === void 0) setInternal(next);
107
+ props.onValueChange?.(next);
108
+ };
109
+ createEffect(() => {
110
+ validateOptions(props.items);
111
+ });
112
+ createEffect(() => {
113
+ if (choiceWarningsEnabled() && value() && !props.items.some((item) => item.value === value()) && props.selectedOption?.value !== value()) console.warn(`DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`);
114
+ });
115
+ let previousSelection = {
116
+ value: value(),
117
+ label: label()
118
+ };
119
+ createEffect(() => {
120
+ const current = {
121
+ value: value(),
122
+ label: label()
123
+ };
124
+ if (previousSelection.value !== current.value || previousSelection.label !== current.label) {
125
+ previousSelection = current;
126
+ untrack(() => restoreInput(current.label));
127
+ }
128
+ });
129
+ createEffect(() => {
130
+ const form = props.form ? void 0 : void 0;
131
+ if (!form) return;
132
+ const reset = (event) => queueMicrotask(() => {
133
+ if (event.defaultPrevented) return;
134
+ const resetValue = props.value ?? props.defaultValue ?? "";
135
+ const resetLabel = resolveLabel(resetValue);
136
+ previousSelection = {
137
+ value: resetValue,
138
+ label: resetLabel
139
+ };
140
+ if (props.value === void 0) setInternal(resetValue);
141
+ restoreInput(props.defaultInputValue ?? resetLabel);
142
+ setOpen(false);
143
+ if (visible instanceof HTMLInputElement) visible.value = inputValue();
144
+ });
145
+ form.addEventListener("reset", reset);
146
+ onCleanup(() => form.removeEventListener("reset", reset));
147
+ });
148
+ const items = createMemo(() => props.searchable && props.filterMode !== "external" && inputValue() !== label() ? props.items.filter((item) => item.label.toLocaleLowerCase().includes(inputValue().toLocaleLowerCase())) : props.items);
149
+ const collection = createMemo(() => createListCollection({
150
+ items: items(),
151
+ itemToString: (item) => item.label,
152
+ itemToValue: (item) => item.value,
153
+ isItemDisabled: (item) => !!item.disabled
154
+ }));
155
+ const virtual = () => !!props.virtualization;
156
+ const height = () => {
157
+ const configured = props.virtualization ? props.virtualization.itemHeight : void 0;
158
+ return Number.isFinite(configured) ? Math.max(40, configured) : 40;
159
+ };
160
+ const activeIndex = () => items().findIndex((item) => item.value === highlight());
161
+ const virtualizer = createVirtualizer({
162
+ get count() {
163
+ return items().length;
164
+ },
165
+ getScrollElement: scroll,
166
+ estimateSize: height,
167
+ get overscan() {
168
+ return props.virtualization ? props.virtualization.overscan ?? 5 : 5;
169
+ },
170
+ get enabled() {
171
+ return virtual() && open();
172
+ },
173
+ initialRect: {
174
+ width: 0,
175
+ height: 320
176
+ },
177
+ get rangeExtractor() {
178
+ const active = activeIndex();
179
+ return (range) => {
180
+ const indexes = defaultRangeExtractor(range);
181
+ if (active >= 0 && !indexes.includes(active)) indexes.push(active);
182
+ return indexes.sort((a, b) => a - b);
183
+ };
184
+ }
185
+ });
186
+ createEffect(() => {
187
+ items();
188
+ const opened = open();
189
+ setHighlight(null);
190
+ if (virtual() && opened) virtualizer.scrollToIndex(Math.max(0, items().findIndex((item) => item.value === value())), { align: "auto" });
191
+ });
192
+ const Parts = props.searchable ? Combobox : Select;
193
+ const rows = createMemo(() => {
194
+ const result = virtual() ? virtualizer.getVirtualItems().map((row) => ({
195
+ index: row.index,
196
+ start: row.start
197
+ })) : items().map((_, index) => ({
198
+ index,
199
+ start: 0
200
+ }));
201
+ const active = activeIndex();
202
+ if (virtual() && active >= 0 && !result.some((row) => row.index === active)) result.push({
203
+ index: active,
204
+ start: active * height()
205
+ });
206
+ return result;
207
+ });
208
+ const status = () => props.loading ? messages().loading : props.error ? typeof props.error === "string" ? props.error : messages().error : items().length === 0 ? messages().empty : "";
209
+ const rootProps = {
210
+ get collection() {
211
+ return collection();
212
+ },
213
+ get value() {
214
+ return value() ? [value()] : [];
215
+ },
216
+ get open() {
217
+ return open() && !blocked();
218
+ },
219
+ get disabled() {
220
+ return props.disabled;
221
+ },
222
+ get readOnly() {
223
+ return props.readOnly;
224
+ },
225
+ onOpenChange: (details) => {
226
+ if (!blocked()) setOpen(details.open);
227
+ },
228
+ onValueChange: (details) => {
229
+ if (blocked() || composing) return;
230
+ const next = details.value[0] ?? "";
231
+ if (next !== value()) setValue(next);
232
+ },
233
+ onHighlightChange: (details) => setHighlight(details.highlightedValue),
234
+ get scrollToIndexFn() {
235
+ return virtual() ? ({ index }) => virtualizer.scrollToIndex(index, { align: "auto" }) : void 0;
236
+ },
237
+ get positioning() {
238
+ return {
239
+ placement: "bottom-start",
240
+ sameWidth: true,
241
+ gutter: 4,
242
+ strategy: portalMount()?.matches("[role=\"dialog\"], [role=\"alertdialog\"]") ? "fixed" : "absolute",
243
+ hideWhenDetached: !!portalMount()?.matches("[role=\"dialog\"], [role=\"alertdialog\"]")
244
+ };
245
+ }
246
+ };
247
+ const inputProps = props.searchable ? {
248
+ get inputValue() {
249
+ return inputValue();
250
+ },
251
+ onInputValueChange: (details) => {
252
+ if (!blocked() && details.inputValue !== inputValue()) setInput(details.inputValue);
253
+ },
254
+ selectionBehavior: "preserve"
255
+ } : {};
256
+ return createComponent(Parts.Root, mergeProps$1(rootProps, inputProps, {
257
+ get id() {
258
+ return props.id ?? id;
259
+ },
260
+ "class": "dds-choice",
261
+ get ["data-label-placement"]() {
262
+ return props.labelPlacement ?? "outside";
263
+ },
264
+ get ["data-has-value"]() {
265
+ return value() || inputValue() ? "" : void 0;
266
+ },
267
+ get children() {
268
+ return [
269
+ createComponent(Show, {
270
+ get when() {
271
+ return props.label;
272
+ },
273
+ get children() {
274
+ return createComponent(Parts.Label, {
275
+ "class": "dds-choice-label",
276
+ onClick: () => void 0,
277
+ get children() {
278
+ return props.label;
279
+ }
280
+ });
281
+ }
282
+ }),
283
+ createComponent(Parts.Control, {
284
+ "class": "dds-choice-control",
285
+ get children() {
286
+ return [
287
+ createComponent(Show, {
288
+ get when() {
289
+ return props.searchable;
290
+ },
291
+ get children() {
292
+ return createComponent(Combobox.Input, {
293
+ "class": "dds-choice-input",
294
+ get ["aria-label"]() {
295
+ return props["aria-label"];
296
+ },
297
+ get ["aria-labelledby"]() {
298
+ return props["aria-labelledby"];
299
+ },
300
+ get ["aria-describedby"]() {
301
+ return props["aria-describedby"];
302
+ },
303
+ get ["aria-required"]() {
304
+ return props.required;
305
+ },
306
+ get placeholder() {
307
+ return props.placeholder;
308
+ },
309
+ onCompositionStart: () => {
310
+ composing = true;
311
+ },
312
+ onCompositionEnd: () => {
313
+ composing = false;
314
+ },
315
+ onKeyDown: (event) => {
316
+ if (composing && event.key === "Enter") {
317
+ event.preventDefault();
318
+ event.stopPropagation();
319
+ }
320
+ },
321
+ onBlur: () => {
322
+ if (value()) restoreInput(label());
323
+ }
324
+ });
325
+ }
326
+ }),
327
+ createComponent(Parts.Trigger, {
328
+ "class": "dds-choice-trigger",
329
+ get ["aria-label"]() {
330
+ return memo(() => !!props.searchable)() ? messages().open : props["aria-label"];
331
+ },
332
+ get ["aria-labelledby"]() {
333
+ return props["aria-labelledby"];
334
+ },
335
+ get ["aria-describedby"]() {
336
+ return props["aria-describedby"];
337
+ },
338
+ get ["aria-required"]() {
339
+ return props.required;
340
+ },
341
+ get children() {
342
+ return props.searchable ? "⌄" : ssr(_tmpl$5, ssrHydrationKey(), escape(label() || props.placeholder || messages().open));
343
+ }
344
+ }),
345
+ createComponent(Show, {
346
+ get when() {
347
+ return memo(() => !!(props.clearable && !blocked()))() && (value() || inputValue());
348
+ },
349
+ get children() {
350
+ return ssr(_tmpl$, ssrHydrationKey(), ssrAttribute("aria-label", escape(messages().clear, true), false));
351
+ }
352
+ })
353
+ ];
354
+ }
355
+ }),
356
+ ssr(_tmpl$2, ssrHydrationKey(), ssrStyleProperty("position:", "absolute") + ssrStyleProperty(";width:", "1px") + ssrStyleProperty(";height:", "1px") + ssrStyleProperty(";padding:", "0") + ssrStyleProperty(";border:", "0") + ssrStyleProperty(";clip-path:", "inset(50%)") + ssrStyleProperty(";overflow:", "hidden") + ssrStyleProperty(";white-space:", "nowrap"), ssrAttribute("name", escape(props.name, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("value", escape(value(), true), false), ssrAttribute("required", props.required, true), ssrAttribute("disabled", props.disabled, true)),
357
+ ssr(_tmpl$4, ssrHydrationKey(), escape(status()), escape(createComponent(Show, {
358
+ get when() {
359
+ return memo(() => !!props.error)() && props.onRetry;
360
+ },
361
+ get children() {
362
+ return ssr(_tmpl$3, ssrHydrationKey(), escape(messages().retry));
363
+ }
364
+ }))),
365
+ createComponent(Show, {
366
+ get when() {
367
+ return portalMount();
368
+ },
369
+ children: (mount) => createComponent(Portal, {
370
+ get mount() {
371
+ return mount();
372
+ },
373
+ get children() {
374
+ return createComponent(Parts.Positioner, {
375
+ "class": "dds-choice-positioner",
376
+ get children() {
377
+ return createComponent(Parts.Content, {
378
+ "class": "dds-choice-content",
379
+ style: {
380
+ "max-height": "min(320px, var(--available-height, 320px))",
381
+ overflow: "auto"
382
+ },
383
+ get children() {
384
+ return ssr(_tmpl$6, ssrHydrationKey(), ssrStyle(virtual() ? {
385
+ height: `${virtualizer.getTotalSize()}px`,
386
+ position: "relative"
387
+ } : void 0), escape(createComponent(For, {
388
+ get each() {
389
+ return rows();
390
+ },
391
+ children: (row) => {
392
+ const item = () => items()[row.index];
393
+ return createComponent(Parts.Item, {
394
+ get item() {
395
+ return item();
396
+ },
397
+ "class": "dds-choice-item",
398
+ get ["aria-posinset"]() {
399
+ return row.index + 1;
400
+ },
401
+ get ["aria-setsize"]() {
402
+ return items().length;
403
+ },
404
+ get style() {
405
+ return memo(() => !!virtual())() ? {
406
+ position: "absolute",
407
+ top: "0",
408
+ left: "0",
409
+ width: "100%",
410
+ height: `${height()}px`,
411
+ transform: `translateY(${row.start}px)`
412
+ } : void 0;
413
+ },
414
+ get children() {
415
+ return [createComponent(Parts.ItemText, { get children() {
416
+ return item().label;
417
+ } }), createComponent(Show, {
418
+ get when() {
419
+ return item().description;
420
+ },
421
+ get children() {
422
+ return ssr(_tmpl$7, ssrHydrationKey(), escape(item().description));
423
+ }
424
+ })];
425
+ }
426
+ });
427
+ }
428
+ })));
429
+ }
430
+ });
431
+ }
432
+ });
433
+ }
434
+ })
435
+ })
436
+ ];
437
+ }
438
+ }));
439
+ }
440
+ //#endregion
441
+ export { Choice as t };
442
+
443
+ //# sourceMappingURL=choice-DoXiK8nc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-DoXiK8nc.js","names":["Combobox","C","createListCollection","Select","S","Portal","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","untrack","createVirtualizer","defaultRangeExtractor","Range","choiceMessages","choiceWarningsEnabled","validateOptions","ComboboxProps","Choice","props","searchable","id","internal","setInternal","defaultValue","value","label","items","find","item","selectedOption","draft","setDraft","defaultInputValue","inputValue","open","setOpen","highlight","setHighlight","visible","HTMLInputElement","HTMLButtonElement","validation","scroll","setScroll","HTMLDivElement","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","composing","pendingRestore","from","to","resolveLabel","blocked","disabled","readOnly","messages","setInput","next","undefined","onInputValueChange","restoreInput","current","setValue","onValueChange","some","console","warn","JSON","stringify","previousSelection","associatedForm","form","getElementById","HTMLFormElement","reset","event","Event","queueMicrotask","defaultPrevented","resetValue","resetLabel","addEventListener","removeEventListener","filterMode","filter","toLocaleLowerCase","includes","collection","itemToString","itemToValue","isItemDisabled","virtual","virtualization","height","configured","itemHeight","Number","isFinite","Math","max","activeIndex","findIndex","virtualizer","count","length","getScrollElement","estimateSize","overscan","enabled","initialRect","width","rangeExtractor","active","range","indexes","push","sort","a","b","opened","scrollToIndex","align","Parts","rows","result","getVirtualItems","map","row","index","start","_","status","loading","error","empty","rootProps","onOpenChange","details","onHighlightChange","highlightedValue","scrollToIndexFn","positioning","placement","const","sameWidth","gutter","strategy","matches","hideWhenDetached","inputProps","selectionBehavior","_$createComponent","Root","_$mergeProps","data-label-placement","labelPlacement","data-has-value","children","when","Label","onClick","focus","Control","Input","aria-label","aria-labelledby","aria-describedby","aria-required","required","placeholder","onCompositionStart","onCompositionEnd","onKeyDown","key","preventDefault","stopPropagation","onBlur","Trigger","_$memo","_$ssr","_tmpl$5","_$ssrHydrationKey","_$escape","clearable","_tmpl$","_$ssrAttribute","clear","_tmpl$2","_$ssrStyleProperty","name","_tmpl$4","onRetry","_tmpl$3","retry","mount","Positioner","Content","style","overflow","_tmpl$6","_$ssrStyle","getTotalSize","position","each","Item","aria-posinset","aria-setsize","top","left","transform","ItemText","description","_tmpl$7"],"sources":["../../src/choice-types.ts","../../src/internal/choice.tsx"],"sourcesContent":["export interface ChoiceOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\nexport interface ChoiceMessages {\n open?: string;\n clear?: string;\n loading?: string;\n empty?: string;\n error?: string;\n retry?: string;\n}\nexport type ChoiceVirtualization =\n | false\n | { itemHeight?: number; overscan?: number };\nexport interface ChoiceProps {\n items: ChoiceOption[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectedOption?: ChoiceOption;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n form?: string;\n id?: string;\n label?: string;\n labelPlacement?: \"outside\" | \"inside\" | \"hidden\";\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n placeholder?: string;\n clearable?: boolean;\n messages?: ChoiceMessages;\n virtualization?: ChoiceVirtualization;\n}\nexport interface ComboboxProps extends ChoiceProps {\n inputValue?: string;\n defaultInputValue?: string;\n onInputValueChange?: (value: string) => void;\n filterMode?: \"local\" | \"external\";\n loading?: boolean;\n error?: string | boolean;\n onRetry?: () => void;\n}\nexport interface SelectPickerProps extends ChoiceProps {}\n\nexport function validateOptions(items: ChoiceOption[]) {\n const ids = new Set<string>();\n for (const item of items) {\n if (!item.value || ids.has(item.value))\n throw new Error(\n `DDS choice: option IDs must be nonempty and unique (${JSON.stringify(item.value)})`,\n );\n ids.add(item.value);\n }\n}\nexport const choiceMessages: Required<ChoiceMessages> = {\n open: \"선택 열기\",\n clear: \"선택 지우기\",\n loading: \"불러오는 중\",\n empty: \"결과 없음\",\n error: \"불러오지 못했습니다\",\n retry: \"다시 시도\",\n};\n\n/** Read the consumer environment at runtime, rather than the library build mode. */\nexport function choiceWarningsEnabled() {\n return (\n (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env\n ?.NODE_ENV !== \"production\"\n );\n}\n","import { Combobox as C, createListCollection } from \"@ark-ui/solid/combobox\";\nimport { Select as S } from \"@ark-ui/solid/select\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport {\n createVirtualizer,\n defaultRangeExtractor,\n type Range,\n} from \"@tanstack/solid-virtual\";\nimport {\n choiceMessages,\n choiceWarningsEnabled,\n validateOptions,\n type ComboboxProps,\n} from \"../choice-types\";\n\nexport function Choice(props: ComboboxProps & { searchable: boolean }) {\n const id = createUniqueId();\n const [internal, setInternal] = createSignal(props.defaultValue ?? \"\");\n const value = () => props.value ?? internal();\n const label = createMemo(\n () =>\n props.items.find((item) => item.value === value())?.label ??\n (props.selectedOption?.value === value()\n ? props.selectedOption.label\n : value()),\n );\n const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());\n const inputValue = () => props.inputValue ?? draft();\n const [open, setOpen] = createSignal(false),\n [highlight, setHighlight] = createSignal<string | null>(null);\n let visible: HTMLInputElement | HTMLButtonElement | undefined,\n validation: HTMLInputElement | undefined;\n const [scroll, setScroll] = createSignal<HTMLDivElement | null>(null);\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n // Preserve the enclosing modal's isolation boundary for nested options.\n if (visible)\n setPortalMount(\n visible.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n visible.ownerDocument.body,\n );\n });\n let composing = false;\n let pendingRestore: { from: string; to: string } | null = null;\n const resolveLabel = (id: string) =>\n props.items.find((item) => item.value === id)?.label ??\n (props.selectedOption?.value === id ? props.selectedOption.label : id);\n const blocked = () => props.disabled || props.readOnly;\n const messages = () => ({ ...choiceMessages, ...props.messages });\n const setInput = (next: string) => {\n if (pendingRestore?.from === inputValue() && pendingRestore.to === next)\n return;\n pendingRestore = null;\n if (props.inputValue === undefined) setDraft(next);\n props.onInputValueChange?.(next);\n };\n const restoreInput = (next: string) => {\n const current = inputValue();\n if (next === current) return;\n if (pendingRestore?.from === current && pendingRestore.to === next) return;\n pendingRestore = { from: current, to: next };\n if (props.inputValue === undefined) setDraft(next);\n else props.onInputValueChange?.(next);\n };\n const setValue = (next: string) => {\n if (props.value === undefined) setInternal(next);\n props.onValueChange?.(next);\n };\n createEffect(() => {\n validateOptions(props.items);\n });\n createEffect(() => {\n if (\n choiceWarningsEnabled() &&\n value() &&\n !props.items.some((item) => item.value === value()) &&\n props.selectedOption?.value !== value()\n )\n console.warn(\n `DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`,\n );\n });\n let previousSelection = { value: value(), label: label() };\n createEffect(() => {\n const current = { value: value(), label: label() };\n if (\n previousSelection.value !== current.value ||\n previousSelection.label !== current.label\n ) {\n previousSelection = current;\n untrack(() => restoreInput(current.label));\n }\n });\n createEffect(() => {\n const associatedForm = props.form;\n const form = associatedForm\n ? (validation?.ownerDocument.getElementById(\n associatedForm,\n ) as HTMLFormElement | null)\n : validation?.form;\n if (!form) return;\n const reset = (event: Event) =>\n queueMicrotask(() => {\n if (event.defaultPrevented) return;\n const resetValue = props.value ?? props.defaultValue ?? \"\";\n const resetLabel = resolveLabel(resetValue);\n previousSelection = { value: resetValue, label: resetLabel };\n if (props.value === undefined) setInternal(resetValue);\n restoreInput(props.defaultInputValue ?? resetLabel);\n setOpen(false);\n if (visible instanceof HTMLInputElement) visible.value = inputValue();\n if (validation) validation.value = value();\n });\n form.addEventListener(\"reset\", reset);\n onCleanup(() => form.removeEventListener(\"reset\", reset));\n });\n const items = createMemo(() =>\n props.searchable &&\n props.filterMode !== \"external\" &&\n inputValue() !== label()\n ? props.items.filter((item) =>\n item.label\n .toLocaleLowerCase()\n .includes(inputValue().toLocaleLowerCase()),\n )\n : props.items,\n );\n const collection = createMemo(() =>\n createListCollection({\n items: items(),\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n isItemDisabled: (item) => !!item.disabled,\n }),\n );\n const virtual = () => !!props.virtualization;\n const height = () => {\n const configured = props.virtualization\n ? props.virtualization.itemHeight\n : undefined;\n return Number.isFinite(configured) ? Math.max(40, configured!) : 40;\n };\n const activeIndex = () =>\n items().findIndex((item) => item.value === highlight());\n const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({\n get count() {\n return items().length;\n },\n getScrollElement: scroll,\n estimateSize: height,\n get overscan() {\n return props.virtualization ? (props.virtualization.overscan ?? 5) : 5;\n },\n get enabled() {\n return virtual() && open();\n },\n initialRect: { width: 0, height: 320 },\n get rangeExtractor() {\n const active = activeIndex();\n return (range: Range) => {\n const indexes = defaultRangeExtractor(range);\n if (active >= 0 && !indexes.includes(active)) indexes.push(active);\n return indexes.sort((a, b) => a - b);\n };\n },\n });\n createEffect(() => {\n items();\n const opened = open();\n setHighlight(null);\n if (virtual() && opened)\n virtualizer.scrollToIndex(\n Math.max(\n 0,\n items().findIndex((item) => item.value === value()),\n ),\n { align: \"auto\" },\n );\n });\n const Parts = props.searchable ? C : S;\n const rows = createMemo(() => {\n const result = virtual()\n ? virtualizer\n .getVirtualItems()\n .map((row) => ({ index: row.index, start: row.start }))\n : items().map((_, index) => ({ index, start: 0 }));\n const active = activeIndex();\n if (virtual() && active >= 0 && !result.some((row) => row.index === active))\n result.push({ index: active, start: active * height() });\n return result;\n });\n const status = () =>\n props.loading\n ? messages().loading\n : props.error\n ? typeof props.error === \"string\"\n ? props.error\n : messages().error\n : items().length === 0\n ? messages().empty\n : \"\";\n const rootProps = {\n get collection() {\n return collection();\n },\n get value() {\n return value() ? [value()] : [];\n },\n get open() {\n return open() && !blocked();\n },\n get disabled() {\n return props.disabled;\n },\n get readOnly() {\n return props.readOnly;\n },\n onOpenChange: (details: { open: boolean }) => {\n if (!blocked()) setOpen(details.open);\n },\n onValueChange: (details: { value: string[] }) => {\n if (blocked() || composing) return;\n const next = details.value[0] ?? \"\";\n if (next !== value()) setValue(next);\n },\n onHighlightChange: (details: { highlightedValue: string | null }) =>\n setHighlight(details.highlightedValue),\n get scrollToIndexFn() {\n return virtual()\n ? ({ index }: { index: number }) =>\n virtualizer.scrollToIndex(index, { align: \"auto\" })\n : undefined;\n },\n get positioning() {\n return {\n placement: \"bottom-start\" as const,\n sameWidth: true,\n gutter: 4,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? (\"fixed\" as const)\n : (\"absolute\" as const),\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n };\n },\n };\n const inputProps = props.searchable\n ? {\n get inputValue() {\n return inputValue();\n },\n onInputValueChange: (details: { inputValue: string }) => {\n if (!blocked() && details.inputValue !== inputValue())\n setInput(details.inputValue);\n },\n selectionBehavior: \"preserve\" as const,\n }\n : {};\n return (\n <Parts.Root\n {...rootProps}\n {...inputProps}\n id={props.id ?? id}\n class=\"dds-choice\"\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-has-value={value() || inputValue() ? \"\" : undefined}\n >\n <Show when={props.label}>\n <Parts.Label class=\"dds-choice-label\" onClick={() => visible?.focus()}>\n {props.label}\n </Parts.Label>\n </Show>\n <Parts.Control class=\"dds-choice-control\">\n <Show when={props.searchable}>\n <C.Input\n ref={(node) => {\n visible = node;\n }}\n class=\"dds-choice-input\"\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n placeholder={props.placeholder}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={() => {\n composing = false;\n }}\n onKeyDown={(event) => {\n if (composing && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onBlur={() => {\n if (value()) restoreInput(label());\n }}\n />\n </Show>\n <Parts.Trigger\n ref={(node) => {\n if (!props.searchable) visible = node;\n }}\n class=\"dds-choice-trigger\"\n aria-label={props.searchable ? messages().open : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n >\n {props.searchable ? (\n \"⌄\"\n ) : (\n <span class=\"dds-choice-value\">\n {label() || props.placeholder || messages().open}\n </span>\n )}\n </Parts.Trigger>\n <Show when={props.clearable && !blocked() && (value() || inputValue())}>\n <button\n class=\"dds-choice-clear\"\n type=\"button\"\n aria-label={messages().clear}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n setInput(\"\");\n setOpen(false);\n visible?.focus();\n }}\n >\n ×\n </button>\n </Show>\n </Parts.Control>\n <input\n ref={validation}\n class=\"dds-choice-validation\"\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n border: \"0\",\n \"clip-path\": \"inset(50%)\",\n overflow: \"hidden\",\n \"white-space\": \"nowrap\",\n }}\n tabIndex={-1}\n aria-hidden=\"true\"\n name={props.name}\n form={props.form}\n value={value()}\n required={props.required}\n disabled={props.disabled}\n onInput={(event) => {\n event.currentTarget.value = value();\n }}\n onInvalid={(event) => {\n event.preventDefault();\n visible?.focus();\n }}\n />\n <div class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\">\n {status()}\n <Show when={props.error && props.onRetry}>\n <button\n class=\"dds-choice-retry\"\n type=\"button\"\n onClick={() => props.onRetry?.()}\n >\n {messages().retry}\n </button>\n </Show>\n </div>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <Parts.Positioner class=\"dds-choice-positioner\">\n <Parts.Content\n ref={setScroll}\n class=\"dds-choice-content\"\n style={{\n \"max-height\": \"min(320px, var(--available-height, 320px))\",\n overflow: \"auto\",\n }}\n >\n <div\n style={\n virtual()\n ? {\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n }\n : undefined\n }\n >\n <For each={rows()}>\n {(row) => {\n const item = () => items()[row.index]!;\n return (\n <Parts.Item\n item={item()}\n class=\"dds-choice-item\"\n aria-posinset={row.index + 1}\n aria-setsize={items().length}\n style={\n virtual()\n ? {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${height()}px`,\n transform: `translateY(${row.start}px)`,\n }\n : undefined\n }\n >\n <Parts.ItemText>{item().label}</Parts.ItemText>\n <Show when={item().description}>\n <span class=\"dds-choice-description\">\n {item().description}\n </span>\n </Show>\n </Parts.Item>\n );\n }}\n </For>\n </div>\n </Parts.Content>\n </Parts.Positioner>\n </Portal>\n )}\n </Show>\n </Parts.Root>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ //#region src/utils.ts
2
+ function classes(...values) {
3
+ return values.filter(Boolean).join(" ");
4
+ }
5
+ function describedBy(...ids) {
6
+ return ids.filter(Boolean).join(" ") || void 0;
7
+ }
8
+ //#endregion
9
+ export { describedBy as n, classes as t };
10
+
11
+ //# sourceMappingURL=utils-Ou0UJRlO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-Ou0UJRlO.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["export function classes(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n\nexport function describedBy(...ids: Array<string | false | null | undefined>): string | undefined {\n const value = ids.filter(Boolean).join(\" \");\n return value || undefined;\n}\n"],"mappings":";AAAA,SAAgB,QAAQ,GAAG,QAA0D;CACnF,OAAO,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACxC;AAEA,SAAgB,YAAY,GAAG,KAAmE;CAEhG,OADc,IAAI,OAAO,OAAO,CAAC,CAAC,KAAK,GAChC,KAAS,KAAA;AAClB"}