@rufous/ui 0.3.26 → 0.3.27

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
@@ -1841,12 +1841,6 @@ var STEP_BY_VARIANT = {
1841
1841
  "positive-integer": 1,
1842
1842
  "positive-decimal": 0.1
1843
1843
  };
1844
- var MIN_BY_VARIANT = {
1845
- "integer": void 0,
1846
- "decimal": void 0,
1847
- "positive-integer": 0,
1848
- "positive-decimal": 0
1849
- };
1850
1844
  var TextField = (0, import_react17.forwardRef)(({
1851
1845
  label,
1852
1846
  name,
@@ -1935,21 +1929,23 @@ var TextField = (0, import_react17.forwardRef)(({
1935
1929
  }
1936
1930
  }
1937
1931
  };
1932
+ const stepBy = (delta) => {
1933
+ if (!internalRef.current) return;
1934
+ const step = Number(stepProp ?? (numberVariant ? STEP_BY_VARIANT[numberVariant] : 1));
1935
+ const newVal = (parseFloat(internalRef.current.value) || 0) + delta * step;
1936
+ const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
1937
+ nativeInputValueSetter?.call(internalRef.current, String(newVal));
1938
+ triggerChange();
1939
+ };
1938
1940
  const handleIncrement = (e) => {
1939
1941
  e.preventDefault();
1940
1942
  e.stopPropagation();
1941
- if (internalRef.current) {
1942
- internalRef.current.stepUp();
1943
- triggerChange();
1944
- }
1943
+ stepBy(1);
1945
1944
  };
1946
1945
  const handleDecrement = (e) => {
1947
1946
  e.preventDefault();
1948
1947
  e.stopPropagation();
1949
- if (internalRef.current) {
1950
- internalRef.current.stepDown();
1951
- triggerChange();
1952
- }
1948
+ stepBy(-1);
1953
1949
  };
1954
1950
  const handleKeyDown = (e) => {
1955
1951
  if (type === "number") {
@@ -1960,16 +1956,10 @@ var TextField = (0, import_react17.forwardRef)(({
1960
1956
  }
1961
1957
  if (e.key === "ArrowUp") {
1962
1958
  e.preventDefault();
1963
- if (internalRef.current) {
1964
- internalRef.current.stepUp();
1965
- triggerChange();
1966
- }
1959
+ stepBy(1);
1967
1960
  } else if (e.key === "ArrowDown") {
1968
1961
  e.preventDefault();
1969
- if (internalRef.current) {
1970
- internalRef.current.stepDown();
1971
- triggerChange();
1972
- }
1962
+ stepBy(-1);
1973
1963
  }
1974
1964
  }
1975
1965
  if (props.onKeyDown) props.onKeyDown(e);
@@ -1995,18 +1985,24 @@ var TextField = (0, import_react17.forwardRef)(({
1995
1985
  "input",
1996
1986
  {
1997
1987
  ref: internalRef,
1998
- type,
1988
+ type: type === "number" ? "text" : type,
1989
+ inputMode: type === "number" ? "numeric" : void 0,
1999
1990
  onKeyDown: handleKeyDown,
2000
1991
  className: "rf-text-field__input",
2001
1992
  placeholder: placeholder || (variant === "outlined" ? " " : void 0),
2002
1993
  name,
2003
1994
  id: inputId,
2004
- value,
1995
+ value: (() => {
1996
+ if (type !== "number" || value === void 0 || value === null || value === "") return value;
1997
+ const str = String(value);
1998
+ if (!str.includes("e") && !str.includes("E")) return str;
1999
+ const num = Number(str);
2000
+ if (isNaN(num)) return str;
2001
+ return num.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 });
2002
+ })(),
2005
2003
  required,
2006
2004
  disabled,
2007
2005
  readOnly,
2008
- step: type === "number" ? stepProp ?? (numberVariant ? STEP_BY_VARIANT[numberVariant] : void 0) : void 0,
2009
- min: type === "number" && numberVariant ? MIN_BY_VARIANT[numberVariant] : void 0,
2010
2006
  ...slotProps?.input,
2011
2007
  ...props,
2012
2008
  onChange: handleChange
@@ -2419,7 +2415,7 @@ function AutocompleteInner(props, _ref) {
2419
2415
  onClose?.();
2420
2416
  if (!justSelected && !freeSolo && !multiple && value == null) {
2421
2417
  setInputStr("");
2422
- onInputChange?.(null, "");
2418
+ onInputChange?.(null, "", "reset");
2423
2419
  }
2424
2420
  }, [openProp, freeSolo, multiple, value, onInputChange, onClose]);
2425
2421
  (0, import_react19.useEffect)(() => {
@@ -2464,13 +2460,13 @@ function AutocompleteInner(props, _ref) {
2464
2460
  onChange?.(event, next, already ? "removeOption" : "selectOption");
2465
2461
  setInputStr("");
2466
2462
  setFilterQuery("");
2467
- onInputChange?.(event, "");
2463
+ onInputChange?.(event, "", "reset");
2468
2464
  inputRef.current?.focus();
2469
2465
  } else {
2470
2466
  onChange?.(event, opt, "selectOption");
2471
2467
  setInputStr(getOptionLabel(opt));
2472
2468
  setFilterQuery("");
2473
- onInputChange?.(event, getOptionLabel(opt));
2469
+ onInputChange?.(event, getOptionLabel(opt), "reset");
2474
2470
  closePopup(true);
2475
2471
  }
2476
2472
  setFocusedIdx(-1);
@@ -2480,7 +2476,7 @@ function AutocompleteInner(props, _ref) {
2480
2476
  onChange?.(e, multiple ? [] : null, "clear");
2481
2477
  setInputStr("");
2482
2478
  setFilterQuery("");
2483
- onInputChange?.(e, "");
2479
+ onInputChange?.(e, "", "clear");
2484
2480
  inputRef.current?.focus();
2485
2481
  };
2486
2482
  const removeTag = (opt, e) => {
@@ -2492,7 +2488,7 @@ function AutocompleteInner(props, _ref) {
2492
2488
  const v = e.target.value;
2493
2489
  setInputStr(v);
2494
2490
  setFilterQuery(v);
2495
- onInputChange?.(e, v);
2491
+ onInputChange?.(e, v, "input");
2496
2492
  if (!open) openPopup();
2497
2493
  };
2498
2494
  const handleKeyDown = (e) => {
@@ -2579,7 +2575,7 @@ function AutocompleteInner(props, _ref) {
2579
2575
  multiple && (renderTags ? renderTags(selectedValues, ({ index }) => ({
2580
2576
  key: index,
2581
2577
  onDelete: (e) => removeTag(selectedValues[index], e)
2582
- })) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, visibleTags.map((opt, i) => /* @__PURE__ */ import_react19.default.createElement("span", { key: i, className: "rf-autocomplete__tag" }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { overflow: "hidden", textOverflow: "ellipsis" } }, getOptionLabel(opt)), /* @__PURE__ */ import_react19.default.createElement(
2578
+ })) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, visibleTags.map((opt, i) => /* @__PURE__ */ import_react19.default.createElement("span", { key: i, className: "rf-autocomplete__tag" }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { overflow: "hidden", textOverflow: "ellipsis" } }, getOptionLabel(opt)), !disabled && /* @__PURE__ */ import_react19.default.createElement(
2583
2579
  "button",
2584
2580
  {
2585
2581
  type: "button",
@@ -2632,7 +2628,7 @@ function AutocompleteInner(props, _ref) {
2632
2628
  "aria-label": "Clear"
2633
2629
  },
2634
2630
  /* @__PURE__ */ import_react19.default.createElement(CloseSmIcon, { size: 16 })
2635
- ), !freeSolo && /* @__PURE__ */ import_react19.default.createElement(
2631
+ ), !freeSolo && !disabled && /* @__PURE__ */ import_react19.default.createElement(
2636
2632
  "button",
2637
2633
  {
2638
2634
  type: "button",
@@ -3807,16 +3803,15 @@ var DateField = ({
3807
3803
  }
3808
3804
  }
3809
3805
  ),
3810
- /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ import_react21.default.createElement(
3806
+ !disabled && /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ import_react21.default.createElement(
3811
3807
  "button",
3812
3808
  {
3813
3809
  type: "button",
3814
3810
  className: "rf-date-field__icon-btn",
3815
3811
  tabIndex: -1,
3816
- disabled,
3817
3812
  onClick: (e) => {
3818
3813
  e.stopPropagation();
3819
- if (!disabled) setOpen((o) => !o);
3814
+ setOpen((o) => !o);
3820
3815
  },
3821
3816
  "aria-label": "Pick date"
3822
3817
  },
@@ -4416,16 +4411,15 @@ var DateRangeField = ({
4416
4411
  }
4417
4412
  }
4418
4413
  ),
4419
- /* @__PURE__ */ import_react22.default.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ import_react22.default.createElement(
4414
+ !disabled && /* @__PURE__ */ import_react22.default.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ import_react22.default.createElement(
4420
4415
  "button",
4421
4416
  {
4422
4417
  type: "button",
4423
4418
  className: "rf-date-field__icon-btn",
4424
4419
  tabIndex: -1,
4425
- disabled,
4426
4420
  onClick: (e) => {
4427
4421
  e.stopPropagation();
4428
- if (!disabled) setOpen((o) => !o);
4422
+ setOpen((o) => !o);
4429
4423
  },
4430
4424
  "aria-label": "Pick date range"
4431
4425
  },
@@ -4619,7 +4613,59 @@ var RufousLogoLoader = ({ size = 80, sx, className }) => {
4619
4613
 
4620
4614
  // lib/DataGrid/DataGrid.tsx
4621
4615
  var import_react23 = __toESM(require("react"), 1);
4616
+ var import_react_dom5 = __toESM(require("react-dom"), 1);
4622
4617
  var import_lucide_react2 = require("lucide-react");
4618
+ function OverflowTooltip({ content }) {
4619
+ const ref = (0, import_react23.useRef)(null);
4620
+ const [pos, setPos] = (0, import_react23.useState)(null);
4621
+ return /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement(
4622
+ "span",
4623
+ {
4624
+ ref,
4625
+ onMouseEnter: () => {
4626
+ if (ref.current && ref.current.scrollWidth > ref.current.clientWidth) {
4627
+ const r = ref.current.getBoundingClientRect();
4628
+ setPos({ top: r.top, left: r.left + r.width / 2 });
4629
+ }
4630
+ },
4631
+ onMouseLeave: () => setPos(null),
4632
+ style: { display: "block", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
4633
+ },
4634
+ content
4635
+ ), pos && import_react_dom5.default.createPortal(
4636
+ /* @__PURE__ */ import_react23.default.createElement("div", { style: {
4637
+ position: "fixed",
4638
+ top: pos.top - 4,
4639
+ left: pos.left,
4640
+ transform: "translate(-50%, -100%)",
4641
+ background: "rgba(0,0,0,0.75)",
4642
+ color: "#fff",
4643
+ padding: "4px 8px",
4644
+ borderRadius: 4,
4645
+ fontSize: "0.75rem",
4646
+ maxWidth: 320,
4647
+ wordBreak: "break-word",
4648
+ zIndex: 9999,
4649
+ pointerEvents: "none",
4650
+ whiteSpace: "normal"
4651
+ } }, content),
4652
+ document.body
4653
+ ));
4654
+ }
4655
+ function formatCellValue(value, colType) {
4656
+ if (value == null) return "";
4657
+ if (colType === "number") {
4658
+ const num = Number(value);
4659
+ if (!isNaN(num)) {
4660
+ const str = String(num);
4661
+ if (str.includes("e") || str.includes("E")) {
4662
+ return num.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 });
4663
+ }
4664
+ return str;
4665
+ }
4666
+ }
4667
+ return String(value);
4668
+ }
4623
4669
  function getAllGroupIds(rows, fields, getKey, depth = 0, parentId = "") {
4624
4670
  if (!fields.length || !rows.length) return [];
4625
4671
  const [field, ...rest] = fields;
@@ -5295,6 +5341,7 @@ function DataGrid({
5295
5341
  onChange: (e) => {
5296
5342
  setFilterText(e.target.value);
5297
5343
  setCurrentPage(1);
5344
+ if (onPaginationModelChange) onPaginationModelChange({ page: 0, pageSize: activePageSize });
5298
5345
  }
5299
5346
  }
5300
5347
  )), showFilterBtn && /* @__PURE__ */ import_react23.default.createElement(Tooltip, { title: "Filters", placement: "top" }, /* @__PURE__ */ import_react23.default.createElement(
@@ -5502,7 +5549,7 @@ function DataGrid({
5502
5549
  const formattedValue = col.valueFormatter ? col.valueFormatter({ value, row: item, field }) : value;
5503
5550
  if (col.renderCell) return col.renderCell({ value, row: item, field });
5504
5551
  if (col.render) return col.render(value, item);
5505
- return String(formattedValue ?? "");
5552
+ return /* @__PURE__ */ import_react23.default.createElement(OverflowTooltip, { content: formatCellValue(formattedValue, col.type) });
5506
5553
  })()
5507
5554
  );
5508
5555
  }), actions && /* @__PURE__ */ import_react23.default.createElement("td", { className: "dg-row-actions-cell" }, (() => {
@@ -5571,7 +5618,7 @@ function DataGrid({
5571
5618
  setActiveMenu(null);
5572
5619
  } }, /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.Layers, { size: 14 }), " Group by");
5573
5620
  })(),
5574
- /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-menu-item", onClick: () => toggleHide(activeMenu) }, /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.EyeOff, { size: 14 }), " Hide column"),
5621
+ activeMenuCol?.hideable !== false && /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-menu-item", onClick: () => toggleHide(activeMenu) }, /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.EyeOff, { size: 14 }), " Hide column"),
5575
5622
  /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-menu-item", onClick: () => {
5576
5623
  setShowManageColumns(true);
5577
5624
  setActiveMenu(null);
@@ -5588,7 +5635,7 @@ function DataGrid({
5588
5635
  )), resolvedColumns.filter((c) => c.header.toLowerCase().includes(colSearch.toLowerCase())).map((col) => {
5589
5636
  const key = String(col.key);
5590
5637
  const isUnhideable = col.hideable === false;
5591
- return /* @__PURE__ */ import_react23.default.createElement("div", { key, className: `dg-col-row${isUnhideable ? " disabled" : ""}` }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "dg-col-label" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "dg-col-dot", style: { background: col.hidden ? "var(--border-color)" : "var(--primary-color)" } }), col.header), !isUnhideable && /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-icon-btn", onClick: () => toggleHide(key) }, col.hidden ? /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.EyeOff, { size: 14 }) : /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.EyeOff, { size: 14, style: { opacity: 0.4 } })));
5638
+ return /* @__PURE__ */ import_react23.default.createElement("div", { key, className: `dg-col-row${isUnhideable ? " disabled" : ""}` }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "dg-col-label" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "dg-col-dot", style: { background: col.hidden ? "var(--border-color)" : "var(--primary-color)" } }), col.header), !isUnhideable && /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-icon-btn", onClick: () => toggleHide(key) }, col.hidden ? /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.EyeOff, { size: 14 }) : /* @__PURE__ */ import_react23.default.createElement(import_lucide_react2.Eye, { size: 14 })));
5592
5639
  })), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dg-modal-footer" }, /* @__PURE__ */ import_react23.default.createElement("button", { className: "dg-action-btn", onClick: () => setColumnOverrides((prev) => {
5593
5640
  const next = { ...prev };
5594
5641
  resolvedColumns.forEach((c) => {
@@ -5648,7 +5695,9 @@ function DataGrid({
5648
5695
  value: f.value,
5649
5696
  onChange: (val) => setAdvancedFilters((p) => p.map((fi, i) => i === idx ? { ...fi, value: val } : fi)),
5650
5697
  variant: "compact",
5651
- fullWidth: true
5698
+ fullWidth: true,
5699
+ dateFormat: "DD/MM/YYYY",
5700
+ placeholder: "DD/MM/YYYY"
5652
5701
  }
5653
5702
  )), !hideValue && col?.type === "status" && (() => {
5654
5703
  const opts = col.statusOptions || [...new Set(data.map((item) => String(item[col.field || col.key || ""])))].filter((v) => v && v !== "undefined" && v !== "null").sort();
@@ -5702,7 +5751,7 @@ function DataGrid({
5702
5751
 
5703
5752
  // lib/Select/Select.tsx
5704
5753
  var import_react24 = __toESM(require("react"), 1);
5705
- var import_react_dom5 = __toESM(require("react-dom"), 1);
5754
+ var import_react_dom6 = __toESM(require("react-dom"), 1);
5706
5755
  var ChevronDownIcon2 = () => /* @__PURE__ */ import_react24.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react24.default.createElement("polyline", { points: "6 9 12 15 18 9" }));
5707
5756
  var CheckIcon2 = () => /* @__PURE__ */ import_react24.default.createElement("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react24.default.createElement("polyline", { points: "20 6 9 17 4 12" }));
5708
5757
  function normaliseOptions(options) {
@@ -5911,10 +5960,10 @@ var Select = import_react24.default.forwardRef(function Select2(props, ref) {
5911
5960
  renderDisplay(),
5912
5961
  label && /* @__PURE__ */ import_react24.default.createElement("label", { id: inputId, className: "rf-text-field__label" }, label, required && /* @__PURE__ */ import_react24.default.createElement("span", { className: "rf-text-field__asterisk" }, " *")),
5913
5962
  variant === "outlined" && /* @__PURE__ */ import_react24.default.createElement("fieldset", { className: "rf-text-field__notch" }, label ? /* @__PURE__ */ import_react24.default.createElement("legend", { className: "rf-text-field__legend" }, /* @__PURE__ */ import_react24.default.createElement("span", null, label, required ? " *" : "")) : /* @__PURE__ */ import_react24.default.createElement("legend", { className: "rf-text-field__legend--empty" })),
5914
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "rf-select__arrow", "aria-hidden": "true" }, /* @__PURE__ */ import_react24.default.createElement(ChevronDownIcon2, null))
5963
+ !disabled && /* @__PURE__ */ import_react24.default.createElement("div", { className: "rf-select__arrow", "aria-hidden": "true" }, /* @__PURE__ */ import_react24.default.createElement(ChevronDownIcon2, null))
5915
5964
  ),
5916
5965
  helperText && /* @__PURE__ */ import_react24.default.createElement("div", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText),
5917
- open && !disabled && import_react_dom5.default.createPortal(
5966
+ open && !disabled && import_react_dom6.default.createPortal(
5918
5967
  /* @__PURE__ */ import_react24.default.createElement("div", { ref: popupRef, className: "rf-select__popup", role: "presentation", style: popupStyle }, /* @__PURE__ */ import_react24.default.createElement("ul", { ref: listRef, className: "rf-select__listbox", role: "listbox", "aria-multiselectable": multiple }, (() => {
5919
5968
  const renderOpt = (opt, selectableIdx) => {
5920
5969
  const selected = isSelected(opt.value);
@@ -8001,7 +8050,7 @@ Stepper.displayName = "Stepper";
8001
8050
 
8002
8051
  // lib/Menu/Menu.tsx
8003
8052
  var import_react40 = __toESM(require("react"), 1);
8004
- var import_react_dom6 = __toESM(require("react-dom"), 1);
8053
+ var import_react_dom7 = __toESM(require("react-dom"), 1);
8005
8054
  var MenuDivider = () => /* @__PURE__ */ import_react40.default.createElement("hr", { className: "rf-menu-divider", "aria-hidden": "true" });
8006
8055
  MenuDivider.displayName = "MenuDivider";
8007
8056
  var MenuItem = ({
@@ -8154,13 +8203,13 @@ var Menu = ({
8154
8203
  },
8155
8204
  children
8156
8205
  ));
8157
- return import_react_dom6.default.createPortal(portal, document.body);
8206
+ return import_react_dom7.default.createPortal(portal, document.body);
8158
8207
  };
8159
8208
  Menu.displayName = "Menu";
8160
8209
 
8161
8210
  // lib/Drawer/Drawer.tsx
8162
8211
  var import_react41 = __toESM(require("react"), 1);
8163
- var import_react_dom7 = __toESM(require("react-dom"), 1);
8212
+ var import_react_dom8 = __toESM(require("react-dom"), 1);
8164
8213
  var Drawer = ({
8165
8214
  open,
8166
8215
  onClose,
@@ -8260,7 +8309,7 @@ var Drawer = ({
8260
8309
  },
8261
8310
  children
8262
8311
  ));
8263
- return import_react_dom7.default.createPortal(
8312
+ return import_react_dom8.default.createPortal(
8264
8313
  /* @__PURE__ */ import_react41.default.createElement("div", { className: rootClasses, style }, drawerContent),
8265
8314
  document.body
8266
8315
  );
@@ -8269,7 +8318,7 @@ Drawer.displayName = "Drawer";
8269
8318
 
8270
8319
  // lib/Snackbar/Snackbar.tsx
8271
8320
  var import_react42 = __toESM(require("react"), 1);
8272
- var import_react_dom8 = __toESM(require("react-dom"), 1);
8321
+ var import_react_dom9 = __toESM(require("react-dom"), 1);
8273
8322
  var SEVERITY_ICONS = {
8274
8323
  success: "\u2713",
8275
8324
  error: "\u2715",
@@ -8374,7 +8423,7 @@ var Snackbar = ({
8374
8423
  "\u2715"
8375
8424
  )
8376
8425
  ));
8377
- return import_react_dom8.default.createPortal(snackbarEl, document.body);
8426
+ return import_react_dom9.default.createPortal(snackbarEl, document.body);
8378
8427
  };
8379
8428
  Snackbar.displayName = "Snackbar";
8380
8429
 
@@ -8428,7 +8477,7 @@ Link.displayName = "Link";
8428
8477
 
8429
8478
  // lib/Popper/Popper.tsx
8430
8479
  var import_react44 = __toESM(require("react"), 1);
8431
- var import_react_dom9 = __toESM(require("react-dom"), 1);
8480
+ var import_react_dom10 = __toESM(require("react-dom"), 1);
8432
8481
  function computePopperPosition(anchorRect, popperRect, placement, offset2 = [0, 8]) {
8433
8482
  const [skid, dist] = offset2;
8434
8483
  let top = 0;
@@ -8571,13 +8620,13 @@ var Popper = ({
8571
8620
  if (disablePortal) {
8572
8621
  return /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, popper);
8573
8622
  }
8574
- return import_react_dom9.default.createPortal(popper, document.body);
8623
+ return import_react_dom10.default.createPortal(popper, document.body);
8575
8624
  };
8576
8625
  Popper.displayName = "Popper";
8577
8626
 
8578
8627
  // lib/Popover/Popover.tsx
8579
8628
  var import_react45 = __toESM(require("react"), 1);
8580
- var import_react_dom10 = __toESM(require("react-dom"), 1);
8629
+ var import_react_dom11 = __toESM(require("react-dom"), 1);
8581
8630
  function getPoint(rect, v, h) {
8582
8631
  const x = h === "left" ? rect.left : h === "center" ? rect.left + rect.width / 2 : rect.right;
8583
8632
  const y = v === "top" ? rect.top : v === "center" ? rect.top + rect.height / 2 : rect.bottom;
@@ -8680,7 +8729,7 @@ var Popover = ({
8680
8729
  if (disablePortal) {
8681
8730
  return /* @__PURE__ */ import_react45.default.createElement("div", { className: `${rootClasses} rf-popover-inline`, style }, content);
8682
8731
  }
8683
- return import_react_dom10.default.createPortal(
8732
+ return import_react_dom11.default.createPortal(
8684
8733
  /* @__PURE__ */ import_react45.default.createElement("div", { className: rootClasses, style }, content),
8685
8734
  document.body
8686
8735
  );
@@ -9331,7 +9380,7 @@ PhoneField.displayName = "PhoneField";
9331
9380
 
9332
9381
  // lib/TreeSelect/TreeSelect.tsx
9333
9382
  var import_react49 = __toESM(require("react"), 1);
9334
- var import_react_dom11 = __toESM(require("react-dom"), 1);
9383
+ var import_react_dom12 = __toESM(require("react-dom"), 1);
9335
9384
  var import_lucide_react3 = require("lucide-react");
9336
9385
  function nodeId(node) {
9337
9386
  return node.id ?? node._id;
@@ -9641,11 +9690,13 @@ function TreeSelect({
9641
9690
  error ? "rf-text-field--error" : "",
9642
9691
  fullWidth ? "rf-text-field--full-width" : "",
9643
9692
  isFloating ? "rf-text-field--floating" : "",
9693
+ label ? "rf-text-field--has-label" : "",
9694
+ "rf-text-field--adorned-end",
9644
9695
  "rf-tree-select",
9645
9696
  sxClass,
9646
9697
  className
9647
9698
  ].filter(Boolean).join(" ");
9648
- return /* @__PURE__ */ import_react49.default.createElement("div", { className: rootClasses, style }, label && /* @__PURE__ */ import_react49.default.createElement("label", { className: "rf-text-field__label" }, label, " ", required && /* @__PURE__ */ import_react49.default.createElement("span", { className: "rf-text-field__asterisk" }, "*")), /* @__PURE__ */ import_react49.default.createElement(
9699
+ return /* @__PURE__ */ import_react49.default.createElement("div", { className: rootClasses, style }, /* @__PURE__ */ import_react49.default.createElement(
9649
9700
  "div",
9650
9701
  {
9651
9702
  ref: triggerRef,
@@ -9657,7 +9708,7 @@ function TreeSelect({
9657
9708
  onBlur: handleTriggerBlur,
9658
9709
  onKeyDown: handleKeyDown
9659
9710
  },
9660
- isMultiple ? /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-ts__chips" }, tagNodes.length > 0 ? tagNodes.map((node) => /* @__PURE__ */ import_react49.default.createElement("span", { key: node.id, className: "rf-ts__chip" }, node.label, /* @__PURE__ */ import_react49.default.createElement(
9711
+ isMultiple ? /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-ts__chips" }, tagNodes.length > 0 ? tagNodes.map((node) => /* @__PURE__ */ import_react49.default.createElement("span", { key: node.id, className: "rf-ts__chip" }, node.label, !disabled && /* @__PURE__ */ import_react49.default.createElement(
9661
9712
  "button",
9662
9713
  {
9663
9714
  type: "button",
@@ -9666,8 +9717,8 @@ function TreeSelect({
9666
9717
  tabIndex: -1
9667
9718
  },
9668
9719
  /* @__PURE__ */ import_react49.default.createElement(import_lucide_react3.X, { size: 10 })
9669
- ))) : open ? /* @__PURE__ */ import_react49.default.createElement("span", { className: "rf-ts__placeholder" }, placeholder) : null) : /* @__PURE__ */ import_react49.default.createElement("div", { className: `rf-ts__display${!hasValue ? " rf-ts__display--placeholder" : ""}` }, hasValue ? tagNodes[0]?.label : open ? placeholder : "\xA0"),
9670
- /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-autocomplete__endgroup" }, clearable && hasValue && /* @__PURE__ */ import_react49.default.createElement(
9720
+ ))) : isFloating || !label ? /* @__PURE__ */ import_react49.default.createElement("span", { className: "rf-ts__placeholder" }, placeholder) : null) : /* @__PURE__ */ import_react49.default.createElement("div", { className: `rf-ts__display${!hasValue ? " rf-ts__display--placeholder" : ""}` }, hasValue ? tagNodes[0]?.label : isFloating || !label ? placeholder : "\xA0"),
9721
+ /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-autocomplete__endgroup" }, !disabled && clearable && hasValue && /* @__PURE__ */ import_react49.default.createElement(
9671
9722
  "button",
9672
9723
  {
9673
9724
  type: "button",
@@ -9676,7 +9727,7 @@ function TreeSelect({
9676
9727
  tabIndex: -1
9677
9728
  },
9678
9729
  /* @__PURE__ */ import_react49.default.createElement(import_lucide_react3.X, { size: 16 })
9679
- ), /* @__PURE__ */ import_react49.default.createElement(
9730
+ ), !disabled && /* @__PURE__ */ import_react49.default.createElement(
9680
9731
  "button",
9681
9732
  {
9682
9733
  type: "button",
@@ -9689,10 +9740,11 @@ function TreeSelect({
9689
9740
  },
9690
9741
  /* @__PURE__ */ import_react49.default.createElement(import_lucide_react3.ChevronDown, { size: 18 })
9691
9742
  )),
9743
+ label && /* @__PURE__ */ import_react49.default.createElement("label", { className: "rf-text-field__label" }, label, required && /* @__PURE__ */ import_react49.default.createElement("span", { className: "rf-text-field__asterisk" }, " *")),
9692
9744
  variant === "outlined" && /* @__PURE__ */ import_react49.default.createElement("fieldset", { "aria-hidden": true, className: "rf-text-field__notch" }, /* @__PURE__ */ import_react49.default.createElement("legend", { className: "rf-text-field__legend" }, label && /* @__PURE__ */ import_react49.default.createElement("span", null, label, required ? " *" : ""))),
9693
9745
  variant === "filled" && /* @__PURE__ */ import_react49.default.createElement(import_react49.default.Fragment, null, /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-text-field__filled-bg" }), /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-text-field__underline" })),
9694
9746
  variant === "standard" && /* @__PURE__ */ import_react49.default.createElement("div", { className: "rf-text-field__underline" })
9695
- ), helperText && /* @__PURE__ */ import_react49.default.createElement("p", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && import_react_dom11.default.createPortal(
9747
+ ), helperText && /* @__PURE__ */ import_react49.default.createElement("p", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && import_react_dom12.default.createPortal(
9696
9748
  /* @__PURE__ */ import_react49.default.createElement(
9697
9749
  "div",
9698
9750
  {
@@ -9942,11 +9994,11 @@ function SmartSelect({
9942
9994
  setInputValue(inputValue2);
9943
9995
  if (!onSearchChange) return;
9944
9996
  if (debounceTimer.current) clearTimeout(debounceTimer.current);
9945
- if (reason === "reset") return;
9946
- if (!inputValue2) {
9947
- onSearchChange("", 0);
9997
+ if (reason !== "input") {
9998
+ if (reason === "clear") onSearchChange("", 0);
9948
9999
  return;
9949
10000
  }
10001
+ if (!inputValue2) return;
9950
10002
  const q = inputValue2.toLowerCase();
9951
10003
  let localCount = 0;
9952
10004
  for (const opt of flatOptionsList) {
@@ -10105,7 +10157,7 @@ function SmartSelect({
10105
10157
 
10106
10158
  // lib/RufousTextEditor/RufousTextEditor.tsx
10107
10159
  var import_react62 = __toESM(require("react"), 1);
10108
- var import_react_dom18 = require("react-dom");
10160
+ var import_react_dom19 = require("react-dom");
10109
10161
  var import_react63 = require("@tiptap/react");
10110
10162
  var import_starter_kit = __toESM(require("@tiptap/starter-kit"), 1);
10111
10163
  var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
@@ -10227,7 +10279,7 @@ function createMentionSuggestion(users) {
10227
10279
 
10228
10280
  // lib/RufousTextEditor/Toolbar.tsx
10229
10281
  var import_react58 = __toESM(require("react"), 1);
10230
- var import_react_dom14 = require("react-dom");
10282
+ var import_react_dom15 = require("react-dom");
10231
10283
 
10232
10284
  // lib/RufousTextEditor/TextToSpeech.tsx
10233
10285
  var import_react54 = __toESM(require("react"), 1);
@@ -10538,7 +10590,7 @@ var SpeechToText_default = SpeechToText;
10538
10590
 
10539
10591
  // lib/RufousTextEditor/AICommands.tsx
10540
10592
  var import_react56 = __toESM(require("react"), 1);
10541
- var import_react_dom12 = require("react-dom");
10593
+ var import_react_dom13 = require("react-dom");
10542
10594
  var AI_COMMANDS = [
10543
10595
  { id: "improve", label: "Improve writing", prompt: "Improve the following text to make it clearer, more engaging, and well-structured. Return only the improved text, no explanations." },
10544
10596
  { id: "shorter", label: "Make shorter", prompt: "Make the following text shorter and more concise while keeping the key points. Return only the shortened text, no explanations." },
@@ -10694,7 +10746,7 @@ var AICommands = ({ editor, onAICommand }) => {
10694
10746
  onClick: () => handleCommandSelect(cmd)
10695
10747
  },
10696
10748
  cmd.label
10697
- ))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-commands-hint" }, editor.state.selection.empty ? "Will apply to all text" : "Will apply to selected text"))), showModal && (0, import_react_dom12.createPortal)(
10749
+ ))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-commands-hint" }, editor.state.selection.empty ? "Will apply to all text" : "Will apply to selected text"))), showModal && (0, import_react_dom13.createPortal)(
10698
10750
  /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-modal-overlay", onMouseDown: handleCancel }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-modal", onMouseDown: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-modal-header" }, /* @__PURE__ */ import_react56.default.createElement("span", { className: "ai-modal-title" }, "AI Assistant"), /* @__PURE__ */ import_react56.default.createElement("button", { className: "ai-modal-close", onClick: handleCancel }, "\xD7")), /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-modal-prompt-section" }, /* @__PURE__ */ import_react56.default.createElement("label", { className: "ai-modal-label" }, "Prompt"), /* @__PURE__ */ import_react56.default.createElement("div", { className: "ai-modal-prompt-row" }, /* @__PURE__ */ import_react56.default.createElement(
10699
10751
  "textarea",
10700
10752
  {
@@ -10743,7 +10795,7 @@ var AICommands_default = AICommands;
10743
10795
 
10744
10796
  // lib/RufousTextEditor/TranslateModal.tsx
10745
10797
  var import_react57 = __toESM(require("react"), 1);
10746
- var import_react_dom13 = require("react-dom");
10798
+ var import_react_dom14 = require("react-dom");
10747
10799
  var LANGUAGES = [
10748
10800
  { code: "af", name: "Afrikaans" },
10749
10801
  { code: "sq", name: "Albanian" },
@@ -10934,7 +10986,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
10934
10986
  setTranslating(false);
10935
10987
  }
10936
10988
  };
10937
- return (0, import_react_dom13.createPortal)(
10989
+ return (0, import_react_dom14.createPortal)(
10938
10990
  /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-overlay", onClick: onClose }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-content translate-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-header" }, /* @__PURE__ */ import_react57.default.createElement("h3", null, "Translate options"), /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-close", onClick: onClose }, "\xD7")), /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-body" }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "translate-columns" }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "translate-col" }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "translate-filter" }, /* @__PURE__ */ import_react57.default.createElement(
10939
10991
  "input",
10940
10992
  {
@@ -11843,7 +11895,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
11843
11895
  },
11844
11896
  trigger.label,
11845
11897
  /* @__PURE__ */ import_react58.default.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
11846
- )), open && (0, import_react_dom14.createPortal)(
11898
+ )), open && (0, import_react_dom15.createPortal)(
11847
11899
  /* @__PURE__ */ import_react58.default.createElement("div", { className: "rf-rte-wrapper rf-rte-dropdown-portal" }, /* @__PURE__ */ import_react58.default.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children)),
11848
11900
  document.body
11849
11901
  ));
@@ -12728,7 +12780,7 @@ var Toolbar_default = Toolbar;
12728
12780
 
12729
12781
  // lib/RufousTextEditor/ImageToolbar.tsx
12730
12782
  var import_react59 = __toESM(require("react"), 1);
12731
- var import_react_dom15 = require("react-dom");
12783
+ var import_react_dom16 = require("react-dom");
12732
12784
  var ALIGNMENTS = [
12733
12785
  { value: "left", label: "Left", icon: "\u2630" },
12734
12786
  { value: "center", label: "Center", icon: "\u2261" },
@@ -12899,7 +12951,7 @@ var ImageToolbar = ({ editor }) => {
12899
12951
  }, [editor]);
12900
12952
  const node = editor?.state.selection.node;
12901
12953
  const isImage = node && node.type.name === "image";
12902
- if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom15.createPortal)(
12954
+ if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom16.createPortal)(
12903
12955
  /* @__PURE__ */ import_react59.default.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
12904
12956
  document.body
12905
12957
  ) : null;
@@ -12976,7 +13028,7 @@ var ImageToolbar = ({ editor }) => {
12976
13028
  );
12977
13029
  setShowVAlign(false);
12978
13030
  };
12979
- return (0, import_react_dom15.createPortal)(
13031
+ return (0, import_react_dom16.createPortal)(
12980
13032
  /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement(
12981
13033
  "div",
12982
13034
  {
@@ -13007,7 +13059,7 @@ var ImageToolbar_default = ImageToolbar;
13007
13059
 
13008
13060
  // lib/RufousTextEditor/VideoToolbar.tsx
13009
13061
  var import_react60 = __toESM(require("react"), 1);
13010
- var import_react_dom16 = require("react-dom");
13062
+ var import_react_dom17 = require("react-dom");
13011
13063
  var ALIGNMENTS2 = [
13012
13064
  { value: "left", label: "Left", icon: "\u2630" },
13013
13065
  { value: "center", label: "Center", icon: "\u2261" },
@@ -13152,7 +13204,7 @@ var VideoToolbar = ({ editor }) => {
13152
13204
  const node = editor?.state.selection.node;
13153
13205
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
13154
13206
  const nodeType = node?.type.name;
13155
- if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom16.createPortal)(
13207
+ if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom17.createPortal)(
13156
13208
  /* @__PURE__ */ import_react60.default.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
13157
13209
  document.body
13158
13210
  ) : null;
@@ -13199,7 +13251,7 @@ var VideoToolbar = ({ editor }) => {
13199
13251
  })
13200
13252
  );
13201
13253
  };
13202
- return (0, import_react_dom16.createPortal)(
13254
+ return (0, import_react_dom17.createPortal)(
13203
13255
  /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, /* @__PURE__ */ import_react60.default.createElement(
13204
13256
  "div",
13205
13257
  {
@@ -13247,7 +13299,7 @@ var VideoToolbar_default = VideoToolbar;
13247
13299
 
13248
13300
  // lib/RufousTextEditor/TableToolbar.tsx
13249
13301
  var import_react61 = __toESM(require("react"), 1);
13250
- var import_react_dom17 = require("react-dom");
13302
+ var import_react_dom18 = require("react-dom");
13251
13303
  var IconAddRowBefore = () => /* @__PURE__ */ import_react61.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react61.default.createElement("path", { d: "M20 3H4c-.55 0-1 .45-1 1v16c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H5V5h14v6zm0 8H5v-6h14v6z" }), /* @__PURE__ */ import_react61.default.createElement("path", { d: "M9 6h2v1.5h1.5v2H11V11H9V9.5H7.5v-2H9z" }));
13252
13304
  var IconAddRowAfter = () => /* @__PURE__ */ import_react61.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react61.default.createElement("path", { d: "M20 3H4c-.55 0-1 .45-1 1v16c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H5V5h14v6zm0 8H5v-6h14v6z" }), /* @__PURE__ */ import_react61.default.createElement("path", { d: "M9 14h2v1.5h1.5v2H11V19H9v-1.5H7.5v-2H9z" }));
13253
13305
  var IconAddColBefore = () => /* @__PURE__ */ import_react61.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react61.default.createElement("path", { d: "M20 3H4c-.55 0-1 .45-1 1v16c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-9 16H5V5h6v14zm8 0h-6V5h6v14z" }), /* @__PURE__ */ import_react61.default.createElement("path", { d: "M6 10h1.5v2H6v1.5H4v-2h1.5V10H4V8h2z", transform: "translate(2,1)" }));
@@ -13304,7 +13356,7 @@ var TableToolbar = ({ editor }) => {
13304
13356
  const canMerge = editor.can().mergeCells();
13305
13357
  const canSplit = editor.can().splitCell();
13306
13358
  const prevent = (e) => e.preventDefault();
13307
- return (0, import_react_dom17.createPortal)(
13359
+ return (0, import_react_dom18.createPortal)(
13308
13360
  /* @__PURE__ */ import_react61.default.createElement(
13309
13361
  "div",
13310
13362
  {
@@ -13911,7 +13963,7 @@ var RufousTextEditor = ({
13911
13963
  },
13912
13964
  "\u201C Quote"
13913
13965
  )
13914
- ), /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react62.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react62.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react62.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, /* @__PURE__ */ import_react62.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react62.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom18.createPortal)(
13966
+ ), /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react62.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react62.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react62.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react62.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, /* @__PURE__ */ import_react62.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react62.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom19.createPortal)(
13915
13967
  /* @__PURE__ */ import_react62.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react62.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react62.default.createElement(
13916
13968
  "input",
13917
13969
  {
@@ -13956,7 +14008,7 @@ var RufousTextEditor = ({
13956
14008
  )),
13957
14009
  helperText && /* @__PURE__ */ import_react62.default.createElement("div", { className: `rf-rte-helper-text ${error ? "rf-rte-helper-error" : ""}` }, helperText)
13958
14010
  );
13959
- return isFullscreen ? (0, import_react_dom18.createPortal)(wrapperJsx, document.body) : wrapperJsx;
14011
+ return isFullscreen ? (0, import_react_dom19.createPortal)(wrapperJsx, document.body) : wrapperJsx;
13960
14012
  };
13961
14013
  var RufousTextContent = ({ content, className, style, sx }) => {
13962
14014
  const sxClass = useSx(sx);
package/dist/main.css CHANGED
@@ -6944,6 +6944,12 @@ pre {
6944
6944
  .rf-text-field__input:focus::placeholder {
6945
6945
  opacity: 1;
6946
6946
  }
6947
+ .rf-text-field:not(.rf-text-field--has-label) .rf-text-field__input::placeholder {
6948
+ opacity: 1;
6949
+ }
6950
+ .rf-text-field__legend--empty {
6951
+ display: none;
6952
+ }
6947
6953
  .rf-text-field__helper-text {
6948
6954
  color: var(--tf-placeholder-color);
6949
6955
  font-size: 0.75rem;
package/dist/main.d.cts CHANGED
@@ -714,8 +714,8 @@ interface AutocompleteProps<T = string> {
714
714
  onChange?: (event: React__default.SyntheticEvent, value: T | T[] | null, reason: 'selectOption' | 'removeOption' | 'clear' | 'freeSolo') => void;
715
715
  /** Controlled text in the input */
716
716
  inputValue?: string;
717
- /** Called on every keystroke — receives the native event and the new input string */
718
- onInputChange?: (event: React__default.SyntheticEvent | null, value: string) => void;
717
+ /** Called on every keystroke or when input resets — receives the native event, new input string, and reason */
718
+ onInputChange?: (event: React__default.SyntheticEvent | null, value: string, reason: 'input' | 'reset' | 'clear') => void;
719
719
  /** Return the string label for an option */
720
720
  getOptionLabel?: (option: T) => string;
721
721
  /** Decide equality between option and value (useful for objects) */
package/dist/main.d.ts CHANGED
@@ -714,8 +714,8 @@ interface AutocompleteProps<T = string> {
714
714
  onChange?: (event: React__default.SyntheticEvent, value: T | T[] | null, reason: 'selectOption' | 'removeOption' | 'clear' | 'freeSolo') => void;
715
715
  /** Controlled text in the input */
716
716
  inputValue?: string;
717
- /** Called on every keystroke — receives the native event and the new input string */
718
- onInputChange?: (event: React__default.SyntheticEvent | null, value: string) => void;
717
+ /** Called on every keystroke or when input resets — receives the native event, new input string, and reason */
718
+ onInputChange?: (event: React__default.SyntheticEvent | null, value: string, reason: 'input' | 'reset' | 'clear') => void;
719
719
  /** Return the string label for an option */
720
720
  getOptionLabel?: (option: T) => string;
721
721
  /** Decide equality between option and value (useful for objects) */
package/dist/main.js CHANGED
@@ -1659,12 +1659,6 @@ var STEP_BY_VARIANT = {
1659
1659
  "positive-integer": 1,
1660
1660
  "positive-decimal": 0.1
1661
1661
  };
1662
- var MIN_BY_VARIANT = {
1663
- "integer": void 0,
1664
- "decimal": void 0,
1665
- "positive-integer": 0,
1666
- "positive-decimal": 0
1667
- };
1668
1662
  var TextField = forwardRef3(({
1669
1663
  label,
1670
1664
  name,
@@ -1753,21 +1747,23 @@ var TextField = forwardRef3(({
1753
1747
  }
1754
1748
  }
1755
1749
  };
1750
+ const stepBy = (delta) => {
1751
+ if (!internalRef.current) return;
1752
+ const step = Number(stepProp ?? (numberVariant ? STEP_BY_VARIANT[numberVariant] : 1));
1753
+ const newVal = (parseFloat(internalRef.current.value) || 0) + delta * step;
1754
+ const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
1755
+ nativeInputValueSetter?.call(internalRef.current, String(newVal));
1756
+ triggerChange();
1757
+ };
1756
1758
  const handleIncrement = (e) => {
1757
1759
  e.preventDefault();
1758
1760
  e.stopPropagation();
1759
- if (internalRef.current) {
1760
- internalRef.current.stepUp();
1761
- triggerChange();
1762
- }
1761
+ stepBy(1);
1763
1762
  };
1764
1763
  const handleDecrement = (e) => {
1765
1764
  e.preventDefault();
1766
1765
  e.stopPropagation();
1767
- if (internalRef.current) {
1768
- internalRef.current.stepDown();
1769
- triggerChange();
1770
- }
1766
+ stepBy(-1);
1771
1767
  };
1772
1768
  const handleKeyDown = (e) => {
1773
1769
  if (type === "number") {
@@ -1778,16 +1774,10 @@ var TextField = forwardRef3(({
1778
1774
  }
1779
1775
  if (e.key === "ArrowUp") {
1780
1776
  e.preventDefault();
1781
- if (internalRef.current) {
1782
- internalRef.current.stepUp();
1783
- triggerChange();
1784
- }
1777
+ stepBy(1);
1785
1778
  } else if (e.key === "ArrowDown") {
1786
1779
  e.preventDefault();
1787
- if (internalRef.current) {
1788
- internalRef.current.stepDown();
1789
- triggerChange();
1790
- }
1780
+ stepBy(-1);
1791
1781
  }
1792
1782
  }
1793
1783
  if (props.onKeyDown) props.onKeyDown(e);
@@ -1813,18 +1803,24 @@ var TextField = forwardRef3(({
1813
1803
  "input",
1814
1804
  {
1815
1805
  ref: internalRef,
1816
- type,
1806
+ type: type === "number" ? "text" : type,
1807
+ inputMode: type === "number" ? "numeric" : void 0,
1817
1808
  onKeyDown: handleKeyDown,
1818
1809
  className: "rf-text-field__input",
1819
1810
  placeholder: placeholder || (variant === "outlined" ? " " : void 0),
1820
1811
  name,
1821
1812
  id: inputId,
1822
- value,
1813
+ value: (() => {
1814
+ if (type !== "number" || value === void 0 || value === null || value === "") return value;
1815
+ const str = String(value);
1816
+ if (!str.includes("e") && !str.includes("E")) return str;
1817
+ const num = Number(str);
1818
+ if (isNaN(num)) return str;
1819
+ return num.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 });
1820
+ })(),
1823
1821
  required,
1824
1822
  disabled,
1825
1823
  readOnly,
1826
- step: type === "number" ? stepProp ?? (numberVariant ? STEP_BY_VARIANT[numberVariant] : void 0) : void 0,
1827
- min: type === "number" && numberVariant ? MIN_BY_VARIANT[numberVariant] : void 0,
1828
1824
  ...slotProps?.input,
1829
1825
  ...props,
1830
1826
  onChange: handleChange
@@ -2247,7 +2243,7 @@ function AutocompleteInner(props, _ref) {
2247
2243
  onClose?.();
2248
2244
  if (!justSelected && !freeSolo && !multiple && value == null) {
2249
2245
  setInputStr("");
2250
- onInputChange?.(null, "");
2246
+ onInputChange?.(null, "", "reset");
2251
2247
  }
2252
2248
  }, [openProp, freeSolo, multiple, value, onInputChange, onClose]);
2253
2249
  useEffect5(() => {
@@ -2292,13 +2288,13 @@ function AutocompleteInner(props, _ref) {
2292
2288
  onChange?.(event, next, already ? "removeOption" : "selectOption");
2293
2289
  setInputStr("");
2294
2290
  setFilterQuery("");
2295
- onInputChange?.(event, "");
2291
+ onInputChange?.(event, "", "reset");
2296
2292
  inputRef.current?.focus();
2297
2293
  } else {
2298
2294
  onChange?.(event, opt, "selectOption");
2299
2295
  setInputStr(getOptionLabel(opt));
2300
2296
  setFilterQuery("");
2301
- onInputChange?.(event, getOptionLabel(opt));
2297
+ onInputChange?.(event, getOptionLabel(opt), "reset");
2302
2298
  closePopup(true);
2303
2299
  }
2304
2300
  setFocusedIdx(-1);
@@ -2308,7 +2304,7 @@ function AutocompleteInner(props, _ref) {
2308
2304
  onChange?.(e, multiple ? [] : null, "clear");
2309
2305
  setInputStr("");
2310
2306
  setFilterQuery("");
2311
- onInputChange?.(e, "");
2307
+ onInputChange?.(e, "", "clear");
2312
2308
  inputRef.current?.focus();
2313
2309
  };
2314
2310
  const removeTag = (opt, e) => {
@@ -2320,7 +2316,7 @@ function AutocompleteInner(props, _ref) {
2320
2316
  const v = e.target.value;
2321
2317
  setInputStr(v);
2322
2318
  setFilterQuery(v);
2323
- onInputChange?.(e, v);
2319
+ onInputChange?.(e, v, "input");
2324
2320
  if (!open) openPopup();
2325
2321
  };
2326
2322
  const handleKeyDown = (e) => {
@@ -2407,7 +2403,7 @@ function AutocompleteInner(props, _ref) {
2407
2403
  multiple && (renderTags ? renderTags(selectedValues, ({ index }) => ({
2408
2404
  key: index,
2409
2405
  onDelete: (e) => removeTag(selectedValues[index], e)
2410
- })) : /* @__PURE__ */ React70.createElement(React70.Fragment, null, visibleTags.map((opt, i) => /* @__PURE__ */ React70.createElement("span", { key: i, className: "rf-autocomplete__tag" }, /* @__PURE__ */ React70.createElement("span", { style: { overflow: "hidden", textOverflow: "ellipsis" } }, getOptionLabel(opt)), /* @__PURE__ */ React70.createElement(
2406
+ })) : /* @__PURE__ */ React70.createElement(React70.Fragment, null, visibleTags.map((opt, i) => /* @__PURE__ */ React70.createElement("span", { key: i, className: "rf-autocomplete__tag" }, /* @__PURE__ */ React70.createElement("span", { style: { overflow: "hidden", textOverflow: "ellipsis" } }, getOptionLabel(opt)), !disabled && /* @__PURE__ */ React70.createElement(
2411
2407
  "button",
2412
2408
  {
2413
2409
  type: "button",
@@ -2460,7 +2456,7 @@ function AutocompleteInner(props, _ref) {
2460
2456
  "aria-label": "Clear"
2461
2457
  },
2462
2458
  /* @__PURE__ */ React70.createElement(CloseSmIcon, { size: 16 })
2463
- ), !freeSolo && /* @__PURE__ */ React70.createElement(
2459
+ ), !freeSolo && !disabled && /* @__PURE__ */ React70.createElement(
2464
2460
  "button",
2465
2461
  {
2466
2462
  type: "button",
@@ -3640,16 +3636,15 @@ var DateField = ({
3640
3636
  }
3641
3637
  }
3642
3638
  ),
3643
- /* @__PURE__ */ React72.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ React72.createElement(
3639
+ !disabled && /* @__PURE__ */ React72.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ React72.createElement(
3644
3640
  "button",
3645
3641
  {
3646
3642
  type: "button",
3647
3643
  className: "rf-date-field__icon-btn",
3648
3644
  tabIndex: -1,
3649
- disabled,
3650
3645
  onClick: (e) => {
3651
3646
  e.stopPropagation();
3652
- if (!disabled) setOpen((o) => !o);
3647
+ setOpen((o) => !o);
3653
3648
  },
3654
3649
  "aria-label": "Pick date"
3655
3650
  },
@@ -4253,16 +4248,15 @@ var DateRangeField = ({
4253
4248
  }
4254
4249
  }
4255
4250
  ),
4256
- /* @__PURE__ */ React73.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ React73.createElement(
4251
+ !disabled && /* @__PURE__ */ React73.createElement("div", { className: "rf-text-field__adornment rf-text-field__adornment--end" }, /* @__PURE__ */ React73.createElement(
4257
4252
  "button",
4258
4253
  {
4259
4254
  type: "button",
4260
4255
  className: "rf-date-field__icon-btn",
4261
4256
  tabIndex: -1,
4262
- disabled,
4263
4257
  onClick: (e) => {
4264
4258
  e.stopPropagation();
4265
- if (!disabled) setOpen((o) => !o);
4259
+ setOpen((o) => !o);
4266
4260
  },
4267
4261
  "aria-label": "Pick date range"
4268
4262
  },
@@ -4456,6 +4450,7 @@ var RufousLogoLoader = ({ size = 80, sx, className }) => {
4456
4450
 
4457
4451
  // lib/DataGrid/DataGrid.tsx
4458
4452
  import React75, { useState as useState9, useMemo as useMemo2, useRef as useRef10, useEffect as useEffect9 } from "react";
4453
+ import ReactDOM4 from "react-dom";
4459
4454
  import {
4460
4455
  ChevronUp,
4461
4456
  ChevronDown,
@@ -4468,6 +4463,7 @@ import {
4468
4463
  X as X2,
4469
4464
  Pin,
4470
4465
  EyeOff,
4466
+ Eye,
4471
4467
  Columns,
4472
4468
  ArrowUp,
4473
4469
  ArrowDown,
@@ -4476,6 +4472,57 @@ import {
4476
4472
  ChevronsUpDown,
4477
4473
  Layers
4478
4474
  } from "lucide-react";
4475
+ function OverflowTooltip({ content }) {
4476
+ const ref = useRef10(null);
4477
+ const [pos, setPos] = useState9(null);
4478
+ return /* @__PURE__ */ React75.createElement(React75.Fragment, null, /* @__PURE__ */ React75.createElement(
4479
+ "span",
4480
+ {
4481
+ ref,
4482
+ onMouseEnter: () => {
4483
+ if (ref.current && ref.current.scrollWidth > ref.current.clientWidth) {
4484
+ const r = ref.current.getBoundingClientRect();
4485
+ setPos({ top: r.top, left: r.left + r.width / 2 });
4486
+ }
4487
+ },
4488
+ onMouseLeave: () => setPos(null),
4489
+ style: { display: "block", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
4490
+ },
4491
+ content
4492
+ ), pos && ReactDOM4.createPortal(
4493
+ /* @__PURE__ */ React75.createElement("div", { style: {
4494
+ position: "fixed",
4495
+ top: pos.top - 4,
4496
+ left: pos.left,
4497
+ transform: "translate(-50%, -100%)",
4498
+ background: "rgba(0,0,0,0.75)",
4499
+ color: "#fff",
4500
+ padding: "4px 8px",
4501
+ borderRadius: 4,
4502
+ fontSize: "0.75rem",
4503
+ maxWidth: 320,
4504
+ wordBreak: "break-word",
4505
+ zIndex: 9999,
4506
+ pointerEvents: "none",
4507
+ whiteSpace: "normal"
4508
+ } }, content),
4509
+ document.body
4510
+ ));
4511
+ }
4512
+ function formatCellValue(value, colType) {
4513
+ if (value == null) return "";
4514
+ if (colType === "number") {
4515
+ const num = Number(value);
4516
+ if (!isNaN(num)) {
4517
+ const str = String(num);
4518
+ if (str.includes("e") || str.includes("E")) {
4519
+ return num.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 });
4520
+ }
4521
+ return str;
4522
+ }
4523
+ }
4524
+ return String(value);
4525
+ }
4479
4526
  function getAllGroupIds(rows, fields, getKey, depth = 0, parentId = "") {
4480
4527
  if (!fields.length || !rows.length) return [];
4481
4528
  const [field, ...rest] = fields;
@@ -5151,6 +5198,7 @@ function DataGrid({
5151
5198
  onChange: (e) => {
5152
5199
  setFilterText(e.target.value);
5153
5200
  setCurrentPage(1);
5201
+ if (onPaginationModelChange) onPaginationModelChange({ page: 0, pageSize: activePageSize });
5154
5202
  }
5155
5203
  }
5156
5204
  )), showFilterBtn && /* @__PURE__ */ React75.createElement(Tooltip, { title: "Filters", placement: "top" }, /* @__PURE__ */ React75.createElement(
@@ -5358,7 +5406,7 @@ function DataGrid({
5358
5406
  const formattedValue = col.valueFormatter ? col.valueFormatter({ value, row: item, field }) : value;
5359
5407
  if (col.renderCell) return col.renderCell({ value, row: item, field });
5360
5408
  if (col.render) return col.render(value, item);
5361
- return String(formattedValue ?? "");
5409
+ return /* @__PURE__ */ React75.createElement(OverflowTooltip, { content: formatCellValue(formattedValue, col.type) });
5362
5410
  })()
5363
5411
  );
5364
5412
  }), actions && /* @__PURE__ */ React75.createElement("td", { className: "dg-row-actions-cell" }, (() => {
@@ -5427,7 +5475,7 @@ function DataGrid({
5427
5475
  setActiveMenu(null);
5428
5476
  } }, /* @__PURE__ */ React75.createElement(Layers, { size: 14 }), " Group by");
5429
5477
  })(),
5430
- /* @__PURE__ */ React75.createElement("button", { className: "dg-menu-item", onClick: () => toggleHide(activeMenu) }, /* @__PURE__ */ React75.createElement(EyeOff, { size: 14 }), " Hide column"),
5478
+ activeMenuCol?.hideable !== false && /* @__PURE__ */ React75.createElement("button", { className: "dg-menu-item", onClick: () => toggleHide(activeMenu) }, /* @__PURE__ */ React75.createElement(EyeOff, { size: 14 }), " Hide column"),
5431
5479
  /* @__PURE__ */ React75.createElement("button", { className: "dg-menu-item", onClick: () => {
5432
5480
  setShowManageColumns(true);
5433
5481
  setActiveMenu(null);
@@ -5444,7 +5492,7 @@ function DataGrid({
5444
5492
  )), resolvedColumns.filter((c) => c.header.toLowerCase().includes(colSearch.toLowerCase())).map((col) => {
5445
5493
  const key = String(col.key);
5446
5494
  const isUnhideable = col.hideable === false;
5447
- return /* @__PURE__ */ React75.createElement("div", { key, className: `dg-col-row${isUnhideable ? " disabled" : ""}` }, /* @__PURE__ */ React75.createElement("div", { className: "dg-col-label" }, /* @__PURE__ */ React75.createElement("div", { className: "dg-col-dot", style: { background: col.hidden ? "var(--border-color)" : "var(--primary-color)" } }), col.header), !isUnhideable && /* @__PURE__ */ React75.createElement("button", { className: "dg-icon-btn", onClick: () => toggleHide(key) }, col.hidden ? /* @__PURE__ */ React75.createElement(EyeOff, { size: 14 }) : /* @__PURE__ */ React75.createElement(EyeOff, { size: 14, style: { opacity: 0.4 } })));
5495
+ return /* @__PURE__ */ React75.createElement("div", { key, className: `dg-col-row${isUnhideable ? " disabled" : ""}` }, /* @__PURE__ */ React75.createElement("div", { className: "dg-col-label" }, /* @__PURE__ */ React75.createElement("div", { className: "dg-col-dot", style: { background: col.hidden ? "var(--border-color)" : "var(--primary-color)" } }), col.header), !isUnhideable && /* @__PURE__ */ React75.createElement("button", { className: "dg-icon-btn", onClick: () => toggleHide(key) }, col.hidden ? /* @__PURE__ */ React75.createElement(EyeOff, { size: 14 }) : /* @__PURE__ */ React75.createElement(Eye, { size: 14 })));
5448
5496
  })), /* @__PURE__ */ React75.createElement("div", { className: "dg-modal-footer" }, /* @__PURE__ */ React75.createElement("button", { className: "dg-action-btn", onClick: () => setColumnOverrides((prev) => {
5449
5497
  const next = { ...prev };
5450
5498
  resolvedColumns.forEach((c) => {
@@ -5504,7 +5552,9 @@ function DataGrid({
5504
5552
  value: f.value,
5505
5553
  onChange: (val) => setAdvancedFilters((p) => p.map((fi, i) => i === idx ? { ...fi, value: val } : fi)),
5506
5554
  variant: "compact",
5507
- fullWidth: true
5555
+ fullWidth: true,
5556
+ dateFormat: "DD/MM/YYYY",
5557
+ placeholder: "DD/MM/YYYY"
5508
5558
  }
5509
5559
  )), !hideValue && col?.type === "status" && (() => {
5510
5560
  const opts = col.statusOptions || [...new Set(data.map((item) => String(item[col.field || col.key || ""])))].filter((v) => v && v !== "undefined" && v !== "null").sort();
@@ -5563,7 +5613,7 @@ import React76, {
5563
5613
  useEffect as useEffect10,
5564
5614
  useCallback as useCallback5
5565
5615
  } from "react";
5566
- import ReactDOM4 from "react-dom";
5616
+ import ReactDOM5 from "react-dom";
5567
5617
  var ChevronDownIcon2 = () => /* @__PURE__ */ React76.createElement("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React76.createElement("polyline", { points: "6 9 12 15 18 9" }));
5568
5618
  var CheckIcon2 = () => /* @__PURE__ */ React76.createElement("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React76.createElement("polyline", { points: "20 6 9 17 4 12" }));
5569
5619
  function normaliseOptions(options) {
@@ -5772,10 +5822,10 @@ var Select = React76.forwardRef(function Select2(props, ref) {
5772
5822
  renderDisplay(),
5773
5823
  label && /* @__PURE__ */ React76.createElement("label", { id: inputId, className: "rf-text-field__label" }, label, required && /* @__PURE__ */ React76.createElement("span", { className: "rf-text-field__asterisk" }, " *")),
5774
5824
  variant === "outlined" && /* @__PURE__ */ React76.createElement("fieldset", { className: "rf-text-field__notch" }, label ? /* @__PURE__ */ React76.createElement("legend", { className: "rf-text-field__legend" }, /* @__PURE__ */ React76.createElement("span", null, label, required ? " *" : "")) : /* @__PURE__ */ React76.createElement("legend", { className: "rf-text-field__legend--empty" })),
5775
- /* @__PURE__ */ React76.createElement("div", { className: "rf-select__arrow", "aria-hidden": "true" }, /* @__PURE__ */ React76.createElement(ChevronDownIcon2, null))
5825
+ !disabled && /* @__PURE__ */ React76.createElement("div", { className: "rf-select__arrow", "aria-hidden": "true" }, /* @__PURE__ */ React76.createElement(ChevronDownIcon2, null))
5776
5826
  ),
5777
5827
  helperText && /* @__PURE__ */ React76.createElement("div", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText),
5778
- open && !disabled && ReactDOM4.createPortal(
5828
+ open && !disabled && ReactDOM5.createPortal(
5779
5829
  /* @__PURE__ */ React76.createElement("div", { ref: popupRef, className: "rf-select__popup", role: "presentation", style: popupStyle }, /* @__PURE__ */ React76.createElement("ul", { ref: listRef, className: "rf-select__listbox", role: "listbox", "aria-multiselectable": multiple }, (() => {
5780
5830
  const renderOpt = (opt, selectableIdx) => {
5781
5831
  const selected = isSelected(opt.value);
@@ -7892,7 +7942,7 @@ import React97, {
7892
7942
  useRef as useRef17,
7893
7943
  useState as useState17
7894
7944
  } from "react";
7895
- import ReactDOM5 from "react-dom";
7945
+ import ReactDOM6 from "react-dom";
7896
7946
  var MenuDivider = () => /* @__PURE__ */ React97.createElement("hr", { className: "rf-menu-divider", "aria-hidden": "true" });
7897
7947
  MenuDivider.displayName = "MenuDivider";
7898
7948
  var MenuItem = ({
@@ -8045,7 +8095,7 @@ var Menu = ({
8045
8095
  },
8046
8096
  children
8047
8097
  ));
8048
- return ReactDOM5.createPortal(portal, document.body);
8098
+ return ReactDOM6.createPortal(portal, document.body);
8049
8099
  };
8050
8100
  Menu.displayName = "Menu";
8051
8101
 
@@ -8054,7 +8104,7 @@ import React98, {
8054
8104
  useEffect as useEffect14,
8055
8105
  useState as useState18
8056
8106
  } from "react";
8057
- import ReactDOM6 from "react-dom";
8107
+ import ReactDOM7 from "react-dom";
8058
8108
  var Drawer = ({
8059
8109
  open,
8060
8110
  onClose,
@@ -8154,7 +8204,7 @@ var Drawer = ({
8154
8204
  },
8155
8205
  children
8156
8206
  ));
8157
- return ReactDOM6.createPortal(
8207
+ return ReactDOM7.createPortal(
8158
8208
  /* @__PURE__ */ React98.createElement("div", { className: rootClasses, style }, drawerContent),
8159
8209
  document.body
8160
8210
  );
@@ -8168,7 +8218,7 @@ import React99, {
8168
8218
  useRef as useRef18,
8169
8219
  useState as useState19
8170
8220
  } from "react";
8171
- import ReactDOM7 from "react-dom";
8221
+ import ReactDOM8 from "react-dom";
8172
8222
  var SEVERITY_ICONS = {
8173
8223
  success: "\u2713",
8174
8224
  error: "\u2715",
@@ -8273,7 +8323,7 @@ var Snackbar = ({
8273
8323
  "\u2715"
8274
8324
  )
8275
8325
  ));
8276
- return ReactDOM7.createPortal(snackbarEl, document.body);
8326
+ return ReactDOM8.createPortal(snackbarEl, document.body);
8277
8327
  };
8278
8328
  Snackbar.displayName = "Snackbar";
8279
8329
 
@@ -8332,7 +8382,7 @@ import React101, {
8332
8382
  useRef as useRef19,
8333
8383
  useState as useState20
8334
8384
  } from "react";
8335
- import ReactDOM8 from "react-dom";
8385
+ import ReactDOM9 from "react-dom";
8336
8386
  function computePopperPosition(anchorRect, popperRect, placement, offset2 = [0, 8]) {
8337
8387
  const [skid, dist] = offset2;
8338
8388
  let top = 0;
@@ -8475,7 +8525,7 @@ var Popper = ({
8475
8525
  if (disablePortal) {
8476
8526
  return /* @__PURE__ */ React101.createElement(React101.Fragment, null, popper);
8477
8527
  }
8478
- return ReactDOM8.createPortal(popper, document.body);
8528
+ return ReactDOM9.createPortal(popper, document.body);
8479
8529
  };
8480
8530
  Popper.displayName = "Popper";
8481
8531
 
@@ -8486,7 +8536,7 @@ import React102, {
8486
8536
  useRef as useRef20,
8487
8537
  useState as useState21
8488
8538
  } from "react";
8489
- import ReactDOM9 from "react-dom";
8539
+ import ReactDOM10 from "react-dom";
8490
8540
  function getPoint(rect, v, h) {
8491
8541
  const x = h === "left" ? rect.left : h === "center" ? rect.left + rect.width / 2 : rect.right;
8492
8542
  const y = v === "top" ? rect.top : v === "center" ? rect.top + rect.height / 2 : rect.bottom;
@@ -8589,7 +8639,7 @@ var Popover = ({
8589
8639
  if (disablePortal) {
8590
8640
  return /* @__PURE__ */ React102.createElement("div", { className: `${rootClasses} rf-popover-inline`, style }, content);
8591
8641
  }
8592
- return ReactDOM9.createPortal(
8642
+ return ReactDOM10.createPortal(
8593
8643
  /* @__PURE__ */ React102.createElement("div", { className: rootClasses, style }, content),
8594
8644
  document.body
8595
8645
  );
@@ -9256,7 +9306,7 @@ import React106, {
9256
9306
  useEffect as useEffect20,
9257
9307
  useCallback as useCallback10
9258
9308
  } from "react";
9259
- import ReactDOM10 from "react-dom";
9309
+ import ReactDOM11 from "react-dom";
9260
9310
  import { ChevronDown as ChevronDown2, ChevronRight as ChevronRight2, X as X3, Search as Search2, Check, Minus } from "lucide-react";
9261
9311
  function nodeId(node) {
9262
9312
  return node.id ?? node._id;
@@ -9566,11 +9616,13 @@ function TreeSelect({
9566
9616
  error ? "rf-text-field--error" : "",
9567
9617
  fullWidth ? "rf-text-field--full-width" : "",
9568
9618
  isFloating ? "rf-text-field--floating" : "",
9619
+ label ? "rf-text-field--has-label" : "",
9620
+ "rf-text-field--adorned-end",
9569
9621
  "rf-tree-select",
9570
9622
  sxClass,
9571
9623
  className
9572
9624
  ].filter(Boolean).join(" ");
9573
- return /* @__PURE__ */ React106.createElement("div", { className: rootClasses, style }, label && /* @__PURE__ */ React106.createElement("label", { className: "rf-text-field__label" }, label, " ", required && /* @__PURE__ */ React106.createElement("span", { className: "rf-text-field__asterisk" }, "*")), /* @__PURE__ */ React106.createElement(
9625
+ return /* @__PURE__ */ React106.createElement("div", { className: rootClasses, style }, /* @__PURE__ */ React106.createElement(
9574
9626
  "div",
9575
9627
  {
9576
9628
  ref: triggerRef,
@@ -9582,7 +9634,7 @@ function TreeSelect({
9582
9634
  onBlur: handleTriggerBlur,
9583
9635
  onKeyDown: handleKeyDown
9584
9636
  },
9585
- isMultiple ? /* @__PURE__ */ React106.createElement("div", { className: "rf-ts__chips" }, tagNodes.length > 0 ? tagNodes.map((node) => /* @__PURE__ */ React106.createElement("span", { key: node.id, className: "rf-ts__chip" }, node.label, /* @__PURE__ */ React106.createElement(
9637
+ isMultiple ? /* @__PURE__ */ React106.createElement("div", { className: "rf-ts__chips" }, tagNodes.length > 0 ? tagNodes.map((node) => /* @__PURE__ */ React106.createElement("span", { key: node.id, className: "rf-ts__chip" }, node.label, !disabled && /* @__PURE__ */ React106.createElement(
9586
9638
  "button",
9587
9639
  {
9588
9640
  type: "button",
@@ -9591,8 +9643,8 @@ function TreeSelect({
9591
9643
  tabIndex: -1
9592
9644
  },
9593
9645
  /* @__PURE__ */ React106.createElement(X3, { size: 10 })
9594
- ))) : open ? /* @__PURE__ */ React106.createElement("span", { className: "rf-ts__placeholder" }, placeholder) : null) : /* @__PURE__ */ React106.createElement("div", { className: `rf-ts__display${!hasValue ? " rf-ts__display--placeholder" : ""}` }, hasValue ? tagNodes[0]?.label : open ? placeholder : "\xA0"),
9595
- /* @__PURE__ */ React106.createElement("div", { className: "rf-autocomplete__endgroup" }, clearable && hasValue && /* @__PURE__ */ React106.createElement(
9646
+ ))) : isFloating || !label ? /* @__PURE__ */ React106.createElement("span", { className: "rf-ts__placeholder" }, placeholder) : null) : /* @__PURE__ */ React106.createElement("div", { className: `rf-ts__display${!hasValue ? " rf-ts__display--placeholder" : ""}` }, hasValue ? tagNodes[0]?.label : isFloating || !label ? placeholder : "\xA0"),
9647
+ /* @__PURE__ */ React106.createElement("div", { className: "rf-autocomplete__endgroup" }, !disabled && clearable && hasValue && /* @__PURE__ */ React106.createElement(
9596
9648
  "button",
9597
9649
  {
9598
9650
  type: "button",
@@ -9601,7 +9653,7 @@ function TreeSelect({
9601
9653
  tabIndex: -1
9602
9654
  },
9603
9655
  /* @__PURE__ */ React106.createElement(X3, { size: 16 })
9604
- ), /* @__PURE__ */ React106.createElement(
9656
+ ), !disabled && /* @__PURE__ */ React106.createElement(
9605
9657
  "button",
9606
9658
  {
9607
9659
  type: "button",
@@ -9614,10 +9666,11 @@ function TreeSelect({
9614
9666
  },
9615
9667
  /* @__PURE__ */ React106.createElement(ChevronDown2, { size: 18 })
9616
9668
  )),
9669
+ label && /* @__PURE__ */ React106.createElement("label", { className: "rf-text-field__label" }, label, required && /* @__PURE__ */ React106.createElement("span", { className: "rf-text-field__asterisk" }, " *")),
9617
9670
  variant === "outlined" && /* @__PURE__ */ React106.createElement("fieldset", { "aria-hidden": true, className: "rf-text-field__notch" }, /* @__PURE__ */ React106.createElement("legend", { className: "rf-text-field__legend" }, label && /* @__PURE__ */ React106.createElement("span", null, label, required ? " *" : ""))),
9618
9671
  variant === "filled" && /* @__PURE__ */ React106.createElement(React106.Fragment, null, /* @__PURE__ */ React106.createElement("div", { className: "rf-text-field__filled-bg" }), /* @__PURE__ */ React106.createElement("div", { className: "rf-text-field__underline" })),
9619
9672
  variant === "standard" && /* @__PURE__ */ React106.createElement("div", { className: "rf-text-field__underline" })
9620
- ), helperText && /* @__PURE__ */ React106.createElement("p", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && ReactDOM10.createPortal(
9673
+ ), helperText && /* @__PURE__ */ React106.createElement("p", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && ReactDOM11.createPortal(
9621
9674
  /* @__PURE__ */ React106.createElement(
9622
9675
  "div",
9623
9676
  {
@@ -9867,11 +9920,11 @@ function SmartSelect({
9867
9920
  setInputValue(inputValue2);
9868
9921
  if (!onSearchChange) return;
9869
9922
  if (debounceTimer.current) clearTimeout(debounceTimer.current);
9870
- if (reason === "reset") return;
9871
- if (!inputValue2) {
9872
- onSearchChange("", 0);
9923
+ if (reason !== "input") {
9924
+ if (reason === "clear") onSearchChange("", 0);
9873
9925
  return;
9874
9926
  }
9927
+ if (!inputValue2) return;
9875
9928
  const q = inputValue2.toLowerCase();
9876
9929
  let localCount = 0;
9877
9930
  for (const opt of flatOptionsList) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.3.26",
4
+ "version": "0.3.27",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",