@underverse-ui/underverse 0.2.79 → 0.2.81

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/index.cjs CHANGED
@@ -15306,9 +15306,9 @@ function useSmartLocale() {
15306
15306
  }
15307
15307
 
15308
15308
  // ../../components/ui/UEditor/UEditor.tsx
15309
- var import_react44 = require("react");
15309
+ var import_react46 = require("react");
15310
15310
  var import_next_intl6 = require("next-intl");
15311
- var import_react45 = require("@tiptap/react");
15311
+ var import_react47 = require("@tiptap/react");
15312
15312
 
15313
15313
  // ../../components/ui/UEditor/extensions.ts
15314
15314
  var import_extension_document = __toESM(require("@tiptap/extension-document"), 1);
@@ -15330,7 +15330,6 @@ var import_extension_code_block_lowlight = __toESM(require("@tiptap/extension-co
15330
15330
  var import_extension_history = __toESM(require("@tiptap/extension-history"), 1);
15331
15331
  var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
15332
15332
  var import_extension_link = __toESM(require("@tiptap/extension-link"), 1);
15333
- var import_extension_image = __toESM(require("@tiptap/extension-image"), 1);
15334
15333
  var import_extension_text_style = require("@tiptap/extension-text-style");
15335
15334
  var import_extension_color = __toESM(require("@tiptap/extension-color"), 1);
15336
15335
  var import_extension_highlight = __toESM(require("@tiptap/extension-highlight"), 1);
@@ -18624,6 +18623,7 @@ function createKey(name) {
18624
18623
  // ../../components/ui/UEditor/clipboard-images.ts
18625
18624
  function getImageFiles(dataTransfer) {
18626
18625
  if (!dataTransfer) return [];
18626
+ const itemFiles = [];
18627
18627
  const byKey = /* @__PURE__ */ new Map();
18628
18628
  for (const item of Array.from(dataTransfer.items ?? [])) {
18629
18629
  if (item.kind !== "file") continue;
@@ -18632,6 +18632,8 @@ function getImageFiles(dataTransfer) {
18632
18632
  if (!file) continue;
18633
18633
  byKey.set(`${file.name}:${file.size}:${file.lastModified}`, file);
18634
18634
  }
18635
+ itemFiles.push(...Array.from(byKey.values()));
18636
+ if (itemFiles.length > 0) return itemFiles;
18635
18637
  for (const file of Array.from(dataTransfer.files ?? [])) {
18636
18638
  if (!file.type.startsWith("image/")) continue;
18637
18639
  byKey.set(`${file.name}:${file.size}:${file.lastModified}`, file);
@@ -18711,13 +18713,229 @@ var ClipboardImages = import_core2.Extension.create({
18711
18713
  }
18712
18714
  });
18713
18715
 
18716
+ // ../../components/ui/UEditor/resizable-image.tsx
18717
+ var import_react40 = require("react");
18718
+ var import_extension_image = __toESM(require("@tiptap/extension-image"), 1);
18719
+ var import_core3 = require("@tiptap/core");
18720
+ var import_react41 = require("@tiptap/react");
18721
+ var import_jsx_runtime69 = require("react/jsx-runtime");
18722
+ var MIN_IMAGE_SIZE_PX = 40;
18723
+ var AXIS_LOCK_THRESHOLD_PX = 4;
18724
+ function toNullableNumber(value) {
18725
+ if (typeof value === "number" && Number.isFinite(value)) return value;
18726
+ if (typeof value === "string") {
18727
+ const parsed = Number.parseInt(value, 10);
18728
+ return Number.isFinite(parsed) ? parsed : null;
18729
+ }
18730
+ return null;
18731
+ }
18732
+ function clamp4(value, min, max) {
18733
+ return Math.min(max, Math.max(min, value));
18734
+ }
18735
+ function ResizableImageNodeView(props) {
18736
+ const { node, selected, updateAttributes, editor, getPos } = props;
18737
+ const wrapperRef = (0, import_react40.useRef)(null);
18738
+ const imgRef = (0, import_react40.useRef)(null);
18739
+ const [isHovered, setIsHovered] = (0, import_react40.useState)(false);
18740
+ const [isResizing, setIsResizing] = (0, import_react40.useState)(false);
18741
+ const widthAttr = toNullableNumber(node.attrs["width"]);
18742
+ const heightAttr = toNullableNumber(node.attrs["height"]);
18743
+ const textAlign = String(node.attrs["textAlign"] ?? "");
18744
+ const dragStateRef = (0, import_react40.useRef)(null);
18745
+ (0, import_react40.useEffect)(() => {
18746
+ const img = imgRef.current;
18747
+ if (!img) return;
18748
+ img.style.width = widthAttr ? `${widthAttr}px` : "";
18749
+ img.style.height = heightAttr ? `${heightAttr}px` : "";
18750
+ }, [widthAttr, heightAttr]);
18751
+ const selectNode = () => {
18752
+ const pos = typeof getPos === "function" ? getPos() : null;
18753
+ if (typeof pos === "number") editor.commands.setNodeSelection(pos);
18754
+ };
18755
+ const onResizePointerDown = (event) => {
18756
+ event.preventDefault();
18757
+ event.stopPropagation();
18758
+ const img = imgRef.current;
18759
+ const wrapper = wrapperRef.current;
18760
+ if (!img || !wrapper) return;
18761
+ selectNode();
18762
+ const rect = img.getBoundingClientRect();
18763
+ const editorEl = wrapper.closest(".ProseMirror");
18764
+ const maxW = editorEl ? editorEl.getBoundingClientRect().width : Number.POSITIVE_INFINITY;
18765
+ const startW = Math.max(MIN_IMAGE_SIZE_PX, rect.width);
18766
+ const startH = Math.max(MIN_IMAGE_SIZE_PX, rect.height);
18767
+ const aspect = startH > 0 ? startW / startH : 1;
18768
+ dragStateRef.current = {
18769
+ pointerId: event.pointerId,
18770
+ startX: event.clientX,
18771
+ startY: event.clientY,
18772
+ startW,
18773
+ startH,
18774
+ lastW: startW,
18775
+ lastH: startH,
18776
+ axis: null,
18777
+ aspect,
18778
+ maxW: Math.max(MIN_IMAGE_SIZE_PX, maxW)
18779
+ };
18780
+ setIsResizing(true);
18781
+ event.currentTarget.setPointerCapture(event.pointerId);
18782
+ };
18783
+ const onResizePointerMove = (event) => {
18784
+ const drag = dragStateRef.current;
18785
+ const img = imgRef.current;
18786
+ if (!drag || !img) return;
18787
+ if (event.pointerId !== drag.pointerId) return;
18788
+ const dx = event.clientX - drag.startX;
18789
+ const dy = event.clientY - drag.startY;
18790
+ let nextW = drag.startW;
18791
+ let nextH = drag.startH;
18792
+ if (event.ctrlKey) {
18793
+ if (Math.abs(dx) >= Math.abs(dy)) {
18794
+ nextW = clamp4(drag.startW + dx, MIN_IMAGE_SIZE_PX, drag.maxW);
18795
+ nextH = clamp4(nextW / drag.aspect, MIN_IMAGE_SIZE_PX, Number.POSITIVE_INFINITY);
18796
+ } else {
18797
+ nextH = clamp4(drag.startH + dy, MIN_IMAGE_SIZE_PX, Number.POSITIVE_INFINITY);
18798
+ nextW = clamp4(nextH * drag.aspect, MIN_IMAGE_SIZE_PX, drag.maxW);
18799
+ }
18800
+ } else {
18801
+ if (!drag.axis && (Math.abs(dx) > AXIS_LOCK_THRESHOLD_PX || Math.abs(dy) > AXIS_LOCK_THRESHOLD_PX)) {
18802
+ drag.axis = Math.abs(dx) >= Math.abs(dy) ? "x" : "y";
18803
+ }
18804
+ if (drag.axis === "x") nextW = clamp4(drag.startW + dx, MIN_IMAGE_SIZE_PX, drag.maxW);
18805
+ if (drag.axis === "y") nextH = clamp4(drag.startH + dy, MIN_IMAGE_SIZE_PX, Number.POSITIVE_INFINITY);
18806
+ }
18807
+ drag.lastW = nextW;
18808
+ drag.lastH = nextH;
18809
+ img.style.width = `${Math.round(nextW)}px`;
18810
+ img.style.height = `${Math.round(nextH)}px`;
18811
+ };
18812
+ const finishResize = () => {
18813
+ const drag = dragStateRef.current;
18814
+ dragStateRef.current = null;
18815
+ setIsResizing(false);
18816
+ if (!drag) return;
18817
+ updateAttributes({
18818
+ width: Math.round(drag.lastW),
18819
+ height: Math.round(drag.lastH)
18820
+ });
18821
+ };
18822
+ const onResizePointerUp = (event) => {
18823
+ const drag = dragStateRef.current;
18824
+ if (!drag || event.pointerId !== drag.pointerId) return;
18825
+ event.preventDefault();
18826
+ event.stopPropagation();
18827
+ finishResize();
18828
+ };
18829
+ const onResizePointerCancel = (event) => {
18830
+ const drag = dragStateRef.current;
18831
+ if (!drag || event.pointerId !== drag.pointerId) return;
18832
+ event.preventDefault();
18833
+ event.stopPropagation();
18834
+ finishResize();
18835
+ };
18836
+ const showHandle = selected || isHovered || isResizing;
18837
+ const wrapperAlignClass = textAlign === "center" ? "mx-auto" : textAlign === "right" ? "ml-auto" : textAlign === "justify" ? "mx-auto" : "";
18838
+ const wrapperWidthClass = "w-fit";
18839
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
18840
+ import_react41.NodeViewWrapper,
18841
+ {
18842
+ as: "div",
18843
+ ref: wrapperRef,
18844
+ className: ["relative block align-middle max-w-full my-4", wrapperWidthClass, wrapperAlignClass].filter(Boolean).join(" "),
18845
+ onMouseEnter: () => setIsHovered(true),
18846
+ onMouseLeave: () => setIsHovered(false),
18847
+ onClick: (e) => {
18848
+ e.stopPropagation();
18849
+ selectNode();
18850
+ },
18851
+ contentEditable: false,
18852
+ children: [
18853
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
18854
+ "img",
18855
+ {
18856
+ ref: imgRef,
18857
+ src: String(node.attrs["src"] ?? ""),
18858
+ alt: String(node.attrs["alt"] ?? ""),
18859
+ title: String(node.attrs["title"] ?? ""),
18860
+ draggable: "true",
18861
+ className: [
18862
+ "block rounded-lg max-w-full",
18863
+ selected ? "ring-2 ring-primary/60 ring-offset-2 ring-offset-background" : "",
18864
+ isResizing ? "select-none" : ""
18865
+ ].join(" "),
18866
+ style: {
18867
+ width: widthAttr ? `${widthAttr}px` : void 0,
18868
+ height: heightAttr ? `${heightAttr}px` : void 0
18869
+ }
18870
+ }
18871
+ ),
18872
+ showHandle && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
18873
+ "div",
18874
+ {
18875
+ "aria-hidden": "true",
18876
+ onPointerDown: onResizePointerDown,
18877
+ onPointerMove: onResizePointerMove,
18878
+ onPointerUp: onResizePointerUp,
18879
+ onPointerCancel: onResizePointerCancel,
18880
+ className: [
18881
+ "absolute -right-1 -bottom-1 h-3 w-3 rounded-sm",
18882
+ "bg-primary border border-background shadow-sm",
18883
+ "cursor-nwse-resize",
18884
+ "opacity-90 hover:opacity-100"
18885
+ ].join(" ")
18886
+ }
18887
+ )
18888
+ ]
18889
+ }
18890
+ );
18891
+ }
18892
+ var ResizableImage = import_extension_image.default.extend({
18893
+ addAttributes() {
18894
+ const parentAttrs = this.parent?.() ?? {};
18895
+ return {
18896
+ ...parentAttrs,
18897
+ width: {
18898
+ default: null,
18899
+ parseHTML: (element) => {
18900
+ const raw = element.getAttribute("width") || element.style.width || "";
18901
+ const parsed = Number.parseInt(raw, 10);
18902
+ return Number.isFinite(parsed) ? parsed : null;
18903
+ },
18904
+ renderHTML: (attrs) => typeof attrs.width === "number" ? { width: attrs.width } : {}
18905
+ },
18906
+ height: {
18907
+ default: null,
18908
+ parseHTML: (element) => {
18909
+ const raw = element.getAttribute("height") || element.style.height || "";
18910
+ const parsed = Number.parseInt(raw, 10);
18911
+ return Number.isFinite(parsed) ? parsed : null;
18912
+ },
18913
+ renderHTML: (attrs) => typeof attrs.height === "number" ? { height: attrs.height } : {}
18914
+ }
18915
+ };
18916
+ },
18917
+ renderHTML({ HTMLAttributes: HTMLAttributes2 }) {
18918
+ return ["img", (0, import_core3.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes2)];
18919
+ },
18920
+ addNodeView() {
18921
+ return (0, import_react41.ReactNodeViewRenderer)(ResizableImageNodeView);
18922
+ }
18923
+ }).configure({
18924
+ allowBase64: true,
18925
+ HTMLAttributes: {
18926
+ class: "rounded-lg max-w-full my-4"
18927
+ }
18928
+ });
18929
+ var resizable_image_default = ResizableImage;
18930
+
18714
18931
  // ../../components/ui/UEditor/extensions.ts
18715
18932
  var lowlight = (0, import_lowlight.createLowlight)(import_lowlight.common);
18716
18933
  function buildUEditorExtensions({
18717
18934
  placeholder,
18718
18935
  maxCharacters,
18719
18936
  uploadImage,
18720
- imageInsertMode = "base64"
18937
+ imageInsertMode = "base64",
18938
+ editable = true
18721
18939
  }) {
18722
18940
  return [
18723
18941
  import_extension_document.default,
@@ -18774,12 +18992,7 @@ function buildUEditorExtensions({
18774
18992
  class: "text-primary underline underline-offset-2 hover:text-primary/80 cursor-pointer"
18775
18993
  }
18776
18994
  }),
18777
- import_extension_image.default.configure({
18778
- allowBase64: true,
18779
- HTMLAttributes: {
18780
- class: "rounded-lg max-w-full h-auto my-4"
18781
- }
18782
- }),
18995
+ resizable_image_default,
18783
18996
  ClipboardImages.configure({ upload: uploadImage, insertMode: imageInsertMode }),
18784
18997
  import_extension_text_style.TextStyle,
18785
18998
  import_extension_color.default,
@@ -18787,7 +19000,7 @@ function buildUEditorExtensions({
18787
19000
  multicolor: true
18788
19001
  }),
18789
19002
  import_extension_text_align.default.configure({
18790
- types: ["heading", "paragraph"]
19003
+ types: ["heading", "paragraph", "image"]
18791
19004
  }),
18792
19005
  import_extension_table.Table.configure({
18793
19006
  resizable: true,
@@ -18821,18 +19034,18 @@ function buildUEditorExtensions({
18821
19034
  }
18822
19035
 
18823
19036
  // ../../components/ui/UEditor/toolbar.tsx
18824
- var import_react42 = __toESM(require("react"), 1);
19037
+ var import_react44 = __toESM(require("react"), 1);
18825
19038
  var import_next_intl3 = require("next-intl");
18826
19039
  var import_lucide_react36 = require("lucide-react");
18827
19040
 
18828
19041
  // ../../components/ui/UEditor/colors.tsx
18829
- var import_react40 = require("react");
19042
+ var import_react42 = require("react");
18830
19043
  var import_next_intl = require("next-intl");
18831
19044
  var import_lucide_react34 = require("lucide-react");
18832
- var import_jsx_runtime69 = require("react/jsx-runtime");
19045
+ var import_jsx_runtime70 = require("react/jsx-runtime");
18833
19046
  var useEditorColors = () => {
18834
19047
  const t = (0, import_next_intl.useTranslations)("UEditor");
18835
- const textColors = (0, import_react40.useMemo)(
19048
+ const textColors = (0, import_react42.useMemo)(
18836
19049
  () => [
18837
19050
  { name: t("colors.default"), color: "inherit", cssClass: "text-foreground" },
18838
19051
  { name: t("colors.muted"), color: "var(--muted-foreground)", cssClass: "text-muted-foreground" },
@@ -18845,7 +19058,7 @@ var useEditorColors = () => {
18845
19058
  ],
18846
19059
  [t]
18847
19060
  );
18848
- const highlightColors = (0, import_react40.useMemo)(
19061
+ const highlightColors = (0, import_react42.useMemo)(
18849
19062
  () => [
18850
19063
  { name: t("colors.default"), color: "", cssClass: "" },
18851
19064
  { name: t("colors.muted"), color: "var(--muted)", cssClass: "bg-muted" },
@@ -18866,9 +19079,9 @@ var EditorColorPalette = ({
18866
19079
  currentColor,
18867
19080
  onSelect,
18868
19081
  label
18869
- }) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "p-2", children: [
18870
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider px-2", children: label }),
18871
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "grid grid-cols-4 gap-1.5 mt-2", children: colors.map((c) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
19082
+ }) => /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "p-2", children: [
19083
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider px-2", children: label }),
19084
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "grid grid-cols-4 gap-1.5 mt-2", children: colors.map((c) => /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
18872
19085
  "button",
18873
19086
  {
18874
19087
  type: "button",
@@ -18881,8 +19094,8 @@ var EditorColorPalette = ({
18881
19094
  style: { backgroundColor: c.color || "transparent" },
18882
19095
  title: c.name,
18883
19096
  children: [
18884
- c.color === "" && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react34.X, { className: "w-4 h-4 text-muted-foreground" }),
18885
- c.color === "inherit" && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "text-xs font-medium", children: "A" })
19097
+ c.color === "" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_lucide_react34.X, { className: "w-4 h-4 text-muted-foreground" }),
19098
+ c.color === "inherit" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "text-xs font-medium", children: "A" })
18886
19099
  ]
18887
19100
  },
18888
19101
  c.name
@@ -18890,30 +19103,36 @@ var EditorColorPalette = ({
18890
19103
  ] });
18891
19104
 
18892
19105
  // ../../components/ui/UEditor/inputs.tsx
18893
- var import_react41 = require("react");
19106
+ var import_react43 = require("react");
18894
19107
  var import_next_intl2 = require("next-intl");
18895
19108
  var import_lucide_react35 = require("lucide-react");
18896
- var import_jsx_runtime70 = require("react/jsx-runtime");
19109
+ var import_jsx_runtime71 = require("react/jsx-runtime");
19110
+ function normalizeUrl(raw) {
19111
+ const url = raw.trim();
19112
+ if (!url) return "";
19113
+ if (url.startsWith("#") || url.startsWith("/")) return url;
19114
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url)) return url;
19115
+ return `https://${url}`;
19116
+ }
18897
19117
  var LinkInput = ({
18898
19118
  onSubmit,
18899
19119
  onCancel,
18900
19120
  initialUrl = ""
18901
19121
  }) => {
18902
19122
  const t = (0, import_next_intl2.useTranslations)("UEditor");
18903
- const [url, setUrl] = (0, import_react41.useState)(initialUrl);
18904
- const inputRef = (0, import_react41.useRef)(null);
18905
- (0, import_react41.useEffect)(() => {
19123
+ const [url, setUrl] = (0, import_react43.useState)(initialUrl);
19124
+ const inputRef = (0, import_react43.useRef)(null);
19125
+ (0, import_react43.useEffect)(() => {
18906
19126
  inputRef.current?.focus();
18907
19127
  inputRef.current?.select();
18908
19128
  }, []);
18909
19129
  const handleSubmit = (e) => {
18910
19130
  e.preventDefault();
18911
- if (url) {
18912
- onSubmit(url.startsWith("http") ? url : `https://${url}`);
18913
- }
19131
+ const normalized = normalizeUrl(url);
19132
+ if (normalized) onSubmit(normalized);
18914
19133
  };
18915
- return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("form", { onSubmit: handleSubmit, className: "flex items-center gap-2 p-2", children: [
18916
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
19134
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("form", { onSubmit: handleSubmit, className: "flex items-center gap-2 p-2", children: [
19135
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
18917
19136
  "input",
18918
19137
  {
18919
19138
  ref: inputRef,
@@ -18924,16 +19143,16 @@ var LinkInput = ({
18924
19143
  className: "flex-1 px-3 py-2 text-sm bg-muted/50 border-0 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary/20"
18925
19144
  }
18926
19145
  ),
18927
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("button", { type: "submit", className: "p-2 rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 transition-colors", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_lucide_react35.Check, { className: "w-4 h-4" }) }),
18928
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("button", { type: "button", onClick: onCancel, className: "p-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_lucide_react35.X, { className: "w-4 h-4" }) })
19146
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("button", { type: "submit", className: "p-2 rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 transition-colors", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react35.Check, { className: "w-4 h-4" }) }),
19147
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("button", { type: "button", onClick: onCancel, className: "p-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react35.X, { className: "w-4 h-4" }) })
18929
19148
  ] });
18930
19149
  };
18931
19150
  var ImageInput = ({ onSubmit, onCancel }) => {
18932
19151
  const t = (0, import_next_intl2.useTranslations)("UEditor");
18933
- const [url, setUrl] = (0, import_react41.useState)("");
18934
- const [alt, setAlt] = (0, import_react41.useState)("");
18935
- const inputRef = (0, import_react41.useRef)(null);
18936
- (0, import_react41.useEffect)(() => {
19152
+ const [url, setUrl] = (0, import_react43.useState)("");
19153
+ const [alt, setAlt] = (0, import_react43.useState)("");
19154
+ const inputRef = (0, import_react43.useRef)(null);
19155
+ (0, import_react43.useEffect)(() => {
18937
19156
  inputRef.current?.focus();
18938
19157
  }, []);
18939
19158
  const handleSubmit = (e) => {
@@ -18942,10 +19161,10 @@ var ImageInput = ({ onSubmit, onCancel }) => {
18942
19161
  onSubmit(url, alt);
18943
19162
  }
18944
19163
  };
18945
- return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("form", { onSubmit: handleSubmit, className: "p-3 space-y-3", children: [
18946
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { children: [
18947
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.urlLabel") }),
18948
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
19164
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("form", { onSubmit: handleSubmit, className: "p-3 space-y-3", children: [
19165
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { children: [
19166
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.urlLabel") }),
19167
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
18949
19168
  "input",
18950
19169
  {
18951
19170
  ref: inputRef,
@@ -18957,9 +19176,9 @@ var ImageInput = ({ onSubmit, onCancel }) => {
18957
19176
  }
18958
19177
  )
18959
19178
  ] }),
18960
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { children: [
18961
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.altLabel") }),
18962
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
19179
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { children: [
19180
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.altLabel") }),
19181
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
18963
19182
  "input",
18964
19183
  {
18965
19184
  type: "text",
@@ -18970,8 +19189,8 @@ var ImageInput = ({ onSubmit, onCancel }) => {
18970
19189
  }
18971
19190
  )
18972
19191
  ] }),
18973
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "flex gap-2", children: [
18974
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
19192
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "flex gap-2", children: [
19193
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
18975
19194
  "button",
18976
19195
  {
18977
19196
  type: "submit",
@@ -18980,13 +19199,13 @@ var ImageInput = ({ onSubmit, onCancel }) => {
18980
19199
  children: t("imageInput.addBtn")
18981
19200
  }
18982
19201
  ),
18983
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: t("imageInput.cancelBtn") })
19202
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: t("imageInput.cancelBtn") })
18984
19203
  ] })
18985
19204
  ] });
18986
19205
  };
18987
19206
 
18988
19207
  // ../../components/ui/UEditor/toolbar.tsx
18989
- var import_jsx_runtime71 = require("react/jsx-runtime");
19208
+ var import_jsx_runtime72 = require("react/jsx-runtime");
18990
19209
  function fileToDataUrl2(file) {
18991
19210
  return new Promise((resolve, reject) => {
18992
19211
  const reader = new FileReader();
@@ -18995,13 +19214,16 @@ function fileToDataUrl2(file) {
18995
19214
  reader.readAsDataURL(file);
18996
19215
  });
18997
19216
  }
18998
- var ToolbarButton = import_react42.default.forwardRef(({ onClick, active, disabled, children, title, className }, ref) => {
18999
- const button = /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19217
+ var ToolbarButton = import_react44.default.forwardRef(({ onClick, onMouseDown, active, disabled, children, title, className }, ref) => {
19218
+ const button = /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19000
19219
  "button",
19001
19220
  {
19002
19221
  ref,
19003
19222
  type: "button",
19004
- onMouseDown: (e) => e.preventDefault(),
19223
+ onMouseDown: (e) => {
19224
+ onMouseDown?.(e);
19225
+ e.preventDefault();
19226
+ },
19005
19227
  onClick,
19006
19228
  disabled,
19007
19229
  className: cn(
@@ -19016,12 +19238,12 @@ var ToolbarButton = import_react42.default.forwardRef(({ onClick, active, disabl
19016
19238
  }
19017
19239
  );
19018
19240
  if (title) {
19019
- return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Tooltip, { content: title, placement: "top", delay: { open: 500, close: 0 }, children: button });
19241
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Tooltip, { content: title, placement: "top", delay: { open: 500, close: 0 }, children: button });
19020
19242
  }
19021
19243
  return button;
19022
19244
  });
19023
19245
  ToolbarButton.displayName = "ToolbarButton";
19024
- var ToolbarDivider = () => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" });
19246
+ var ToolbarDivider = () => /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" });
19025
19247
  var EditorToolbar = ({
19026
19248
  editor,
19027
19249
  variant,
@@ -19030,10 +19252,10 @@ var EditorToolbar = ({
19030
19252
  }) => {
19031
19253
  const t = (0, import_next_intl3.useTranslations)("UEditor");
19032
19254
  const { textColors, highlightColors } = useEditorColors();
19033
- const [showImageInput, setShowImageInput] = (0, import_react42.useState)(false);
19034
- const fileInputRef = (0, import_react42.useRef)(null);
19035
- const [isUploadingImage, setIsUploadingImage] = (0, import_react42.useState)(false);
19036
- const [imageUploadError, setImageUploadError] = (0, import_react42.useState)(null);
19255
+ const [showImageInput, setShowImageInput] = (0, import_react44.useState)(false);
19256
+ const fileInputRef = (0, import_react44.useRef)(null);
19257
+ const [isUploadingImage, setIsUploadingImage] = (0, import_react44.useState)(false);
19258
+ const [imageUploadError, setImageUploadError] = (0, import_react44.useState)(null);
19037
19259
  const insertImageFiles = async (files) => {
19038
19260
  if (files.length === 0) return;
19039
19261
  setIsUploadingImage(true);
@@ -19052,40 +19274,40 @@ var EditorToolbar = ({
19052
19274
  setIsUploadingImage(false);
19053
19275
  };
19054
19276
  if (variant === "minimal") {
19055
- return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "flex items-center gap-1 p-2 border-b bg-muted/30", children: [
19056
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Bold, { className: "w-4 h-4" }) }),
19057
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19277
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center gap-1 p-2 border-b bg-muted/30", children: [
19278
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Bold, { className: "w-4 h-4" }) }),
19279
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19058
19280
  ToolbarButton,
19059
19281
  {
19060
19282
  onClick: () => editor.chain().focus().toggleItalic().run(),
19061
19283
  active: editor.isActive("italic"),
19062
19284
  title: t("toolbar.italic"),
19063
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Italic, { className: "w-4 h-4" })
19285
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Italic, { className: "w-4 h-4" })
19064
19286
  }
19065
19287
  ),
19066
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19288
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19067
19289
  ToolbarButton,
19068
19290
  {
19069
19291
  onClick: () => editor.chain().focus().toggleBulletList().run(),
19070
19292
  active: editor.isActive("bulletList"),
19071
19293
  title: t("toolbar.bulletList"),
19072
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.List, { className: "w-4 h-4" })
19294
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.List, { className: "w-4 h-4" })
19073
19295
  }
19074
19296
  )
19075
19297
  ] });
19076
19298
  }
19077
- return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "flex flex-wrap items-center gap-1 p-2 border-b bg-linear-to-r from-muted/30 to-transparent", children: [
19078
- /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
19299
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex flex-wrap items-center gap-1 p-2 border-b bg-linear-to-r from-muted/30 to-transparent", children: [
19300
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19079
19301
  DropdownMenu,
19080
19302
  {
19081
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19303
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19082
19304
  }, title: t("toolbar.textStyle"), className: "px-2 w-auto gap-1", children: [
19083
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Type, { className: "w-4 h-4" }),
19084
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19305
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Type, { className: "w-4 h-4" }),
19306
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19085
19307
  ] }),
19086
19308
  children: [
19087
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Type, label: t("toolbar.normal"), onClick: () => editor.chain().focus().setParagraph().run(), active: editor.isActive("paragraph") }),
19088
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19309
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Type, label: t("toolbar.normal"), onClick: () => editor.chain().focus().setParagraph().run(), active: editor.isActive("paragraph") }),
19310
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19089
19311
  DropdownMenuItem,
19090
19312
  {
19091
19313
  icon: import_lucide_react36.Heading1,
@@ -19095,7 +19317,7 @@ var EditorToolbar = ({
19095
19317
  shortcut: "Ctrl+Alt+1"
19096
19318
  }
19097
19319
  ),
19098
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19320
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19099
19321
  DropdownMenuItem,
19100
19322
  {
19101
19323
  icon: import_lucide_react36.Heading2,
@@ -19105,7 +19327,7 @@ var EditorToolbar = ({
19105
19327
  shortcut: "Ctrl+Alt+2"
19106
19328
  }
19107
19329
  ),
19108
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19330
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19109
19331
  DropdownMenuItem,
19110
19332
  {
19111
19333
  icon: import_lucide_react36.Heading3,
@@ -19118,46 +19340,46 @@ var EditorToolbar = ({
19118
19340
  ]
19119
19341
  }
19120
19342
  ),
19121
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19122
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Bold, { className: "w-4 h-4" }) }),
19123
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19343
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19344
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Bold, { className: "w-4 h-4" }) }),
19345
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19124
19346
  ToolbarButton,
19125
19347
  {
19126
19348
  onClick: () => editor.chain().focus().toggleItalic().run(),
19127
19349
  active: editor.isActive("italic"),
19128
19350
  title: t("toolbar.italic"),
19129
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Italic, { className: "w-4 h-4" })
19351
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Italic, { className: "w-4 h-4" })
19130
19352
  }
