@rufous/ui 0.2.55 → 0.2.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs CHANGED
@@ -9183,7 +9183,7 @@ var TranslateModal = ({ editor, onClose, onTranslate, initialSource, initialTarg
9183
9183
  },
9184
9184
  /* @__PURE__ */ import_react54.default.createElement("span", { className: "translate-code" }, lang.code),
9185
9185
  /* @__PURE__ */ import_react54.default.createElement("span", { className: "translate-name" }, lang.name)
9186
- ))))), error && /* @__PURE__ */ import_react54.default.createElement("div", { className: "translate-error" }, error)), /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react54.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "\xD7 Cancel")), /* @__PURE__ */ import_react54.default.createElement("button", { className: "modal-btn-apply", onClick: handleSave, disabled: translating }, translating ? "Translating..." : "\u2714 Save"))));
9186
+ ))))), error && /* @__PURE__ */ import_react54.default.createElement("div", { className: "translate-error" }, error)), /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react54.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "Cancel")), /* @__PURE__ */ import_react54.default.createElement("button", { className: "modal-btn-apply", onClick: handleSave, disabled: translating }, translating ? "Translating..." : "Save"))));
9187
9187
  };
9188
9188
  var TranslateModal_default = TranslateModal;
9189
9189
 
@@ -9802,7 +9802,8 @@ var CustomTaskItem = import_extension_task_item.default.extend({
9802
9802
  "border: 2px solid " + colors.border,
9803
9803
  `background-image: url("${imageUrl}")`,
9804
9804
  "background-repeat: no-repeat",
9805
- "background-position: center"
9805
+ "background-position: center",
9806
+ "box-sizing: unset !important"
9806
9807
  ].join("; ");
9807
9808
  li.setAttribute("data-status", status);
9808
9809
  };
@@ -10033,12 +10034,24 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10033
10034
  const menu = menuRef.current;
10034
10035
  menu.style.left = "0";
10035
10036
  menu.style.right = "auto";
10036
- const rect = menu.getBoundingClientRect();
10037
- const vw = window.innerWidth;
10038
- if (rect.right > vw - 8) {
10039
- menu.style.left = "auto";
10040
- menu.style.right = "0";
10041
- }
10037
+ requestAnimationFrame(() => {
10038
+ if (!menu) return;
10039
+ const rect = menu.getBoundingClientRect();
10040
+ const vw = window.innerWidth;
10041
+ const parentLeft = ref.current?.getBoundingClientRect().left || 0;
10042
+ if (rect.right > vw - 8) {
10043
+ menu.style.left = "auto";
10044
+ menu.style.right = "0";
10045
+ const newRect = menu.getBoundingClientRect();
10046
+ if (newRect.left < 8) {
10047
+ menu.style.left = `${8 - parentLeft}px`;
10048
+ menu.style.right = "auto";
10049
+ }
10050
+ } else if (rect.left < 8) {
10051
+ menu.style.left = `${8 - parentLeft}px`;
10052
+ menu.style.right = "auto";
10053
+ }
10054
+ });
10042
10055
  }, [open]);
