@rufous/ui 0.2.65 → 0.2.67

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
@@ -2148,6 +2148,7 @@ var AddressLookup_default = AddressLookup;
2148
2148
 
2149
2149
  // lib/TextFields/DateField.tsx
2150
2150
  var import_react19 = __toESM(require("react"), 1);
2151
+ var import_react_dom = require("react-dom");
2151
2152
  var WEEKDAYS = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"];
2152
2153
  var MONTHS = [
2153
2154
  "January",
@@ -2589,7 +2590,10 @@ var DateField = ({
2589
2590
  (0, import_react19.useEffect)(() => {
2590
2591
  if (!open) return;
2591
2592
  const handler = (e) => {
2592
- if (containerRef.current && !containerRef.current.contains(e.target)) setOpen(false);
2593
+ const target = e.target;
2594
+ if (containerRef.current?.contains(target)) return;
2595
+ if (pickerRef.current?.contains(target)) return;
2596
+ setOpen(false);
2593
2597
  };
2594
2598
  document.addEventListener("mousedown", handler);
2595
2599
  return () => document.removeEventListener("mousedown", handler);
@@ -2790,80 +2794,97 @@ var DateField = ({
2790
2794
  )),
2791
2795
  label && /* @__PURE__ */ import_react19.default.createElement("label", { htmlFor: inputId, className: "rf-text-field__label" }, label, " ", required && /* @__PURE__ */ import_react19.default.createElement("span", { className: "rf-text-field__asterisk" }, "*")),
2792
2796
  variant === "outlined" && /* @__PURE__ */ import_react19.default.createElement("fieldset", { className: "rf-text-field__notch" }, label && /* @__PURE__ */ import_react19.default.createElement("legend", { className: "rf-text-field__legend" }, /* @__PURE__ */ import_react19.default.createElement("span", null, label, required ? " *" : "")))
2793
- ), open && !disabled && /* @__PURE__ */ import_react19.default.createElement(
2794
- "div",
2795
- {
2796
- ref: pickerRef,
2797
- className: [
2798
- "rf-date-picker",
2799
- isSideVariant ? "rf-date-picker--side" : "",
2800
- dropUp ? "rf-date-picker--drop-up" : ""
2801
- ].filter(Boolean).join(" "),
2802
- onMouseDown: (e) => e.preventDefault()
2803
- },
2804
- /* @__PURE__ */ import_react19.default.createElement("div", { className: isSideVariant ? "rf-date-picker__cal-col" : void 0 }, /* @__PURE__ */ import_react19.default.createElement(
2805
- CalendarBody,
2806
- {
2807
- viewMonth,
2808
- viewYear,
2809
- selectedDate,
2810
- todayDate,
2811
- dayCells,
2812
- onDayClick: handleDayClick,
2813
- onPrev: prevMonth,
2814
- onNext: nextMonth,
2815
- onMonthSelect: setViewMonth,
2816
- onYearSelect: setViewYear
2817
- }
2818
- ), type === "datetime" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement(
2819
- SpinnerPanel,
2820
- {
2821
- hour,
2822
- minute,
2823
- ampm,
2824
- onHourChange: handleHourChange,
2825
- onMinuteChange: handleMinuteChange,
2826
- onHourInput: handleHourInput,
2827
- onMinuteInput: handleMinuteInput,
2828
- onAmpmToggle: handleAmpmToggle
2829
- }
2830
- )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__divider" }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__footer" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__footer-btn", onClick: handleToday }, "Today"), /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__footer-btn rf-date-picker__footer-btn--clear", onClick: handleClear }, "Clear"))),
2831
- type === "datetime-side" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-spinner" }, /* @__PURE__ */ import_react19.default.createElement(
2832
- SpinnerPanel,
2833
- {
2834
- hour,
2835
- minute,
2836
- ampm,
2837
- onHourChange: handleHourChange,
2838
- onMinuteChange: handleMinuteChange,
2839
- onHourInput: handleHourInput,
2840
- onMinuteInput: handleMinuteInput,
2841
- onAmpmToggle: handleAmpmToggle
2842
- }
2843
- )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm)),
2844
- type === "datetime-scroll" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-timescroll" }, /* @__PURE__ */ import_react19.default.createElement(
2845
- ScrollColumn,
2846
- {
2847
- items: HOURS,
2848
- selected: hour - 1,
2849
- onSelect: handleScrollHour
2850
- }
2851
- ), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-timescroll__colon" }, ":"), /* @__PURE__ */ import_react19.default.createElement(
2852
- ScrollColumn,
2853
- {
2854
- items: MINUTES,
2855
- selected: minute,
2856
- onSelect: handleScrollMinute
2857
- }
2858
- ), /* @__PURE__ */ import_react19.default.createElement(
2859
- ScrollColumn,
2797
+ ), open && !disabled && (0, import_react_dom.createPortal)(
2798
+ /* @__PURE__ */ import_react19.default.createElement(
2799
+ "div",
2860
2800
  {
2861
- items: AMPMS,
2862
- selected: ampm === "AM" ? 0 : 1,
2863
- onSelect: handleScrollAmpm,
2864
- infinite: false
2865
- }
2866
- )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm))
2801
+ ref: pickerRef,
2802
+ className: [
2803
+ "rf-date-picker",
2804
+ "rf-date-picker--portaled",
2805
+ isSideVariant ? "rf-date-picker--side" : "",
2806
+ dropUp ? "rf-date-picker--drop-up" : ""
2807
+ ].filter(Boolean).join(" "),
2808
+ style: (() => {
2809
+ const rect = containerRef.current?.getBoundingClientRect();
2810
+ if (!rect) return {};
2811
+ const top = rect.bottom + 6;
2812
+ const spaceBelow = window.innerHeight - rect.bottom - 6;
2813
+ const useDropUp = spaceBelow < 350 && rect.top > spaceBelow;
2814
+ return {
2815
+ position: "fixed",
2816
+ left: rect.left,
2817
+ ...useDropUp ? { bottom: window.innerHeight - rect.top + 6 } : { top },
2818
+ zIndex: 99999
2819
+ };
2820
+ })(),
2821
+ onMouseDown: (e) => e.preventDefault()
2822
+ },
2823
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: isSideVariant ? "rf-date-picker__cal-col" : void 0 }, /* @__PURE__ */ import_react19.default.createElement(
2824
+ CalendarBody,
2825
+ {
2826
+ viewMonth,
2827
+ viewYear,
2828
+ selectedDate,
2829
+ todayDate,
2830
+ dayCells,
2831
+ onDayClick: handleDayClick,
2832
+ onPrev: prevMonth,
2833
+ onNext: nextMonth,
2834
+ onMonthSelect: setViewMonth,
2835
+ onYearSelect: setViewYear
2836
+ }
2837
+ ), type === "datetime" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement(
2838
+ SpinnerPanel,
2839
+ {
2840
+ hour,
2841
+ minute,
2842
+ ampm,
2843
+ onHourChange: handleHourChange,
2844
+ onMinuteChange: handleMinuteChange,
2845
+ onHourInput: handleHourInput,
2846
+ onMinuteInput: handleMinuteInput,
2847
+ onAmpmToggle: handleAmpmToggle
2848
+ }
2849
+ )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__divider" }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__footer" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__footer-btn", onClick: handleToday }, "Today"), /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", className: "rf-date-picker__footer-btn rf-date-picker__footer-btn--clear", onClick: handleClear }, "Clear"))),
2850
+ type === "datetime-side" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-spinner" }, /* @__PURE__ */ import_react19.default.createElement(
2851
+ SpinnerPanel,
2852
+ {
2853
+ hour,
2854
+ minute,
2855
+ ampm,
2856
+ onHourChange: handleHourChange,
2857
+ onMinuteChange: handleMinuteChange,
2858
+ onHourInput: handleHourInput,
2859
+ onMinuteInput: handleMinuteInput,
2860
+ onAmpmToggle: handleAmpmToggle
2861
+ }
2862
+ )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm)),
2863
+ type === "datetime-scroll" && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-timescroll" }, /* @__PURE__ */ import_react19.default.createElement(
2864
+ ScrollColumn,
2865
+ {
2866
+ items: HOURS,
2867
+ selected: hour - 1,
2868
+ onSelect: handleScrollHour
2869
+ }
2870
+ ), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-timescroll__colon" }, ":"), /* @__PURE__ */ import_react19.default.createElement(
2871
+ ScrollColumn,
2872
+ {
2873
+ items: MINUTES,
2874
+ selected: minute,
2875
+ onSelect: handleScrollMinute
2876
+ }
2877
+ ), /* @__PURE__ */ import_react19.default.createElement(
2878
+ ScrollColumn,
2879
+ {
2880
+ items: AMPMS,
2881
+ selected: ampm === "AM" ? 0 : 1,
2882
+ onSelect: handleScrollAmpm,
2883
+ infinite: false
2884
+ }
2885
+ )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm))
2886
+ ),
2887
+ document.body
2867
2888
  )), helperText && /* @__PURE__ */ import_react19.default.createElement("div", { className: "rf-text-field__helper-text" }, helperText));