19131
19353
  ),
19132
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19354
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19133
19355
  ToolbarButton,
19134
19356
  {
19135
19357
  onClick: () => editor.chain().focus().toggleUnderline().run(),
19136
19358
  active: editor.isActive("underline"),
19137
19359
  title: t("toolbar.underline"),
19138
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Underline, { className: "w-4 h-4" })
19360
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Underline, { className: "w-4 h-4" })
19139
19361
  }
19140
19362
  ),
19141
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19363
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19142
19364
  ToolbarButton,
19143
19365
  {
19144
19366
  onClick: () => editor.chain().focus().toggleStrike().run(),
19145
19367
  active: editor.isActive("strike"),
19146
19368
  title: t("toolbar.strike"),
19147
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Strikethrough, { className: "w-4 h-4" })
19369
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Strikethrough, { className: "w-4 h-4" })
19148
19370
  }
19149
19371
  ),
19150
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Code, { className: "w-4 h-4" }) }),
19151
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19152
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19372
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Code, { className: "w-4 h-4" }) }),
19373
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19374
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19153
19375
  DropdownMenu,
19154
19376
  {
19155
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19377
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19156
19378
  }, title: t("colors.textColor"), children: [
19157
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Palette, { className: "w-4 h-4" }),
19158
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19379
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Palette, { className: "w-4 h-4" }),
19380
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19159
19381
  ] }),
