@rufous/ui 0.2.65 → 0.2.66

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
  );
@@ -8336,7 +8357,7 @@ PhoneField.displayName = "PhoneField";
8336
8357
 
8337
8358
  // lib/RufousTextEditor/RufousTextEditor.tsx
8338
8359
  var import_react58 = __toESM(require("react"), 1);
8339
- var import_react_dom12 = require("react-dom");
8360
+ var import_react_dom13 = require("react-dom");
8340
8361
  var import_react59 = 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);
@@ -8458,7 +8479,7 @@ 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);
@@ -8769,7 +8790,7 @@ var SpeechToText_default = SpeechToText;
8769
8790
 
8770
8791
  // lib/RufousTextEditor/AICommands.tsx
8771
8792
  var import_react53 = __toESM(require("react"), 1);
8772
- var import_react_dom7 = require("react-dom");
8793
+ var import_react_dom8 = require("react-dom");
8773
8794
  var AI_COMMANDS = [
8774
8795
  { 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
8796
  { 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 +8947,7 @@ var AICommands = ({ editor, onAICommand }) => {
8926
8947
  onClick: () => handleCommandSelect(cmd)
8927
8948
  },
8928
8949
  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)(
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)(
8930
8951
  /* @__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
8952
  "textarea",
8932
8953
  {
@@ -8977,7 +8998,7 @@ var AICommands_default = AICommands;
8977
8998
 
8978
8999
  // lib/RufousTextEditor/TranslateModal.tsx
8979
9000
  var import_react54 = __toESM(require("react"), 1);
8980
- var import_react_dom8 = require("react-dom");
9001
+ var import_react_dom9 = require("react-dom");
8981
9002
  var LANGUAGES = [
8982
9003
  { code: "af", name: "Afrikaans" },
8983
9004
  { code: "sq", name: "Albanian" },
@@ -9168,7 +9189,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
9168
9189
  setTranslating(false);
9169
9190
  }
9170
9191
  };
9171
- return (0, import_react_dom8.createPortal)(
9192
+ return (0, import_react_dom9.createPortal)(
9172
9193
  /* @__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
9194
  "input",
9174
9195
  {
@@ -10078,7 +10099,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10078
10099
  },
10079
10100
  trigger.label,
10080
10101
  /* @__PURE__ */ import_react55.default.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
10081
- ), open && (0, import_react_dom9.createPortal)(
10102
+ ), open && (0, import_react_dom10.createPortal)(
10082
10103
  /* @__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
10104
  document.body
10084
10105
  ));
@@ -10980,7 +11001,7 @@ var Toolbar_default = Toolbar;
10980
11001
 
10981
11002
  // lib/RufousTextEditor/ImageToolbar.tsx
10982
11003
  var import_react56 = __toESM(require("react"), 1);
10983
- var import_react_dom10 = require("react-dom");
11004
+ var import_react_dom11 = require("react-dom");
10984
11005
  var ALIGNMENTS = [
10985
11006
  { value: "left", label: "Left", icon: "\u2630" },
10986
11007
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11152,7 +11173,7 @@ var ImageToolbar = ({ editor }) => {
11152
11173
  }, [editor]);
11153
11174
  const node = editor?.state.selection.node;
11154
11175
  const isImage = node && node.type.name === "image";
11155
- if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom10.createPortal)(
11176
+ if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11156
11177
  /* @__PURE__ */ import_react56.default.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11157
11178
  document.body
11158
11179
  ) : null;
@@ -11229,7 +11250,7 @@ var ImageToolbar = ({ editor }) => {
11229
11250
  );
11230
11251
  setShowVAlign(false);
11231
11252
  };
11232
- return (0, import_react_dom10.createPortal)(
11253
+ return (0, import_react_dom11.createPortal)(
11233
11254
  /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement(
11234
11255
  "div",
11235
11256
  {
@@ -11260,7 +11281,7 @@ var ImageToolbar_default = ImageToolbar;
11260
11281
 
11261
11282
  // lib/RufousTextEditor/VideoToolbar.tsx
11262
11283
  var import_react57 = __toESM(require("react"), 1);
11263
- var import_react_dom11 = require("react-dom");
11284
+ var import_react_dom12 = require("react-dom");
11264
11285
  var ALIGNMENTS2 = [
11265
11286
  { value: "left", label: "Left", icon: "\u2630" },
11266
11287
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11406,7 +11427,7 @@ var VideoToolbar = ({ editor }) => {
11406
11427
  const node = editor?.state.selection.node;
11407
11428
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11408
11429
  const nodeType = node?.type.name;
11409
- if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11430
+ if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom12.createPortal)(
11410
11431
  /* @__PURE__ */ import_react57.default.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11411
11432
  document.body
11412
11433
  ) : null;
@@ -11453,7 +11474,7 @@ var VideoToolbar = ({ editor }) => {
11453
11474
  })
11454
11475
  );
11455
11476
  };
11456
- return (0, import_react_dom11.createPortal)(
11477
+ return (0, import_react_dom12.createPortal)(
11457
11478
  /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(
11458
11479
  "div",
11459
11480
  {
@@ -12072,7 +12093,7 @@ var RufousTextEditor = ({
12072
12093
  },
12073
12094
  "\u201C Quote"
12074
12095
  )
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)(
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)(
12076
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(
12077
12098
  "input",
12078
12099
  {
package/dist/main.css CHANGED
@@ -1125,6 +1125,12 @@ pre {
1125
1125
  position: relative;
1126
1126
  width: 100%;
1127
1127
  }
1128
+ .rf-date-picker.rf-date-picker--portaled {
1129
+ position: fixed;
1130
+ top: auto;
1131
+ left: auto;
1132
+ z-index: 99999;
1133
+ }
1128
1134
  .rf-date-picker {
1129
1135
  position: absolute;
1130
1136
  top: calc(100% + 6px);
@@ -5788,6 +5794,7 @@ pre {
5788
5794
  text-transform: uppercase;
5789
5795
  letter-spacing: 0.5px;
5790
5796
  white-space: nowrap;
5797
+ height: 38px;
5791
5798
  }
5792
5799
  .add-btn,
5793
5800
  .btn-add {
package/dist/main.js CHANGED
@@ -1987,6 +1987,7 @@ import React70, {
1987
1987
  useEffect as useEffect4,
1988
1988
  useCallback
1989
1989
  } from "react";
1990
+ import { createPortal } from "react-dom";
1990
1991
  var WEEKDAYS = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"];
1991
1992
  var MONTHS = [
1992
1993
  "January",
@@ -2428,7 +2429,10 @@ var DateField = ({
2428
2429
  useEffect4(() => {
2429
2430
  if (!open) return;
2430
2431
  const handler = (e) => {
2431
- if (containerRef.current && !containerRef.current.contains(e.target)) setOpen(false);
2432
+ const target = e.target;
2433
+ if (containerRef.current?.contains(target)) return;
2434
+ if (pickerRef.current?.contains(target)) return;
2435
+ setOpen(false);
2432
2436
  };
2433
2437
  document.addEventListener("mousedown", handler);
2434
2438
  return () => document.removeEventListener("mousedown", handler);
@@ -2629,80 +2633,97 @@ var DateField = ({
2629
2633
  )),
2630
2634
  label && /* @__PURE__ */ React70.createElement("label", { htmlFor: inputId, className: "rf-text-field__label" }, label, " ", required && /* @__PURE__ */ React70.createElement("span", { className: "rf-text-field__asterisk" }, "*")),
2631
2635
  variant === "outlined" && /* @__PURE__ */ React70.createElement("fieldset", { className: "rf-text-field__notch" }, label && /* @__PURE__ */ React70.createElement("legend", { className: "rf-text-field__legend" }, /* @__PURE__ */ React70.createElement("span", null, label, required ? " *" : "")))
2632
- ), open && !disabled && /* @__PURE__ */ React70.createElement(
2633
- "div",
2634
- {
2635
- ref: pickerRef,
2636
- className: [
2637
- "rf-date-picker",
2638
- isSideVariant ? "rf-date-picker--side" : "",
2639
- dropUp ? "rf-date-picker--drop-up" : ""
2640
- ].filter(Boolean).join(" "),
2641
- onMouseDown: (e) => e.preventDefault()
2642
- },
2643
- /* @__PURE__ */ React70.createElement("div", { className: isSideVariant ? "rf-date-picker__cal-col" : void 0 }, /* @__PURE__ */ React70.createElement(
2644
- CalendarBody,
2645
- {
2646
- viewMonth,
2647
- viewYear,
2648
- selectedDate,
2649
- todayDate,
2650
- dayCells,
2651
- onDayClick: handleDayClick,
2652
- onPrev: prevMonth,
2653
- onNext: nextMonth,
2654
- onMonthSelect: setViewMonth,
2655
- onYearSelect: setViewYear
2656
- }
2657
- ), type === "datetime" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ React70.createElement(
2658
- SpinnerPanel,
2659
- {
2660
- hour,
2661
- minute,
2662
- ampm,
2663
- onHourChange: handleHourChange,
2664
- onMinuteChange: handleMinuteChange,
2665
- onHourInput: handleHourInput,
2666
- onMinuteInput: handleMinuteInput,
2667
- onAmpmToggle: handleAmpmToggle
2668
- }
2669
- )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__divider" }), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__footer" }, /* @__PURE__ */ React70.createElement("button", { type: "button", className: "rf-date-picker__footer-btn", onClick: handleToday }, "Today"), /* @__PURE__ */ React70.createElement("button", { type: "button", className: "rf-date-picker__footer-btn rf-date-picker__footer-btn--clear", onClick: handleClear }, "Clear"))),
2670
- type === "datetime-side" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-spinner" }, /* @__PURE__ */ React70.createElement(
2671
- SpinnerPanel,
2672
- {
2673
- hour,
2674
- minute,
2675
- ampm,
2676
- onHourChange: handleHourChange,
2677
- onMinuteChange: handleMinuteChange,
2678
- onHourInput: handleHourInput,
2679
- onMinuteInput: handleMinuteInput,
2680
- onAmpmToggle: handleAmpmToggle
2681
- }
2682
- )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm)),
2683
- type === "datetime-scroll" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ React70.createElement("div", { className: "rf-timescroll" }, /* @__PURE__ */ React70.createElement(
2684
- ScrollColumn,
2685
- {
2686
- items: HOURS,
2687
- selected: hour - 1,
2688
- onSelect: handleScrollHour
2689
- }
2690
- ), /* @__PURE__ */ React70.createElement("div", { className: "rf-timescroll__colon" }, ":"), /* @__PURE__ */ React70.createElement(
2691
- ScrollColumn,
2692
- {
2693
- items: MINUTES,
2694
- selected: minute,
2695
- onSelect: handleScrollMinute
2696
- }
2697
- ), /* @__PURE__ */ React70.createElement(
2698
- ScrollColumn,
2636
+ ), open && !disabled && createPortal(
2637
+ /* @__PURE__ */ React70.createElement(
2638
+ "div",
2699
2639
  {
2700
- items: AMPMS,
2701
- selected: ampm === "AM" ? 0 : 1,
2702
- onSelect: handleScrollAmpm,
2703
- infinite: false
2704
- }
2705
- )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm))
2640
+ ref: pickerRef,
2641
+ className: [
2642
+ "rf-date-picker",
2643
+ "rf-date-picker--portaled",
2644
+ isSideVariant ? "rf-date-picker--side" : "",
2645
+ dropUp ? "rf-date-picker--drop-up" : ""
2646
+ ].filter(Boolean).join(" "),
2647
+ style: (() => {
2648
+ const rect = containerRef.current?.getBoundingClientRect();
2649
+ if (!rect) return {};
2650
+ const top = rect.bottom + 6;
2651
+ const spaceBelow = window.innerHeight - rect.bottom - 6;
2652
+ const useDropUp = spaceBelow < 350 && rect.top > spaceBelow;
2653
+ return {
2654
+ position: "fixed",
2655
+ left: rect.left,
2656
+ ...useDropUp ? { bottom: window.innerHeight - rect.top + 6 } : { top },
2657
+ zIndex: 99999
2658
+ };
2659
+ })(),
2660
+ onMouseDown: (e) => e.preventDefault()
2661
+ },
2662
+ /* @__PURE__ */ React70.createElement("div", { className: isSideVariant ? "rf-date-picker__cal-col" : void 0 }, /* @__PURE__ */ React70.createElement(
2663
+ CalendarBody,
2664
+ {
2665
+ viewMonth,
2666
+ viewYear,
2667
+ selectedDate,
2668
+ todayDate,
2669
+ dayCells,
2670
+ onDayClick: handleDayClick,
2671
+ onPrev: prevMonth,
2672
+ onNext: nextMonth,
2673
+ onMonthSelect: setViewMonth,
2674
+ onYearSelect: setViewYear
2675
+ }
2676
+ ), type === "datetime" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__time-section" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__time-label" }, "Time"), /* @__PURE__ */ React70.createElement(
2677
+ SpinnerPanel,
2678
+ {
2679
+ hour,
2680
+ minute,
2681
+ ampm,
2682
+ onHourChange: handleHourChange,
2683
+ onMinuteChange: handleMinuteChange,
2684
+ onHourInput: handleHourInput,
2685
+ onMinuteInput: handleMinuteInput,
2686
+ onAmpmToggle: handleAmpmToggle
2687
+ }
2688
+ )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__divider" }), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__footer" }, /* @__PURE__ */ React70.createElement("button", { type: "button", className: "rf-date-picker__footer-btn", onClick: handleToday }, "Today"), /* @__PURE__ */ React70.createElement("button", { type: "button", className: "rf-date-picker__footer-btn rf-date-picker__footer-btn--clear", onClick: handleClear }, "Clear"))),
2689
+ type === "datetime-side" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-spinner" }, /* @__PURE__ */ React70.createElement(
2690
+ SpinnerPanel,
2691
+ {
2692
+ hour,
2693
+ minute,
2694
+ ampm,
2695
+ onHourChange: handleHourChange,
2696
+ onMinuteChange: handleMinuteChange,
2697
+ onHourInput: handleHourInput,
2698
+ onMinuteInput: handleMinuteInput,
2699
+ onAmpmToggle: handleAmpmToggle
2700
+ }
2701
+ )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm)),
2702
+ type === "datetime-scroll" && /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-panel" }, /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-label" }, "Time"), /* @__PURE__ */ React70.createElement("div", { className: "rf-timescroll" }, /* @__PURE__ */ React70.createElement(
2703
+ ScrollColumn,
2704
+ {
2705
+ items: HOURS,
2706
+ selected: hour - 1,
2707
+ onSelect: handleScrollHour
2708
+ }
2709
+ ), /* @__PURE__ */ React70.createElement("div", { className: "rf-timescroll__colon" }, ":"), /* @__PURE__ */ React70.createElement(
2710
+ ScrollColumn,
2711
+ {
2712
+ items: MINUTES,
2713
+ selected: minute,
2714
+ onSelect: handleScrollMinute
2715
+ }
2716
+ ), /* @__PURE__ */ React70.createElement(
2717
+ ScrollColumn,
2718
+ {
2719
+ items: AMPMS,
2720
+ selected: ampm === "AM" ? 0 : 1,
2721
+ onSelect: handleScrollAmpm,
2722
+ infinite: false
2723
+ }
2724
+ )), /* @__PURE__ */ React70.createElement("div", { className: "rf-date-picker__side-time-display" }, String(hour).padStart(2, "0"), ":", String(minute).padStart(2, "0"), " ", ampm))
2725
+ ),
2726
+ document.body
2706
2727
  )), helperText && /* @__PURE__ */ React70.createElement("div", { className: "rf-text-field__helper-text" }, helperText));
