@wipco/sdui 1.6.0 → 1.7.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 (98) hide show
  1. package/dist/{DatePicker-DX9juElE.d.ts → DatePicker-BOOKdd5x.d.ts} +6 -6
  2. package/dist/calendar-nav-BSGsgJc4.d.ts +54 -0
  3. package/dist/{chunk-53KS4E5N.js → chunk-27ILQUWE.js} +121 -28
  4. package/dist/{chunk-AY4GM6KQ.js → chunk-466W3XNK.js} +1 -1
  5. package/dist/{chunk-X2NIRVLN.js → chunk-4VQIKSDS.js} +157 -190
  6. package/dist/{chunk-LIZTK3HO.js → chunk-5FZBH3T5.js} +1 -1
  7. package/dist/{chunk-NA232CBX.js → chunk-5LIFU57A.js} +2 -2
  8. package/dist/{chunk-LKQJJSVJ.js → chunk-63GM4S25.js} +1 -1
  9. package/dist/{chunk-CSE3PZOZ.js → chunk-7EDFYBUA.js} +4 -4
  10. package/dist/{chunk-MN4RZ2WP.js → chunk-7YTZB5LQ.js} +3 -3
  11. package/dist/{chunk-WEG3V7ZB.js → chunk-7ZCM6XEM.js} +2 -2
  12. package/dist/{chunk-6XI2VF2O.js → chunk-A22QR6PM.js} +2 -2
  13. package/dist/{chunk-CEVZAFPO.js → chunk-A3SO6H47.js} +2 -2
  14. package/dist/{chunk-2KQL6DYG.js → chunk-AP33B24H.js} +65 -9
  15. package/dist/{chunk-FEKKOBPX.js → chunk-B5MB64YQ.js} +209 -25
  16. package/dist/{chunk-IQXLNICY.js → chunk-DCSUBFFG.js} +4 -4
  17. package/dist/{chunk-OUEJWC2Z.js → chunk-DILQ2DJV.js} +5 -5
  18. package/dist/{chunk-NAIWQQPW.js → chunk-ENZBX4AR.js} +1 -1
  19. package/dist/{chunk-WTIYILY3.js → chunk-FGKBXUUA.js} +1 -1
  20. package/dist/{chunk-CI5OZ2QT.js → chunk-FUNCQCKN.js} +2 -2
  21. package/dist/{chunk-XG22XKKD.js → chunk-GWT5UF5B.js} +2 -2
  22. package/dist/{chunk-K6RE23XX.js → chunk-H5QRRPBJ.js} +3 -3
  23. package/dist/{chunk-AZSLSAJB.js → chunk-JCG4575S.js} +2 -2
  24. package/dist/{chunk-YZTTFEL4.js → chunk-JMNUFA5M.js} +1 -1
  25. package/dist/{chunk-KZ6U6FKB.js → chunk-L6ODTHTX.js} +1 -1
  26. package/dist/{chunk-W4VA76QO.js → chunk-LKA43GYA.js} +1 -1
  27. package/dist/{chunk-6TI4WF5Y.js → chunk-LKL3SCBJ.js} +2 -2
  28. package/dist/{chunk-4OABUPIU.js → chunk-LN4KPZIX.js} +3 -3
  29. package/dist/chunk-MUXGTVEA.js +421 -0
  30. package/dist/{chunk-7C54CKFZ.js → chunk-MWBCQHKQ.js} +3 -3
  31. package/dist/{chunk-7JP52QQO.js → chunk-NI3LMETK.js} +2 -2
  32. package/dist/{chunk-HXLQSO66.js → chunk-NJTIJAFU.js} +2 -2
  33. package/dist/{chunk-YN7X7BEO.js → chunk-NQDHGK7C.js} +3 -3
  34. package/dist/{chunk-BLFJMMBW.js → chunk-OWM7E55U.js} +25 -2
  35. package/dist/{chunk-VPOOIEKT.js → chunk-P62INTQ5.js} +1 -1
  36. package/dist/{chunk-QVS6K4FP.js → chunk-Q56LZJFX.js} +1 -1
  37. package/dist/{chunk-BITS7UJY.js → chunk-R2ORCOTG.js} +2 -2
  38. package/dist/{chunk-2QXA52DG.js → chunk-RA74PUMP.js} +3 -3
  39. package/dist/{chunk-GSM664TX.js → chunk-TAVKGYH5.js} +24 -1
  40. package/dist/{chunk-OYDJHQNZ.js → chunk-UBVYPV7H.js} +2 -2
  41. package/dist/chunk-VR4DQTWR.js +391 -0
  42. package/dist/{chunk-M6H3SHIS.js → chunk-WPAZBAUW.js} +1 -1
  43. package/dist/{chunk-NWYYNE3Q.js → chunk-WTQH2NI2.js} +1 -1
  44. package/dist/{chunk-HRHKQOOF.js → chunk-X7RSKFWF.js} +1 -1
  45. package/dist/{chunk-CSZCWBOE.js → chunk-XDR6HC4U.js} +14 -7
  46. package/dist/{chunk-RU5U2YMT.js → chunk-Z4JZUIKE.js} +3 -3
  47. package/dist/{chunk-V7BWMOHO.js → chunk-Z4LFZWHH.js} +2 -2
  48. package/dist/{chunk-YNEEJCSZ.js → chunk-ZBX2CAOO.js} +2 -2
  49. package/dist/index.d.ts +57 -7
  50. package/dist/index.js +93 -37
  51. package/dist/meta.d.ts +1 -1
  52. package/dist/meta.js +129 -4
  53. package/dist/rich/ExcelUploadCard.js +4 -4
  54. package/dist/rich.d.ts +4 -2
  55. package/dist/rich.js +36 -8
  56. package/dist/styles.css +27 -0
  57. package/dist/{types-CYfIthux.d.ts → types-CMikpoN5.d.ts} +8 -1
  58. package/dist/widgets/ApprovalLineEditor.js +9 -8
  59. package/dist/widgets/ApprovalOverridesEditor.js +11 -10
  60. package/dist/widgets/ApprovalStepper.js +2 -2
  61. package/dist/widgets/AutocompleteField.js +9 -8
  62. package/dist/widgets/ColumnBoard.js +2 -2
  63. package/dist/widgets/DiffView.js +2 -2
  64. package/dist/widgets/Disclosure.js +2 -2
  65. package/dist/widgets/EventCalendar.d.ts +14 -10
  66. package/dist/widgets/EventCalendar.js +5 -3
  67. package/dist/widgets/FileDropzone.js +7 -7
  68. package/dist/widgets/ImageLightbox.js +5 -5
  69. package/dist/widgets/InlineEdit.js +2 -2
  70. package/dist/widgets/JsonField.js +2 -2
  71. package/dist/widgets/OptionSchemaEditor.js +3 -3
  72. package/dist/widgets/OptionValueFields.js +3 -3
  73. package/dist/widgets/OrgChart.js +3 -3
  74. package/dist/widgets/OrgChartBoard.d.ts +57 -4
  75. package/dist/widgets/OrgChartBoard.js +8 -8
  76. package/dist/widgets/PeriodFilter.js +6 -5
  77. package/dist/widgets/PermissionMatrixEditor.js +4 -4
  78. package/dist/widgets/PositionSelect.js +4 -4
  79. package/dist/widgets/PrintSheet.js +2 -2
  80. package/dist/widgets/ProfileEditDiffCard.js +4 -4
  81. package/dist/widgets/QRDisplay.js +4 -4
  82. package/dist/widgets/RankBoard.js +6 -6
  83. package/dist/widgets/RecordSheet.d.ts +48 -1
  84. package/dist/widgets/RecordSheet.js +2 -1
  85. package/dist/widgets/RoleMemberPicker.js +5 -5
  86. package/dist/widgets/SearchableMultiPicker.js +7 -6
  87. package/dist/widgets/SecureScreen.js +2 -2
  88. package/dist/widgets/StagePeriodEditor.js +6 -5
  89. package/dist/widgets/TagInput.js +2 -2
  90. package/dist/widgets/TagMultiSelect.js +4 -4
  91. package/dist/widgets/Timeline.js +3 -3
  92. package/dist/widgets/TreePicker.js +8 -7
  93. package/dist/widgets/TreeView.d.ts +16 -2
  94. package/dist/widgets/TreeView.js +7 -6
  95. package/dist/widgets/index.d.ts +1 -0
  96. package/dist/widgets/index.js +76 -75
  97. package/package.json +1 -1
  98. package/dist/chunk-IB2ZPUTF.js +0 -172