19160
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19382
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19161
19383
  EditorColorPalette,
19162
19384
  {
19163
19385
  colors: textColors,
@@ -19174,15 +19396,15 @@ var EditorToolbar = ({
19174
19396
  )
19175
19397
  }
19176
19398
  ),
19177
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19399
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19178
19400
  DropdownMenu,
19179
19401
  {
19180
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19402
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19181
19403
  }, active: editor.isActive("highlight"), title: t("colors.highlight"), children: [
19182
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Highlighter, { className: "w-4 h-4" }),
19183
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19404
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Highlighter, { className: "w-4 h-4" }),
19405
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19184
19406
  ] }),
19185
- children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19407
+ children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19186
19408
  EditorColorPalette,
19187
19409
  {
19188
19410
  colors: highlightColors,
@@ -19199,17 +19421,17 @@ var EditorToolbar = ({
19199
19421
  )
19200
19422
  }
19201
19423
  ),
19202
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19203
- /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
19424
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19425
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19204
19426
  DropdownMenu,
19205
19427
  {
19206
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19428
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19207
19429
  }, title: t("toolbar.alignment"), children: [
19208
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.AlignLeft, { className: "w-4 h-4" }),
19209
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19430
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.AlignLeft, { className: "w-4 h-4" }),
19431
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19210
19432
  ] }),
