hs-uix 2.1.1 → 2.2.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 (49) hide show
  1. package/README.md +3 -1
  2. package/common-components.d.ts +319 -68
  3. package/dist/calendar.js +355 -57
  4. package/dist/calendar.mjs +356 -57
  5. package/dist/common-components.js +3546 -88
  6. package/dist/common-components.mjs +3530 -84
  7. package/dist/datatable.js +108 -18
  8. package/dist/datatable.mjs +108 -18
  9. package/dist/experimental.js +2876 -0
  10. package/dist/experimental.mjs +2883 -0
  11. package/dist/feed.js +267 -38
  12. package/dist/feed.mjs +260 -37
  13. package/dist/filter.js +1379 -0
  14. package/dist/filter.mjs +1334 -0
  15. package/dist/form.js +222 -26
  16. package/dist/form.mjs +227 -27
  17. package/dist/index.js +3208 -287
  18. package/dist/index.mjs +3156 -283
  19. package/dist/kanban.js +282 -62
  20. package/dist/kanban.mjs +273 -61
  21. package/dist/safe.js +9207 -0
  22. package/dist/safe.mjs +9298 -0
  23. package/dist/utils.js +491 -75
  24. package/dist/utils.mjs +491 -75
  25. package/experimental.d.ts +1 -0
  26. package/filter.d.ts +1 -0
  27. package/index.d.ts +45 -3
  28. package/package.json +19 -1
  29. package/safe.d.ts +1 -0
  30. package/src/calendar/README.md +74 -5
  31. package/src/calendar/index.d.ts +95 -1
  32. package/src/common-components/README.md +140 -1
  33. package/src/datatable/README.md +0 -2
  34. package/src/experimental/README.md +126 -0
  35. package/src/experimental/index.d.ts +346 -0
  36. package/src/feed/README.md +69 -0
  37. package/src/feed/index.d.ts +103 -0
  38. package/src/filter/README.md +148 -0
  39. package/src/filter/index.d.ts +221 -0
  40. package/src/form/README.md +132 -4
  41. package/src/form/index.d.ts +82 -1
  42. package/src/kanban/README.md +119 -6
  43. package/src/kanban/index.d.ts +153 -2
  44. package/src/safe/README.md +108 -0
  45. package/src/safe/index.d.ts +158 -0
  46. package/src/utils/README.md +39 -0
  47. package/src/wizard/README.md +158 -0
  48. package/src/wizard/index.d.ts +138 -0
  49. package/utils.d.ts +17 -0
package/dist/calendar.js CHANGED
@@ -343,7 +343,7 @@ var GENERATED_ICONS = {
343
343
  "ZoomOut": { "viewBox": "0 0 32 32", "paths": ["M14.42 26.75c2.85 0 5.47-.97 7.56-2.6l-.03.02 5.28 5.34a1.619 1.619 0 0 0 2.76-1.15c0-.45-.18-.85-.47-1.14l-5.33-5.33c1.59-2.06 2.55-4.68 2.55-7.52C26.74 7.54 21.2 2 14.37 2S2 7.55 2 14.38s5.54 12.37 12.37 12.37h.05m0-21.55c5.06 0 9.16 4.1 9.16 9.16s-4.1 9.16-9.16 9.16-9.16-4.1-9.16-9.16c.01-5.05 4.11-9.14 9.16-9.15Zm-4.31 10.78h8.62c.89 0 1.62-.72 1.62-1.62s-.72-1.62-1.62-1.62h-8.62c-.89 0-1.62.72-1.62 1.62s.72 1.62 1.62 1.62"] }
344
344
  };
345
345
 
346
- // src/common-components/Icon.js
346
+ // src/common-components/nativeIconNames.js
347
347
  var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
348
348
  "add",
349
349
  "appointment",
@@ -355,12 +355,12 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
355
355
  "block",
356
356
  "book",
357
357
  "bulb",
358
+ "callTranscript",
358
359
  "calling",
359
360
  "callingHangup",
360
361
  "callingMade",
361
362
  "callingMissed",
362
363
  "callingVoicemail",
363
- "callTranscript",
364
364
  "campaigns",
365
365
  "cap",
366
366
  "checkCircle",
@@ -389,13 +389,13 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
389
389
  "enroll",
390
390
  "exclamation",
391
391
  "exclamationCircle",
392
- "facebook",
393
392
  "faceHappy",
394
393
  "faceHappyFilled",
395
394
  "faceNeutral",
396
395
  "faceNeutralFilled",
397
396
  "faceSad",
398
397
  "faceSadFilled",
398
+ "facebook",
399
399
  "favoriteHollow",
400
400
  "file",
401
401
  "filledXCircleIcon",
@@ -536,6 +536,8 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
536
536
  "zoomIn",
537
537
  "zoomOut"
538
538
  ]);
