@rufous/ui 0.2.77 → 0.2.79

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
@@ -1528,6 +1528,7 @@ var React65 = __toESM(require("react"), 1);
1528
1528
  var import_react14 = require("react");
1529
1529
  var import_react_dom = __toESM(require("react-dom"), 1);
1530
1530
  var import_lucide_react = require("lucide-react");
1531
+ var DialogDepthContext = React65.createContext(0);
1531
1532
  var BaseDialog = ({
1532
1533
  open = false,
1533
1534
  onConfirm,
@@ -1561,6 +1562,21 @@ var BaseDialog = ({
1561
1562
  const { themeConfig } = useRufousTheme();
1562
1563
  const [isSubmitting, setIsSubmitting] = (0, import_react14.useState)(false);
1563
1564
  const sxClass = useSx(sx);
1565
+ const depth = (0, import_react14.useContext)(DialogDepthContext);
1566
+ const overlayZ = 2e3 + depth * 200;
1567
+ const portalZ = overlayZ + 100;
1568
+ (0, import_react14.useEffect)(() => {
1569
+ if (!open) return;
1570
+ const el = document.documentElement;
1571
+ const prev = el.style.getPropertyValue("--rf-dialog-portal-z");
1572
+ const prevVal = parseInt(prev || "0");
1573
+ if (portalZ > prevVal) {
1574
+ el.style.setProperty("--rf-dialog-portal-z", String(portalZ));
1575
+ }
1576
+ return () => {
1577
+ el.style.setProperty("--rf-dialog-portal-z", prev || "");
1578
+ };
1579
+ }, [open, portalZ]);
1564
1580
  if (!open && !TransitionComponent) return null;
1565
1581
  const isButtonLoading = isSubmitting || loading;
1566
1582
  const renderButtons = () => /* @__PURE__ */ React65.createElement(React65.Fragment, null, showCancelButton && /* @__PURE__ */ React65.createElement(
@@ -1629,6 +1645,14 @@ var BaseDialog = ({
1629
1645
  },
1630
1646
  dialogInner
1631
1647
  ) : /* @__PURE__ */ React65.createElement("div", { className: containerClass, style: containerStyle }, dialogInner);
1648
+ const overlayNode = (content) => /* @__PURE__ */ React65.createElement(
1649
+ "div",
1650
+ {
1651
+ className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}`,
1652
+ style: { zIndex: overlayZ }
1653
+ },
1654
+ /* @__PURE__ */ React65.createElement(DialogDepthContext.Provider, { value: depth + 1 }, content)
1655
+ );
1632
1656
  if (TransitionComponent) {
1633
1657
  return import_react_dom.default.createPortal(
1634
1658
  /* @__PURE__ */ React65.createElement(
@@ -1641,13 +1665,13 @@ var BaseDialog = ({
1641
1665
  TransitionProps?.onExited?.();
1642
1666
  }
1643
1667
  },
1644
- /* @__PURE__ */ React65.createElement("div", { className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}` }, dialogContent)
1668
+ overlayNode(dialogContent)
1645
1669
  ),
1646
1670
  document.body
1647
1671
  );
1648
1672
  }
1649
1673
  return import_react_dom.default.createPortal(
1650
- /* @__PURE__ */ React65.createElement("div", { className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}` }, dialogContent),
1674
+ overlayNode(dialogContent),
1651
1675
  document.body
1652
1676
  );
1653
1677
  };
@@ -1903,12 +1927,6 @@ var AddressLookup = ({
1903
1927
  const [suggestions, setSuggestions] = (0, import_react18.useState)([]);
1904
1928
  const [loading, setLoading] = (0, import_react18.useState)(false);
1905
1929
  const [showSuggestions, setShowSuggestions] = (0, import_react18.useState)(false);
1906
- const [googleFields, setGoogleFields] = (0, import_react18.useState)({
1907
- country: false,
1908
- state: false,
1909
- city: false,
1910
- pincode: false
1911
- });
1912
1930
  const debounceTimeout = (0, import_react18.useRef)(null);
1913
1931
  const containerRef = (0, import_react18.useRef)(null);
1914
1932
  const apiKey = token || "";
@@ -1924,16 +1942,6 @@ var AddressLookup = ({
1924
1942
  document.addEventListener("mousedown", handleClickOutside);
1925
1943
  return () => document.removeEventListener("mousedown", handleClickOutside);
1926
1944
  }, []);
1927
- (0, import_react18.useEffect)(() => {
1928
- if (value.country || value.state || value.city || value.pincode) {
1929
- setGoogleFields({
1930
- country: !!value.country,
1931
- state: !!value.state,
1932
- city: !!value.city,
1933
- pincode: !!value.pincode
1934
- });
1935
- }
1936
- }, []);
1937
1945
  (0, import_react18.useEffect)(() => {
1938
1946
  if (value.country) {
1939
1947
  const country = countries.find((c) => c.name === value.country);
@@ -1994,12 +2002,6 @@ var AddressLookup = ({
1994
2002
  const state = findComp("administrative_area_level_1");
1995
2003
  const country = findComp("country");
1996
2004
  const pincode = findComp("postal_code");
1997
- setGoogleFields({
1998
- country: !!country,
1999
- state: !!state,
2000
- city: !!city,
2001
- pincode: !!pincode
2002
- });
2003
2005
  const updatedData = {
2004
2006
  ...value,
2005
2007
  addressLine1: mainText || value.addressLine1,
@@ -2050,7 +2052,6 @@ var AddressLookup = ({
2050
2052
  state: "",
2051
2053
  city: ""
2052
2054
  });
2053
- setGoogleFields({ ...googleFields, country: false, state: false, city: false });
2054
2055
  };
2055
2056
  const handleStateChange = (newState) => {
2056
2057
  onChange({
@@ -2082,7 +2083,6 @@ var AddressLookup = ({
2082
2083
  });
2083
2084
  setSuggestions([]);
2084
2085
  setShowSuggestions(false);
2085
- setGoogleFields({ country: false, state: false, city: false, pincode: false });
2086
2086
  } else {
2087
2087
  if (debounceTimeout.current) clearTimeout(debounceTimeout.current);
2088
2088
  debounceTimeout.current = setTimeout(() => {
@@ -2131,8 +2131,6 @@ var AddressLookup = ({
2131
2131
  fullWidth: true,
2132
2132
  value: value.country || "",
2133
2133
  required,
2134
- className: googleFields.country && value.country ? "field-disabled" : "",
2135
- readOnly: googleFields.country && !!value.country,
2136
2134
  onChange: (e) => handleCountryChange(e.target.value),
2137
2135
  list: "countries-list"
2138
2136
  }
@@ -2144,9 +2142,6 @@ var AddressLookup = ({
2144
2142
  fullWidth: true,
2145
2143
  value: value.state || "",
2146
2144
  required,
2147
- disabled: !value.country,
2148
- className: googleFields.state && value.state ? "field-disabled" : "",
2149
- readOnly: googleFields.state && !!value.state,
2150
2145
  onChange: (e) => handleStateChange(e.target.value),
2151
2146
  list: "states-list"
2152
2147
  }
@@ -2158,9 +2153,6 @@ var AddressLookup = ({
2158
2153
  fullWidth: true,
2159
2154
  value: value.city || "",
2160
2155
  required,
2161
- disabled: !value.state,
2162
- className: googleFields.city && value.city ? "field-disabled" : "",
2163
- readOnly: googleFields.city && !!value.city,
2164
2156
  onChange: (e) => handleChange("city", e.target.value),
2165
2157
  list: "cities-list"
2166
2158
  }
@@ -2172,8 +2164,6 @@ var AddressLookup = ({
2172
2164
  fullWidth: true,
2173
2165
  value: value.pincode || "",
2174
2166
  required,
2175
- className: googleFields.pincode && value.pincode ? "field-disabled" : "",
2176
- readOnly: googleFields.pincode && !!value.pincode,
2177
2167
  onChange: (e) => handleChange("pincode", e.target.value)
2178
2168
  }
2179
2169
  ), error.pincode && /* @__PURE__ */ import_react18.default.createElement("div", { className: "field-error-text" }, error.pincode))));
package/dist/main.css CHANGED
@@ -83,7 +83,7 @@
83
83
  .p-treeselect-panel,
84
84
  .MuiModal-root:not(.dialog-overlay),
85
85
  .rf-table-toolbar {
86
- z-index: 2100 !important;
86
+ z-index: var(--rf-dialog-portal-z, 2100) !important;
87
87
  }
88
88
  .dialog-container {
89
89
  background: var(--surface-color);
@@ -1069,7 +1069,6 @@ pre {
1069
1069
  .autocomplete-option {
1070
1070
  padding: 10px 14px;
1071
1071
  cursor: pointer;
1072
- border-bottom: 1px solid var(--border-color, #f0f0f0);
1073
1072
  }
1074
1073
  .autocomplete-option:last-child {
1075
1074
  border-bottom: none;
@@ -1079,11 +1078,11 @@ pre {
1079
1078
  }
1080
1079
  .autocomplete-main-text {
1081
1080
  font-weight: 600;
1082
- font-size: 0.95em;
1081
+ font-size: 0.8em;
1083
1082
  color: var(--text-color, #333);
1084
1083
  }
1085
1084
  .autocomplete-secondary-text {
1086
- font-size: 0.85em;
1085
+ font-size: 0.75em;
1087
1086
  color: var(--text-secondary, #666);
1088
1087
  }
1089
1088
  .loading-indicator {
@@ -1094,10 +1093,6 @@ pre {
1094
1093
  display: flex;
1095
1094
  align-items: center;
1096
1095
  }
1097
- .field-disabled {
1098
- background-color: var(--hover-color, #f0f0f0);
1099
- cursor: not-allowed;
1100
- }
1101
1096
  .field-error-text {
1102
1097
  color: #dc2626;
1103
1098
  font-size: 0.75rem;
package/dist/main.js CHANGED
@@ -1353,9 +1353,10 @@ IconButton.displayName = "IconButton";
1353
1353
 
1354
1354
  // lib/Dialogs/BaseDialog.tsx
1355
1355
  import * as React65 from "react";
1356
- import { useState as useState2 } from "react";
1356
+ import { useState as useState2, useContext, useEffect as useEffect2 } from "react";
1357
1357
  import ReactDOM from "react-dom";
1358
1358
  import { X } from "lucide-react";
1359
+ var DialogDepthContext = React65.createContext(0);
1359
1360
  var BaseDialog = ({
1360
1361
  open = false,
1361
1362
  onConfirm,
@@ -1389,6 +1390,21 @@ var BaseDialog = ({
1389
1390
  const { themeConfig } = useRufousTheme();
1390
1391
  const [isSubmitting, setIsSubmitting] = useState2(false);
1391
1392
  const sxClass = useSx(sx);
1393
+ const depth = useContext(DialogDepthContext);
1394
+ const overlayZ = 2e3 + depth * 200;
1395
+ const portalZ = overlayZ + 100;
1396
+ useEffect2(() => {
1397
+ if (!open) return;
1398
+ const el = document.documentElement;
1399
+ const prev = el.style.getPropertyValue("--rf-dialog-portal-z");
1400
+ const prevVal = parseInt(prev || "0");
1401
+ if (portalZ > prevVal) {
1402
+ el.style.setProperty("--rf-dialog-portal-z", String(portalZ));
1403
+ }
1404
+ return () => {
1405
+ el.style.setProperty("--rf-dialog-portal-z", prev || "");
1406
+ };
1407
+ }, [open, portalZ]);
1392
1408
  if (!open && !TransitionComponent) return null;
1393
1409
  const isButtonLoading = isSubmitting || loading;
1394
1410
  const renderButtons = () => /* @__PURE__ */ React65.createElement(React65.Fragment, null, showCancelButton && /* @__PURE__ */ React65.createElement(
@@ -1457,6 +1473,14 @@ var BaseDialog = ({
1457
1473
  },
1458
1474
  dialogInner
1459
1475
  ) : /* @__PURE__ */ React65.createElement("div", { className: containerClass, style: containerStyle }, dialogInner);
1476
+ const overlayNode = (content) => /* @__PURE__ */ React65.createElement(
1477
+ "div",
1478
+ {
1479
+ className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}`,
1480
+ style: { zIndex: overlayZ }
1481
+ },
1482
+ /* @__PURE__ */ React65.createElement(DialogDepthContext.Provider, { value: depth + 1 }, content)
1483
+ );
1460
1484
  if (TransitionComponent) {
1461
1485
  return ReactDOM.createPortal(
1462
1486
  /* @__PURE__ */ React65.createElement(
@@ -1469,13 +1493,13 @@ var BaseDialog = ({
1469
1493
  TransitionProps?.onExited?.();
1470
1494
  }
1471
1495
  },
1472
- /* @__PURE__ */ React65.createElement("div", { className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}` }, dialogContent)
1496
+ overlayNode(dialogContent)
1473
1497
  ),
1474
1498
  document.body
1475
1499
  );
1476
1500
  }
1477
1501
  return ReactDOM.createPortal(
1478
- /* @__PURE__ */ React65.createElement("div", { className: `dialog-overlay ${size === "fullScreen" ? "overlay-fullscreen" : ""}` }, dialogContent),
1502
+ overlayNode(dialogContent),
1479
1503
  document.body
1480
1504
  );
1481
1505
  };
@@ -1483,13 +1507,13 @@ var BaseDialog_default = BaseDialog;
1483
1507
 
1484
1508
  // lib/Contexts/rufousThemeProvider.tsx
1485
1509
  import React66, {
1486
- createContext,
1487
- useContext,
1488
- useEffect as useEffect2,
1510
+ createContext as createContext2,
1511
+ useContext as useContext2,
1512
+ useEffect as useEffect3,
1489
1513
  useMemo,
1490
1514
  useState as useState3
1491
1515
  } from "react";
1492
- var RufousThemeContext = createContext(null);
1516
+ var RufousThemeContext = createContext2(null);
1493
1517
  var RufousThemeProvider = ({ children }) => {
1494
1518
  const [committedThemeKey, setCommittedThemeKey] = useState3("default");
1495
1519
  const [previewThemeKey, setPreviewThemeKey] = useState3("default");
@@ -1503,7 +1527,7 @@ var RufousThemeProvider = ({ children }) => {
1503
1527
  console.error("Error fetching general settings:", err);
1504
1528
  }
1505
1529
  };
1506
- useEffect2(() => {
1530
+ useEffect3(() => {
1507
1531
  getGeneralSettings();
1508
1532
  }, []);
1509
1533
  const fullTheme = useMemo(() => {
@@ -1542,7 +1566,7 @@ var RufousThemeProvider = ({ children }) => {
1542
1566
  )
1543
1567
  );
1544
1568
  };
1545
- var useRufousTheme = () => useContext(RufousThemeContext);
1569
+ var useRufousTheme = () => useContext2(RufousThemeContext);
1546
1570
 
1547
1571
  // lib/CheckBoxes/CheckBox.jsx
1548
1572
  import React67 from "react";
@@ -1718,7 +1742,7 @@ var TextField = forwardRef3(({
1718
1742
  TextField.displayName = "TextField";
1719
1743
 
1720
1744
  // lib/TextFields/AddressLookup.tsx
1721
- import React69, { useState as useState4, useRef as useRef3, useEffect as useEffect3 } from "react";
1745
+ import React69, { useState as useState4, useRef as useRef3, useEffect as useEffect4 } from "react";
1722
1746
  import Axios from "axios";
1723
1747
  import { Country, State, City } from "country-state-city";
1724
1748
  var AddressLookup = ({
@@ -1737,19 +1761,13 @@ var AddressLookup = ({
1737
1761
  const [suggestions, setSuggestions] = useState4([]);
1738
1762
  const [loading, setLoading] = useState4(false);
1739
1763
  const [showSuggestions, setShowSuggestions] = useState4(false);
1740
- const [googleFields, setGoogleFields] = useState4({
1741
- country: false,
1742
- state: false,
1743
- city: false,
1744
- pincode: false
1745
- });
1746
1764
  const debounceTimeout = useRef3(null);
1747
1765
  const containerRef = useRef3(null);
1748
1766
  const apiKey = token || "";
1749
1767
  const countries = Country.getAllCountries();
1750
1768
  const [states, setStates] = useState4([]);
1751
1769
  const [cities, setCities] = useState4([]);
1752
- useEffect3(() => {
1770
+ useEffect4(() => {
1753
1771
  const handleClickOutside = (event) => {
1754
1772
  if (containerRef.current && !containerRef.current.contains(event.target)) {
1755
1773
  setShowSuggestions(false);
@@ -1758,17 +1776,7 @@ var AddressLookup = ({
1758
1776
  document.addEventListener("mousedown", handleClickOutside);
1759
1777
  return () => document.removeEventListener("mousedown", handleClickOutside);
1760
1778
  }, []);
1761
- useEffect3(() => {
1762
- if (value.country || value.state || value.city || value.pincode) {
1763
- setGoogleFields({
1764
- country: !!value.country,
1765
- state: !!value.state,
1766
- city: !!value.city,
1767
- pincode: !!value.pincode
1768
- });
1769
- }
1770
- }, []);
1771
- useEffect3(() => {
1779
+ useEffect4(() => {
1772
1780
  if (value.country) {
1773
1781
  const country = countries.find((c) => c.name === value.country);
1774
1782
  if (country) {
@@ -1781,7 +1789,7 @@ var AddressLookup = ({
1781
1789
  setStates([]);
1782
1790
  }
1783
1791
  }, [value.country]);
1784
- useEffect3(() => {
1792
+ useEffect4(() => {
1785
1793
  if (value.state && value.country) {
1786
1794
  const country = countries.find((c) => c.name === value.country);
1787
1795
  if (country) {
@@ -1828,12 +1836,6 @@ var AddressLookup = ({
1828
1836
  const state = findComp("administrative_area_level_1");
1829
1837
  const country = findComp("country");
1830
1838
  const pincode = findComp("postal_code");
1831
- setGoogleFields({
1832
- country: !!country,
1833
- state: !!state,
1834
- city: !!city,
1835
- pincode: !!pincode
1836
- });
1837
1839
  const updatedData = {
1838
1840
  ...value,
1839
1841
  addressLine1: mainText || value.addressLine1,
@@ -1884,7 +1886,6 @@ var AddressLookup = ({
1884
1886
  state: "",
1885
1887
  city: ""
1886
1888
  });
1887
- setGoogleFields({ ...googleFields, country: false, state: false, city: false });
1888
1889
  };
1889
1890
  const handleStateChange = (newState) => {
1890
1891
  onChange({
@@ -1916,7 +1917,6 @@ var AddressLookup = ({
1916
1917
  });
1917
1918
  setSuggestions([]);
1918
1919
  setShowSuggestions(false);
1919
- setGoogleFields({ country: false, state: false, city: false, pincode: false });
1920
1920
  } else {
1921
1921
  if (debounceTimeout.current) clearTimeout(debounceTimeout.current);
1922
1922
  debounceTimeout.current = setTimeout(() => {
@@ -1965,8 +1965,6 @@ var AddressLookup = ({
1965
1965
  fullWidth: true,
1966
1966
  value: value.country || "",
1967
1967
  required,
1968
- className: googleFields.country && value.country ? "field-disabled" : "",
1969
- readOnly: googleFields.country && !!value.country,
1970
1968
  onChange: (e) => handleCountryChange(e.target.value),
1971
1969
  list: "countries-list"
1972
1970
  }
@@ -1978,9 +1976,6 @@ var AddressLookup = ({
1978
1976
  fullWidth: true,
1979
1977
  value: value.state || "",
1980
1978
  required,
1981
- disabled: !value.country,
1982
- className: googleFields.state && value.state ? "field-disabled" : "",
1983
- readOnly: googleFields.state && !!value.state,
1984
1979
  onChange: (e) => handleStateChange(e.target.value),
1985
1980
  list: "states-list"
1986
1981
  }
@@ -1992,9 +1987,6 @@ var AddressLookup = ({
1992
1987
  fullWidth: true,
1993
1988
  value: value.city || "",
1994
1989
  required,
1995
- disabled: !value.state,
1996
- className: googleFields.city && value.city ? "field-disabled" : "",
1997
- readOnly: googleFields.city && !!value.city,
1998
1990
  onChange: (e) => handleChange("city", e.target.value),
1999
1991
  list: "cities-list"
2000
1992
  }
@@ -2006,8 +1998,6 @@ var AddressLookup = ({
2006
1998
  fullWidth: true,
2007
1999
  value: value.pincode || "",
2008
2000
  required,
2009
- className: googleFields.pincode && value.pincode ? "field-disabled" : "",
2010
- readOnly: googleFields.pincode && !!value.pincode,
2011
2001
  onChange: (e) => handleChange("pincode", e.target.value)
2012
2002
  }
2013
2003
  ), error.pincode && /* @__PURE__ */ React69.createElement("div", { className: "field-error-text" }, error.pincode))));
@@ -2018,7 +2008,7 @@ var AddressLookup_default = AddressLookup;
2018
2008
  import React70, {
2019
2009
  useState as useState5,
2020
2010
  useRef as useRef4,
2021
- useEffect as useEffect4,
2011
+ useEffect as useEffect5,
2022
2012
  useCallback
2023
2013
  } from "react";
2024
2014
  import { createPortal } from "react-dom";
@@ -2179,13 +2169,13 @@ var ScrollColumn = ({ items, selected, onSelect, infinite = true }) => {
2179
2169
  const virtualItems = infinite ? Array(MULTIPLIER).fill(items).flat() : items;
2180
2170
  const centerOffset = infinite ? Math.floor(MULTIPLIER / 2) * items.length : 0;
2181
2171
  const VISUAL_OFFSET = 54;
2182
- useEffect4(() => {
2172
+ useEffect5(() => {
2183
2173
  if (listRef.current) {
2184
2174
  const targetIndex = centerOffset + selected;
2185
2175
  listRef.current.scrollTop = targetIndex * ITEM_H - (infinite ? VISUAL_OFFSET : 0);
2186
2176
  }
2187
2177
  }, [centerOffset, infinite, selected]);
2188
- useEffect4(() => {
2178
+ useEffect5(() => {
2189
2179
  if (listRef.current && !isInternalScroll.current) {
2190
2180
  const targetIndex = centerOffset + selected;
2191
2181
  listRef.current.scrollTo({
@@ -2437,7 +2427,7 @@ var DateField = ({
2437
2427
  const pickerRef = useRef4(null);
2438
2428
  const [dropUp, setDropUp] = useState5(false);
2439
2429
  const inputId = useRef4(`rf-df-${Math.random().toString(36).substring(2, 11)}`).current;
2440
- useEffect4(() => {
2430
+ useEffect5(() => {
2441
2431
  if (value === void 0) return;
2442
2432
  if (!value) {
2443
2433
  setSelectedDate(null);
@@ -2460,7 +2450,7 @@ var DateField = ({
2460
2450
  setInputStr(str);
2461
2451
  }
2462
2452
  }, [value, type]);
2463
- useEffect4(() => {
2453
+ useEffect5(() => {
2464
2454
  if (!open) return;
2465
2455
  const handler = (e) => {
2466
2456
  const target = e.target;
@@ -2471,7 +2461,7 @@ var DateField = ({
2471
2461
  document.addEventListener("mousedown", handler);
2472
2462
  return () => document.removeEventListener("mousedown", handler);
2473
2463
  }, [open]);
2474
- useEffect4(() => {
2464
+ useEffect5(() => {
2475
2465
  if (!open || !containerRef.current) return;
2476
2466
  const rect = containerRef.current.getBoundingClientRect();
2477
2467
  const spaceBelow = window.innerHeight - rect.bottom;
@@ -2766,7 +2756,7 @@ DateField.displayName = "DateField";
2766
2756
  import React71, {
2767
2757
  useState as useState6,
2768
2758
  useRef as useRef5,
2769
- useEffect as useEffect5
2759
+ useEffect as useEffect6
2770
2760
  } from "react";
2771
2761
  var WEEKDAYS2 = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"];
2772
2762
  var MONTHS2 = [
@@ -3062,7 +3052,7 @@ var DateRangeField = ({
3062
3052
  const [leftViewMonth, setLeftViewMonth] = useState6(() => today2.getMonth());
3063
3053
  const containerRef = useRef5(null);
3064
3054
  const inputId = useRef5(`rf-dr-${Math.random().toString(36).substr(2, 9)}`).current;
3065
- useEffect5(() => {
3055
+ useEffect6(() => {
3066
3056
  const s2 = value?.start ? isoToDate2(value.start) : null;
3067
3057
  const e = value?.end ? isoToDate2(value.end) : null;
3068
3058
  setDraftStart(s2);
@@ -3071,10 +3061,10 @@ var DateRangeField = ({
3071
3061
  setEndInputStr(e ? formatShort(e) : "");
3072
3062
  setActivePreset(detectPreset(s2, e));
3073
3063
  }, [value?.start, value?.end]);
3074
- useEffect5(() => {
3064
+ useEffect6(() => {
3075
3065
  setActivePreset(detectPreset(draftStart, draftEnd));
3076
3066
  }, [draftStart?.getTime(), draftEnd?.getTime()]);
3077
- useEffect5(() => {
3067
+ useEffect6(() => {
3078
3068
  if (!open) return;
3079
3069
  const handler = (e) => {
3080
3070
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -3419,7 +3409,7 @@ DateRangeField.displayName = "DateRangeField";
3419
3409
  import React72, {
3420
3410
  useState as useState7,
3421
3411
  useRef as useRef6,
3422
- useEffect as useEffect6,
3412
+ useEffect as useEffect7,
3423
3413
  useCallback as useCallback2
3424
3414
  } from "react";
3425
3415
  import ReactDOM2 from "react-dom";
@@ -3540,7 +3530,7 @@ function AutocompleteInner(props, _ref) {
3540
3530
  onInputChange?.("");
3541
3531
  }
3542
3532
  }, [freeSolo, multiple, value, onInputChange, onClose]);
3543
- useEffect6(() => {
3533
+ useEffect7(() => {
3544
3534
  if (!open) return;
3545
3535
  const handleOutside = (e) => {
3546
3536
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -3556,7 +3546,7 @@ function AutocompleteInner(props, _ref) {
3556
3546
  window.removeEventListener("resize", calcPopupStyle);
3557
3547
  };
3558
3548
  }, [open, closePopup, calcPopupStyle]);
3559
- useEffect6(() => {
3549
+ useEffect7(() => {
3560
3550
  if (controlledInput !== void 0) return;
3561
3551
  if (!multiple) {
3562
3552
  const v = value;
@@ -3831,7 +3821,7 @@ var RufousLogoLoader = ({ size = 80, sx, className }) => {
3831
3821
  };
3832
3822
 
3833
3823
  // lib/DataGrid/DataGrid.tsx
3834
- import React74, { useState as useState8, useMemo as useMemo2, useRef as useRef8, useEffect as useEffect7 } from "react";
3824
+ import React74, { useState as useState8, useMemo as useMemo2, useRef as useRef8, useEffect as useEffect8 } from "react";
3835
3825
  import {
3836
3826
  ChevronUp,
3837
3827
  ChevronDown,
@@ -3947,7 +3937,7 @@ function DataGrid({
3947
3937
  { column: initialFilterCol, operator: getDefaultOperator(initialColumnsProp[0]?.type), value: "", logic: "AND" }
3948
3938
  ]);
3949
3939
  const [colSearch, setColSearch] = useState8("");
3950
- useEffect7(() => {
3940
+ useEffect8(() => {
3951
3941
  const handleMouseMove = (e) => {
3952
3942
  if (!resizingColumn) return;
3953
3943
  const col = resolvedColumns.find((c) => String(c.field) === resizingColumn);
@@ -3967,7 +3957,7 @@ function DataGrid({
3967
3957
  document.removeEventListener("mouseup", handleMouseUp);
3968
3958
  };
3969
3959
  }, [resizingColumn, startX, startWidth, resolvedColumns]);
3970
- useEffect7(() => {
3960
+ useEffect8(() => {
3971
3961
  const handleClickOutside = (e) => {
3972
3962
  if (menuRef.current && !menuRef.current.contains(e.target)) {
3973
3963
  setActiveMenu(null);
@@ -3976,7 +3966,7 @@ function DataGrid({
3976
3966
  document.addEventListener("mousedown", handleClickOutside);
3977
3967
  return () => document.removeEventListener("mousedown", handleClickOutside);
3978
3968
  }, []);
3979
- useEffect7(() => {
3969
+ useEffect8(() => {
3980
3970
  setColumnWidths((prev) => {
3981
3971
  const next = { ...prev };
3982
3972
  initialColumnsProp.forEach((col) => {
@@ -4490,7 +4480,7 @@ function DataGrid({
4490
4480
  import React75, {
4491
4481
  useState as useState9,
4492
4482
  useRef as useRef9,
4493
- useEffect as useEffect8,
4483
+ useEffect as useEffect9,
4494
4484
  useCallback as useCallback3
4495
4485
  } from "react";
4496
4486
  import ReactDOM3 from "react-dom";
@@ -4557,7 +4547,7 @@ var Select = React75.forwardRef(function Select2(props, ref) {
4557
4547
  if (open) closePopup();
4558
4548
  else openPopup();
4559
4549
  }, [open, openPopup, closePopup]);
4560
- useEffect8(() => {
4550
+ useEffect9(() => {
4561
4551
  if (!open) return;
4562
4552
  const handleOutside = (e) => {
4563
4553
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -4728,7 +4718,7 @@ Select.displayName = "Select";
4728
4718
  import React76, {
4729
4719
  useState as useState10,
4730
4720
  useRef as useRef10,
4731
- useEffect as useEffect9,
4721
+ useEffect as useEffect10,
4732
4722
  useCallback as useCallback4
4733
4723
  } from "react";
4734
4724
  function clamp(val, min, max) {
@@ -4787,7 +4777,7 @@ var Slider = React76.forwardRef(function Slider2(props, ref) {
4787
4777
  const raw = min + ratio * (max - min);
4788
4778
  return clamp(snapToStep(raw, min, step), min, max);
4789
4779
  }, [min, max, step, orientation]);
4790
- useEffect9(() => {
4780
+ useEffect10(() => {
4791
4781
  if (dragging === null) return;
4792
4782
  const onMove = (e) => {
4793
4783
  const newVal = getValueFromPointer(e);
@@ -4997,10 +4987,10 @@ var Switch = React77.forwardRef(function Switch2(props, ref) {
4997
4987
  Switch.displayName = "Switch";
4998
4988
 
4999
4989
  // lib/RadioGroup/RadioGroup.tsx
5000
- import React78, { useRef as useRef12, createContext as createContext2, useContext as useContext2 } from "react";
5001
- var RadioGroupContext = createContext2({});
4990
+ import React78, { useRef as useRef12, createContext as createContext3, useContext as useContext3 } from "react";
4991
+ var RadioGroupContext = createContext3({});
5002
4992
  var Radio = React78.forwardRef(function Radio2(props, ref) {
5003
- const ctx = useContext2(RadioGroupContext);
4993
+ const ctx = useContext3(RadioGroupContext);
5004
4994
  const {
5005
4995
  value,
5006
4996
  label,
@@ -5257,13 +5247,13 @@ Rating.displayName = "Rating";
5257
5247
 
5258
5248
  // lib/ToggleButton/ToggleButton.tsx
5259
5249
  import React80, {
5260
- createContext as createContext3,
5261
- useContext as useContext3
5250
+ createContext as createContext4,
5251
+ useContext as useContext4
5262
5252
  } from "react";
5263
- var ToggleGroupContext = createContext3({});
5253
+ var ToggleGroupContext = createContext4({});
5264
5254
  var ToggleButton = React80.forwardRef(
5265
5255
  function ToggleButton2(props, ref) {
5266
- const ctx = useContext3(ToggleGroupContext);
5256
+ const ctx = useContext4(ToggleGroupContext);
5267
5257
  const { value, children, disabled: disabledProp, selected: selectedProp, sx } = props;
5268
5258
  const sxClass = useSx(sx);
5269
5259
  let isSelected = false;
@@ -5889,7 +5879,7 @@ Skeleton.displayName = "Skeleton";
5889
5879
  // lib/Tooltip/Tooltip.tsx
5890
5880
  import React87, {
5891
5881
  useCallback as useCallback5,
5892
- useEffect as useEffect10,
5882
+ useEffect as useEffect11,
5893
5883
  useRef as useRef14,
5894
5884
  useState as useState13
5895
5885
  } from "react";
@@ -6022,7 +6012,7 @@ var Tooltip = ({
6022
6012
  setPosition(computePosition(anchorRect, tooltipRect, placement));
6023
6013
  }
6024
6014
  }, [placement, followCursor]);
6025
- useEffect10(() => {
6015
+ useEffect11(() => {
6026
6016
  if (isOpen) {
6027
6017
  requestAnimationFrame(() => {
6028
6018
  updatePosition();
@@ -6058,7 +6048,7 @@ var Tooltip = ({
6058
6048
  },
6059
6049
  [isOpen, followCursor, updatePosition]
6060
6050
  );
6061
- useEffect10(() => {
6051
+ useEffect11(() => {
6062
6052
  return () => clearTimers();
6063
6053
  }, [clearTimers]);
6064
6054
  const childProps = {};
@@ -6448,8 +6438,8 @@ CardActions.displayName = "CardActions";
6448
6438
 
6449
6439
  // lib/Accordion/Accordion.tsx
6450
6440
  import * as React93 from "react";
6451
- import { useState as useState14, useContext as useContext4, createContext as createContext4 } from "react";
6452
- var AccordionContext = createContext4({
6441
+ import { useState as useState14, useContext as useContext5, createContext as createContext5 } from "react";
6442
+ var AccordionContext = createContext5({
6453
6443
  expanded: false,
6454
6444
  disabled: false,
6455
6445
  toggle: () => {
@@ -6513,7 +6503,7 @@ var ChevronIcon = () => /* @__PURE__ */ React93.createElement(
6513
6503
  var AccordionSummary = React93.forwardRef(
6514
6504
  ({ expandIcon, children, sx, className, style, ...rest }, ref) => {
6515
6505
  const sxClass = useSx(sx);
6516
- const { expanded, toggle, disabled } = useContext4(AccordionContext);
6506
+ const { expanded, toggle, disabled } = useContext5(AccordionContext);
6517
6507
  const classes = [
6518
6508
  "rf-accordion-summary",
6519
6509
  expanded ? "rf-accordion-summary-expanded" : "",
@@ -6545,7 +6535,7 @@ AccordionSummary.displayName = "AccordionSummary";
6545
6535
  var AccordionDetails = React93.forwardRef(
6546
6536
  ({ children, sx, className, style, ...rest }, ref) => {
6547
6537
  const sxClass = useSx(sx);
6548
- const { expanded } = useContext4(AccordionContext);
6538
+ const { expanded } = useContext5(AccordionContext);
6549
6539
  const wrapperClasses = [
6550
6540
  "rf-accordion-details-wrapper",
6551
6541
  expanded ? "rf-accordion-details-wrapper-open" : ""
@@ -6562,7 +6552,7 @@ AccordionDetails.displayName = "AccordionDetails";
6562
6552
 
6563
6553
  // lib/Tabs/Tabs.tsx
6564
6554
  import React94, {
6565
- useEffect as useEffect11,
6555
+ useEffect as useEffect12,
6566
6556
  useLayoutEffect,
6567
6557
  useRef as useRef15,
6568
6558
  useState as useState15,
@@ -6655,7 +6645,7 @@ var Tabs = ({
6655
6645
  useLayoutEffect(() => {
6656
6646
  updateIndicator();
6657
6647
  }, [value, orientation]);
6658
- useEffect11(() => {
6648
+ useEffect12(() => {
6659
6649
  const observer = new ResizeObserver(() => {
6660
6650
  updateIndicator();
6661
6651
  });
@@ -7014,7 +7004,7 @@ Stepper.displayName = "Stepper";
7014
7004
 
7015
7005
  // lib/Menu/Menu.tsx
7016
7006
  import React97, {
7017
- useEffect as useEffect12,
7007
+ useEffect as useEffect13,
7018
7008
  useRef as useRef16,
7019
7009
  useState as useState17
7020
7010
  } from "react";
@@ -7111,12 +7101,12 @@ var Menu = ({
7111
7101
  const paperRef = useRef16(null);
7112
7102
  const [menuStyle, setMenuStyle] = useState17({});
7113
7103
  const [mounted, setMounted] = useState17(false);
7114
- useEffect12(() => {
7104
+ useEffect13(() => {
7115
7105
  if (open) {
7116
7106
  setMounted(true);
7117
7107
  }
7118
7108
  }, [open]);
7119
- useEffect12(() => {
7109
+ useEffect13(() => {
7120
7110
  if (!open || !anchorEl || !paperRef.current) return;
7121
7111
  const computePosition3 = () => {
7122
7112
  if (!anchorEl || !paperRef.current) return;
@@ -7142,7 +7132,7 @@ var Menu = ({
7142
7132
  };
7143
7133
  requestAnimationFrame(computePosition3);
7144
7134
  }, [open, mounted, anchorEl, anchorOrigin, transformOrigin]);
7145
- useEffect12(() => {
7135
+ useEffect13(() => {
7146
7136
  if (!open) return;
7147
7137
  const handleKeyDown = (e) => {
7148
7138
  if (e.key === "Escape") {
@@ -7177,7 +7167,7 @@ Menu.displayName = "Menu";
7177
7167
 
7178
7168
  // lib/Drawer/Drawer.tsx
7179
7169
  import React98, {
7180
- useEffect as useEffect13,
7170
+ useEffect as useEffect14,
7181
7171
  useState as useState18
7182
7172
  } from "react";
7183
7173
  import ReactDOM6 from "react-dom";
@@ -7197,7 +7187,7 @@ var Drawer = ({
7197
7187
  const sxClass = useSx(sx);
7198
7188
  const paperSxClass = useSx(PaperProps?.sx);
7199
7189
  const [mounted, setMounted] = useState18(open || variant === "permanent" || keepMounted);
7200
- useEffect13(() => {
7190
+ useEffect14(() => {
7201
7191
  if (open || variant === "permanent") {
7202
7192
  setMounted(true);
7203
7193
  } else if (!keepMounted) {
@@ -7205,7 +7195,7 @@ var Drawer = ({
7205
7195
  return () => clearTimeout(t);
7206
7196
  }
7207
7197
  }, [open, variant, keepMounted]);
7208
- useEffect13(() => {
7198
+ useEffect14(() => {
7209
7199
  if (!open || variant === "permanent") return;
7210
7200
  const handleKeyDown = (e) => {
7211
7201
  if (e.key === "Escape") onClose?.();
@@ -7213,7 +7203,7 @@ var Drawer = ({
7213
7203
  document.addEventListener("keydown", handleKeyDown);
7214
7204
  return () => document.removeEventListener("keydown", handleKeyDown);
7215
7205
  }, [open, variant, onClose]);
7216
- useEffect13(() => {
7206
+ useEffect14(() => {
7217
7207
  if (variant !== "temporary") return;
7218
7208
  if (open) {
7219
7209
  const prev = document.body.style.overflow;
@@ -7290,7 +7280,7 @@ Drawer.displayName = "Drawer";
7290
7280
  // lib/Snackbar/Snackbar.tsx
7291
7281
  import React99, {
7292
7282
  useCallback as useCallback6,
7293
- useEffect as useEffect14,
7283
+ useEffect as useEffect15,
7294
7284
  useRef as useRef17,
7295
7285
  useState as useState19
7296
7286
  } from "react";
@@ -7331,7 +7321,7 @@ var Snackbar = ({
7331
7321
  onClose("timeout");
7332
7322
  }, autoHideDuration);
7333
7323
  }, [autoHideDuration, onClose, clearTimers]);
7334
- useEffect14(() => {
7324
+ useEffect15(() => {
7335
7325
  if (open) {
7336
7326
  setMounted(true);
7337
7327
  setTransitionState("entering");
@@ -7347,7 +7337,7 @@ var Snackbar = ({
7347
7337
  }
7348
7338
  return clearTimers;
7349
7339
  }, [open, startHideTimer, clearTimers]);
7350
- useEffect14(() => {
7340
+ useEffect15(() => {
7351
7341
  if (!open) return;
7352
7342
  const handleKeyDown = (e) => {
7353
7343
  if (e.key === "Escape") onClose?.("escapeKeyDown");
@@ -7453,7 +7443,7 @@ Link.displayName = "Link";
7453
7443
 
7454
7444
  // lib/Popper/Popper.tsx
7455
7445
  import React101, {
7456
- useEffect as useEffect15,
7446
+ useEffect as useEffect16,
7457
7447
  useLayoutEffect as useLayoutEffect2,
7458
7448
  useRef as useRef18,
7459
7449
  useState as useState20
@@ -7542,7 +7532,7 @@ var Popper = ({
7542
7532
  const [fadeState, setFadeState] = useState20(
7543
7533
  open ? "entered" : "exited"
7544
7534
  );
7545
- useEffect15(() => {
7535
+ useEffect16(() => {
7546
7536
  if (open) {
7547
7537
  setMounted(true);
7548
7538
  setFadeState("entering");
@@ -7607,7 +7597,7 @@ Popper.displayName = "Popper";
7607
7597
 
7608
7598
  // lib/Popover/Popover.tsx
7609
7599
  import React102, {
7610
- useEffect as useEffect16,
7600
+ useEffect as useEffect17,
7611
7601
  useLayoutEffect as useLayoutEffect3,
7612
7602
  useRef as useRef19,
7613
7603
  useState as useState21
@@ -7642,7 +7632,7 @@ var Popover = ({
7642
7632
  const paperRef = useRef19(null);
7643
7633
  const [posStyle, setPosStyle] = useState21({});
7644
7634
  const [mounted, setMounted] = useState21(open || keepMounted);
7645
- useEffect16(() => {
7635
+ useEffect17(() => {
7646
7636
  if (open) {
7647
7637
  setMounted(true);
7648
7638
  } else if (!keepMounted) {
@@ -7674,7 +7664,7 @@ var Popover = ({
7674
7664
  window.removeEventListener("resize", compute);
7675
7665
  };
7676
7666
  }, [open, anchorEl, anchorOrigin, transformOrigin, mounted]);
7677
- useEffect16(() => {
7667
+ useEffect17(() => {
7678
7668
  if (!open) return;
7679
7669
  const handleKeyDown = (e) => {
7680
7670
  if (e.key === "Escape") onClose?.();
@@ -7725,7 +7715,7 @@ Popover.displayName = "Popover";
7725
7715
  // lib/Transitions/Transitions.tsx
7726
7716
  import React103, {
7727
7717
  cloneElement as cloneElement3,
7728
- useEffect as useEffect17,
7718
+ useEffect as useEffect18,
7729
7719
  useRef as useRef20,
7730
7720
  useState as useState22
7731
7721
  } from "react";
@@ -7739,7 +7729,7 @@ function useTransitionState(inProp, timeout, onEnter, onExited) {
7739
7729
  const [mounted, setMounted] = useState22(false);
7740
7730
  const timerRef = useRef20(null);
7741
7731
  const isFirstRender = useRef20(true);
7742
- useEffect17(() => {
7732
+ useEffect18(() => {
7743
7733
  if (timerRef.current) clearTimeout(timerRef.current);
7744
7734
  if (inProp) {
7745
7735
  setMounted(true);
@@ -7886,7 +7876,7 @@ var Collapse = ({
7886
7876
  const [size, setSize] = useState22(
7887
7877
  inProp ? "auto" : collapsedSize
7888
7878
  );
7889
- useEffect17(() => {
7879
+ useEffect18(() => {
7890
7880
  if (!innerRef.current) return;
7891
7881
  const natural = orientation === "vertical" ? innerRef.current.scrollHeight : innerRef.current.scrollWidth;
7892
7882
  if (inProp) {
@@ -8072,7 +8062,7 @@ ImageField.displayName = "ImageField";
8072
8062
  import React105, {
8073
8063
  useState as useState24,
8074
8064
  useRef as useRef22,
8075
- useEffect as useEffect18,
8065
+ useEffect as useEffect19,
8076
8066
  useCallback as useCallback8,
8077
8067
  forwardRef as forwardRef10
8078
8068
  } from "react";
@@ -8148,7 +8138,7 @@ var PhoneField = forwardRef10(function PhoneField2(props, ref) {
8148
8138
  const [focusedIdx, setFocusedIdx] = useState24(-1);
8149
8139
  const [search, setSearch] = useState24("");
8150
8140
  const prevValueRef = useRef22(value);
8151
- useEffect18(() => {
8141
+ useEffect19(() => {
8152
8142
  if (value === prevValueRef.current) return;
8153
8143
  prevValueRef.current = value;
8154
8144
  const digits2 = sanitizeValue(value);
@@ -8172,7 +8162,7 @@ var PhoneField = forwardRef10(function PhoneField2(props, ref) {
8172
8162
  setFocusedIdx(-1);
8173
8163
  setSearch("");
8174
8164
  }, []);
8175
- useEffect18(() => {
8165
+ useEffect19(() => {
8176
8166
  if (!open) return;
8177
8167
  const handler = (e) => {
8178
8168
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -8182,7 +8172,7 @@ var PhoneField = forwardRef10(function PhoneField2(props, ref) {
8182
8172
  document.addEventListener("mousedown", handler);
8183
8173
  return () => document.removeEventListener("mousedown", handler);
8184
8174
  }, [open, closeDropdown]);
8185
- useEffect18(() => {
8175
+ useEffect19(() => {
8186
8176
  if (!open || !containerRef.current || !popupRef.current) return;
8187
8177
  const reference = containerRef.current;
8188
8178
  const floating = popupRef.current;
@@ -8376,7 +8366,7 @@ var PhoneField = forwardRef10(function PhoneField2(props, ref) {
8376
8366
  PhoneField.displayName = "PhoneField";
8377
8367
 
8378
8368
  // lib/RufousTextEditor/RufousTextEditor.tsx
8379
- import React116, { useMemo as useMemo4, useCallback as useCallback13, useState as useState34, useRef as useRef30, useEffect as useEffect27 } from "react";
8369
+ import React116, { useMemo as useMemo4, useCallback as useCallback13, useState as useState34, useRef as useRef30, useEffect as useEffect28 } from "react";
8380
8370
  import { createPortal as createPortal8 } from "react-dom";
8381
8371
  import { useEditor, EditorContent, EditorContext, FloatingMenu, BubbleMenu } from "@tiptap/react";
8382
8372
  import StarterKit from "@tiptap/starter-kit";
@@ -8402,7 +8392,7 @@ import { ReactRenderer } from "@tiptap/react";
8402
8392
  import tippy from "tippy.js";
8403
8393
 
8404
8394
  // lib/RufousTextEditor/MentionList.tsx
8405
- import React106, { forwardRef as forwardRef11, useEffect as useEffect19, useImperativeHandle, useState as useState25 } from "react";
8395
+ import React106, { forwardRef as forwardRef11, useEffect as useEffect20, useImperativeHandle, useState as useState25 } from "react";
8406
8396
  var MentionList = forwardRef11((props, ref) => {
8407
8397
  const [selectedIndex, setSelectedIndex] = useState25(0);
8408
8398
  const selectItem = (index) => {
@@ -8411,7 +8401,7 @@ var MentionList = forwardRef11((props, ref) => {
8411
8401
  props.command({ id: item.id, label: item.shortName || item.name });
8412
8402
  }
8413
8403
  };
8414
- useEffect19(() => setSelectedIndex(0), [props.items]);
8404
+ useEffect20(() => setSelectedIndex(0), [props.items]);
8415
8405
  useImperativeHandle(ref, () => ({
8416
8406
  onKeyDown: ({ event }) => {
8417
8407
  if (event.key === "ArrowUp") {
@@ -8498,11 +8488,11 @@ function createMentionSuggestion(users) {
8498
8488
  }
8499
8489
 
8500
8490
  // lib/RufousTextEditor/Toolbar.tsx
8501
- import React112, { useState as useState30, useRef as useRef26, useEffect as useEffect23, useCallback as useCallback12 } from "react";
8491
+ import React112, { useState as useState30, useRef as useRef26, useEffect as useEffect24, useCallback as useCallback12 } from "react";
8502
8492
  import { createPortal as createPortal4 } from "react-dom";
8503
8493
 
8504
8494
  // lib/RufousTextEditor/TextToSpeech.tsx
8505
- import React107, { useState as useState26, useEffect as useEffect20, useRef as useRef23, useCallback as useCallback9, forwardRef as forwardRef12, useImperativeHandle as useImperativeHandle2 } from "react";
8495
+ import React107, { useState as useState26, useEffect as useEffect21, useRef as useRef23, useCallback as useCallback9, forwardRef as forwardRef12, useImperativeHandle as useImperativeHandle2 } from "react";
8506
8496
  var TextToSpeech = forwardRef12(({ editor, onTextToSpeech }, ref) => {
8507
8497
  const [speaking, setSpeaking] = useState26(false);
8508
8498
  const [paused, setPaused] = useState26(false);
@@ -8512,7 +8502,7 @@ var TextToSpeech = forwardRef12(({ editor, onTextToSpeech }, ref) => {
8512
8502
  const [showPanel, setShowPanel] = useState26(false);
8513
8503
  const utteranceRef = useRef23(null);
8514
8504
  const panelRef = useRef23(null);
8515
- useEffect20(() => {
8505
+ useEffect21(() => {
8516
8506
  const synth = window.speechSynthesis;
8517
8507
  const loadVoices = () => {
8518
8508
  const available = synth.getVoices();
@@ -8530,7 +8520,7 @@ var TextToSpeech = forwardRef12(({ editor, onTextToSpeech }, ref) => {
8530
8520
  synth.removeEventListener("voiceschanged", loadVoices);
8531
8521
  };
8532
8522
  }, [selectedVoice]);
8533
- useEffect20(() => {
8523
+ useEffect21(() => {
8534
8524
  const handleClick = (e) => {
8535
8525
  if (panelRef.current && !panelRef.current.contains(e.target)) {
8536
8526
  setShowPanel(false);
@@ -8648,7 +8638,7 @@ var TextToSpeech = forwardRef12(({ editor, onTextToSpeech }, ref) => {
8648
8638
  var TextToSpeech_default = TextToSpeech;
8649
8639
 
8650
8640
  // lib/RufousTextEditor/SpeechToText.tsx
8651
- import React108, { useState as useState27, useRef as useRef24, useCallback as useCallback10, useEffect as useEffect21, forwardRef as forwardRef13, useImperativeHandle as useImperativeHandle3 } from "react";
8641
+ import React108, { useState as useState27, useRef as useRef24, useCallback as useCallback10, useEffect as useEffect22, forwardRef as forwardRef13, useImperativeHandle as useImperativeHandle3 } from "react";
8652
8642
  var SpeechToText = forwardRef13(({ editor, onSpeechToText }, ref) => {
8653
8643
  const [listening, setListening] = useState27(false);
8654
8644
  const [showPanel, setShowPanel] = useState27(false);
@@ -8659,7 +8649,7 @@ var SpeechToText = forwardRef13(({ editor, onSpeechToText }, ref) => {
8659
8649
  const isListeningRef = useRef24(false);
8660
8650
  const SpeechRecognitionAPI = typeof window !== "undefined" ? window.SpeechRecognition || window.webkitSpeechRecognition : null;
8661
8651
  const supported = !!SpeechRecognitionAPI;
8662
- useEffect21(() => {
8652
+ useEffect22(() => {
8663
8653
  const handleClick = (e) => {
8664
8654
  if (panelRef.current && !panelRef.current.contains(e.target)) {
8665
8655
  setShowPanel(false);
@@ -8811,7 +8801,7 @@ var SpeechToText = forwardRef13(({ editor, onSpeechToText }, ref) => {
8811
8801
  var SpeechToText_default = SpeechToText;
8812
8802
 
8813
8803
  // lib/RufousTextEditor/AICommands.tsx
8814
- import React109, { useState as useState28, useRef as useRef25, useEffect as useEffect22, useCallback as useCallback11 } from "react";
8804
+ import React109, { useState as useState28, useRef as useRef25, useEffect as useEffect23, useCallback as useCallback11 } from "react";
8815
8805
  import { createPortal as createPortal2 } from "react-dom";
8816
8806
  var AI_COMMANDS = [
8817
8807
  { 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." },
@@ -8868,7 +8858,7 @@ var AICommands = ({ editor, onAICommand }) => {
8868
8858
  const [selectionRange, setSelectionRange] = useState28(null);
8869
8859
  const [previousResults, setPreviousResults] = useState28([]);
8870
8860
  const panelRef = useRef25(null);
8871
- useEffect22(() => {
8861
+ useEffect23(() => {
8872
8862
  const handleClick = (e) => {
8873
8863
  if (panelRef.current && !panelRef.current.contains(e.target)) {
8874
8864
  setOpen(false);
@@ -10071,7 +10061,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10071
10061
  const [open, setOpen] = useState30(false);
10072
10062
  const ref = useRef26(null);
10073
10063
  const menuRef = useRef26(null);
10074
- useEffect23(() => {
10064
+ useEffect24(() => {
10075
10065
  const handleClick = (e) => {
10076
10066
  const target = e.target;
10077
10067
  const inTrigger = ref.current?.contains(target);
@@ -10083,7 +10073,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10083
10073
  document.addEventListener("mousedown", handleClick);
10084
10074
  return () => document.removeEventListener("mousedown", handleClick);
10085
10075
  }, []);
10086
- useEffect23(() => {
10076
+ useEffect24(() => {
10087
10077
  if (!open || !menuRef.current || !ref.current) return;
10088
10078
  const menu = menuRef.current;
10089
10079
  const trigger2 = ref.current;
@@ -10384,7 +10374,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10384
10374
  const ttsRef = useRef26(null);
10385
10375
  const sttRef = useRef26(null);
10386
10376
  const show = (id) => !visibleButtons || visibleButtons.has(id);
10387
- useEffect23(() => {
10377
+ useEffect24(() => {
10388
10378
  if (!editor) return;
10389
10379
  const onTransaction = () => setEditorState((n) => n + 1);
10390
10380
  editor.on("transaction", onTransaction);
@@ -11023,7 +11013,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
11023
11013
  var Toolbar_default = Toolbar;
11024
11014
 
11025
11015
  // lib/RufousTextEditor/ImageToolbar.tsx
11026
- import React113, { useState as useState31, useEffect as useEffect24, useRef as useRef27 } from "react";
11016
+ import React113, { useState as useState31, useEffect as useEffect25, useRef as useRef27 } from "react";
11027
11017
  import { createPortal as createPortal5 } from "react-dom";
11028
11018
  var ALIGNMENTS = [
11029
11019
  { value: "left", label: "Left", icon: "\u2630" },
@@ -11042,7 +11032,7 @@ var ImagePropertiesModal = ({ editor, node, onClose }) => {
11042
11032
  const [lockRatio, setLockRatio] = useState31(true);
11043
11033
  const [naturalWidth, setNaturalWidth] = useState31(0);
11044
11034
  const [naturalHeight, setNaturalHeight] = useState31(0);
11045
- useEffect24(() => {
11035
+ useEffect25(() => {
11046
11036
  if (src) {
11047
11037
  const img = new window.Image();
11048
11038
  img.onload = () => {
@@ -11167,7 +11157,7 @@ var ImageToolbar = ({ editor }) => {
11167
11157
  const [copyStatus, setCopyStatus] = useState31("");
11168
11158
  const [pos, setPos] = useState31(null);
11169
11159
  const toolbarRef = useRef27(null);
11170
- useEffect24(() => {
11160
+ useEffect25(() => {
11171
11161
  if (!editor) return;
11172
11162
  const update = () => {
11173
11163
  const { selection } = editor.state;
@@ -11303,7 +11293,7 @@ var ImageToolbar = ({ editor }) => {
11303
11293
  var ImageToolbar_default = ImageToolbar;
11304
11294
 
11305
11295
  // lib/RufousTextEditor/VideoToolbar.tsx
11306
- import React114, { useState as useState32, useEffect as useEffect25, useRef as useRef28 } from "react";
11296
+ import React114, { useState as useState32, useEffect as useEffect26, useRef as useRef28 } from "react";
11307
11297
  import { createPortal as createPortal6 } from "react-dom";
11308
11298
  var ALIGNMENTS2 = [
11309
11299
  { value: "left", label: "Left", icon: "\u2630" },
@@ -11420,7 +11410,7 @@ var VideoToolbar = ({ editor }) => {
11420
11410
  const [copyStatus, setCopyStatus] = useState32("");
11421
11411
  const [pos, setPos] = useState32(null);
11422
11412
  const toolbarRef = useRef28(null);
11423
- useEffect25(() => {
11413
+ useEffect26(() => {
11424
11414
  if (!editor) return;
11425
11415
  const update = () => {
11426
11416
  const { selection } = editor.state;
@@ -11544,7 +11534,7 @@ var VideoToolbar = ({ editor }) => {
11544
11534
  var VideoToolbar_default = VideoToolbar;
11545
11535
 
11546
11536
  // lib/RufousTextEditor/TableToolbar.tsx
11547
- import React115, { useState as useState33, useEffect as useEffect26, useRef as useRef29 } from "react";
11537
+ import React115, { useState as useState33, useEffect as useEffect27, useRef as useRef29 } from "react";
11548
11538
  import { createPortal as createPortal7 } from "react-dom";
11549
11539
  var IconAddRowBefore = () => /* @__PURE__ */ React115.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ React115.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__ */ React115.createElement("path", { d: "M9 6h2v1.5h1.5v2H11V11H9V9.5H7.5v-2H9z" }));
11550
11540
  var IconAddRowAfter = () => /* @__PURE__ */ React115.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ React115.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__ */ React115.createElement("path", { d: "M9 14h2v1.5h1.5v2H11V19H9v-1.5H7.5v-2H9z" }));
@@ -11559,7 +11549,7 @@ var IconToggleHeader = () => /* @__PURE__ */ React115.createElement("svg", { wid
11559
11549
  var TableToolbar = ({ editor }) => {
11560
11550
  const [pos, setPos] = useState33(null);
11561
11551
  const toolbarRef = useRef29(null);
11562
- useEffect26(() => {
11552
+ useEffect27(() => {
11563
11553
  if (!editor) return;
11564
11554
  const update = () => {
11565
11555
  if (!editor.isActive("table")) {
@@ -11882,10 +11872,10 @@ var RufousTextEditor = ({
11882
11872
  const mentionSuggestion = useMemo4(() => createMentionSuggestion(mentions), [mentions]);
11883
11873
  const onChangeRef = useRef30(onChange);
11884
11874
  const onBlurRef = useRef30(onBlur);
11885
- useEffect27(() => {
11875
+ useEffect28(() => {
11886
11876
  onChangeRef.current = onChange;
11887
11877
  }, [onChange]);
11888
- useEffect27(() => {
11878
+ useEffect28(() => {
11889
11879
  onBlurRef.current = onBlur;
11890
11880
  }, [onBlur]);
11891
11881
  const isEditable = editable && !disabled;
@@ -11987,7 +11977,7 @@ var RufousTextEditor = ({
11987
11977
  }
11988
11978
  });
11989
11979
  const wrapperRef = useRef30(null);
11990
- useEffect27(() => {
11980
+ useEffect28(() => {
11991
11981
  if (!editor) return;
11992
11982
  let blurTimer = null;
11993
11983
  const handler = ({ event }) => {
@@ -12050,10 +12040,10 @@ var RufousTextEditor = ({
12050
12040
  setLinkSelection({ from, to });
12051
12041
  setLinkModalOpen(true);
12052
12042
  }, [editor]);
12053
- useEffect27(() => {
12043
+ useEffect28(() => {
12054
12044
  setLinkRef.current = setLink;
12055
12045
  }, [setLink]);
12056
- useEffect27(() => {
12046
+ useEffect28(() => {
12057
12047
  if (!editor?.view) return;
12058
12048
  const handleKeyDown = (event) => {
12059
12049
  if ((event.ctrlKey || event.metaKey) && event.key === "k") {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.2.77",
4
+ "version": "0.2.79",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",