@ceed/ads 1.31.1 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1026,8 +1026,12 @@ var useCalendarProps = (inProps) => {
1026
1026
  // src/components/Calendar/hooks/use-calendar.ts
1027
1027
  var import_react13 = require("react");
1028
1028
  var useCalendar = (ownerState) => {
1029
- const [hoverDay, setHoverDay] = (0, import_react13.useState)(null);
1030
- const [hoverMonth, setHoverMonth] = (0, import_react13.useState)(null);
1029
+ const [localHoverDay, setLocalHoverDay] = (0, import_react13.useState)(null);
1030
+ const [localHoverMonth, setLocalHoverMonth] = (0, import_react13.useState)(null);
1031
+ const hoverDay = ownerState.hoverDay !== void 0 ? ownerState.hoverDay : localHoverDay;
1032
+ const setHoverDay = ownerState.onHoverDayChange ?? setLocalHoverDay;
1033
+ const hoverMonth = ownerState.hoverMonth !== void 0 ? ownerState.hoverMonth : localHoverMonth;
1034
+ const setHoverMonth = ownerState.onHoverMonthChange ?? setLocalHoverMonth;
1031
1035
  return {
1032
1036
  calendarTitle: ownerState.view === "month" ? getYearName(ownerState.viewMonth, ownerState.locale || "default") : getMonthName(ownerState.viewMonth, ownerState.locale || "default"),
1033
1037
  onPrev: (0, import_react13.useCallback)(() => {
@@ -1226,11 +1230,18 @@ var MONTH_NAV_CLICK_THRESHOLD = 3;
1226
1230
  var MONTH_VIEW_HINT_DURATION_MS = 5e3;
1227
1231
  var MONTH_VIEW_HINT_COOLDOWN_MS = 3e4;
1228
1232
  var lastMonthViewAssistHintShownAt = 0;
1233
+ var CALENDAR_PANEL_WIDTH = 264;
1234
+ var CALENDAR_PANEL_GAP = 16;
1229
1235
  var CalendarRoot = (0, import_joy19.styled)("div", {
1230
1236
  name: "Calendar",
1231
1237
  slot: "root"
1238
+ })({});
1239
+ var CalendarMultiContainer = (0, import_joy19.styled)("div", {
1240
+ name: "Calendar",
1241
+ slot: "multiContainer"
1232
1242
  })({
1233
- maxWidth: "264px"
1243
+ display: "flex",
1244
+ gap: `${CALENDAR_PANEL_GAP}px`
1234
1245
  });
1235
1246
  var CalendarHeader = (0, import_joy19.styled)("div", {
1236
1247
  name: "Calendar",
@@ -1265,6 +1276,16 @@ var CalendarViewTable = (0, import_joy19.styled)(import_framer_motion13.motion.t
1265
1276
  paddingBottom: theme.spacing(2)
1266
1277
  }
1267
1278
  }));
1279
+ var StaticCalendarViewTable = (0, import_joy19.styled)("table")(({ theme }) => ({
1280
+ borderSpacing: 0,
1281
+ "& td, & th": {
1282
+ padding: 0
1283
+ },
1284
+ "& th": {
1285
+ paddingTop: theme.spacing(2),
1286
+ paddingBottom: theme.spacing(2)
1287
+ }
1288
+ }));
1268
1289
  var CalendarWeekHeaderContainer = (0, import_joy19.styled)("thead", {
1269
1290
  name: "Calendar",
1270
1291
  slot: "weekHeaderContainer"
@@ -1513,6 +1534,133 @@ var PickerMonths = (props) => {
1513
1534
  /* @__PURE__ */ import_react14.default.createElement("tbody", null, chunkedMonths.map((months, i) => /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: months.join("_") }, /* @__PURE__ */ import_react14.default.createElement("tr", null, months.map((monthIndex, j) => /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: monthIndex }, /* @__PURE__ */ import_react14.default.createElement(CalendarMonthCell, { ...getMonthCellProps(monthIndex) }, /* @__PURE__ */ import_react14.default.createElement(CalendarMonth, { size: "sm", variant: "plain", color: "neutral", ...getPickerMonthProps(monthIndex) }, getMonthNameFromIndex(monthIndex, ownerState.locale))), j < 3 && /* @__PURE__ */ import_react14.default.createElement("td", { style: { width: 4 }, "aria-hidden": "true", "aria-description": "cell-gap" })))), i < chunkedMonths.length - 1 && /* @__PURE__ */ import_react14.default.createElement("tr", { "aria-hidden": "true", "aria-description": "row-gap" }, /* @__PURE__ */ import_react14.default.createElement("td", { colSpan: 7, style: { height: 4 } })))))
1514
1535
  )));
1515
1536
  };