539
+
540
+ // src/common-components/Icon.js
539
541
  var NATIVE_COLORS = /* @__PURE__ */ new Set(["inherit", "alert", "warning", "success"]);
540
542
  var NATIVE_SIZE_TOKENS = {
541
543
  sm: "sm",
@@ -748,6 +750,7 @@ var CollectionFilterControl = ({
748
750
  { key: name, direction: "row", align: "center", gap: "xs" },
749
751
  h2(import_ui_extensions3.DateInput, {
750
752
  name: `${controlName}-from`,
753
+ label: filter.fromLabel ?? labels.dateFrom,
751
754
  placeholder: filter.fromLabel ?? labels.dateFrom,
752
755
  format: "medium",
753
756
  value: rangeValue.from ?? null,
@@ -756,6 +759,7 @@ var CollectionFilterControl = ({
756
759
  h2(Icon, { name: "right", size: "sm" }),
757
760
  h2(import_ui_extensions3.DateInput, {
758
761
  name: `${controlName}-to`,
762
+ label: filter.toLabel ?? labels.dateTo,
759
763
  placeholder: filter.toLabel ?? labels.dateTo,
760
764
  format: "medium",
761
765
  value: rangeValue.to ?? null,
@@ -1229,9 +1233,172 @@ var makeSpacerDataUri = (height = 24, width = 4) => {
1229
1233
  return { src: toDataUri(svg), width, height };
1230
1234
  };
1231
1235
 
1236
+ // src/calendar/rescheduleUtils.js
1237
+ var shiftDate = (date, shift) => {
1238
+ const d = toDate(date);
1239
+ if (!d) return null;
1240
+ if (!shift || typeof shift !== "object") return new Date(d);
1241
+ const days = (shift.days || 0) + (shift.weeks || 0) * 7;
1242
+ let next = days ? addDays(d, days) : new Date(d);
1243
+ const ms = (shift.hours || 0) * 36e5 + (shift.minutes || 0) * 6e4;
1244
+ if (ms) next = new Date(next.getTime() + ms);
1245
+ return next;
1246
+ };
1247
+ var shiftEvent = (range, shift) => {
1248
+ const start = toDate(range && range.start);
1249
+ if (!start) return null;
1250
+ const end = toDate(range && range.end) || start;
1251
+ return { start: shiftDate(start, shift), end: shiftDate(end, shift) };
1252
+ };
1253
+ var calendarDayDelta = (a, b) => Math.round((startOfDay(b).getTime() - startOfDay(a).getTime()) / MS_PER_DAY);
1254
+ var msIntoDay = (d) => ((d.getHours() * 60 + d.getMinutes()) * 60 + d.getSeconds()) * 1e3 + d.getMilliseconds();
1255
+ var rescheduleToStart = (range, newStart) => {
1256
+ const start = toDate(range && range.start);
1257
+ const target = toDate(newStart);
1258
+ if (!start || !target) return null;
1259
+ const end = toDate(range && range.end) || start;
1260
+ const dayDelta = calendarDayDelta(start, target);
1261
+ const timeDelta = msIntoDay(target) - msIntoDay(start);
1262
+ const endOnDay = addDays(end, dayDelta);
1263
+ if (!timeDelta) return { start: target, end: endOnDay };
1264
+ return {
1265
+ start: target,
1266
+ end: new Date(
1267
+ endOnDay.getFullYear(),
1268
+ endOnDay.getMonth(),
1269
+ endOnDay.getDate(),
1270
+ 0,
1271
+ 0,
1272
+ 0,
1273
+ msIntoDay(endOnDay) + timeDelta
1274
+ )
1275
+ };
1276
+ };
1277
+ var applyDatePick = (start, value) => {
1278
+ if (!isDateValueObject(value)) return null;
1279
+ const s = toDate(start);
1280
+ return new Date(
1281
+ value.year,
1282
+ value.month,
1283
+ value.date,
1284
+ s ? s.getHours() : 0,
1285
+ s ? s.getMinutes() : 0,
1286
+ s ? s.getSeconds() : 0,
1287
+ s ? s.getMilliseconds() : 0
1288
+ );
1289
+ };
1290
+ var DEFAULT_RESCHEDULE_PRESETS = [
1291
+ { label: "+1 hour", shift: { hours: 1 } },
1292
+ { label: "+1 day", shift: { days: 1 } },
1293
+ { label: "Next week", shift: { weeks: 1 } }
1294
+ ];
1295
+ var normalizeRescheduleOptions = (options) => {
1296
+ if (!options) return [];
1297
+ if (options === true) return DEFAULT_RESCHEDULE_PRESETS;
1298
+ if (!Array.isArray(options)) return [];
1299
+ const out = [];
1300
+ for (const opt of options) {
1301
+ if (typeof opt === "function") {
1302
+ out.push({ label: opt.label || opt.name || "Reschedule", getStart: opt });
1303
+ } else if (opt && typeof opt === "object" && opt.label != null) {
1304
+ if (typeof opt.shift === "function") {
1305
+ out.push({ label: opt.label, getStart: opt.shift });
1306
+ } else if (typeof opt.getStart === "function") {
1307
+ out.push({ label: opt.label, getStart: opt.getStart });
1308
+ } else if (opt.shift && typeof opt.shift === "object") {
1309
+ out.push({ label: opt.label, shift: opt.shift });
1310
+ }
1311
+ }
1312
+ }
1313
+ return out;
1314
+ };
1315
+ var resolveRescheduleTarget = (range, option, fnArg) => {
1316
+ if (!range || !toDate(range.start) || !option) return null;
1317
+ if (typeof option.getStart === "function") {
1318
+ const next = toDate(option.getStart(fnArg !== void 0 ? fnArg : range));
1319
+ return next ? rescheduleToStart(range, next) : null;
1320
+ }
1321
+ if (option.shift && typeof option.shift === "object") {
1322
+ return shiftEvent(range, option.shift);
1323
+ }
1324
+ return null;
1325
+ };
1326
+
1327
+ // src/calendar/resourceLanes.js
1328
+ var resolveResourceId = (record, spec) => {
1329
+ if (record == null || spec == null) return null;
1330
+ const value = typeof spec === "function" ? spec(record) : record[spec];
1331
+ if (value == null || value === "") return null;
1332
+ return value;
1333
+ };
1334
+ var buildResourceLanes = (events, options = {}) => {
1335
+ const {
1336
+ resources,
1337
+ resourceLabels,
1338
+ getId,
1339
+ showUnassignedLane = true,
1340
+ unassignedLabel = "Unassigned"
1341
+ } = options;
1342
+ const labelFor = (id) => {
1343
+ if (resourceLabels && resourceLabels[id] != null) return resourceLabels[id];
1344
+ return String(id);
1345
+ };
1346
+ const lanes = [];
1347
+ const byKey = /* @__PURE__ */ new Map();
1348
+ const addLane = (id, label, declared) => {
1349
+ const key = String(id);
1350
+ if (byKey.has(key)) return byKey.get(key);
1351
+ const lane = { id, key, label, events: [], unassigned: false, declared };
1352
+ byKey.set(key, lane);
1353
+ lanes.push(lane);
1354
+ return lane;
1355
+ };
1356
+ (resources || []).forEach((resource) => {
1357
+ if (resource == null) return;
1358
+ if (typeof resource === "object") {
1359
+ addLane(resource.id, resource.label != null ? resource.label : labelFor(resource.id), true);
1360
+ } else {
1361
+ addLane(resource, labelFor(resource), true);
1362
+ }
1363
+ });
1364
+ const unassigned = {
1365
+ id: null,
1366
+ key: "__unassigned__",
1367
+ label: unassignedLabel,
1368
+ events: [],
1369
+ unassigned: true,
1370
+ declared: false
1371
+ };
1372
+ (events || []).forEach((event) => {
1373
+ const id = getId ? getId(event) : null;
1374
+ if (id == null || id === "") {
1375
+ unassigned.events.push(event);
1376
+ return;
1377
+ }
1378
+ const lane = byKey.get(String(id)) || addLane(id, labelFor(id), false);
1379
+ lane.events.push(event);
1380
+ });
1381
+ if (showUnassignedLane && unassigned.events.length > 0) lanes.push(unassigned);
1382
+ return lanes;
1383
+ };
1384
+ var eventsIntersectingRange = (events, rangeStart, rangeEnd) => {
1385
+ const rs = rangeStart.getTime();
1386
+ const re = rangeEnd.getTime();
1387
+ return (events || []).filter((event) => {
1388
+ if (!event || !event.start) return false;
1389
+ const es = event.start.getTime();
1390
+ const ee = (event.end || event.start).getTime();
1391
+ return es <= re && ee >= rs;
1392
+ });
1393
+ };
1394
+ var laneEventsForDay = (events, day) => eventsIntersectingRange(events, startOfDay(day), endOfDay(day)).sort(
1395
+ (a, b) => a.start.getTime() - b.start.getTime()
1396
+ );
1397
+
1232
1398
  // src/calendar/Calendar.jsx
1233
1399
  var DEFAULT_MAX_EVENTS_PER_DAY = 3;
1234
1400
  var ALL_VIEWS = ["month", "week", "day", "agenda"];
1401
+ var ALL_VIEWS_WITH_RESOURCE = ["month", "week", "day", "resource", "agenda"];
1235
1402
  var DEFAULT_DAY_START_HOUR = 8;
1236
1403
  var DEFAULT_DAY_END_HOUR = 20;
1237
1404
  var DEFAULT_TIME_ZONES = [
@@ -1267,7 +1434,8 @@ var VIEW_LABELS = {
1267
1434
  month: "Month",
1268
1435
  week: "Week",
1269
1436
  day: "Day",
1270
- agenda: "Agenda"
1437
+ agenda: "Agenda",
1438
+ resource: "Resource"
1271
1439
  };
1272
1440
  var DEFAULT_LABELS3 = {
1273
1441
  today: "Today",
@@ -1284,7 +1452,11 @@ var DEFAULT_LABELS3 = {
1284
1452
  errorMessage: "An error occurred while loading events.",
1285
1453
  dayDetailTitle: (label) => label,
1286
1454
  open: "Open",
1287
- allDay: "All day"
1455
+ allDay: "All day",
1456
+ reschedule: "Reschedule",
1457
+ pickDate: "Pick date",
1458
+ unassigned: "Unassigned",
1459
+ resource: "Resource"
1288
1460
  };
1289
1461
  var DEFAULT_EVENT_FIELDS = {
1290
1462
  id: "id",
@@ -1340,8 +1512,9 @@ var truncateMonthLabel = (value, max) => {
1340
1512
  var MONTH_COL_WIDTH = 160;
1341
1513
  var TIMEGRID_DAY_COL = 150;
1342
1514
  var TIMEGRID_DAY_COL_SINGLE = 560;
1515
+ var RESOURCE_LABEL_COL_WIDTH = "min";
1343
1516
  var HOUR_SLOT_HEIGHT = 64;
1344
- var EventDetail = ({ event, labels }) => {
1517
+ var EventDetail = ({ event, labels, reschedule, idSuffix = "" }) => {
1345
1518
  const { start, end, title, subtitle, href } = event;
1346
1519
  let when = "";
1347
1520
  if (start) {
@@ -1355,11 +1528,27 @@ var EventDetail = ({ event, labels }) => {
1355
1528
  when = `${formatDayTitle(start)} \u2013 ${formatDayTitle(end)}`;
1356
1529
  }
1357
1530
  }
1358
- return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" }, truncate: true }, title || "--"), when ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, when) : null, subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, subtitle) : null, href ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { href: href.url, external: href.external }, labels.open) : null);
1531
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" }, truncate: true }, title || "--"), when ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, when) : null, subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, subtitle) : null, href ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { href: href.url, external: href.external }, labels.open) : null, reschedule ? /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: "demibold" } }, labels.reschedule), reschedule.options.length > 0 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", gap: "xs", wrap: "wrap" }, reschedule.options.map((option, i) => /* @__PURE__ */ import_react5.default.createElement(
1532
+ import_ui_extensions5.Button,
1533
+ {
1534
+ key: `${option.label}-${i}`,
1535
+ size: "xs",
1536
+ variant: "secondary",
1537
+ onClick: () => reschedule.onPreset(event, option)
1538
+ },
1539
+ option.label
1540
+ ))) : null, /* @__PURE__ */ import_react5.default.createElement(
1541
+ import_ui_extensions5.DateInput,
1542
+ {
1543
+ name: `cal-resched-${event.key}${idSuffix}`,
1544
+ label: labels.pickDate,
1545
+ onChange: (value) => reschedule.onPick(event, value)
1546
+ }
1547
+ )) : null);
1359
1548
  };
1360
- var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "") => {
1549
+ var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "", reschedule = null) => {
1361
1550
  if (mode === "none") return void 0;
1362
- const body = renderEventDetail ? renderEventDetail(event) : /* @__PURE__ */ import_react5.default.createElement(EventDetail, { event, labels });
1551
+ const body = renderEventDetail ? renderEventDetail(event) : /* @__PURE__ */ import_react5.default.createElement(EventDetail, { event, labels, reschedule, idSuffix });
1363
1552
  const id = `cal-evt-${event.key}${idSuffix}`;
1364
1553
  if (mode === "modal") {
1365
1554
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Modal, { id, title: event.title || labels.open, width: "small" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.ModalBody, null, body));
@@ -1369,17 +1558,17 @@ var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "") => {
1369
1558
  }
1370
1559
  return /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id, placement: "bottom", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, body));
1371
1560
  };
1372
- var AgendaEventRow = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels }) => {
1561
+ var AgendaEventRow = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, reschedule }) => {
1373
1562
  const variant = VALID_VARIANTS.has(event.color) ? event.color : "default";
1374
- const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-ag${day.getTime()}` : "");
1563
+ const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-ag${day.getTime()}` : "", reschedule);
1375
1564
  const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
1376
1565
  const timeLabel = isAllDayEvent(event) ? labels.allDay : formatTime(event.start);
1377
1566
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 2 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: "demibold" } }, timeLabel))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 11 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant }), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { overlay, onClick: handleClick }, event.title || "--")))), event.subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 4 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, event.subtitle))) : null);
1378
1567
  };
