@optimum-intelligence/opti-ui 0.4.0 → 0.5.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 (36) hide show
  1. package/README.md +9 -7
  2. package/dist/components/app-shell/AppShell.d.ts +75 -6
  3. package/dist/components/app-shell/AppShell.js +670 -185
  4. package/dist/components/app-shell/AppShell.js.map +1 -1
  5. package/dist/components/badge/Badge.d.ts +2 -4
  6. package/dist/components/badge/Badge.js +12 -29
  7. package/dist/components/badge/Badge.js.map +1 -1
  8. package/dist/components/calendar/Calendar.d.ts +19 -8
  9. package/dist/components/calendar/Calendar.js +285 -212
  10. package/dist/components/calendar/Calendar.js.map +1 -1
  11. package/dist/components/calendar/DateConfig.d.ts +37 -0
  12. package/dist/components/calendar/DateConfig.js +75 -0
  13. package/dist/components/calendar/DateConfig.js.map +1 -0
  14. package/dist/components/calendar/date-utils.d.ts +41 -6
  15. package/dist/components/calendar/date-utils.js +119 -20
  16. package/dist/components/calendar/date-utils.js.map +1 -1
  17. package/dist/components/data-table/DataTableContent.js +3 -3
  18. package/dist/components/data-table/DataTableContent.js.map +1 -1
  19. package/dist/components/date-picker/DatePicker.d.ts +33 -10
  20. package/dist/components/date-picker/DatePicker.js +315 -279
  21. package/dist/components/date-picker/DatePicker.js.map +1 -1
  22. package/dist/components/date-picker/DateRangePicker.d.ts +11 -4
  23. package/dist/components/date-picker/DateRangePicker.js +240 -206
  24. package/dist/components/date-picker/DateRangePicker.js.map +1 -1
  25. package/dist/components/date-picker/PickerField.js +1 -1
  26. package/dist/components/date-picker/PickerField.js.map +1 -1
  27. package/dist/components/table/Table.d.ts +1 -1
  28. package/dist/components/table/Table.js +2 -2
  29. package/dist/components/table/Table.js.map +1 -1
  30. package/dist/components.json +2023 -1864
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +4 -3
  33. package/dist/llms-full.txt +869 -752
  34. package/dist/llms.txt +37 -35
  35. package/dist/opti-ui.css +171 -81
  36. package/package.json +1 -1
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { cx } from "../../utils/cx.js";
3
+ import { useDateConfig } from "./DateConfig.js";
3
4
  import { ChevronLeftIcon, ChevronRightIcon } from "../../icons/index.js";
4
- import { addDays, addMonths, clampDate, datePart, formatDate, formatDateLong, monthGrid, pad, startOfMonth, toRange, toUtcDate, todayIso, weekday } from "./date-utils.js";
5
+ import { addDays, addMonths, clampDate, datePart, formatDate, monthGrid, pad, startOfMonth, toRange, toUtcDate, todayIso, truncate, weekday } from "./date-utils.js";
5
6
  import { c } from "react/compiler-runtime";
6
7
  import * as React from "react";
7
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -35,14 +36,14 @@ function chooserItems({ mode, cursor }) {
35
36
  }
36
37
  /** Month grids, navigation and keyboard handling shared by Calendar and RangeCalendar. */
