@rufous/ui 0.2.66 → 0.2.68

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
@@ -3540,6 +3540,7 @@ DateRangeField.displayName = "DateRangeField";
3540
3540
 
3541
3541
  // lib/TextFields/Autocomplete.tsx
3542
3542
  var import_react21 = __toESM(require("react"), 1);
3543
+ var import_react_dom2 = __toESM(require("react-dom"), 1);
3543
3544
  var ChevronDownIcon = () => /* @__PURE__ */ import_react21.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_react21.default.createElement("polyline", { points: "6 9 12 15 18 9" }));
3544
3545
  var CloseSmIcon = ({ size = 16 }) => /* @__PURE__ */ import_react21.default.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }, /* @__PURE__ */ import_react21.default.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), /* @__PURE__ */ import_react21.default.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" }));
3545
3546
  var CheckIcon = () => /* @__PURE__ */ import_react21.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_react21.default.createElement("polyline", { points: "20 6 9 17 4 12" }));
@@ -3593,11 +3594,21 @@ function AutocompleteInner(props, _ref) {
3593
3594
  const [open, setOpen] = (0, import_react21.useState)(false);
3594
3595
  const [inputStr, setInputStr] = (0, import_react21.useState)("");
3595
3596
  const [focusedIdx, setFocusedIdx] = (0, import_react21.useState)(-1);
3597
+ const [popupStyle, setPopupStyle] = (0, import_react21.useState)({});
3596
3598
  const containerRef = (0, import_react21.useRef)(null);
3597
3599
  const inputRef = (0, import_react21.useRef)(null);
3598
3600
  const listRef = (0, import_react21.useRef)(null);
3599
3601
  const inputId = (0, import_react21.useRef)(`rf-ac-${Math.random().toString(36).slice(2, 9)}`).current;
3600
3602
  const sxClass = useSx(sx);
3603
+ const calcPopupStyle = (0, import_react21.useCallback)(() => {
3604
+ if (!containerRef.current) return;
3605
+ const rect = containerRef.current.getBoundingClientRect();
3606
+ setPopupStyle({
3607
+ top: rect.bottom + 4,
3608
+ left: rect.left,
3609
+ width: rect.width
3610
+ });
3611
+ }, []);
3601
3612
  const activeInput = controlledInput !== void 0 ? controlledInput : inputStr;
3602
3613
  const selectedValues = multiple ? Array.isArray(value) ? value : [] : value != null ? [value] : [];
3603
3614
  const isEqual = (0, import_react21.useCallback)(
@@ -3631,12 +3642,13 @@ function AutocompleteInner(props, _ref) {
3631
3642
  filtered.forEach((opt, i) => flatEntries.push({ kind: "option", option: opt, flatIdx: i }));
3632
3643
  }
3633
3644
  const selectableOptions = flatEntries.filter((e) => e.kind === "option");
3634
- const openPopup = () => {
3645
+ const openPopup = (0, import_react21.useCallback)(() => {
3635
3646
  if (disabled) return;
3647
+ calcPopupStyle();
3636
3648
  setOpen(true);
3637
3649
  setFocusedIdx(-1);
3638
3650
  onOpen?.();
3639
- };
3651
+ }, [disabled, calcPopupStyle, onOpen]);
3640
3652
  const closePopup = (0, import_react21.useCallback)(() => {
3641
3653
  setOpen(false);
3642
3654
  setFocusedIdx(-1);
@@ -3648,14 +3660,20 @@ function AutocompleteInner(props, _ref) {
3648
3660
  }, [freeSolo, multiple, value, onInputChange, onClose]);
3649
3661
  (0, import_react21.useEffect)(() => {
3650
3662
  if (!open) return;
3651
- const handler = (e) => {
3663
+ const handleOutside = (e) => {
3652
3664
  if (containerRef.current && !containerRef.current.contains(e.target)) {
3653
3665
  closePopup();
3654
3666
  }
3655
3667
  };
3656
- document.addEventListener("mousedown", handler);
3657
- return () => document.removeEventListener("mousedown", handler);
3658
- }, [open, closePopup]);
3668
+ document.addEventListener("mousedown", handleOutside);
3669
+ window.addEventListener("scroll", calcPopupStyle, true);
3670
+ window.addEventListener("resize", calcPopupStyle);
3671
+ return () => {
3672
+ document.removeEventListener("mousedown", handleOutside);
3673
+ window.removeEventListener("scroll", calcPopupStyle, true);
3674
+ window.removeEventListener("resize", calcPopupStyle);
3675
+ };
3676
+ }, [open, closePopup, calcPopupStyle]);
3659
3677
  (0, import_react21.useEffect)(() => {
3660
3678
  if (controlledInput !== void 0) return;
3661
3679
  if (!multiple) {
@@ -3840,34 +3858,37 @@ function AutocompleteInner(props, _ref) {
3840
3858
  },
3841
3859
  /* @__PURE__ */ import_react21.default.createElement(ChevronDownIcon, null)
3842
3860
  ))
3843
- ), helperText && /* @__PURE__ */ import_react21.default.createElement("div", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && !disabled && /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__popup", role: "presentation" }, loading ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__loading" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "rf-ac-spinner" }), loadingText) : flatEntries.length === 0 ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__no-options" }, noOptionsText) : /* @__PURE__ */ import_react21.default.createElement("ul", { ref: listRef, className: "rf-autocomplete__listbox", role: "listbox" }, groupBy ? (
3844
- // Grouped render
3845
- (() => {
3846
- const rendered = [];
3847
- let groupItems = [];
3848
- let currentGroup = "";
3849
- flatEntries.forEach((entry, ei) => {
3850
- if (entry.kind === "group") {
3851
- if (groupItems.length > 0) {
3861
+ ), helperText && /* @__PURE__ */ import_react21.default.createElement("div", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText), open && !disabled && import_react_dom2.default.createPortal(
3862
+ /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__popup", role: "presentation", style: popupStyle }, loading ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__loading" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "rf-ac-spinner" }), loadingText) : flatEntries.length === 0 ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__no-options" }, noOptionsText) : /* @__PURE__ */ import_react21.default.createElement("ul", { ref: listRef, className: "rf-autocomplete__listbox", role: "listbox" }, groupBy ? (
3863
+ // Grouped render
3864
+ (() => {
3865
+ const rendered = [];
3866
+ let groupItems = [];
3867
+ let currentGroup = "";
3868
+ flatEntries.forEach((entry, ei) => {
3869
+ if (entry.kind === "group") {
3870
+ if (groupItems.length > 0) {
3871
+ rendered.push(
3872
+ /* @__PURE__ */ import_react21.default.createElement("li", { key: `g-${currentGroup}`, role: "presentation" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__group-header" }, currentGroup), /* @__PURE__ */ import_react21.default.createElement("ul", { className: "rf-autocomplete__group-items", role: "group" }, groupItems))
3873
+ );
3874
+ groupItems = [];
3875
+ }
3876
+ currentGroup = entry.label;
3877
+ } else {
3878
+ const { option, flatIdx } = entry;
3879
+ groupItems.push(renderOptionItem(option, flatIdx));
3880
+ }
3881
+ if (ei === flatEntries.length - 1 && groupItems.length > 0) {
3852
3882
  rendered.push(
3853
3883
  /* @__PURE__ */ import_react21.default.createElement("li", { key: `g-${currentGroup}`, role: "presentation" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__group-header" }, currentGroup), /* @__PURE__ */ import_react21.default.createElement("ul", { className: "rf-autocomplete__group-items", role: "group" }, groupItems))
3854
3884
  );
3855
- groupItems = [];
3856
3885
  }
3857
- currentGroup = entry.label;
3858
- } else {
3859
- const { option, flatIdx } = entry;
3860
- groupItems.push(renderOptionItem(option, flatIdx));
3861
- }
3862
- if (ei === flatEntries.length - 1 && groupItems.length > 0) {
3863
- rendered.push(
3864
- /* @__PURE__ */ import_react21.default.createElement("li", { key: `g-${currentGroup}`, role: "presentation" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "rf-autocomplete__group-header" }, currentGroup), /* @__PURE__ */ import_react21.default.createElement("ul", { className: "rf-autocomplete__group-items", role: "group" }, groupItems))
3865
- );
3866
- }
3867
- });
3868
- return rendered;
3869
- })()
3870
- ) : selectableOptions.map(({ option, flatIdx }) => renderOptionItem(option, flatIdx)))));
3886
+ });
3887
+ return rendered;
3888
+ })()
3889
+ ) : selectableOptions.map(({ option, flatIdx }) => renderOptionItem(option, flatIdx)))),
3890
+ document.body
3891
+ ));
3871
3892
  function renderOptionItem(option, flatIdx) {
3872
3893
  const selected = isSelected(option);
3873
3894
  const focused = focusedIdx === flatIdx;
@@ -4558,6 +4579,7 @@ function DataGrid({
4558
4579
 
4559
4580
  // lib/Select/Select.tsx
4560
4581
  var import_react23 = __toESM(require("react"), 1);
4582
+ var import_react_dom3 = __toESM(require("react-dom"), 1);
4561
4583
  var ChevronDownIcon2 = () => /* @__PURE__ */ import_react23.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_react23.default.createElement("polyline", { points: "6 9 12 15 18 9" }));
4562
4584
  var CheckIcon2 = () => /* @__PURE__ */ import_react23.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_react23.default.createElement("polyline", { points: "20 6 9 17 4 12" }));
4563
4585
  function normaliseOptions(options) {
@@ -4584,10 +4606,20 @@ var Select = import_react23.default.forwardRef(function Select2(props, ref) {
4584
4606
  } = props;
4585
4607
  const [open, setOpen] = (0, import_react23.useState)(false);
4586
4608
  const [focusedIdx, setFocusedIdx] = (0, import_react23.useState)(-1);
4609
+ const [popupStyle, setPopupStyle] = (0, import_react23.useState)({});
4587
4610
  const containerRef = (0, import_react23.useRef)(null);
4588
4611
  const listRef = (0, import_react23.useRef)(null);
4589
4612
  const inputId = (0, import_react23.useRef)(`rf-sel-${Math.random().toString(36).slice(2, 9)}`).current;
4590
4613
  const sxClass = useSx(sx);
4614
+ const calcPopupStyle = (0, import_react23.useCallback)(() => {
4615
+ if (!containerRef.current) return;
4616
+ const rect = containerRef.current.getBoundingClientRect();
4617
+ setPopupStyle({
4618
+ top: rect.bottom + 4,
4619
+ left: rect.left,
4620
+ width: rect.width
4621
+ });
4622
+ }, []);
4591
4623
  const options = normaliseOptions(rawOptions);
4592
4624
  const selectedValues = multiple ? Array.isArray(value) ? value : value != null ? [value] : [] : value != null ? [value] : [];
4593
4625
  const isSelected = (0, import_react23.useCallback)(
@@ -4599,9 +4631,10 @@ var Select = import_react23.default.forwardRef(function Select2(props, ref) {
4599
4631
  const isFloating = Boolean(open || hasValue);
4600
4632
  const openPopup = (0, import_react23.useCallback)(() => {
4601
4633
  if (disabled) return;
4634
+ calcPopupStyle();
4602
4635
  setOpen(true);
4603
4636
  setFocusedIdx(-1);
4604
- }, [disabled]);
4637
+ }, [disabled, calcPopupStyle]);
4605
4638
  const closePopup = (0, import_react23.useCallback)(() => {
4606
4639
  setOpen(false);
4607
4640
  setFocusedIdx(-1);
@@ -4612,14 +4645,20 @@ var Select = import_react23.default.forwardRef(function Select2(props, ref) {
4612
4645
  }, [open, openPopup, closePopup]);
4613
4646
  (0, import_react23.useEffect)(() => {
4614
4647
  if (!open) return;
4615
- const handler = (e) => {
4648
+ const handleOutside = (e) => {
4616
4649
  if (containerRef.current && !containerRef.current.contains(e.target)) {
4617
4650
  closePopup();
4618
4651
  }
4619
4652
  };
4620
- document.addEventListener("mousedown", handler);
4621
- return () => document.removeEventListener("mousedown", handler);
4622
- }, [open, closePopup]);
4653
+ document.addEventListener("mousedown", handleOutside);
4654
+ window.addEventListener("scroll", calcPopupStyle, true);
4655
+ window.addEventListener("resize", calcPopupStyle);
4656
+ return () => {
4657
+ document.removeEventListener("mousedown", handleOutside);
4658
+ window.removeEventListener("scroll", calcPopupStyle, true);
4659
+ window.removeEventListener("resize", calcPopupStyle);
4660
+ };
4661
+ }, [open, closePopup, calcPopupStyle]);
4623
4662
  const selectOption = (0, import_react23.useCallback)((opt) => {
4624
4663
  if (opt.disabled) return;
4625
4664
  if (multiple) {
@@ -4738,32 +4777,35 @@ var Select = import_react23.default.forwardRef(function Select2(props, ref) {
4738
4777
  /* @__PURE__ */ import_react23.default.createElement("div", { className: "rf-select__arrow", "aria-hidden": "true" }, /* @__PURE__ */ import_react23.default.createElement(ChevronDownIcon2, null))
4739
4778
  ),
4740
4779
  helperText && /* @__PURE__ */ import_react23.default.createElement("div", { className: `rf-text-field__helper-text${error ? " rf-text-field__helper-text--error" : ""}` }, helperText),
4741
- open && !disabled && /* @__PURE__ */ import_react23.default.createElement("div", { className: "rf-select__popup", role: "presentation" }, /* @__PURE__ */ import_react23.default.createElement("ul", { ref: listRef, className: "rf-select__listbox", role: "listbox", "aria-multiselectable": multiple }, options.map((opt, idx) => {
4742
- const selected = isSelected(opt.value);
4743
- const focused = focusedIdx === idx;
4744
- return /* @__PURE__ */ import_react23.default.createElement(
4745
- "li",
4746
- {
4747
- key: opt.value,
4748
- "data-idx": idx,
4749
- role: "option",
4750
- "aria-selected": selected,
4751
- "aria-disabled": opt.disabled,
4752
- className: [
4753
- "rf-select__option",
4754
- selected ? "rf-select__option--selected" : "",
4755
- focused ? "rf-select__option--focused" : "",
4756
- opt.disabled ? "rf-select__option--disabled" : ""
4757
- ].filter(Boolean).join(" "),
4758
- onMouseEnter: () => setFocusedIdx(idx),
4759
- onMouseLeave: () => setFocusedIdx(-1),
4760
- onMouseDown: (e) => e.preventDefault(),
4761
- onClick: () => selectOption(opt)
4762
- },
4763
- /* @__PURE__ */ import_react23.default.createElement("span", { className: "rf-select__option-label" }, opt.label),
4764
- /* @__PURE__ */ import_react23.default.createElement("span", { className: "rf-select__option-check", "aria-hidden": "true" }, /* @__PURE__ */ import_react23.default.createElement(CheckIcon2, null))
4765
- );
4766
- })))
4780
+ open && !disabled && import_react_dom3.default.createPortal(
4781
+ /* @__PURE__ */ import_react23.default.createElement("div", { className: "rf-select__popup", role: "presentation", style: popupStyle }, /* @__PURE__ */ import_react23.default.createElement("ul", { ref: listRef, className: "rf-select__listbox", role: "listbox", "aria-multiselectable": multiple }, options.map((opt, idx) => {
4782
+ const selected = isSelected(opt.value);
4783
+ const focused = focusedIdx === idx;
4784
+ return /* @__PURE__ */ import_react23.default.createElement(
4785
+ "li",
4786
+ {
4787
+ key: opt.value,
4788
+ "data-idx": idx,
4789
+ role: "option",
4790
+ "aria-selected": selected,
4791
+ "aria-disabled": opt.disabled,
4792
+ className: [
4793
+ "rf-select__option",
4794
+ selected ? "rf-select__option--selected" : "",
4795
+ focused ? "rf-select__option--focused" : "",
4796
+ opt.disabled ? "rf-select__option--disabled" : ""
4797
+ ].filter(Boolean).join(" "),
4798
+ onMouseEnter: () => setFocusedIdx(idx),
4799
+ onMouseLeave: () => setFocusedIdx(-1),
4800
+ onMouseDown: (e) => e.preventDefault(),
4801
+ onClick: () => selectOption(opt)
4802
+ },
4803
+ /* @__PURE__ */ import_react23.default.createElement("span", { className: "rf-select__option-label" }, opt.label),
4804
+ /* @__PURE__ */ import_react23.default.createElement("span", { className: "rf-select__option-check", "aria-hidden": "true" }, /* @__PURE__ */ import_react23.default.createElement(CheckIcon2, null))
4805
+ );
4806
+ }))),
4807
+ document.body
4808
+ )
4767
4809
  );
4768
4810
  });
4769
4811
  Select.displayName = "Select";
@@ -5921,7 +5963,7 @@ Skeleton.displayName = "Skeleton";
5921
5963
 
5922
5964
  // lib/Tooltip/Tooltip.tsx
5923
5965
  var import_react35 = __toESM(require("react"), 1);
5924
- var import_react_dom2 = __toESM(require("react-dom"), 1);
5966
+ var import_react_dom4 = __toESM(require("react-dom"), 1);
5925
5967
  var GAP = 8;
5926
5968
  function computePosition(anchor, tooltip, placement) {
5927
5969
  const { top: aTop, left: aLeft, width: aW, height: aH } = anchor;
@@ -6140,7 +6182,7 @@ var Tooltip = ({
6140
6182
  ...childProps
6141
6183
  },
6142
6184
  import_react35.default.cloneElement(children)
6143
- ), import_react_dom2.default.createPortal(tooltipElement, document.body));
6185
+ ), import_react_dom4.default.createPortal(tooltipElement, document.body));
6144
6186
  };
6145
6187
  Tooltip.displayName = "Tooltip";
6146
6188
 
@@ -7027,7 +7069,7 @@ Stepper.displayName = "Stepper";
7027
7069
 
7028
7070
  // lib/Menu/Menu.tsx
7029
7071
  var import_react40 = __toESM(require("react"), 1);
7030
- var import_react_dom3 = __toESM(require("react-dom"), 1);
7072
+ var import_react_dom5 = __toESM(require("react-dom"), 1);
7031
7073
  var MenuDivider = () => /* @__PURE__ */ import_react40.default.createElement("hr", { className: "rf-menu-divider", "aria-hidden": "true" });
7032
7074
  MenuDivider.displayName = "MenuDivider";
7033
7075
  var MenuItem = ({
@@ -7180,13 +7222,13 @@ var Menu = ({
7180
7222
  },
7181
7223
  children
7182
7224
  ));
7183
- return import_react_dom3.default.createPortal(portal, document.body);
7225
+ return import_react_dom5.default.createPortal(portal, document.body);
7184
7226
  };
7185
7227
  Menu.displayName = "Menu";
7186
7228
 
7187
7229
  // lib/Drawer/Drawer.tsx
7188
7230
  var import_react41 = __toESM(require("react"), 1);
7189
- var import_react_dom4 = __toESM(require("react-dom"), 1);
7231
+ var import_react_dom6 = __toESM(require("react-dom"), 1);
7190
7232
  var Drawer = ({
7191
7233
  open,
7192
7234
  onClose,
@@ -7286,7 +7328,7 @@ var Drawer = ({
7286
7328
  },
7287
7329
  children
7288
7330
  ));
7289
- return import_react_dom4.default.createPortal(
7331
+ return import_react_dom6.default.createPortal(
7290
7332
  /* @__PURE__ */ import_react41.default.createElement("div", { className: rootClasses, style }, drawerContent),
7291
7333
  document.body
7292
7334
  );
@@ -7295,7 +7337,7 @@ Drawer.displayName = "Drawer";
7295
7337
 
7296
7338
  // lib/Snackbar/Snackbar.tsx
7297
7339
  var import_react42 = __toESM(require("react"), 1);
7298
- var import_react_dom5 = __toESM(require("react-dom"), 1);
7340
+ var import_react_dom7 = __toESM(require("react-dom"), 1);
7299
7341
  var SEVERITY_ICONS = {
7300
7342
  success: "\u2713",
7301
7343
  error: "\u2715",
@@ -7400,7 +7442,7 @@ var Snackbar = ({
7400
7442
  "\u2715"
7401
7443
  )
7402
7444
  ));
7403
- return import_react_dom5.default.createPortal(snackbarEl, document.body);
7445
+ return import_react_dom7.default.createPortal(snackbarEl, document.body);
7404
7446
  };
7405
7447
  Snackbar.displayName = "Snackbar";
7406
7448
 
@@ -7454,7 +7496,7 @@ Link.displayName = "Link";
7454
7496
 
7455
7497
  // lib/Popper/Popper.tsx
7456
7498
  var import_react44 = __toESM(require("react"), 1);
7457
- var import_react_dom6 = __toESM(require("react-dom"), 1);
7499
+ var import_react_dom8 = __toESM(require("react-dom"), 1);
7458
7500
  function computePopperPosition(anchorRect, popperRect, placement, offset2 = [0, 8]) {
7459
7501
  const [skid, dist] = offset2;
7460
7502
  let top = 0;
@@ -7597,13 +7639,13 @@ var Popper = ({
7597
7639
  if (disablePortal) {
7598
7640
  return /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, popper);
7599
7641
  }
7600
- return import_react_dom6.default.createPortal(popper, document.body);
7642
+ return import_react_dom8.default.createPortal(popper, document.body);
7601
7643
  };
7602
7644
  Popper.displayName = "Popper";
7603
7645
 
7604
7646
  // lib/Popover/Popover.tsx
7605
7647
  var import_react45 = __toESM(require("react"), 1);
7606
- var import_react_dom7 = __toESM(require("react-dom"), 1);
7648
+ var import_react_dom9 = __toESM(require("react-dom"), 1);
7607
7649
  function getPoint(rect, v, h) {
7608
7650
  const x = h === "left" ? rect.left : h === "center" ? rect.left + rect.width / 2 : rect.right;
7609
7651
  const y = v === "top" ? rect.top : v === "center" ? rect.top + rect.height / 2 : rect.bottom;
@@ -7706,7 +7748,7 @@ var Popover = ({
7706
7748
  if (disablePortal) {
7707
7749
  return /* @__PURE__ */ import_react45.default.createElement("div", { className: `${rootClasses} rf-popover-inline`, style }, content);
7708
7750
  }
7709
- return import_react_dom7.default.createPortal(
7751
+ return import_react_dom9.default.createPortal(
7710
7752
  /* @__PURE__ */ import_react45.default.createElement("div", { className: rootClasses, style }, content),
7711
7753
  document.body
7712
7754
  );
@@ -8356,9 +8398,9 @@ var PhoneField = (0, import_react48.forwardRef)(function PhoneField2(props, ref)
8356
8398
  PhoneField.displayName = "PhoneField";
8357
8399
 
8358
8400
  // lib/RufousTextEditor/RufousTextEditor.tsx
8359
- var import_react58 = __toESM(require("react"), 1);
8360
- var import_react_dom13 = require("react-dom");
8361
- var import_react59 = require("@tiptap/react");
8401
+ var import_react59 = __toESM(require("react"), 1);
8402
+ var import_react_dom16 = require("react-dom");
8403
+ var import_react60 = require("@tiptap/react");
8362
8404
  var import_starter_kit = __toESM(require("@tiptap/starter-kit"), 1);
8363
8405
  var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
8364
8406
  var import_extension_link = __toESM(require("@tiptap/extension-link"), 1);
@@ -8479,11 +8521,11 @@ function createMentionSuggestion(users) {
8479
8521
 
8480
8522
  // lib/RufousTextEditor/Toolbar.tsx
8481
8523
  var import_react55 = __toESM(require("react"), 1);
8482
- var import_react_dom10 = require("react-dom");
8524
+ var import_react_dom12 = require("react-dom");
8483
8525
 
8484
8526
  // lib/RufousTextEditor/TextToSpeech.tsx
8485
8527
  var import_react51 = __toESM(require("react"), 1);
8486
- var TextToSpeech = ({ editor, onTextToSpeech }) => {
8528
+ var TextToSpeech = (0, import_react51.forwardRef)(({ editor, onTextToSpeech }, ref) => {
8487
8529
  const [speaking, setSpeaking] = (0, import_react51.useState)(false);
8488
8530
  const [paused, setPaused] = (0, import_react51.useState)(false);
8489
8531
  const [voices, setVoices] = (0, import_react51.useState)([]);
@@ -8586,6 +8628,7 @@ var TextToSpeech = ({ editor, onTextToSpeech }) => {
8586
8628
  setSpeaking(false);
8587
8629
  setPaused(false);
8588
8630
  }, []);
8631
+ (0, import_react51.useImperativeHandle)(ref, () => ({ stop: handleStop }), [handleStop]);
8589
8632
  return /* @__PURE__ */ import_react51.default.createElement("div", { className: "tts-wrapper", ref: panelRef }, /* @__PURE__ */ import_react51.default.createElement(
8590
8633
  "button",
8591
8634
  {
@@ -8623,12 +8666,12 @@ var TextToSpeech = ({ editor, onTextToSpeech }) => {
8623
8666
  handleSpeak();
8624
8667
  setShowPanel(false);
8625
8668
  } }, "\u25B6 Speak")), speaking && /* @__PURE__ */ import_react51.default.createElement("div", { className: "tts-controls" }, paused ? /* @__PURE__ */ import_react51.default.createElement("button", { className: "toolbar-btn", onClick: handleResume, title: "Resume" }, "\u25B6") : /* @__PURE__ */ import_react51.default.createElement("button", { className: "toolbar-btn", onClick: handlePause, title: "Pause" }, "\u275A\u275A"), /* @__PURE__ */ import_react51.default.createElement("button", { className: "toolbar-btn", onClick: handleStop, title: "Stop" }, "\u25A0")));
8626
- };
8669
+ });
8627
8670
  var TextToSpeech_default = TextToSpeech;
8628
8671
 
8629
8672
  // lib/RufousTextEditor/SpeechToText.tsx
8630
8673
  var import_react52 = __toESM(require("react"), 1);
8631
- var SpeechToText = ({ editor, onSpeechToText }) => {
8674
+ var SpeechToText = (0, import_react52.forwardRef)(({ editor, onSpeechToText }, ref) => {
8632
8675
  const [listening, setListening] = (0, import_react52.useState)(false);
8633
8676
  const [showPanel, setShowPanel] = (0, import_react52.useState)(false);
8634
8677
  const [language, setLanguage] = (0, import_react52.useState)("en-US");
@@ -8739,6 +8782,7 @@ var SpeechToText = ({ editor, onSpeechToText }) => {
8739
8782
  setListening(false);
8740
8783
  setInterim("");
8741
8784
  }, []);
8785
+ (0, import_react52.useImperativeHandle)(ref, () => ({ stop: stopListening }), [stopListening]);
8742
8786
  if (!supported) {
8743
8787
  return /* @__PURE__ */ import_react52.default.createElement("button", { className: "toolbar-btn", disabled: true, title: "Speech recognition not supported in this browser" }, "\u{1F3A4}");
8744
8788
  }
@@ -8785,12 +8829,12 @@ var SpeechToText = ({ editor, onSpeechToText }) => {
8785
8829
  },
8786
8830
  LANGUAGES2.map((l) => /* @__PURE__ */ import_react52.default.createElement("option", { key: l.code, value: l.code }, l.label))
8787
8831
  ), /* @__PURE__ */ import_react52.default.createElement("div", { className: "stt-info" }, "Speak into your microphone and the text will be typed into the editor."), /* @__PURE__ */ import_react52.default.createElement("button", { className: "stt-start-btn", onClick: startListening }, "\u{1F3A4} Start Listening")), listening && interim && /* @__PURE__ */ import_react52.default.createElement("div", { className: "stt-interim" }, interim));
8788
- };
8832
+ });
8789
8833
  var SpeechToText_default = SpeechToText;
8790
8834
 
8791
8835
  // lib/RufousTextEditor/AICommands.tsx
8792
8836
  var import_react53 = __toESM(require("react"), 1);
8793
- var import_react_dom8 = require("react-dom");
8837
+ var import_react_dom10 = require("react-dom");
8794
8838
  var AI_COMMANDS = [
8795
8839
  { 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." },
8796
8840
  { 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." },
@@ -8947,7 +8991,7 @@ var AICommands = ({ editor, onAICommand }) => {
8947
8991
  onClick: () => handleCommandSelect(cmd)
8948
8992
  },
8949
8993
  cmd.label
8950
- ))), /* @__PURE__ */ import_react53.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_dom8.createPortal)(
8994
+ ))), /* @__PURE__ */ import_react53.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_dom10.createPortal)(
8951
8995
  /* @__PURE__ */ import_react53.default.createElement("div", { className: "ai-modal-overlay", onMouseDown: handleCancel }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "ai-modal", onMouseDown: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "ai-modal-header" }, /* @__PURE__ */ import_react53.default.createElement("span", { className: "ai-modal-title" }, "AI Assistant"), /* @__PURE__ */ import_react53.default.createElement("button", { className: "ai-modal-close", onClick: handleCancel }, "\xD7")), /* @__PURE__ */ import_react53.default.createElement("div", { className: "ai-modal-prompt-section" }, /* @__PURE__ */ import_react53.default.createElement("label", { className: "ai-modal-label" }, "Prompt"), /* @__PURE__ */ import_react53.default.createElement("div", { className: "ai-modal-prompt-row" }, /* @__PURE__ */ import_react53.default.createElement(
8952
8996
  "textarea",
8953
8997
  {
@@ -8998,7 +9042,7 @@ var AICommands_default = AICommands;
8998
9042
 
8999
9043
  // lib/RufousTextEditor/TranslateModal.tsx
9000
9044
  var import_react54 = __toESM(require("react"), 1);
9001
- var import_react_dom9 = require("react-dom");
9045
+ var import_react_dom11 = require("react-dom");
9002
9046
  var LANGUAGES = [
9003
9047
  { code: "af", name: "Afrikaans" },
9004
9048
  { code: "sq", name: "Albanian" },
@@ -9189,7 +9233,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
9189
9233
  setTranslating(false);
9190
9234
  }
9191
9235
  };
9192
- return (0, import_react_dom9.createPortal)(
9236
+ return (0, import_react_dom11.createPortal)(
9193
9237
  /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-overlay", onClick: onClose }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-content translate-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-header" }, /* @__PURE__ */ import_react54.default.createElement("h3", null, "Translate options"), /* @__PURE__ */ import_react54.default.createElement("button", { className: "modal-close", onClick: onClose }, "\xD7")), /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-body" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "translate-columns" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "translate-col" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "translate-filter" }, /* @__PURE__ */ import_react54.default.createElement(
9194
9238
  "input",
9195
9239
  {
@@ -10099,7 +10143,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10099
10143
  },
10100
10144
  trigger.label,
10101
10145
  /* @__PURE__ */ import_react55.default.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
10102
- ), open && (0, import_react_dom10.createPortal)(
10146
+ ), open && (0, import_react_dom12.createPortal)(
10103
10147
  /* @__PURE__ */ import_react55.default.createElement("div", { className: "rf-rte-wrapper rf-rte-dropdown-portal" }, /* @__PURE__ */ import_react55.default.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children)),
10104
10148
  document.body
10105
10149
  ));
@@ -10356,10 +10400,11 @@ var ColorPickerPanel = ({ editor, onClose }) => {
10356
10400
  }
10357
10401
  ))), /* @__PURE__ */ import_react55.default.createElement("div", { className: "color-picker-footer" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "color-picker-preview", style: { background: activeColor || "#000" } }), /* @__PURE__ */ import_react55.default.createElement("button", { className: "color-picker-remove", onClick: removeColor, title: "Remove color" }, "\u2713")));