2868
2889
  };
2869
2890
  DateField.displayName = "DateField";
@@ -5900,7 +5921,7 @@ Skeleton.displayName = "Skeleton";
5900
5921
 
5901
5922
  // lib/Tooltip/Tooltip.tsx
5902
5923
  var import_react35 = __toESM(require("react"), 1);
5903
- var import_react_dom = __toESM(require("react-dom"), 1);
5924
+ var import_react_dom2 = __toESM(require("react-dom"), 1);
5904
5925
  var GAP = 8;
5905
5926
  function computePosition(anchor, tooltip, placement) {
5906
5927
  const { top: aTop, left: aLeft, width: aW, height: aH } = anchor;
@@ -6119,7 +6140,7 @@ var Tooltip = ({
6119
6140
  ...childProps
6120
6141
  },
6121
6142
  import_react35.default.cloneElement(children)
6122
- ), import_react_dom.default.createPortal(tooltipElement, document.body));
6143
+ ), import_react_dom2.default.createPortal(tooltipElement, document.body));
6123
6144
  };
6124
6145
  Tooltip.displayName = "Tooltip";
6125
6146
 
@@ -7006,7 +7027,7 @@ Stepper.displayName = "Stepper";
7006
7027
 
7007
7028
  // lib/Menu/Menu.tsx
7008
7029
  var import_react40 = __toESM(require("react"), 1);
7009
- var import_react_dom2 = __toESM(require("react-dom"), 1);
7030
+ var import_react_dom3 = __toESM(require("react-dom"), 1);
7010
7031
  var MenuDivider = () => /* @__PURE__ */ import_react40.default.createElement("hr", { className: "rf-menu-divider", "aria-hidden": "true" });
7011
7032
  MenuDivider.displayName = "MenuDivider";
7012
7033
  var MenuItem = ({
@@ -7159,13 +7180,13 @@ var Menu = ({
7159
7180
  },
7160
7181
  children
7161
7182
  ));
7162
- return import_react_dom2.default.createPortal(portal, document.body);
7183
+ return import_react_dom3.default.createPortal(portal, document.body);
7163
7184
  };
7164
7185
  Menu.displayName = "Menu";
7165
7186
 
7166
7187
  // lib/Drawer/Drawer.tsx
7167
7188
  var import_react41 = __toESM(require("react"), 1);