19211
19433
  children: [
19212
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19434
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19213
19435
  DropdownMenuItem,
19214
19436
  {
19215
19437
  icon: import_lucide_react36.AlignLeft,
@@ -19218,7 +19440,7 @@ var EditorToolbar = ({
19218
19440
  active: editor.isActive({ textAlign: "left" })
19219
19441
  }
19220
19442
  ),
19221
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19443
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19222
19444
  DropdownMenuItem,
19223
19445
  {
19224
19446
  icon: import_lucide_react36.AlignCenter,
@@ -19227,7 +19449,7 @@ var EditorToolbar = ({
19227
19449
  active: editor.isActive({ textAlign: "center" })
19228
19450
  }
19229
19451
  ),
19230
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19452
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19231
19453
  DropdownMenuItem,
19232
19454
  {
19233
19455
  icon: import_lucide_react36.AlignRight,
@@ -19236,7 +19458,7 @@ var EditorToolbar = ({
19236
19458
  active: editor.isActive({ textAlign: "right" })
19237
19459
  }
19238
19460
  ),
19239
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19461
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19240
19462
  DropdownMenuItem,
19241
19463
  {
19242
19464
  icon: import_lucide_react36.AlignJustify,
@@ -19248,17 +19470,17 @@ var EditorToolbar = ({
19248
19470
  ]
19249
19471
  }
19250
19472
  ),
19251
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19252
- /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
19473
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19474
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19253
19475
  DropdownMenu,
19254
19476
  {
19255
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19477
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19256
19478
  }, title: t("toolbar.bulletList"), children: [
19257
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.List, { className: "w-4 h-4" }),
19258
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19479
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.List, { className: "w-4 h-4" }),
19480
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19259
19481
  ] }),
