@wipco/sdui 0.2.0 → 0.3.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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +27 -0
  3. package/dist/chunk-4SU2KYPU.js +59 -0
  4. package/dist/chunk-56KKWLNI.js +186 -0
  5. package/dist/chunk-7Y4J7EOK.js +115 -0
  6. package/dist/chunk-APCXOCAO.js +110 -0
  7. package/dist/chunk-AROOQ5W6.js +119 -0
  8. package/dist/chunk-DGPRX4MU.js +251 -0
  9. package/dist/chunk-IL2KS4WS.js +25 -0
  10. package/dist/chunk-KADFN76X.js +541 -0
  11. package/dist/chunk-KBHI3IUR.js +40 -0
  12. package/dist/chunk-LZJTKVMO.js +767 -0
  13. package/dist/chunk-MOIU7MUA.js +282 -0
  14. package/dist/chunk-MSAV4J4I.js +77 -0
  15. package/dist/chunk-OOHHW4K4.js +159 -0
  16. package/dist/chunk-Q6SBH63R.js +190 -0
  17. package/dist/chunk-QZQDHSMD.js +78 -0
  18. package/dist/chunk-RH7ESUE6.js +309 -0
  19. package/dist/chunk-SEBPBUZR.js +260 -0
  20. package/dist/chunk-USKRM22W.js +39 -0
  21. package/dist/chunk-WNYWTFGW.js +61 -0
  22. package/dist/chunk-WVRCIVAD.js +72 -0
  23. package/dist/chunk-YJMD6MOE.js +404 -0
  24. package/dist/chunk-ZNITJ4KK.js +433 -0
  25. package/dist/chunk-ZQR3ULVH.js +193 -0
  26. package/dist/{chunk-QJHD6HVQ.js → chunk-ZUCI34QY.js} +106 -390
  27. package/dist/index.d.ts +306 -53
  28. package/dist/index.js +276 -720
  29. package/dist/meta.d.ts +8 -0
  30. package/dist/meta.js +147 -8
  31. package/dist/rich.js +3 -2
  32. package/dist/styles.css +246 -0
  33. package/dist/widgets/AutocompleteField.d.ts +96 -0
  34. package/dist/widgets/AutocompleteField.js +3 -0
  35. package/dist/widgets/ColumnBoard.d.ts +47 -0
  36. package/dist/widgets/ColumnBoard.js +2 -0
  37. package/dist/widgets/DiffView.d.ts +30 -0
  38. package/dist/widgets/DiffView.js +2 -0
  39. package/dist/widgets/Disclosure.d.ts +20 -0
  40. package/dist/widgets/Disclosure.js +2 -0
  41. package/dist/widgets/EventCalendar.d.ts +59 -0
  42. package/dist/widgets/EventCalendar.js +2 -0
  43. package/dist/widgets/ImageLightbox.d.ts +25 -0
  44. package/dist/widgets/ImageLightbox.js +2 -0
  45. package/dist/widgets/InlineEdit.d.ts +23 -0
  46. package/dist/widgets/InlineEdit.js +2 -0
  47. package/dist/widgets/JsonField.d.ts +24 -0
  48. package/dist/widgets/JsonField.js +2 -0
  49. package/dist/widgets/LiveClock.d.ts +21 -0
  50. package/dist/widgets/LiveClock.js +1 -0
  51. package/dist/widgets/OrgChart.d.ts +32 -0
  52. package/dist/widgets/OrgChart.js +2 -0
  53. package/dist/widgets/PeriodFilter.d.ts +48 -0
  54. package/dist/widgets/PeriodFilter.js +2 -0
  55. package/dist/widgets/PrintSheet.d.ts +23 -0
  56. package/dist/widgets/PrintSheet.js +2 -0
  57. package/dist/widgets/SearchableMultiPicker.d.ts +29 -0
  58. package/dist/widgets/SearchableMultiPicker.js +3 -0
  59. package/dist/widgets/SecureScreen.d.ts +25 -0
  60. package/dist/widgets/SecureScreen.js +2 -0
  61. package/dist/widgets/StackedMeter.d.ts +26 -0
  62. package/dist/widgets/StackedMeter.js +1 -0
  63. package/dist/widgets/Strip.d.ts +20 -0
  64. package/dist/widgets/Strip.js +1 -0
  65. package/dist/widgets/SummaryTable.d.ts +31 -0
  66. package/dist/widgets/SummaryTable.js +1 -0
  67. package/dist/widgets/TagMultiSelect.d.ts +25 -0
  68. package/dist/widgets/TagMultiSelect.js +2 -0
  69. package/dist/widgets/Timeline.d.ts +30 -0
  70. package/dist/widgets/Timeline.js +3 -0
  71. package/dist/widgets/TreePicker.d.ts +21 -0
  72. package/dist/widgets/TreePicker.js +3 -0
  73. package/dist/widgets/TreeView.d.ts +26 -0
  74. package/dist/widgets/TreeView.js +2 -0
  75. package/dist/widgets/index.d.ts +76 -0
  76. package/dist/widgets/index.js +69 -0
  77. package/package.json +93 -3
