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