2707
2728
  };
2708
2729
  DateField.displayName = "DateField";
@@ -8270,7 +8291,7 @@ PhoneField.displayName = "PhoneField";
8270
8291
 
8271
8292
  // lib/RufousTextEditor/RufousTextEditor.tsx
8272
8293
  import React115, { useMemo as useMemo4, useCallback as useCallback13, useState as useState33, useRef as useRef29, useEffect as useEffect26 } from "react";
8273
- import { createPortal as createPortal6 } from "react-dom";
8294
+ import { createPortal as createPortal7 } from "react-dom";
8274
8295
  import { useEditor, EditorContent, EditorContext, FloatingMenu, BubbleMenu } from "@tiptap/react";
8275
8296
  import StarterKit from "@tiptap/starter-kit";
8276
8297
  import Placeholder from "@tiptap/extension-placeholder";
@@ -8392,7 +8413,7 @@ function createMentionSuggestion(users) {
8392
8413
 
8393
8414
  // lib/RufousTextEditor/Toolbar.tsx
8394
8415
  import React112, { useState as useState30, useRef as useRef26, useEffect as useEffect23, useCallback as useCallback12 } from "react";
8395
- import { createPortal as createPortal3 } from "react-dom";
8416
+ import { createPortal as createPortal4 } from "react-dom";
8396
8417
 
8397
8418
  // lib/RufousTextEditor/TextToSpeech.tsx
8398
8419
  import React107, { useState as useState26, useEffect as useEffect20, useRef as useRef23, useCallback as useCallback9 } from "react";
@@ -8703,7 +8724,7 @@ var SpeechToText_default = SpeechToText;
8703
8724
 
8704
8725
  // lib/RufousTextEditor/AICommands.tsx
8705
8726
  import React109, { useState as useState28, useRef as useRef25, useEffect as useEffect22, useCallback as useCallback11 } from "react";
8706
- import { createPortal } from "react-dom";
8727
+ import { createPortal as createPortal2 } from "react-dom";
8707
8728
  var AI_COMMANDS = [
8708
8729
  { 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." },
8709
8730
  { 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." },
@@ -8860,7 +8881,7 @@ var AICommands = ({ editor, onAICommand }) => {
8860
8881
  onClick: () => handleCommandSelect(cmd)
8861
8882
  },
8862
8883
  cmd.label
8863
- ))), /* @__PURE__ */ React109.createElement("div", { className: "ai-commands-hint" }, editor.state.selection.empty ? "Will apply to all text" : "Will apply to selected text"))), showModal && createPortal(
8884
+ ))), /* @__PURE__ */ React109.createElement("div", { className: "ai-commands-hint" }, editor.state.selection.empty ? "Will apply to all text" : "Will apply to selected text"))), showModal && createPortal2(
8864
8885
  /* @__PURE__ */ React109.createElement("div", { className: "ai-modal-overlay", onMouseDown: handleCancel }, /* @__PURE__ */ React109.createElement("div", { className: "ai-modal", onMouseDown: (e) => e.stopPropagation() }, /* @__PURE__ */ React109.createElement("div", { className: "ai-modal-header" }, /* @__PURE__ */ React109.createElement("span", { className: "ai-modal-title" }, "AI Assistant"), /* @__PURE__ */ React109.createElement("button", { className: "ai-modal-close", onClick: handleCancel }, "\xD7")), /* @__PURE__ */ React109.createElement("div", { className: "ai-modal-prompt-section" }, /* @__PURE__ */ React109.createElement("label", { className: "ai-modal-label" }, "Prompt"), /* @__PURE__ */ React109.createElement("div", { className: "ai-modal-prompt-row" }, /* @__PURE__ */ React109.createElement(
8865
8886
  "textarea",
8866
8887
  {
@@ -8911,7 +8932,7 @@ var AICommands_default = AICommands;
8911
8932
 
8912
8933
  // lib/RufousTextEditor/TranslateModal.tsx
8913
8934
  import React110, { useState as useState29, useMemo as useMemo3 } from "react";
8914
- import { createPortal as createPortal2 } from "react-dom";
8935
+ import { createPortal as createPortal3 } from "react-dom";
8915
8936
  var LANGUAGES = [
8916
8937
  { code: "af", name: "Afrikaans" },
8917
8938
  { code: "sq", name: "Albanian" },
@@ -9102,7 +9123,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
9102
9123
  setTranslating(false);
9103
9124
  }
9104
9125
  };
9105
- return createPortal2(
9126
+ return createPortal3(
9106
9127
  /* @__PURE__ */ React110.createElement("div", { className: "modal-overlay", onClick: onClose }, /* @__PURE__ */ React110.createElement("div", { className: "modal-content translate-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React110.createElement("div", { className: "modal-header" }, /* @__PURE__ */ React110.createElement("h3", null, "Translate options"), /* @__PURE__ */ React110.createElement("button", { className: "modal-close", onClick: onClose }, "\xD7")), /* @__PURE__ */ React110.createElement("div", { className: "modal-body" }, /* @__PURE__ */ React110.createElement("div", { className: "translate-columns" }, /* @__PURE__ */ React110.createElement("div", { className: "translate-col" }, /* @__PURE__ */ React110.createElement("div", { className: "translate-filter" }, /* @__PURE__ */ React110.createElement(
9107
9128
  "input",
9108
9129
  {
@@ -10012,7 +10033,7 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10012
10033
  },
10013
10034
  trigger.label,
10014
10035
  /* @__PURE__ */ React112.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
10015
- ), open && createPortal3(
10036
+ ), open && createPortal4(
10016
10037
  /* @__PURE__ */ React112.createElement("div", { className: "rf-rte-wrapper rf-rte-dropdown-portal" }, /* @__PURE__ */ React112.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children)),
10017
10038
  document.body
10018
10039
  ));
@@ -10914,7 +10935,7 @@ var Toolbar_default = Toolbar;
10914
10935
 
10915
10936
  // lib/RufousTextEditor/ImageToolbar.tsx
10916
10937
  import React113, { useState as useState31, useEffect as useEffect24, useRef as useRef27 } from "react";
10917
- import { createPortal as createPortal4 } from "react-dom";
10938
+ import { createPortal as createPortal5 } from "react-dom";
10918
10939
  var ALIGNMENTS = [
10919
10940
  { value: "left", label: "Left", icon: "\u2630" },
10920
10941
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11086,7 +11107,7 @@ var ImageToolbar = ({ editor }) => {
11086
11107
  }, [editor]);
11087
11108
  const node = editor?.state.selection.node;
11088
11109
  const isImage = node && node.type.name === "image";
11089
- if (!editor || !isImage || !pos) return showModal ? createPortal4(
11110
+ if (!editor || !isImage || !pos) return showModal ? createPortal5(
11090
11111
  /* @__PURE__ */ React113.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11091
11112
  document.body
11092
11113
  ) : null;
@@ -11163,7 +11184,7 @@ var ImageToolbar = ({ editor }) => {
11163
11184
  );
11164
11185
  setShowVAlign(false);
11165
11186
  };
11166
- return createPortal4(
11187
+ return createPortal5(
11167
11188
  /* @__PURE__ */ React113.createElement(React113.Fragment, null, /* @__PURE__ */ React113.createElement(
11168
11189
  "div",
11169
11190
  {
@@ -11194,7 +11215,7 @@ var ImageToolbar_default = ImageToolbar;
11194
11215
 
11195
11216
  // lib/RufousTextEditor/VideoToolbar.tsx
11196
11217
  import React114, { useState as useState32, useEffect as useEffect25, useRef as useRef28 } from "react";
11197
- import { createPortal as createPortal5 } from "react-dom";
11218
+ import { createPortal as createPortal6 } from "react-dom";
11198
11219
  var ALIGNMENTS2 = [
11199
11220
  { value: "left", label: "Left", icon: "\u2630" },
11200
11221
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11340,7 +11361,7 @@ var VideoToolbar = ({ editor }) => {
11340
11361
  const node = editor?.state.selection.node;
11341
11362
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11342
11363
  const nodeType = node?.type.name;
11343
- if (!editor || !isVideo || !pos) return showModal ? createPortal5(
11364
+ if (!editor || !isVideo || !pos) return showModal ? createPortal6(
11344
11365
  /* @__PURE__ */ React114.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11345
11366
  document.body
11346
11367
  ) : null;
@@ -11387,7 +11408,7 @@ var VideoToolbar = ({ editor }) => {
11387
11408
  })
11388
11409
  );
11389
11410
  };
11390
- return createPortal5(
11411
+ return createPortal6(
11391
11412
  /* @__PURE__ */ React114.createElement(React114.Fragment, null, /* @__PURE__ */ React114.createElement(
11392
11413
  "div",
11393
11414
  {
@@ -12006,7 +12027,7 @@ var RufousTextEditor = ({
12006
12027
  },
12007
12028
  "\u201C Quote"
12008
12029
  )
12009
- ), /* @__PURE__ */ React115.createElement("div", { className: "status-bar" }, /* @__PURE__ */ React115.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ React115.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ React115.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ React115.createElement(React115.Fragment, null, /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && createPortal6(
12030
+ ), /* @__PURE__ */ React115.createElement("div", { className: "status-bar" }, /* @__PURE__ */ React115.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ React115.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ React115.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ React115.createElement(React115.Fragment, null, /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && createPortal7(
12010
12031
  /* @__PURE__ */ React115.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ React115.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ React115.createElement(
12011
12032
  "input",
12012
12033
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.2.65",
4
+ "version": "0.2.66",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",