1379
1568
  var MONTH_SLOT_HEIGHT = 24;
1380
- var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, monthEventStyle, monthEventMaxChars }) => {
1569
+ var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, monthEventStyle, monthEventMaxChars, reschedule, idScope = "" }) => {
1381
1570
  const isStartDay = !day || !event.start || isSameDay(event.start, day);
1382
- const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-m${day.getTime()}` : "");
1571
+ const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-m${idScope}${day.getTime()}` : "", reschedule);
1383
1572
  const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
1384
1573
  const variant = VALID_VARIANTS.has(event.color) ? event.color : "default";
1385
1574
  const startHasTime = event.start && (event.start.getHours() !== 0 || event.start.getMinutes() !== 0);
@@ -1392,9 +1581,9 @@ var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, lab
1392
1581
  }
1393
1582
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { overlay, onClick: handleClick }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.StatusTag, { variant: STATUS_VARIANT[variant] || "default" }, label));
1394
1583
  };
1395
- var DayListItem = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels }) => {
1584
+ var DayListItem = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, reschedule, idScope = "" }) => {
1396
1585
  const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
1397
- const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-more${day.getTime()}` : "-more");
1586
+ const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-more${idScope}${day.getTime()}` : "-more", reschedule);
1398
1587
  const href = event.href;