19260
19482
  children: [
19261
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19483
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19262
19484
  DropdownMenuItem,
19263
19485
  {
19264
19486
  icon: import_lucide_react36.List,
@@ -19268,7 +19490,7 @@ var EditorToolbar = ({
19268
19490
  shortcut: "Ctrl+Shift+8"
19269
19491
  }
19270
19492
  ),
19271
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19493
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19272
19494
  DropdownMenuItem,
19273
19495
  {
19274
19496
  icon: import_lucide_react36.ListOrdered,
@@ -19278,7 +19500,7 @@ var EditorToolbar = ({
19278
19500
  shortcut: "Ctrl+Shift+7"
19279
19501
  }
19280
19502
  ),
19281
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19503
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19282
19504
  DropdownMenuItem,
19283
19505
  {
19284
19506
  icon: import_lucide_react36.ListTodo,
@@ -19291,16 +19513,16 @@ var EditorToolbar = ({
19291
19513
  ]
19292
19514
  }
19293
19515
  ),
19294
- /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
19516
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19295
19517
  DropdownMenu,
19296
19518
  {
19297
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19519
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19298
19520
  }, title: t("toolbar.quote"), children: [
19299
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Quote, { className: "w-4 h-4" }),
19300
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19521
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Quote, { className: "w-4 h-4" }),
19522
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19301
19523
  ] }),
19302
19524
  children: [
19303
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19525
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19304
19526
  DropdownMenuItem,
19305
19527
  {
19306
19528
  icon: import_lucide_react36.Quote,
@@ -19310,7 +19532,7 @@ var EditorToolbar = ({
19310
19532
  shortcut: "Ctrl+Shift+B"
19311
19533
  }
19312
19534
  ),
19313
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19535
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19314
19536
  DropdownMenuItem,
19315
19537
  {
19316
19538
  icon: import_lucide_react36.FileCode,
@@ -19323,15 +19545,15 @@ var EditorToolbar = ({
19323
19545
  ]
19324
19546
  }
19325
19547
  ),
19326
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19548
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19327
19549
  DropdownMenu,
19328
19550
  {
19329
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19551
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19330
19552
  }, title: t("toolbar.image"), children: [
19331
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Image, { className: "w-4 h-4" }),
19332
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19553
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Image, { className: "w-4 h-4" }),
19554
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19333
19555
  ] }),
19334
- children: showImageInput ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19556
+ children: showImageInput ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19335
19557
  ImageInput,
19336
19558
  {
19337
19559
  onSubmit: (url, alt) => {
@@ -19340,9 +19562,9 @@ var EditorToolbar = ({
19340
19562
  },
19341
19563
  onCancel: () => setShowImageInput(false)
19342
19564
  }
19343
- ) : /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
19344
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Link, label: t("imageInput.addFromUrl"), onClick: () => setShowImageInput(true) }),
19345
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19565
+ ) : /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
19566
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Link, label: t("imageInput.addFromUrl"), onClick: () => setShowImageInput(true) }),
19567
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19346
19568
  DropdownMenuItem,
19347
19569
  {
19348
19570
  icon: import_lucide_react36.Upload,
@@ -19351,8 +19573,8 @@ var EditorToolbar = ({
19351
19573
  onClick: () => fileInputRef.current?.click()
19352
19574
  }
19353
19575
  ),
19354
- imageUploadError && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DropdownMenuItem, { label: imageUploadError, disabled: true, destructive: true }),
19355
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19576
+ imageUploadError && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DropdownMenuItem, { label: imageUploadError, disabled: true, destructive: true }),
19577
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19356
19578
  "input",
19357
19579
  {
19358
19580
  ref: fileInputRef,
@@ -19370,18 +19592,18 @@ var EditorToolbar = ({
19370
19592
  ] })
19371
19593
  }
19372
19594
  ),
19373
- /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
19595
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19374
19596
  DropdownMenu,
19375
19597
  {
19376
- trigger: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(ToolbarButton, { onClick: () => {
19598
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(ToolbarButton, { onClick: () => {
19377
19599
  }, title: t("toolbar.table"), children: [
19378
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Table, { className: "w-4 h-4" }),
19379
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19600
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Table, { className: "w-4 h-4" }),
19601
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.ChevronDown, { className: "w-3 h-3" })
19380
19602
  ] }),
19381
19603
  children: [
19382
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Table, label: t("tableMenu.insert3x3"), onClick: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run() }),
19383
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "my-1 border-t" }),
19384
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19604
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Table, label: t("tableMenu.insert3x3"), onClick: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run() }),
19605
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "my-1 border-t" }),
19606
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19385
19607
  DropdownMenuItem,
19386
19608
  {
19387
19609
  icon: import_lucide_react36.ArrowDown,
@@ -19390,7 +19612,7 @@ var EditorToolbar = ({
19390
19612
  disabled: !editor.can().addColumnBefore()
19391
19613
  }
19392
19614
  ),
19393
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19615
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19394
19616
  DropdownMenuItem,
19395
19617
  {
19396
19618
  icon: import_lucide_react36.ArrowDown,
@@ -19399,7 +19621,7 @@ var EditorToolbar = ({
19399
19621
  disabled: !editor.can().addColumnAfter()
19400
19622
  }
19401
19623
  ),
19402
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19624
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19403
19625
  DropdownMenuItem,
19404
19626
  {
19405
19627
  icon: import_lucide_react36.ArrowRight,
@@ -19408,7 +19630,7 @@ var EditorToolbar = ({
19408
19630
  disabled: !editor.can().addRowBefore()
19409
19631
  }
19410
19632
  ),
19411
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19633
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19412
19634
  DropdownMenuItem,
19413
19635
  {
19414
19636
  icon: import_lucide_react36.ArrowRight,
@@ -19417,8 +19639,8 @@ var EditorToolbar = ({
19417
19639
  disabled: !editor.can().addRowAfter()
19418
19640
  }
19419
19641
  ),
19420
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "my-1 border-t" }),
19421
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19642
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "my-1 border-t" }),
19643
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19422
19644
  DropdownMenuItem,
19423
19645
  {
19424
19646
  icon: import_lucide_react36.Trash2,
@@ -19427,8 +19649,8 @@ var EditorToolbar = ({
19427
19649
  disabled: !editor.can().deleteColumn()
19428
19650
  }
19429
19651
  ),
19430
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Trash2, label: t("tableMenu.deleteRow"), onClick: () => editor.chain().focus().deleteRow().run(), disabled: !editor.can().deleteRow() }),
19431
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
19652
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DropdownMenuItem, { icon: import_lucide_react36.Trash2, label: t("tableMenu.deleteRow"), onClick: () => editor.chain().focus().deleteRow().run(), disabled: !editor.can().deleteRow() }),
19653
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19432
19654
  DropdownMenuItem,