10358
10402
  };
10359
- var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload, visibleButtons }) => {
10403
+ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload, visibleButtons, isFullscreen, onToggleFullscreen }) => {
10360
10404
  const [, setEditorState] = (0, import_react55.useState)(0);
10361
- const [isFullscreen, setIsFullscreen] = (0, import_react55.useState)(false);
10362
10405
  const [todoEnabled, setTodoEnabled] = (0, import_react55.useState)(false);
10406
+ const ttsRef = (0, import_react55.useRef)(null);
10407
+ const sttRef = (0, import_react55.useRef)(null);
10363
10408
  const show = (id) => !visibleButtons || visibleButtons.has(id);
10364
10409
  (0, import_react55.useEffect)(() => {
10365
10410
  if (!editor) return;
@@ -10367,16 +10412,6 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10367
10412
  editor.on("transaction", onTransaction);
10368
10413
  return () => editor.off("transaction", onTransaction);
10369
10414
  }, [editor]);
10370
- const toggleFullscreen = (0, import_react55.useCallback)(() => {
10371
- const wrapper = document.querySelector(".editor-wrapper");
10372
- if (!wrapper) return;
10373
- if (!isFullscreen) {
10374
- wrapper.classList.add("fullscreen");
10375
- } else {
10376
- wrapper.classList.remove("fullscreen");
10377
- }
10378
- setIsFullscreen(!isFullscreen);
10379
- }, [isFullscreen]);
10380
10415
  const insertSpecialChar = (0, import_react55.useCallback)((char) => {
10381
10416
  if (!editor) return;
10382
10417
  editor.chain().focus().insertContent(char).run();
@@ -10880,11 +10915,11 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10880
10915
  "button",
10881
10916
  {
10882
10917
  className: `toolbar-btn ${isFullscreen ? "is-active" : ""}`,
10883
- onClick: toggleFullscreen,
10918
+ onClick: onToggleFullscreen,
10884
10919
  title: "Toggle Fullscreen"
10885
10920
  },
10886
10921
  /* @__PURE__ */ import_react55.default.createElement(IconFullscreen, null)
10887
- ), show("tts") && /* @__PURE__ */ import_react55.default.createElement(TextToSpeech_default, { editor, onTextToSpeech }), show("stt") && /* @__PURE__ */ import_react55.default.createElement(SpeechToText_default, { editor, onSpeechToText }), show("translate") && /* @__PURE__ */ import_react55.default.createElement("div", { className: "translate-split-btn" }, /* @__PURE__ */ import_react55.default.createElement(
10922
+ ), show("tts") && /* @__PURE__ */ import_react55.default.createElement(TextToSpeech_default, { ref: ttsRef, editor, onTextToSpeech }), show("stt") && /* @__PURE__ */ import_react55.default.createElement(SpeechToText_default, { ref: sttRef, editor, onSpeechToText }), show("translate") && /* @__PURE__ */ import_react55.default.createElement("div", { className: "translate-split-btn" }, /* @__PURE__ */ import_react55.default.createElement(
10888
10923
  "button",
10889
10924
  {
10890
10925
  className: "toolbar-btn",
@@ -10978,7 +11013,17 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10978
11013
  "button",
10979
11014
  {
10980
11015
  className: "toolbar-btn btn-cross",
10981
- onClick: onClose,
11016
+ onClick: () => {
11017
+ try {
11018
+ ttsRef.current?.stop();
11019
+ } catch {
11020
+ }
11021
+ try {
11022
+ sttRef.current?.stop();
11023
+ } catch {
11024
+ }
11025
+ onClose();
11026
+ },
10982
11027
  title: "Close"
10983
11028
  },
10984
11029
  /* @__PURE__ */ import_react55.default.createElement(closeIcon_default, { color: "#a81c08" })
@@ -11001,7 +11046,7 @@ var Toolbar_default = Toolbar;
11001
11046
 
11002
11047
  // lib/RufousTextEditor/ImageToolbar.tsx
11003
11048
  var import_react56 = __toESM(require("react"), 1);
11004
- var import_react_dom11 = require("react-dom");
11049
+ var import_react_dom13 = require("react-dom");
11005
11050
  var ALIGNMENTS = [
11006
11051
  { value: "left", label: "Left", icon: "\u2630" },
11007
11052
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11173,7 +11218,7 @@ var ImageToolbar = ({ editor }) => {
11173
11218
  }, [editor]);
11174
11219
  const node = editor?.state.selection.node;
11175
11220
  const isImage = node && node.type.name === "image";
11176
- if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11221
+ if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom13.createPortal)(
11177
11222
  /* @__PURE__ */ import_react56.default.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11178
11223
  document.body
11179
11224
  ) : null;
@@ -11250,7 +11295,7 @@ var ImageToolbar = ({ editor }) => {
11250
11295
  );
11251
11296
  setShowVAlign(false);
11252
11297
  };
11253
- return (0, import_react_dom11.createPortal)(
11298
+ return (0, import_react_dom13.createPortal)(
11254
11299
  /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement(
11255
11300
  "div",
11256
11301
  {
@@ -11281,7 +11326,7 @@ var ImageToolbar_default = ImageToolbar;
11281
11326
 
11282
11327
  // lib/RufousTextEditor/VideoToolbar.tsx
11283
11328
  var import_react57 = __toESM(require("react"), 1);
11284
- var import_react_dom12 = require("react-dom");
11329
+ var import_react_dom14 = require("react-dom");
11285
11330
  var ALIGNMENTS2 = [
11286
11331
  { value: "left", label: "Left", icon: "\u2630" },
11287
11332
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11427,7 +11472,7 @@ var VideoToolbar = ({ editor }) => {
11427
11472
  const node = editor?.state.selection.node;
11428
11473
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11429
11474
  const nodeType = node?.type.name;
11430
- if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom12.createPortal)(
11475
+ if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom14.createPortal)(
11431
11476
  /* @__PURE__ */ import_react57.default.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11432
11477
  document.body
11433
11478
  ) : null;
@@ -11474,7 +11519,7 @@ var VideoToolbar = ({ editor }) => {
11474
11519
  })
11475
11520
  );
11476
11521
  };
11477
- return (0, import_react_dom12.createPortal)(
11522
+ return (0, import_react_dom14.createPortal)(
11478
11523
  /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(
11479
11524
  "div",
11480
11525
  {
@@ -11520,6 +11565,175 @@ var VideoToolbar = ({ editor }) => {
11520
11565
  };
11521
11566
  var VideoToolbar_default = VideoToolbar;
11522
11567
 
11568
+ // lib/RufousTextEditor/TableToolbar.tsx
11569
+ var import_react58 = __toESM(require("react"), 1);
11570
+ var import_react_dom15 = require("react-dom");
11571
+ var IconAddRowBefore = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M9 6h2v1.5h1.5v2H11V11H9V9.5H7.5v-2H9z" }));
11572
+ var IconAddRowAfter = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M9 14h2v1.5h1.5v2H11V19H9v-1.5H7.5v-2H9z" }));
11573
+ var IconAddColBefore = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M6 10h1.5v2H6v1.5H4v-2h1.5V10H4V8h2z", transform: "translate(2,1)" }));
11574
+ var IconAddColAfter = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M15 9h2v1.5h1.5v2H17V14h-2v-1.5h-1.5v-2H15z" }));
11575
+ var IconDeleteRow = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M8 14.5h8v2H8z" }));
11576
+ var IconDeleteCol = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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_react58.default.createElement("path", { d: "M14 9.5v6h2v-6z" }));
11577
+ var IconDeleteTable = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.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 16H5V5h14v14z" }), /* @__PURE__ */ import_react58.default.createElement("path", { d: "M9.17 10l-1.41 1.41L10.59 14l-2.83 2.83 1.41 1.41L12 15.41l2.83 2.83 1.41-1.41L13.41 14l2.83-2.83-1.41-1.41L12 12.59z" }));
11578
+ var IconMergeCells = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.default.createElement("path", { d: "M3 3h18v18H3V3zm2 2v5h6V5H5zm8 0v5h6V5h-6zM5 13v6h14v-6H5z" }), /* @__PURE__ */ import_react58.default.createElement("path", { d: "M8 15h8v2H8z" }));
11579
+ var IconSplitCell = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.default.createElement("path", { d: "M3 3h18v18H3V3zm2 2v5h6V5H5zm8 0v5h6V5h-6zM5 13v6h6v-6H5zm8 0v6h6v-6h-6z" }));
11580
+ var IconToggleHeader = () => /* @__PURE__ */ import_react58.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react58.default.createElement("path", { d: "M3 3h18v18H3V3zm2 2v4h14V5H5zm0 6v8h14v-8H5z" }), /* @__PURE__ */ import_react58.default.createElement("rect", { x: "5", y: "5", width: "14", height: "4", opacity: "0.4" }));
11581
+ var TableToolbar = ({ editor }) => {
11582
+ const [pos, setPos] = (0, import_react58.useState)(null);
11583
+ const toolbarRef = (0, import_react58.useRef)(null);
11584
+ (0, import_react58.useEffect)(() => {
11585
+ if (!editor) return;
11586
+ const update = () => {
11587
+ if (!editor.isActive("table")) {
11588
+ setPos(null);
11589
+ return;
11590
+ }
11591
+ try {
11592
+ const { $from } = editor.state.selection;
11593
+ let depth = $from.depth;
11594
+ while (depth > 0) {
11595
+ const node = $from.node(depth);
11596
+ if (node.type.name === "table") {
11597
+ const domNode = editor.view.nodeDOM($from.before(depth));
11598
+ if (domNode) {
11599
+ const tableEl = domNode.tagName === "TABLE" ? domNode : domNode.querySelector?.("table") || domNode;
11600
+ const rect = tableEl.getBoundingClientRect();
11601
+ setPos({
11602
+ top: rect.top + window.scrollY - 40,
11603
+ left: rect.left + window.scrollX
11604
+ });
11605
+ }
11606
+ return;
11607
+ }
11608
+ depth--;
11609
+ }
11610
+ setPos(null);
11611
+ } catch {
11612
+ setPos(null);
11613
+ }
11614
+ };
11615
+ editor.on("selectionUpdate", update);
11616
+ editor.on("update", update);
11617
+ update();
11618
+ return () => {
11619
+ editor.off("selectionUpdate", update);
11620
+ editor.off("update", update);
11621
+ };
11622
+ }, [editor]);
11623
+ if (!editor || !pos || !editor.isActive("table")) return null;
11624
+ const canMerge = editor.can().mergeCells();
11625
+ const canSplit = editor.can().splitCell();
11626
+ const prevent = (e) => e.preventDefault();
11627
+ return (0, import_react_dom15.createPortal)(
11628
+ /* @__PURE__ */ import_react58.default.createElement(
11629
+ "div",
11630
+ {
11631
+ ref: toolbarRef,
11632
+ className: "rf-table-toolbar",
11633
+ style: { top: pos.top, left: pos.left },
11634
+ onMouseDown: prevent
11635
+ },
11636
+ /* @__PURE__ */ import_react58.default.createElement(
11637
+ "button",
11638
+ {
11639
+ className: "rf-table-toolbar-btn",
11640
+ onClick: () => editor.chain().focus().addRowBefore().run(),
11641
+ title: "Insert row above"
11642
+ },
11643
+ /* @__PURE__ */ import_react58.default.createElement(IconAddRowBefore, null)
11644
+ ),
11645
+ /* @__PURE__ */ import_react58.default.createElement(
11646
+ "button",
11647
+ {
11648
+ className: "rf-table-toolbar-btn",
11649
+ onClick: () => editor.chain().focus().addRowAfter().run(),
11650
+ title: "Insert row below"
11651
+ },
11652
+ /* @__PURE__ */ import_react58.default.createElement(IconAddRowAfter, null)
11653
+ ),
11654
+ /* @__PURE__ */ import_react58.default.createElement(
11655
+ "button",
11656
+ {
11657
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11658
+ onClick: () => editor.chain().focus().deleteRow().run(),
11659
+ title: "Delete row"
11660
+ },
11661
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteRow, null)
11662
+ ),
11663
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11664
+ /* @__PURE__ */ import_react58.default.createElement(
11665
+ "button",
11666
+ {
11667
+ className: "rf-table-toolbar-btn",
11668
+ onClick: () => editor.chain().focus().addColumnBefore().run(),
11669
+ title: "Insert column left"
11670
+ },
11671
+ /* @__PURE__ */ import_react58.default.createElement(IconAddColBefore, null)
11672
+ ),
11673
+ /* @__PURE__ */ import_react58.default.createElement(
11674
+ "button",
11675
+ {
11676
+ className: "rf-table-toolbar-btn",
11677
+ onClick: () => editor.chain().focus().addColumnAfter().run(),
11678
+ title: "Insert column right"
11679
+ },
11680
+ /* @__PURE__ */ import_react58.default.createElement(IconAddColAfter, null)
11681
+ ),
11682
+ /* @__PURE__ */ import_react58.default.createElement(
11683
+ "button",
11684
+ {
11685
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11686
+ onClick: () => editor.chain().focus().deleteColumn().run(),
11687
+ title: "Delete column"
11688
+ },
11689
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteCol, null)
11690
+ ),
11691
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11692
+ /* @__PURE__ */ import_react58.default.createElement(
11693
+ "button",
11694
+ {
11695
+ className: "rf-table-toolbar-btn",
11696
+ onClick: () => editor.chain().focus().mergeCells().run(),
11697
+ disabled: !canMerge,
11698
+ title: "Merge cells"
11699
+ },
11700
+ /* @__PURE__ */ import_react58.default.createElement(IconMergeCells, null)
11701
+ ),
11702
+ /* @__PURE__ */ import_react58.default.createElement(
11703
+ "button",
11704
+ {
11705
+ className: "rf-table-toolbar-btn",
11706
+ onClick: () => editor.chain().focus().splitCell().run(),
11707
+ disabled: !canSplit,
11708
+ title: "Split cell"
11709
+ },
11710
+ /* @__PURE__ */ import_react58.default.createElement(IconSplitCell, null)
11711
+ ),
11712
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11713
+ /* @__PURE__ */ import_react58.default.createElement(
11714
+ "button",
11715
+ {
11716
+ className: `rf-table-toolbar-btn ${editor.isActive("tableHeader") ? "active" : ""}`,
11717
+ onClick: () => editor.chain().focus().toggleHeaderRow().run(),
11718
+ title: "Toggle header row"
11719
+ },
11720
+ /* @__PURE__ */ import_react58.default.createElement(IconToggleHeader, null)
11721
+ ),
11722
+ /* @__PURE__ */ import_react58.default.createElement(
11723
+ "button",
11724
+ {
11725
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11726
+ onClick: () => editor.chain().focus().deleteTable().run(),
11727
+ title: "Delete table"
11728
+ },
11729
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteTable, null)
11730
+ )
11731
+ ),
11732
+ document.body
11733
+ );
11734
+ };
11735
+ var TableToolbar_default = TableToolbar;
11736
+
11523
11737
  // lib/RufousTextEditor/legacyTodoTransform.ts
11524
11738
  var IMAGE_TO_STATUS = {
11525
11739
  "todo-blank.svg": "todo",
@@ -11679,7 +11893,7 @@ var RufousTextEditor = ({
11679
11893
  sx
11680
11894
  }) => {
11681
11895
  const sxClass = useSx(sx);
11682
- const toolbarButtons = (0, import_react58.useMemo)(() => {
11896
+ const toolbarButtons = (0, import_react59.useMemo)(() => {
11683
11897
  const list = buttons || VARIANT_BUTTONS[variant] || VARIANT_BUTTONS.default;
11684
11898
  const visible = new Set(list.filter((b) => b !== "|"));
11685
11899
  if (hideButtons) {
@@ -11687,17 +11901,17 @@ var RufousTextEditor = ({
11687
11901
  }
11688
11902
  return visible;
11689
11903
  }, [buttons, variant, hideButtons]);
11690
- const mentionSuggestion = (0, import_react58.useMemo)(() => createMentionSuggestion(mentions), [mentions]);
11691
- const onChangeRef = (0, import_react58.useRef)(onChange);
11692
- const onBlurRef = (0, import_react58.useRef)(onBlur);
11693
- (0, import_react58.useEffect)(() => {
11904
+ const mentionSuggestion = (0, import_react59.useMemo)(() => createMentionSuggestion(mentions), [mentions]);
11905
+ const onChangeRef = (0, import_react59.useRef)(onChange);
11906
+ const onBlurRef = (0, import_react59.useRef)(onBlur);
11907
+ (0, import_react59.useEffect)(() => {
11694
11908
  onChangeRef.current = onChange;
11695
11909
  }, [onChange]);
11696
- (0, import_react58.useEffect)(() => {
11910
+ (0, import_react59.useEffect)(() => {
11697
11911
  onBlurRef.current = onBlur;
11698
11912
  }, [onBlur]);
11699
11913
  const isEditable = editable && !disabled;
11700
- const editor = (0, import_react59.useEditor)({
11914
+ const editor = (0, import_react60.useEditor)({
11701
11915
  editable: isEditable,
11702
11916
  extensions: [
11703
11917
  import_starter_kit.default,
@@ -11724,7 +11938,9 @@ var RufousTextEditor = ({
11724
11938
  multicolor: true
11725
11939
  }),
11726
11940
  import_extension_table.default.configure({
11727
- resizable: true
11941
+ resizable: true,
11942
+ cellMinWidth: 80,
11943
+ lastColumnResizable: true
11728
11944
  }),
11729
11945
  import_extension_table_row.default,
11730
11946
  import_extension_table_cell.default,
@@ -11792,8 +12008,8 @@ var RufousTextEditor = ({
11792
12008
  onChangeRef.current?.(e.getHTML(), e.getJSON());
11793
12009
  }
11794
12010
  });
11795
- const wrapperRef = (0, import_react58.useRef)(null);
11796
- (0, import_react58.useEffect)(() => {
12011
+ const wrapperRef = (0, import_react59.useRef)(null);
12012
+ (0, import_react59.useEffect)(() => {
11797
12013
  if (!editor) return;
11798
12014
  let blurTimer = null;
11799
12015
  const handler = ({ event }) => {
@@ -11811,15 +12027,15 @@ var RufousTextEditor = ({
11811
12027
  if (blurTimer) clearTimeout(blurTimer);
11812
12028
  };
11813
12029
  }, [editor]);
11814
- const setLinkRef = (0, import_react58.useRef)(null);
11815
- const [linkModalOpen, setLinkModalOpen] = (0, import_react58.useState)(false);
11816
- const [linkUrl, setLinkUrl] = (0, import_react58.useState)("");
11817
- const [linkText, setLinkText] = (0, import_react58.useState)("");
11818
- const [linkClassName, setLinkClassName] = (0, import_react58.useState)("");
11819
- const [linkNewTab, setLinkNewTab] = (0, import_react58.useState)(true);
11820
- const [linkNoFollow, setLinkNoFollow] = (0, import_react58.useState)(true);
11821
- const [linkSelection, setLinkSelection] = (0, import_react58.useState)(null);
11822
- const setLink = (0, import_react58.useCallback)(() => {
12030
+ const setLinkRef = (0, import_react59.useRef)(null);
12031
+ const [linkModalOpen, setLinkModalOpen] = (0, import_react59.useState)(false);
12032
+ const [linkUrl, setLinkUrl] = (0, import_react59.useState)("");
12033
+ const [linkText, setLinkText] = (0, import_react59.useState)("");
12034
+ const [linkClassName, setLinkClassName] = (0, import_react59.useState)("");
12035
+ const [linkNewTab, setLinkNewTab] = (0, import_react59.useState)(true);
12036
+ const [linkNoFollow, setLinkNoFollow] = (0, import_react59.useState)(true);
12037
+ const [linkSelection, setLinkSelection] = (0, import_react59.useState)(null);
12038
+ const setLink = (0, import_react59.useCallback)(() => {
11823
12039
  if (!editor) return;
11824
12040
  const attrs = editor.getAttributes("link");
11825
12041
  const previousUrl = attrs.href || "";
@@ -11856,10 +12072,10 @@ var RufousTextEditor = ({
11856
12072
  setLinkSelection({ from, to });
11857
12073
  setLinkModalOpen(true);
11858
12074
  }, [editor]);
11859
- (0, import_react58.useEffect)(() => {
12075
+ (0, import_react59.useEffect)(() => {
11860
12076
  setLinkRef.current = setLink;
11861
12077
  }, [setLink]);
11862
- (0, import_react58.useEffect)(() => {
12078
+ (0, import_react59.useEffect)(() => {
11863
12079
  if (!editor?.view) return;
11864
12080
  const handleKeyDown = (event) => {
11865
12081
  if ((event.ctrlKey || event.metaKey) && event.key === "k") {
@@ -11891,7 +12107,7 @@ var RufousTextEditor = ({
11891
12107
  editor.view.dom.removeEventListener("keydown", handleKeyDown);
11892
12108
  };
11893
12109
  }, [editor]);
11894
- const handleLinkSubmit = (0, import_react58.useCallback)(() => {
12110
+ const handleLinkSubmit = (0, import_react59.useCallback)(() => {
11895
12111
  if (!editor || !linkSelection) return;
11896
12112
  editor.chain().focus().setTextSelection(linkSelection).run();
11897
12113
  if (linkUrl === "") {
@@ -11927,7 +12143,7 @@ var RufousTextEditor = ({
11927
12143
  setLinkClassName("");
11928
12144
  setLinkSelection(null);
11929
12145
  }, [editor, linkUrl, linkText, linkClassName, linkNewTab, linkNoFollow, linkSelection]);
11930
- const handleLinkRemove = (0, import_react58.useCallback)(() => {
12146
+ const handleLinkRemove = (0, import_react59.useCallback)(() => {
11931
12147
  if (!editor || !linkSelection) return;
11932
12148
  editor.chain().focus().setTextSelection(linkSelection).extendMarkRange("link").unsetLink().run();
11933
12149
  setLinkModalOpen(false);
@@ -11936,7 +12152,7 @@ var RufousTextEditor = ({
11936
12152
  setLinkClassName("");
11937
12153
  setLinkSelection(null);
11938
12154
  }, [editor, linkSelection]);
11939
- const handleLinkCancel = (0, import_react58.useCallback)(() => {
12155
+ const handleLinkCancel = (0, import_react59.useCallback)(() => {
11940
12156
  setLinkModalOpen(false);
11941
12157
  setLinkUrl("");
11942
12158
  setLinkText("");
@@ -11944,30 +12160,32 @@ var RufousTextEditor = ({
11944
12160
  setLinkSelection(null);
11945
12161
  editor?.chain().focus().run();
11946
12162
  }, [editor]);
11947
- const [saveStatus, setSaveStatus] = (0, import_react58.useState)("");
11948
- const handleSave = (0, import_react58.useCallback)(() => {
12163
+ const [saveStatus, setSaveStatus] = (0, import_react59.useState)("");
12164
+ const handleSave = (0, import_react59.useCallback)(() => {
11949
12165
  if (!editor || !onSaveProp) return;
11950
12166
  onSaveProp(editor.getHTML(), editor.getJSON());
11951
12167
  setSaveStatus("Saved!");
11952
12168
  setTimeout(() => setSaveStatus(""), 2e3);
11953
12169
  }, [editor, onSaveProp]);
11954
- const handleExport = (0, import_react58.useCallback)(() => {
12170
+ const handleExport = (0, import_react59.useCallback)(() => {
11955
12171
  if (!editor || !onExportProp) return;
11956
12172
  onExportProp(editor.getHTML(), editor.getJSON());
11957
12173
  }, [editor, onExportProp]);
11958
- const providerValue = (0, import_react58.useMemo)(() => ({ editor }), [editor]);
11959
- return /* @__PURE__ */ import_react58.default.createElement(
12174
+ const providerValue = (0, import_react59.useMemo)(() => ({ editor }), [editor]);
12175
+ const [isFullscreen, setIsFullscreen] = (0, import_react59.useState)(false);
12176
+ const toggleFullscreen = (0, import_react59.useCallback)(() => setIsFullscreen((prev) => !prev), []);
12177
+ const wrapperJsx = /* @__PURE__ */ import_react59.default.createElement(
11960
12178
  "div",
11961
12179
  {
11962
12180
  ref: wrapperRef,
11963
- className: `rf-rte-wrapper editor-wrapper ${resizable ? "rf-rte-resizable" : ""} ${disabled ? "rf-rte-disabled" : ""} ${error ? "rf-rte-error" : ""} ${sxClass} ${className || ""}`,
11964
- style: {
12181
+ className: `rf-rte-wrapper editor-wrapper ${isFullscreen ? "fullscreen" : ""} ${resizable ? "rf-rte-resizable" : ""} ${disabled ? "rf-rte-disabled" : ""} ${error ? "rf-rte-error" : ""} ${sxClass} ${className || ""}`,
12182
+ style: isFullscreen ? void 0 : {
11965
12183
  ...style,
11966
12184
  ...width ? { width: typeof width === "number" ? `${width}px` : width } : {},
11967
12185
  ...height ? { height: typeof height === "number" ? `${height}px` : height } : {}
11968
12186
  }
11969
12187
  },
11970
- /* @__PURE__ */ import_react58.default.createElement(import_react59.EditorContext.Provider, { value: providerValue }, /* @__PURE__ */ import_react58.default.createElement(
12188
+ /* @__PURE__ */ import_react59.default.createElement(import_react60.EditorContext.Provider, { value: providerValue }, /* @__PURE__ */ import_react59.default.createElement(
11971
12189
  Toolbar_default,
11972
12190
  {
11973
12191
  editor,
@@ -11978,10 +12196,12 @@ var RufousTextEditor = ({
11978
12196
  onTextToSpeech,
11979
12197
  onImageUpload,
11980
12198
  onClose,
11981
- visibleButtons: toolbarButtons
12199
+ visibleButtons: toolbarButtons,
12200
+ isFullscreen,
12201
+ onToggleFullscreen: toggleFullscreen
11982
12202
  }
11983
- ), /* @__PURE__ */ import_react58.default.createElement(import_react59.EditorContent, { editor, className: "editor-content-wrapper" }), /* @__PURE__ */ import_react58.default.createElement(ImageToolbar_default, { editor }), /* @__PURE__ */ import_react58.default.createElement(VideoToolbar_default, { editor }), editor && /* @__PURE__ */ import_react58.default.createElement(
11984
- import_react59.BubbleMenu,
12203
+ ), /* @__PURE__ */ import_react59.default.createElement(import_react60.EditorContent, { editor, className: "editor-content-wrapper" }), /* @__PURE__ */ import_react59.default.createElement(ImageToolbar_default, { editor }), /* @__PURE__ */ import_react59.default.createElement(VideoToolbar_default, { editor }), /* @__PURE__ */ import_react59.default.createElement(TableToolbar_default, { editor }), editor && /* @__PURE__ */ import_react59.default.createElement(
12204
+ import_react60.BubbleMenu,
11985
12205
  {
11986
12206
  editor,
11987
12207
  className: "bubble-menu",
@@ -11998,31 +12218,31 @@ var RufousTextEditor = ({
11998
12218
  }
11999
12219
  }
12000
12220
  },
12001
- /* @__PURE__ */ import_react58.default.createElement(
12221
+ /* @__PURE__ */ import_react59.default.createElement(
12002
12222
  "button",
12003
12223
  {
12004
12224
  onClick: () => editor?.chain().focus().toggleBold().run(),
12005
12225
  className: editor?.isActive("bold") ? "is-active" : ""
12006
12226
  },
12007
- /* @__PURE__ */ import_react58.default.createElement("strong", null, "B")
12227
+ /* @__PURE__ */ import_react59.default.createElement("strong", null, "B")
12008
12228
  ),
12009
- /* @__PURE__ */ import_react58.default.createElement(
12229
+ /* @__PURE__ */ import_react59.default.createElement(
12010
12230
  "button",
12011
12231
  {
12012
12232
  onClick: () => editor?.chain().focus().toggleItalic().run(),
12013
12233
  className: editor?.isActive("italic") ? "is-active" : ""
12014
12234
  },
12015
- /* @__PURE__ */ import_react58.default.createElement("em", null, "I")
12235
+ /* @__PURE__ */ import_react59.default.createElement("em", null, "I")
12016
12236
  ),
12017
- /* @__PURE__ */ import_react58.default.createElement(
12237
+ /* @__PURE__ */ import_react59.default.createElement(
12018
12238
  "button",
12019
12239
  {
12020
12240
  onClick: () => editor?.chain().focus().toggleStrike().run(),
12021
12241
  className: editor?.isActive("strike") ? "is-active" : ""
12022
12242
  },
12023
- /* @__PURE__ */ import_react58.default.createElement("s", null, "S")
12243
+ /* @__PURE__ */ import_react59.default.createElement("s", null, "S")
12024
12244
  ),
12025
- /* @__PURE__ */ import_react58.default.createElement(
12245
+ /* @__PURE__ */ import_react59.default.createElement(
12026
12246
  "button",
12027
12247
  {
12028
12248
  onClick: () => editor?.chain().focus().toggleCode().run(),
@@ -12030,7 +12250,7 @@ var RufousTextEditor = ({
12030
12250
  },
12031
12251
  "</>"
12032
12252
  ),
12033
- /* @__PURE__ */ import_react58.default.createElement(
12253
+ /* @__PURE__ */ import_react59.default.createElement(
12034
12254
  "button",
12035
12255
  {
12036
12256
  onClick: setLink,
@@ -12038,8 +12258,8 @@ var RufousTextEditor = ({
12038
12258
  },
12039
12259
  "\u{1F517}"
12040
12260
  )
12041
- ), editor && /* @__PURE__ */ import_react58.default.createElement(
12042
- import_react59.FloatingMenu,
12261
+ ), editor && /* @__PURE__ */ import_react59.default.createElement(
12262
+ import_react60.FloatingMenu,
12043
12263
  {
12044
12264
  editor,
12045
12265
  className: "floating-menu",
@@ -12053,7 +12273,7 @@ var RufousTextEditor = ({
12053
12273
  }
12054
12274
  }
12055
12275
  },
12056
- /* @__PURE__ */ import_react58.default.createElement(
12276
+ /* @__PURE__ */ import_react59.default.createElement(
12057
12277
  "button",
12058
12278
  {
12059
12279
  onClick: () => editor?.chain().focus().toggleHeading({ level: 1 }).run(),
@@ -12061,7 +12281,7 @@ var RufousTextEditor = ({
12061
12281
  },
12062
12282
  "H1"
12063
12283
  ),
12064
- /* @__PURE__ */ import_react58.default.createElement(
12284
+ /* @__PURE__ */ import_react59.default.createElement(
12065
12285
  "button",
12066
12286
  {
12067
12287
  onClick: () => editor?.chain().focus().toggleHeading({ level: 2 }).run(),
@@ -12069,7 +12289,7 @@ var RufousTextEditor = ({
12069
12289
  },
12070
12290
  "H2"
12071
12291
  ),
12072
- /* @__PURE__ */ import_react58.default.createElement(
12292
+ /* @__PURE__ */ import_react59.default.createElement(
12073
12293
  "button",
12074
12294
  {
12075
12295
  onClick: () => editor?.chain().focus().toggleBulletList().run(),
@@ -12077,7 +12297,7 @@ var RufousTextEditor = ({
12077
12297
  },
12078
12298
  "\u2022 List"
12079
12299
  ),
12080
- /* @__PURE__ */ import_react58.default.createElement(
12300
+ /* @__PURE__ */ import_react59.default.createElement(
12081
12301
  "button",
12082
12302
  {
12083
12303
  onClick: () => editor?.chain().focus().toggleOrderedList().run(),
@@ -12085,7 +12305,7 @@ var RufousTextEditor = ({
12085
12305
  },
12086
12306
  "1. List"
12087
12307
  ),
12088
- /* @__PURE__ */ import_react58.default.createElement(
12308
+ /* @__PURE__ */ import_react59.default.createElement(
12089
12309
  "button",
12090
12310
  {
12091
12311
  onClick: () => editor?.chain().focus().toggleBlockquote().run(),
@@ -12093,8 +12313,8 @@ var RufousTextEditor = ({
12093
12313
  },
12094
12314
  "\u201C Quote"
12095
12315
  )
12096
- ), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react58.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom13.createPortal)(
12097
- /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react58.default.createElement(
12316
+ ), /* @__PURE__ */ import_react59.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react59.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react59.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react59.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react59.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react59.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom16.createPortal)(
12317
+ /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react59.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react59.default.createElement(
12098
12318
  "input",
12099
12319
  {
12100
12320
  type: "url",
@@ -12107,7 +12327,7 @@ var RufousTextEditor = ({
12107
12327
  placeholder: "https://example.com",
12108
12328
  autoFocus: true
12109
12329
  }
12110
- )), /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-label" }, "Text"), /* @__PURE__ */ import_react58.default.createElement(
12330
+ )), /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react59.default.createElement("label", { className: "link-modal-label" }, "Text"), /* @__PURE__ */ import_react59.default.createElement(
12111
12331
  "input",
12112
12332
  {
12113
12333
  type: "text",
@@ -12119,30 +12339,31 @@ var RufousTextEditor = ({
12119
12339
  },
12120
12340
  placeholder: "Link text"
12121
12341
  }
12122
- )), /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-checkboxes" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react58.default.createElement(
12342
+ )), /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-checkboxes" }, /* @__PURE__ */ import_react59.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react59.default.createElement(
12123
12343
  "input",
12124
12344
  {
12125
12345
  type: "checkbox",
12126
12346
  checked: linkNewTab,
12127
12347
  onChange: (e) => setLinkNewTab(e.target.checked)
12128
12348
  }
12129
- ), "Open in new tab"), /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react58.default.createElement(
12349
+ ), "Open in new tab"), /* @__PURE__ */ import_react59.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react59.default.createElement(
12130
12350
  "input",
12131
12351
  {
12132
12352
  type: "checkbox",
12133
12353
  checked: linkNoFollow,
12134
12354
  onChange: (e) => setLinkNoFollow(e.target.checked)
12135
12355
  }
12136
- ), "No follow"))), /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-footer" }, /* @__PURE__ */ import_react58.default.createElement("button", { className: "link-modal-btn-unlink", onClick: handleLinkRemove }, "Unlink"), /* @__PURE__ */ import_react58.default.createElement("button", { className: "link-modal-btn-apply", onClick: handleLinkSubmit }, "Update")))),
12356
+ ), "No follow"))), /* @__PURE__ */ import_react59.default.createElement("div", { className: "link-modal-footer" }, /* @__PURE__ */ import_react59.default.createElement("button", { className: "link-modal-btn-unlink", onClick: handleLinkRemove }, "Unlink"), /* @__PURE__ */ import_react59.default.createElement("button", { className: "link-modal-btn-apply", onClick: handleLinkSubmit }, "Update")))),
12137
12357
  document.body
12138
12358
  )),
12139
- helperText && /* @__PURE__ */ import_react58.default.createElement("div", { className: `rf-rte-helper-text ${error ? "rf-rte-helper-error" : ""}` }, helperText)
12359
+ helperText && /* @__PURE__ */ import_react59.default.createElement("div", { className: `rf-rte-helper-text ${error ? "rf-rte-helper-error" : ""}` }, helperText)
12140
12360
  );
12361
+ return isFullscreen ? (0, import_react_dom16.createPortal)(wrapperJsx, document.body) : wrapperJsx;
12141
12362
  };
12142
12363
  var RufousTextContent = ({ content, className, style, sx }) => {
12143
12364
  const sxClass = useSx(sx);
12144
- const transformedContent = (0, import_react58.useMemo)(() => transformLegacyTodos(content || ""), [content]);
12145
- return /* @__PURE__ */ import_react58.default.createElement(
12365
+ const transformedContent = (0, import_react59.useMemo)(() => transformLegacyTodos(content || ""), [content]);
12366
+ return /* @__PURE__ */ import_react59.default.createElement(
12146
12367
  "div",
12147
12368
  {
12148
12369
  className: `rf-rte-content ${sxClass} ${className || ""}`,