1399
1588
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Button, { variant: "transparent", size: "sm", href: href ? href.url : void 0, overlay, onClick: handleClick }, event.title || "--");
1400
1589
  };
@@ -1459,6 +1648,40 @@ var Toolbar = ({
1459
1648
  }
1460
1649
  ));
1461
1650
  };
1651
+ var DayChipStack = ({ day, events, maxEventsPerDay, chipProps, labels, idScope = "" }) => {
1652
+ const slotSpacer = makeSpacerDataUri(MONTH_SLOT_HEIGHT, 1);
1653
+ const shown = events.slice(0, maxEventsPerDay);
1654
+ const hasOverflow = events.length > maxEventsPerDay;
1655
+ const heightSpacer = /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" });
1656
+ const slotRow = (key, content) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { key, direction: "row", align: "center", gap: "flush" }, heightSpacer, content);
1657
+ const slots = [];
1658
+ for (let i = 0; i < maxEventsPerDay; i++) {
1659
+ if (i < shown.length) {
1660
+ slots.push(slotRow(shown[i].key, /* @__PURE__ */ import_react5.default.createElement(MonthChip, { event: shown[i], day, idScope, ...chipProps })));
1661
+ } else {
1662
+ slots.push(/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: `sp-${i}`, src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" }));
1663
+ }
1664
+ }
1665
+ if (hasOverflow) {
1666
+ slots.push(
1667
+ slotRow(
1668
+ "more",
1669
+ /* @__PURE__ */ import_react5.default.createElement(
1670
+ import_ui_extensions5.Link,
1671
+ {
1672
+ overlay: /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id: `cal-day-${idScope}${day.getTime()}`, placement: "top", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "center", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "bold" } }, String(events.length)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, labels.onThisDate)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), events.map((event, i) => /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, { key: event.key }, /* @__PURE__ */ import_react5.default.createElement(DayListItem, { event, day, idScope, ...chipProps }), i < events.length - 1 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null) : null)))))
1673
+ },
1674
+ labels.more(events.length - maxEventsPerDay)
1675
+ )
1676
+ )
1677
+ );
1678
+ } else {
1679
+ slots.push(
1680
+ /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: "more-sp", src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" })
1681
+ );
1682
+ }
1683
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, slots);
1684
+ };
1462
1685
  var MonthView = ({
1463
1686
  refDate,
1464
1687
  now,
@@ -1473,43 +1696,21 @@ var MonthView = ({
1473
1696
  }) => {
1474
1697
  const headers = weekdayLabels(weekStartsOn, hideWeekends, true);
1475
1698
  const today = now || /* @__PURE__ */ new Date();
1476
- const slotSpacer = makeSpacerDataUri(MONTH_SLOT_HEIGHT, 1);
1477
1699
  const renderCell = (day) => {
1478
1700
  const dayEvents = eventsForDay(day);
1479
1701
  const inMonth = isSameMonth(day, refDate);
1480
1702
  const isToday = isSameDay(day, today);
1481
1703
  if (renderDayCell) return renderDayCell(day, dayEvents);
1482
- const shown = dayEvents.slice(0, maxEventsPerDay);
1483
- const hasOverflow = dayEvents.length > maxEventsPerDay;
1484
- const heightSpacer = /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" });
1485
- const slotRow = (key, content) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { key, direction: "row", align: "center", gap: "flush" }, heightSpacer, content);
1486
- const slots = [];
1487
- for (let i = 0; i < maxEventsPerDay; i++) {
1488
- if (i < shown.length) {
1489
- slots.push(slotRow(shown[i].key, /* @__PURE__ */ import_react5.default.createElement(MonthChip, { event: shown[i], day, ...chipProps })));
1490
- } else {
1491
- slots.push(/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: `sp-${i}`, src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" }));
1704
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, isToday ? /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant: "info" }) : null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: inMonth ? "demibold" : "regular" } }, String(day.getDate()))), /* @__PURE__ */ import_react5.default.createElement(
1705
+ DayChipStack,
1706
+ {
1707
+ day,
1708
+ events: dayEvents,
1709
+ maxEventsPerDay,
1710
+ chipProps,
1711
+ labels
1492
1712
  }
1493
- }
1494
- if (hasOverflow) {
1495
- slots.push(
1496
- slotRow(
1497
- "more",
1498
- /* @__PURE__ */ import_react5.default.createElement(
1499
- import_ui_extensions5.Link,
1500
- {
1501
- overlay: /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id: `cal-day-${day.getTime()}`, placement: "top", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "center", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "bold" } }, String(dayEvents.length)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, labels.onThisDate)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), dayEvents.map((event, i) => /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, { key: event.key }, /* @__PURE__ */ import_react5.default.createElement(DayListItem, { event, day, ...chipProps }), i < dayEvents.length - 1 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null) : null)))))
1502
- },
1503
- labels.more(dayEvents.length - maxEventsPerDay)
1504
- )
1505
- )
1506
- );
1507
- } else {
1508
- slots.push(
1509
- /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: "more-sp", src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" })
1510
- );
1511
- }
1512
- return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, isToday ? /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant: "info" }) : null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: inMonth ? "demibold" : "regular" } }, String(day.getDate()))), slots));
1713
+ )));
1513
1714
  };