19433
19655
  {
19434
19656
  icon: import_lucide_react36.Trash2,
@@ -19440,26 +19662,26 @@ var EditorToolbar = ({
19440
19662
  ]
19441
19663
  }
19442
19664
  ),
19443
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19444
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleSubscript().run(), active: editor.isActive("subscript"), title: t("toolbar.subscript"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Subscript, { className: "w-4 h-4" }) }),
19445
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleSuperscript().run(), active: editor.isActive("superscript"), title: t("toolbar.superscript"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Superscript, { className: "w-4 h-4" }) }),
19446
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarDivider, {}),
19447
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: t("toolbar.undo"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Undo, { className: "w-4 h-4" }) }),
19448
- /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: t("toolbar.redo"), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_lucide_react36.Redo, { className: "w-4 h-4" }) })
19665
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19666
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleSubscript().run(), active: editor.isActive("subscript"), title: t("toolbar.subscript"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Subscript, { className: "w-4 h-4" }) }),
19667
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleSuperscript().run(), active: editor.isActive("superscript"), title: t("toolbar.superscript"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Superscript, { className: "w-4 h-4" }) }),
19668
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarDivider, {}),
19669
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: t("toolbar.undo"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Undo, { className: "w-4 h-4" }) }),
19670
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: t("toolbar.redo"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react36.Redo, { className: "w-4 h-4" }) })
19449
19671
  ] });
19450
19672
  };
19451
19673
 
19452
19674
  // ../../components/ui/UEditor/menus.tsx
19453
- var import_react43 = require("react");
19675
+ var import_react45 = require("react");
19454
19676
  var import_react_dom9 = require("react-dom");
19455
19677
  var import_next_intl4 = require("next-intl");
19456
19678
  var import_lucide_react37 = require("lucide-react");
19457
- var import_jsx_runtime72 = require("react/jsx-runtime");
19679
+ var import_jsx_runtime73 = require("react/jsx-runtime");
19458
19680
  var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19459
19681
  const t = (0, import_next_intl4.useTranslations)("UEditor");
19460
- const [selectedIndex, setSelectedIndex] = (0, import_react43.useState)(0);
19461
- const menuRef = (0, import_react43.useRef)(null);
19462
- const allCommands = (0, import_react43.useMemo)(
19682
+ const [selectedIndex, setSelectedIndex] = (0, import_react45.useState)(0);
19683
+ const menuRef = (0, import_react45.useRef)(null);
19684
+ const allCommands = (0, import_react45.useMemo)(
19463
19685
  () => [
19464
19686
  {
19465
19687
  icon: import_lucide_react37.Type,
@@ -19530,19 +19752,19 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19530
19752
  ],
19531
19753
  [editor, t]
19532
19754
  );
19533
- const commands = (0, import_react43.useMemo)(() => {
19755
+ const commands = (0, import_react45.useMemo)(() => {
19534
19756
  if (!filterText) return allCommands;
19535
19757
  const lowerFilter = filterText.toLowerCase();
19536
19758
  return allCommands.filter((cmd) => cmd.label.toLowerCase().includes(lowerFilter) || cmd.description.toLowerCase().includes(lowerFilter));
19537
19759
  }, [allCommands, filterText]);
19538
- (0, import_react43.useEffect)(() => {
19760
+ (0, import_react45.useEffect)(() => {
19539
19761
  setSelectedIndex(0);
19540
19762
  }, [filterText]);
19541
- (0, import_react43.useEffect)(() => {
19763
+ (0, import_react45.useEffect)(() => {
19542
19764
  const selectedElement = menuRef.current?.querySelector(`[data-index="${selectedIndex}"]`);
19543
19765
  selectedElement?.scrollIntoView({ block: "nearest" });
19544
19766
  }, [selectedIndex]);
19545
- const selectCommand = (0, import_react43.useCallback)(
19767
+ const selectCommand = (0, import_react45.useCallback)(
19546
19768
  (index) => {
19547
19769
  const command = commands[index];
19548
19770
  if (command) {
@@ -19552,7 +19774,7 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19552
19774
  },
19553
19775
  [commands, onClose]
19554
19776
  );
19555
- (0, import_react43.useEffect)(() => {
19777
+ (0, import_react45.useEffect)(() => {
19556
19778
  const handleKeyDown = (e) => {
19557
19779
  if (commands.length === 0) return;
19558
19780
  if (e.key === "ArrowDown") {
@@ -19573,11 +19795,11 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19573
19795
  return () => document.removeEventListener("keydown", handleKeyDown);
19574
19796
  }, [commands, selectedIndex, selectCommand, onClose]);
19575
19797
  if (commands.length === 0) {
19576
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "w-72 p-4 text-center text-muted-foreground text-sm", children: t("slashCommand.noResults") });
19798
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "w-72 p-4 text-center text-muted-foreground text-sm", children: t("slashCommand.noResults") });
19577
19799
  }
19578
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { ref: menuRef, className: "w-72 max-h-80 overflow-y-auto", children: [
19579
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "px-3 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: t("slashCommand.basicBlocks") }) }),
19580
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "p-1", children: commands.map((cmd, index) => /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19800
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { ref: menuRef, className: "w-72 max-h-80 overflow-y-auto", children: [
19801
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "px-3 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: t("slashCommand.basicBlocks") }) }),
19802
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "p-1", children: commands.map((cmd, index) => /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(
19581
19803
  "button",
19582
19804
  {
19583
19805
  type: "button",
@@ -19590,19 +19812,19 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19590
19812
  selectedIndex === index ? "bg-accent" : "hover:bg-accent/50"
19591
19813
  ),
19592
19814
  children: [
19593
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19815
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19594
19816
  "div",
19595
19817
  {
19596
19818
  className: cn(
19597
19819
  "flex items-center justify-center w-10 h-10 rounded-lg mr-3 transition-colors",
19598
19820
  selectedIndex === index ? "bg-primary/10" : "bg-muted/50 group-hover:bg-muted"
19599
19821
  ),
19600
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(cmd.icon, { className: cn("w-5 h-5", selectedIndex === index ? "text-primary" : "text-muted-foreground") })
19822
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(cmd.icon, { className: cn("w-5 h-5", selectedIndex === index ? "text-primary" : "text-muted-foreground") })
19601
19823
  }
19602
19824
  ),
19603
- /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "text-left", children: [
19604
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: cn("text-sm font-medium", selectedIndex === index && "text-primary"), children: cmd.label }),
19605
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "text-xs text-muted-foreground", children: cmd.description })
19825
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "text-left", children: [
19826
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: cn("text-sm font-medium", selectedIndex === index && "text-primary"), children: cmd.label }),
19827
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "text-xs text-muted-foreground", children: cmd.description })
19606
19828
  ] })
19607
19829
  ]
19608
19830
  },
@@ -19612,43 +19834,64 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
19612
19834
  };
19613
19835
  var FloatingMenuContent = ({ editor }) => {
19614
19836
  const t = (0, import_next_intl4.useTranslations)("UEditor");
19615
- const [showCommands, setShowCommands] = (0, import_react43.useState)(false);
19837
+ const [showCommands, setShowCommands] = (0, import_react45.useState)(false);
19616
19838
  if (showCommands) {
19617
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(SlashCommandMenu, { editor, onClose: () => setShowCommands(false) });
19839
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(SlashCommandMenu, { editor, onClose: () => setShowCommands(false) });
19618
19840
  }
19619
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
19841
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(
19620
19842
  "button",
19621
19843
  {
19622
19844
  type: "button",
19623
19845
  onClick: () => setShowCommands(true),
19624
19846
  className: "flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-accent transition-all group",
19625
19847
  children: [
19626
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Plus, { className: "w-4 h-4 text-muted-foreground group-hover:text-foreground" }),
19627
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "text-sm text-muted-foreground group-hover:text-foreground", children: t("floatingMenu.addBlock") })
19848
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Plus, { className: "w-4 h-4 text-muted-foreground group-hover:text-foreground" }),
19849
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { className: "text-sm text-muted-foreground group-hover:text-foreground", children: t("floatingMenu.addBlock") })
19628
19850
  ]
19629
19851
  }
19630
19852
  );
19631
19853
  };
