@rufous/ui 0.1.84 → 0.1.85

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/main.cjs CHANGED
@@ -28749,6 +28749,7 @@ __export(main_exports, {
28749
28749
  SuspendUserIcon: () => suspendUserIcon_default,
28750
28750
  Switch: () => Switch,
28751
28751
  Tab: () => Tab,
28752
+ TabPanel: () => TabPanel,
28752
28753
  Tabs: () => Tabs,
28753
28754
  TechnicalSkillsIcon: () => technicalSkillsIcon_default,
28754
28755
  TextField: () => TextField,
@@ -30644,10 +30645,25 @@ var MONTHS = [
30644
30645
  "November",
30645
30646
  "December"
30646
30647
  ];
30648
+ var MONTHS_SHORT = [
30649
+ "Jan",
30650
+ "Feb",
30651
+ "Mar",
30652
+ "Apr",
30653
+ "May",
30654
+ "Jun",
30655
+ "Jul",
30656
+ "Aug",
30657
+ "Sep",
30658
+ "Oct",
30659
+ "Nov",
30660
+ "Dec"
30661
+ ];
30647
30662
  var formatDisplay = (d, fmt = "MM/DD/YYYY") => {
30648
30663
  const mm = String(d.getMonth() + 1).padStart(2, "0");
30649
30664
  const dd = String(d.getDate()).padStart(2, "0");
30650
30665
  const yyyy = String(d.getFullYear());
30666
+ const day = d.getDate();
30651
30667
  switch (fmt) {
30652
30668
  case "DD/MM/YYYY":
30653
30669
  return `${dd}/${mm}/${yyyy}`;
@@ -30659,13 +30675,49 @@ var formatDisplay = (d, fmt = "MM/DD/YYYY") => {
30659
30675
  return `${mm}-${dd}-${yyyy}`;
30660
30676
  case "YYYY/MM/DD":
30661
30677
  return `${yyyy}/${mm}/${dd}`;
30678
+ case "DD MMM YYYY":
30679
+ return `${dd} ${MONTHS_SHORT[d.getMonth()]} ${yyyy}`;
30680
+ case "MMM DD, YYYY":
30681
+ return `${MONTHS_SHORT[d.getMonth()]} ${dd}, ${yyyy}`;
30682
+ case "DD MMMM YYYY":
30683
+ return `${dd} ${MONTHS[d.getMonth()]} ${yyyy}`;
30684
+ case "MMMM DD, YYYY":
30685
+ return `${MONTHS[d.getMonth()]} ${dd}, ${yyyy}`;
30662
30686
  case "MM/DD/YYYY":
30663
30687
  default:
30664
30688
  return `${mm}/${dd}/${yyyy}`;
30665
30689
  }
30666
30690
  };
30667
30691
  var formatTimeDisplay = (h, m, ampm) => `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")} ${ampm}`;
30692
+ var parseMonthName = (name) => {
30693
+ const lower = name.toLowerCase();
30694
+ let idx = MONTHS.findIndex((m) => m.toLowerCase() === lower);
30695
+ if (idx >= 0) return idx;
30696
+ idx = MONTHS_SHORT.findIndex((m) => m.toLowerCase() === lower);
30697
+ return idx;
30698
+ };
30668
30699
  var parseDisplay = (str, fmt = "MM/DD/YYYY") => {
30700
+ if (fmt === "DD MMM YYYY" || fmt === "DD MMMM YYYY") {
30701
+ const parts2 = str.split(" ");
30702
+ if (parts2.length !== 3) return null;
30703
+ const dd2 = parseInt(parts2[0], 10);
30704
+ const mm2 = parseMonthName(parts2[1]);
30705
+ const yyyy2 = parseInt(parts2[2], 10);
30706
+ if (isNaN(dd2) || mm2 < 0 || isNaN(yyyy2) || yyyy2 < 1e3) return null;
30707
+ const d2 = new Date(yyyy2, mm2, dd2);
30708
+ return isNaN(d2.getTime()) ? null : d2;
30709
+ }
30710
+ if (fmt === "MMM DD, YYYY" || fmt === "MMMM DD, YYYY") {
30711
+ const cleaned = str.replace(",", "");
30712
+ const parts2 = cleaned.split(" ").filter(Boolean);
30713
+ if (parts2.length !== 3) return null;
30714
+ const mm2 = parseMonthName(parts2[0]);
30715
+ const dd2 = parseInt(parts2[1], 10);
30716
+ const yyyy2 = parseInt(parts2[2], 10);
30717
+ if (mm2 < 0 || isNaN(dd2) || isNaN(yyyy2) || yyyy2 < 1e3) return null;
30718
+ const d2 = new Date(yyyy2, mm2, dd2);
30719
+ return isNaN(d2.getTime()) ? null : d2;
30720
+ }
30669
30721
  const sep = str.includes("/") ? "/" : "-";
30670
30722
  const parts = str.split(sep);
30671
30723
  if (parts.length !== 3) return null;
@@ -30850,27 +30902,89 @@ var CalendarBody = ({
30850
30902
  dayCells,
30851
30903
  onDayClick,
30852
30904
  onPrev,
30853
- onNext
30854
- }) => /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__header" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "rf-date-picker__month-label" }, MONTHS[viewMonth], " ", viewYear), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__nav" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onPrev, "aria-label": "Previous month" }, "\u2039"), /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onNext, "aria-label": "Next month" }, "\u203A"))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__weekdays" }, WEEKDAYS.map((w) => /* @__PURE__ */ import_react19.default.createElement("div", { key: w, className: "rf-date-picker__weekday" }, w))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__grid" }, dayCells.map((day, idx) => {
30855
- if (day === null) return /* @__PURE__ */ import_react19.default.createElement("div", { key: `e-${idx}`, className: "rf-date-picker__day rf-date-picker__day--empty" });
30856
- const cellDate = new Date(viewYear, viewMonth, day);
30857
- const isSelected = selectedDate ? isSameDay(cellDate, selectedDate) : false;
30858
- const isToday = isSameDay(cellDate, todayDate);
30859
- return /* @__PURE__ */ import_react19.default.createElement(
30905
+ onNext,
30906
+ onMonthSelect,
30907
+ onYearSelect
30908
+ }) => {
30909
+ const [pickerView, setPickerView] = (0, import_react19.useState)("calendar");
30910
+ const handleMonthClick = () => {
30911
+ setPickerView(pickerView === "month" ? "calendar" : "month");
30912
+ };
30913
+ const handleYearClick = () => {
30914
+ setPickerView(pickerView === "year" ? "calendar" : "year");
30915
+ };
30916
+ const handleMonthPick = (month) => {
30917
+ onMonthSelect(month);
30918
+ setPickerView("calendar");
30919
+ };
30920
+ const handleYearPick = (year) => {
30921
+ onYearSelect(year);
30922
+ setPickerView("calendar");
30923
+ };
30924
+ const currentYear = todayDate.getFullYear();
30925
+ const yearStart = viewYear - 6;
30926
+ const years = Array.from({ length: 16 }, (_, i) => yearStart + i);
30927
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__header" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__header-labels" }, /* @__PURE__ */ import_react19.default.createElement(
30928
+ "span",
30929
+ {
30930
+ className: `rf-date-picker__month-label ${pickerView === "month" ? "rf-date-picker__month-label--active" : ""}`,
30931
+ onClick: handleMonthClick
30932
+ },
30933
+ MONTHS[viewMonth]
30934
+ ), /* @__PURE__ */ import_react19.default.createElement(
30935
+ "span",
30936
+ {
30937
+ className: `rf-date-picker__year-label ${pickerView === "year" ? "rf-date-picker__year-label--active" : ""}`,
30938
+ onClick: handleYearClick
30939
+ },
30940
+ viewYear
30941
+ )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__nav" }, pickerView === "year" ? /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: () => onYearSelect(viewYear - 16), "aria-label": "Previous years" }, "\u2039"), /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: () => onYearSelect(viewYear + 16), "aria-label": "Next years" }, "\u203A")) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onPrev, "aria-label": "Previous month" }, "\u2039"), /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onNext, "aria-label": "Next month" }, "\u203A")))), pickerView === "month" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__month-grid" }, MONTHS_SHORT.map((m, idx) => /* @__PURE__ */ import_react19.default.createElement(
30860
30942
  "button",
30861
30943
  {
30862
- key: day,
30944
+ key: m,
30863
30945
  type: "button",
30864
30946
  className: [
30865
- "rf-date-picker__day",
30866
- isSelected ? "rf-date-picker__day--selected" : "",
30867
- isToday && !isSelected ? "rf-date-picker__day--today" : ""
30947
+ "rf-date-picker__month-cell",
30948
+ idx === viewMonth ? "rf-date-picker__month-cell--selected" : "",
30949
+ idx === todayDate.getMonth() && viewYear === currentYear ? "rf-date-picker__month-cell--current" : ""
30868
30950
  ].filter(Boolean).join(" "),
30869
- onClick: () => onDayClick(day)
30951
+ onClick: () => handleMonthPick(idx)
30870
30952
  },
30871
- day
30872
- );
30873
- })));
30953
+ m
30954
+ ))), pickerView === "year" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__year-grid" }, years.map((y) => /* @__PURE__ */ import_react19.default.createElement(
30955
+ "button",
30956
+ {
30957
+ key: y,
30958
+ type: "button",
30959
+ className: [
30960
+ "rf-date-picker__year-cell",
30961
+ y === viewYear ? "rf-date-picker__year-cell--selected" : "",
30962
+ y === currentYear ? "rf-date-picker__year-cell--current" : ""
30963
+ ].filter(Boolean).join(" "),
30964
+ onClick: () => handleYearPick(y)
30965
+ },
30966
+ y
30967
+ ))), pickerView === "calendar" && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__weekdays" }, WEEKDAYS.map((w) => /* @__PURE__ */ import_react19.default.createElement("div", { key: w, className: "rf-date-picker__weekday" }, w))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__grid" }, dayCells.map((day, idx) => {
30968
+ if (day === null) return /* @__PURE__ */ import_react19.default.createElement("div", { key: `e-${idx}`, className: "rf-date-picker__day rf-date-picker__day--empty" });
30969
+ const cellDate = new Date(viewYear, viewMonth, day);
30970
+ const isSelected = selectedDate ? isSameDay(cellDate, selectedDate) : false;
30971
+ const isToday = isSameDay(cellDate, todayDate);
30972
+ return /* @__PURE__ */ import_react19.default.createElement(
30973
+ "button",
30974
+ {
30975
+ key: day,
30976
+ type: "button",
30977
+ className: [
30978
+ "rf-date-picker__day",
30979
+ isSelected ? "rf-date-picker__day--selected" : "",
30980
+ isToday && !isSelected ? "rf-date-picker__day--today" : ""
30981
+ ].filter(Boolean).join(" "),
30982
+ onClick: () => onDayClick(day)
30983
+ },
30984
+ day
30985
+ );
30986
+ }))));
30987
+ };
30874
30988
  var DateField = ({
30875
30989
  label,
30876
30990
  value,
@@ -30928,7 +31042,9 @@ var DateField = ({
30928
31042
  const MINUTES = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, "0"));
30929
31043
  const AMPMS = ["AM", "PM"];
30930
31044
  const containerRef = (0, import_react19.useRef)(null);
30931
- const inputId = (0, import_react19.useRef)(`rf-df-${Math.random().toString(36).substr(2, 9)}`).current;
31045
+ const pickerRef = (0, import_react19.useRef)(null);
31046
+ const [dropUp, setDropUp] = (0, import_react19.useState)(false);
31047
+ const inputId = (0, import_react19.useRef)(`rf-df-${Math.random().toString(36).substring(2, 11)}`).current;
30932
31048
  (0, import_react19.useEffect)(() => {
30933
31049
  if (value === void 0) return;
30934
31050
  if (!value) {
@@ -30960,6 +31076,13 @@ var DateField = ({
30960
31076
  document.addEventListener("mousedown", handler);
30961
31077
  return () => document.removeEventListener("mousedown", handler);
30962
31078
  }, [open]);
31079
+ (0, import_react19.useEffect)(() => {
31080
+ if (!open || !containerRef.current) return;
31081
+ const rect = containerRef.current.getBoundingClientRect();
31082
+ const spaceBelow = window.innerHeight - rect.bottom;
31083
+ const pickerHeight = 400;
31084
+ setDropUp(spaceBelow < pickerHeight && rect.top > pickerHeight);
31085
+ }, [open]);
30963
31086
  const commitDate = (0, import_react19.useCallback)((d, h, m, ap) => {
30964
31087
  setSelectedDate(d);
30965
31088
  if (!d) {
@@ -31152,9 +31275,11 @@ var DateField = ({
31152
31275
  ), open && !disabled && /* @__PURE__ */ import_react19.default.createElement(
31153
31276
  "div",
31154
31277
  {
31278
+ ref: pickerRef,
31155
31279
  className: [
31156
31280
  "rf-date-picker",
31157
- isSideVariant ? "rf-date-picker--side" : ""
31281
+ isSideVariant ? "rf-date-picker--side" : "",
31282
+ dropUp ? "rf-date-picker--drop-up" : ""
31158
31283
  ].filter(Boolean).join(" "),
31159
31284
  onMouseDown: (e) => e.preventDefault()
31160
31285
  },
@@ -31168,7 +31293,9 @@ var DateField = ({
31168
31293
  dayCells,
31169
31294
  onDayClick: handleDayClick,
31170
31295
  onPrev: prevMonth,
31171
- onNext: nextMonth
31296
+ onNext: nextMonth,
31297
+ onMonthSelect: setViewMonth,
31298
+ onYearSelect: setViewYear
31172
31299
  }
31173
31300
  ), type === "datetime" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement(
31174
31301
  SpinnerPanel,
@@ -31240,7 +31367,7 @@ var MONTHS2 = [
31240
31367
  "November",
31241
31368
  "December"
31242
31369
  ];
31243
- var MONTHS_SHORT = [
31370
+ var MONTHS_SHORT2 = [
31244
31371
  "Jan",
31245
31372
  "Feb",
31246
31373
  "Mar",
@@ -31277,14 +31404,14 @@ var dateToISO = (d) => {
31277
31404
  const dd = String(d.getDate()).padStart(2, "0");
31278
31405
  return `${y}-${mo}-${dd}`;
31279
31406
  };
31280
- var formatShort = (d) => `${String(d.getDate()).padStart(2, "0")} ${MONTHS_SHORT[d.getMonth()]} ${d.getFullYear()}`;
31407
+ var formatShort = (d) => `${String(d.getDate()).padStart(2, "0")} ${MONTHS_SHORT2[d.getMonth()]} ${d.getFullYear()}`;
31281
31408
  var parseInputDate = (str) => {
31282
31409
  const s = str.trim();
31283
31410
  if (!s) return null;
31284
31411
  const shortMatch = s.match(/^(\d{1,2})\s+([A-Za-z]+)\s+(\d{4})$/);
31285
31412
  if (shortMatch) {
31286
31413
  const day = parseInt(shortMatch[1], 10);
31287
- const monthIdx = MONTHS_SHORT.findIndex((m) => m.toLowerCase() === shortMatch[2].toLowerCase());
31414
+ const monthIdx = MONTHS_SHORT2.findIndex((m) => m.toLowerCase() === shortMatch[2].toLowerCase());
31288
31415
  const year = parseInt(shortMatch[3], 10);
31289
31416
  if (monthIdx !== -1 && day >= 1 && day <= 31 && year >= 1e3) {
31290
31417
  const d = new Date(year, monthIdx, day);
@@ -32312,8 +32439,11 @@ function DataGrid({
32312
32439
  actions,
32313
32440
  pageSize: initialPageSize = 10,
32314
32441
  pageSizeOptions = [5, 10, 25, 50],
32315
- title
32442
+ title,
32443
+ className,
32444
+ sx
32316
32445
  }) {
32446
+ const sxClass = useSx(sx);
32317
32447
  const [columnOverrides, setColumnOverrides] = (0, import_react22.useState)({});
32318
32448
  const resolvedColumns = (0, import_react22.useMemo)(() => {
32319
32449
  return initialColumnsProp.map((col) => {
@@ -32614,7 +32744,7 @@ function DataGrid({
32614
32744
  return offset2;
32615
32745
  };
32616
32746
  const hasActiveFilters = advancedFilters.some((f) => f.value);
32617
- return /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-root" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header-info" }, /* @__PURE__ */ import_react22.default.createElement("h2", null, title), /* @__PURE__ */ import_react22.default.createElement("p", null, filteredData.length, " total records")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header-actions" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-search-wrap" }, /* @__PURE__ */ import_react22.default.createElement(import_lucide_react2.Search, { size: 15 }), /* @__PURE__ */ import_react22.default.createElement(
32747
+ return /* @__PURE__ */ import_react22.default.createElement("div", { className: ["dg-root", sxClass, className].filter(Boolean).join(" ") }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header-info" }, /* @__PURE__ */ import_react22.default.createElement("h2", null, title), /* @__PURE__ */ import_react22.default.createElement("p", null, filteredData.length, " total records")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-header-actions" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dg-search-wrap" }, /* @__PURE__ */ import_react22.default.createElement(import_lucide_react2.Search, { size: 15 }), /* @__PURE__ */ import_react22.default.createElement(
32618
32748
  "input",
32619
32749
  {
32620
32750
  className: "dg-search",
@@ -34953,6 +35083,23 @@ var Box = React87.forwardRef(
34953
35083
  margin,
34954
35084
  width,
34955
35085
  height,
35086
+ minWidth,
35087
+ maxWidth,
35088
+ minHeight,
35089
+ maxHeight,
35090
+ flex,
35091
+ flexWrap,
35092
+ flexGrow,
35093
+ flexShrink,
35094
+ overflow,
35095
+ position: position2,
35096
+ top,
35097
+ right,
35098
+ bottom,
35099
+ left,
35100
+ borderRadius,
35101
+ bgcolor,
35102
+ color: color2,
34956
35103
  className,
34957
35104
  style,
34958
35105
  sx,
@@ -34969,6 +35116,23 @@ var Box = React87.forwardRef(
34969
35116
  ...margin !== void 0 ? { margin: typeof margin === "number" ? `${margin}px` : margin } : {},
34970
35117
  ...width !== void 0 ? { width: typeof width === "number" ? `${width}px` : width } : {},
34971
35118
  ...height !== void 0 ? { height: typeof height === "number" ? `${height}px` : height } : {},
35119
+ ...minWidth !== void 0 ? { minWidth: typeof minWidth === "number" ? `${minWidth}px` : minWidth } : {},
35120
+ ...maxWidth !== void 0 ? { maxWidth: typeof maxWidth === "number" ? `${maxWidth}px` : maxWidth } : {},
35121
+ ...minHeight !== void 0 ? { minHeight: typeof minHeight === "number" ? `${minHeight}px` : minHeight } : {},
35122
+ ...maxHeight !== void 0 ? { maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight } : {},
35123
+ ...flex !== void 0 ? { flex } : {},
35124
+ ...flexWrap !== void 0 ? { flexWrap } : {},
35125
+ ...flexGrow !== void 0 ? { flexGrow } : {},
35126
+ ...flexShrink !== void 0 ? { flexShrink } : {},
35127
+ ...overflow !== void 0 ? { overflow } : {},
35128
+ ...position2 !== void 0 ? { position: position2 } : {},
35129
+ ...top !== void 0 ? { top: typeof top === "number" ? `${top}px` : top } : {},
35130
+ ...right !== void 0 ? { right: typeof right === "number" ? `${right}px` : right } : {},
35131
+ ...bottom !== void 0 ? { bottom: typeof bottom === "number" ? `${bottom}px` : bottom } : {},
35132
+ ...left !== void 0 ? { left: typeof left === "number" ? `${left}px` : left } : {},
35133
+ ...borderRadius !== void 0 ? { borderRadius: typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius } : {},
35134
+ ...bgcolor !== void 0 ? { backgroundColor: bgcolor } : {},
35135
+ ...color2 !== void 0 ? { color: color2 } : {},
34972
35136
  ...style
34973
35137
  };
34974
35138
  const classes = ["rf-box", sxClass, className].filter(Boolean).join(" ");
@@ -34989,6 +35153,8 @@ var Stack2 = React88.forwardRef(
34989
35153
  divider,
34990
35154
  flexWrap,
34991
35155
  useFlexGap = true,
35156
+ flex,
35157
+ overflow,
34992
35158
  component: component2 = "div",
34993
35159
  children,
34994
35160
  className,
@@ -35004,6 +35170,8 @@ var Stack2 = React88.forwardRef(
35004
35170
  ...justifyContent !== void 0 ? { justifyContent } : {},
35005
35171
  ...flexWrap !== void 0 ? { flexWrap } : {},
35006
35172
  ...gapValue !== void 0 && useFlexGap ? { gap: gapValue } : {},
35173
+ ...flex !== void 0 ? { flex } : {},
35174
+ ...overflow !== void 0 ? { overflow } : {},
35007
35175
  ...style
35008
35176
  };
35009
35177
  const classes = ["rf-stack", sxClass, className].filter(Boolean).join(" ");
@@ -35492,6 +35660,30 @@ var Tabs = ({
35492
35660
  ));
35493
35661
  };
35494
35662
  Tabs.displayName = "Tabs";
35663
+ var TabPanel = ({
35664
+ value,
35665
+ activeValue,
35666
+ children,
35667
+ keepMounted = false,
35668
+ className = "",
35669
+ style,
35670
+ sx
35671
+ }) => {
35672
+ const sxClass = useSx(sx);
35673
+ const isActive = value === activeValue;
35674
+ if (!isActive && !keepMounted) return null;
35675
+ return /* @__PURE__ */ import_react38.default.createElement(
35676
+ "div",
35677
+ {
35678
+ role: "tabpanel",
35679
+ hidden: !isActive,
35680
+ className: ["rf-tab-panel", sxClass, className].filter(Boolean).join(" "),
35681
+ style
35682
+ },
35683
+ isActive && children
35684
+ );
35685
+ };
35686
+ TabPanel.displayName = "TabPanel";
35495
35687
 
35496
35688
  // lib/Breadcrumbs/Breadcrumbs.tsx
35497
35689
  var import_react39 = __toESM(require("react"), 1);
@@ -36897,6 +37089,7 @@ ImageField.displayName = "ImageField";
36897
37089
  SuspendUserIcon,
36898
37090
  Switch,
36899
37091
  Tab,
37092
+ TabPanel,
36900
37093
  Tabs,
36901
37094
  TechnicalSkillsIcon,
36902
37095
  TextField,
package/dist/main.css CHANGED
@@ -1494,6 +1494,11 @@ pre {
1494
1494
  justify-content: space-between;
1495
1495
  padding: 18px 20px 12px;
1496
1496
  }
1497
+ .rf-date-picker__header-labels {
1498
+ display: flex;
1499
+ align-items: center;
1500
+ gap: 6px;
1501
+ }
1497
1502
  .rf-date-picker__month-label {
1498
1503
  font-size: 1rem;
1499
1504
  font-weight: 700;
@@ -1501,6 +1506,33 @@ pre {
1501
1506
  letter-spacing: -0.01em;
1502
1507
  cursor: pointer;
1503
1508
  user-select: none;
1509
+ padding: 2px 6px;
1510
+ border-radius: 6px;
1511
+ transition: background-color 0.15s ease;
1512
+ }
1513
+ .rf-date-picker__month-label:hover {
1514
+ background-color: rgba(164, 27, 6, 0.08);
1515
+ }
1516
+ .rf-date-picker__month-label--active {
1517
+ background-color: rgba(164, 27, 6, 0.1);
1518
+ color: #a41b06;
1519
+ }
1520
+ .rf-date-picker__year-label {
1521
+ font-size: 1rem;
1522
+ font-weight: 700;
1523
+ color: #555555;
1524
+ cursor: pointer;
1525
+ user-select: none;
1526
+ padding: 2px 6px;
1527
+ border-radius: 6px;
1528
+ transition: background-color 0.15s ease;
1529
+ }
1530
+ .rf-date-picker__year-label:hover {
1531
+ background-color: rgba(164, 27, 6, 0.08);
1532
+ }
1533
+ .rf-date-picker__year-label--active {
1534
+ background-color: rgba(164, 27, 6, 0.1);
1535
+ color: #a41b06;
1504
1536
  }
1505
1537
  .rf-date-picker__nav {
1506
1538
  display: flex;
@@ -1884,6 +1916,83 @@ pre {
1884
1916
  color: rgba(0, 0, 0, 0.75);
1885
1917
  background-color: rgba(0, 0, 0, 0.05);
1886
1918
  }
1919
+ .rf-date-picker--drop-up {
1920
+ top: auto;
1921
+ bottom: calc(100% + 6px);
1922
+ transform-origin: bottom left;
1923
+ }
1924
+ .rf-date-picker__month-grid {
1925
+ display: grid;
1926
+ grid-template-columns: repeat(3, 1fr);
1927
+ gap: 6px;
1928
+ padding: 8px 16px 12px;
1929
+ }
1930
+ .rf-date-picker__month-cell {
1931
+ display: flex;
1932
+ align-items: center;
1933
+ justify-content: center;
1934
+ padding: 10px 8px;
1935
+ border-radius: 8px;
1936
+ font-size: 0.85rem;
1937
+ font-weight: 500;
1938
+ color: #333333;
1939
+ background: none;
1940
+ border: none;
1941
+ cursor: pointer;
1942
+ transition: background-color 0.12s ease, color 0.12s ease;
1943
+ outline: none;
1944
+ }
1945
+ .rf-date-picker__month-cell:hover {
1946
+ background-color: rgba(164, 27, 6, 0.08);
1947
+ }
1948
+ .rf-date-picker__month-cell--selected {
1949
+ background-color: #a41b06;
1950
+ color: #ffffff;
1951
+ font-weight: 600;
1952
+ }
1953
+ .rf-date-picker__month-cell--selected:hover {
1954
+ background-color: #8a1705;
1955
+ }
1956
+ .rf-date-picker__month-cell--current:not(.rf-date-picker__month-cell--selected) {
1957
+ color: #a41b06;
1958
+ font-weight: 600;
1959
+ }
1960
+ .rf-date-picker__year-grid {
1961
+ display: grid;
1962
+ grid-template-columns: repeat(4, 1fr);
1963
+ gap: 6px;
1964
+ padding: 8px 16px 12px;
1965
+ }
1966
+ .rf-date-picker__year-cell {
1967
+ display: flex;
1968
+ align-items: center;
1969
+ justify-content: center;
1970
+ padding: 10px 4px;
1971
+ border-radius: 8px;
1972
+ font-size: 0.85rem;
1973
+ font-weight: 500;
1974
+ color: #333333;
1975
+ background: none;
1976
+ border: none;
1977
+ cursor: pointer;
1978
+ transition: background-color 0.12s ease, color 0.12s ease;
1979
+ outline: none;
1980
+ }
1981
+ .rf-date-picker__year-cell:hover {
1982
+ background-color: rgba(164, 27, 6, 0.08);
1983
+ }
1984
+ .rf-date-picker__year-cell--selected {
1985
+ background-color: #a41b06;
1986
+ color: #ffffff;
1987
+ font-weight: 600;
1988
+ }
1989
+ .rf-date-picker__year-cell--selected:hover {
1990
+ background-color: #8a1705;
1991
+ }
1992
+ .rf-date-picker__year-cell--current:not(.rf-date-picker__year-cell--selected) {
1993
+ color: #a41b06;
1994
+ font-weight: 600;
1995
+ }
1887
1996
 
1888
1997
  /* lib/styles/date-range-field.css */
1889
1998
  .rf-date-range-field {
@@ -2345,6 +2454,16 @@ pre {
2345
2454
  padding-left: 0;
2346
2455
  margin-top: 0;
2347
2456
  }
2457
+ .rf-autocomplete.rf-text-field--disabled .rf-text-field__wrapper {
2458
+ cursor: not-allowed;
2459
+ }
2460
+ .rf-autocomplete.rf-text-field--disabled .rf-autocomplete__tag {
2461
+ opacity: 0.5;
2462
+ }
2463
+ .rf-autocomplete.rf-text-field--disabled .rf-autocomplete__endgroup {
2464
+ opacity: 0.35;
2465
+ pointer-events: none;
2466
+ }
2348
2467
  .rf-autocomplete__icon-btn {
2349
2468
  background: none;
2350
2469
  border: none;
@@ -2571,6 +2690,18 @@ pre {
2571
2690
  .rf-select.rf-text-field--disabled .rf-text-field__wrapper {
2572
2691
  cursor: not-allowed;
2573
2692
  }
2693
+ .rf-select.rf-text-field--disabled .rf-select__display {
2694
+ color: var(--tf-disabled-color, rgba(0, 0, 0, 0.38));
2695
+ }
2696
+ .rf-select.rf-text-field--disabled .rf-select__arrow {
2697
+ color: rgba(0, 0, 0, 0.2);
2698
+ }
2699
+ .rf-select.rf-text-field--disabled .rf-select__chip {
2700
+ opacity: 0.5;
2701
+ }
2702
+ .rf-select.rf-text-field--disabled .rf-select__count {
2703
+ opacity: 0.5;
2704
+ }
2574
2705
  .rf-select__display {
2575
2706
  display: flex;
2576
2707
  align-items: center;
@@ -4893,6 +5024,12 @@ pre {
4893
5024
  align-items: center;
4894
5025
  font-size: 1.25rem;
4895
5026
  }
5027
+ .rf-tab-panel {
5028
+ width: 100%;
5029
+ }
5030
+ .rf-tab-panel[hidden] {
5031
+ display: none;
5032
+ }
4896
5033
 
4897
5034
  /* lib/styles/breadcrumbs.css */
4898
5035
  .rf-breadcrumbs {
@@ -5800,9 +5937,10 @@ pre {
5800
5937
  outline-offset: 2px;
5801
5938
  }
5802
5939
  .rf-image-field--disabled {
5803
- opacity: 0.5;
5940
+ opacity: 0.45;
5804
5941
  cursor: not-allowed;
5805
5942
  pointer-events: none;
5943
+ filter: grayscale(60%);
5806
5944
  }
5807
5945
 
5808
5946
  /* lib/styles/text-field.css */
@@ -5900,10 +6038,28 @@ pre {
5900
6038
  .rf-text-field__input:focus {
5901
6039
  outline: none;
5902
6040
  }
6041
+ .rf-text-field--disabled {
6042
+ pointer-events: none;
6043
+ }
6044
+ .rf-text-field--disabled .rf-text-field__wrapper {
6045
+ cursor: not-allowed;
6046
+ pointer-events: none;
6047
+ background-color: rgba(0, 0, 0, 0.04);
6048
+ }
6049
+ .rf-text-field--disabled .rf-text-field__label {
6050
+ color: var(--tf-disabled-color);
6051
+ }
6052
+ .rf-text-field--disabled .rf-text-field__adornment {
6053
+ color: var(--tf-disabled-color);
6054
+ opacity: 0.5;
6055
+ }
6056
+ .rf-text-field--disabled .rf-text-field__helper-text {
6057
+ color: var(--tf-disabled-color);
6058
+ }
5903
6059
  .rf-text-field__input:disabled {
5904
6060
  opacity: 1;
5905
6061
  color: var(--tf-disabled-color);
5906
- cursor: default;
6062
+ cursor: not-allowed;
5907
6063
  }
5908
6064
  .rf-text-field__input::placeholder {
5909
6065
  color: var(--tf-placeholder-color);
@@ -6007,7 +6163,10 @@ pre {
6007
6163
  border-width: 2px;
6008
6164
  }
6009
6165
  .rf-text-field--outlined.rf-text-field--disabled .rf-text-field__notch {
6010
- border-color: var(--tf-disabled-bg);
6166
+ border-color: rgba(0, 0, 0, 0.15);
6167
+ }
6168
+ .rf-text-field--outlined.rf-text-field--disabled .rf-text-field__wrapper:hover .rf-text-field__notch {
6169
+ border-color: rgba(0, 0, 0, 0.15);
6011
6170
  }
6012
6171
  .rf-text-field--filled .rf-text-field__wrapper {
6013
6172
  background-color: var(--tf-filled-bg);
@@ -6061,7 +6220,13 @@ pre {
6061
6220
  transform: translate(12px, 7px) scale(0.75);
6062
6221
  }
6063
6222
  .rf-text-field--filled.rf-text-field--disabled .rf-text-field__wrapper {
6064
- background-color: rgba(0, 0, 0, 0.03);
6223
+ background-color: rgba(0, 0, 0, 0.04);
6224
+ }
6225
+ .rf-text-field--filled.rf-text-field--disabled .rf-text-field__wrapper:hover {
6226
+ background-color: rgba(0, 0, 0, 0.04);
6227
+ }
6228
+ .rf-text-field--filled.rf-text-field--disabled .rf-text-field__wrapper:hover::before {
6229
+ border-bottom: 1px solid rgba(0, 0, 0, 0.42);
6065
6230
  }
6066
6231
  .rf-text-field--filled.rf-text-field--disabled .rf-text-field__wrapper::before {
6067
6232
  border-bottom-style: dotted;
@@ -6111,6 +6276,9 @@ pre {
6111
6276
  .rf-text-field--standard.rf-text-field--disabled .rf-text-field__wrapper::before {
6112
6277
  border-bottom-style: dotted;
6113
6278
  }
6279
+ .rf-text-field--standard.rf-text-field--disabled .rf-text-field__wrapper:hover::before {
6280
+ border-bottom: 1px dotted rgba(0, 0, 0, 0.42);
6281
+ }
6114
6282
  .rf-text-field--error .rf-text-field__label,
6115
6283
  .rf-text-field--error .rf-text-field__wrapper:focus-within .rf-text-field__label {
6116
6284
  color: var(--tf-error-color);
@@ -6217,6 +6385,13 @@ pre {
6217
6385
  margin-right: 10px;
6218
6386
  margin-left: 0;
6219
6387
  }
6388
+ .rf-text-field--compact.rf-text-field--disabled .rf-text-field__wrapper {
6389
+ border-color: rgba(0, 0, 0, 0.12);
6390
+ background-color: rgba(0, 0, 0, 0.04);
6391
+ }
6392
+ .rf-text-field--compact.rf-text-field--disabled .rf-text-field__wrapper:hover {
6393
+ border-color: rgba(0, 0, 0, 0.12);
6394
+ }
6220
6395
 
6221
6396
  /* node_modules/jodit/es5/jodit.min.css */
6222
6397
  .jodit-ui-button-icon-text__icon {
package/dist/main.d.cts CHANGED
@@ -549,7 +549,7 @@ interface AddressLookupProps {
549
549
  */
550
550
  declare const AddressLookup: ({ value, onChange, label, error, size, sx, layout, required, token, }: AddressLookupProps) => React__default.JSX.Element;
551
551
 
552
- type DateFormatString = "MM/DD/YYYY" | "DD/MM/YYYY" | "YYYY-MM-DD" | "DD-MM-YYYY" | "MM-DD-YYYY" | "YYYY/MM/DD";
552
+ type DateFormatString = "MM/DD/YYYY" | "DD/MM/YYYY" | "YYYY-MM-DD" | "DD-MM-YYYY" | "MM-DD-YYYY" | "YYYY/MM/DD" | "DD MMM YYYY" | "MMM DD, YYYY" | "DD MMMM YYYY" | "MMMM DD, YYYY";
553
553
  interface DateFieldProps {
554
554
  /** Floating label */
555
555
  label?: string;
@@ -754,11 +754,13 @@ interface DataGridProps<T> {
754
754
  pageSize?: number;
755
755
  pageSizeOptions?: number[];
756
756
  title?: string;
757
+ className?: string;
758
+ sx?: SxProp;
757
759
  }
758
760
 
759
761
  declare function DataGrid<T extends {
760
762
  id: string | number;
761
- }>({ columns: initialColumnsProp, data, actions, pageSize: initialPageSize, pageSizeOptions, title }: DataGridProps<T>): React__default.JSX.Element;
763
+ }>({ columns: initialColumnsProp, data, actions, pageSize: initialPageSize, pageSizeOptions, title, className, sx, }: DataGridProps<T>): React__default.JSX.Element;
762
764
 
763
765
  interface MentionItem {
764
766
  id: string;
@@ -1120,6 +1122,23 @@ interface BoxProps extends React.HTMLAttributes<HTMLElement> {
1120
1122
  margin?: string | number;
1121
1123
  width?: string | number;
1122
1124
  height?: string | number;
1125
+ minWidth?: string | number;
1126
+ maxWidth?: string | number;
1127
+ minHeight?: string | number;
1128
+ maxHeight?: string | number;
1129
+ flex?: string | number;
1130
+ flexWrap?: string;
1131
+ flexGrow?: number;
1132
+ flexShrink?: number;
1133
+ overflow?: string;
1134
+ position?: string;
1135
+ top?: string | number;
1136
+ right?: string | number;
1137
+ bottom?: string | number;
1138
+ left?: string | number;
1139
+ borderRadius?: string | number;
1140
+ bgcolor?: string;
1141
+ color?: string;
1123
1142
  className?: string;
1124
1143
  style?: CSSProperties;
1125
1144
  sx?: SxProp;
@@ -1134,6 +1153,8 @@ interface StackProps extends React.HTMLAttributes<HTMLElement> {
1134
1153
  divider?: ReactNode;
1135
1154
  flexWrap?: "nowrap" | "wrap" | "wrap-reverse";
1136
1155
  useFlexGap?: boolean;
1156
+ flex?: string | number;
1157
+ overflow?: string;
1137
1158
  component?: keyof React.JSX.IntrinsicElements;
1138
1159
  children: ReactNode;
1139
1160
  className?: string;
@@ -1282,6 +1303,16 @@ interface TabsProps {
1282
1303
  sx?: SxProp;
1283
1304
  }
1284
1305
  declare const Tabs: React__default.FC<TabsProps>;
1306
+ interface TabPanelProps {
1307
+ value: string | number;
1308
+ activeValue: string | number;
1309
+ children: ReactNode;
1310
+ keepMounted?: boolean;
1311
+ className?: string;
1312
+ style?: CSSProperties;
1313
+ sx?: SxProp;
1314
+ }
1315
+ declare const TabPanel: React__default.FC<TabPanelProps>;
1285
1316
 
1286
1317
  interface BreadcrumbsProps {
1287
1318
  separator?: ReactNode;
@@ -1555,4 +1586,4 @@ interface ImageFieldProps {
1555
1586
  }
1556
1587
  declare const ImageField: React__default.ForwardRefExoticComponent<ImageFieldProps & React__default.RefAttributes<HTMLDivElement>>;
1557
1588
 
1558
- export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, type MentionItem, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, Paper, type PaperProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RichTextEditor, type RichTextEditorProps, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, useRufousTheme };
1589
+ export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, type MentionItem, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, Paper, type PaperProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RichTextEditor, type RichTextEditorProps, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, useRufousTheme };
package/dist/main.d.ts CHANGED
@@ -549,7 +549,7 @@ interface AddressLookupProps {
549
549
  */
550
550
  declare const AddressLookup: ({ value, onChange, label, error, size, sx, layout, required, token, }: AddressLookupProps) => React__default.JSX.Element;
551
551
 
552
- type DateFormatString = "MM/DD/YYYY" | "DD/MM/YYYY" | "YYYY-MM-DD" | "DD-MM-YYYY" | "MM-DD-YYYY" | "YYYY/MM/DD";
552
+ type DateFormatString = "MM/DD/YYYY" | "DD/MM/YYYY" | "YYYY-MM-DD" | "DD-MM-YYYY" | "MM-DD-YYYY" | "YYYY/MM/DD" | "DD MMM YYYY" | "MMM DD, YYYY" | "DD MMMM YYYY" | "MMMM DD, YYYY";
553
553
  interface DateFieldProps {
554
554
  /** Floating label */
555
555
  label?: string;
@@ -754,11 +754,13 @@ interface DataGridProps<T> {
754
754
  pageSize?: number;
755
755
  pageSizeOptions?: number[];
756
756
  title?: string;
757
+ className?: string;
758
+ sx?: SxProp;
757
759
  }
758
760
 
759
761
  declare function DataGrid<T extends {
760
762
  id: string | number;
761
- }>({ columns: initialColumnsProp, data, actions, pageSize: initialPageSize, pageSizeOptions, title }: DataGridProps<T>): React__default.JSX.Element;
763
+ }>({ columns: initialColumnsProp, data, actions, pageSize: initialPageSize, pageSizeOptions, title, className, sx, }: DataGridProps<T>): React__default.JSX.Element;
762
764
 
763
765
  interface MentionItem {
764
766
  id: string;
@@ -1120,6 +1122,23 @@ interface BoxProps extends React.HTMLAttributes<HTMLElement> {
1120
1122
  margin?: string | number;
1121
1123
  width?: string | number;
1122
1124
  height?: string | number;
1125
+ minWidth?: string | number;
1126
+ maxWidth?: string | number;
1127
+ minHeight?: string | number;
1128
+ maxHeight?: string | number;
1129
+ flex?: string | number;
1130
+ flexWrap?: string;
1131
+ flexGrow?: number;
1132
+ flexShrink?: number;
1133
+ overflow?: string;
1134
+ position?: string;
1135
+ top?: string | number;
1136
+ right?: string | number;
1137
+ bottom?: string | number;
1138
+ left?: string | number;
1139
+ borderRadius?: string | number;
1140
+ bgcolor?: string;
1141
+ color?: string;
1123
1142
  className?: string;
1124
1143
  style?: CSSProperties;
1125
1144
  sx?: SxProp;
@@ -1134,6 +1153,8 @@ interface StackProps extends React.HTMLAttributes<HTMLElement> {
1134
1153
  divider?: ReactNode;
1135
1154
  flexWrap?: "nowrap" | "wrap" | "wrap-reverse";
1136
1155
  useFlexGap?: boolean;
1156
+ flex?: string | number;
1157
+ overflow?: string;
1137
1158
  component?: keyof React.JSX.IntrinsicElements;
1138
1159
  children: ReactNode;
1139
1160
  className?: string;
@@ -1282,6 +1303,16 @@ interface TabsProps {
1282
1303
  sx?: SxProp;
1283
1304
  }
1284
1305
  declare const Tabs: React__default.FC<TabsProps>;
1306
+ interface TabPanelProps {
1307
+ value: string | number;
1308
+ activeValue: string | number;
1309
+ children: ReactNode;
1310
+ keepMounted?: boolean;
1311
+ className?: string;
1312
+ style?: CSSProperties;
1313
+ sx?: SxProp;
1314
+ }
1315
+ declare const TabPanel: React__default.FC<TabPanelProps>;
1285
1316
 
1286
1317
  interface BreadcrumbsProps {
1287
1318
  separator?: ReactNode;
@@ -1555,4 +1586,4 @@ interface ImageFieldProps {
1555
1586
  }
1556
1587
  declare const ImageField: React__default.ForwardRefExoticComponent<ImageFieldProps & React__default.RefAttributes<HTMLDivElement>>;
1557
1588
 
1558
- export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, type MentionItem, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, Paper, type PaperProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RichTextEditor, type RichTextEditorProps, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, useRufousTheme };
1589
+ export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, type MentionItem, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, Paper, type PaperProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RichTextEditor, type RichTextEditorProps, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, useRufousTheme };
package/dist/main.js CHANGED
@@ -1885,10 +1885,25 @@ var MONTHS = [
1885
1885
  "November",
1886
1886
  "December"
1887
1887
  ];
1888
+ var MONTHS_SHORT = [
1889
+ "Jan",
1890
+ "Feb",
1891
+ "Mar",
1892
+ "Apr",
1893
+ "May",
1894
+ "Jun",
1895
+ "Jul",
1896
+ "Aug",
1897
+ "Sep",
1898
+ "Oct",
1899
+ "Nov",
1900
+ "Dec"
1901
+ ];
1888
1902
  var formatDisplay = (d, fmt = "MM/DD/YYYY") => {
1889
1903
  const mm = String(d.getMonth() + 1).padStart(2, "0");
1890
1904
  const dd = String(d.getDate()).padStart(2, "0");
1891
1905
  const yyyy = String(d.getFullYear());
1906
+ const day = d.getDate();
1892
1907
  switch (fmt) {
1893
1908
  case "DD/MM/YYYY":
1894
1909
  return `${dd}/${mm}/${yyyy}`;
@@ -1900,13 +1915,49 @@ var formatDisplay = (d, fmt = "MM/DD/YYYY") => {
1900
1915
  return `${mm}-${dd}-${yyyy}`;
1901
1916
  case "YYYY/MM/DD":
1902
1917
  return `${yyyy}/${mm}/${dd}`;
1918
+ case "DD MMM YYYY":
1919
+ return `${dd} ${MONTHS_SHORT[d.getMonth()]} ${yyyy}`;
1920
+ case "MMM DD, YYYY":
1921
+ return `${MONTHS_SHORT[d.getMonth()]} ${dd}, ${yyyy}`;
1922
+ case "DD MMMM YYYY":
1923
+ return `${dd} ${MONTHS[d.getMonth()]} ${yyyy}`;
1924
+ case "MMMM DD, YYYY":
1925
+ return `${MONTHS[d.getMonth()]} ${dd}, ${yyyy}`;
1903
1926
  case "MM/DD/YYYY":
1904
1927
  default:
1905
1928
  return `${mm}/${dd}/${yyyy}`;
1906
1929
  }
1907
1930
  };
1908
1931
  var formatTimeDisplay = (h, m, ampm) => `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")} ${ampm}`;
1932
+ var parseMonthName = (name) => {
1933
+ const lower = name.toLowerCase();
1934
+ let idx = MONTHS.findIndex((m) => m.toLowerCase() === lower);
1935
+ if (idx >= 0) return idx;
1936
+ idx = MONTHS_SHORT.findIndex((m) => m.toLowerCase() === lower);
1937
+ return idx;
1938
+ };
1909
1939
  var parseDisplay = (str, fmt = "MM/DD/YYYY") => {
1940
+ if (fmt === "DD MMM YYYY" || fmt === "DD MMMM YYYY") {
1941
+ const parts2 = str.split(" ");
1942
+ if (parts2.length !== 3) return null;
1943
+ const dd2 = parseInt(parts2[0], 10);
1944
+ const mm2 = parseMonthName(parts2[1]);
1945
+ const yyyy2 = parseInt(parts2[2], 10);
1946
+ if (isNaN(dd2) || mm2 < 0 || isNaN(yyyy2) || yyyy2 < 1e3) return null;
1947
+ const d2 = new Date(yyyy2, mm2, dd2);
1948
+ return isNaN(d2.getTime()) ? null : d2;
1949
+ }
1950
+ if (fmt === "MMM DD, YYYY" || fmt === "MMMM DD, YYYY") {
1951
+ const cleaned = str.replace(",", "");
1952
+ const parts2 = cleaned.split(" ").filter(Boolean);
1953
+ if (parts2.length !== 3) return null;
1954
+ const mm2 = parseMonthName(parts2[0]);
1955
+ const dd2 = parseInt(parts2[1], 10);
1956
+ const yyyy2 = parseInt(parts2[2], 10);
1957
+ if (mm2 < 0 || isNaN(dd2) || isNaN(yyyy2) || yyyy2 < 1e3) return null;
1958
+ const d2 = new Date(yyyy2, mm2, dd2);
1959
+ return isNaN(d2.getTime()) ? null : d2;
1960
+ }
1910
1961
  const sep = str.includes("/") ? "/" : "-";
1911
1962
  const parts = str.split(sep);
1912
1963
  if (parts.length !== 3) return null;
@@ -2091,27 +2142,89 @@ var CalendarBody = ({
2091
2142
  dayCells,
2092
2143
  onDayClick,
2093
2144
  onPrev,
2094
- onNext
2095
- }) => /* @__PURE__ */ React68.createElement(React68.Fragment, null, /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__header" }, /* @__PURE__ */ React68.createElement("span", { className: "rf-date-picker__month-label" }, MONTHS[viewMonth], " ", viewYear), /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__nav" }, /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onPrev, "aria-label": "Previous month" }, "\u2039"), /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onNext, "aria-label": "Next month" }, "\u203A"))), /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__weekdays" }, WEEKDAYS.map((w) => /* @__PURE__ */ React68.createElement("div", { key: w, className: "rf-date-picker__weekday" }, w))), /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__grid" }, dayCells.map((day, idx) => {
2096
- if (day === null) return /* @__PURE__ */ React68.createElement("div", { key: `e-${idx}`, className: "rf-date-picker__day rf-date-picker__day--empty" });
2097
- const cellDate = new Date(viewYear, viewMonth, day);
2098
- const isSelected = selectedDate ? isSameDay(cellDate, selectedDate) : false;
2099
- const isToday = isSameDay(cellDate, todayDate);
2100
- return /* @__PURE__ */ React68.createElement(
2145
+ onNext,
2146
+ onMonthSelect,
2147
+ onYearSelect
2148
+ }) => {
2149
+ const [pickerView, setPickerView] = useState5("calendar");
2150
+ const handleMonthClick = () => {
2151
+ setPickerView(pickerView === "month" ? "calendar" : "month");
2152
+ };
2153
+ const handleYearClick = () => {
2154
+ setPickerView(pickerView === "year" ? "calendar" : "year");
2155
+ };
2156
+ const handleMonthPick = (month) => {
2157
+ onMonthSelect(month);
2158
+ setPickerView("calendar");
2159
+ };
2160
+ const handleYearPick = (year) => {
2161
+ onYearSelect(year);
2162
+ setPickerView("calendar");
2163
+ };
2164
+ const currentYear = todayDate.getFullYear();
2165
+ const yearStart = viewYear - 6;
2166
+ const years = Array.from({ length: 16 }, (_, i) => yearStart + i);
2167
+ return /* @__PURE__ */ React68.createElement(React68.Fragment, null, /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__header" }, /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__header-labels" }, /* @__PURE__ */ React68.createElement(
2168
+ "span",
2169
+ {
2170
+ className: `rf-date-picker__month-label ${pickerView === "month" ? "rf-date-picker__month-label--active" : ""}`,
2171
+ onClick: handleMonthClick
2172
+ },
2173
+ MONTHS[viewMonth]
2174
+ ), /* @__PURE__ */ React68.createElement(
2175
+ "span",
2176
+ {
2177
+ className: `rf-date-picker__year-label ${pickerView === "year" ? "rf-date-picker__year-label--active" : ""}`,
2178
+ onClick: handleYearClick
2179
+ },
2180
+ viewYear
2181
+ )), /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__nav" }, pickerView === "year" ? /* @__PURE__ */ React68.createElement(React68.Fragment, null, /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: () => onYearSelect(viewYear - 16), "aria-label": "Previous years" }, "\u2039"), /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: () => onYearSelect(viewYear + 16), "aria-label": "Next years" }, "\u203A")) : /* @__PURE__ */ React68.createElement(React68.Fragment, null, /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onPrev, "aria-label": "Previous month" }, "\u2039"), /* @__PURE__ */ React68.createElement("button", { type: "button", className: "rf-date-picker__nav-btn", onClick: onNext, "aria-label": "Next month" }, "\u203A")))), pickerView === "month" && /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__month-grid" }, MONTHS_SHORT.map((m, idx) => /* @__PURE__ */ React68.createElement(
2101
2182
  "button",
2102
2183
  {
2103
- key: day,
2184
+ key: m,
2104
2185
  type: "button",
2105
2186
  className: [
2106
- "rf-date-picker__day",
2107
- isSelected ? "rf-date-picker__day--selected" : "",
2108
- isToday && !isSelected ? "rf-date-picker__day--today" : ""
2187
+ "rf-date-picker__month-cell",
2188
+ idx === viewMonth ? "rf-date-picker__month-cell--selected" : "",
2189
+ idx === todayDate.getMonth() && viewYear === currentYear ? "rf-date-picker__month-cell--current" : ""
2109
2190
  ].filter(Boolean).join(" "),
2110
- onClick: () => onDayClick(day)
2191
+ onClick: () => handleMonthPick(idx)
2111
2192
  },
2112
- day
2113
- );
2114
- })));
2193
+ m
2194
+ ))), pickerView === "year" && /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__year-grid" }, years.map((y) => /* @__PURE__ */ React68.createElement(
2195
+ "button",
2196
+ {
2197
+ key: y,
2198
+ type: "button",
2199
+ className: [
2200
+ "rf-date-picker__year-cell",
2201
+ y === viewYear ? "rf-date-picker__year-cell--selected" : "",
2202
+ y === currentYear ? "rf-date-picker__year-cell--current" : ""
2203
+ ].filter(Boolean).join(" "),
2204
+ onClick: () => handleYearPick(y)
2205
+ },
2206
+ y
2207
+ ))), pickerView === "calendar" && /* @__PURE__ */ React68.createElement(React68.Fragment, null, /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__weekdays" }, WEEKDAYS.map((w) => /* @__PURE__ */ React68.createElement("div", { key: w, className: "rf-date-picker__weekday" }, w))), /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__grid" }, dayCells.map((day, idx) => {
2208
+ if (day === null) return /* @__PURE__ */ React68.createElement("div", { key: `e-${idx}`, className: "rf-date-picker__day rf-date-picker__day--empty" });
2209
+ const cellDate = new Date(viewYear, viewMonth, day);
2210
+ const isSelected = selectedDate ? isSameDay(cellDate, selectedDate) : false;
2211
+ const isToday = isSameDay(cellDate, todayDate);
2212
+ return /* @__PURE__ */ React68.createElement(
2213
+ "button",
2214
+ {
2215
+ key: day,
2216
+ type: "button",
2217
+ className: [
2218
+ "rf-date-picker__day",
2219
+ isSelected ? "rf-date-picker__day--selected" : "",
2220
+ isToday && !isSelected ? "rf-date-picker__day--today" : ""
2221
+ ].filter(Boolean).join(" "),
2222
+ onClick: () => onDayClick(day)
2223
+ },
2224
+ day
2225
+ );
2226
+ }))));
2227
+ };
2115
2228
  var DateField = ({
2116
2229
  label,
2117
2230
  value,
@@ -2169,7 +2282,9 @@ var DateField = ({
2169
2282
  const MINUTES = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, "0"));
2170
2283
  const AMPMS = ["AM", "PM"];
2171
2284
  const containerRef = useRef4(null);
2172
- const inputId = useRef4(`rf-df-${Math.random().toString(36).substr(2, 9)}`).current;
2285
+ const pickerRef = useRef4(null);
2286
+ const [dropUp, setDropUp] = useState5(false);
2287
+ const inputId = useRef4(`rf-df-${Math.random().toString(36).substring(2, 11)}`).current;
2173
2288
  useEffect4(() => {
2174
2289
  if (value === void 0) return;
2175
2290
  if (!value) {
@@ -2201,6 +2316,13 @@ var DateField = ({
2201
2316
  document.addEventListener("mousedown", handler);
2202
2317
  return () => document.removeEventListener("mousedown", handler);
2203
2318
  }, [open]);
2319
+ useEffect4(() => {
2320
+ if (!open || !containerRef.current) return;
2321
+ const rect = containerRef.current.getBoundingClientRect();
2322
+ const spaceBelow = window.innerHeight - rect.bottom;
2323
+ const pickerHeight = 400;
2324
+ setDropUp(spaceBelow < pickerHeight && rect.top > pickerHeight);
2325
+ }, [open]);
2204
2326
  const commitDate = useCallback((d, h, m, ap) => {
2205
2327
  setSelectedDate(d);
2206
2328
  if (!d) {
@@ -2393,9 +2515,11 @@ var DateField = ({
2393
2515
  ), open && !disabled && /* @__PURE__ */ React68.createElement(
2394
2516
  "div",
2395
2517
  {
2518
+ ref: pickerRef,
2396
2519
  className: [
2397
2520
  "rf-date-picker",
2398
- isSideVariant ? "rf-date-picker--side" : ""
2521
+ isSideVariant ? "rf-date-picker--side" : "",
2522
+ dropUp ? "rf-date-picker--drop-up" : ""
2399
2523
  ].filter(Boolean).join(" "),
2400
2524
  onMouseDown: (e) => e.preventDefault()
2401
2525
  },
@@ -2409,7 +2533,9 @@ var DateField = ({
2409
2533
  dayCells,
2410
2534
  onDayClick: handleDayClick,
2411
2535
  onPrev: prevMonth,
2412
- onNext: nextMonth
2536
+ onNext: nextMonth,
2537
+ onMonthSelect: setViewMonth,
2538
+ onYearSelect: setViewYear
2413
2539
  }
2414
2540
  ), type === "datetime" && /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ React68.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ React68.createElement(
2415
2541
  SpinnerPanel,
@@ -2485,7 +2611,7 @@ var MONTHS2 = [
2485
2611
  "November",
2486
2612
  "December"
2487
2613
  ];
2488
- var MONTHS_SHORT = [
2614
+ var MONTHS_SHORT2 = [
2489
2615
  "Jan",
2490
2616
  "Feb",
2491
2617
  "Mar",
@@ -2522,14 +2648,14 @@ var dateToISO = (d) => {
2522
2648
  const dd = String(d.getDate()).padStart(2, "0");
2523
2649
  return `${y}-${mo}-${dd}`;
2524
2650
  };
2525
- var formatShort = (d) => `${String(d.getDate()).padStart(2, "0")} ${MONTHS_SHORT[d.getMonth()]} ${d.getFullYear()}`;
2651
+ var formatShort = (d) => `${String(d.getDate()).padStart(2, "0")} ${MONTHS_SHORT2[d.getMonth()]} ${d.getFullYear()}`;
2526
2652
  var parseInputDate = (str) => {
2527
2653
  const s = str.trim();
2528
2654
  if (!s) return null;
2529
2655
  const shortMatch = s.match(/^(\d{1,2})\s+([A-Za-z]+)\s+(\d{4})$/);
2530
2656
  if (shortMatch) {
2531
2657
  const day = parseInt(shortMatch[1], 10);
2532
- const monthIdx = MONTHS_SHORT.findIndex((m) => m.toLowerCase() === shortMatch[2].toLowerCase());
2658
+ const monthIdx = MONTHS_SHORT2.findIndex((m) => m.toLowerCase() === shortMatch[2].toLowerCase());
2533
2659
  const year = parseInt(shortMatch[3], 10);
2534
2660
  if (monthIdx !== -1 && day >= 1 && day <= 31 && year >= 1e3) {
2535
2661
  const d = new Date(year, monthIdx, day);
@@ -3579,8 +3705,11 @@ function DataGrid({
3579
3705
  actions,
3580
3706
  pageSize: initialPageSize = 10,
3581
3707
  pageSizeOptions = [5, 10, 25, 50],
3582
- title
3708
+ title,
3709
+ className,
3710
+ sx
3583
3711
  }) {
3712
+ const sxClass = useSx(sx);
3584
3713
  const [columnOverrides, setColumnOverrides] = useState8({});
3585
3714
  const resolvedColumns = useMemo2(() => {
3586
3715
  return initialColumnsProp.map((col) => {
@@ -3881,7 +4010,7 @@ function DataGrid({
3881
4010
  return offset;
3882
4011
  };
3883
4012
  const hasActiveFilters = advancedFilters.some((f) => f.value);
3884
- return /* @__PURE__ */ React72.createElement("div", { className: "dg-root" }, /* @__PURE__ */ React72.createElement("div", { className: "dg-header" }, /* @__PURE__ */ React72.createElement("div", { className: "dg-header-info" }, /* @__PURE__ */ React72.createElement("h2", null, title), /* @__PURE__ */ React72.createElement("p", null, filteredData.length, " total records")), /* @__PURE__ */ React72.createElement("div", { className: "dg-header-actions" }, /* @__PURE__ */ React72.createElement("div", { className: "dg-search-wrap" }, /* @__PURE__ */ React72.createElement(Search, { size: 15 }), /* @__PURE__ */ React72.createElement(
4013
+ return /* @__PURE__ */ React72.createElement("div", { className: ["dg-root", sxClass, className].filter(Boolean).join(" ") }, /* @__PURE__ */ React72.createElement("div", { className: "dg-header" }, /* @__PURE__ */ React72.createElement("div", { className: "dg-header-info" }, /* @__PURE__ */ React72.createElement("h2", null, title), /* @__PURE__ */ React72.createElement("p", null, filteredData.length, " total records")), /* @__PURE__ */ React72.createElement("div", { className: "dg-header-actions" }, /* @__PURE__ */ React72.createElement("div", { className: "dg-search-wrap" }, /* @__PURE__ */ React72.createElement(Search, { size: 15 }), /* @__PURE__ */ React72.createElement(
3885
4014
  "input",
3886
4015
  {
3887
4016
  className: "dg-search",
@@ -6241,6 +6370,23 @@ var Box = React87.forwardRef(
6241
6370
  margin,
6242
6371
  width,
6243
6372
  height,
6373
+ minWidth,
6374
+ maxWidth,
6375
+ minHeight,
6376
+ maxHeight,
6377
+ flex,
6378
+ flexWrap,
6379
+ flexGrow,
6380
+ flexShrink,
6381
+ overflow,
6382
+ position,
6383
+ top,
6384
+ right,
6385
+ bottom,
6386
+ left,
6387
+ borderRadius,
6388
+ bgcolor,
6389
+ color,
6244
6390
  className,
6245
6391
  style,
6246
6392
  sx,
@@ -6257,6 +6403,23 @@ var Box = React87.forwardRef(
6257
6403
  ...margin !== void 0 ? { margin: typeof margin === "number" ? `${margin}px` : margin } : {},
6258
6404
  ...width !== void 0 ? { width: typeof width === "number" ? `${width}px` : width } : {},
6259
6405
  ...height !== void 0 ? { height: typeof height === "number" ? `${height}px` : height } : {},
6406
+ ...minWidth !== void 0 ? { minWidth: typeof minWidth === "number" ? `${minWidth}px` : minWidth } : {},
6407
+ ...maxWidth !== void 0 ? { maxWidth: typeof maxWidth === "number" ? `${maxWidth}px` : maxWidth } : {},
6408
+ ...minHeight !== void 0 ? { minHeight: typeof minHeight === "number" ? `${minHeight}px` : minHeight } : {},
6409
+ ...maxHeight !== void 0 ? { maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight } : {},
6410
+ ...flex !== void 0 ? { flex } : {},
6411
+ ...flexWrap !== void 0 ? { flexWrap } : {},
6412
+ ...flexGrow !== void 0 ? { flexGrow } : {},
6413
+ ...flexShrink !== void 0 ? { flexShrink } : {},
6414
+ ...overflow !== void 0 ? { overflow } : {},
6415
+ ...position !== void 0 ? { position } : {},
6416
+ ...top !== void 0 ? { top: typeof top === "number" ? `${top}px` : top } : {},
6417
+ ...right !== void 0 ? { right: typeof right === "number" ? `${right}px` : right } : {},
6418
+ ...bottom !== void 0 ? { bottom: typeof bottom === "number" ? `${bottom}px` : bottom } : {},
6419
+ ...left !== void 0 ? { left: typeof left === "number" ? `${left}px` : left } : {},
6420
+ ...borderRadius !== void 0 ? { borderRadius: typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius } : {},
6421
+ ...bgcolor !== void 0 ? { backgroundColor: bgcolor } : {},
6422
+ ...color !== void 0 ? { color } : {},
6260
6423
  ...style
6261
6424
  };
6262
6425
  const classes = ["rf-box", sxClass, className].filter(Boolean).join(" ");
@@ -6277,6 +6440,8 @@ var Stack = React88.forwardRef(
6277
6440
  divider,
6278
6441
  flexWrap,
6279
6442
  useFlexGap = true,
6443
+ flex,
6444
+ overflow,
6280
6445
  component = "div",
6281
6446
  children,
6282
6447
  className,
@@ -6292,6 +6457,8 @@ var Stack = React88.forwardRef(
6292
6457
  ...justifyContent !== void 0 ? { justifyContent } : {},
6293
6458
  ...flexWrap !== void 0 ? { flexWrap } : {},
6294
6459
  ...gapValue !== void 0 && useFlexGap ? { gap: gapValue } : {},
6460
+ ...flex !== void 0 ? { flex } : {},
6461
+ ...overflow !== void 0 ? { overflow } : {},
6295
6462
  ...style
6296
6463
  };
6297
6464
  const classes = ["rf-stack", sxClass, className].filter(Boolean).join(" ");
@@ -6788,6 +6955,30 @@ var Tabs = ({
6788
6955
  ));
6789
6956
  };
6790
6957
  Tabs.displayName = "Tabs";
6958
+ var TabPanel = ({
6959
+ value,
6960
+ activeValue,
6961
+ children,
6962
+ keepMounted = false,
6963
+ className = "",
6964
+ style,
6965
+ sx
6966
+ }) => {
6967
+ const sxClass = useSx(sx);
6968
+ const isActive = value === activeValue;
6969
+ if (!isActive && !keepMounted) return null;
6970
+ return /* @__PURE__ */ React93.createElement(
6971
+ "div",
6972
+ {
6973
+ role: "tabpanel",
6974
+ hidden: !isActive,
6975
+ className: ["rf-tab-panel", sxClass, className].filter(Boolean).join(" "),
6976
+ style
6977
+ },
6978
+ isActive && children
6979
+ );
6980
+ };
6981
+ TabPanel.displayName = "TabPanel";
6791
6982
 
6792
6983
  // lib/Breadcrumbs/Breadcrumbs.tsx
6793
6984
  import React94, {
@@ -8226,6 +8417,7 @@ export {
8226
8417
  suspendUserIcon_default as SuspendUserIcon,
8227
8418
  Switch,
8228
8419
  Tab,
8420
+ TabPanel,
8229
8421
  Tabs,
8230
8422
  technicalSkillsIcon_default as TechnicalSkillsIcon,
8231
8423
  TextField,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.1.84",
4
+ "version": "0.1.85",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",