10043
10056
  return /* @__PURE__ */ import_react55.default.createElement("div", { className: `dropdown ${className}`, ref }, /* @__PURE__ */ import_react55.default.createElement(
10044
10057
  "button",
@@ -10303,10 +10316,11 @@ var ColorPickerPanel = ({ editor, onClose }) => {
10303
10316
  }
10304
10317
  ))), /* @__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")));
10305
10318
  };
10306
- var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload }) => {
10319
+ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTextToSpeech, onClose, onImageUpload, visibleButtons }) => {
10307
10320
  const [, setEditorState] = (0, import_react55.useState)(0);
10308
10321
  const [isFullscreen, setIsFullscreen] = (0, import_react55.useState)(false);
10309
10322
  const [todoEnabled, setTodoEnabled] = (0, import_react55.useState)(false);
10323
+ const show = (id) => !visibleButtons || visibleButtons.has(id);
10310
10324
  (0, import_react55.useEffect)(() => {
10311
10325
  if (!editor) return;
10312
10326
  const onTransaction = () => setEditorState((n) => n + 1);
@@ -10390,7 +10404,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10390
10404
  setTimeout(() => setTranslateStatus(""), 2e3);
10391
10405
  }, [editor, translateSource, translateTarget, onTranslate]);
10392
10406
  if (!editor) return null;
10393
- return /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: `toolbar-row ${onClose ? "with-close" : ""}` }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(
10407
+ return /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: `toolbar-row ${onClose ? "with-close" : ""}` }, (show("undo") || show("redo")) && /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, show("undo") && /* @__PURE__ */ import_react55.default.createElement(
10394
10408
  "button",
10395
10409
  {
10396
10410
  className: "toolbar-btn",
@@ -10399,7 +10413,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10399
10413
  title: "Undo (Ctrl+Z)"
10400
10414
  },
10401
10415
  /* @__PURE__ */ import_react55.default.createElement(IconUndo, null)
10402
- ), /* @__PURE__ */ import_react55.default.createElement(
10416
+ ), show("redo") && /* @__PURE__ */ import_react55.default.createElement(
10403
10417
  "button",
10404
10418
  {
10405
10419
  className: "toolbar-btn",
@@ -10408,7 +10422,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10408
10422
  title: "Redo (Ctrl+Y)"
10409
10423
  },
10410
10424
  /* @__PURE__ */ import_react55.default.createElement(IconRedo, null)
10411
- )), /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(AICommands_default, { editor, onAICommand })), /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(
10425
+ )), show("ai") && /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(AICommands_default, { editor, onAICommand })), /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, show("paragraph") && /* @__PURE__ */ import_react55.default.createElement(
10412
10426
  Dropdown,
10413
10427
  {
10414
10428
  trigger: {
@@ -10475,7 +10489,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10475
10489
  " Code Block"
10476
10490
  ),
10477
10491
  /* @__PURE__ */ import_react55.default.createElement("button", { className: "dropdown-item", onClick: () => editor.chain().focus().setHorizontalRule().run() }, "\u2014 Horizontal Rule")
10478
- ), /* @__PURE__ */ import_react55.default.createElement(
10492
+ ), show("fontsize") && /* @__PURE__ */ import_react55.default.createElement(
10479
10493
  Dropdown,
10480
10494
  {
10481
10495
  trigger: {
@@ -10502,7 +10516,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10502
10516
  sizeStr
10503
10517
  );
10504
10518
  })
10505
- ), /* @__PURE__ */ import_react55.default.createElement(
10519
+ ), show("font") && /* @__PURE__ */ import_react55.default.createElement(
10506
10520
  Dropdown,
10507
10521
  {
10508
10522
  trigger: {
@@ -10529,7 +10543,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10529
10543
  font
10530
10544
  );
10531
10545
  })
10532
- ), /* @__PURE__ */ import_react55.default.createElement(
10546
+ ), show("color") && /* @__PURE__ */ import_react55.default.createElement(
10533
10547
  Dropdown,
10534
10548
  {
10535
10549
  trigger: {
@@ -10539,7 +10553,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10539
10553
  keepOpen: true
10540
10554
  },
10541
10555
  (close) => /* @__PURE__ */ import_react55.default.createElement(ColorPickerPanel, { editor, onClose: close })
10542
- ), /* @__PURE__ */ import_react55.default.createElement(
10556
+ ), show("bold") && /* @__PURE__ */ import_react55.default.createElement(
10543
10557
  "button",
10544
10558
  {
10545
10559
  className: `toolbar-btn ${editor.isActive("bold") ? "is-active" : ""}`,
@@ -10547,7 +10561,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10547
10561
  title: "Bold (Ctrl+B)"
10548
10562
  },
10549
10563
  /* @__PURE__ */ import_react55.default.createElement(IconBold, null)
10550
- ), /* @__PURE__ */ import_react55.default.createElement(
10564
+ ), show("italic") && /* @__PURE__ */ import_react55.default.createElement(
10551
10565
  "button",
10552
10566
  {
10553
10567
  className: `toolbar-btn ${editor.isActive("italic") ? "is-active" : ""}`,
@@ -10555,7 +10569,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10555
10569
  title: "Italic (Ctrl+I)"
10556
10570
  },
10557
10571
  /* @__PURE__ */ import_react55.default.createElement(IconItalic, null)
10558
- ), /* @__PURE__ */ import_react55.default.createElement(
10572
+ ), show("strike") && /* @__PURE__ */ import_react55.default.createElement(
10559
10573
  Dropdown,
10560
10574
  {
10561
10575
  trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconStrike, null), title: "Text decoration", className: editor.isActive("strike") ? "is-active" : "" }
@@ -10580,7 +10594,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10580
10594
  c.run();
10581
10595
  }