19632
- var BubbleMenuContent = ({ editor }) => {
19854
+ var BubbleMenuContent = ({
19855
+ editor,
19856
+ onKeepOpenChange
19857
+ }) => {
19633
19858
  const t = (0, import_next_intl4.useTranslations)("UEditor");
19634
19859
  const { textColors, highlightColors } = useEditorColors();
19635
- const [showLinkInput, setShowLinkInput] = (0, import_react43.useState)(false);
19636
- const [showEditorColorPalette, setShowEditorColorPalette] = (0, import_react43.useState)(false);
19860
+ const [showLinkInput, setShowLinkInput] = (0, import_react45.useState)(false);
19861
+ const [showEditorColorPalette, setShowEditorColorPalette] = (0, import_react45.useState)(false);
19862
+ (0, import_react45.useEffect)(() => {
19863
+ onKeepOpenChange?.(showLinkInput);
19864
+ }, [onKeepOpenChange, showLinkInput]);
19865
+ (0, import_react45.useEffect)(() => {
19866
+ if (!showLinkInput) return;
19867
+ const close2 = () => setShowLinkInput(false);
19868
+ editor.on("selectionUpdate", close2);
19869
+ editor.on("blur", close2);
19870
+ return () => {
19871
+ editor.off("selectionUpdate", close2);
19872
+ editor.off("blur", close2);
19873
+ };
19874
+ }, [editor, showLinkInput]);
19637
19875
  if (showLinkInput) {
19638
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19876
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19639
19877
  LinkInput,
19640
19878
  {
19641
19879
  initialUrl: editor.getAttributes("link").href || "",
19642
19880
  onSubmit: (url) => {
19643
19881
  editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
19882
+ setShowLinkInput(false);
19883
+ requestAnimationFrame(() => editor.commands.focus());
19644
19884
  },
19645
- onCancel: () => setShowLinkInput(false)
19885
+ onCancel: () => {
19886
+ setShowLinkInput(false);
19887
+ requestAnimationFrame(() => editor.commands.focus());
19888
+ }
19646
19889
  }
19647
19890
  );
19648
19891
  }
19649
19892
  if (showEditorColorPalette) {
19650
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "w-48", children: [
19651
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19893
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "w-48", children: [
19894
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19652
19895
  EditorColorPalette,
19653
19896
  {
19654
19897
  colors: textColors,
@@ -19663,8 +19906,8 @@ var BubbleMenuContent = ({ editor }) => {
19663
19906
  label: t("colors.textColor")
19664
19907
  }
19665
19908
  ),
19666
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "border-t my-1" }),
19667
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19909
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "border-t my-1" }),
19910
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19668
19911
  EditorColorPalette,
19669
19912
  {
19670
19913
  colors: highlightColors,
@@ -19679,7 +19922,7 @@ var BubbleMenuContent = ({ editor }) => {
19679
19922
  label: t("colors.highlight")
19680
19923
  }
19681
19924
  ),
19682
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "p-2 border-t", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19925
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "p-2 border-t", children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19683
19926
  "button",
19684
19927
  {
19685
19928
  type: "button",
@@ -19690,53 +19933,71 @@ var BubbleMenuContent = ({ editor }) => {
19690
19933
  ) })
19691
19934
  ] });
19692
19935
  }
19693
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center gap-0.5 p-1", children: [
19694
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Bold, { className: "w-4 h-4" }) }),
19695
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), title: t("toolbar.italic"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Italic, { className: "w-4 h-4" }) }),
19696
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19936
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex items-center gap-0.5 p-1", children: [
19937
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Bold, { className: "w-4 h-4" }) }),
19938
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), title: t("toolbar.italic"), children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Italic, { className: "w-4 h-4" }) }),
19939
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19697
19940
  ToolbarButton,
19698
19941
  {
19699
19942
  onClick: () => editor.chain().focus().toggleUnderline().run(),
19700
19943
  active: editor.isActive("underline"),
19701
19944
  title: t("toolbar.underline"),
19702
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Underline, { className: "w-4 h-4" })
19945
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Underline, { className: "w-4 h-4" })
19703
19946
  }
19704
19947
  ),
19705
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive("strike"), title: t("toolbar.strike"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Strikethrough, { className: "w-4 h-4" }) }),
19706
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Code, { className: "w-4 h-4" }) }),
19707
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
19708
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => setShowLinkInput(true), active: editor.isActive("link"), title: t("toolbar.link"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Link, { className: "w-4 h-4" }) }),
19709
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(ToolbarButton, { onClick: () => setShowEditorColorPalette(true), title: t("colors.textColor"), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Palette, { className: "w-4 h-4" }) }),
19710
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
19711
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19948
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive("strike"), title: t("toolbar.strike"), children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Strikethrough, { className: "w-4 h-4" }) }),
19949
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Code, { className: "w-4 h-4" }) }),
19950
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
19951
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19952
+ ToolbarButton,
19953
+ {
19954
+ onMouseDown: () => {
19955
+ onKeepOpenChange?.(true);
19956
+ },
19957
+ onClick: () => {
19958
+ setShowLinkInput(true);
19959
+ },
19960
+ active: editor.isActive("link"),
19961
+ title: t("toolbar.link"),
19962
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Link, { className: "w-4 h-4" })
19963
+ }
19964
+ ),
19965
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ToolbarButton, { onClick: () => setShowEditorColorPalette(true), title: t("colors.textColor"), children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Palette, { className: "w-4 h-4" }) }),
19966
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
19967
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19712
19968
  ToolbarButton,
19713
19969
  {
19714
19970
  onClick: () => editor.chain().focus().toggleSubscript().run(),
19715
19971
  active: editor.isActive("subscript"),
19716
19972
  title: t("toolbar.subscript"),
19717
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Subscript, { className: "w-4 h-4" })
19973
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Subscript, { className: "w-4 h-4" })
19718
19974
  }
19719
19975
  ),
19720
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
19976
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19721
19977
  ToolbarButton,
19722
19978
  {
19723
19979
  onClick: () => editor.chain().focus().toggleSuperscript().run(),
19724
19980
  active: editor.isActive("superscript"),
19725
19981
  title: t("toolbar.superscript"),
19726
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react37.Superscript, { className: "w-4 h-4" })
19982
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react37.Superscript, { className: "w-4 h-4" })
19727
19983
  }
19728
19984
  )
19729
19985
  ] });
19730
19986
  };