7168
- var import_react_dom3 = __toESM(require("react-dom"), 1);
7189
+ var import_react_dom4 = __toESM(require("react-dom"), 1);
7169
7190
  var Drawer = ({
7170
7191
  open,
7171
7192
  onClose,
@@ -7265,7 +7286,7 @@ var Drawer = ({
7265
7286
  },
7266
7287
  children
7267
7288
  ));
7268
- return import_react_dom3.default.createPortal(
7289
+ return import_react_dom4.default.createPortal(
7269
7290
  /* @__PURE__ */ import_react41.default.createElement("div", { className: rootClasses, style }, drawerContent),
7270
7291
  document.body
7271
7292
  );
@@ -7274,7 +7295,7 @@ Drawer.displayName = "Drawer";
7274
7295
 
7275
7296
  // lib/Snackbar/Snackbar.tsx
7276
7297
  var import_react42 = __toESM(require("react"), 1);
7277
- var import_react_dom4 = __toESM(require("react-dom"), 1);
7298
+ var import_react_dom5 = __toESM(require("react-dom"), 1);
7278
7299
  var SEVERITY_ICONS = {
7279
7300
  success: "\u2713",
7280
7301
  error: "\u2715",
@@ -7379,7 +7400,7 @@ var Snackbar = ({
7379
7400
  "\u2715"
7380
7401
  )
7381
7402
  ));
7382
- return import_react_dom4.default.createPortal(snackbarEl, document.body);
7403
+ return import_react_dom5.default.createPortal(snackbarEl, document.body);
7383
7404
  };
7384
7405
  Snackbar.displayName = "Snackbar";
7385
7406
 
@@ -7433,7 +7454,7 @@ Link.displayName = "Link";
7433
7454
 
7434
7455
  // lib/Popper/Popper.tsx
7435
7456
  var import_react44 = __toESM(require("react"), 1);
7436
- var import_react_dom5 = __toESM(require("react-dom"), 1);
7457
+ var import_react_dom6 = __toESM(require("react-dom"), 1);
7437
7458
  function computePopperPosition(anchorRect, popperRect, placement, offset2 = [0, 8]) {
7438
7459
  const [skid, dist] = offset2;
7439
7460
  let top = 0;
@@ -7576,13 +7597,13 @@ var Popper = ({
7576
7597
  if (disablePortal) {
7577
7598
  return /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, popper);
7578
7599
  }
7579
- return import_react_dom5.default.createPortal(popper, document.body);
7600
+ return import_react_dom6.default.createPortal(popper, document.body);
7580
7601
  };
7581
7602
  Popper.displayName = "Popper";
7582
7603
 
7583
7604
  // lib/Popover/Popover.tsx
7584
7605
  var import_react45 = __toESM(require("react"), 1);
7585
- var import_react_dom6 = __toESM(require("react-dom"), 1);
7606
+ var import_react_dom7 = __toESM(require("react-dom"), 1);
7586
7607
  function getPoint(rect, v, h) {
7587
7608
  const x = h === "left" ? rect.left : h === "center" ? rect.left + rect.width / 2 : rect.right;
7588
7609
  const y = v === "top" ? rect.top : v === "center" ? rect.top + rect.height / 2 : rect.bottom;
@@ -7685,7 +7706,7 @@ var Popover = ({
7685
7706
  if (disablePortal) {
7686
7707
  return /* @__PURE__ */ import_react45.default.createElement("div", { className: `${rootClasses} rf-popover-inline`, style }, content);
7687
7708
  }
7688
- return import_react_dom6.default.createPortal(
7709
+ return import_react_dom7.default.createPortal(
7689
7710
  /* @__PURE__ */ import_react45.default.createElement("div", { className: rootClasses, style }, content),
7690
7711
  document.body
7691
7712
  );
@@ -8335,9 +8356,9 @@ var PhoneField = (0, import_react48.forwardRef)(function PhoneField2(props, ref)
8335
8356
  PhoneField.displayName = "PhoneField";
8336
8357
 
8337
8358
  // lib/RufousTextEditor/RufousTextEditor.tsx
8338
- var import_react58 = __toESM(require("react"), 1);
8339
- var import_react_dom12 = require("react-dom");
8340
- var import_react59 = require("@tiptap/react");
8359
+ var import_react59 = __toESM(require("react"), 1);
8360
+ var import_react_dom14 = require("react-dom");
8361
+ var import_react60 = require("@tiptap/react");
8341
8362
  var import_starter_kit = __toESM(require("@tiptap/starter-kit"), 1);
8342
8363
  var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
8343
8364
  var import_extension_link = __toESM(require("@tiptap/extension-link"), 1);
@@ -8458,11 +8479,11 @@ function createMentionSuggestion(users) {
8458
8479
 
8459
8480
  // lib/RufousTextEditor/Toolbar.tsx
8460
8481
  var import_react55 = __toESM(require("react"), 1);
8461
- var import_react_dom9 = require("react-dom");
8482
+ var import_react_dom10 = require("react-dom");
8462
8483
 
8463
8484
  // lib/RufousTextEditor/TextToSpeech.tsx
8464
8485
  var import_react51 = __toESM(require("react"), 1);
8465
- var TextToSpeech = ({ editor, onTextToSpeech }) => {
8486
+ var TextToSpeech = (0, import_react51.forwardRef)(({ editor, onTextToSpeech }, ref) => {
8466
8487
  const [speaking, setSpeaking] = (0, import_react51.useState)(false);
8467
8488
  const [paused, setPaused] = (0, import_react51.useState)(false);
8468
8489
  const [voices, setVoices] = (0, import_react51.useState)([]);
@@ -8565,6 +8586,7 @@ var TextToSpeech = ({ editor, onTextToSpeech }) => {
8565
8586
  setSpeaking(false);
8566
8587
  setPaused(false);
8567
8588
  }, []);
8589
+ (0, import_react51.useImperativeHandle)(ref, () => ({ stop: handleStop }), [handleStop]);
8568
8590
  return /* @__PURE__ */ import_react51.default.createElement("div", { className: "tts-wrapper", ref: panelRef }, /* @__PURE__ */ import_react51.default.createElement(
8569
8591
  "button",
8570
8592
  {
@@ -8602,12 +8624,12 @@ var TextToSpeech = ({ editor, onTextToSpeech }) => {
8602
8624
  handleSpeak();
8603
8625
  setShowPanel(false);
8604
8626
  } }, "\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")));
8605
- };
8627
+ });
8606
8628
  var TextToSpeech_default = TextToSpeech;
8607
8629
 
8608
8630
  // lib/RufousTextEditor/SpeechToText.tsx
8609
8631
  var import_react52 = __toESM(require("react"), 1);
8610
- var SpeechToText = ({ editor, onSpeechToText }) => {
8632
+ var SpeechToText = (0, import_react52.forwardRef)(({ editor, onSpeechToText }, ref) => {
8611
8633
  const [listening, setListening] = (0, import_react52.useState)(false);
8612
8634
  const [showPanel, setShowPanel] = (0, import_react52.useState)(false);
8613
8635
  const [language, setLanguage] = (0, import_react52.useState)("en-US");
@@ -8718,6 +8740,7 @@ var SpeechToText = ({ editor, onSpeechToText }) => {
8718
8740
  setListening(false);
8719
8741
  setInterim("");
8720
8742
  }, []);
8743
+ (0, import_react52.useImperativeHandle)(ref, () => ({ stop: stopListening }), [stopListening]);
8721
8744
  if (!supported) {
8722
8745
  return /* @__PURE__ */ import_react52.default.createElement("button", { className: "toolbar-btn", disabled: true, title: "Speech recognition not supported in this browser" }, "\u{1F3A4}");
8723
8746
  }
@@ -8764,12 +8787,12 @@ var SpeechToText = ({ editor, onSpeechToText }) => {
8764
8787
  },
8765
8788
  LANGUAGES2.map((l) => /* @__PURE__ */ import_react52.default.createElement("option", { key: l.code, value: l.code }, l.label))
8766
8789
  ), /* @__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));
8767
- };
8790
+ });
8768
8791
  var SpeechToText_default = SpeechToText;
8769
8792
 
8770
8793
  // lib/RufousTextEditor/AICommands.tsx
8771
8794
  var import_react53 = __toESM(require("react"), 1);
8772
- var import_react_dom7 = require("react-dom");
8795
+ var import_react_dom8 = require("react-dom");
8773
8796
  var AI_COMMANDS = [
8774
8797
  { 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." },
8775
8798
  { 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." },
@@ -8926,7 +8949,7 @@ var AICommands = ({ editor, onAICommand }) => {
8926
8949
  onClick: () => handleCommandSelect(cmd)
8927
8950
  },
8928
8951
  cmd.label
8929
- ))), /* @__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_dom7.createPortal)(
8952
+ ))), /* @__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)(
8930
8953
  /* @__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(
8931
8954
  "textarea",
8932
8955
  {
@@ -8977,7 +9000,7 @@ var AICommands_default = AICommands;
8977
9000
 
8978
9001
  // lib/RufousTextEditor/TranslateModal.tsx
8979
9002
  var import_react54 = __toESM(require("react"), 1);
8980
- var import_react_dom8 = require("react-dom");
9003
+ var import_react_dom9 = require("react-dom");
8981
9004
  var LANGUAGES = [
8982
9005
  { code: "af", name: "Afrikaans" },
8983
9006
  { code: "sq", name: "Albanian" },
@@ -9168,7 +9191,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
9168
9191
  setTranslating(false);
9169
9192
  }
9170
9193
  };
9171
- return (0, import_react_dom8.createPortal)(
9194
+ return (0, import_react_dom9.createPortal)(
9172
9195
  /* @__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(
9173
9196
  "input",
9174
9197
  {
@@ -10078,7 +10101,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10078
10101
  },
10079
10102
  trigger.label,
10080
10103
  /* @__PURE__ */ import_react55.default.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
10081
- ), open && (0, import_react_dom9.createPortal)(
10104
+ ), open && (0, import_react_dom10.createPortal)(
10082
10105
  /* @__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)),
10083
10106
  document.body
10084
10107
  ));
@@ -10335,10 +10358,11 @@ var ColorPickerPanel = ({ editor, onClose }) => {
10335
10358
  }
10336
10359
  ))), /* @__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")));
10337
10360
  };
10338
- var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload, visibleButtons }) => {
10361
+ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload, visibleButtons, isFullscreen, onToggleFullscreen }) => {
10339
10362
  const [, setEditorState] = (0, import_react55.useState)(0);
10340
- const [isFullscreen, setIsFullscreen] = (0, import_react55.useState)(false);
10341
10363
  const [todoEnabled, setTodoEnabled] = (0, import_react55.useState)(false);
10364
+ const ttsRef = (0, import_react55.useRef)(null);
10365
+ const sttRef = (0, import_react55.useRef)(null);
10342
10366
  const show = (id) => !visibleButtons || visibleButtons.has(id);
10343
10367
  (0, import_react55.useEffect)(() => {
10344
10368
  if (!editor) return;
@@ -10346,16 +10370,6 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10346
10370
  editor.on("transaction", onTransaction);
10347
10371
  return () => editor.off("transaction", onTransaction);
10348
10372
  }, [editor]);
10349
- const toggleFullscreen = (0, import_react55.useCallback)(() => {
10350
- const wrapper = document.querySelector(".editor-wrapper");
10351
- if (!wrapper) return;
10352
- if (!isFullscreen) {
10353
- wrapper.classList.add("fullscreen");
10354
- } else {
10355
- wrapper.classList.remove("fullscreen");
10356
- }
10357
- setIsFullscreen(!isFullscreen);
10358
- }, [isFullscreen]);
10359
10373
  const insertSpecialChar = (0, import_react55.useCallback)((char) => {
10360
10374
  if (!editor) return;
10361
10375
  editor.chain().focus().insertContent(char).run();
@@ -10859,11 +10873,11 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10859
10873
  "button",
10860
10874
  {
10861
10875
  className: `toolbar-btn ${isFullscreen ? "is-active" : ""}`,
10862
- onClick: toggleFullscreen,
10876
+ onClick: onToggleFullscreen,
10863
10877
  title: "Toggle Fullscreen"
10864
10878
  },
10865
10879
  /* @__PURE__ */ import_react55.default.createElement(IconFullscreen, null)
10866
- ), 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(
10880
+ ), 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(
10867
10881
  "button",
10868
10882
  {
10869
10883
  className: "toolbar-btn",
@@ -10957,7 +10971,17 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10957
10971
  "button",
10958
10972
  {
10959
10973
  className: "toolbar-btn btn-cross",
10960
- onClick: onClose,
10974
+ onClick: () => {
10975
+ try {
10976
+ ttsRef.current?.stop();
10977
+ } catch {
10978
+ }
10979
+ try {
10980
+ sttRef.current?.stop();
10981
+ } catch {
10982
+ }
10983
+ onClose();
10984
+ },
10961
10985
  title: "Close"
10962
10986
  },
10963
10987
  /* @__PURE__ */ import_react55.default.createElement(closeIcon_default, { color: "#a81c08" })
@@ -10980,7 +11004,7 @@ var Toolbar_default = Toolbar;
10980
11004
 
10981
11005
  // lib/RufousTextEditor/ImageToolbar.tsx
10982
11006
  var import_react56 = __toESM(require("react"), 1);
10983
- var import_react_dom10 = require("react-dom");
11007
+ var import_react_dom11 = require("react-dom");
10984
11008
  var ALIGNMENTS = [
10985
11009
  { value: "left", label: "Left", icon: "\u2630" },
10986
11010
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11152,7 +11176,7 @@ var ImageToolbar = ({ editor }) => {
11152
11176
  }, [editor]);
11153
11177
  const node = editor?.state.selection.node;
11154
11178
  const isImage = node && node.type.name === "image";
11155
- if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom10.createPortal)(
11179
+ if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11156
11180
  /* @__PURE__ */ import_react56.default.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11157
11181
  document.body
11158
11182
  ) : null;
@@ -11229,7 +11253,7 @@ var ImageToolbar = ({ editor }) => {
11229
11253
  );
11230
11254
  setShowVAlign(false);
11231
11255
  };
11232
- return (0, import_react_dom10.createPortal)(
11256
+ return (0, import_react_dom11.createPortal)(
11233
11257
  /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement(
11234
11258
  "div",
11235
11259
  {
@@ -11260,7 +11284,7 @@ var ImageToolbar_default = ImageToolbar;
11260
11284
 
11261
11285
  // lib/RufousTextEditor/VideoToolbar.tsx
11262
11286
  var import_react57 = __toESM(require("react"), 1);
11263
- var import_react_dom11 = require("react-dom");
11287
+ var import_react_dom12 = require("react-dom");
11264
11288
  var ALIGNMENTS2 = [
11265
11289
  { value: "left", label: "Left", icon: "\u2630" },
11266
11290
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11406,7 +11430,7 @@ var VideoToolbar = ({ editor }) => {
11406
11430
  const node = editor?.state.selection.node;
11407
11431
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11408
11432
  const nodeType = node?.type.name;
11409
- if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11433
+ if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom12.createPortal)(
11410
11434
  /* @__PURE__ */ import_react57.default.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11411
11435
  document.body
11412
11436
  ) : null;
@@ -11453,7 +11477,7 @@ var VideoToolbar = ({ editor }) => {
11453
11477
  })
11454
11478
  );
11455
11479
  };
11456
- return (0, import_react_dom11.createPortal)(
11480
+ return (0, import_react_dom12.createPortal)(
11457
11481
  /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(
11458
11482
  "div",
11459
11483
  {
@@ -11499,6 +11523,175 @@ var VideoToolbar = ({ editor }) => {
11499
11523
  };
11500
11524
  var VideoToolbar_default = VideoToolbar;
11501
11525
 
11526
+ // lib/RufousTextEditor/TableToolbar.tsx
11527
+ var import_react58 = __toESM(require("react"), 1);
11528
+ var import_react_dom13 = require("react-dom");
11529
+ 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" }));
11530
+ 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" }));
11531
+ 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)" }));
11532
+ 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" }));
11533
+ 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" }));
11534
+ 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" }));
11535
+ 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" }));
11536
+ 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" }));
11537
+ 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" }));
11538
+ 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" }));
11539
+ var TableToolbar = ({ editor }) => {
11540
+ const [pos, setPos] = (0, import_react58.useState)(null);
11541
+ const toolbarRef = (0, import_react58.useRef)(null);
11542
+ (0, import_react58.useEffect)(() => {
11543
+ if (!editor) return;
11544
+ const update = () => {
11545
+ if (!editor.isActive("table")) {
11546
+ setPos(null);
11547
+ return;
11548
+ }
11549
+ try {
11550
+ const { $from } = editor.state.selection;
11551
+ let depth = $from.depth;
11552
+ while (depth > 0) {
11553
+ const node = $from.node(depth);
11554
+ if (node.type.name === "table") {
11555
+ const domNode = editor.view.nodeDOM($from.before(depth));
11556
+ if (domNode) {
11557
+ const tableEl = domNode.tagName === "TABLE" ? domNode : domNode.querySelector?.("table") || domNode;
11558
+ const rect = tableEl.getBoundingClientRect();
11559
+ setPos({
11560
+ top: rect.top + window.scrollY - 40,
11561
+ left: rect.left + window.scrollX
11562
+ });
11563
+ }
11564
+ return;
11565
+ }
11566
+ depth--;
11567
+ }
11568
+ setPos(null);
11569
+ } catch {
11570
+ setPos(null);
11571
+ }
11572
+ };
11573
+ editor.on("selectionUpdate", update);
11574
+ editor.on("update", update);
11575
+ update();
11576
+ return () => {
11577
+ editor.off("selectionUpdate", update);
11578
+ editor.off("update", update);
11579
+ };
11580
+ }, [editor]);
11581
+ if (!editor || !pos || !editor.isActive("table")) return null;
11582
+ const canMerge = editor.can().mergeCells();
11583
+ const canSplit = editor.can().splitCell();
11584
+ const prevent = (e) => e.preventDefault();
11585
+ return (0, import_react_dom13.createPortal)(
11586
+ /* @__PURE__ */ import_react58.default.createElement(
11587
+ "div",
11588
+ {
11589
+ ref: toolbarRef,
11590
+ className: "rf-table-toolbar",
11591
+ style: { top: pos.top, left: pos.left },
11592
+ onMouseDown: prevent
11593
+ },
11594
+ /* @__PURE__ */ import_react58.default.createElement(
11595
+ "button",
11596
+ {
11597
+ className: "rf-table-toolbar-btn",
11598
+ onClick: () => editor.chain().focus().addRowBefore().run(),
11599
+ title: "Insert row above"
11600
+ },
11601
+ /* @__PURE__ */ import_react58.default.createElement(IconAddRowBefore, null)
11602
+ ),
11603
+ /* @__PURE__ */ import_react58.default.createElement(
11604
+ "button",
11605
+ {
11606
+ className: "rf-table-toolbar-btn",
11607
+ onClick: () => editor.chain().focus().addRowAfter().run(),
11608
+ title: "Insert row below"
11609
+ },
11610
+ /* @__PURE__ */ import_react58.default.createElement(IconAddRowAfter, null)
11611
+ ),
11612
+ /* @__PURE__ */ import_react58.default.createElement(
11613
+ "button",
11614
+ {
11615
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11616
+ onClick: () => editor.chain().focus().deleteRow().run(),
11617
+ title: "Delete row"
11618
+ },
11619
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteRow, null)
11620
+ ),
11621
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11622
+ /* @__PURE__ */ import_react58.default.createElement(
11623
+ "button",
11624
+ {
11625
+ className: "rf-table-toolbar-btn",
11626
+ onClick: () => editor.chain().focus().addColumnBefore().run(),
11627
+ title: "Insert column left"
11628
+ },
11629
+ /* @__PURE__ */ import_react58.default.createElement(IconAddColBefore, null)
11630
+ ),
11631
+ /* @__PURE__ */ import_react58.default.createElement(
11632
+ "button",
11633
+ {
11634
+ className: "rf-table-toolbar-btn",
11635
+ onClick: () => editor.chain().focus().addColumnAfter().run(),
11636
+ title: "Insert column right"
11637
+ },
11638
+ /* @__PURE__ */ import_react58.default.createElement(IconAddColAfter, null)
11639
+ ),
11640
+ /* @__PURE__ */ import_react58.default.createElement(
11641
+ "button",
11642
+ {
11643
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11644
+ onClick: () => editor.chain().focus().deleteColumn().run(),
11645
+ title: "Delete column"
11646
+ },
11647
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteCol, null)
11648
+ ),
11649
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11650
+ /* @__PURE__ */ import_react58.default.createElement(
11651
+ "button",
11652
+ {
11653
+ className: "rf-table-toolbar-btn",
11654
+ onClick: () => editor.chain().focus().mergeCells().run(),
11655
+ disabled: !canMerge,
11656
+ title: "Merge cells"
11657
+ },
11658
+ /* @__PURE__ */ import_react58.default.createElement(IconMergeCells, null)
11659
+ ),
11660
+ /* @__PURE__ */ import_react58.default.createElement(
11661
+ "button",
11662
+ {
11663
+ className: "rf-table-toolbar-btn",
11664
+ onClick: () => editor.chain().focus().splitCell().run(),
11665
+ disabled: !canSplit,
11666
+ title: "Split cell"
11667
+ },
11668
+ /* @__PURE__ */ import_react58.default.createElement(IconSplitCell, null)
11669
+ ),
11670
+ /* @__PURE__ */ import_react58.default.createElement("span", { className: "rf-table-toolbar-sep" }),
11671
+ /* @__PURE__ */ import_react58.default.createElement(
11672
+ "button",
11673
+ {
11674
+ className: `rf-table-toolbar-btn ${editor.isActive("tableHeader") ? "active" : ""}`,
11675
+ onClick: () => editor.chain().focus().toggleHeaderRow().run(),
11676
+ title: "Toggle header row"
11677
+ },
11678
+ /* @__PURE__ */ import_react58.default.createElement(IconToggleHeader, null)
11679
+ ),
11680
+ /* @__PURE__ */ import_react58.default.createElement(
11681
+ "button",
11682
+ {
11683
+ className: "rf-table-toolbar-btn rf-table-toolbar-btn-danger",
11684
+ onClick: () => editor.chain().focus().deleteTable().run(),
11685
+ title: "Delete table"
11686
+ },
11687
+ /* @__PURE__ */ import_react58.default.createElement(IconDeleteTable, null)
11688
+ )
11689
+ ),
11690
+ document.body
11691
+ );
11692
+ };
11693
+ var TableToolbar_default = TableToolbar;
11694
+
11502
11695
  // lib/RufousTextEditor/legacyTodoTransform.ts
11503
11696
  var IMAGE_TO_STATUS = {
11504
11697
  "todo-blank.svg": "todo",
@@ -11658,7 +11851,7 @@ var RufousTextEditor = ({
11658
11851
  sx
11659
11852
  }) => {
11660
11853
  const sxClass = useSx(sx);
11661
- const toolbarButtons = (0, import_react58.useMemo)(() => {
11854
+ const toolbarButtons = (0, import_react59.useMemo)(() => {
11662
11855
  const list = buttons || VARIANT_BUTTONS[variant] || VARIANT_BUTTONS.default;
11663
11856
  const visible = new Set(list.filter((b) => b !== "|"));
11664
11857
  if (hideButtons) {
@@ -11666,17 +11859,17 @@ var RufousTextEditor = ({
11666
11859
  }
11667
11860
  return visible;
11668
11861
  }, [buttons, variant, hideButtons]);
11669
- const mentionSuggestion = (0, import_react58.useMemo)(() => createMentionSuggestion(mentions), [mentions]);
11670
- const onChangeRef = (0, import_react58.useRef)(onChange);
11671
- const onBlurRef = (0, import_react58.useRef)(onBlur);
11672
- (0, import_react58.useEffect)(() => {
11862
+ const mentionSuggestion = (0, import_react59.useMemo)(() => createMentionSuggestion(mentions), [mentions]);
11863
+ const onChangeRef = (0, import_react59.useRef)(onChange);
11864
+ const onBlurRef = (0, import_react59.useRef)(onBlur);
11865
+ (0, import_react59.useEffect)(() => {
11673
11866
  onChangeRef.current = onChange;
11674
11867
  }, [onChange]);
11675
- (0, import_react58.useEffect)(() => {
11868
+ (0, import_react59.useEffect)(() => {
11676
11869
  onBlurRef.current = onBlur;
11677
11870
  }, [onBlur]);
11678
11871
  const isEditable = editable && !disabled;
11679
- const editor = (0, import_react59.useEditor)({
11872
+ const editor = (0, import_react60.useEditor)({
11680
11873
  editable: isEditable,
11681
11874
  extensions: [
11682
11875
  import_starter_kit.default,
@@ -11703,7 +11896,9 @@ var RufousTextEditor = ({
11703
11896
  multicolor: true
11704
11897
  }),
11705
11898
  import_extension_table.default.configure({
11706
- resizable: true
11899
+ resizable: true,
11900
+ cellMinWidth: 80,
11901
+ lastColumnResizable: true
11707
11902
  }),
11708
11903
  import_extension_table_row.default,
11709
11904
  import_extension_table_cell.default,
@@ -11771,8 +11966,8 @@ var RufousTextEditor = ({
11771
11966
  onChangeRef.current?.(e.getHTML(), e.getJSON());
11772
11967
  }
11773
11968
  });
11774
- const wrapperRef = (0, import_react58.useRef)(null);
11775
- (0, import_react58.useEffect)(() => {
11969
+ const wrapperRef = (0, import_react59.useRef)(null);
11970
+ (0, import_react59.useEffect)(() => {
11776
11971
  if (!editor) return;
11777
11972
  let blurTimer = null;
11778
11973
  const handler = ({ event }) => {
@@ -11790,15 +11985,15 @@ var RufousTextEditor = ({
11790
11985
  if (blurTimer) clearTimeout(blurTimer);
11791
11986
  };
11792
11987
  }, [editor]);
11793
- const setLinkRef = (0, import_react58.useRef)(null);
11794
- const [linkModalOpen, setLinkModalOpen] = (0, import_react58.useState)(false);
11795
- const [linkUrl, setLinkUrl] = (0, import_react58.useState)("");
11796
- const [linkText, setLinkText] = (0, import_react58.useState)("");
11797
- const [linkClassName, setLinkClassName] = (0, import_react58.useState)("");
11798
- const [linkNewTab, setLinkNewTab] = (0, import_react58.useState)(true);
11799
- const [linkNoFollow, setLinkNoFollow] = (0, import_react58.useState)(true);
11800
- const [linkSelection, setLinkSelection] = (0, import_react58.useState)(null);
11801
- const setLink = (0, import_react58.useCallback)(() => {
11988
+ const setLinkRef = (0, import_react59.useRef)(null);
11989
+ const [linkModalOpen, setLinkModalOpen] = (0, import_react59.useState)(false);
11990
+ const [linkUrl, setLinkUrl] = (0, import_react59.useState)("");
11991
+ const [linkText, setLinkText] = (0, import_react59.useState)("");
11992
+ const [linkClassName, setLinkClassName] = (0, import_react59.useState)("");
11993
+ const [linkNewTab, setLinkNewTab] = (0, import_react59.useState)(true);
11994
+ const [linkNoFollow, setLinkNoFollow] = (0, import_react59.useState)(true);
11995
+ const [linkSelection, setLinkSelection] = (0, import_react59.useState)(null);
11996
+ const setLink = (0, import_react59.useCallback)(() => {
11802
11997
  if (!editor) return;
11803
11998
  const attrs = editor.getAttributes("link");
11804
11999
  const previousUrl = attrs.href || "";
@@ -11835,10 +12030,10 @@ var RufousTextEditor = ({
11835
12030
  setLinkSelection({ from, to });
11836
12031
  setLinkModalOpen(true);
11837
12032
  }, [editor]);
11838
- (0, import_react58.useEffect)(() => {
12033
+ (0, import_react59.useEffect)(() => {
11839
12034
  setLinkRef.current = setLink;
11840
12035
  }, [setLink]);
11841
- (0, import_react58.useEffect)(() => {
12036
+ (0, import_react59.useEffect)(() => {
11842
12037
  if (!editor?.view) return;
11843
12038
  const handleKeyDown = (event) => {
11844
12039
  if ((event.ctrlKey || event.metaKey) && event.key === "k") {
@@ -11870,7 +12065,7 @@ var RufousTextEditor = ({
11870
12065
  editor.view.dom.removeEventListener("keydown", handleKeyDown);
11871
12066
  };
11872
12067
  }, [editor]);
11873
- const handleLinkSubmit = (0, import_react58.useCallback)(() => {
12068
+ const handleLinkSubmit = (0, import_react59.useCallback)(() => {
11874
12069
  if (!editor || !linkSelection) return;
11875
12070
  editor.chain().focus().setTextSelection(linkSelection).run();
11876
12071
  if (linkUrl === "") {
@@ -11906,7 +12101,7 @@ var RufousTextEditor = ({
11906
12101
  setLinkClassName("");
11907
12102
  setLinkSelection(null);
11908
12103
  }, [editor, linkUrl, linkText, linkClassName, linkNewTab, linkNoFollow, linkSelection]);
11909
- const handleLinkRemove = (0, import_react58.useCallback)(() => {
12104
+ const handleLinkRemove = (0, import_react59.useCallback)(() => {
11910
12105
  if (!editor || !linkSelection) return;
11911
12106
  editor.chain().focus().setTextSelection(linkSelection).extendMarkRange("link").unsetLink().run();
11912
12107
  setLinkModalOpen(false);
@@ -11915,7 +12110,7 @@ var RufousTextEditor = ({
11915
12110
  setLinkClassName("");
11916
12111
  setLinkSelection(null);
11917
12112
  }, [editor, linkSelection]);
11918
- const handleLinkCancel = (0, import_react58.useCallback)(() => {
12113
+ const handleLinkCancel = (0, import_react59.useCallback)(() => {
11919
12114
  setLinkModalOpen(false);
11920
12115
  setLinkUrl("");
11921
12116
  setLinkText("");
@@ -11923,30 +12118,32 @@ var RufousTextEditor = ({
11923
12118
  setLinkSelection(null);
11924
12119
  editor?.chain().focus().run();
11925
12120
  }, [editor]);
11926
- const [saveStatus, setSaveStatus] = (0, import_react58.useState)("");
11927
- const handleSave = (0, import_react58.useCallback)(() => {
12121
+ const [saveStatus, setSaveStatus] = (0, import_react59.useState)("");
12122
+ const handleSave = (0, import_react59.useCallback)(() => {
11928
12123
  if (!editor || !onSaveProp) return;
11929
12124
  onSaveProp(editor.getHTML(), editor.getJSON());
11930
12125
  setSaveStatus("Saved!");
11931
12126
  setTimeout(() => setSaveStatus(""), 2e3);
11932
12127
  }, [editor, onSaveProp]);
11933
- const handleExport = (0, import_react58.useCallback)(() => {
12128
+ const handleExport = (0, import_react59.useCallback)(() => {
11934
12129
  if (!editor || !onExportProp) return;
11935
12130
  onExportProp(editor.getHTML(), editor.getJSON());
11936
12131
  }, [editor, onExportProp]);
11937
- const providerValue = (0, import_react58.useMemo)(() => ({ editor }), [editor]);
11938
- return /* @__PURE__ */ import_react58.default.createElement(
12132
+ const providerValue = (0, import_react59.useMemo)(() => ({ editor }), [editor]);
12133
+ const [isFullscreen, setIsFullscreen] = (0, import_react59.useState)(false);
12134
+ const toggleFullscreen = (0, import_react59.useCallback)(() => setIsFullscreen((prev) => !prev), []);
12135
+ const wrapperJsx = /* @__PURE__ */ import_react59.default.createElement(
11939
12136
  "div",
11940
12137
  {
11941
12138
  ref: wrapperRef,
11942
- className: `rf-rte-wrapper editor-wrapper ${resizable ? "rf-rte-resizable" : ""} ${disabled ? "rf-rte-disabled" : ""} ${error ? "rf-rte-error" : ""} ${sxClass} ${className || ""}`,
11943
- style: {
12139
+ className: `rf-rte-wrapper editor-wrapper ${isFullscreen ? "fullscreen" : ""} ${resizable ? "rf-rte-resizable" : ""} ${disabled ? "rf-rte-disabled" : ""} ${error ? "rf-rte-error" : ""} ${sxClass} ${className || ""}`,
12140
+ style: isFullscreen ? void 0 : {
11944
12141
  ...style,
11945
12142
  ...width ? { width: typeof width === "number" ? `${width}px` : width } : {},
11946
12143
  ...height ? { height: typeof height === "number" ? `${height}px` : height } : {}
11947
12144
  }
11948
12145
  },
11949
- /* @__PURE__ */ import_react58.default.createElement(import_react59.EditorContext.Provider, { value: providerValue }, /* @__PURE__ */ import_react58.default.createElement(
12146
+ /* @__PURE__ */ import_react59.default.createElement(import_react60.EditorContext.Provider, { value: providerValue }, /* @__PURE__ */ import_react59.default.createElement(
11950
12147
  Toolbar_default,
11951
12148
  {
11952
12149
  editor,
@@ -11957,10 +12154,12 @@ var RufousTextEditor = ({
11957
12154
  onTextToSpeech,
11958
12155
  onImageUpload,
11959
12156
  onClose,
11960
- visibleButtons: toolbarButtons
12157
+ visibleButtons: toolbarButtons,
12158
+ isFullscreen,
12159
+ onToggleFullscreen: toggleFullscreen
11961
12160
  }
11962
- ), /* @__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(
11963
- import_react59.BubbleMenu,
12161
+ ), /* @__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(
12162
+ import_react60.BubbleMenu,
11964
12163
  {
11965
12164
  editor,
11966
12165
  className: "bubble-menu",
@@ -11977,31 +12176,31 @@ var RufousTextEditor = ({
11977
12176
  }
11978
12177
  }
11979
12178
  },
11980
- /* @__PURE__ */ import_react58.default.createElement(
12179
+ /* @__PURE__ */ import_react59.default.createElement(
11981
12180
  "button",
11982
12181
  {
11983
12182
  onClick: () => editor?.chain().focus().toggleBold().run(),
11984
12183
  className: editor?.isActive("bold") ? "is-active" : ""
11985
12184
  },
11986
- /* @__PURE__ */ import_react58.default.createElement("strong", null, "B")
12185
+ /* @__PURE__ */ import_react59.default.createElement("strong", null, "B")
11987
12186
  ),
11988
- /* @__PURE__ */ import_react58.default.createElement(
12187
+ /* @__PURE__ */ import_react59.default.createElement(
11989
12188
  "button",
11990
12189
  {
11991
12190
  onClick: () => editor?.chain().focus().toggleItalic().run(),
11992
12191
  className: editor?.isActive("italic") ? "is-active" : ""
11993
12192
  },
11994
- /* @__PURE__ */ import_react58.default.createElement("em", null, "I")
12193
+ /* @__PURE__ */ import_react59.default.createElement("em", null, "I")
11995
12194
  ),
11996
- /* @__PURE__ */ import_react58.default.createElement(
12195
+ /* @__PURE__ */ import_react59.default.createElement(
11997
12196
  "button",
11998
12197
  {
11999
12198
  onClick: () => editor?.chain().focus().toggleStrike().run(),
12000
12199
  className: editor?.isActive("strike") ? "is-active" : ""
12001
12200
  },
12002
- /* @__PURE__ */ import_react58.default.createElement("s", null, "S")
12201
+ /* @__PURE__ */ import_react59.default.createElement("s", null, "S")
12003
12202
  ),
12004
- /* @__PURE__ */ import_react58.default.createElement(
12203
+ /* @__PURE__ */ import_react59.default.createElement(
12005
12204
  "button",
12006
12205
  {
12007
12206
  onClick: () => editor?.chain().focus().toggleCode().run(),
@@ -12009,7 +12208,7 @@ var RufousTextEditor = ({
12009
12208
  },
12010
12209
  "</>"
12011
12210
  ),
12012
- /* @__PURE__ */ import_react58.default.createElement(
12211
+ /* @__PURE__ */ import_react59.default.createElement(
12013
12212
  "button",
12014
12213
  {
12015
12214
  onClick: setLink,
@@ -12017,8 +12216,8 @@ var RufousTextEditor = ({
12017
12216
  },
12018
12217
  "\u{1F517}"
12019
12218
  )
12020
- ), editor && /* @__PURE__ */ import_react58.default.createElement(
12021
- import_react59.FloatingMenu,
12219
+ ), editor && /* @__PURE__ */ import_react59.default.createElement(
12220
+ import_react60.FloatingMenu,
12022
12221
  {
12023
12222
  editor,
12024
12223
  className: "floating-menu",
@@ -12032,7 +12231,7 @@ var RufousTextEditor = ({
12032
12231
  }
12033
12232
  }
12034
12233
  },
12035
- /* @__PURE__ */ import_react58.default.createElement(
12234
+ /* @__PURE__ */ import_react59.default.createElement(
12036
12235
  "button",
12037
12236
  {
12038
12237
  onClick: () => editor?.chain().focus().toggleHeading({ level: 1 }).run(),
@@ -12040,7 +12239,7 @@ var RufousTextEditor = ({
12040
12239
  },
12041
12240
  "H1"
12042
12241
  ),
12043
- /* @__PURE__ */ import_react58.default.createElement(
12242
+ /* @__PURE__ */ import_react59.default.createElement(
12044
12243
  "button",
12045
12244
  {
12046
12245
  onClick: () => editor?.chain().focus().toggleHeading({ level: 2 }).run(),
@@ -12048,7 +12247,7 @@ var RufousTextEditor = ({
12048
12247
  },
12049
12248
  "H2"
12050
12249
  ),
12051
- /* @__PURE__ */ import_react58.default.createElement(
12250
+ /* @__PURE__ */ import_react59.default.createElement(
12052
12251
  "button",
12053
12252
  {
12054
12253
  onClick: () => editor?.chain().focus().toggleBulletList().run(),
@@ -12056,7 +12255,7 @@ var RufousTextEditor = ({
12056
12255
  },
12057
12256
  "\u2022 List"
12058
12257
  ),
12059
- /* @__PURE__ */ import_react58.default.createElement(
12258
+ /* @__PURE__ */ import_react59.default.createElement(
12060
12259
  "button",
12061
12260
  {
12062
12261
  onClick: () => editor?.chain().focus().toggleOrderedList().run(),
@@ -12064,7 +12263,7 @@ var RufousTextEditor = ({
12064
12263
  },
12065
12264
  "1. List"
12066
12265
  ),
12067
- /* @__PURE__ */ import_react58.default.createElement(
12266
+ /* @__PURE__ */ import_react59.default.createElement(
12068
12267
  "button",
12069
12268
  {
12070
12269
  onClick: () => editor?.chain().focus().toggleBlockquote().run(),
@@ -12072,8 +12271,8 @@ var RufousTextEditor = ({
12072
12271
  },
12073
12272
  "\u201C Quote"
12074
12273
  )
12075
- ), /* @__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_dom12.createPortal)(
12076
- /* @__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(
12274
+ ), /* @__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_dom14.createPortal)(
12275
+ /* @__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(
12077
12276
  "input",
12078
12277
  {
12079
12278
  type: "url",
@@ -12086,7 +12285,7 @@ var RufousTextEditor = ({
12086
12285
  placeholder: "https://example.com",
12087
12286
  autoFocus: true
12088
12287
  }
12089
- )), /* @__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(
12288
+ )), /* @__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(
12090
12289
  "input",
12091
12290
  {
12092
12291
  type: "text",
@@ -12098,30 +12297,31 @@ var RufousTextEditor = ({
12098
12297
  },
12099
12298
  placeholder: "Link text"
12100
12299
  }
12101
- )), /* @__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(
12300
+ )), /* @__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(
12102
12301
  "input",
12103
12302
  {
12104
12303
  type: "checkbox",
12105
12304
  checked: linkNewTab,
12106
12305
  onChange: (e) => setLinkNewTab(e.target.checked)
12107
12306
  }
12108
- ), "Open in new tab"), /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react58.default.createElement(
12307
+ ), "Open in new tab"), /* @__PURE__ */ import_react59.default.createElement("label", { className: "link-modal-checkbox" }, /* @__PURE__ */ import_react59.default.createElement(
12109
12308
  "input",
12110
12309
  {
12111
12310
  type: "checkbox",
12112
12311
  checked: linkNoFollow,
12113
12312
  onChange: (e) => setLinkNoFollow(e.target.checked)
12114
12313
  }
12115
- ), "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")))),
12314
+ ), "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")))),
12116
12315
  document.body
12117
12316
  )),
12118
- helperText && /* @__PURE__ */ import_react58.default.createElement("div", { className: `rf-rte-helper-text ${error ? "rf-rte-helper-error" : ""}` }, helperText)
12317
+ helperText && /* @__PURE__ */ import_react59.default.createElement("div", { className: `rf-rte-helper-text ${error ? "rf-rte-helper-error" : ""}` }, helperText)
12119
12318
  );
12319
+ return isFullscreen ? (0, import_react_dom14.createPortal)(wrapperJsx, document.body) : wrapperJsx;
12120
12320
  };
12121
12321
  var RufousTextContent = ({ content, className, style, sx }) => {
12122
12322
  const sxClass = useSx(sx);
12123
- const transformedContent = (0, import_react58.useMemo)(() => transformLegacyTodos(content || ""), [content]);
12124
- return /* @__PURE__ */ import_react58.default.createElement(
12323
+ const transformedContent = (0, import_react59.useMemo)(() => transformLegacyTodos(content || ""), [content]);
12324
+ return /* @__PURE__ */ import_react59.default.createElement(
12125
12325
  "div",
12126
12326
  {
12127
12327
  className: `rf-rte-content ${sxClass} ${className || ""}`,