10582
10596
  } }, "\u2715 Clear formatting")
10583
- ), /* @__PURE__ */ import_react55.default.createElement(
10597
+ ), show("link") && /* @__PURE__ */ import_react55.default.createElement(
10584
10598
  "button",
10585
10599
  {
10586
10600
  className: `toolbar-btn ${editor.isActive("link") ? "is-active" : ""}`,
@@ -10588,7 +10602,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10588
10602
  title: "Insert Link"
10589
10603
  },
10590
10604
  /* @__PURE__ */ import_react55.default.createElement(IconLink, null)
10591
- ), /* @__PURE__ */ import_react55.default.createElement(
10605
+ ), show("lineheight") && /* @__PURE__ */ import_react55.default.createElement(
10592
10606
  Dropdown,
10593
10607
  {
10594
10608
  trigger: {
@@ -10615,7 +10629,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10615
10629
  lh
10616
10630
  );
10617
10631
  })
10618
- )), /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(
10632
+ )), (show("ul") || show("ol")) && /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, show("ul") && /* @__PURE__ */ import_react55.default.createElement(
10619
10633
  Dropdown,
10620
10634
  {
10621
10635
  trigger: {
@@ -10658,7 +10672,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10658
10672
  " ",
10659
10673
  item.label
10660
10674
  ))
10661
- ), /* @__PURE__ */ import_react55.default.createElement(
10675
+ ), show("ol") && /* @__PURE__ */ import_react55.default.createElement(
10662
10676
  Dropdown,
10663
10677
  {
10664
10678
  trigger: {
@@ -10703,7 +10717,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10703
10717
  " ",
10704
10718
  item.label
10705
10719
  ))
10706
- )), /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, /* @__PURE__ */ import_react55.default.createElement(
10720
+ )), (show("align") || show("indent") || show("outdent")) && /* @__PURE__ */ import_react55.default.createElement("div", { className: "toolbar-group" }, show("align") && /* @__PURE__ */ import_react55.default.createElement(
10707
10721
  Dropdown,
10708
10722
  {
10709
10723
  trigger: {
@@ -10728,7 +10742,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10728
10742
  " ",
10729
10743
  item.label
10730
10744
  ))
10731
- ), /* @__PURE__ */ import_react55.default.createElement(
10745
+ ), show("indent") && /* @__PURE__ */ import_react55.default.createElement(
10732
10746
  "button",
10733
10747
  {
10734
10748
  className: "toolbar-btn",
@@ -10749,7 +10763,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10749
10763
  title: "Increase Indent"
10750
10764
  },
10751
10765
  /* @__PURE__ */ import_react55.default.createElement(IconIndentIncrease, null)
10752
- ), /* @__PURE__ */ import_react55.default.createElement(
10766
+ ), show("outdent") && /* @__PURE__ */ import_react55.default.createElement(
10753
10767
  "button",
10754
10768
  {
10755
10769
  className: "toolbar-btn",
@@ -10770,7 +10784,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10770
10784
  title: "Decrease Indent"
10771
10785
  },
10772
10786
  /* @__PURE__ */ import_react55.default.createElement(IconIndentDecrease, null)
10773
- )), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconTable, null), title: "Insert Table" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(TableGridSelector, { editor, onClose: close })), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconImage, null), title: "Insert Image" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(ImagePanel, { editor, onClose: close, onImageUpload })), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconVideo, null), title: "Insert Video" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(InsertPanel, { editor, onClose: close, mode: "video" })), /* @__PURE__ */ import_react55.default.createElement(
10787
+ )), show("table") && /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconTable, null), title: "Insert Table" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(TableGridSelector, { editor, onClose: close })), show("image") && /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconImage, null), title: "Insert Image" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(ImagePanel, { editor, onClose: close, onImageUpload })), show("video") && /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconVideo, null), title: "Insert Video" }, keepOpen: true }, (close) => /* @__PURE__ */ import_react55.default.createElement(InsertPanel, { editor, onClose: close, mode: "video" })), show("cut") && /* @__PURE__ */ import_react55.default.createElement(
10774
10788
  "button",
10775
10789
  {
10776
10790
  className: "toolbar-btn",
@@ -10778,7 +10792,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10778
10792
  title: "Cut (Ctrl+X)"
10779
10793
  },
10780
10794
  /* @__PURE__ */ import_react55.default.createElement(IconCut, null)
10781
- ), /* @__PURE__ */ import_react55.default.createElement(
10795
+ ), show("copy") && /* @__PURE__ */ import_react55.default.createElement(
10782
10796
  "button",
10783
10797
  {
10784
10798
  className: "toolbar-btn",
@@ -10786,7 +10800,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10786
10800
  title: "Copy selected text"
10787
10801
  },
10788
10802
  copySuccess ? /* @__PURE__ */ import_react55.default.createElement(IconCheck, null) : /* @__PURE__ */ import_react55.default.createElement(IconCopy, null)
10789
- ), /* @__PURE__ */ import_react55.default.createElement(
10803
+ ), show("paste") && /* @__PURE__ */ import_react55.default.createElement(
10790
10804
  "button",
10791
10805
  {
10792
10806
  className: "toolbar-btn",
@@ -10794,7 +10808,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10794
10808
  title: "Paste (Ctrl+V)"
10795
10809
  },
10796
10810
  /* @__PURE__ */ import_react55.default.createElement(IconPaste, null)
10797
- ), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: "\u03A9", title: "Special characters", className: "special-characters-btn" } }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "char-grid" }, SPECIAL_CHARS.map((char) => /* @__PURE__ */ import_react55.default.createElement(
10811
+ ), show("specialchars") && /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: "\u03A9", title: "Special characters", className: "special-characters-btn" } }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "char-grid" }, SPECIAL_CHARS.map((char) => /* @__PURE__ */ import_react55.default.createElement(
10798
10812
  "button",
10799
10813
  {
10800
10814
  key: char,
@@ -10802,7 +10816,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10802
10816
  onClick: () => insertSpecialChar(char)
10803
10817
  },
10804
10818
  char
10805
- )))), /* @__PURE__ */ import_react55.default.createElement(
10819
+ )))), show("code") && /* @__PURE__ */ import_react55.default.createElement(
10806
10820
  Dropdown,
10807
10821
  {
10808
10822
  trigger: { label: /* @__PURE__ */ import_react55.default.createElement(IconCode, null), title: "Code", className: editor.isActive("code") || editor.isActive("codeBlock") ? "is-active" : "" }
@@ -10826,7 +10840,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10826
10840
  }
10827
10841
  } }, "</>", " Inline Code"),
