@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 +379 -179
- package/dist/main.css +83 -2
- package/dist/main.js +355 -155
- package/package.json +1 -1
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
|
-
|
|
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 &&
|
|
2794
|
-
|
|
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
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
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
|
|
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
|
-
),
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8339
|
-
var
|
|
8340
|
-
var
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
11670
|
-
const onChangeRef = (0,
|
|
11671
|
-
const onBlurRef = (0,
|
|
11672
|
-
(0,
|
|
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,
|
|
11868
|
+
(0, import_react59.useEffect)(() => {
|
|
11676
11869
|
onBlurRef.current = onBlur;
|
|
11677
11870
|
}, [onBlur]);
|
|
11678
11871
|
const isEditable = editable && !disabled;
|
|
11679
|
-
const editor = (0,
|
|
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,
|
|
11775
|
-
(0,
|
|
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,
|
|
11794
|
-
const [linkModalOpen, setLinkModalOpen] = (0,
|
|
11795
|
-
const [linkUrl, setLinkUrl] = (0,
|
|
11796
|
-
const [linkText, setLinkText] = (0,
|
|
11797
|
-
const [linkClassName, setLinkClassName] = (0,
|
|
11798
|
-
const [linkNewTab, setLinkNewTab] = (0,
|
|
11799
|
-
const [linkNoFollow, setLinkNoFollow] = (0,
|
|
11800
|
-
const [linkSelection, setLinkSelection] = (0,
|
|
11801
|
-
const setLink = (0,
|
|
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,
|
|
12033
|
+
(0, import_react59.useEffect)(() => {
|
|
11839
12034
|
setLinkRef.current = setLink;
|
|
11840
12035
|
}, [setLink]);
|
|
11841
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
11927
|
-
const handleSave = (0,
|
|
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,
|
|
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,
|
|
11938
|
-
|
|
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__ */
|
|
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__ */
|
|
11963
|
-
|
|
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__ */
|
|
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__ */
|
|
12185
|
+
/* @__PURE__ */ import_react59.default.createElement("strong", null, "B")
|
|
11987
12186
|
),
|
|
11988
|
-
/* @__PURE__ */
|
|
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__ */
|
|
12193
|
+
/* @__PURE__ */ import_react59.default.createElement("em", null, "I")
|
|
11995
12194
|
),
|
|
11996
|
-
/* @__PURE__ */
|
|
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__ */
|
|
12201
|
+
/* @__PURE__ */ import_react59.default.createElement("s", null, "S")
|
|
12003
12202
|
),
|
|
12004
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
12021
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
12076
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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,
|
|
12124
|
-
return /* @__PURE__ */
|
|
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 || ""}`,
|