19731
19987
  var CustomBubbleMenu = ({ editor }) => {
19732
- const [isVisible, setIsVisible] = (0, import_react43.useState)(false);
19733
- const [position, setPosition] = (0, import_react43.useState)({ top: 0, left: 0 });
19734
- const menuRef = (0, import_react43.useRef)(null);
19735
- (0, import_react43.useEffect)(() => {
19988
+ const [isVisible, setIsVisible] = (0, import_react45.useState)(false);
19989
+ const [position, setPosition] = (0, import_react45.useState)({ top: 0, left: 0 });
19990
+ const menuRef = (0, import_react45.useRef)(null);
19991
+ const keepOpenRef = (0, import_react45.useRef)(false);
19992
+ const setKeepOpen = (0, import_react45.useCallback)((next) => {
19993
+ keepOpenRef.current = next;
19994
+ if (next) setIsVisible(true);
19995
+ }, []);
19996
+ (0, import_react45.useEffect)(() => {
19736
19997
  const updatePosition = () => {
19737
19998
  const { state, view } = editor;
19738
19999
  const { from, to, empty } = state.selection;
19739
- if (empty || !view.hasFocus()) {
20000
+ if (!keepOpenRef.current && (empty || !view.hasFocus())) {
19740
20001
  setIsVisible(false);
19741
20002
  return;
19742
20003
  }
@@ -19747,7 +20008,9 @@ var CustomBubbleMenu = ({ editor }) => {
19747
20008
  setPosition({ top, left });
19748
20009
  setIsVisible(true);
19749
20010
  };
19750
- const handleBlur = () => setIsVisible(false);
20011
+ const handleBlur = () => {
20012
+ if (!keepOpenRef.current) setIsVisible(false);
20013
+ };
19751
20014
  editor.on("selectionUpdate", updatePosition);
19752
20015
  editor.on("focus", updatePosition);
19753
20016
  editor.on("blur", handleBlur);
@@ -19759,7 +20022,7 @@ var CustomBubbleMenu = ({ editor }) => {
19759
20022
  }, [editor]);
19760
20023
  if (!isVisible) return null;
19761
20024
  return (0, import_react_dom9.createPortal)(
19762
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
20025
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19763
20026
  "div",
19764
20027
  {
19765
20028
  ref: menuRef,
@@ -19770,16 +20033,22 @@ var CustomBubbleMenu = ({ editor }) => {
19770
20033
  transform: "translate(-50%, -100%)"
19771
20034
  },
19772
20035
  onMouseDown: (e) => e.preventDefault(),
19773
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(BubbleMenuContent, { editor })
20036
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
20037
+ BubbleMenuContent,
20038
+ {
20039
+ editor,
20040
+ onKeepOpenChange: setKeepOpen
20041
+ }
20042
+ )
19774
20043
  }
19775
20044
  ),
19776
20045
  document.body
19777
20046
  );
19778
20047
  };
19779
20048
  var CustomFloatingMenu = ({ editor }) => {
19780
- const [isVisible, setIsVisible] = (0, import_react43.useState)(false);
19781
- const [position, setPosition] = (0, import_react43.useState)({ top: 0, left: 0 });
19782
- (0, import_react43.useEffect)(() => {
20049
+ const [isVisible, setIsVisible] = (0, import_react45.useState)(false);
20050
+ const [position, setPosition] = (0, import_react45.useState)({ top: 0, left: 0 });
20051
+ (0, import_react45.useEffect)(() => {
19783
20052
  const updatePosition = () => {
19784
20053
  const { state, view } = editor;
19785
20054
  const { $from, empty } = state.selection;
@@ -19806,7 +20075,7 @@ var CustomFloatingMenu = ({ editor }) => {
19806
20075
  }, [editor]);
19807
20076
  if (!isVisible) return null;
19808
20077
  return (0, import_react_dom9.createPortal)(
19809
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
20078
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
19810
20079
  "div",
19811
20080
  {
19812
20081
  className: "fixed z-50 rounded-2xl border border-border bg-card text-card-foreground shadow-lg backdrop-blur-sm overflow-hidden animate-in fade-in-0 slide-in-from-bottom-2",
@@ -19816,7 +20085,7 @@ var CustomFloatingMenu = ({ editor }) => {
19816
20085
  transform: "translate(-50%, -100%)"
19817
20086
  },
19818
20087
  onMouseDown: (e) => e.preventDefault(),
19819
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(FloatingMenuContent, { editor })
20088
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(FloatingMenuContent, { editor })
19820
20089
  }
19821
20090
  ),
19822
20091
  document.body
@@ -19825,25 +20094,25 @@ var CustomFloatingMenu = ({ editor }) => {
19825
20094
 
19826
20095
  // ../../components/ui/UEditor/CharacterCount.tsx
19827
20096
  var import_next_intl5 = require("next-intl");
19828
- var import_jsx_runtime73 = require("react/jsx-runtime");
20097
+ var import_jsx_runtime74 = require("react/jsx-runtime");
19829
20098
  var CharacterCountDisplay = ({ editor, maxCharacters }) => {
19830
20099
  const t = (0, import_next_intl5.useTranslations)("UEditor");
19831
20100
  const storage = editor.storage;
19832
20101
  const characterCount = storage.characterCount?.characters?.() ?? 0;
19833
20102
  const wordCount = storage.characterCount?.words?.() ?? 0;
19834
20103
  const percentage = maxCharacters ? Math.round(characterCount / maxCharacters * 100) : 0;
19835
- return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground border-t bg-muted/20", children: [
19836
- /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("span", { children: [
20104
+ return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground border-t bg-muted/20", children: [
20105
+ /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("span", { children: [
19837
20106
  wordCount,
19838
20107
  " ",
19839
20108
  t("words")
19840
20109
  ] }),
19841
- /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("span", { children: [
20110
+ /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("span", { children: [
19842
20111
  characterCount,
19843
20112
  " ",
19844
20113
  t("characters")
19845
20114
  ] }),
19846
- maxCharacters && /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("span", { className: cn(percentage > 90 && "text-destructive", percentage > 100 && "font-bold"), children: [
20115
+ maxCharacters && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("span", { className: cn(percentage > 90 && "text-destructive", percentage > 100 && "font-bold"), children: [
19847
20116
  characterCount,
19848
20117
  "/",
19849
20118
  maxCharacters
@@ -19852,7 +20121,7 @@ var CharacterCountDisplay = ({ editor, maxCharacters }) => {
19852
20121
  };
19853
20122
 
19854
20123
  // ../../components/ui/UEditor/UEditor.tsx
19855
- var import_jsx_runtime74 = require("react/jsx-runtime");
20124
+ var import_jsx_runtime75 = require("react/jsx-runtime");
19856
20125
  var UEditor = ({
19857
20126
  content = "",
19858
20127
  onChange,
@@ -19875,11 +20144,11 @@ var UEditor = ({
19875
20144
  }) => {
19876
20145
  const t = (0, import_next_intl6.useTranslations)("UEditor");
19877
20146
  const effectivePlaceholder = placeholder ?? t("placeholder");
19878
- const extensions = (0, import_react44.useMemo)(
19879
- () => buildUEditorExtensions({ placeholder: effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode }),
19880
- [effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode]
20147
+ const extensions = (0, import_react46.useMemo)(
20148
+ () => buildUEditorExtensions({ placeholder: effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode, editable }),
20149
+ [effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode, editable]
19881
20150
  );
19882
- const editor = (0, import_react45.useEditor)({
20151
+ const editor = (0, import_react47.useEditor)({
19883
20152
  immediatelyRender: false,
19884
20153
  extensions,
19885
20154
  content,
@@ -19893,6 +20162,19 @@ var UEditor = ({
19893
20162
  event.stopPropagation();
19894
20163
  }
19895
20164
  return false;
20165
+ },
20166
+ click: (view, event) => {
20167
+ if (!(event instanceof MouseEvent)) return false;
20168
+ if (event.button !== 0) return false;
20169
+ const target = event.target;
20170
+ const anchor = target?.closest?.("a[href]");
20171
+ const href = anchor?.getAttribute("href") ?? "";
20172
+ if (!href) return false;
20173
+ if (!view.state.selection.empty) return false;
20174
+ event.preventDefault();
20175
+ event.stopPropagation();
20176
+ window.open(href, "_blank", "noopener,noreferrer");
20177
+ return true;
19896
20178
  }
19897
20179
  },
19898
20180
  attributes: {
@@ -19971,7 +20253,7 @@ var UEditor = ({
19971
20253
  onJsonChange?.(editor2.getJSON());
19972
20254
  }
19973
20255
  });
19974
- (0, import_react44.useEffect)(() => {
20256
+ (0, import_react46.useEffect)(() => {
19975
20257
  if (editor && content !== editor.getHTML()) {
19976
20258
  if (editor.isEmpty && content) {
19977
20259
  editor.commands.setContent(content);
@@ -19979,7 +20261,7 @@ var UEditor = ({
19979
20261
  }
19980
20262
  }, [content, editor]);
19981
20263
  if (!editor) {
19982
- return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
20264
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
19983
20265
  "div",
19984
20266
  {
19985
20267
  className: cn("w-full rounded-lg border bg-background flex items-center justify-center text-muted-foreground", className),
@@ -19988,7 +20270,7 @@ var UEditor = ({
19988
20270
  }
19989
20271
  );
19990
20272
  }
19991
- return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(
20273
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(
19992
20274
  "div",
19993
20275
  {
19994
20276
  className: cn(
@@ -20000,11 +20282,11 @@ var UEditor = ({
20000
20282
  className
20001
20283
  ),
20002
20284
  children: [
20003
- editable && showToolbar && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(EditorToolbar, { editor, variant, uploadImage, imageInsertMode }),
20004
- editable && showBubbleMenu && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CustomBubbleMenu, { editor }),
20005
- editable && showFloatingMenu && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CustomFloatingMenu, { editor }),
20006
- /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
20007
- import_react45.EditorContent,
20285
+ editable && showToolbar && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(EditorToolbar, { editor, variant, uploadImage, imageInsertMode }),
20286
+ editable && showBubbleMenu && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CustomBubbleMenu, { editor }),
20287
+ editable && showFloatingMenu && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CustomFloatingMenu, { editor }),
20288
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
20289
+ import_react47.EditorContent,
20008
20290
  {
20009
20291
  editor,
20010
20292
  className: "flex-1 overflow-y-auto",
@@ -20014,7 +20296,7 @@ var UEditor = ({
20014
20296
  }
20015
20297
  }
20016
20298
  ),
20017
- showCharacterCount && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CharacterCountDisplay, { editor, maxCharacters })
20299
+ showCharacterCount && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CharacterCountDisplay, { editor, maxCharacters })
20018
20300
  ]
20019
20301
  }
20020
20302
  );