10828
10842
  /* @__PURE__ */ import_react55.default.createElement("button", { className: "dropdown-item", onClick: () => editor.chain().focus().toggleCodeBlock().run() }, "{ }", " Code Block")
10829
- ), /* @__PURE__ */ import_react55.default.createElement(
10843
+ ), show("fullscreen") && /* @__PURE__ */ import_react55.default.createElement(
10830
10844
  "button",
10831
10845
  {
10832
10846
  className: `toolbar-btn ${isFullscreen ? "is-active" : ""}`,
@@ -10834,7 +10848,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10834
10848
  title: "Toggle Fullscreen"
10835
10849
  },
10836
10850
  /* @__PURE__ */ import_react55.default.createElement(IconFullscreen, null)
10837
- ), /* @__PURE__ */ import_react55.default.createElement(TextToSpeech_default, { editor, onTextToSpeech }), /* @__PURE__ */ import_react55.default.createElement(SpeechToText_default, { editor, onSpeechToText }), /* @__PURE__ */ import_react55.default.createElement("div", { className: "translate-split-btn" }, /* @__PURE__ */ import_react55.default.createElement(
10851
+ ), 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(
10838
10852
  "button",
10839
10853
  {
10840
10854
  className: "toolbar-btn",
@@ -10842,7 +10856,7 @@ var Toolbar = ({ editor, setLink, onAICommand, onTranslate, onSpeechToText, onTe
10842
10856
  title: "Translate selected text"
10843
10857
  },
10844
10858
  /* @__PURE__ */ import_react55.default.createElement(IconTranslate, null)
10845
- ), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: "", title: "Translate options", className: "translate-arrow-btn" } }, /* @__PURE__ */ import_react55.default.createElement("button", { className: "dropdown-item", onClick: () => setShowTranslateModal(true) }, "Options")), translateStatus && /* @__PURE__ */ import_react55.default.createElement("span", { className: `translate-toast-popup ${translateStatus === "Please select the text" || translateStatus === "Translation failed" ? "error" : ""}` }, translateStatus)), /* @__PURE__ */ import_react55.default.createElement("div", { className: "todo-split-btn" }, /* @__PURE__ */ import_react55.default.createElement(
10859
+ ), /* @__PURE__ */ import_react55.default.createElement(Dropdown, { trigger: { label: "", title: "Translate options", className: "translate-arrow-btn" } }, /* @__PURE__ */ import_react55.default.createElement("button", { className: "dropdown-item", onClick: () => setShowTranslateModal(true) }, "Options")), translateStatus && /* @__PURE__ */ import_react55.default.createElement("span", { className: `translate-toast-popup ${translateStatus === "Please select the text" || translateStatus === "Translation failed" ? "error" : ""}` }, translateStatus)), show("todo") && /* @__PURE__ */ import_react55.default.createElement("div", { className: "todo-split-btn" }, /* @__PURE__ */ import_react55.default.createElement(
10846
10860
  "button",
10847
10861
  {
10848
10862
  className: `toolbar-btn ${todoEnabled ? "is-active" : ""}`,
@@ -11085,7 +11099,7 @@ var ImagePropertiesModal = ({ editor, node, onClose }) => {
11085
11099
  checked: openInNewTab,
11086
11100
  onChange: (e) => setOpenInNewTab(e.target.checked)
11087
11101
  }
11088
- ), "Open link in new tab")) : /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement("label", { className: "modal-label" }, "CSS Class"), /* @__PURE__ */ import_react56.default.createElement("input", { type: "text", className: "modal-input", placeholder: "e.g. rounded shadow" }), /* @__PURE__ */ import_react56.default.createElement("label", { className: "modal-label" }, "Inline Style"), /* @__PURE__ */ import_react56.default.createElement("input", { type: "text", className: "modal-input", placeholder: "e.g. border: 1px solid #ccc" }))))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "\xD7 Cancel"), /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-delete", onClick: handleDelete }, "\u{1F5D1} Delete")), /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-apply", onClick: handleApply }, "\u2714 Apply"))));
11102
+ ), "Open link in new tab")) : /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement("label", { className: "modal-label" }, "CSS Class"), /* @__PURE__ */ import_react56.default.createElement("input", { type: "text", className: "modal-input", placeholder: "e.g. rounded shadow" }), /* @__PURE__ */ import_react56.default.createElement("label", { className: "modal-label" }, "Inline Style"), /* @__PURE__ */ import_react56.default.createElement("input", { type: "text", className: "modal-input", placeholder: "e.g. border: 1px solid #ccc" }))))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "Cancel"), /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-delete", onClick: handleDelete }, "Delete")), /* @__PURE__ */ import_react56.default.createElement("button", { className: "modal-btn-apply", onClick: handleApply }, "Apply"))));
11089
11103
  };