1514
1715
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Table, { bordered: true, flush: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHead, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, null, headers.map((h4) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { key: h4, width: "min", align: "center" }, h4.toUpperCase())))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableBody, null, weeks.map((week, wi) => {
1515
1716
  const days = hideWeekends ? week.filter((d) => d.getDay() !== 0 && d.getDay() !== 6) : week;
@@ -1531,6 +1732,33 @@ var AgendaView = ({ rangeStart, rangeEnd, eventsForDay, chipProps, labels, rende
1531
1732
  }
1532
1733
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "lg" }, days.map(({ day, events }) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { key: day.getTime(), direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "between", align: "end" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, formatDayTitle(day)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy" }, `${events.length} ${events.length === 1 ? "event" : "events"}`)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), events.map((event) => /* @__PURE__ */ import_react5.default.createElement(AgendaEventRow, { key: event.key, event, day, ...chipProps })))));
1533
1734
  };
1735
+ var ResourceView = ({ days, now, lanes, maxEventsPerDay, chipProps, labels, renderEmptyState }) => {
1736
+ const today = now || /* @__PURE__ */ new Date();
1737
+ if (!lanes || lanes.length === 0) {
1738
+ if (renderEmptyState) return renderEmptyState({});
1739
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.EmptyState, { title: labels.noEventsTitle }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, null, labels.noEventsMessage));
1740
+ }
1741
+ const rangeStart = startOfDay(days[0]);
1742
+ const rangeEnd = endOfDay(days[days.length - 1]);
1743
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Table, { bordered: true, flush: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHead, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { width: RESOURCE_LABEL_COL_WIDTH }, String(labels.resource).toUpperCase()), days.map((day) => {
1744
+ const isToday = isSameDay(day, today);
1745
+ const label = `${formatWeekdayShort(day)} ${formatMonthShort(day)} ${day.getDate()}`;
1746
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { key: day.getTime(), width: "min", align: "center" }, isToday ? `${label} \xB7 Today` : label);
1747
+ }))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableBody, null, lanes.map((lane, laneIndex) => {
1748
+ const visible = eventsIntersectingRange(lane.events, rangeStart, rangeEnd);
1749
+ return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, { key: lane.key }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableCell, { width: RESOURCE_LABEL_COL_WIDTH }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, lane.label), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy" }, `${visible.length} ${visible.length === 1 ? "event" : "events"}`))), days.map((day) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableCell, { key: day.getTime(), width: "min" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(
1750
+ DayChipStack,
1751
+ {
1752
+ day,
1753
+ events: laneEventsForDay(visible, day),
1754
+ maxEventsPerDay,
1755
+ chipProps,
1756
+ labels,
1757
+ idScope: `r${laneIndex}-`
1758
+ }
1759
+ )))));
1760
+ })));
1761
+ };
1534
1762
  var formatTimedDuration = (start, end) => {
1535
1763
  const mins = Math.max(0, Math.round(((end || start).getTime() - start.getTime()) / 6e4));
1536
1764
  const h4 = Math.floor(mins / 60);
@@ -1578,7 +1806,8 @@ var TimeGridView = ({ days, now, hours, dayStartHour, dayEndHour, eventsForDay,
1578
1806
  chipProps.overlayMode,
1579
1807
  chipProps.renderEventDetail,
1580
1808
  chipProps.labels,
1581
- `-tg${mode}${hour}-${dayMs}`
1809
+ `-tg${mode}${hour}-${dayMs}`,
1810
+ chipProps.reschedule
1582
1811
  );
1583
1812
  const handleClick = chipProps.onEventClick ? () => chipProps.onEventClick(e.raw, e) : void 0;
1584
1813
  const variant = VALID_VARIANTS.has(e.color) ? e.color : "default";
@@ -1663,6 +1892,14 @@ var Calendar = (props) => {
1663
1892
  // time grid (week / day)
1664
1893
  dayStartHour = DEFAULT_DAY_START_HOUR,
1665
1894
  dayEndHour = DEFAULT_DAY_END_HOUR,
1895
+ // resource / lane view (rows = resources, columns = the focused week's days)
1896
+ resources,
1897
+ resourceField,
1898
+ resourceLabels,
1899
+ showUnassignedLane = true,
1900
+ // drag-free reschedule (presets + date picker in the event-detail overlay)
1901
+ rescheduleOptions,
1902
+ onEventReschedule,
1666
1903
  // timezone
1667
1904
  timeZone: controlledTimeZone,
1668
1905
  defaultTimeZone,
@@ -1701,10 +1938,12 @@ var Calendar = (props) => {
1701
1938
  const fields = (0, import_react5.useMemo)(() => ({ ...DEFAULT_EVENT_FIELDS, ...eventFields || {} }), [eventFields]);
1702
1939
  const [internalView, setInternalView] = (0, import_react5.useState)(defaultView);
1703
1940
  const view = controlledView != null ? controlledView : internalView;
1941
+ const resourceEnabled = resources && resources.length > 0 || resourceField != null;
1704
1942
  const enabledViews = (0, import_react5.useMemo)(() => {
1705
- const base = viewsProp && viewsProp.length > 0 ? viewsProp : ALL_VIEWS;
1706
- return base.filter((v) => ALL_VIEWS.includes(v));
1707
- }, [viewsProp]);
1943
+ const all = resourceEnabled ? ALL_VIEWS_WITH_RESOURCE : ALL_VIEWS;
1944
+ const base = viewsProp && viewsProp.length > 0 ? viewsProp : all;
1945
+ return base.filter((v) => all.includes(v));
1946
+ }, [viewsProp, resourceEnabled]);
1708
1947
  const setView = (0, import_react5.useCallback)(
1709
1948
  (next) => {
1710
1949
  if (controlledView == null) setInternalView(next);
@@ -1729,7 +1968,9 @@ var Calendar = (props) => {
1729
1968
  const focusedDate = (controlledFocusedDate != null ? toDate(controlledFocusedDate) : internalDate) || startOfDay(nowWall);
1730
1969
  const stepFor = (0, import_react5.useCallback)(
1731
1970
  (dir) => {
1732
- if (view === "week" || view === "agenda") return addDays(focusedDate, dir * 7);
1971
+ if (view === "week" || view === "agenda" || view === "resource") {
1972
+ return addDays(focusedDate, dir * 7);
1973
+ }
1733
1974
  if (view === "day") return addDays(focusedDate, dir);
1734
1975
  return addMonths(focusedDate, dir);
1735
1976
  },
@@ -1756,7 +1997,7 @@ var Calendar = (props) => {
1756
1997
  rangeEnd: endOfDay(flat[flat.length - 1])
1757
1998
  };
1758
1999
  }
1759
- if (view === "week") {
2000
+ if (view === "week" || view === "resource") {
1760
2001
  const days = buildWeekDays(focusedDate, weekStartsOn, hideWeekends);
1761
2002
  return {
1762
2003
  weeks: null,
@@ -1829,14 +2070,18 @@ var Calendar = (props) => {
1829
2070
  );
1830
2071
  const normalized = (0, import_react5.useMemo)(
1831
2072
  () => (events || []).map((raw, index) => {
1832
- const start = toWallClock(toDate(resolveField(raw, fields.start)), timeZone);
1833
- const endRaw = toWallClock(toDate(resolveField(raw, fields.end)), timeZone);
2073
+ const sourceStart = toDate(resolveField(raw, fields.start));
2074
+ const sourceEnd = toDate(resolveField(raw, fields.end));
2075
+ const start = toWallClock(sourceStart, timeZone);
2076
+ const endRaw = toWallClock(sourceEnd, timeZone);
1834
2077
  const id = resolveField(raw, fields.id);
1835
2078
  return {
1836
2079
  key: id != null ? String(id) : `evt-${index}`,
1837
2080
  id,
1838
2081
  start,
1839
2082
  end: endRaw || start,
2083
+ sourceStart,
2084
+ sourceEnd: sourceEnd || sourceStart,
1840
2085
  title: resolveField(raw, fields.title),
1841
2086
  subtitle: resolveField(raw, fields.subtitle),
1842
2087
  color: resolveField(raw, fields.color),
@@ -1873,12 +2118,40 @@ var Calendar = (props) => {
1873
2118
  }, [rangeKey]);
1874
2119
  const title = (0, import_react5.useMemo)(() => {
1875
2120
  if (view === "day") return formatDayTitle(focusedDate);
1876
- if (view === "week" || view === "agenda") {
1877
- const days = buildWeekDays(focusedDate, weekStartsOn, view === "week" && hideWeekends);
2121
+ if (view === "week" || view === "agenda" || view === "resource") {
2122
+ const days = buildWeekDays(focusedDate, weekStartsOn, view !== "agenda" && hideWeekends);
1878
2123
  return formatRangeTitle(days[0], days[days.length - 1]);
1879
2124
  }
1880
2125
  return formatMonthTitle(focusedDate);
1881
2126
  }, [view, focusedDate, weekStartsOn, hideWeekends]);
2127
+ const handleReschedulePreset = (0, import_react5.useCallback)(
2128
+ (event, option) => {
2129
+ const target = resolveRescheduleTarget(
2130
+ { start: event.sourceStart, end: event.sourceEnd },
2131
+ option,
2132
+ event
2133
+ );
2134
+ if (target && onEventReschedule) onEventReschedule(event.raw, target, event);
2135
+ },
2136
+ [onEventReschedule]
2137
+ );
2138
+ const handleReschedulePick = (0, import_react5.useCallback)(
2139
+ (event, value) => {
2140
+ const newStart = applyDatePick(event.sourceStart, value);
2141
+ if (!newStart) return;
2142
+ const target = rescheduleToStart({ start: event.sourceStart, end: event.sourceEnd }, newStart);
2143
+ if (target && onEventReschedule) onEventReschedule(event.raw, target, event);
2144
+ },
2145
+ [onEventReschedule]
2146
+ );
2147
+ const reschedule = (0, import_react5.useMemo)(() => {
2148
+ if (!rescheduleOptions) return null;
2149
+ return {
2150
+ options: normalizeRescheduleOptions(rescheduleOptions),
2151
+ onPreset: handleReschedulePreset,
2152
+ onPick: handleReschedulePick
2153
+ };
2154
+ }, [rescheduleOptions, handleReschedulePreset, handleReschedulePick]);
1882
2155
  const safeMonthEventStyle = MONTH_EVENT_STYLES.has(monthEventStyle) ? monthEventStyle : "statusTag";
1883
2156
  const chipProps = {
1884
2157
  overlayMode,
@@ -1886,8 +2159,19 @@ var Calendar = (props) => {
1886
2159
  onEventClick,
1887
2160
  labels,
1888
2161
  monthEventStyle: safeMonthEventStyle,
1889
- monthEventMaxChars
2162
+ monthEventMaxChars,
2163
+ reschedule
1890
2164
  };
2165
+ const resourceLaneData = (0, import_react5.useMemo)(() => {
2166
+ if (view !== "resource") return null;
2167
+ return buildResourceLanes(queried, {
2168
+ resources,
2169
+ resourceLabels,
2170
+ getId: (e) => resolveResourceId(e.raw, resourceField),
2171
+ showUnassignedLane,
2172
+ unassignedLabel: labels.unassigned
2173
+ });
2174
+ }, [view, queried, resources, resourceLabels, resourceField, showUnassignedLane, labels]);
1891
2175
  const timeZoneOptions = (0, import_react5.useMemo)(() => {
1892
2176
  if (!showTimeZoneSelect) return null;
1893
2177
  const base = (timeZoneOptionsProp && timeZoneOptionsProp.length ? timeZoneOptionsProp : DEFAULT_TIME_ZONES).map(
@@ -1948,6 +2232,19 @@ var Calendar = (props) => {
1948
2232
  labels
1949
2233
  }
1950
2234
  );
2235
+ } else if (view === "resource") {
2236
+ body = /* @__PURE__ */ import_react5.default.createElement(
2237
+ ResourceView,
2238
+ {
2239
+ days: gridDays,
2240
+ now: nowWall,
2241
+ lanes: resourceLaneData,
2242
+ maxEventsPerDay,
2243
+ chipProps,
2244
+ labels,
2245
+ renderEmptyState
2246
+ }
2247
+ );
1951
2248
  } else if (view === "week" || view === "day") {
1952
2249
  body = /* @__PURE__ */ import_react5.default.createElement(
1953
2250
  TimeGridView,
@@ -1977,6 +2274,7 @@ var Calendar = (props) => {
1977
2274
  }
1978
2275
  return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, toolbar, body);
1979
2276
  };
2277
+ Calendar.displayName = "Calendar";
1980
2278
  // Annotate the CommonJS export names for ESM import in node:
1981
2279
  0 && (module.exports = {
1982
2280
  Calendar