1537
+ var PlainPickerDays = ({ ownerState }) => {
1538
+ const { getPickerDayProps, getDayCellProps } = useCalendar(ownerState);
1539
+ const calendarDates = (0, import_react14.useMemo)(() => getCalendarDates(ownerState.viewMonth), [ownerState.viewMonth]);
1540
+ const weekdayNames = (0, import_react14.useMemo)(() => getWeekdayNames(ownerState.locale || "default"), [ownerState.locale]);
1541
+ return /* @__PURE__ */ import_react14.default.createElement(StaticCalendarViewTable, null, /* @__PURE__ */ import_react14.default.createElement(CalendarWeekHeaderContainer, null, /* @__PURE__ */ import_react14.default.createElement("tr", null, weekdayNames.map((name, i) => /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: `${ownerState.viewMonth}_${name}_${i}` }, /* @__PURE__ */ import_react14.default.createElement("th", null, /* @__PURE__ */ import_react14.default.createElement(Typography_default, { level: "body-xs", textAlign: "center" }, name)), i < 6 && /* @__PURE__ */ import_react14.default.createElement("th", { style: { width: 4 }, "aria-hidden": "true", "aria-description": "cell-gap" }))))), /* @__PURE__ */ import_react14.default.createElement(CalendarDayPickerContainer, null, calendarDates.map((weekDates, rowIndex) => /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: `${ownerState.viewMonth}_${rowIndex}` }, /* @__PURE__ */ import_react14.default.createElement("tr", null, weekDates.map(
1542
+ (date, i) => date ? /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: `${ownerState.viewMonth}_${date}_${i}` }, /* @__PURE__ */ import_react14.default.createElement(CalendarDayCell, { ...getDayCellProps(date) }, /* @__PURE__ */ import_react14.default.createElement(CalendarDay, { size: "sm", variant: "plain", color: "neutral", ...getPickerDayProps(date) }, date)), i < 6 && /* @__PURE__ */ import_react14.default.createElement("td", { "aria-hidden": "true", "aria-description": "cell-gap" })) : /* @__PURE__ */ import_react14.default.createElement(import_react14.Fragment, { key: `${ownerState.viewMonth}_${i}` }, /* @__PURE__ */ import_react14.default.createElement("td", null), i < 6 && /* @__PURE__ */ import_react14.default.createElement("td", { "aria-hidden": "true", "aria-description": "cell-gap" }))
1543
+ )), rowIndex < calendarDates.length - 1 && /* @__PURE__ */ import_react14.default.createElement("tr", { "aria-hidden": "true", "aria-description": "row-gap" }, /* @__PURE__ */ import_react14.default.createElement("td", { colSpan: 13, style: { height: 4 } }))))));
1544
+ };
1545
+ var MultiMonthPickerDays = ({
1546
+ panels,
1547
+ direction,
1548
+ numberOfMonths
1549
+ }) => {
1550
+ const slideDistance = CALENDAR_PANEL_WIDTH * numberOfMonths + CALENDAR_PANEL_GAP * (numberOfMonths - 1) + CALENDAR_PANEL_WIDTH;
1551
+ const multiVariants = {
1552
+ enter: (dir) => ({ x: dir > 0 ? slideDistance : -slideDistance, opacity: 0 }),
1553
+ center: { position: "relative", zIndex: 1, x: 0, opacity: 1 },
1554
+ exit: (dir) => ({
1555
+ position: "absolute",
1556
+ zIndex: 0,
1557
+ x: dir < 0 ? slideDistance : -slideDistance,
1558
+ opacity: 0
1559
+ })
1560
+ };
1561
+ const key = `${panels[0].viewMonth.toISOString()}_${direction}`;
1562
+ return /* @__PURE__ */ import_react14.default.createElement("div", { style: { position: "relative", overflow: "hidden", minHeight: "250px" } }, /* @__PURE__ */ import_react14.default.createElement(import_framer_motion13.AnimatePresence, { initial: false, custom: direction }, /* @__PURE__ */ import_react14.default.createElement(
1563
+ import_framer_motion13.motion.div,
1564
+ {
1565
+ key,
1566
+ custom: direction,
1567
+ variants: multiVariants,
1568
+ initial: "enter",
1569
+ animate: "center",
1570
+ exit: "exit",
1571
+ transition: {
1572
+ x: { type: "spring", stiffness: 300, damping: 30 },
1573
+ opacity: { duration: 0.2 }
1574
+ },
1575
+ drag: "x",
1576
+ dragConstraints: { left: 0, right: 0 },
1577
+ dragElastic: 1,
1578
+ onDragEnd: (e, { offset, velocity }) => {
1579
+ const swipe = swipePower(offset.x, velocity.x);
1580
+ if (swipe < -swipeConfidenceThreshold) {
1581
+ const date = new Date(panels[0].viewMonth);
1582
+ date.setMonth(date.getMonth() + 1);
1583
+ panels[0].onMonthChange?.(date);
1584
+ } else if (swipe > swipeConfidenceThreshold) {
1585
+ const date = new Date(panels[0].viewMonth);
1586
+ date.setMonth(date.getMonth() - 1);
1587
+ panels[0].onMonthChange?.(date);
1588
+ }
1589
+ },
1590
+ style: { display: "flex", gap: `${CALENDAR_PANEL_GAP}px`, top: 0, left: 0, width: "100%" }
1591
+ },
1592
+ panels.map((panelOwnerState) => /* @__PURE__ */ import_react14.default.createElement(
1593
+ "div",
1594
+ {
1595
+ key: panelOwnerState.viewMonth.toISOString(),
1596
+ style: {
1597
+ flex: "0 0 auto",
1598
+ width: `${CALENDAR_PANEL_WIDTH}px`,
1599
+ paddingLeft: "16px",
1600
+ paddingRight: "16px",
1601
+ boxSizing: "border-box"
1602
+ }
1603
+ },
1604
+ /* @__PURE__ */ import_react14.default.createElement(PlainPickerDays, { ownerState: panelOwnerState })
1605
+ ))
1606
+ )));
1607
+ };
1608
+ var CalendarPanel = ({
1609
+ ownerState,
1610
+ panelIndex,
1611
+ totalPanels,
1612
+ onPrev,
1613
+ onNext,
1614
+ onSwitchView,
1615
+ isMonthViewAssistHintOpen,
1616
+ monthViewHintMessage
1617
+ }) => {
1618
+ const showPrev = panelIndex === 0;
1619
+ const showNext = panelIndex === totalPanels - 1;
1620
+ const title = ownerState.view === "month" ? getYearName(ownerState.viewMonth, ownerState.locale || "default") : getMonthName(ownerState.viewMonth, ownerState.locale || "default");
1621
+ return /* @__PURE__ */ import_react14.default.createElement("div", { style: { flex: 1, maxWidth: `${CALENDAR_PANEL_WIDTH}px` } }, /* @__PURE__ */ import_react14.default.createElement(CalendarHeader, null, /* @__PURE__ */ import_react14.default.createElement(
1622
+ IconButton_default,
1623
+ {
1624
+ size: "sm",
1625
+ onClick: onPrev,
1626
+ "aria-label": `Previous ${ownerState.view === "day" ? "Month" : "Year"}`,
1627
+ style: { visibility: showPrev ? "visible" : "hidden" }
1628
+ },
1629
+ /* @__PURE__ */ import_react14.default.createElement(import_ChevronLeft.default, null)
1630
+ ), /* @__PURE__ */ import_react14.default.createElement(
1631
+ Tooltip_default,
1632
+ {
1633
+ title: monthViewHintMessage,
1634
+ arrow: true,
1635
+ open: panelIndex === 0 && isMonthViewAssistHintOpen,
1636
+ placement: "bottom",
1637
+ disableFocusListener: true,
1638
+ disableHoverListener: true,
1639
+ disableTouchListener: true,
1640
+ variant: "solid"
1641
+ },
1642
+ /* @__PURE__ */ import_react14.default.createElement(
1643
+ CalendarSwitchViewButton,
1644
+ {
1645
+ ownerState,
1646
+ variant: "plain",
1647
+ color: "neutral",
1648
+ onClick: onSwitchView,
1649
+ "aria-label": "Switch Calendar View"
1650
+ },
1651
+ title
1652
+ )
1653
+ ), /* @__PURE__ */ import_react14.default.createElement(
1654
+ IconButton_default,
1655
+ {
1656
+ size: "sm",
1657
+ onClick: onNext,
1658
+ "aria-label": `Next ${ownerState.view === "day" ? "Month" : "Year"}`,
1659
+ style: { visibility: showNext ? "visible" : "hidden" }
1660
+ },
1661
+ /* @__PURE__ */ import_react14.default.createElement(import_ChevronRight.default, null)
1662
+ )));
1663
+ };
1516
1664
  var Calendar = (0, import_react14.forwardRef)((inProps, ref) => {
1517
1665
  const [props, ownerState] = useCalendarProps(inProps);
1518
1666
  const {
@@ -1529,6 +1677,7 @@ var Calendar = (0, import_react14.forwardRef)((inProps, ref) => {
1529
1677
  maxDate,
1530
1678
  disableFuture,
1531
1679
  disablePast,
1680
+ numberOfMonths,
1532
1681
  ...others
1533
1682
  } = props;
1534
1683
  const { calendarTitle, onPrev, onNext } = useCalendar(ownerState);
@@ -1536,6 +1685,9 @@ var Calendar = (0, import_react14.forwardRef)((inProps, ref) => {
1536
1685
  const monthNavClickTimestampsRef = (0, import_react14.useRef)([]);
1537
1686
  const monthViewAssistHintShownInSessionRef = (0, import_react14.useRef)(false);
1538
1687
  const monthViewAssistHintTimeoutRef = (0, import_react14.useRef)(null);
1688
+ const [hoverDay, setHoverDay] = (0, import_react14.useState)(null);
1689
+ const [hoverMonth, setHoverMonth] = (0, import_react14.useState)(null);
1690
+ const resolvedNumberOfMonths = numberOfMonths ?? 1;
1539
1691
  const hasEndDate = Boolean(value?.[1]);
1540
1692
  const isRangeHintEligible = Boolean(rangeSelection && !hasEndDate);
1541
1693
  const isHintEligible = Boolean(view === "day" && (!rangeSelection || isRangeHintEligible));
@@ -1598,7 +1750,71 @@ var Calendar = (0, import_react14.forwardRef)((inProps, ref) => {
1598
1750
  closeMonthViewAssistHint();
1599
1751
  onViewChange?.();
1600
1752
  }, [closeMonthViewAssistHint, onViewChange]);
1601
- return /* @__PURE__ */ import_react14.default.createElement(CalendarRoot, { ref, ...others }, /* @__PURE__ */ import_react14.default.createElement(CalendarHeader, null, /* @__PURE__ */ import_react14.default.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": `Previous ${view === "day" ? "Month" : "Year"}` }, /* @__PURE__ */ import_react14.default.createElement(import_ChevronLeft.default, null)), /* @__PURE__ */ import_react14.default.createElement(
1753
+ const maxWidth = CALENDAR_PANEL_WIDTH * resolvedNumberOfMonths + CALENDAR_PANEL_GAP * (resolvedNumberOfMonths - 1);
1754
+ if (resolvedNumberOfMonths > 1) {
1755
+ const panels = Array.from({ length: resolvedNumberOfMonths }, (_, i) => {
1756
+ const panelViewMonth = new Date(ownerState.viewMonth);
1757
+ panelViewMonth.setMonth(panelViewMonth.getMonth() + i);
1758
+ panelViewMonth.setDate(1);
1759
+ panelViewMonth.setHours(0, 0, 0, 0);
1760
+ return {
1761
+ ...ownerState,
1762
+ viewMonth: panelViewMonth,
1763
+ hoverDay,
1764
+ onHoverDayChange: setHoverDay,
1765
+ hoverMonth,
1766
+ onHoverMonthChange: setHoverMonth
1767
+ };
1768
+ });
1769
+ return /* @__PURE__ */ import_react14.default.createElement(CalendarRoot, { ref, ...others, style: { maxWidth: `${maxWidth}px` } }, view === "month" ? (
1770
+ // Month view: single header + single month grid (consistent with single-month path)
1771
+ /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement(CalendarHeader, null, /* @__PURE__ */ import_react14.default.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": "Previous Year" }, /* @__PURE__ */ import_react14.default.createElement(import_ChevronLeft.default, null)), /* @__PURE__ */ import_react14.default.createElement(
1772
+ Tooltip_default,
1773
+ {
1774
+ title: monthViewHintMessage,
1775
+ arrow: true,
1776
+ open: false,
1777
+ placement: "bottom",
1778
+ disableFocusListener: true,
1779
+ disableHoverListener: true,
1780
+ disableTouchListener: true,
1781
+ variant: "solid"
1782
+ },
1783
+ /* @__PURE__ */ import_react14.default.createElement(
1784
+ CalendarSwitchViewButton,
1785
+ {
1786
+ ownerState,
1787
+ variant: "plain",
1788
+ color: "neutral",
1789
+ onClick: handleSwitchViewClick,
1790
+ "aria-label": "Switch Calendar View"
1791
+ },
1792
+ calendarTitle
1793
+ )
1794
+ ), /* @__PURE__ */ import_react14.default.createElement(IconButton_default, { size: "sm", onClick: handleNextClick, "aria-label": "Next Year" }, /* @__PURE__ */ import_react14.default.createElement(import_ChevronRight.default, null))), /* @__PURE__ */ import_react14.default.createElement(PickerMonths, { ownerState }))
1795
+ ) : /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement(CalendarMultiContainer, null, panels.map((panelOwnerState, i) => /* @__PURE__ */ import_react14.default.createElement(
1796
+ CalendarPanel,
1797
+ {
1798
+ key: panelOwnerState.viewMonth.toISOString(),
1799
+ ownerState: panelOwnerState,
1800
+ panelIndex: i,
1801
+ totalPanels: resolvedNumberOfMonths,
1802
+ onPrev: handlePrevClick,
1803
+ onNext: handleNextClick,
1804
+ onSwitchView: handleSwitchViewClick,
1805
+ isMonthViewAssistHintOpen,
1806
+ monthViewHintMessage
1807
+ }
1808
+ ))), /* @__PURE__ */ import_react14.default.createElement(
1809
+ MultiMonthPickerDays,
1810
+ {
1811
+ panels,
1812
+ direction: ownerState.direction,
1813
+ numberOfMonths: resolvedNumberOfMonths
1814
+ }
1815
+ )));
1816
+ }
1817
+ return /* @__PURE__ */ import_react14.default.createElement(CalendarRoot, { ref, ...others, style: { maxWidth: `${maxWidth}px` } }, /* @__PURE__ */ import_react14.default.createElement(CalendarHeader, null, /* @__PURE__ */ import_react14.default.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": `Previous ${view === "day" ? "Month" : "Year"}` }, /* @__PURE__ */ import_react14.default.createElement(import_ChevronLeft.default, null)), /* @__PURE__ */ import_react14.default.createElement(
1602
1818
  Tooltip_default,
1603
1819
  {
1604
1820
  title: monthViewHintMessage,
@@ -4965,6 +5181,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4965
5181
  hideClearButton,
4966
5182
  readOnly,
4967
5183
  presets,
5184
+ numberOfMonths,
4968
5185
  ...innerProps
4969
5186
  } = props;
4970
5187
  const innerRef = (0, import_react29.useRef)(null);
@@ -5161,7 +5378,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
5161
5378
  "aria-label": "Calendar Tooltip",
5162
5379
  "aria-expanded": open
5163
5380
  },
5164
- /* @__PURE__ */ import_react29.default.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react29.default.createElement(CalendarSheetContent2, null, /* @__PURE__ */ import_react29.default.createElement(CalendarSection2, null, /* @__PURE__ */ import_react29.default.createElement(
5381
+ /* @__PURE__ */ import_react29.default.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react29.default.createElement(CalendarSheetContent2, null, /* @__PURE__ */ import_react29.default.createElement(CalendarSection2, { style: { width: "auto" } }, /* @__PURE__ */ import_react29.default.createElement(
5165
5382
  Calendar_default,
5166
5383
  {
5167
5384
  rangeSelection: true,
@@ -5171,7 +5388,8 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
5171
5388
  maxDate: maxDate ? new Date(maxDate) : void 0,
5172
5389
  disableFuture,
5173
5390
  disablePast,
5174
- locale
5391
+ locale,
5392
+ numberOfMonths
5175
5393
  }
5176
5394
  ), !hideClearButton && /* @__PURE__ */ import_react29.default.createElement(
5177
5395
  DialogActions_default,
package/dist/index.js CHANGED
@@ -878,8 +878,12 @@ var useCalendarProps = (inProps) => {
878
878
  // src/components/Calendar/hooks/use-calendar.ts
879
879
  import { useCallback as useCallback4, useState as useState3 } from "react";
880
880
  var useCalendar = (ownerState) => {
881
- const [hoverDay, setHoverDay] = useState3(null);
882
- const [hoverMonth, setHoverMonth] = useState3(null);
881
+ const [localHoverDay, setLocalHoverDay] = useState3(null);
882
+ const [localHoverMonth, setLocalHoverMonth] = useState3(null);
883
+ const hoverDay = ownerState.hoverDay !== void 0 ? ownerState.hoverDay : localHoverDay;
884
+ const setHoverDay = ownerState.onHoverDayChange ?? setLocalHoverDay;
885
+ const hoverMonth = ownerState.hoverMonth !== void 0 ? ownerState.hoverMonth : localHoverMonth;
886
+ const setHoverMonth = ownerState.onHoverMonthChange ?? setLocalHoverMonth;
883
887
  return {
884
888
  calendarTitle: ownerState.view === "month" ? getYearName(ownerState.viewMonth, ownerState.locale || "default") : getMonthName(ownerState.viewMonth, ownerState.locale || "default"),
885
889
  onPrev: useCallback4(() => {
@@ -1078,11 +1082,18 @@ var MONTH_NAV_CLICK_THRESHOLD = 3;
1078
1082
  var MONTH_VIEW_HINT_DURATION_MS = 5e3;
1079
1083
  var MONTH_VIEW_HINT_COOLDOWN_MS = 3e4;
1080
1084
  var lastMonthViewAssistHintShownAt = 0;
1085
+ var CALENDAR_PANEL_WIDTH = 264;
1086
+ var CALENDAR_PANEL_GAP = 16;
1081
1087
  var CalendarRoot = styled5("div", {
1082
1088
  name: "Calendar",
1083
1089
  slot: "root"
1090
+ })({});
1091
+ var CalendarMultiContainer = styled5("div", {
1092
+ name: "Calendar",
1093
+ slot: "multiContainer"
1084
1094
  })({
1085
- maxWidth: "264px"
1095
+ display: "flex",
1096
+ gap: `${CALENDAR_PANEL_GAP}px`
1086
1097
  });
1087
1098
  var CalendarHeader = styled5("div", {
1088
1099
  name: "Calendar",
@@ -1117,6 +1128,16 @@ var CalendarViewTable = styled5(motion13.table, {
1117
1128
  paddingBottom: theme.spacing(2)
1118
1129
  }
1119
1130
  }));
1131
+ var StaticCalendarViewTable = styled5("table")(({ theme }) => ({
1132
+ borderSpacing: 0,
1133
+ "& td, & th": {
1134
+ padding: 0
1135
+ },
1136
+ "& th": {
1137
+ paddingTop: theme.spacing(2),
1138
+ paddingBottom: theme.spacing(2)
1139
+ }
1140
+ }));
1120
1141
  var CalendarWeekHeaderContainer = styled5("thead", {
1121
1142
  name: "Calendar",
1122
1143
  slot: "weekHeaderContainer"
@@ -1365,6 +1386,133 @@ var PickerMonths = (props) => {
1365
1386
  /* @__PURE__ */ React12.createElement("tbody", null, chunkedMonths.map((months, i) => /* @__PURE__ */ React12.createElement(Fragment, { key: months.join("_") }, /* @__PURE__ */ React12.createElement("tr", null, months.map((monthIndex, j) => /* @__PURE__ */ React12.createElement(Fragment, { key: monthIndex }, /* @__PURE__ */ React12.createElement(CalendarMonthCell, { ...getMonthCellProps(monthIndex) }, /* @__PURE__ */ React12.createElement(CalendarMonth, { size: "sm", variant: "plain", color: "neutral", ...getPickerMonthProps(monthIndex) }, getMonthNameFromIndex(monthIndex, ownerState.locale))), j < 3 && /* @__PURE__ */ React12.createElement("td", { style: { width: 4 }, "aria-hidden": "true", "aria-description": "cell-gap" })))), i < chunkedMonths.length - 1 && /* @__PURE__ */ React12.createElement("tr", { "aria-hidden": "true", "aria-description": "row-gap" }, /* @__PURE__ */ React12.createElement("td", { colSpan: 7, style: { height: 4 } })))))
1366
1387
  )));
1367
1388
  };
1389
+ var PlainPickerDays = ({ ownerState }) => {
1390
+ const { getPickerDayProps, getDayCellProps } = useCalendar(ownerState);
1391
+ const calendarDates = useMemo4(() => getCalendarDates(ownerState.viewMonth), [ownerState.viewMonth]);
1392
+ const weekdayNames = useMemo4(() => getWeekdayNames(ownerState.locale || "default"), [ownerState.locale]);
1393
+ return /* @__PURE__ */ React12.createElement(StaticCalendarViewTable, null, /* @__PURE__ */ React12.createElement(CalendarWeekHeaderContainer, null, /* @__PURE__ */ React12.createElement("tr", null, weekdayNames.map((name, i) => /* @__PURE__ */ React12.createElement(Fragment, { key: `${ownerState.viewMonth}_${name}_${i}` }, /* @__PURE__ */ React12.createElement("th", null, /* @__PURE__ */ React12.createElement(Typography_default, { level: "body-xs", textAlign: "center" }, name)), i < 6 && /* @__PURE__ */ React12.createElement("th", { style: { width: 4 }, "aria-hidden": "true", "aria-description": "cell-gap" }))))), /* @__PURE__ */ React12.createElement(CalendarDayPickerContainer, null, calendarDates.map((weekDates, rowIndex) => /* @__PURE__ */ React12.createElement(Fragment, { key: `${ownerState.viewMonth}_${rowIndex}` }, /* @__PURE__ */ React12.createElement("tr", null, weekDates.map(
1394
+ (date, i) => date ? /* @__PURE__ */ React12.createElement(Fragment, { key: `${ownerState.viewMonth}_${date}_${i}` }, /* @__PURE__ */ React12.createElement(CalendarDayCell, { ...getDayCellProps(date) }, /* @__PURE__ */ React12.createElement(CalendarDay, { size: "sm", variant: "plain", color: "neutral", ...getPickerDayProps(date) }, date)), i < 6 && /* @__PURE__ */ React12.createElement("td", { "aria-hidden": "true", "aria-description": "cell-gap" })) : /* @__PURE__ */ React12.createElement(Fragment, { key: `${ownerState.viewMonth}_${i}` }, /* @__PURE__ */ React12.createElement("td", null), i < 6 && /* @__PURE__ */ React12.createElement("td", { "aria-hidden": "true", "aria-description": "cell-gap" }))
1395
+ )), rowIndex < calendarDates.length - 1 && /* @__PURE__ */ React12.createElement("tr", { "aria-hidden": "true", "aria-description": "row-gap" }, /* @__PURE__ */ React12.createElement("td", { colSpan: 13, style: { height: 4 } }))))));
1396
+ };
1397
+ var MultiMonthPickerDays = ({
1398
+ panels,
1399
+ direction,
1400
+ numberOfMonths
1401
+ }) => {
1402
+ const slideDistance = CALENDAR_PANEL_WIDTH * numberOfMonths + CALENDAR_PANEL_GAP * (numberOfMonths - 1) + CALENDAR_PANEL_WIDTH;
1403
+ const multiVariants = {
1404
+ enter: (dir) => ({ x: dir > 0 ? slideDistance : -slideDistance, opacity: 0 }),
1405
+ center: { position: "relative", zIndex: 1, x: 0, opacity: 1 },
1406
+ exit: (dir) => ({
1407
+ position: "absolute",
1408
+ zIndex: 0,
1409
+ x: dir < 0 ? slideDistance : -slideDistance,
1410
+ opacity: 0
1411
+ })
1412
+ };
1413
+ const key = `${panels[0].viewMonth.toISOString()}_${direction}`;
1414
+ return /* @__PURE__ */ React12.createElement("div", { style: { position: "relative", overflow: "hidden", minHeight: "250px" } }, /* @__PURE__ */ React12.createElement(AnimatePresence, { initial: false, custom: direction }, /* @__PURE__ */ React12.createElement(
1415
+ motion13.div,
1416
+ {
1417
+ key,
1418
+ custom: direction,
1419
+ variants: multiVariants,
1420
+ initial: "enter",
1421
+ animate: "center",
1422
+ exit: "exit",
1423
+ transition: {
1424
+ x: { type: "spring", stiffness: 300, damping: 30 },
1425
+ opacity: { duration: 0.2 }
1426
+ },
1427
+ drag: "x",
1428
+ dragConstraints: { left: 0, right: 0 },
1429
+ dragElastic: 1,
1430
+ onDragEnd: (e, { offset, velocity }) => {
1431
+ const swipe = swipePower(offset.x, velocity.x);
1432
+ if (swipe < -swipeConfidenceThreshold) {
1433
+ const date = new Date(panels[0].viewMonth);
1434
+ date.setMonth(date.getMonth() + 1);
1435
+ panels[0].onMonthChange?.(date);
1436
+ } else if (swipe > swipeConfidenceThreshold) {
1437
+ const date = new Date(panels[0].viewMonth);
1438
+ date.setMonth(date.getMonth() - 1);
1439
+ panels[0].onMonthChange?.(date);
1440
+ }
1441
+ },
1442
+ style: { display: "flex", gap: `${CALENDAR_PANEL_GAP}px`, top: 0, left: 0, width: "100%" }
1443
+ },
1444
+ panels.map((panelOwnerState) => /* @__PURE__ */ React12.createElement(
1445
+ "div",
1446
+ {
1447
+ key: panelOwnerState.viewMonth.toISOString(),
1448
+ style: {
1449
+ flex: "0 0 auto",
1450
+ width: `${CALENDAR_PANEL_WIDTH}px`,
1451
+ paddingLeft: "16px",
1452
+ paddingRight: "16px",
1453
+ boxSizing: "border-box"
1454
+ }
1455
+ },
1456
+ /* @__PURE__ */ React12.createElement(PlainPickerDays, { ownerState: panelOwnerState })
1457
+ ))
1458
+ )));
1459
+ };
1460
+ var CalendarPanel = ({
1461
+ ownerState,
1462
+ panelIndex,
1463
+ totalPanels,
1464
+ onPrev,
1465
+ onNext,
1466
+ onSwitchView,
1467
+ isMonthViewAssistHintOpen,
1468
+ monthViewHintMessage
1469
+ }) => {
1470
+ const showPrev = panelIndex === 0;
1471
+ const showNext = panelIndex === totalPanels - 1;
1472
+ const title = ownerState.view === "month" ? getYearName(ownerState.viewMonth, ownerState.locale || "default") : getMonthName(ownerState.viewMonth, ownerState.locale || "default");
1473
+ return /* @__PURE__ */ React12.createElement("div", { style: { flex: 1, maxWidth: `${CALENDAR_PANEL_WIDTH}px` } }, /* @__PURE__ */ React12.createElement(CalendarHeader, null, /* @__PURE__ */ React12.createElement(
1474
+ IconButton_default,
1475
+ {
1476
+ size: "sm",
1477
+ onClick: onPrev,
1478
+ "aria-label": `Previous ${ownerState.view === "day" ? "Month" : "Year"}`,
1479
+ style: { visibility: showPrev ? "visible" : "hidden" }
1480
+ },
1481
+ /* @__PURE__ */ React12.createElement(ChevronLeftIcon, null)
1482
+ ), /* @__PURE__ */ React12.createElement(
1483
+ Tooltip_default,
1484
+ {
1485
+ title: monthViewHintMessage,
1486
+ arrow: true,
1487
+ open: panelIndex === 0 && isMonthViewAssistHintOpen,
1488
+ placement: "bottom",
1489
+ disableFocusListener: true,
1490
+ disableHoverListener: true,
1491
+ disableTouchListener: true,
1492
+ variant: "solid"
1493
+ },
1494
+ /* @__PURE__ */ React12.createElement(
1495
+ CalendarSwitchViewButton,
1496
+ {
1497
+ ownerState,
1498
+ variant: "plain",
1499
+ color: "neutral",
1500
+ onClick: onSwitchView,
1501
+ "aria-label": "Switch Calendar View"
1502
+ },
1503
+ title
1504
+ )
1505
+ ), /* @__PURE__ */ React12.createElement(
1506
+ IconButton_default,
1507
+ {
1508
+ size: "sm",
1509
+ onClick: onNext,
1510
+ "aria-label": `Next ${ownerState.view === "day" ? "Month" : "Year"}`,
1511
+ style: { visibility: showNext ? "visible" : "hidden" }
1512
+ },
1513
+ /* @__PURE__ */ React12.createElement(ChevronRightIcon, null)
1514
+ )));
1515
+ };
1368
1516
  var Calendar = forwardRef4((inProps, ref) => {
1369
1517
  const [props, ownerState] = useCalendarProps(inProps);
1370
1518
  const {
@@ -1381,6 +1529,7 @@ var Calendar = forwardRef4((inProps, ref) => {
1381
1529
  maxDate,
1382
1530
  disableFuture,
1383
1531
  disablePast,
1532
+ numberOfMonths,
1384
1533
  ...others
1385
1534
  } = props;
1386
1535
  const { calendarTitle, onPrev, onNext } = useCalendar(ownerState);
@@ -1388,6 +1537,9 @@ var Calendar = forwardRef4((inProps, ref) => {
1388
1537
  const monthNavClickTimestampsRef = useRef3([]);
1389
1538
  const monthViewAssistHintShownInSessionRef = useRef3(false);
1390
1539
  const monthViewAssistHintTimeoutRef = useRef3(null);
1540
+ const [hoverDay, setHoverDay] = useState4(null);
1541
+ const [hoverMonth, setHoverMonth] = useState4(null);
1542
+ const resolvedNumberOfMonths = numberOfMonths ?? 1;
1391
1543
  const hasEndDate = Boolean(value?.[1]);
1392
1544
  const isRangeHintEligible = Boolean(rangeSelection && !hasEndDate);
1393
1545
  const isHintEligible = Boolean(view === "day" && (!rangeSelection || isRangeHintEligible));
@@ -1450,7 +1602,71 @@ var Calendar = forwardRef4((inProps, ref) => {
1450
1602
  closeMonthViewAssistHint();
1451
1603
  onViewChange?.();
1452
1604
  }, [closeMonthViewAssistHint, onViewChange]);
1453
- return /* @__PURE__ */ React12.createElement(CalendarRoot, { ref, ...others }, /* @__PURE__ */ React12.createElement(CalendarHeader, null, /* @__PURE__ */ React12.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": `Previous ${view === "day" ? "Month" : "Year"}` }, /* @__PURE__ */ React12.createElement(ChevronLeftIcon, null)), /* @__PURE__ */ React12.createElement(
1605
+ const maxWidth = CALENDAR_PANEL_WIDTH * resolvedNumberOfMonths + CALENDAR_PANEL_GAP * (resolvedNumberOfMonths - 1);
1606
+ if (resolvedNumberOfMonths > 1) {
1607
+ const panels = Array.from({ length: resolvedNumberOfMonths }, (_, i) => {
1608
+ const panelViewMonth = new Date(ownerState.viewMonth);
1609
+ panelViewMonth.setMonth(panelViewMonth.getMonth() + i);
1610
+ panelViewMonth.setDate(1);
1611
+ panelViewMonth.setHours(0, 0, 0, 0);
1612
+ return {
1613
+ ...ownerState,
1614
+ viewMonth: panelViewMonth,
1615
+ hoverDay,
1616
+ onHoverDayChange: setHoverDay,
1617
+ hoverMonth,
1618
+ onHoverMonthChange: setHoverMonth
1619
+ };
1620
+ });
1621
+ return /* @__PURE__ */ React12.createElement(CalendarRoot, { ref, ...others, style: { maxWidth: `${maxWidth}px` } }, view === "month" ? (
1622
+ // Month view: single header + single month grid (consistent with single-month path)
1623
+ /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(CalendarHeader, null, /* @__PURE__ */ React12.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": "Previous Year" }, /* @__PURE__ */ React12.createElement(ChevronLeftIcon, null)), /* @__PURE__ */ React12.createElement(
1624
+ Tooltip_default,
1625
+ {
1626
+ title: monthViewHintMessage,
1627
+ arrow: true,
1628
+ open: false,
1629
+ placement: "bottom",
1630
+ disableFocusListener: true,
1631
+ disableHoverListener: true,
1632
+ disableTouchListener: true,
1633
+ variant: "solid"
1634
+ },
1635
+ /* @__PURE__ */ React12.createElement(
1636
+ CalendarSwitchViewButton,
1637
+ {
1638
+ ownerState,
1639
+ variant: "plain",
1640
+ color: "neutral",
1641
+ onClick: handleSwitchViewClick,
1642
+ "aria-label": "Switch Calendar View"
1643
+ },
1644
+ calendarTitle
1645
+ )
1646
+ ), /* @__PURE__ */ React12.createElement(IconButton_default, { size: "sm", onClick: handleNextClick, "aria-label": "Next Year" }, /* @__PURE__ */ React12.createElement(ChevronRightIcon, null))), /* @__PURE__ */ React12.createElement(PickerMonths, { ownerState }))
1647
+ ) : /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(CalendarMultiContainer, null, panels.map((panelOwnerState, i) => /* @__PURE__ */ React12.createElement(
1648
+ CalendarPanel,
1649
+ {
1650
+ key: panelOwnerState.viewMonth.toISOString(),
1651
+ ownerState: panelOwnerState,
1652
+ panelIndex: i,
1653
+ totalPanels: resolvedNumberOfMonths,
1654
+ onPrev: handlePrevClick,
1655
+ onNext: handleNextClick,
1656
+ onSwitchView: handleSwitchViewClick,
1657
+ isMonthViewAssistHintOpen,
1658
+ monthViewHintMessage
1659
+ }
1660
+ ))), /* @__PURE__ */ React12.createElement(
1661
+ MultiMonthPickerDays,
1662
+ {
1663
+ panels,
1664
+ direction: ownerState.direction,
1665
+ numberOfMonths: resolvedNumberOfMonths
1666
+ }
1667
+ )));
1668
+ }
1669
+ return /* @__PURE__ */ React12.createElement(CalendarRoot, { ref, ...others, style: { maxWidth: `${maxWidth}px` } }, /* @__PURE__ */ React12.createElement(CalendarHeader, null, /* @__PURE__ */ React12.createElement(IconButton_default, { size: "sm", onClick: handlePrevClick, "aria-label": `Previous ${view === "day" ? "Month" : "Year"}` }, /* @__PURE__ */ React12.createElement(ChevronLeftIcon, null)), /* @__PURE__ */ React12.createElement(
1454
1670
  Tooltip_default,
1455
1671
  {
1456
1672
  title: monthViewHintMessage,
@@ -4840,6 +5056,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4840
5056
  hideClearButton,
4841
5057
  readOnly,
4842
5058
  presets,
5059
+ numberOfMonths,
4843
5060
  ...innerProps
4844
5061
  } = props;
4845
5062
  const innerRef = useRef8(null);
@@ -5036,7 +5253,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
5036
5253
  "aria-label": "Calendar Tooltip",
5037
5254
  "aria-expanded": open
5038
5255
  },
5039
- /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(CalendarSheetContent2, null, /* @__PURE__ */ React26.createElement(CalendarSection2, null, /* @__PURE__ */ React26.createElement(
5256
+ /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(CalendarSheetContent2, null, /* @__PURE__ */ React26.createElement(CalendarSection2, { style: { width: "auto" } }, /* @__PURE__ */ React26.createElement(
5040
5257
  Calendar_default,
5041
5258
  {
5042
5259
  rangeSelection: true,
@@ -5046,7 +5263,8 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
5046
5263
  maxDate: maxDate ? new Date(maxDate) : void 0,
5047
5264
  disableFuture,
5048
5265
  disablePast,
5049
- locale
5266
+ locale,
5267
+ numberOfMonths
5050
5268
  }
5051
5269
  ), !hideClearButton && /* @__PURE__ */ React26.createElement(
5052
5270
  DialogActions_default,