11090
11104
  var ImageToolbar = ({ editor }) => {
11091
11105
  const [showModal, setShowModal] = (0, import_react56.useState)(false);
@@ -11338,7 +11352,7 @@ var VideoPropertiesModal = ({ editor, node, nodeType, onClose }) => {
11338
11352
  value: height,
11339
11353
  onChange: (e) => handleHeightChange(e.target.value)
11340
11354
  }
11341
- )))), /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "\xD7 Cancel"), /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-delete", onClick: handleDelete }, "\u{1F5D1} Delete")), /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-apply", onClick: handleApply }, "\u2714 Apply"))));
11355
+ )))), /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-footer" }, /* @__PURE__ */ import_react57.default.createElement("div", { className: "modal-footer-left" }, /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-cancel", onClick: onClose }, "Cancel"), /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-delete", onClick: handleDelete }, "Delete")), /* @__PURE__ */ import_react57.default.createElement("button", { className: "modal-btn-apply", onClick: handleApply }, "Apply"))));
11342
11356
  };
11343
11357
  var VideoToolbar = ({ editor }) => {
11344
11358
  const [showModal, setShowModal] = (0, import_react57.useState)(false);
@@ -11471,6 +11485,62 @@ var VideoToolbar = ({ editor }) => {
11471
11485
  var VideoToolbar_default = VideoToolbar;
11472
11486
 
11473
11487
  // lib/RufousTextEditor/RufousTextEditor.tsx
11488
+ var VARIANT_BUTTONS = {
11489
+ default: [
11490
+ "undo",
11491
+ "redo",
11492
+ "|",
11493
+ "ai",
11494
+ "|",
11495
+ "paragraph",
11496
+ "fontsize",
11497
+ "font",
11498
+ "color",
11499
+ "bold",
11500
+ "italic",
11501
+ "strike",
11502
+ "link",
11503
+ "lineheight",
11504
+ "|",
11505
+ "ul",
11506
+ "ol",
11507
+ "|",
11508
+ "align",
11509
+ "indent",
11510
+ "outdent",
11511
+ "|",
11512
+ "table",
11513
+ "image",
11514
+ "video",
11515
+ "|",
11516
+ "cut",
11517
+ "copy",
11518
+ "paste",
11519
+ "specialchars",
11520
+ "code",
11521
+ "fullscreen",
11522
+ "|",
11523
+ "tts",
11524
+ "stt",
11525
+ "translate",
11526
+ "|",
11527
+ "todo"
11528
+ ],
11529
+ basic: [
11530
+ "undo",
11531
+ "redo",
11532
+ "|",
11533
+ "paragraph",
11534
+ "fontsize",
11535
+ "font",
11536
+ "bold",
11537
+ "italic",
11538
+ "link",
11539
+ "|",
11540
+ "ul",
11541
+ "ol"
11542
+ ]
11543
+ };
11474
11544
  var RufousTextEditor = ({
11475
11545
  content: initialContent,
11476
11546
  placeholder: customPlaceholder,
@@ -11486,6 +11556,10 @@ var RufousTextEditor = ({
11486
11556
  onImageUpload,
11487
11557
  onClose,
11488
11558
  mentions,
11559
+ variant = "default",
11560
+ buttons,
11561
+ hideButtons,
11562
+ width,
11489
11563
  height,
11490
11564
  resizable = false,
11491
11565
  className,
@@ -11493,6 +11567,14 @@ var RufousTextEditor = ({
11493
11567
  sx
11494
11568
  }) => {
11495
11569
  const sxClass = useSx(sx);
11570
+ const toolbarButtons = (0, import_react58.useMemo)(() => {
11571
+ const list = buttons || VARIANT_BUTTONS[variant] || VARIANT_BUTTONS.default;
11572
+ const visible = new Set(list.filter((b) => b !== "|"));
11573
+ if (hideButtons) {
11574
+ hideButtons.forEach((b) => visible.delete(b));
11575
+ }
11576
+ return visible;
11577
+ }, [buttons, variant, hideButtons]);
11496
11578
  const mentionSuggestion = (0, import_react58.useMemo)(() => createMentionSuggestion(mentions), [mentions]);
11497
11579
  const onChangeRef = (0, import_react58.useRef)(onChange);
11498
11580
  const onBlurRef = (0, import_react58.useRef)(onBlur);
@@ -11737,7 +11819,6 @@ var RufousTextEditor = ({
11737
11819
  setLinkSelection(null);
11738
11820
  editor?.chain().focus().run();
11739
11821
  }, [editor]);
11740
- const [saveFormat, setSaveFormat] = (0, import_react58.useState)("html");
11741
11822
  const [saveStatus, setSaveStatus] = (0, import_react58.useState)("");
11742
11823
  const handleSave = (0, import_react58.useCallback)(() => {
11743
11824
  if (!editor || !onSaveProp) return;
@@ -11749,12 +11830,6 @@ var RufousTextEditor = ({
11749
11830
  if (!editor || !onExportProp) return;
11750
11831
  onExportProp(editor.getHTML(), editor.getJSON());
11751
11832
  }, [editor, onExportProp]);
11752
- const handleClear = (0, import_react58.useCallback)(() => {
11753
- if (!editor) return;
11754
- if (window.confirm("Clear all content? This cannot be undone.")) {
11755
- editor.commands.clearContent();
11756
- }
11757
- }, [editor]);
11758
11833
  const providerValue = (0, import_react58.useMemo)(() => ({ editor }), [editor]);
11759
11834
  return /* @__PURE__ */ import_react58.default.createElement(
11760
11835
  "div",
@@ -11762,6 +11837,7 @@ var RufousTextEditor = ({
11762
11837
  className: `rf-rte-wrapper editor-wrapper ${resizable ? "rf-rte-resizable" : ""} ${sxClass} ${className || ""}`,
11763
11838
  style: {
11764
11839
  ...style,
11840
+ ...width ? { width: typeof width === "number" ? `${width}px` : width } : {},
11765
11841
  ...height ? { height: typeof height === "number" ? `${height}px` : height } : {}
11766
11842
  }
11767
11843
  },
@@ -11775,7 +11851,8 @@ var RufousTextEditor = ({
11775
11851
  onSpeechToText,
11776
11852
  onTextToSpeech,
11777
11853
  onImageUpload,
11778
- onClose
11854
+ onClose,
11855
+ visibleButtons: toolbarButtons
11779
11856
  }
11780
11857
  ), /* @__PURE__ */ import_react58.default.createElement(import_react59.EditorContent, { editor, className: "editor-content-wrapper" }), /* @__PURE__ */ import_react58.default.createElement(ImageToolbar_default, { editor }), /* @__PURE__ */ import_react58.default.createElement(VideoToolbar_default, { editor }), editor && /* @__PURE__ */ import_react58.default.createElement(
11781
11858
  import_react59.BubbleMenu,
@@ -11890,16 +11967,7 @@ var RufousTextEditor = ({
11890
11967
  },
11891
11968
  "\u201C Quote"
11892
11969
  )
11893
- ), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-left" }, /* @__PURE__ */ import_react58.default.createElement(
11894
- "select",
11895
- {
11896
- value: saveFormat,
11897
- onChange: (e) => setSaveFormat(e.target.value),
11898
- className: "format-select"
11899
- },
11900
- /* @__PURE__ */ import_react58.default.createElement("option", { value: "html" }, "HTML"),
11901
- /* @__PURE__ */ import_react58.default.createElement("option", { value: "json" }, "JSON")
11902
- ), onSaveProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export"), /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleClear, className: "status-btn clear-btn" }, "Clear")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react58.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react58.default.createElement(
11970
+ ), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react58.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react58.default.createElement(
11903
11971
  "input",
11904
11972
  {
11905
11973
  type: "url",