37
38
  function CalendarView(t0) {
38
- const $ = c(76);
39
+ const $ = c(92);
39
40
  let autoFocus;
40
41
  let className;
41
42
  let dayState;
42
43
  let defaultMonth;
43
44
  let isDateDisabled;
44
45
  let labels;
45
- let locale;
46
+ let localeProp;
46
47
  let max;
47
48
  let min;
48
49
  let multiselectable;
@@ -53,8 +54,9 @@ function CalendarView(t0) {
53
54
  let t1;
54
55
  let t2;
55
56
  let target;
57
+ let weekStartsOnProp;
56
58
  if ($[0] !== t0) {
57
- ({target, dayState, onPick, onPreview, multiselectable, min, max, isDateDisabled, defaultMonth, locale, weekStartsOn: t1, numberOfMonths: t2, autoFocus, labels, className, ref, ...props} = t0);
59
+ ({target, dayState, onPick, onPreview, multiselectable, min, max, isDateDisabled, defaultMonth, locale: localeProp, weekStartsOn: weekStartsOnProp, granularity: t1, numberOfMonths: t2, autoFocus, labels, className, ref, ...props} = t0);
58
60
  $[0] = t0;
59
61
  $[1] = autoFocus;
60
62
  $[2] = className;
@@ -62,7 +64,7 @@ function CalendarView(t0) {
62
64
  $[4] = defaultMonth;
63
65
  $[5] = isDateDisabled;
64
66
  $[6] = labels;
65
- $[7] = locale;
67
+ $[7] = localeProp;
66
68
  $[8] = max;
67
69
  $[9] = min;
68
70
  $[10] = multiselectable;
@@ -73,6 +75,7 @@ function CalendarView(t0) {
73
75
  $[15] = t1;
74
76
  $[16] = t2;
75
77
  $[17] = target;
78
+ $[18] = weekStartsOnProp;
76
79
  } else {
77
80
  autoFocus = $[1];
78
81
  className = $[2];
@@ -80,7 +83,7 @@ function CalendarView(t0) {
80
83
  defaultMonth = $[4];
81
84
  isDateDisabled = $[5];
82
85
  labels = $[6];
83
- locale = $[7];
86
+ localeProp = $[7];
84
87
  max = $[8];
85
88
  min = $[9];
86
89
  multiselectable = $[10];
@@ -91,86 +94,127 @@ function CalendarView(t0) {
91
94
  t1 = $[15];
92
95
  t2 = $[16];
93
96
  target = $[17];
97
+ weekStartsOnProp = $[18];
94
98
  }
95
- const weekStartsOn = t1 === void 0 ? 1 : t1;
99
+ const granularity = t1 === void 0 ? "day" : t1;
96
100
  const numberOfMonths = t2 === void 0 ? 1 : t2;
101
+ const config = useDateConfig();
102
+ const locale = localeProp ?? config.locale;
103
+ const weekStartsOn = weekStartsOnProp ?? config.weekStartsOn ?? 1;
97
104
  let t3;
98
- if ($[18] !== labels) {
105
+ if ($[19] !== labels) {
99
106
  t3 = {
100
107
  ...defaultLabels,
101
108
  ...labels
102
109
  };
103
- $[18] = labels;
104
- $[19] = t3;
105
- } else t3 = $[19];
110
+ $[19] = labels;
111
+ $[20] = t3;
112
+ } else t3 = $[20];
106
113
  const text = t3;
107
- const count = Math.max(1, Math.floor(numberOfMonths));
114
+ const count = granularity === "day" ? Math.max(1, Math.floor(numberOfMonths)) : 1;
108
115
  const [today] = React.useState(todayIso);
109
116
  let t4;
110
- if ($[20] !== defaultMonth || $[21] !== max || $[22] !== min || $[23] !== target || $[24] !== today) {
117
+ if ($[21] !== defaultMonth || $[22] !== max || $[23] !== min || $[24] !== target || $[25] !== today) {
111
118
  t4 = () => clampDate(target ?? datePart(defaultMonth) ?? today, min, max);
112
- $[20] = defaultMonth;
113
- $[21] = max;
114
- $[22] = min;
115
- $[23] = target;
116
- $[24] = today;
117
- $[25] = t4;
118
- } else t4 = $[25];
119
+ $[21] = defaultMonth;
120
+ $[22] = max;
121
+ $[23] = min;
122
+ $[24] = target;
123
+ $[25] = today;
124
+ $[26] = t4;
125
+ } else t4 = $[26];
119
126
  const [focused, setFocused] = React.useState(t4);
120
127
  let t5;
121
- if ($[26] !== focused) {
128
+ if ($[27] !== focused) {
122
129
  t5 = () => startOfMonth(focused);
123
- $[26] = focused;
124
- $[27] = t5;
125
- } else t5 = $[27];
130
+ $[27] = focused;
131
+ $[28] = t5;
132
+ } else t5 = $[28];
126
133
  const [view, setView] = React.useState(t5);
127
134
  const monthsRef = React.useRef(null);
128
135
  const moveFocus = React.useRef(Boolean(autoFocus));
129
136
  const titleId = React.useId();
130
- const [chooser, setChooser] = React.useState(null);
137
+ const t6 = min ?? "0001-01-01";
138
+ let t7;
139
+ if ($[29] !== t6) {
140
+ t7 = startOfMonth(t6);
141
+ $[29] = t6;
142
+ $[30] = t7;
143
+ } else t7 = $[30];
144
+ const earliest = t7;
145
+ const t8 = max ?? "9999-12-01";
146
+ let t9;
147
+ if ($[31] !== t8) {
148
+ t9 = startOfMonth(t8);
149
+ $[31] = t8;
150
+ $[32] = t9;
151
+ } else t9 = $[32];
152
+ const latest = t9;
153
+ let t10;
154
+ if ($[33] !== earliest || $[34] !== granularity || $[35] !== latest) {
155
+ t10 = (cursor) => granularity === "day" ? null : {
156
+ index: 0,
157
+ mode: granularity === "year" ? "years" : "months",
158
+ cursor: clampDate(startOfMonth(cursor), earliest, latest)
159
+ };
160
+ $[33] = earliest;
161
+ $[34] = granularity;
162
+ $[35] = latest;
163
+ $[36] = t10;
164
+ } else t10 = $[36];
165
+ const baseChooser = t10;
166
+ let t11;
167
+ if ($[37] !== baseChooser || $[38] !== focused) {
168
+ t11 = () => baseChooser(focused);
169
+ $[37] = baseChooser;
170
+ $[38] = focused;
171
+ $[39] = t11;
172
+ } else t11 = $[39];
173
+ const [chooser, setChooser] = React.useState(t11);
131
174
  const [seen, setSeen] = React.useState(target);
132
175
  if (target !== seen) {
133
176
  setSeen(target);
134
177
  if (target) {
135
178
  setFocused(target);
136
179
  setView(reveal(view, target, count));
180
+ if (granularity !== "day") setChooser(baseChooser(target));
137
181
  }
138
182
  }
139
- let t6;
140
- if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
141
- t6 = () => {
183
+ let t12;
184
+ if ($[40] === Symbol.for("react.memo_cache_sentinel")) {
185
+ t12 = () => {
142
186
  if (!moveFocus.current) return;
143
187
  moveFocus.current = false;
144
188
  const months = monthsRef.current;
145
189
  (months?.querySelector(".oui-calendar__choice[tabindex=\"0\"]") ?? months?.querySelector("[tabindex=\"0\"]"))?.focus();
146
190
  };
147
- $[28] = t6;
148
- } else t6 = $[28];
149
- let t7;
150
- if ($[29] !== chooser || $[30] !== focused) {
151
- t7 = [focused, chooser];
152
- $[29] = chooser;
153
- $[30] = focused;
154
- $[31] = t7;
155
- } else t7 = $[31];
156
- React.useEffect(t6, t7);
157
- let t8;
158
- if ($[32] !== isDateDisabled || $[33] !== max || $[34] !== min) {
159
- t8 = (date) => Boolean(min && date < min || max && date > max || isDateDisabled?.(date));
160
- $[32] = isDateDisabled;
161
- $[33] = max;
162
- $[34] = min;
163
- $[35] = t8;
164
- } else t8 = $[35];
165
- const disabled = t8;
166
- let t10;
167
- let t11;
168
- let t12;
191
+ $[40] = t12;
192
+ } else t12 = $[40];
169
193
  let t13;
194
+ if ($[41] !== chooser || $[42] !== focused) {
195
+ t13 = [focused, chooser];
196
+ $[41] = chooser;
197
+ $[42] = focused;
198
+ $[43] = t13;
199
+ } else t13 = $[43];
200
+ React.useEffect(t12, t13);
170
201
  let t14;
202
+ if ($[44] !== isDateDisabled || $[45] !== max || $[46] !== min) {
203
+ t14 = (date) => Boolean(min && date < min || max && date > max || isDateDisabled?.(date));
204
+ $[44] = isDateDisabled;
205
+ $[45] = max;
206
+ $[46] = min;
207
+ $[47] = t14;
208
+ } else t14 = $[47];
209
+ const disabled = t14;
171
210
  let t15;
172
- let t9;
173
- if ($[36] !== chooser || $[37] !== className || $[38] !== count || $[39] !== dayState || $[40] !== disabled || $[41] !== focused || $[42] !== locale || $[43] !== max || $[44] !== min || $[45] !== multiselectable || $[46] !== onPick || $[47] !== onPreview || $[48] !== props || $[49] !== ref || $[50] !== text || $[51] !== titleId || $[52] !== today || $[53] !== view || $[54] !== weekStartsOn) {
211
+ let t16;
212
+ let t17;
213
+ let t18;
214
+ let t19;
215
+ let t20;
216
+ let t21;
217
+ if ($[48] !== baseChooser || $[49] !== chooser || $[50] !== className || $[51] !== count || $[52] !== dayState || $[53] !== disabled || $[54] !== earliest || $[55] !== focused || $[56] !== granularity || $[57] !== latest || $[58] !== locale || $[59] !== max || $[60] !== min || $[61] !== multiselectable || $[62] !== onPick || $[63] !== onPreview || $[64] !== props || $[65] !== ref || $[66] !== text || $[67] !== titleId || $[68] !== today || $[69] !== view || $[70] !== weekStartsOn) {
174
218
  const formats = {
175
219
  monthLong: new Intl.DateTimeFormat(locale, {
176
220
  month: "long",
@@ -187,6 +231,10 @@ function CalendarView(t0) {
187
231
  weekdayLong: new Intl.DateTimeFormat(locale, {
188
232
  weekday: "long",
189
233
  timeZone: "UTC"
234
+ }),
235
+ dayLong: new Intl.DateTimeFormat(locale, {
236
+ dateStyle: "full",
237
+ timeZone: "UTC"
190
238
  })
191
239
  };
192
240
  const yearText = _temp;
@@ -224,19 +272,17 @@ function CalendarView(t0) {
224
272
  const day = go(move());
225
273
  onPreview?.(day);
226
274
  };
227
- const earliest = startOfMonth(min ?? "0001-01-01");
228
- const latest = startOfMonth(max ?? "9999-12-01");
229
- const openChooser = (index, mode, cursor) => {
275
+ const openChooser = (index, mode, cursor_0) => {
230
276
  moveFocus.current = true;
231
277
  setChooser({
232
278
  index,
233
279
  mode,
234
- cursor: clampDate(cursor, earliest, latest)
280
+ cursor: clampDate(cursor_0, earliest, latest)
235
281
  });
236
282
  };
237
283
  const closeChooser = () => {
238
284
  moveFocus.current = true;
239
- setChooser(null);
285
+ setChooser(baseChooser(chooser?.cursor ?? focused));
240
286
  };
241
287
  const moveChooser = (current, amount_0, focus) => {
242
288
  const step = current.mode === "months" ? amount_0 : amount_0 * 12;
@@ -248,6 +294,11 @@ function CalendarView(t0) {
248
294
  });
249
295
  };
250
296
  const choose = (current_0, date_3) => {
297
+ if (granularity !== "day" && current_0.mode === (granularity === "year" ? "years" : "months")) {
298
+ setFocused(date_3);
299
+ onPick(date_3);
300
+ return;
301
+ }
251
302
  if (current_0.mode === "years") {
252
303
  openChooser(current_0.index, "months", date_3);
253
304
  return;
@@ -259,7 +310,7 @@ function CalendarView(t0) {
259
310
  setChooser(null);
260
311
  };
261
312
  const onChooserKeyDown = (current_1) => (event_0) => {
262
- if (event_0.key === "Escape") {
313
+ if (event_0.key === "Escape" && !(granularity === "year" || granularity === "month" && current_1.mode === "months")) {
263
314
  event_0.preventDefault();
264
315
  event_0.stopPropagation();
265
316
  closeChooser();
@@ -280,21 +331,21 @@ function CalendarView(t0) {
280
331
  const months_0 = Array.from({ length: count }, (_, index_0) => addMonths(view, index_0));
281
332
  const previous = addDays(view, -1);
282
333
  const following = addMonths(view, count);
283
- t13 = ref;
284
- if ($[62] !== className) {
285
- t14 = cx("oui-calendar", className);
286
- $[62] = className;
287
- $[63] = t14;
288
- } else t14 = $[63];
289
- t15 = props;
290
- t9 = monthsRef;
291
- t10 = "oui-calendar__months";
292
- if ($[64] !== onPreview) {
293
- t11 = onPreview ? () => onPreview(null) : void 0;
294
- $[64] = onPreview;
295
- $[65] = t11;
296
- } else t11 = $[65];
297
- t12 = months_0.map((first, index_1) => {
334
+ t19 = ref;
335
+ if ($[78] !== className) {
336
+ t20 = cx("oui-calendar", className);
337
+ $[78] = className;
338
+ $[79] = t20;
339
+ } else t20 = $[79];
340
+ t21 = props;
341
+ t15 = monthsRef;
342
+ t16 = "oui-calendar__months";
343
+ if ($[80] !== onPreview) {
344
+ t17 = onPreview ? () => onPreview(null) : void 0;
345
+ $[80] = onPreview;
346
+ $[81] = t17;
347
+ } else t17 = $[81];
348
+ t18 = months_0.map((first, index_1) => {
298
349
  const days = monthGrid(first, weekStartsOn);
299
350
  const month = first.slice(0, 7);
300
351
  const weeks = Array.from({ length: 6 }, (__0, week) => days.slice(week * 7, week * 7 + 7));
@@ -373,17 +424,22 @@ function CalendarView(t0) {
373
424
  const unit = choosing.mode === "months" ? 7 : 4;
374
425
  const key = date_4.slice(0, unit);
375
426
  const unavailable = key < earliest.slice(0, unit) || key > latest.slice(0, unit);
376
- const shown = key === first.slice(0, unit);
427
+ const picking = granularity !== "day" && choosing.mode === (granularity === "year" ? "years" : "months");
428
+ const state = picking ? dayState(unit === 4 ? `${key}-01-01` : `${key}-01`) : { selected: key === first.slice(0, unit) };
377
429
  return /* @__PURE__ */ jsx("button", {
378
430
  type: "button",
379
431
  className: "oui-calendar__choice",
380
432
  tabIndex: key === choosing.cursor.slice(0, unit) ? 0 : -1,
381
- "aria-pressed": shown,
433
+ "aria-pressed": Boolean(state.selected || state.inRange),
382
434
  "aria-disabled": unavailable || void 0,
383
- "data-selected": shown ? "" : void 0,
435
+ "data-selected": state.selected ? "" : void 0,
436
+ "data-in-range": state.inRange ? "" : void 0,
437
+ "data-range-start": state.rangeStart ? "" : void 0,
438
+ "data-range-end": state.rangeEnd ? "" : void 0,
384
439
  "data-today": key === today.slice(0, unit) ? "" : void 0,
385
440
  "data-disabled": unavailable ? "" : void 0,
386
441
  onClick: unavailable ? void 0 : () => choose(choosing, date_4),
442
+ onPointerEnter: picking && onPreview ? () => onPreview(unit === 4 ? `${key}-01-01` : `${key}-01`) : void 0,
387
443
  children: choosing.mode === "months" ? formats.month.format(toUtcDate(date_4)) : yearText(date_4)
388
444
  }, date_4);
389
445
  })
@@ -411,20 +467,20 @@ function CalendarView(t0) {
411
467
  role: "gridcell",
412
468
  className: "oui-calendar__blank"
413
469
  }, date_6);
414
- const state = dayState(date_6);
470
+ const state_0 = dayState(date_6);
415
471
  return /* @__PURE__ */ jsx("button", {
416
472
  type: "button",
417
473
  role: "gridcell",
418
474
  className: "oui-calendar__day",
419
475
  tabIndex: date_6 === focused ? 0 : -1,
420
- "aria-label": `${formatDateLong(date_6, locale)}, ${formats.weekdayLong.format(toUtcDate(date_6))}`,
421
- "aria-selected": Boolean(state.selected || state.inRange),
476
+ "aria-label": formats.dayLong.format(toUtcDate(date_6)),
477
+ "aria-selected": Boolean(state_0.selected || state_0.inRange),
422
478
  "aria-current": date_6 === today ? "date" : void 0,
423
479
  "aria-disabled": disabled(date_6) || void 0,
424
- "data-selected": state.selected ? "" : void 0,
425
- "data-in-range": state.inRange ? "" : void 0,
426
- "data-range-start": state.rangeStart ? "" : void 0,
427
- "data-range-end": state.rangeEnd ? "" : void 0,
480
+ "data-selected": state_0.selected ? "" : void 0,
481
+ "data-in-range": state_0.inRange ? "" : void 0,
482
+ "data-range-start": state_0.rangeStart ? "" : void 0,
483
+ "data-range-end": state_0.rangeEnd ? "" : void 0,
428
484
  "data-today": date_6 === today ? "" : void 0,
429
485
  "data-outside": outside ? "" : void 0,
430
486
  "data-disabled": disabled(date_6) ? "" : void 0,
@@ -437,81 +493,94 @@ function CalendarView(t0) {
437
493
  })]
438
494
  }, month);
439
495
  });
440
- $[36] = chooser;
441
- $[37] = className;
442
- $[38] = count;
443
- $[39] = dayState;
444
- $[40] = disabled;
445
- $[41] = focused;
446
- $[42] = locale;
447
- $[43] = max;
448
- $[44] = min;
449
- $[45] = multiselectable;
450
- $[46] = onPick;
451
- $[47] = onPreview;
452
- $[48] = props;
453
- $[49] = ref;
454
- $[50] = text;
455
- $[51] = titleId;
456
- $[52] = today;
457
- $[53] = view;
458
- $[54] = weekStartsOn;
459
- $[55] = t10;
460
- $[56] = t11;
461
- $[57] = t12;
462
- $[58] = t13;
463
- $[59] = t14;
464
- $[60] = t15;
465
- $[61] = t9;
496
+ $[48] = baseChooser;
497
+ $[49] = chooser;
498
+ $[50] = className;
499
+ $[51] = count;
500
+ $[52] = dayState;
501
+ $[53] = disabled;
502
+ $[54] = earliest;
503
+ $[55] = focused;
504
+ $[56] = granularity;
505
+ $[57] = latest;
506
+ $[58] = locale;
507
+ $[59] = max;
508
+ $[60] = min;
509
+ $[61] = multiselectable;
510
+ $[62] = onPick;
511
+ $[63] = onPreview;
512
+ $[64] = props;
513
+ $[65] = ref;
514
+ $[66] = text;
515
+ $[67] = titleId;
516
+ $[68] = today;
517
+ $[69] = view;
518
+ $[70] = weekStartsOn;
519
+ $[71] = t15;
520
+ $[72] = t16;
521
+ $[73] = t17;
522
+ $[74] = t18;
523
+ $[75] = t19;
524
+ $[76] = t20;
525
+ $[77] = t21;
466
526
  } else {
467
- t10 = $[55];
468
- t11 = $[56];
469
- t12 = $[57];
470
- t13 = $[58];
471
- t14 = $[59];
472
- t15 = $[60];
473
- t9 = $[61];
527
+ t15 = $[71];
528
+ t16 = $[72];
529
+ t17 = $[73];
530
+ t18 = $[74];
531
+ t19 = $[75];
532
+ t20 = $[76];
533
+ t21 = $[77];
474
534
  }
475
- let t16;
476
- if ($[66] !== t10 || $[67] !== t11 || $[68] !== t12 || $[69] !== t9) {
477
- t16 = /* @__PURE__ */ jsx("div", {
478
- ref: t9,
479
- className: t10,
480
- onPointerLeave: t11,
481
- children: t12
535
+ let t22;
536
+ if ($[82] !== t15 || $[83] !== t16 || $[84] !== t17 || $[85] !== t18) {
537
+ t22 = /* @__PURE__ */ jsx("div", {
538
+ ref: t15,
539
+ className: t16,
540
+ onPointerLeave: t17,
541
+ children: t18
482
542
  });
483
- $[66] = t10;
484
- $[67] = t11;
485
- $[68] = t12;
486
- $[69] = t9;
487
- $[70] = t16;
488
- } else t16 = $[70];
489
- let t17;
490
- if ($[71] !== t13 || $[72] !== t14 || $[73] !== t15 || $[74] !== t16) {
491
- t17 = /* @__PURE__ */ jsx("div", {
492
- ref: t13,
493
- className: t14,
494
- ...t15,
495
- children: t16
543
+ $[82] = t15;
544
+ $[83] = t16;
545
+ $[84] = t17;
546
+ $[85] = t18;
547
+ $[86] = t22;
548
+ } else t22 = $[86];
549
+ let t23;
550
+ if ($[87] !== t19 || $[88] !== t20 || $[89] !== t21 || $[90] !== t22) {
551
+ t23 = /* @__PURE__ */ jsx("div", {
552
+ ref: t19,
553
+ className: t20,
554
+ ...t21,
555
+ children: t22
496
556
  });
497
- $[71] = t13;
498
- $[72] = t14;
499
- $[73] = t15;
500
- $[74] = t16;
501
- $[75] = t17;
502
- } else t17 = $[75];
503
- return t17;
557
+ $[87] = t19;
558
+ $[88] = t20;
559
+ $[89] = t21;
560
+ $[90] = t22;
561
+ $[91] = t23;
562
+ } else t23 = $[91];
563
+ return t23;
504
564
  }
505
565
  function _temp(date_0) {
506
566
  return String(yearOf(date_0));
507
567
  }
568
+ /** A date cut down to the calendar's unit, or `null`. */
569
+ var cut = (value, granularity = "day") => {
570
+ const date = datePart(value);
571
+ return date && truncate(date, granularity);
572
+ };
508
573
  /**
509
574
  * Month grid for picking one day. Keyboard: arrows move by day / week,
510
575
  * Home / End jump within the week, PageUp / PageDown change month (with Shift: year).
511
576
  * The month and year in the title open a list to jump straight to another one.
577
+ * With `granularity="month"` or `"year"` it shows a month or year grid instead.
578
+ *
579
+ * @example
580
+ * <Calendar value={month} onValueChange={setMonth} granularity="month" />
512
581
  */
513
582
  function Calendar(t0) {
514
- const $ = c(19);
583
+ const $ = c(21);
515
584
  let onValueChange;
516
585
  let props;
517
586
  let t1;
@@ -531,59 +600,62 @@ function Calendar(t0) {
531
600
  }
532
601
  const defaultValue = t1 === void 0 ? null : t1;
533
602
  let t2;
534
- if ($[5] !== defaultValue) {
535
- t2 = () => datePart(defaultValue);
603
+ if ($[5] !== defaultValue || $[6] !== props) {
604
+ t2 = () => cut(defaultValue, props.granularity);
536
605
  $[5] = defaultValue;
537
- $[6] = t2;
538
- } else t2 = $[6];
606
+ $[6] = props;
607
+ $[7] = t2;
608
+ } else t2 = $[7];
539
609
  const [inner, setInner] = React.useState(t2);
540
610
  let t3;
541
- if ($[7] !== inner || $[8] !== value) {
542
- t3 = value === void 0 ? inner : datePart(value);
543
- $[7] = inner;
544
- $[8] = value;
545
- $[9] = t3;
546
- } else t3 = $[9];
611
+ if ($[8] !== inner || $[9] !== props || $[10] !== value) {
612
+ t3 = value === void 0 ? inner : cut(value, props.granularity);
613
+ $[8] = inner;
614
+ $[9] = props;
615
+ $[10] = value;
616
+ $[11] = t3;
617
+ } else t3 = $[11];
547
618
  const selected = t3;
548
619
  let t4;
549
- if ($[10] !== selected) {
620
+ if ($[12] !== selected) {
550
621
  t4 = (date) => ({ selected: date === selected });
551
- $[10] = selected;
552
- $[11] = t4;
553
- } else t4 = $[11];
622
+ $[12] = selected;
623
+ $[13] = t4;
624
+ } else t4 = $[13];
554
625
  let t5;
555
- if ($[12] !== onValueChange) {
626
+ if ($[14] !== onValueChange) {
556
627
  t5 = (date_0) => {
557
628
  setInner(date_0);
558
629
  onValueChange?.(date_0);
559
630
  };
560
- $[12] = onValueChange;
561
- $[13] = t5;
562
- } else t5 = $[13];
631
+ $[14] = onValueChange;
632
+ $[15] = t5;
633
+ } else t5 = $[15];
563
634
  let t6;
564
- if ($[14] !== props || $[15] !== selected || $[16] !== t4 || $[17] !== t5) {
635
+ if ($[16] !== props || $[17] !== selected || $[18] !== t4 || $[19] !== t5) {
565
636
  t6 = /* @__PURE__ */ jsx(CalendarView, {
566
637
  target: selected,
567
638
  dayState: t4,
568
639
  ...props,
569
640
  onPick: t5
570
641
  });
571
- $[14] = props;
572
- $[15] = selected;
573
- $[16] = t4;
574
- $[17] = t5;
575
- $[18] = t6;
576
- } else t6 = $[18];
642
+ $[16] = props;
643
+ $[17] = selected;
644
+ $[18] = t4;
645
+ $[19] = t5;
646
+ $[20] = t6;
647
+ } else t6 = $[20];
577
648
  return t6;
578
649
  }
579
650
  var rangeKey = (range) => range ? `${range.start}/${range.end}` : "";
651
+ var cutRange = (range, granularity) => toRange(cut(range?.start, granularity), cut(range?.end, granularity));
580
652
  /**
581
653
  * Month grid for picking a range of days: the first pick sets one end, the
582
654
  * second completes the range (in either order). Same keyboard as Calendar.
583
655
  * Disabled days cannot be picked as an end but may fall inside a range.
584
656
  */
585
657
  function RangeCalendar(t0) {
586
- const $ = c(31);
658
+ const $ = c(32);
587
659
  let onValueChange;
588
660
  let props;
589
661
  let t1;
@@ -603,38 +675,39 @@ function RangeCalendar(t0) {
603
675
  }
604
676
  const defaultValue = t1 === void 0 ? null : t1;
605
677
  let t2;
606
- if ($[5] !== defaultValue?.end || $[6] !== defaultValue?.start) {
607
- t2 = () => toRange(defaultValue?.start, defaultValue?.end);
608
- $[5] = defaultValue?.end;
609
- $[6] = defaultValue?.start;
678
+ if ($[5] !== defaultValue || $[6] !== props) {
679
+ t2 = () => cutRange(defaultValue, props.granularity);
680
+ $[5] = defaultValue;
681
+ $[6] = props;
610
682
  $[7] = t2;
611
683
  } else t2 = $[7];
612
684
  const [inner, setInner] = React.useState(t2);
613
685
  let t3;
614
- if ($[8] !== inner || $[9] !== value) {
615
- t3 = value === void 0 ? inner : toRange(value?.start, value?.end);
686
+ if ($[8] !== inner || $[9] !== props || $[10] !== value) {
687
+ t3 = value === void 0 ? inner : cutRange(value, props.granularity);
616
688
  $[8] = inner;
617
- $[9] = value;
618
- $[10] = t3;
619
- } else t3 = $[10];
689
+ $[9] = props;
690
+ $[10] = value;
691
+ $[11] = t3;
692
+ } else t3 = $[11];
620
693
  const range = t3;
621
694
  const [anchor, setAnchor] = React.useState(null);
622
695
  const [preview, setPreview] = React.useState(null);
623
696
  let t4;
624
- if ($[11] !== anchor || $[12] !== preview || $[13] !== range) {
697
+ if ($[12] !== anchor || $[13] !== preview || $[14] !== range) {
625
698
  t4 = anchor ? toRange(anchor, preview ?? anchor) : range;
626
- $[11] = anchor;
627
- $[12] = preview;
628
- $[13] = range;
629
- $[14] = t4;
630
- } else t4 = $[14];
699
+ $[12] = anchor;
700
+ $[13] = preview;
701
+ $[14] = range;
702
+ $[15] = t4;
703
+ } else t4 = $[15];
631
704
  const shown = t4;
632
705
  let t5;
633
- if ($[15] !== range) {
706
+ if ($[16] !== range) {
634
707
  t5 = () => rangeKey(range);
635
- $[15] = range;
636
- $[16] = t5;
637
- } else t5 = $[16];
708
+ $[16] = range;
709
+ $[17] = t5;
710
+ } else t5 = $[17];
638
711
  const [seen, setSeen] = React.useState(t5);
639
712
  const [target, setTarget] = React.useState(range?.start ?? null);
640
713
  if (rangeKey(range) !== seen) {
@@ -642,7 +715,7 @@ function RangeCalendar(t0) {
642
715
  setTarget(range?.start ?? null);
643
716
  }
644
717
  let t6;
645
- if ($[17] !== anchor || $[18] !== onValueChange) {
718
+ if ($[18] !== anchor || $[19] !== onValueChange) {
646
719
  t6 = (date) => {
647
720
  if (!anchor) {
648
721
  setAnchor(date);
@@ -657,33 +730,33 @@ function RangeCalendar(t0) {
657
730
  setSeen(rangeKey(next));
658
731
  onValueChange?.(next);
659
732
  };
660
- $[17] = anchor;
661
- $[18] = onValueChange;
662
- $[19] = t6;
663
- } else t6 = $[19];
733
+ $[18] = anchor;
734
+ $[19] = onValueChange;
735
+ $[20] = t6;
736
+ } else t6 = $[20];
664
737
  const select = t6;
665
738
  const t7 = anchor ? "" : void 0;
666
739
  let t8;
667
- if ($[20] !== shown) {
740
+ if ($[21] !== shown) {
668
741
  t8 = (date_0) => shown ? {
669
742
  selected: date_0 === shown.start || date_0 === shown.end,
670
743
  inRange: date_0 >= shown.start && date_0 <= shown.end,
671
744
  rangeStart: date_0 === shown.start,
672
745
  rangeEnd: date_0 === shown.end
673
746
  } : {};
674
- $[20] = shown;
675
- $[21] = t8;
676
- } else t8 = $[21];
747
+ $[21] = shown;
748
+ $[22] = t8;
749
+ } else t8 = $[22];
677
750
  let t9;
678
- if ($[22] !== anchor) {
751
+ if ($[23] !== anchor) {
679
752
  t9 = (date_1) => {
680
753
  if (anchor) setPreview(date_1);
681
754
  };
682
- $[22] = anchor;
683
- $[23] = t9;
684
- } else t9 = $[23];
755
+ $[23] = anchor;
756
+ $[24] = t9;
757
+ } else t9 = $[24];
685
758
  let t10;
686
- if ($[24] !== props || $[25] !== select || $[26] !== t7 || $[27] !== t8 || $[28] !== t9 || $[29] !== target) {
759
+ if ($[25] !== props || $[26] !== select || $[27] !== t7 || $[28] !== t8 || $[29] !== t9 || $[30] !== target) {
687
760
  t10 = /* @__PURE__ */ jsx(CalendarView, {
688
761
  multiselectable: true,
689
762
  "data-selecting": t7,
@@ -693,17 +766,17 @@ function RangeCalendar(t0) {
693
766
  onPick: select,
694
767
  onPreview: t9
695
768
  });
696
- $[24] = props;
697
- $[25] = select;
698
- $[26] = t7;
699
- $[27] = t8;
700
- $[28] = t9;
701
- $[29] = target;
702
- $[30] = t10;
703
- } else t10 = $[30];
769
+ $[25] = props;
770
+ $[26] = select;
771
+ $[27] = t7;
772
+ $[28] = t8;
773
+ $[29] = t9;
774
+ $[30] = target;
775
+ $[31] = t10;
776
+ } else t10 = $[31];
704
777
  return t10;
705
778
  }
706
779
  //#endregion
707
- export { Calendar, RangeCalendar, formatDate, formatDateLong };
780
+ export { Calendar, RangeCalendar, formatDate };
708
781
 
709
782
  //# sourceMappingURL=Calendar.js.map