@@ -0,0 +1,404 @@
1
+ import { Icon } from './chunk-ZUCI34QY.js';
2
+ import { useState, useRef, useMemo, useCallback, useEffect, useLayoutEffect } from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ function HoistedStyle({ id, css }) {
6
+ return /* @__PURE__ */ jsx("style", { href: id, precedence: "medium", children: css });
7
+ }
8
+ var YMD_RE = /^\d{4}-\d{2}-\d{2}$/;
9
+ function parseYmd(value) {
10
+ if (typeof value !== "string" || !YMD_RE.test(value)) return void 0;
11
+ const y = Number(value.slice(0, 4));
12
+ const m = Number(value.slice(5, 7));
13
+ const d = Number(value.slice(8, 10));
14
+ const date = new Date(y, m - 1, d, 12, 0, 0, 0);
15
+ if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) return void 0;
16
+ return date;
17
+ }
18
+ function formatYmd(date) {
19
+ const y = String(date.getFullYear()).padStart(4, "0");
20
+ const m = String(date.getMonth() + 1).padStart(2, "0");
21
+ const d = String(date.getDate()).padStart(2, "0");
22
+ return `${y}-${m}-${d}`;
23
+ }
24
+ function addDays(date, days) {
25
+ const next = new Date(date);
26
+ next.setDate(next.getDate() + days);
27
+ return next;
28
+ }
29
+ function addMonths(date, months) {
30
+ const next = new Date(date.getFullYear(), date.getMonth() + months, 1, 12, 0, 0, 0);
31
+ const lastDay = new Date(next.getFullYear(), next.getMonth() + 1, 0).getDate();
32
+ next.setDate(Math.min(date.getDate(), lastDay));
33
+ return next;
34
+ }
35
+ function clampDate(date, min, max) {
36
+ if (min && date.getTime() < min.getTime()) return min;
37
+ if (max && date.getTime() > max.getTime()) return max;
38
+ return date;
39
+ }
40
+ function monthIndex(date) {
41
+ return date.getFullYear() * 12 + date.getMonth();
42
+ }
43
+ function monthStart(index) {
44
+ return new Date(Math.floor(index / 12), index % 12, 1, 12, 0, 0, 0);
45
+ }
46
+ function isSameDay(a, b) {
47
+ return a !== void 0 && b !== void 0 && formatYmd(a) === formatYmd(b);
48
+ }
49
+ var WEEKDAYS_KO = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
50
+ var WEEKS_PER_MONTH = 6;
51
+ function buildMonthCells(index, min, max) {
52
+ const first = monthStart(index);
53
+ const gridStart = addDays(first, -first.getDay());
54
+ const weeks = [];
55
+ for (let w = 0; w < WEEKS_PER_MONTH; w += 1) {
56
+ const row = [];
57
+ for (let d = 0; d < 7; d += 1) {
58
+ const date = addDays(gridStart, w * 7 + d);
59
+ row.push({
60
+ date,
61
+ ymd: formatYmd(date),
62
+ outside: monthIndex(date) !== index,
63
+ disabled: min !== void 0 && date.getTime() < min.getTime() || max !== void 0 && date.getTime() > max.getTime()
64
+ });
65
+ }
66
+ weeks.push(row);
67
+ }
68
+ return weeks;
69
+ }
70
+ function Calendar({
71
+ monthCount,
72
+ minDate,
73
+ maxDate,
74
+ dayState,
75
+ onPick,
76
+ focusDate,
77
+ onFocusDateChange
78
+ }) {
79
+ const focusIdx = monthIndex(focusDate);
80
+ const [viewIdx, setViewIdx] = useState(focusIdx);
81
+ const gridRef = useRef(null);
82
+ const focusYmd = formatYmd(focusDate);
83
+ const visibleIdx = focusIdx < viewIdx ? focusIdx : focusIdx > viewIdx + monthCount - 1 ? focusIdx - monthCount + 1 : viewIdx;
84
+ if (visibleIdx !== viewIdx) setViewIdx(visibleIdx);
85
+ useLayoutEffect(() => {
86
+ gridRef.current?.querySelector('[tabindex="0"]')?.focus();
87
+ }, [focusYmd]);
88
+ const todayYmd = formatYmd(/* @__PURE__ */ new Date());
89
+ const minIdx = minDate ? monthIndex(minDate) : -Infinity;
90
+ const maxIdx = maxDate ? monthIndex(maxDate) : Infinity;
91
+ const prevDisabled = visibleIdx <= minIdx;
92
+ const nextDisabled = visibleIdx + monthCount - 1 >= maxIdx;
93
+ const moveFocus = (next) => {
94
+ onFocusDateChange(clampDate(next, minDate, maxDate));
95
+ };
96
+ const handleKeyDown = (event) => {
97
+ const deltaDays = event.key === "ArrowLeft" ? -1 : event.key === "ArrowRight" ? 1 : event.key === "ArrowUp" ? -7 : event.key === "ArrowDown" ? 7 : 0;
98
+ if (deltaDays !== 0) {
99
+ event.preventDefault();
100
+ moveFocus(addDays(focusDate, deltaDays));
101
+ return;
102
+ }
103
+ if (event.key === "Home" || event.key === "End") {
104
+ event.preventDefault();
105
+ const offset = event.key === "Home" ? -focusDate.getDay() : 6 - focusDate.getDay();
106
+ moveFocus(addDays(focusDate, offset));
107
+ return;
108
+ }
109
+ if (event.key === "PageUp" || event.key === "PageDown") {
110
+ event.preventDefault();
111
+ moveFocus(addMonths(focusDate, event.key === "PageUp" ? -1 : 1));
112
+ }
113
+ };
114
+ return /* @__PURE__ */ jsx("div", { className: "wp-dp", children: /* @__PURE__ */ jsxs("div", { className: "wp-dp__months", ref: gridRef, onKeyDown: handleKeyDown, children: [
115
+ /* @__PURE__ */ jsxs("div", { className: "wp-dp__nav", children: [
116
+ /* @__PURE__ */ jsx(
117
+ "button",
118
+ {
119
+ type: "button",
120
+ className: "wp-dp__navbtn",
121
+ "aria-label": "\uC774\uC804 \uB2EC",
122
+ "aria-disabled": prevDisabled || void 0,
123
+ disabled: prevDisabled,
124
+ onClick: () => setViewIdx(visibleIdx - 1),
125
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevron-left", size: 16 })
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ className: "wp-dp__navbtn",
133
+ "aria-label": "\uB2E4\uC74C \uB2EC",
134
+ "aria-disabled": nextDisabled || void 0,
135
+ disabled: nextDisabled,
136
+ onClick: () => setViewIdx(visibleIdx + 1),
137
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevron-right", size: 16 })
138
+ }
139
+ )
140
+ ] }),
141
+ Array.from({ length: monthCount }, (_, offset) => {
142
+ const idx = visibleIdx + offset;
143
+ const first = monthStart(idx);
144
+ const weeks = buildMonthCells(idx, minDate, maxDate);
145
+ const caption = `${first.getFullYear()}\uB144 ${first.getMonth() + 1}\uC6D4`;
146
+ return /* @__PURE__ */ jsxs("div", { className: "wp-dp__month", children: [
147
+ /* @__PURE__ */ jsx("div", { className: "wp-dp__caption", children: /* @__PURE__ */ jsx("span", { className: "wp-dp__caption-label", children: caption }) }),
148
+ /* @__PURE__ */ jsxs("table", { className: "wp-dp__grid", role: "grid", "aria-label": caption, children: [
149
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "wp-dp__weekdays", children: WEEKDAYS_KO.map((name) => /* @__PURE__ */ jsx("th", { scope: "col", className: "wp-dp__weekday", abbr: name, children: name }, name)) }) }),
150
+ /* @__PURE__ */ jsx("tbody", { className: "wp-dp__weeks", children: weeks.map((week, w) => /* @__PURE__ */ jsx("tr", { className: "wp-dp__week", children: week.map((cell) => {
151
+ const state = cell.disabled ? {} : dayState(cell.date);
152
+ const classes = ["wp-dp__day"];
153
+ if (cell.outside) classes.push("wp-dp__day--outside");
154
+ if (cell.disabled) classes.push("wp-dp__day--disabled");
155
+ if (cell.ymd === todayYmd) classes.push("wp-dp__day--today");
156
+ if (state.selected) classes.push("wp-dp__day--selected");
157
+ if (state.rangeStart) classes.push("wp-dp__day--range-start");
158
+ if (state.rangeMiddle) classes.push("wp-dp__day--range-middle");
159
+ if (state.rangeEnd) classes.push("wp-dp__day--range-end");
160
+ return /* @__PURE__ */ jsx("td", { className: classes.join(" "), children: /* @__PURE__ */ jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ className: "wp-dp__day-btn",
165
+ "data-ymd": cell.ymd,
166
+ tabIndex: cell.ymd === focusYmd && !cell.outside ? 0 : -1,
167
+ disabled: cell.disabled,
168
+ "aria-selected": state.selected || state.rangeStart || state.rangeEnd || void 0,
169
+ "aria-label": cell.ymd,
170
+ onClick: () => {
171
+ onFocusDateChange(cell.date);
172
+ onPick(cell.date);
173
+ },
174
+ children: cell.date.getDate()
175
+ }
176
+ ) }, cell.ymd);
177
+ }) }, w)) })
178
+ ] })
179
+ ] }, idx);
180
+ })
181
+ ] }) });
182
+ }
183
+ function useDismiss(open, hostRef, onDismiss) {
184
+ useEffect(() => {
185
+ if (!open) return;
186
+ const handlePointerDown = (event) => {
187
+ if (event.target instanceof Node && hostRef.current?.contains(event.target)) return;
188
+ onDismiss("outside");
189
+ };
190
+ const handleKeyDown = (event) => {
191
+ if (event.key === "Escape") onDismiss("escape");
192
+ };
193
+ document.addEventListener("pointerdown", handlePointerDown);
194
+ document.addEventListener("keydown", handleKeyDown);
195
+ return () => {
196
+ document.removeEventListener("pointerdown", handlePointerDown);
197
+ document.removeEventListener("keydown", handleKeyDown);
198
+ };
199
+ }, [open, hostRef, onDismiss]);
200
+ }
201
+ function triggerClassName(size, invalid) {
202
+ const classes = ["wp-input", "wp-dp-trigger"];
203
+ if (size !== "md") classes.push(`wp-input--${size}`);
204
+ if (invalid) classes.push("wp-input--invalid");
205
+ return classes.join(" ");
206
+ }
207
+ function DatePicker({
208
+ value,
209
+ onChange,
210
+ min,
211
+ max,
212
+ placeholder,
213
+ invalid = false,
214
+ disabled = false,
215
+ size = "md"
216
+ }) {
217
+ const [open, setOpen] = useState(false);
218
+ const [innerValue, setInnerValue] = useState("");
219
+ const hostRef = useRef(null);
220
+ const triggerRef = useRef(null);
221
+ const isControlled = value !== void 0;
222
+ const currentValue = isControlled ? value : innerValue;
223
+ const selectedDate = useMemo(() => parseYmd(currentValue), [currentValue]);
224
+ const minDate = useMemo(() => parseYmd(min), [min]);
225
+ const maxDate = useMemo(() => parseYmd(max), [max]);
226
+ const [focusDate, setFocusDate] = useState(() => selectedDate ?? clampDate(/* @__PURE__ */ new Date(), minDate, maxDate));
227
+ const dismiss = useCallback((reason) => {
228
+ setOpen(false);
229
+ if (reason === "escape") triggerRef.current?.focus();
230
+ }, []);
231
+ useDismiss(open, hostRef, dismiss);
232
+ const openCalendar = () => {
233
+ setFocusDate(selectedDate ?? clampDate(/* @__PURE__ */ new Date(), minDate, maxDate));
234
+ setOpen(true);
235
+ };
236
+ const isInvalid = Boolean(invalid);
237
+ return /* @__PURE__ */ jsxs("div", { ref: hostRef, className: "wp-dp-host", children: [
238
+ /* @__PURE__ */ jsx(HoistedStyle, { id: "wp-datepicker", css: DP_CSS }),
239
+ /* @__PURE__ */ jsxs(
240
+ "button",
241
+ {
242
+ ref: triggerRef,
243
+ type: "button",
244
+ className: triggerClassName(size, isInvalid),
245
+ "aria-invalid": isInvalid || void 0,
246
+ "aria-haspopup": "dialog",
247
+ "aria-expanded": open,
248
+ disabled,
249
+ onClick: () => open ? setOpen(false) : openCalendar(),
250
+ children: [
251
+ /* @__PURE__ */ jsx("span", { className: "wp-dp-trigger__icon", children: /* @__PURE__ */ jsx(Icon, { name: "calendar", size: size === "lg" ? 16 : 15 }) }),
252
+ currentValue ? /* @__PURE__ */ jsx("span", { className: "wp-dp-trigger__value", children: selectedDate ? formatYmd(selectedDate) : currentValue }) : /* @__PURE__ */ jsx("span", { className: "wp-dp-trigger__value wp-dp-trigger__value--placeholder", children: placeholder ?? "\uB0A0\uC9DC \uC120\uD0DD" })
253
+ ]
254
+ }
255
+ ),
256
+ open ? /* @__PURE__ */ jsx("div", { className: "wp-dp-pop", role: "dialog", "aria-label": "\uB0A0\uC9DC \uC120\uD0DD \uB2EC\uB825", children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
257
+ Calendar,
258
+ {
259
+ monthCount: 1,
260
+ minDate,
261
+ maxDate,
262
+ focusDate,
263
+ onFocusDateChange: setFocusDate,
264
+ dayState: (date) => ({ selected: isSameDay(date, selectedDate) }),
265
+ onPick: (date) => {
266
+ const next = formatYmd(date);
267
+ if (!isControlled) setInnerValue(next);
268
+ onChange?.(next);
269
+ setOpen(false);
270
+ triggerRef.current?.focus();
271
+ }
272
+ }
273
+ ) }) }) : null
274
+ ] });
275
+ }
276
+ function DateRangePicker({
277
+ value,
278
+ onChange,
279
+ min,
280
+ max,
281
+ invalid = false,
282
+ disabled = false
283
+ }) {
284
+ const [open, setOpen] = useState(false);
285
+ const [innerRange, setInnerRange] = useState({});
286
+ const hostRef = useRef(null);
287
+ const triggerRef = useRef(null);
288
+ const isControlled = value !== void 0;
289
+ const currentRange = (isControlled ? value : innerRange) ?? {};
290
+ const fromDate = useMemo(() => parseYmd(currentRange.from), [currentRange.from]);
291
+ const toDate = useMemo(() => parseYmd(currentRange.to), [currentRange.to]);
292
+ const minDate = useMemo(() => parseYmd(min), [min]);
293
+ const maxDate = useMemo(() => parseYmd(max), [max]);
294
+ const [focusDate, setFocusDate] = useState(() => fromDate ?? clampDate(/* @__PURE__ */ new Date(), minDate, maxDate));
295
+ const dismiss = useCallback((reason) => {
296
+ setOpen(false);
297
+ if (reason === "escape") triggerRef.current?.focus();
298
+ }, []);
299
+ useDismiss(open, hostRef, dismiss);
300
+ const hasValue = Boolean(currentRange.from || currentRange.to);
301
+ const label = hasValue ? `${currentRange.from ?? ""} ~ ${currentRange.to ?? ""}` : "\uAE30\uAC04 \uC120\uD0DD";
302
+ const isInvalid = Boolean(invalid);
303
+ const openCalendar = () => {
304
+ setFocusDate(fromDate ?? toDate ?? clampDate(/* @__PURE__ */ new Date(), minDate, maxDate));
305
+ setOpen(true);
306
+ };
307
+ const commit = (next) => {
308
+ if (!isControlled) setInnerRange(next);
309
+ onChange?.(next);
310
+ };
311
+ const pick = (date) => {
312
+ const ymd = formatYmd(date);
313
+ const startingOver = fromDate === void 0 || toDate !== void 0 || date.getTime() < fromDate.getTime();
314
+ if (startingOver) {
315
+ commit({ from: ymd, to: void 0 });
316
+ return;
317
+ }
318
+ commit({ from: currentRange.from, to: ymd });
319
+ setOpen(false);
320
+ triggerRef.current?.focus();
321
+ };
322
+ return /* @__PURE__ */ jsxs("div", { ref: hostRef, className: "wp-dp-host", children: [
323
+ /* @__PURE__ */ jsx(HoistedStyle, { id: "wp-datepicker", css: DP_CSS }),
324
+ /* @__PURE__ */ jsxs(
325
+ "button",
326
+ {
327
+ ref: triggerRef,
328
+ type: "button",
329
+ className: triggerClassName("md", isInvalid),
330
+ "aria-invalid": isInvalid || void 0,
331
+ "aria-haspopup": "dialog",
332
+ "aria-expanded": open,
333
+ disabled,
334
+ onClick: () => open ? setOpen(false) : openCalendar(),
335
+ children: [
336
+ /* @__PURE__ */ jsx("span", { className: "wp-dp-trigger__icon", children: /* @__PURE__ */ jsx(Icon, { name: "calendar", size: 15 }) }),
337
+ /* @__PURE__ */ jsx("span", { className: `wp-dp-trigger__value${hasValue ? "" : " wp-dp-trigger__value--placeholder"}`, children: label })
338
+ ]
339
+ }
340
+ ),
341
+ open ? /* @__PURE__ */ jsx("div", { className: "wp-dp-pop wp-dp-pop--wide", role: "dialog", "aria-label": "\uAE30\uAC04 \uC120\uD0DD \uB2EC\uB825", children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
342
+ Calendar,
343
+ {
344
+ monthCount: 2,
345
+ minDate,
346
+ maxDate,
347
+ focusDate,
348
+ onFocusDateChange: setFocusDate,
349
+ dayState: (date) => {
350
+ const t = date.getTime();
351
+ const start = fromDate?.getTime();
352
+ const end = toDate?.getTime();
353
+ if (start !== void 0 && end !== void 0 && t > start && t < end) return { rangeMiddle: true };
354
+ return {
355
+ rangeStart: start !== void 0 && t === start && end !== void 0,
356
+ rangeEnd: end !== void 0 && t === end,
357
+ // 아직 시작만 고른 상태는 단일 선택처럼 보인다
358
+ selected: start !== void 0 && t === start && end === void 0 || void 0
359
+ };
360
+ },
361
+ onPick: pick
362
+ }
363
+ ) }) }) : null
364
+ ] });
365
+ }
366
+ var DP_CSS = `
367
+ .wp-dp-host{position:relative}
368
+ .wp-dp-pop{position:absolute;top:calc(100% + var(--wp-space-2));left:0;min-width:100%;width:max-content;background:var(--wp-surface-card);border:1px solid var(--wp-border-subtle);border-radius:var(--wp-radius-lg);box-shadow:var(--wp-shadow-lg);z-index:300}
369
+ .wp-dp-pop--wide{max-width:min(640px,90vw)}
370
+ .wp-dp-pop__body{padding:var(--wp-space-4);max-height:60vh;overflow:auto}
371
+ .wp-dp-trigger{display:inline-flex;align-items:center;gap:var(--wp-space-2);text-align:left;cursor:pointer}
372
+ .wp-dp-trigger:disabled{cursor:not-allowed}
373
+ .wp-dp-trigger__icon{flex:none;display:inline-flex;color:var(--wp-text-muted)}
374
+ .wp-dp-trigger:disabled .wp-dp-trigger__icon{color:var(--wp-text-disabled)}
375
+ .wp-dp-trigger__value{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--wp-font-mono);font-size:12.5px;letter-spacing:-0.01em}
376
+ .wp-dp-trigger__value--placeholder{font-family:inherit;font-size:13px;letter-spacing:normal;color:var(--wp-text-subtle)}
377
+ .wp-dp{font-family:inherit;font-size:13px;color:var(--wp-text-default)}
378
+ .wp-dp__months{position:relative;display:flex;flex-wrap:wrap;gap:var(--wp-space-5)}
379
+ .wp-dp__nav{position:absolute;top:0;right:0;display:flex;gap:var(--wp-space-1);z-index:1}
380
+ .wp-dp__navbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;background:transparent;border-radius:var(--wp-radius-sm);color:var(--wp-text-muted);cursor:pointer;transition:background 0.12s,color 0.12s}
381
+ .wp-dp__navbtn:hover:not(:disabled){background:var(--wp-surface-hover);color:var(--wp-text-strong)}
382
+ .wp-dp__navbtn:focus-visible{outline:2px solid var(--wp-border-focus);outline-offset:1px}
383
+ .wp-dp__navbtn:disabled{color:var(--wp-text-disabled);cursor:default;background:transparent}
384
+ .wp-dp__caption{display:flex;align-items:center;height:28px;margin-bottom:var(--wp-space-2);padding-left:var(--wp-space-1)}
385
+ .wp-dp__caption-label{font-size:13px;font-weight:600;color:var(--wp-text-strong)}
386
+ .wp-dp__grid{border-collapse:collapse}
387
+ .wp-dp__weekday{width:32px;height:28px;padding:0;font-size:12px;font-weight:500;color:var(--wp-text-muted);text-align:center}
388
+ .wp-dp__weekday:first-child{color:var(--wp-text-danger)}
389
+ .wp-dp__day{padding:0;text-align:center}
390
+ .wp-dp__day-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:30px;padding:0;border:none;background:transparent;border-radius:var(--wp-radius-sm);font:inherit;font-variant-numeric:tabular-nums;color:inherit;cursor:pointer;transition:background 0.12s,color 0.12s}
391
+ .wp-dp__day:not(.wp-dp__day--selected):not(.wp-dp__day--disabled) .wp-dp__day-btn:hover{background:var(--wp-surface-hover)}
392
+ .wp-dp__day-btn:focus-visible{outline:2px solid var(--wp-border-focus);outline-offset:-1px}
393
+ .wp-dp__day--today .wp-dp__day-btn{box-shadow:inset 0 0 0 1px var(--wp-border-focus)}
394
+ .wp-dp__day--outside{color:var(--wp-text-subtle)}
395
+ .wp-dp__day--disabled{color:var(--wp-text-disabled)}
396
+ .wp-dp__day--disabled .wp-dp__day-btn{cursor:default}
397
+ .wp-dp__day--selected .wp-dp__day-btn{background:var(--wp-action-primary-bg);color:var(--wp-action-primary-fg);font-weight:500}
398
+ .wp-dp__day--selected.wp-dp__day--today .wp-dp__day-btn{box-shadow:none}
399
+ .wp-dp__day--range-middle .wp-dp__day-btn{background:var(--wp-surface-selected);color:var(--wp-text-default);border-radius:0;font-weight:400}
400
+ .wp-dp__day--range-start .wp-dp__day-btn,.wp-dp__day--range-end .wp-dp__day-btn{background:var(--wp-action-primary-bg);color:var(--wp-action-primary-fg);font-weight:500}
401
+ .wp-dp__day--range-start.wp-dp__day--today .wp-dp__day-btn,.wp-dp__day--range-end.wp-dp__day--today .wp-dp__day-btn{box-shadow:none}
402
+ `;
403
+
404
+ export { DatePicker, DateRangePicker, HoistedStyle };