@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.
- package/README.ko.md +6 -0
- package/README.md +6 -0
- package/dist/assets/calendar-view-1RO2mtf1.js +456 -0
- package/dist/assets/calendar-view-1RO2mtf1.js.map +1 -0
- package/dist/assets/choice-DoXiK8nc.js +443 -0
- package/dist/assets/choice-DoXiK8nc.js.map +1 -0
- package/dist/assets/utils-Ou0UJRlO.js +11 -0
- package/dist/assets/utils-Ou0UJRlO.js.map +1 -0
- package/dist/calendar-view-CTBTPB4T.js +444 -0
- package/dist/calendar-view-CTBTPB4T.js.map +1 -0
- package/dist/calendar-view.d.ts +16 -0
- package/dist/calendar-view.d.ts.map +1 -0
- package/dist/calendar.d.ts +19 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +95 -0
- package/dist/calendar.js.map +1 -0
- package/dist/calendar.server.js +95 -0
- package/dist/calendar.server.js.map +1 -0
- package/dist/choice-BPMiJlPJ.js +395 -0
- package/dist/choice-BPMiJlPJ.js.map +1 -0
- package/dist/choice-types.d.ts +56 -0
- package/dist/choice-types.d.ts.map +1 -0
- package/dist/combobox.d.ts +4 -0
- package/dist/combobox.d.ts.map +1 -0
- package/dist/combobox.js +10 -0
- package/dist/combobox.js.map +1 -0
- package/dist/combobox.server.js +10 -0
- package/dist/combobox.server.js.map +1 -0
- package/dist/date-only.d.ts +36 -0
- package/dist/date-only.d.ts.map +1 -0
- package/dist/date-picker.d.ts +10 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +258 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/date-picker.server.js +260 -0
- package/dist/date-picker.server.js.map +1 -0
- package/dist/dropdown-menu.d.ts +31 -0
- package/dist/dropdown-menu.d.ts.map +1 -0
- package/dist/dropdown-menu.js +101 -0
- package/dist/dropdown-menu.js.map +1 -0
- package/dist/dropdown-menu.server.js +111 -0
- package/dist/dropdown-menu.server.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +232 -647
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +26 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +130 -0
- package/dist/input.js.map +1 -0
- package/dist/input.server.js +120 -0
- package/dist/input.server.js.map +1 -0
- package/dist/internal/choice.d.ts +5 -0
- package/dist/internal/choice.d.ts.map +1 -0
- package/dist/popover.d.ts +22 -0
- package/dist/popover.d.ts.map +1 -0
- package/dist/popover.js +76 -0
- package/dist/popover.js.map +1 -0
- package/dist/popover.server.js +79 -0
- package/dist/popover.server.js.map +1 -0
- package/dist/select-picker.d.ts +4 -0
- package/dist/select-picker.d.ts.map +1 -0
- package/dist/select-picker.js +10 -0
- package/dist/select-picker.js.map +1 -0
- package/dist/select-picker.server.js +10 -0
- package/dist/select-picker.server.js.map +1 -0
- package/dist/server.js +28 -445
- package/dist/server.js.map +1 -1
- package/dist/utils-oKxhg9RG.js +11 -0
- package/dist/utils-oKxhg9RG.js.map +1 -0
- package/package.json +63 -6
- 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"}
|