@@ -1,5 +1,6 @@
1
1
  import { S as SduiBoxProps } from './layout-DmRikwZb.js';
2
2
  import React__default from 'react';
3
+ import { C as CalendarNavLocale } from './calendar-nav-BSGsgJc4.js';
3
4
 
4
5
  interface TimePickerProps {
5
6
  /** 선택된 시각 (HH:MM, 24시간제). 주어지면 controlled로 동작. */
@@ -24,16 +25,15 @@ interface TimePickerProps {
24
25
  /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다. 까닭은 {@link ./boxed.tsx}에 있다. */
25
26
  declare const TimePicker: React__default.FC<TimePickerProps & SduiBoxProps>;
26
27
 
27
- interface DatePickerLocale {
28
+ /**
29
+ * 머리글·월·연도 보기의 글자(formatCaption·prevMonthLabel·prevYearLabel …)는 공용 부품의 로캘
30
+ * {@link CalendarNavLocale} 에서 온다 — 여기는 날짜 격자와 패널에만 있는 자리를 더한다.
31
+ */
32
+ interface DatePickerLocale extends CalendarNavLocale {
28
33
  /** 요일 머리글 — **일요일부터** 7개. 주 시작이 달라도 이 순서로 주면 내부에서 돌린다. */
29
34
  weekdays?: readonly string[];
30
35
  /** 주 시작 요일 (0=일 … 6=토). */
31
36
  weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
32
- /** 달력 위 연월 캡션 (month는 1–12). */
33
- formatCaption?: (year: number, month: number) => string;
34
- /** 이전/다음 달 버튼의 낭독 라벨 */
35
- prevMonthLabel?: string;
36
- nextMonthLabel?: string;
37
37
  /** 달력 패널의 낭독 라벨 */
38
38
  calendarLabel?: string;
39
39
  /** 기간 달력에서 시작·종료 칸의 낭독 라벨 (DateRangePicker) */
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 달력 머리글 탐색과 월·연도 보기 — DatePicker(날짜·기간 팝업 달력)와 EventCalendar(일정 캘린더)가
3
+ * **같은 부품**을 쓴다.
4
+ *
5
+ * 머리글은 `<< < [제목] > >>` 한 줄이다 — 제목이 가운데, 왼쪽에 큰 걸음·작은 걸음 뒤로, 오른쪽에
6
+ * 작은 걸음·큰 걸음 앞으로. 예전에는 이전·다음 버튼이 오른쪽에 몰려 있어(기간 달력은 두 달 위에
7
+ * 한 쌍, 일정 캘린더는 '이전·오늘·다음'이 제목 왼쪽에) 어느 쪽으로 가는 버튼인지 한눈에 안 들어왔고,
8
+ * 연 단위 이동은 열두 번을 눌러야 했다(사용자 요청 2026-10-01).
9
+ *
10
+ * 제목을 누르면 한 단계 넓은 보기로 올라간다(윈도우 달력 방식): 일 → 월(그 해의 1~12월) →
11
+ * 연도(10년 + 앞뒤 회색 한 해씩). 고르면 한 단계 내려온다. 이 넓은 보기 둘이 `CalendarZoom` 이다 —
12
+ * 보는 달만 바꾸고 **선택 값은 건드리지 않는다**(값을 정하는 것은 언제나 일 보기의 날짜 칸이다).
13
+ *
14
+ * 걸음 폭은 보기 단위를 따른다: 월 보기(1~12월 격자)에서 `< >` 는 1년·`<< >>` 는 10년, 연도 보기에서
15
+ * `< >` 는 10년·`<< >>` 는 100년. 일 보기의 폭(한 달·한 해, 일정 캘린더의 주·일 보기는 그 단위)은
16
+ * 호출부가 정한다 — 이 파일은 머리글 모양과 월·연도 격자만 안다.
17
+ *
18
+ * 키보드(월·연도 격자): 화살표(좌우 1칸·상하 4칸), Home/End(그 해·그 10년의 처음·끝), PageUp/PageDown
19
+ * (한 단계 큰 걸음), Enter/Space 고르기, Escape 는 **한 단계 아래 보기로**(연도 → 월 → 호출부의 onExit).
20
+ * Escape 는 여기서 전파를 멈춘다 — 겹 스택(overlay)이 팝오버 자체를 닫아 버리지 않게.
21
+ */
22
+
23
+ /** 머리글·월·연도 보기의 글자. 빠진 자리는 한국어 기본으로 메운다(`resolveCalendarNavLocale`). */
24
+ interface CalendarNavLocale {
25
+ /** 달력 위 연월 캡션 (month는 1–12). */
26
+ formatCaption?: (year: number, month: number) => string;
27
+ /** 월 보기 제목 — '2026년'. */
28
+ formatYear?: (year: number) => string;
29
+ /** 월 보기의 칸 — '3월' (month는 1–12). */
30
+ formatMonth?: (month: number) => string;
31
+ /** 연도 보기 제목 — '2020~2029'(ERP 기간 구분자와 같은 물결). */
32
+ formatDecade?: (from: number, to: number) => string;
33
+ /** 이전/다음 달 버튼의 낭독 라벨 */
34
+ prevMonthLabel?: string;
35
+ nextMonthLabel?: string;
36
+ /** 이전/다음 해 — 일 보기의 `<< >>`, 월 보기의 `< >` */
37
+ prevYearLabel?: string;
38
+ nextYearLabel?: string;
39
+ /** 이전/다음 10년 — 월 보기의 `<< >>`, 연도 보기의 `< >` */
40
+ prevDecadeLabel?: string;
41
+ nextDecadeLabel?: string;
42
+ /** 이전/다음 100년 — 연도 보기의 `<< >>` */
43
+ prevCenturyLabel?: string;
44
+ nextCenturyLabel?: string;
45
+ /** 제목 버튼의 안내(title) — 누르면 넓은 보기로 간다는 뜻 */
46
+ zoomLabel?: string;
47
+ /** 월·연도 격자의 낭독 라벨 */
48
+ monthGridLabel?: string;
49
+ yearGridLabel?: string;
50
+ }
51
+ /** 네 버튼 — 큰 걸음 뒤·작은 걸음 뒤·작은 걸음 앞·큰 걸음 앞. */
52
+ type CalendarNavStep = 'prevBig' | 'prev' | 'next' | 'nextBig';
53
+
54
+ export type { CalendarNavLocale as C, CalendarNavStep as a };
@@ -1,8 +1,10 @@
1
+ import { useDismiss, usePopoverAnchor, usePortalTo, CalendarNav, KO_CALENDAR_NAV_LOCALE, CalendarZoom, anchorStyle, AnchoredPopoverStyles } from './chunk-MUXGTVEA.js';
2
+ import { tabbablesIn } from './chunk-R2ORCOTG.js';
1
3
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
2
- import { useIsMobile } from './chunk-GSM664TX.js';
3
- import { SegmentedControl, IconButton, Button, Tag, EmptyState, Icon, Badge } from './chunk-BLFJMMBW.js';
4
+ import { useIsMobile } from './chunk-TAVKGYH5.js';
5
+ import { SegmentedControl, Button, Tag, EmptyState, Icon, Badge } from './chunk-OWM7E55U.js';
4
6
  import { boxed } from './chunk-3JTBOABA.js';
5
- import { useState, useMemo } from 'react';
7
+ import { useState, useMemo, useRef, useCallback } from 'react';
6
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
9
 
8
10
  var DAY_MS = 864e5;
@@ -144,7 +146,6 @@ var EventBar = ({ segment, selected, tall = false, onSelect }) => {
144
146
  fontSize: tall ? 13 : 12,
145
147
  fontWeight: 600,
146
148
  lineHeight: 1,
147
- overflow: "hidden",
148
149
  whiteSpace: "nowrap",
149
150
  cursor: "pointer",
150
151
  textAlign: "left",
@@ -155,6 +156,7 @@ var EventBar = ({ segment, selected, tall = false, onSelect }) => {
155
156
  "button",
156
157
  {
157
158
  type: "button",
159
+ className: "wp-evcal__bar",
158
160
  title: event.title,
159
161
  "aria-pressed": selected,
160
162
  style,
@@ -185,6 +187,20 @@ var VIEW_ITEMS = [
185
187
  { value: "agenda", label: "\uC77C\uC815" }
186
188
  ];
187
189
  var VIEW_VALUES = ["month", "week", "day", "agenda"];
190
+ var VIEW_NAV = {
191
+ month: { small: "month", big: "year", keepDay: false, labels: { prevBig: "\uC774\uC804 \uD574", prev: "\uC774\uC804 \uB2EC", next: "\uB2E4\uC74C \uB2EC", nextBig: "\uB2E4\uC74C \uD574" } },
192
+ week: { small: "week", big: "month", keepDay: true, labels: { prevBig: "\uC774\uC804 \uB2EC", prev: "\uC774\uC804 \uC8FC", next: "\uB2E4\uC74C \uC8FC", nextBig: "\uB2E4\uC74C \uB2EC" } },
193
+ day: { small: "day", big: "week", keepDay: true, labels: { prevBig: "\uC774\uC804 \uC8FC", prev: "\uC774\uC804 \uB0A0", next: "\uB2E4\uC74C \uB0A0", nextBig: "\uB2E4\uC74C \uC8FC" } },
194
+ agenda: { small: "month", big: "year", keepDay: false, labels: { prevBig: "\uC774\uC804 \uD574", prev: "\uC774\uC804 \uB2EC", next: "\uB2E4\uC74C \uB2EC", nextBig: "\uB2E4\uC74C \uD574" } }
195
+ };
196
+ var addMonthsKeepDay = (ts, amount) => {
197
+ const d = new Date(ts);
198
+ const month = d.getMonth() + amount;
199
+ const lastDay = new Date(d.getFullYear(), month + 1, 0).getDate();
200
+ return new Date(d.getFullYear(), month, Math.min(d.getDate(), lastDay)).getTime();
201
+ };
202
+ var shiftBy = (ts, unit, dir, keepDay) => unit === "day" ? addDays(ts, dir) : unit === "week" ? addDays(ts, dir * 7) : (keepDay ? addMonthsKeepDay : addMonths)(ts, dir * (unit === "month" ? 1 : 12));
203
+ var ZOOM_HEIGHT = 200;
188
204
  function normalizeViews(views) {
189
205
  if (!Array.isArray(views)) return VIEW_ITEMS;
190
206
  const seen = /* @__PURE__ */ new Set();
@@ -203,13 +219,27 @@ var cellBorder = "1px solid var(--wp-border-subtle)";
203
219
  var EVCAL_CSS = `
204
220
  .wp-evcal{display:flex;flex-direction:column;gap:var(--wp-space-3);min-width:0}
205
221
  .wp-evcal__toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wp-space-2)}
222
+ .wp-evcal__tools{display:flex;align-items:center;gap:var(--wp-space-2);flex:none}
223
+ .wp-evcal__nav{display:flex;align-items:center;justify-content:center;flex:1 1 auto;min-width:0}
224
+ .wp-evcal__nav .wp-calnav{flex:0 1 auto}
225
+ .wp-evcal__nav .wp-calnav__title{min-width:7.5em}
226
+ .wp-evcal__zoom{padding:var(--wp-space-3)}
206
227
  .wp-evcal__types{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wp-space-1);margin-left:auto}
207
228
  .wp-evcal__item{display:flex;align-items:center;gap:var(--wp-space-3);width:100%;padding:var(--wp-space-3) var(--wp-space-4);border-radius:var(--wp-radius-md);cursor:pointer;text-align:left;min-width:0;transition:background var(--wp-duration-fast),border-color var(--wp-duration-fast)}
208
229
  .wp-evcal__item-bar{width:4px;height:26px;flex:none;border-radius:var(--wp-radius-pill)}
209
230
  .wp-evcal__item-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;color:var(--wp-text-strong)}
210
231
  .wp-evcal__item-meta{display:contents}
211
232
  .wp-evcal__item-range{flex:none;font-size:13px;color:var(--wp-text-muted)}
233
+ .wp-evcal__bar{overflow:hidden}
234
+ @media (pointer:coarse){
235
+ .wp-evcal__lanes{z-index:0}
236
+ .wp-evcal--month .wp-evcal__bar{position:relative;overflow:visible}
237
+ .wp-evcal--month .wp-evcal__bar::before{content:"";position:absolute;left:0;right:0;top:50%;height:32px;margin-top:-16px;z-index:-1}
238
+ }
212
239
  @media screen and (max-width:767.98px){
240
+ .wp-evcal__nav{order:-1;flex:1 1 100%}
241
+ .wp-evcal__nav .wp-calnav{flex:1 1 auto}
242
+ .wp-evcal__tools{flex:1 1 100%;justify-content:space-between}
213
243
  .wp-evcal__types{flex:1 1 100%;margin-left:0;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;padding-bottom:2px}
214
244
  .wp-evcal__types::-webkit-scrollbar{display:none}
215
245
  .wp-evcal__types>*{flex:none}
@@ -277,10 +307,30 @@ var EventCalendarImpl = ({
277
307
  () => dayEvents.filter((e) => !hiddenTypes.has(e.type)),
278
308
  [dayEvents, hiddenTypes]
279
309
  );
280
- const move = (dir) => {
281
- if (activeView === "week") setDate(addDays(anchor, dir * 7));
282
- else if (activeView === "day") setDate(addDays(anchor, dir));
283
- else setDate(addMonths(anchor, dir));
310
+ const nav = VIEW_NAV[activeView];
311
+ const step = (which) => {
312
+ const dir = which === "prev" || which === "prevBig" ? -1 : 1;
313
+ setDate(shiftBy(anchor, which === "prev" || which === "next" ? nav.small : nav.big, dir, nav.keepDay));
314
+ };
315
+ const titleRef = useRef(null);
316
+ const zoomPopRef = useRef(null);
317
+ const [zoomOpen, setZoomOpen] = useState(false);
318
+ const closeZoom = useCallback((refocus) => {
319
+ setZoomOpen(false);
320
+ if (refocus) titleRef.current?.focus();
321
+ }, []);
322
+ const dismissZoom = useCallback((reason) => closeZoom(reason === "escape"), [closeZoom]);
323
+ useDismiss(zoomOpen, titleRef, zoomPopRef, dismissZoom);
324
+ const zoomAnchor = usePopoverAnchor(zoomOpen, titleRef, zoomPopRef, ZOOM_HEIGHT);
325
+ const portal = usePortalTo();
326
+ const anchorDate = new Date(anchor);
327
+ const anchorMonthIdx = anchorDate.getFullYear() * 12 + anchorDate.getMonth();
328
+ const pickMonth = (idx) => {
329
+ const year = Math.floor(idx / 12);
330
+ const month = idx % 12;
331
+ const lastDay = new Date(year, month + 1, 0).getDate();
332
+ setDate(new Date(year, month, Math.min(anchorDate.getDate(), lastDay)).getTime());
333
+ closeZoom(true);
284
334
  };
285
335
  const headline = (() => {
286
336
  const d = new Date(anchor);
@@ -423,25 +473,30 @@ var EventCalendarImpl = ({
423
473
  };
424
474
  return /* @__PURE__ */ jsxs("div", { className: `wp-evcal wp-evcal--${activeView}`, children: [
425
475
  /* @__PURE__ */ jsxs("div", { className: "wp-evcal__toolbar", children: [
426
- /* @__PURE__ */ jsx(
427
- SegmentedControl,
428
- {
429
- items: [...viewItems],
430
- value: activeView,
431
- onChange: (v) => setView(v)
432
- }
433
- ),
434
- /* @__PURE__ */ jsx(
435
- "span",
476
+ /* @__PURE__ */ jsxs("div", { className: "wp-evcal__tools", children: [
477
+ /* @__PURE__ */ jsx(
478
+ SegmentedControl,
479
+ {
480
+ items: [...viewItems],
481
+ value: activeView,
482
+ onChange: (v) => setView(v)
483
+ }
484
+ ),
485
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => setDate(today), children: "\uC624\uB298" })
486
+ ] }),
487
+ /* @__PURE__ */ jsx("div", { className: "wp-evcal__nav", children: /* @__PURE__ */ jsx(
488
+ CalendarNav,
436
489
  {
437
- "aria-hidden": true,
438
- style: { width: 1, height: 20, background: "var(--wp-border-subtle)" }
490
+ size: "md",
491
+ title: headline,
492
+ labels: nav.labels,
493
+ onStep: step,
494
+ onZoomOut: () => zoomOpen ? closeZoom(false) : setZoomOpen(true),
495
+ zoomLabel: KO_CALENDAR_NAV_LOCALE.zoomLabel,
496
+ titleRef,
497
+ titleProps: { "aria-haspopup": "dialog", "aria-expanded": zoomOpen }
439
498
  }
440
- ),
441
- /* @__PURE__ */ jsx(IconButton, { icon: "chevron-left", label: "\uC774\uC804", onClick: () => move(-1) }),
442
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => setDate(today), children: "\uC624\uB298" }),
443
- /* @__PURE__ */ jsx(IconButton, { icon: "chevron-right", label: "\uB2E4\uC74C", onClick: () => move(1) }),
444
- /* @__PURE__ */ jsx("h3", { className: "wp-h4", style: { margin: "0 0 0 var(--wp-space-2)" }, children: headline }),
499
+ ) }),
445
500
  types && types.length > 0 && /* @__PURE__ */ jsx("span", { className: "wp-evcal__types", role: "group", "aria-label": "\uC77C\uC815 \uC720\uD615", children: types.map((t) => {
446
501
  const off = hiddenTypes.has(t.value);
447
502
  const color = dayEvents.find((e) => e.type === t.value)?.color ?? t.color;
@@ -533,7 +588,7 @@ var EventCalendarImpl = ({
533
588
  ))
534
589
  }
535
590
  ),
536
- /* @__PURE__ */ jsxs("div", { style: laneGridStyle(MONTH_BAR_TOP, MONTH_LANE_H), children: [
591
+ /* @__PURE__ */ jsxs("div", { className: "wp-evcal__lanes", style: laneGridStyle(MONTH_BAR_TOP, MONTH_LANE_H), children: [
537
592
  row.segments.map((seg) => /* @__PURE__ */ jsx(
538
593
  EventBar,
539
594
  {
@@ -726,9 +781,47 @@ var EventCalendarImpl = ({
726
781
  ]
727
782
  }
728
783
  ),
729
- /* @__PURE__ */ jsx(HoistedStyle, { id: "wp-evcal", css: EVCAL_CSS })
784
+ portal(
785
+ zoomAnchor,
786
+ /* @__PURE__ */ jsx(
787
+ "div",
788
+ {
789
+ ref: zoomPopRef,
790
+ className: "wp-anchored-pop wp-evcal__zoom",
791
+ style: anchorStyle(zoomAnchor),
792
+ role: "dialog",
793
+ "aria-label": KO_CALENDAR_NAV_LOCALE.monthGridLabel,
794
+ onBlur: (event) => {
795
+ const next = event.relatedTarget;
796
+ if (next instanceof Node && !zoomPopRef.current?.contains(next) && next !== titleRef.current) closeZoom(false);
797
+ },
798
+ onKeyDown: (event) => {
799
+ if (event.key !== "Tab" || !zoomPopRef.current) return;
800
+ const stops = tabbablesIn(zoomPopRef.current);
801
+ const at = stops.indexOf(document.activeElement);
802
+ const atEdge = event.shiftKey ? at <= 0 : at === stops.length - 1 || at < 0;
803
+ if (!atEdge) return;
804
+ event.preventDefault();
805
+ closeZoom(true);
806
+ },
807
+ children: /* @__PURE__ */ jsx(
808
+ CalendarZoom,
809
+ {
810
+ monthIndex: anchorMonthIdx,
811
+ selectedMonthIndexes: [anchorMonthIdx],
812
+ onPick: pickMonth,
813
+ onExit: () => closeZoom(true),
814
+ autoFocus: true,
815
+ locale: KO_CALENDAR_NAV_LOCALE
816
+ }
817
+ )
818
+ }
819
+ )
820
+ ),
821
+ /* @__PURE__ */ jsx(HoistedStyle, { id: "wp-evcal", css: EVCAL_CSS }),
822
+ /* @__PURE__ */ jsx(AnchoredPopoverStyles, {})
730
823
  ] });
731
824
  };
732
825
  var EventCalendar = boxed(EventCalendarImpl, "EventCalendar");
733
826
 
734
- export { EventCalendar, statusToneOf };
827
+ export { EventCalendar, VIEW_NAV, statusToneOf };
@@ -1,4 +1,4 @@
1
- import { Icon } from './chunk-BLFJMMBW.js';
1
+ import { Icon } from './chunk-OWM7E55U.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';