@react-email/editor 0.0.0-experimental.41 → 0.0.0-experimental.43

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.
Files changed (67) hide show
  1. package/dist/core/index.cjs +4 -3
  2. package/dist/core/index.d.cts +2 -2
  3. package/dist/core/index.d.mts +3 -3
  4. package/dist/core/index.mjs +3 -3
  5. package/dist/{create-paste-handler-CGR738bC.d.mts → create-paste-handler-DsJYKisA.d.mts} +1 -1
  6. package/dist/{create-paste-handler-CGR738bC.d.mts.map → create-paste-handler-DsJYKisA.d.mts.map} +1 -1
  7. package/dist/{event-bus-fb8U7hrl.cjs → event-bus-BJn1dJM1.cjs} +20 -3
  8. package/dist/{event-bus-CHEzOS_O.mjs → event-bus-DJpnfDHw.mjs} +14 -3
  9. package/dist/{event-bus-CHEzOS_O.mjs.map → event-bus-DJpnfDHw.mjs.map} +1 -1
  10. package/dist/{extension-w5VaUeSw.cjs → extension-CF0s-pGh.cjs} +301 -37
  11. package/dist/{extension-DyY8_bh4.mjs → extension-DcToBuV0.mjs} +301 -13
  12. package/dist/extension-DcToBuV0.mjs.map +1 -0
  13. package/dist/extensions/index.cjs +3 -3
  14. package/dist/extensions/index.d.cts +1 -1
  15. package/dist/extensions/index.d.cts.map +1 -1
  16. package/dist/extensions/index.d.mts +2 -2
  17. package/dist/extensions/index.d.mts.map +1 -1
  18. package/dist/extensions/index.mjs +3 -3
  19. package/dist/{extensions-CkjPj2JO.cjs → extensions-B6VCxUmi.cjs} +68 -25
  20. package/dist/{extensions-BvfmaKCn.mjs → extensions-mStGDfMH.mjs} +63 -20
  21. package/dist/extensions-mStGDfMH.mjs.map +1 -0
  22. package/dist/{styles-C-cCyJCn.cjs → global-content-C5WjNoMX.cjs} +88 -0
  23. package/dist/{styles-_TMw3YxC.mjs → global-content-CjA49_jE.mjs} +78 -2
  24. package/dist/global-content-CjA49_jE.mjs.map +1 -0
  25. package/dist/{index-C4KcMQ0R.d.cts → index-LCPnE_xx.d.cts} +66 -3
  26. package/dist/index-LCPnE_xx.d.cts.map +1 -0
  27. package/dist/{index-CxX7W63O.d.mts → index-i5JdL0UD.d.mts} +67 -4
  28. package/dist/index-i5JdL0UD.d.mts.map +1 -0
  29. package/dist/index.cjs +4 -4
  30. package/dist/index.d.mts +3 -3
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +3 -3
  33. package/dist/plugins/index.cjs +1 -5
  34. package/dist/plugins/index.d.cts +5 -123
  35. package/dist/plugins/index.d.cts.map +1 -1
  36. package/dist/plugins/index.d.mts +5 -123
  37. package/dist/plugins/index.d.mts.map +1 -1
  38. package/dist/plugins/index.mjs +2 -2
  39. package/dist/{root-pS4l8bVZ.mjs → root-BVs63m-4.mjs} +39 -39
  40. package/dist/root-BVs63m-4.mjs.map +1 -0
  41. package/dist/{root-Jq1R3tkX.cjs → root-D6lslKju.cjs} +2 -2
  42. package/dist/{set-text-alignment-OA8IMWmO.mjs → set-text-alignment-GMXOPMlJ.mjs} +1 -1
  43. package/dist/{set-text-alignment-OA8IMWmO.mjs.map → set-text-alignment-GMXOPMlJ.mjs.map} +1 -1
  44. package/dist/types-BNEbRz-a.d.cts +47 -0
  45. package/dist/types-BNEbRz-a.d.cts.map +1 -0
  46. package/dist/types-C8k-blF7.d.mts +47 -0
  47. package/dist/types-C8k-blF7.d.mts.map +1 -0
  48. package/dist/ui/index.cjs +645 -2
  49. package/dist/ui/index.d.cts +307 -128
  50. package/dist/ui/index.d.cts.map +1 -1
  51. package/dist/ui/index.d.mts +263 -84
  52. package/dist/ui/index.d.mts.map +1 -1
  53. package/dist/ui/index.mjs +630 -3
  54. package/dist/ui/index.mjs.map +1 -1
  55. package/dist/utils/index.cjs +1 -1
  56. package/dist/utils/index.mjs +1 -1
  57. package/package.json +2 -2
  58. package/dist/extension-DyY8_bh4.mjs.map +0 -1
  59. package/dist/extensions-BvfmaKCn.mjs.map +0 -1
  60. package/dist/global-content-D_WYaFgX.mjs +0 -78
  61. package/dist/global-content-D_WYaFgX.mjs.map +0 -1
  62. package/dist/global-content-bJgotqmA.cjs +0 -89
  63. package/dist/index-C4KcMQ0R.d.cts.map +0 -1
  64. package/dist/index-CxX7W63O.d.mts.map +0 -1
  65. package/dist/root-pS4l8bVZ.mjs.map +0 -1
  66. package/dist/styles-_TMw3YxC.mjs.map +0 -1
  67. /package/dist/{set-text-alignment-Cv72txmv.cjs → set-text-alignment-aNb7Ml9N.cjs} +0 -0
@@ -1,7 +1,7 @@
1
- import { a as MAX_COLUMNS_DEPTH, c as getColumnsDepth, t as editorEventBus } from "./event-bus-CHEzOS_O.mjs";
2
- import { t as setTextAlignment } from "./set-text-alignment-OA8IMWmO.mjs";
1
+ import { l as getColumnsDepth, o as MAX_COLUMNS_DEPTH, t as editorEventBus } from "./event-bus-DJpnfDHw.mjs";
2
+ import { t as setTextAlignment } from "./set-text-alignment-GMXOPMlJ.mjs";
3
3
  import { useCurrentEditor, useEditorState } from "@tiptap/react";
4
- import * as React from "react";
4
+ import * as React$1 from "react";
5
5
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { PluginKey } from "@tiptap/pm/state";
@@ -736,9 +736,9 @@ function UnlinkIcon({ size, width, height, ...props }) {
736
736
 
737
737
  //#endregion
738
738
  //#region src/ui/bubble-menu/context.tsx
739
- const BubbleMenuContext = React.createContext(null);
739
+ const BubbleMenuContext = React$1.createContext(null);
740
740
  function useBubbleMenuContext() {
741
- const context = React.useContext(BubbleMenuContext);
741
+ const context = React$1.useContext(BubbleMenuContext);
742
742
  if (!context) throw new Error("BubbleMenu compound components must be used within <BubbleMenu.Root>");
743
743
  return context;
744
744
  }
@@ -816,12 +816,12 @@ function focusEditor(editor) {
816
816
  //#region src/ui/bubble-menu/button-form.tsx
817
817
  function BubbleMenuButtonForm({ className, validateUrl, onLinkApply, onLinkRemove }) {
818
818
  const { editor, isEditing, setIsEditing } = useBubbleMenuContext();
819
- const inputRef = React.useRef(null);
820
- const formRef = React.useRef(null);
819
+ const inputRef = React$1.useRef(null);
820
+ const formRef = React$1.useRef(null);
821
821
  const buttonHref = editor.getAttributes("button").href ?? "";
822
822
  const displayHref = buttonHref === "#" ? "" : buttonHref;
823
- const [inputValue, setInputValue] = React.useState(displayHref);
824
- React.useEffect(() => {
823
+ const [inputValue, setInputValue] = React$1.useState(displayHref);
824
+ React$1.useEffect(() => {
825
825
  if (!isEditing) return;
826
826
  const currentHref = editor.getAttributes("button").href ?? "";
827
827
  setInputValue(currentHref === "#" ? "" : currentHref);
@@ -830,7 +830,7 @@ function BubbleMenuButtonForm({ className, validateUrl, onLinkApply, onLinkRemov
830
830
  }, 0);
831
831
  return () => clearTimeout(timeoutId);
832
832
  }, [isEditing, editor]);
833
- React.useEffect(() => {
833
+ React$1.useEffect(() => {
834
834
  if (!isEditing) return;
835
835
  const handleKeyDown = (event) => {
836
836
  if (event.key === "Escape") setIsEditing(false);
@@ -980,7 +980,7 @@ const bubbleMenuTriggers = {
980
980
  const defaultPluginKey = new PluginKey("bubbleMenu");
981
981
  function BubbleMenuRoot({ trigger, pluginKey: pluginKey$1 = defaultPluginKey, hideWhenActiveNodes = [], hideWhenActiveMarks = [], placement = "bottom", offset: offset$1 = 8, onHide, className, children, ...rest }) {
982
982
  const { editor } = useCurrentEditor();
983
- const [isEditing, setIsEditing] = React.useState(false);
983
+ const [isEditing, setIsEditing] = React$1.useState(false);
984
984
  const resolvedTrigger = trigger ?? bubbleMenuTriggers.textSelection(hideWhenActiveNodes, hideWhenActiveMarks);
985
985
  if (!editor) return null;
986
986
  return /* @__PURE__ */ jsx(BubbleMenu, {
@@ -1177,10 +1177,10 @@ const BubbleMenuItalic = createMarkBubbleItem({
1177
1177
  //#region src/ui/bubble-menu/link-selector.tsx
1178
1178
  function BubbleMenuLinkSelector({ className, showToggle = true, validateUrl, onLinkApply, onLinkRemove, children, open: controlledOpen, onOpenChange }) {
1179
1179
  const { editor } = useBubbleMenuContext();
1180
- const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
1180
+ const [uncontrolledOpen, setUncontrolledOpen] = React$1.useState(false);
1181
1181
  const isControlled = controlledOpen !== void 0;
1182
1182
  const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
1183
- const setIsOpen = React.useCallback((value) => {
1183
+ const setIsOpen = React$1.useCallback((value) => {
1184
1184
  if (!isControlled) setUncontrolledOpen(value);
1185
1185
  onOpenChange?.(value);
1186
1186
  }, [isControlled, onOpenChange]);
@@ -1192,9 +1192,9 @@ function BubbleMenuLinkSelector({ className, showToggle = true, validateUrl, onL
1192
1192
  currentHref: editor$1?.getAttributes("link").href || ""
1193
1193
  })
1194
1194
  });
1195
- const setIsOpenRef = React.useRef(setIsOpen);
1195
+ const setIsOpenRef = React$1.useRef(setIsOpen);
1196
1196
  setIsOpenRef.current = setIsOpen;
1197
- React.useEffect(() => {
1197
+ React$1.useEffect(() => {
1198
1198
  const subscription = editorEventBus.on("bubble-menu:add-link", () => {
1199
1199
  setIsOpenRef.current(true);
1200
1200
  });
@@ -1233,17 +1233,17 @@ function BubbleMenuLinkSelector({ className, showToggle = true, validateUrl, onL
1233
1233
  });
1234
1234
  }
1235
1235
  function LinkForm({ editor, currentHref, validateUrl, onLinkApply, onLinkRemove, setIsOpen, children }) {
1236
- const inputRef = React.useRef(null);
1237
- const formRef = React.useRef(null);
1236
+ const inputRef = React$1.useRef(null);
1237
+ const formRef = React$1.useRef(null);
1238
1238
  const displayHref = currentHref === "#" ? "" : currentHref;
1239
- const [inputValue, setInputValue] = React.useState(displayHref);
1240
- React.useEffect(() => {
1239
+ const [inputValue, setInputValue] = React$1.useState(displayHref);
1240
+ React$1.useEffect(() => {
1241
1241
  const timeoutId = setTimeout(() => {
1242
1242
  inputRef.current?.focus();
1243
1243
  }, 0);
1244
1244
  return () => clearTimeout(timeoutId);
1245
1245
  }, []);
1246
- React.useEffect(() => {
1246
+ React$1.useEffect(() => {
1247
1247
  const handleKeyDown = (event) => {
1248
1248
  if (event.key === "Escape") {
1249
1249
  if (editor.getAttributes("link").href === "#") editor.chain().unsetLink().run();
@@ -1335,18 +1335,18 @@ function LinkForm({ editor, currentHref, validateUrl, onLinkApply, onLinkRemove,
1335
1335
 
1336
1336
  //#endregion
1337
1337
  //#region src/ui/bubble-menu/node-selector.tsx
1338
- const NodeSelectorContext = React.createContext(null);
1338
+ const NodeSelectorContext = React$1.createContext(null);
1339
1339
  function useNodeSelectorContext() {
1340
- const context = React.useContext(NodeSelectorContext);
1340
+ const context = React$1.useContext(NodeSelectorContext);
1341
1341
  if (!context) throw new Error("NodeSelector compound components must be used within <NodeSelector.Root>");
1342
1342
  return context;
1343
1343
  }
1344
1344
  function NodeSelectorRoot({ omit = [], open: controlledOpen, onOpenChange, className, children }) {
1345
1345
  const { editor } = useBubbleMenuContext();
1346
- const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
1346
+ const [uncontrolledOpen, setUncontrolledOpen] = React$1.useState(false);
1347
1347
  const isControlled = controlledOpen !== void 0;
1348
1348
  const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
1349
- const setIsOpen = React.useCallback((value) => {
1349
+ const setIsOpen = React$1.useCallback((value) => {
1350
1350
  if (!isControlled) setUncontrolledOpen(value);
1351
1351
  onOpenChange?.(value);
1352
1352
  }, [isControlled, onOpenChange]);
@@ -1363,7 +1363,7 @@ function NodeSelectorRoot({ omit = [], open: controlledOpen, onOpenChange, class
1363
1363
  isCodeBlockActive: editor$1?.isActive("codeBlock") ?? false
1364
1364
  })
1365
1365
  });
1366
- const allItems = React.useMemo(() => [
1366
+ const allItems = React$1.useMemo(() => [
1367
1367
  {
1368
1368
  name: "Text",
1369
1369
  icon: TextIcon,
@@ -1413,9 +1413,9 @@ function NodeSelectorRoot({ omit = [], open: controlledOpen, onOpenChange, class
1413
1413
  isActive: editorState?.isCodeBlockActive ?? false
1414
1414
  }
1415
1415
  ], [editor, editorState]);
1416
- const items = React.useMemo(() => allItems.filter((item) => !omit.includes(item.name)), [allItems, omit]);
1417
- const activeItem = React.useMemo(() => items.find((item) => item.isActive) ?? { name: "Multiple" }, [items]);
1418
- const contextValue = React.useMemo(() => ({
1416
+ const items = React$1.useMemo(() => allItems.filter((item) => !omit.includes(item.name)), [allItems, omit]);
1417
+ const activeItem = React$1.useMemo(() => items.find((item) => item.isActive) ?? { name: "Multiple" }, [items]);
1418
+ const contextValue = React$1.useMemo(() => ({
1419
1419
  items,
1420
1420
  activeItem,
1421
1421
  isOpen,
@@ -1516,18 +1516,18 @@ const BubbleMenuUppercase = createMarkBubbleItem({
1516
1516
  //#region src/ui/bubble-menu/default.tsx
1517
1517
  const textPluginKey = new PluginKey("textBubbleMenu");
1518
1518
  function BubbleMenuDefault({ excludeItems = [], hideWhenActiveNodes, hideWhenActiveMarks, placement, offset: offset$1, onHide, className, ...rest }) {
1519
- const [isNodeSelectorOpen, setIsNodeSelectorOpen] = React.useState(false);
1520
- const [isLinkSelectorOpen, setIsLinkSelectorOpen] = React.useState(false);
1519
+ const [isNodeSelectorOpen, setIsNodeSelectorOpen] = React$1.useState(false);
1520
+ const [isLinkSelectorOpen, setIsLinkSelectorOpen] = React$1.useState(false);
1521
1521
  const has = (item) => !excludeItems.includes(item);
1522
- const handleNodeSelectorOpenChange = React.useCallback((open) => {
1522
+ const handleNodeSelectorOpenChange = React$1.useCallback((open) => {
1523
1523
  setIsNodeSelectorOpen(open);
1524
1524
  if (open) setIsLinkSelectorOpen(false);
1525
1525
  }, []);
1526
- const handleLinkSelectorOpenChange = React.useCallback((open) => {
1526
+ const handleLinkSelectorOpenChange = React$1.useCallback((open) => {
1527
1527
  setIsLinkSelectorOpen(open);
1528
1528
  if (open) setIsNodeSelectorOpen(false);
1529
1529
  }, []);
1530
- const handleHide = React.useCallback(() => {
1530
+ const handleHide = React$1.useCallback(() => {
1531
1531
  setIsNodeSelectorOpen(false);
1532
1532
  setIsLinkSelectorOpen(false);
1533
1533
  onHide?.();
@@ -1648,15 +1648,15 @@ function BubbleMenuLinkEditLink({ className, children, onClick, onMouseDown, ...
1648
1648
  //#region src/ui/bubble-menu/link-form.tsx
1649
1649
  function BubbleMenuLinkForm({ className, validateUrl, onLinkApply, onLinkRemove, children }) {
1650
1650
  const { editor, isEditing, setIsEditing } = useBubbleMenuContext();
1651
- const inputRef = React.useRef(null);
1652
- const formRef = React.useRef(null);
1651
+ const inputRef = React$1.useRef(null);
1652
+ const formRef = React$1.useRef(null);
1653
1653
  const linkHref = useEditorState({
1654
1654
  editor,
1655
1655
  selector: ({ editor: e }) => e?.getAttributes("link").href ?? ""
1656
1656
  });
1657
1657
  const displayHref = (linkHref ?? "") === "#" ? "" : linkHref ?? "";
1658
- const [inputValue, setInputValue] = React.useState(displayHref);
1659
- React.useEffect(() => {
1658
+ const [inputValue, setInputValue] = React$1.useState(displayHref);
1659
+ React$1.useEffect(() => {
1660
1660
  if (!isEditing) return;
1661
1661
  setInputValue(displayHref);
1662
1662
  const timeoutId = setTimeout(() => {
@@ -1664,7 +1664,7 @@ function BubbleMenuLinkForm({ className, validateUrl, onLinkApply, onLinkRemove,
1664
1664
  }, 0);
1665
1665
  return () => clearTimeout(timeoutId);
1666
1666
  }, [isEditing, displayHref]);
1667
- React.useEffect(() => {
1667
+ React$1.useEffect(() => {
1668
1668
  if (!isEditing) return;
1669
1669
  const handleKeyDown = (event) => {
1670
1670
  if (event.key === "Escape") setIsEditing(false);
@@ -2313,4 +2313,4 @@ function SlashCommandRoot({ items: itemsProp, filterItems: filterItemsProp, char
2313
2313
 
2314
2314
  //#endregion
2315
2315
  export { BubbleMenuButtonForm as $, BubbleMenuImageEditLink as A, AlignRightIcon as At, BubbleMenuItalic as B, BubbleMenuLinkUnlink as C, Columns2 as Ct, BubbleMenuLinkEditLink as D, Check as Dt, BubbleMenuLinkForm as E, ChevronDown as Et, BubbleMenuNodeSelector as F, BubbleMenuAlignLeft as G, BubbleMenuCode as H, NodeSelectorContent as I, BubbleMenuButtonDefault as J, BubbleMenuAlignCenter as K, NodeSelectorRoot as L, BubbleMenuUppercase as M, AlignCenterIcon as Mt, BubbleMenuUnderline as N, BubbleMenuImageDefault as O, CaseUpperIcon as Ot, BubbleMenuStrike as P, BubbleMenuButtonToolbar as Q, NodeSelectorTrigger as R, BubbleMenuLinkDefault as S, Columns3 as St, BubbleMenuLinkOpenLink as T, CodeIcon as Tt, BubbleMenuBold as U, BubbleMenuItemGroup as V, BubbleMenuAlignRight as W, bubbleMenuTriggers as X, BubbleMenuRoot as Y, BubbleMenuButtonUnlink as Z, TWO_COLUMNS as _, Heading3 as _t, BUTTON as a, Text as at, isAtMaxColumnsDepth as b, ExternalLinkIcon as bt, FOUR_COLUMNS as c, SquareCode as ct, H3 as d, PencilIcon as dt, BubbleMenuButtonEditLink as et, NUMBERED_LIST as f, MousePointer as ft, THREE_COLUMNS as g, ItalicIcon as gt, TEXT as h, LinkIcon as ht, BULLET_LIST as i, TextQuote as it, BubbleMenuDefault as j, AlignLeftIcon as jt, BubbleMenuImageToolbar as k, BoldIcon as kt, H1 as l, SplitSquareVertical as lt, SECTION as m, List as mt, filterAndRankItems as n, UnlinkIcon as nt, CODE as o, TextIcon as ot, QUOTE as p, ListOrdered as pt, BubbleMenuItem as q, scoreItem as r, UnderlineIcon as rt, DIVIDER as s, StrikethroughIcon as st, SlashCommandRoot as t, useBubbleMenuContext as tt, H2 as u, Rows2 as ut, defaultSlashCommands as v, Heading2 as vt, BubbleMenuLinkToolbar as w, Code as wt, isInsideNode as x, Columns4 as xt, CommandList as y, Heading1 as yt, BubbleMenuLinkSelector as z };
2316
- //# sourceMappingURL=root-pS4l8bVZ.mjs.map
2316
+ //# sourceMappingURL=root-BVs63m-4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-BVs63m-4.mjs","names":["React","React","React","pluginKey","offset","editor","editor","editor","editor","React","editor","React","editor","React","offset","offset","React","offset","SplitSquareVerticalIcon","Rows2Icon"],"sources":["../src/ui/icons/align-center.tsx","../src/ui/icons/align-left.tsx","../src/ui/icons/align-right.tsx","../src/ui/icons/bold.tsx","../src/ui/icons/case-upper.tsx","../src/ui/icons/check.tsx","../src/ui/icons/chevron-down.tsx","../src/ui/icons/code.tsx","../src/ui/icons/columns-2.tsx","../src/ui/icons/columns-3.tsx","../src/ui/icons/columns-4.tsx","../src/ui/icons/external-link.tsx","../src/ui/icons/heading-1.tsx","../src/ui/icons/heading-2.tsx","../src/ui/icons/heading-3.tsx","../src/ui/icons/italic.tsx","../src/ui/icons/link.tsx","../src/ui/icons/list.tsx","../src/ui/icons/list-ordered.tsx","../src/ui/icons/mouse-pointer.tsx","../src/ui/icons/pencil.tsx","../src/ui/icons/rows-2.tsx","../src/ui/icons/split-square-vertical.tsx","../src/ui/icons/square-code.tsx","../src/ui/icons/strikethrough.tsx","../src/ui/icons/text.tsx","../src/ui/icons/text-quote.tsx","../src/ui/icons/underline.tsx","../src/ui/icons/unlink.tsx","../src/ui/bubble-menu/context.tsx","../src/ui/bubble-menu/button-edit-link.tsx","../src/ui/bubble-menu/utils.ts","../src/ui/bubble-menu/button-form.tsx","../src/ui/bubble-menu/button-toolbar.tsx","../src/ui/bubble-menu/button-unlink.tsx","../src/ui/bubble-menu/triggers.ts","../src/ui/bubble-menu/root.tsx","../src/ui/bubble-menu/button-default.tsx","../src/ui/bubble-menu/item.tsx","../src/ui/bubble-menu/align-center.tsx","../src/ui/bubble-menu/align-left.tsx","../src/ui/bubble-menu/align-right.tsx","../src/ui/bubble-menu/create-mark-bubble-item.tsx","../src/ui/bubble-menu/bold.tsx","../src/ui/bubble-menu/code.tsx","../src/ui/bubble-menu/group.tsx","../src/ui/bubble-menu/italic.tsx","../src/ui/bubble-menu/link-selector.tsx","../src/ui/bubble-menu/node-selector.tsx","../src/ui/bubble-menu/strike.tsx","../src/ui/bubble-menu/underline.tsx","../src/ui/bubble-menu/uppercase.tsx","../src/ui/bubble-menu/default.tsx","../src/ui/bubble-menu/image-edit-link.tsx","../src/ui/bubble-menu/image-toolbar.tsx","../src/ui/bubble-menu/image-default.tsx","../src/ui/bubble-menu/link-edit-link.tsx","../src/ui/bubble-menu/link-form.tsx","../src/ui/bubble-menu/link-open-link.tsx","../src/ui/bubble-menu/link-toolbar.tsx","../src/ui/bubble-menu/link-unlink.tsx","../src/ui/bubble-menu/link-default.tsx","../src/ui/slash-command/utils.ts","../src/ui/slash-command/command-list.tsx","../src/ui/slash-command/commands.tsx","../src/ui/slash-command/search.ts","../src/ui/slash-command/root.tsx"],"sourcesContent":["import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignCenterIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21 5H3\" />\n <path d=\"M17 12H7\" />\n <path d=\"M19 19H5\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignLeftIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21 5H3\" />\n <path d=\"M15 12H3\" />\n <path d=\"M17 19H3\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignRightIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21 5H3\" />\n <path d=\"M21 12H9\" />\n <path d=\"M21 19H7\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function BoldIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function CaseUpperIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M15 11h4.5a1 1 0 0 1 0 5h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h3a1 1 0 0 1 0 5\" />\n <path d=\"m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16\" />\n <path d=\"M3.304 13h6.392\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Check({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function ChevronDown({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function CodeIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m16 18 6-6-6-6\" />\n <path d=\"m8 6-6 6 6 6\" />\n </svg>\n );\n}\n\nexport const Code = CodeIcon;\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Columns2({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M12 3v18\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Columns3({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Columns4({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M7.5 3v18\" />\n <path d=\"M12 3v18\" />\n <path d=\"M16.5 3v18\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function ExternalLinkIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Heading1({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"m17 12 3-2v8\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Heading2({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Heading3({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2\" />\n <path d=\"M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function ItalicIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function LinkIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function List({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M3 5h.01\" />\n <path d=\"M3 12h.01\" />\n <path d=\"M3 19h.01\" />\n <path d=\"M8 5h13\" />\n <path d=\"M8 12h13\" />\n <path d=\"M8 19h13\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function ListOrdered({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M11 5h10\" />\n <path d=\"M11 12h10\" />\n <path d=\"M11 19h10\" />\n <path d=\"M4 4h1v5\" />\n <path d=\"M4 9h2\" />\n <path d=\"M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function MousePointer({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M12.586 12.586 19 19\" />\n <path d=\"M3.688 3.037a.497.497 0 0 0-.651.651l6.5 15.999a.501.501 0 0 0 .947-.062l1.569-6.083a2 2 0 0 1 1.448-1.479l6.124-1.579a.5.5 0 0 0 .063-.947z\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function PencilIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function Rows2({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 12h18\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function SplitSquareVertical({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M5 8V5c0-1 1-2 2-2h10c1 0 2 1 2 2v3\" />\n <path d=\"M19 16v3c0 1-1 2-2 2H7c-1 0-2-1-2-2v-3\" />\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function SquareCode({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m10 9-3 3 3 3\" />\n <path d=\"m14 15 3-3-3-3\" />\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function StrikethroughIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n <path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function TextIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21 5H3\" />\n <path d=\"M15 12H3\" />\n <path d=\"M17 19H3\" />\n </svg>\n );\n}\n\nexport const Text = TextIcon;\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function TextQuote({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M17 5H3\" />\n <path d=\"M21 12H8\" />\n <path d=\"M21 19H8\" />\n <path d=\"M3 12v7\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function UnderlineIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function UnlinkIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71\" />\n <path d=\"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71\" />\n <line x1=\"8\" x2=\"8\" y1=\"2\" y2=\"5\" />\n <line x1=\"2\" x2=\"5\" y1=\"8\" y2=\"8\" />\n <line x1=\"16\" x2=\"16\" y1=\"19\" y2=\"22\" />\n <line x1=\"19\" x2=\"22\" y1=\"16\" y2=\"16\" />\n </svg>\n );\n}\n","import type { Editor } from '@tiptap/core';\nimport * as React from 'react';\n\nexport interface BubbleMenuContextValue {\n editor: Editor;\n isEditing: boolean;\n setIsEditing: (value: boolean) => void;\n}\n\nexport const BubbleMenuContext =\n React.createContext<BubbleMenuContextValue | null>(null);\n\nexport function useBubbleMenuContext(): BubbleMenuContextValue {\n const context = React.useContext(BubbleMenuContext);\n if (!context) {\n throw new Error(\n 'BubbleMenu compound components must be used within <BubbleMenu.Root>',\n );\n }\n return context;\n}\n","import type * as React from 'react';\nimport { PencilIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuButtonEditLinkProps\n extends Omit<React.ComponentProps<'button'>, 'type'> {}\n\nexport function BubbleMenuButtonEditLink({\n className,\n children,\n onClick,\n onMouseDown,\n ...rest\n}: BubbleMenuButtonEditLinkProps) {\n const { setIsEditing } = useBubbleMenuContext();\n\n return (\n <button\n {...rest}\n type=\"button\"\n aria-label=\"Edit link\"\n data-re-btn-bm-item=\"\"\n data-item=\"edit-link\"\n className={className}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n onClick={(e) => {\n onClick?.(e);\n setIsEditing(true);\n }}\n >\n {children ?? <PencilIcon />}\n </button>\n );\n}\n","import type { Editor } from '@tiptap/core';\n\nconst SAFE_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'tel:']);\n\n/**\n * Basic URL validation and auto-prefixing.\n * Rejects dangerous schemes (javascript:, data:, vbscript:, etc.).\n * Returns the valid URL string or null.\n */\nexport function getUrlFromString(str: string): string | null {\n if (str === '#') {\n return str;\n }\n\n try {\n const url = new URL(str);\n if (SAFE_PROTOCOLS.has(url.protocol)) {\n return str;\n }\n return null;\n } catch {\n // not a valid URL as-is\n }\n\n try {\n if (str.includes('.') && !str.includes(' ')) {\n return new URL(`https://${str}`).toString();\n }\n } catch {\n // still not valid\n }\n\n return null;\n}\n\nexport function setLinkHref(editor: Editor, href: string): void {\n if (href.length === 0) {\n editor.chain().unsetLink().run();\n return;\n }\n\n const { from, to } = editor.state.selection;\n if (from === to) {\n editor\n .chain()\n .extendMarkRange('link')\n .setLink({ href })\n .setTextSelection({ from, to })\n .run();\n return;\n }\n\n editor.chain().setLink({ href }).run();\n}\n\nexport function focusEditor(editor: Editor): void {\n setTimeout(() => {\n editor.commands.focus();\n }, 0);\n}\n","import * as React from 'react';\nimport { Check, UnlinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport { focusEditor, getUrlFromString } from './utils';\n\nexport interface BubbleMenuButtonFormProps {\n className?: string;\n validateUrl?: (value: string) => string | null;\n onLinkApply?: (href: string) => void;\n onLinkRemove?: () => void;\n}\n\nexport function BubbleMenuButtonForm({\n className,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n}: BubbleMenuButtonFormProps) {\n const { editor, isEditing, setIsEditing } = useBubbleMenuContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const buttonHref = (editor.getAttributes('button').href as string) ?? '';\n const displayHref = buttonHref === '#' ? '' : buttonHref;\n const [inputValue, setInputValue] = React.useState(displayHref);\n\n React.useEffect(() => {\n if (!isEditing) {\n return;\n }\n const currentHref = (editor.getAttributes('button').href as string) ?? '';\n const display = currentHref === '#' ? '' : currentHref;\n setInputValue(display);\n const timeoutId = setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n return () => clearTimeout(timeoutId);\n }, [isEditing, editor]);\n\n React.useEffect(() => {\n if (!isEditing) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsEditing(false);\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (formRef.current && !formRef.current.contains(event.target as Node)) {\n const form = formRef.current;\n const submitEvent = new Event('submit', {\n bubbles: true,\n cancelable: true,\n });\n form.dispatchEvent(submitEvent);\n setIsEditing(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isEditing, setIsEditing]);\n\n if (!isEditing) {\n return null;\n }\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n\n const value = inputValue.trim();\n\n if (value === '') {\n editor.commands.updateButton({ href: '#' });\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n const validate = validateUrl ?? getUrlFromString;\n const finalValue = validate(value);\n\n if (!finalValue) {\n editor.commands.updateButton({ href: '#' });\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n editor.commands.updateButton({ href: finalValue });\n setIsEditing(false);\n focusEditor(editor);\n onLinkApply?.(finalValue);\n }\n\n function handleUnlink(e: React.MouseEvent) {\n e.stopPropagation();\n editor.commands.updateButton({ href: '#' });\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n }\n\n return (\n <form\n ref={formRef}\n data-re-btn-bm-form=\"\"\n className={className}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onSubmit={handleSubmit}\n >\n <input\n ref={inputRef}\n data-re-btn-bm-input=\"\"\n value={inputValue}\n onFocus={(e) => e.stopPropagation()}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Paste a link\"\n type=\"text\"\n />\n\n {displayHref ? (\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n data-re-btn-bm-unlink=\"\"\n onClick={handleUnlink}\n >\n <UnlinkIcon />\n </button>\n ) : (\n <button\n type=\"submit\"\n aria-label=\"Apply link\"\n data-re-btn-bm-apply=\"\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <Check />\n </button>\n )}\n </form>\n );\n}\n","import type * as React from 'react';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuButtonToolbarProps\n extends React.ComponentProps<'div'> {}\n\nexport function BubbleMenuButtonToolbar({\n children,\n ...rest\n}: BubbleMenuButtonToolbarProps) {\n const { isEditing } = useBubbleMenuContext();\n\n if (isEditing) {\n return null;\n }\n\n return (\n <div data-re-btn-bm-toolbar=\"\" {...rest}>\n {children}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { UnlinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport { focusEditor } from './utils';\n\nexport interface BubbleMenuButtonUnlinkProps\n extends Omit<React.ComponentProps<'button'>, 'type'> {\n onLinkRemove?: () => void;\n}\n\nexport function BubbleMenuButtonUnlink({\n className,\n children,\n onClick,\n onMouseDown,\n onLinkRemove,\n ...rest\n}: BubbleMenuButtonUnlinkProps) {\n const { editor } = useBubbleMenuContext();\n\n return (\n <button\n {...rest}\n type=\"button\"\n aria-label=\"Remove link\"\n data-re-btn-bm-item=\"\"\n data-item=\"unlink\"\n className={className}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n onClick={(e) => {\n onClick?.(e);\n editor.commands.updateButton({ href: '#' });\n focusEditor(editor);\n onLinkRemove?.();\n }}\n >\n {children ?? <UnlinkIcon />}\n </button>\n );\n}\n","import type { Editor } from '@tiptap/core';\nimport type { EditorState } from '@tiptap/pm/state';\nimport type { EditorView } from '@tiptap/pm/view';\n\nexport interface TriggerParams {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n}\n\nexport type TriggerFn = (params: TriggerParams) => boolean;\n\nexport const bubbleMenuTriggers = {\n textSelection(\n hideWhenActiveNodes: string[] = [],\n hideWhenActiveMarks: string[] = [],\n ): TriggerFn {\n return ({ editor, state }) => {\n for (const node of hideWhenActiveNodes) {\n if (editor.isActive(node)) {\n return false;\n }\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === node) {\n return false;\n }\n }\n }\n for (const mark of hideWhenActiveMarks) {\n if (editor.isActive(mark)) {\n return false;\n }\n }\n return editor.view.state.selection.content().size > 0;\n };\n },\n\n node(name: string): TriggerFn {\n return ({ editor }) => editor.isActive(name);\n },\n\n nodeWithoutSelection(name: string): TriggerFn {\n return ({ editor }) =>\n editor.isActive(name) && editor.view.state.selection.content().size === 0;\n },\n};\n","import { PluginKey } from '@tiptap/pm/state';\nimport { useCurrentEditor } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport * as React from 'react';\nimport { BubbleMenuContext } from './context';\nimport { bubbleMenuTriggers, type TriggerFn } from './triggers';\n\nconst defaultPluginKey = new PluginKey('bubbleMenu');\n\nexport interface BubbleMenuRootProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n trigger?: TriggerFn;\n pluginKey?: PluginKey;\n hideWhenActiveNodes?: string[];\n hideWhenActiveMarks?: string[];\n placement?: 'top' | 'bottom';\n offset?: number;\n onHide?: () => void;\n children: React.ReactNode;\n}\n\nexport function BubbleMenuRoot({\n trigger,\n pluginKey = defaultPluginKey,\n hideWhenActiveNodes = [],\n hideWhenActiveMarks = [],\n placement = 'bottom',\n offset = 8,\n onHide,\n className,\n children,\n ...rest\n}: BubbleMenuRootProps) {\n const { editor } = useCurrentEditor();\n const [isEditing, setIsEditing] = React.useState(false);\n\n const resolvedTrigger =\n trigger ??\n bubbleMenuTriggers.textSelection(hideWhenActiveNodes, hideWhenActiveMarks);\n\n if (!editor) {\n return null;\n }\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey={pluginKey}\n data-re-bubble-menu=\"\"\n shouldShow={resolvedTrigger}\n options={{\n placement,\n offset,\n onHide: () => {\n setIsEditing(false);\n onHide?.();\n },\n }}\n className={className}\n {...rest}\n >\n <BubbleMenuContext.Provider value={{ editor, isEditing, setIsEditing }}>\n {children}\n </BubbleMenuContext.Provider>\n </BubbleMenu>\n );\n}\n","import { PluginKey } from '@tiptap/pm/state';\nimport { useEditorState } from '@tiptap/react';\nimport type * as React from 'react';\nimport { BubbleMenuButtonEditLink } from './button-edit-link';\nimport { BubbleMenuButtonForm } from './button-form';\nimport { BubbleMenuButtonToolbar } from './button-toolbar';\nimport { BubbleMenuButtonUnlink } from './button-unlink';\nimport { useBubbleMenuContext } from './context';\nimport { BubbleMenuRoot } from './root';\nimport { bubbleMenuTriggers } from './triggers';\n\nconst buttonPluginKey = new PluginKey('buttonBubbleMenu');\n\nexport interface BubbleMenuButtonDefaultProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n placement?: 'top' | 'bottom';\n offset?: number;\n onHide?: () => void;\n validateUrl?: (value: string) => string | null;\n onLinkApply?: (href: string) => void;\n onLinkRemove?: () => void;\n}\n\nfunction BubbleMenuButtonDefaultInner({\n validateUrl,\n onLinkApply,\n onLinkRemove,\n}: Pick<\n BubbleMenuButtonDefaultProps,\n 'validateUrl' | 'onLinkApply' | 'onLinkRemove'\n>) {\n const { editor } = useBubbleMenuContext();\n const buttonHref = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n (e?.getAttributes('button').href as string) ?? '',\n });\n const hasLink = (buttonHref ?? '') !== '' && buttonHref !== '#';\n\n return (\n <>\n <BubbleMenuButtonToolbar>\n <BubbleMenuButtonEditLink />\n {hasLink && <BubbleMenuButtonUnlink onLinkRemove={onLinkRemove} />}\n </BubbleMenuButtonToolbar>\n <BubbleMenuButtonForm\n validateUrl={validateUrl}\n onLinkApply={onLinkApply}\n onLinkRemove={onLinkRemove}\n />\n </>\n );\n}\n\nexport function BubbleMenuButtonDefault({\n placement = 'top',\n offset,\n onHide,\n className,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n ...rest\n}: BubbleMenuButtonDefaultProps) {\n return (\n <BubbleMenuRoot\n trigger={bubbleMenuTriggers.node('button')}\n pluginKey={buttonPluginKey}\n placement={placement}\n offset={offset}\n onHide={onHide}\n className={className}\n {...rest}\n >\n <BubbleMenuButtonDefaultInner\n validateUrl={validateUrl}\n onLinkApply={onLinkApply}\n onLinkRemove={onLinkRemove}\n />\n </BubbleMenuRoot>\n );\n}\n","import type * as React from 'react';\n\nexport interface BubbleMenuItemProps extends React.ComponentProps<'button'> {\n /** Used for aria-label and data-item attribute */\n name: string;\n /** Whether this item is currently active */\n isActive: boolean;\n /** Called when clicked */\n onCommand: () => void;\n}\n\nexport function BubbleMenuItem({\n name,\n isActive,\n onCommand,\n className,\n children,\n ...rest\n}: BubbleMenuItemProps) {\n return (\n <button\n type=\"button\"\n aria-label={name}\n aria-pressed={isActive}\n className={className}\n data-re-bubble-menu-item=\"\"\n data-item={name}\n {...(isActive ? { 'data-active': '' } : {})}\n onMouseDown={(e) => e.preventDefault()}\n onClick={onCommand}\n {...rest}\n >\n {children}\n </button>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport { setTextAlignment } from '../../utils/set-text-alignment';\nimport { AlignCenterIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport type { PreWiredItemProps } from './create-mark-bubble-item';\nimport { BubbleMenuItem } from './item';\n\nexport function BubbleMenuAlignCenter({\n className,\n children,\n}: PreWiredItemProps) {\n const { editor } = useBubbleMenuContext();\n\n const isActive = useEditorState({\n editor,\n selector: ({ editor }) =>\n editor?.isActive({ alignment: 'center' }) ?? false,\n });\n\n return (\n <BubbleMenuItem\n name=\"align-center\"\n isActive={isActive}\n onCommand={() => setTextAlignment(editor, 'center')}\n className={className}\n >\n {children ?? <AlignCenterIcon />}\n </BubbleMenuItem>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport { setTextAlignment } from '../../utils/set-text-alignment';\nimport { AlignLeftIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport type { PreWiredItemProps } from './create-mark-bubble-item';\nimport { BubbleMenuItem } from './item';\n\nexport function BubbleMenuAlignLeft({\n className,\n children,\n}: PreWiredItemProps) {\n const { editor } = useBubbleMenuContext();\n\n const isActive = useEditorState({\n editor,\n selector: ({ editor }) => editor?.isActive({ alignment: 'left' }) ?? false,\n });\n\n return (\n <BubbleMenuItem\n name=\"align-left\"\n isActive={isActive}\n onCommand={() => setTextAlignment(editor, 'left')}\n className={className}\n >\n {children ?? <AlignLeftIcon />}\n </BubbleMenuItem>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport { setTextAlignment } from '../../utils/set-text-alignment';\nimport { AlignRightIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport type { PreWiredItemProps } from './create-mark-bubble-item';\nimport { BubbleMenuItem } from './item';\n\nexport function BubbleMenuAlignRight({\n className,\n children,\n}: PreWiredItemProps) {\n const { editor } = useBubbleMenuContext();\n\n const isActive = useEditorState({\n editor,\n selector: ({ editor }) => editor?.isActive({ alignment: 'right' }) ?? false,\n });\n\n return (\n <BubbleMenuItem\n name=\"align-right\"\n isActive={isActive}\n onCommand={() => setTextAlignment(editor, 'right')}\n className={className}\n >\n {children ?? <AlignRightIcon />}\n </BubbleMenuItem>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport type * as React from 'react';\nimport { useBubbleMenuContext } from './context';\nimport { BubbleMenuItem } from './item';\n\nexport interface PreWiredItemProps {\n className?: string;\n /** Override the default icon */\n children?: React.ReactNode;\n}\n\ninterface MarkBubbleItemConfig {\n name: string;\n activeName: string;\n activeParams?: Record<string, unknown>;\n command: string;\n icon: React.ReactNode;\n}\n\nexport function createMarkBubbleItem(config: MarkBubbleItemConfig) {\n function MarkBubbleItem({ className, children }: PreWiredItemProps) {\n const { editor } = useBubbleMenuContext();\n\n const isActive = useEditorState({\n editor,\n selector: ({ editor }) => {\n if (config.activeParams) {\n return (\n editor?.isActive(config.activeName, config.activeParams) ?? false\n );\n }\n return editor?.isActive(config.activeName) ?? false;\n },\n });\n\n const handleCommand = () => {\n const chain = editor.chain().focus();\n const method = (chain as unknown as Record<string, () => typeof chain>)[\n config.command\n ];\n if (method) {\n method.call(chain).run();\n }\n };\n\n return (\n <BubbleMenuItem\n name={config.name}\n isActive={isActive}\n onCommand={handleCommand}\n className={className}\n >\n {children ?? config.icon}\n </BubbleMenuItem>\n );\n }\n\n MarkBubbleItem.displayName = `BubbleMenu${config.name.charAt(0).toUpperCase() + config.name.slice(1)}`;\n\n return MarkBubbleItem;\n}\n","import { BoldIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuBold = createMarkBubbleItem({\n name: 'bold',\n activeName: 'bold',\n command: 'toggleBold',\n icon: <BoldIcon />,\n});\n","import { CodeIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuCode = createMarkBubbleItem({\n name: 'code',\n activeName: 'code',\n command: 'toggleCode',\n icon: <CodeIcon />,\n});\n","import type * as React from 'react';\n\nexport interface BubbleMenuItemGroupProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport function BubbleMenuItemGroup({\n className,\n children,\n}: BubbleMenuItemGroupProps) {\n return (\n <fieldset className={className} data-re-bubble-menu-group=\"\">\n {children}\n </fieldset>\n );\n}\n","import { ItalicIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuItalic = createMarkBubbleItem({\n name: 'italic',\n activeName: 'italic',\n command: 'toggleItalic',\n icon: <ItalicIcon />,\n});\n","import type { Editor } from '@tiptap/core';\nimport { useEditorState } from '@tiptap/react';\nimport * as React from 'react';\nimport { editorEventBus } from '../../core/event-bus';\nimport { Check, LinkIcon, UnlinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport { focusEditor, getUrlFromString, setLinkHref } from './utils';\n\nexport interface BubbleMenuLinkSelectorProps {\n className?: string;\n /** Whether to show the link icon toggle button (default: true) */\n showToggle?: boolean;\n /** Custom URL validator. Return the valid URL string or null. */\n validateUrl?: (value: string) => string | null;\n /** Called after link is applied */\n onLinkApply?: (href: string) => void;\n /** Called after link is removed */\n onLinkRemove?: () => void;\n /** Plugin slot: extra actions rendered inside the link input form */\n children?: React.ReactNode;\n /** Controlled open state */\n open?: boolean;\n /** Called when open state changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function BubbleMenuLinkSelector({\n className,\n showToggle = true,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n children,\n open: controlledOpen,\n onOpenChange,\n}: BubbleMenuLinkSelectorProps) {\n const { editor } = useBubbleMenuContext();\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n const setIsOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n const editorState = useEditorState({\n editor,\n selector: ({ editor }) => ({\n isLinkActive: editor?.isActive('link') ?? false,\n hasLink: Boolean(editor?.getAttributes('link').href),\n currentHref: (editor?.getAttributes('link').href as string) || '',\n }),\n });\n\n const setIsOpenRef = React.useRef(setIsOpen);\n setIsOpenRef.current = setIsOpen;\n\n React.useEffect(() => {\n const subscription = editorEventBus.on('bubble-menu:add-link', () => {\n setIsOpenRef.current(true);\n });\n\n return () => {\n setIsOpenRef.current(false);\n subscription.unsubscribe();\n };\n }, []);\n\n if (!editorState) {\n return null;\n }\n\n const handleOpenLink = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <div\n data-re-link-selector=\"\"\n {...(isOpen ? { 'data-open': '' } : {})}\n {...(editorState.hasLink ? { 'data-has-link': '' } : {})}\n className={className}\n >\n {showToggle && (\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label=\"Add link\"\n aria-pressed={editorState.isLinkActive && editorState.hasLink}\n data-re-link-selector-trigger=\"\"\n onClick={handleOpenLink}\n >\n <LinkIcon />\n </button>\n )}\n {isOpen && (\n <LinkForm\n editor={editor}\n currentHref={editorState.currentHref}\n validateUrl={validateUrl}\n onLinkApply={onLinkApply}\n onLinkRemove={onLinkRemove}\n setIsOpen={setIsOpen}\n >\n {children}\n </LinkForm>\n )}\n </div>\n );\n}\n\ninterface LinkFormProps {\n editor: Editor;\n currentHref: string;\n validateUrl?: (value: string) => string | null;\n onLinkApply?: (href: string) => void;\n onLinkRemove?: () => void;\n setIsOpen: (state: boolean) => void;\n children?: React.ReactNode;\n}\n\nfunction LinkForm({\n editor,\n currentHref,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n setIsOpen,\n children,\n}: LinkFormProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n const displayHref = currentHref === '#' ? '' : currentHref;\n const [inputValue, setInputValue] = React.useState(displayHref);\n\n React.useEffect(() => {\n const timeoutId = setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n return () => clearTimeout(timeoutId);\n }, []);\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n if (editor.getAttributes('link').href === '#') {\n editor.chain().unsetLink().run();\n }\n setIsOpen(false);\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (formRef.current && !formRef.current.contains(event.target as Node)) {\n const form = formRef.current;\n const submitEvent = new Event('submit', {\n bubbles: true,\n cancelable: true,\n });\n form.dispatchEvent(submitEvent);\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [editor, setIsOpen]);\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n\n const value = inputValue.trim();\n\n if (value === '') {\n setLinkHref(editor, '');\n setIsOpen(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n const validate = validateUrl ?? getUrlFromString;\n const finalValue = validate(value);\n\n if (!finalValue) {\n setLinkHref(editor, '');\n setIsOpen(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n setLinkHref(editor, finalValue);\n setIsOpen(false);\n focusEditor(editor);\n onLinkApply?.(finalValue);\n }\n\n function handleUnlink(e: React.MouseEvent) {\n e.stopPropagation();\n setLinkHref(editor, '');\n setIsOpen(false);\n focusEditor(editor);\n onLinkRemove?.();\n }\n\n return (\n <form\n ref={formRef}\n data-re-link-selector-form=\"\"\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onSubmit={handleSubmit}\n >\n <input\n ref={inputRef}\n data-re-link-selector-input=\"\"\n value={inputValue}\n onFocus={(e) => e.stopPropagation()}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Paste a link\"\n type=\"text\"\n />\n\n {children}\n\n {displayHref ? (\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n data-re-link-selector-unlink=\"\"\n onClick={handleUnlink}\n >\n <UnlinkIcon />\n </button>\n ) : (\n <button\n type=\"submit\"\n aria-label=\"Apply link\"\n data-re-link-selector-apply=\"\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <Check />\n </button>\n )}\n </form>\n );\n}\n","import * as Popover from '@radix-ui/react-popover';\nimport { useEditorState } from '@tiptap/react';\nimport * as React from 'react';\nimport {\n Check,\n ChevronDown,\n Code,\n Heading1,\n Heading2,\n Heading3,\n List,\n ListOrdered,\n TextIcon,\n TextQuote,\n} from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport type NodeType =\n | 'Text'\n | 'Title'\n | 'Subtitle'\n | 'Heading'\n | 'Bullet List'\n | 'Numbered List'\n | 'Quote'\n | 'Code';\n\nexport interface NodeSelectorItem {\n name: NodeType;\n icon: React.ComponentType<React.SVGAttributes<SVGSVGElement>>;\n command: () => void;\n isActive: boolean;\n}\n\ninterface NodeSelectorContextValue {\n items: NodeSelectorItem[];\n activeItem: NodeSelectorItem | { name: 'Multiple' };\n isOpen: boolean;\n setIsOpen: (value: boolean) => void;\n}\n\nconst NodeSelectorContext =\n React.createContext<NodeSelectorContextValue | null>(null);\n\nfunction useNodeSelectorContext(): NodeSelectorContextValue {\n const context = React.useContext(NodeSelectorContext);\n if (!context) {\n throw new Error(\n 'NodeSelector compound components must be used within <NodeSelector.Root>',\n );\n }\n return context;\n}\n\nexport interface NodeSelectorRootProps {\n /** Block types to exclude */\n omit?: string[];\n /** Controlled open state */\n open?: boolean;\n /** Called when open state changes */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport function NodeSelectorRoot({\n omit = [],\n open: controlledOpen,\n onOpenChange,\n className,\n children,\n}: NodeSelectorRootProps) {\n const { editor } = useBubbleMenuContext();\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n const setIsOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n const editorState = useEditorState({\n editor,\n selector: ({ editor }) => ({\n isParagraphActive:\n (editor?.isActive('paragraph') ?? false) &&\n !editor?.isActive('bulletList') &&\n !editor?.isActive('orderedList'),\n isHeading1Active: editor?.isActive('heading', { level: 1 }) ?? false,\n isHeading2Active: editor?.isActive('heading', { level: 2 }) ?? false,\n isHeading3Active: editor?.isActive('heading', { level: 3 }) ?? false,\n isBulletListActive: editor?.isActive('bulletList') ?? false,\n isOrderedListActive: editor?.isActive('orderedList') ?? false,\n isBlockquoteActive: editor?.isActive('blockquote') ?? false,\n isCodeBlockActive: editor?.isActive('codeBlock') ?? false,\n }),\n });\n\n const allItems: NodeSelectorItem[] = React.useMemo(\n () => [\n {\n name: 'Text' as const,\n icon: TextIcon,\n command: () =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .toggleNode('paragraph', 'paragraph')\n .run(),\n isActive: editorState?.isParagraphActive ?? false,\n },\n {\n name: 'Title' as const,\n icon: Heading1,\n command: () =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),\n isActive: editorState?.isHeading1Active ?? false,\n },\n {\n name: 'Subtitle' as const,\n icon: Heading2,\n command: () =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),\n isActive: editorState?.isHeading2Active ?? false,\n },\n {\n name: 'Heading' as const,\n icon: Heading3,\n command: () =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),\n isActive: editorState?.isHeading3Active ?? false,\n },\n {\n name: 'Bullet List' as const,\n icon: List,\n command: () =>\n editor.chain().focus().clearNodes().toggleBulletList().run(),\n isActive: editorState?.isBulletListActive ?? false,\n },\n {\n name: 'Numbered List' as const,\n icon: ListOrdered,\n command: () =>\n editor.chain().focus().clearNodes().toggleOrderedList().run(),\n isActive: editorState?.isOrderedListActive ?? false,\n },\n {\n name: 'Quote' as const,\n icon: TextQuote,\n command: () =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .toggleNode('paragraph', 'paragraph')\n .toggleBlockquote()\n .run(),\n isActive: editorState?.isBlockquoteActive ?? false,\n },\n {\n name: 'Code' as const,\n icon: Code,\n command: () =>\n editor.chain().focus().clearNodes().toggleCodeBlock().run(),\n isActive: editorState?.isCodeBlockActive ?? false,\n },\n ],\n [editor, editorState],\n );\n\n const items = React.useMemo(\n () => allItems.filter((item) => !omit.includes(item.name)),\n [allItems, omit],\n );\n\n const activeItem = React.useMemo(\n () =>\n items.find((item) => item.isActive) ?? {\n name: 'Multiple' as const,\n },\n [items],\n );\n\n const contextValue = React.useMemo(\n () => ({ items, activeItem, isOpen, setIsOpen }),\n [items, activeItem, isOpen, setIsOpen],\n );\n\n if (!editorState || items.length === 0) {\n return null;\n }\n\n return (\n <NodeSelectorContext.Provider value={contextValue}>\n <Popover.Root open={isOpen} onOpenChange={setIsOpen}>\n <div\n data-re-node-selector=\"\"\n {...(isOpen ? { 'data-open': '' } : {})}\n className={className}\n >\n {children}\n </div>\n </Popover.Root>\n </NodeSelectorContext.Provider>\n );\n}\n\nexport interface NodeSelectorTriggerProps {\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function NodeSelectorTrigger({\n className,\n children,\n}: NodeSelectorTriggerProps) {\n const { activeItem, isOpen, setIsOpen } = useNodeSelectorContext();\n\n return (\n <Popover.Trigger\n data-re-node-selector-trigger=\"\"\n className={className}\n onClick={() => setIsOpen(!isOpen)}\n >\n {children ?? (\n <>\n <span>{activeItem.name}</span>\n <ChevronDown />\n </>\n )}\n </Popover.Trigger>\n );\n}\n\nexport interface NodeSelectorContentProps {\n className?: string;\n /** Popover alignment (default: \"start\") */\n align?: 'start' | 'center' | 'end';\n /** Render-prop for full control over item rendering.\n * Receives the filtered items and a `close` function to dismiss the popover. */\n children?: (items: NodeSelectorItem[], close: () => void) => React.ReactNode;\n}\n\nexport function NodeSelectorContent({\n className,\n align = 'start',\n children,\n}: NodeSelectorContentProps) {\n const { items, setIsOpen } = useNodeSelectorContext();\n\n return (\n <Popover.Content\n align={align}\n data-re-node-selector-content=\"\"\n className={className}\n >\n {children\n ? children(items, () => setIsOpen(false))\n : items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.name}\n type=\"button\"\n data-re-node-selector-item=\"\"\n {...(item.isActive ? { 'data-active': '' } : {})}\n onClick={() => {\n item.command();\n setIsOpen(false);\n }}\n >\n <Icon />\n <span>{item.name}</span>\n {item.isActive && <Check />}\n </button>\n );\n })}\n </Popover.Content>\n );\n}\n\nexport interface BubbleMenuNodeSelectorProps {\n /** Block types to exclude */\n omit?: string[];\n className?: string;\n /** Override the trigger content (default: active item name + chevron icon) */\n triggerContent?: React.ReactNode;\n /** Controlled open state */\n open?: boolean;\n /** Called when open state changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function BubbleMenuNodeSelector({\n omit = [],\n className,\n triggerContent,\n open,\n onOpenChange,\n}: BubbleMenuNodeSelectorProps) {\n return (\n <NodeSelectorRoot\n omit={omit}\n open={open}\n onOpenChange={onOpenChange}\n className={className}\n >\n <NodeSelectorTrigger>{triggerContent}</NodeSelectorTrigger>\n <NodeSelectorContent />\n </NodeSelectorRoot>\n );\n}\n","import { StrikethroughIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuStrike = createMarkBubbleItem({\n name: 'strike',\n activeName: 'strike',\n command: 'toggleStrike',\n icon: <StrikethroughIcon />,\n});\n","import { UnderlineIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuUnderline = createMarkBubbleItem({\n name: 'underline',\n activeName: 'underline',\n command: 'toggleUnderline',\n icon: <UnderlineIcon />,\n});\n","import { CaseUpperIcon } from '../icons';\nimport { createMarkBubbleItem } from './create-mark-bubble-item';\n\nexport const BubbleMenuUppercase = createMarkBubbleItem({\n name: 'uppercase',\n activeName: 'uppercase',\n command: 'toggleUppercase',\n icon: <CaseUpperIcon />,\n});\n","import { PluginKey } from '@tiptap/pm/state';\nimport * as React from 'react';\nimport { BubbleMenuAlignCenter } from './align-center';\nimport { BubbleMenuAlignLeft } from './align-left';\nimport { BubbleMenuAlignRight } from './align-right';\nimport { BubbleMenuBold } from './bold';\nimport { BubbleMenuCode } from './code';\nimport { BubbleMenuItemGroup } from './group';\nimport { BubbleMenuItalic } from './italic';\nimport { BubbleMenuLinkSelector } from './link-selector';\nimport { BubbleMenuNodeSelector } from './node-selector';\nimport { BubbleMenuRoot } from './root';\nimport { BubbleMenuStrike } from './strike';\nimport { BubbleMenuUnderline } from './underline';\nimport { BubbleMenuUppercase } from './uppercase';\n\nconst textPluginKey = new PluginKey('textBubbleMenu');\n\ntype ExcludableItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'uppercase'\n | 'align-left'\n | 'align-center'\n | 'align-right'\n | 'node-selector'\n | 'link-selector';\n\nexport interface BubbleMenuDefaultProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n excludeItems?: ExcludableItem[];\n hideWhenActiveNodes?: string[];\n hideWhenActiveMarks?: string[];\n placement?: 'top' | 'bottom';\n offset?: number;\n onHide?: () => void;\n}\n\nexport function BubbleMenuDefault({\n excludeItems = [],\n hideWhenActiveNodes,\n hideWhenActiveMarks,\n placement,\n offset,\n onHide,\n className,\n ...rest\n}: BubbleMenuDefaultProps) {\n const [isNodeSelectorOpen, setIsNodeSelectorOpen] = React.useState(false);\n const [isLinkSelectorOpen, setIsLinkSelectorOpen] = React.useState(false);\n\n const has = (item: ExcludableItem) => !excludeItems.includes(item);\n\n const handleNodeSelectorOpenChange = React.useCallback((open: boolean) => {\n setIsNodeSelectorOpen(open);\n if (open) {\n setIsLinkSelectorOpen(false);\n }\n }, []);\n\n const handleLinkSelectorOpenChange = React.useCallback((open: boolean) => {\n setIsLinkSelectorOpen(open);\n if (open) {\n setIsNodeSelectorOpen(false);\n }\n }, []);\n\n const handleHide = React.useCallback(() => {\n setIsNodeSelectorOpen(false);\n setIsLinkSelectorOpen(false);\n onHide?.();\n }, [onHide]);\n\n const hasFormattingItems =\n has('bold') ||\n has('italic') ||\n has('underline') ||\n has('strike') ||\n has('code') ||\n has('uppercase');\n\n const hasAlignmentItems =\n has('align-left') || has('align-center') || has('align-right');\n\n return (\n <BubbleMenuRoot\n pluginKey={textPluginKey}\n hideWhenActiveNodes={hideWhenActiveNodes}\n hideWhenActiveMarks={hideWhenActiveMarks}\n placement={placement}\n offset={offset}\n onHide={handleHide}\n className={className}\n {...rest}\n >\n {has('node-selector') && (\n <BubbleMenuNodeSelector\n open={isNodeSelectorOpen}\n onOpenChange={handleNodeSelectorOpenChange}\n />\n )}\n {has('link-selector') && (\n <BubbleMenuLinkSelector\n open={isLinkSelectorOpen}\n onOpenChange={handleLinkSelectorOpenChange}\n />\n )}\n {hasFormattingItems && (\n <BubbleMenuItemGroup>\n {has('bold') && <BubbleMenuBold />}\n {has('italic') && <BubbleMenuItalic />}\n {has('underline') && <BubbleMenuUnderline />}\n {has('strike') && <BubbleMenuStrike />}\n {has('code') && <BubbleMenuCode />}\n {has('uppercase') && <BubbleMenuUppercase />}\n </BubbleMenuItemGroup>\n )}\n {hasAlignmentItems && (\n <BubbleMenuItemGroup>\n {has('align-left') && <BubbleMenuAlignLeft />}\n {has('align-center') && <BubbleMenuAlignCenter />}\n {has('align-right') && <BubbleMenuAlignRight />}\n </BubbleMenuItemGroup>\n )}\n </BubbleMenuRoot>\n );\n}\n","import type * as React from 'react';\nimport { LinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuImageEditLinkProps\n extends Omit<React.ComponentProps<'button'>, 'type'> {}\n\nexport function BubbleMenuImageEditLink({\n className,\n children,\n onClick,\n onMouseDown,\n ...rest\n}: BubbleMenuImageEditLinkProps) {\n const { setIsEditing } = useBubbleMenuContext();\n\n return (\n <button\n {...rest}\n type=\"button\"\n aria-label=\"Edit link\"\n data-re-img-bm-item=\"\"\n data-item=\"edit-link\"\n className={className}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n onClick={(e) => {\n onClick?.(e);\n setIsEditing(true);\n }}\n >\n {children ?? <LinkIcon />}\n </button>\n );\n}\n","import type * as React from 'react';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuImageToolbarProps\n extends React.ComponentProps<'div'> {}\n\nexport function BubbleMenuImageToolbar({\n children,\n ...rest\n}: BubbleMenuImageToolbarProps) {\n const { isEditing } = useBubbleMenuContext();\n\n if (isEditing) {\n return null;\n }\n\n return (\n <div data-re-img-bm-toolbar=\"\" {...rest}>\n {children}\n </div>\n );\n}\n","import { PluginKey } from '@tiptap/pm/state';\nimport type * as React from 'react';\nimport { BubbleMenuImageEditLink } from './image-edit-link';\nimport { BubbleMenuImageToolbar } from './image-toolbar';\nimport { BubbleMenuRoot } from './root';\nimport { bubbleMenuTriggers } from './triggers';\n\nconst imagePluginKey = new PluginKey('imageBubbleMenu');\n\ntype ExcludableItem = 'edit-link';\n\nexport interface BubbleMenuImageDefaultProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n excludeItems?: ExcludableItem[];\n placement?: 'top' | 'bottom';\n offset?: number;\n onHide?: () => void;\n}\n\nexport function BubbleMenuImageDefault({\n excludeItems = [],\n placement = 'top',\n offset,\n onHide,\n className,\n ...rest\n}: BubbleMenuImageDefaultProps) {\n const hasEditLink = !excludeItems.includes('edit-link');\n\n return (\n <BubbleMenuRoot\n trigger={bubbleMenuTriggers.node('image')}\n pluginKey={imagePluginKey}\n placement={placement}\n offset={offset}\n onHide={onHide}\n className={className}\n {...rest}\n >\n {hasEditLink && (\n <BubbleMenuImageToolbar>\n <BubbleMenuImageEditLink />\n </BubbleMenuImageToolbar>\n )}\n </BubbleMenuRoot>\n );\n}\n","import type * as React from 'react';\nimport { PencilIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuLinkEditLinkProps\n extends Omit<React.ComponentProps<'button'>, 'type'> {}\n\nexport function BubbleMenuLinkEditLink({\n className,\n children,\n onClick,\n onMouseDown,\n ...rest\n}: BubbleMenuLinkEditLinkProps) {\n const { setIsEditing } = useBubbleMenuContext();\n\n return (\n <button\n type=\"button\"\n aria-label=\"Edit link\"\n data-re-link-bm-item=\"\"\n data-item=\"edit-link\"\n className={className}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n onClick={(e) => {\n onClick?.(e);\n setIsEditing(true);\n }}\n {...rest}\n >\n {children ?? <PencilIcon />}\n </button>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport * as React from 'react';\nimport { Check, UnlinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\nimport { focusEditor, getUrlFromString, setLinkHref } from './utils';\n\nexport interface BubbleMenuLinkFormProps {\n className?: string;\n validateUrl?: (value: string) => string | null;\n onLinkApply?: (href: string) => void;\n onLinkRemove?: () => void;\n children?: React.ReactNode;\n}\n\nexport function BubbleMenuLinkForm({\n className,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n children,\n}: BubbleMenuLinkFormProps) {\n const { editor, isEditing, setIsEditing } = useBubbleMenuContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const linkHref = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n (e?.getAttributes('link').href as string) ?? '',\n });\n\n const displayHref = (linkHref ?? '') === '#' ? '' : (linkHref ?? '');\n const [inputValue, setInputValue] = React.useState(displayHref);\n\n React.useEffect(() => {\n if (!isEditing) {\n return;\n }\n setInputValue(displayHref);\n const timeoutId = setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n return () => clearTimeout(timeoutId);\n }, [isEditing, displayHref]);\n\n React.useEffect(() => {\n if (!isEditing) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsEditing(false);\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (formRef.current && !formRef.current.contains(event.target as Node)) {\n const form = formRef.current;\n const submitEvent = new Event('submit', {\n bubbles: true,\n cancelable: true,\n });\n form.dispatchEvent(submitEvent);\n setIsEditing(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isEditing, setIsEditing]);\n\n if (!isEditing) {\n return null;\n }\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n\n const value = inputValue.trim();\n\n if (value === '') {\n setLinkHref(editor, '');\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n const validate = validateUrl ?? getUrlFromString;\n const finalValue = validate(value);\n\n if (!finalValue) {\n setLinkHref(editor, '');\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n return;\n }\n\n setLinkHref(editor, finalValue);\n setIsEditing(false);\n focusEditor(editor);\n onLinkApply?.(finalValue);\n }\n\n function handleUnlink(e: React.MouseEvent) {\n e.stopPropagation();\n setLinkHref(editor, '');\n setIsEditing(false);\n focusEditor(editor);\n onLinkRemove?.();\n }\n\n return (\n <form\n ref={formRef}\n data-re-link-bm-form=\"\"\n className={className}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onSubmit={handleSubmit}\n >\n <input\n ref={inputRef}\n data-re-link-bm-input=\"\"\n value={inputValue}\n onFocus={(e) => e.stopPropagation()}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Paste a link\"\n type=\"text\"\n />\n\n {children}\n\n {displayHref ? (\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n data-re-link-bm-unlink=\"\"\n onClick={handleUnlink}\n >\n <UnlinkIcon />\n </button>\n ) : (\n <button\n type=\"submit\"\n aria-label=\"Apply link\"\n data-re-link-bm-apply=\"\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <Check />\n </button>\n )}\n </form>\n );\n}\n","import { useEditorState } from '@tiptap/react';\nimport type * as React from 'react';\nimport { ExternalLinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuLinkOpenLinkProps\n extends Omit<React.ComponentProps<'a'>, 'href' | 'target' | 'rel'> {}\n\nexport function BubbleMenuLinkOpenLink({\n className,\n children,\n ...rest\n}: BubbleMenuLinkOpenLinkProps) {\n const { editor } = useBubbleMenuContext();\n\n const linkHref = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n (e?.getAttributes('link').href as string) ?? '',\n });\n\n return (\n <a\n {...rest}\n href={linkHref ?? ''}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Open link\"\n data-re-link-bm-item=\"\"\n data-item=\"open-link\"\n className={className}\n >\n {children ?? <ExternalLinkIcon />}\n </a>\n );\n}\n","import type * as React from 'react';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuLinkToolbarProps\n extends React.ComponentProps<'div'> {}\n\nexport function BubbleMenuLinkToolbar({\n children,\n ...rest\n}: BubbleMenuLinkToolbarProps) {\n const { isEditing } = useBubbleMenuContext();\n\n if (isEditing) {\n return null;\n }\n\n return (\n <div data-re-link-bm-toolbar=\"\" {...rest}>\n {children}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { UnlinkIcon } from '../icons';\nimport { useBubbleMenuContext } from './context';\n\nexport interface BubbleMenuLinkUnlinkProps\n extends Omit<React.ComponentProps<'button'>, 'type'> {}\n\nexport function BubbleMenuLinkUnlink({\n className,\n children,\n onClick,\n onMouseDown,\n ...rest\n}: BubbleMenuLinkUnlinkProps) {\n const { editor } = useBubbleMenuContext();\n\n return (\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n data-re-link-bm-item=\"\"\n data-item=\"unlink\"\n className={className}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n onClick={(e) => {\n onClick?.(e);\n editor.chain().focus().unsetLink().run();\n }}\n {...rest}\n >\n {children ?? <UnlinkIcon />}\n </button>\n );\n}\n","import { PluginKey } from '@tiptap/pm/state';\nimport type * as React from 'react';\nimport { BubbleMenuLinkEditLink } from './link-edit-link';\nimport { BubbleMenuLinkForm } from './link-form';\nimport { BubbleMenuLinkOpenLink } from './link-open-link';\nimport { BubbleMenuLinkToolbar } from './link-toolbar';\nimport { BubbleMenuLinkUnlink } from './link-unlink';\nimport { BubbleMenuRoot } from './root';\nimport { bubbleMenuTriggers } from './triggers';\n\nconst linkPluginKey = new PluginKey('linkBubbleMenu');\n\ntype ExcludableItem = 'edit-link' | 'open-link' | 'unlink';\n\nexport interface BubbleMenuLinkDefaultProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n excludeItems?: ExcludableItem[];\n placement?: 'top' | 'bottom';\n offset?: number;\n onHide?: () => void;\n validateUrl?: (value: string) => string | null;\n onLinkApply?: (href: string) => void;\n onLinkRemove?: () => void;\n}\n\nexport function BubbleMenuLinkDefault({\n excludeItems = [],\n placement = 'top',\n offset,\n onHide,\n className,\n validateUrl,\n onLinkApply,\n onLinkRemove,\n ...rest\n}: BubbleMenuLinkDefaultProps) {\n const has = (item: ExcludableItem) => !excludeItems.includes(item);\n\n const hasToolbarItems = has('edit-link') || has('open-link') || has('unlink');\n\n return (\n <BubbleMenuRoot\n trigger={bubbleMenuTriggers.nodeWithoutSelection('link')}\n pluginKey={linkPluginKey}\n placement={placement}\n offset={offset}\n onHide={onHide}\n className={className}\n {...rest}\n >\n {hasToolbarItems && (\n <BubbleMenuLinkToolbar>\n {has('edit-link') && <BubbleMenuLinkEditLink />}\n {has('open-link') && <BubbleMenuLinkOpenLink />}\n {has('unlink') && <BubbleMenuLinkUnlink />}\n </BubbleMenuLinkToolbar>\n )}\n <BubbleMenuLinkForm\n validateUrl={validateUrl}\n onLinkApply={onLinkApply}\n onLinkRemove={onLinkRemove}\n />\n </BubbleMenuRoot>\n );\n}\n","import type { Editor } from '@tiptap/core';\nimport { getColumnsDepth, MAX_COLUMNS_DEPTH } from '../../extensions/columns';\n\nexport function isInsideNode(editor: Editor, type: string): boolean {\n const { $from } = editor.state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === type) return true;\n }\n return false;\n}\n\nexport function isAtMaxColumnsDepth(editor: Editor): boolean {\n const { from } = editor.state.selection;\n return getColumnsDepth(editor.state.doc, from) >= MAX_COLUMNS_DEPTH;\n}\n\nexport function updateScrollView(\n container: HTMLElement,\n item: HTMLElement,\n): void {\n const containerRect = container.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n\n if (itemRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - itemRect.top;\n } else if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom;\n }\n}\n","import { useLayoutEffect, useRef } from 'react';\nimport type { CommandListProps, SlashCommandItem } from './types';\nimport { updateScrollView } from './utils';\n\nconst CATEGORY_ORDER = ['Text', 'Media', 'Layout', 'Utility'];\n\nfunction groupByCategory(\n items: SlashCommandItem[],\n): { category: string; items: SlashCommandItem[] }[] {\n const seen = new Map<string, SlashCommandItem[]>();\n\n for (const item of items) {\n const existing = seen.get(item.category);\n if (existing) {\n existing.push(item);\n } else {\n seen.set(item.category, [item]);\n }\n }\n\n const ordered: { category: string; items: SlashCommandItem[] }[] = [];\n for (const cat of CATEGORY_ORDER) {\n const group = seen.get(cat);\n if (group) {\n ordered.push({ category: cat, items: group });\n seen.delete(cat);\n }\n }\n for (const [category, group] of seen) {\n ordered.push({ category, items: group });\n }\n\n return ordered;\n}\n\ninterface CommandItemProps {\n item: SlashCommandItem;\n selected: boolean;\n onSelect: () => void;\n}\n\nfunction CommandItem({ item, selected, onSelect }: CommandItemProps) {\n return (\n <button\n data-re-slash-command-item=\"\"\n data-selected={selected || undefined}\n onClick={onSelect}\n type=\"button\"\n >\n {item.icon}\n <span>{item.title}</span>\n </button>\n );\n}\n\nexport function CommandList({\n items,\n query,\n selectedIndex,\n onSelect,\n}: CommandListProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const selected = container.querySelector<HTMLElement>('[data-selected]');\n if (selected) {\n updateScrollView(container, selected);\n }\n }, [selectedIndex]);\n\n if (items.length === 0) {\n return (\n <div data-re-slash-command=\"\">\n <div data-re-slash-command-empty=\"\">No results</div>\n </div>\n );\n }\n\n const isFiltering = query.trim().length > 0;\n\n if (isFiltering) {\n return (\n <div data-re-slash-command=\"\" ref={containerRef}>\n {items.map((item, index) => (\n <CommandItem\n item={item}\n key={item.title}\n onSelect={() => onSelect(index)}\n selected={index === selectedIndex}\n />\n ))}\n </div>\n );\n }\n\n const groups = groupByCategory(items);\n let flatIndex = 0;\n\n return (\n <div data-re-slash-command=\"\" ref={containerRef}>\n {groups.map((group) => (\n <div key={group.category}>\n <div data-re-slash-command-category=\"\">{group.category}</div>\n {group.items.map((item) => {\n const currentIndex = flatIndex++;\n return (\n <CommandItem\n item={item}\n key={item.title}\n onSelect={() => onSelect(currentIndex)}\n selected={currentIndex === selectedIndex}\n />\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import {\n Columns2,\n Columns3,\n Columns4,\n Heading1,\n Heading2,\n Heading3,\n List,\n ListOrdered,\n MousePointer,\n Rows2 as Rows2Icon,\n SplitSquareVertical as SplitSquareVerticalIcon,\n SquareCode,\n Text,\n TextQuote,\n} from '../icons';\nimport type { SlashCommandItem } from './types';\n\nexport const TEXT: SlashCommandItem = {\n title: 'Text',\n description: 'Plain text block',\n icon: <Text size={20} />,\n category: 'Text',\n searchTerms: ['p', 'paragraph'],\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n};\n\nexport const H1: SlashCommandItem = {\n title: 'Title',\n description: 'Large heading',\n icon: <Heading1 size={20} />,\n category: 'Text',\n searchTerms: ['title', 'big', 'large', 'h1'],\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n};\n\nexport const H2: SlashCommandItem = {\n title: 'Subtitle',\n description: 'Medium heading',\n icon: <Heading2 size={20} />,\n category: 'Text',\n searchTerms: ['subtitle', 'medium', 'h2'],\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n};\n\nexport const H3: SlashCommandItem = {\n title: 'Heading',\n description: 'Small heading',\n icon: <Heading3 size={20} />,\n category: 'Text',\n searchTerms: ['subtitle', 'small', 'h3'],\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n};\n\nexport const BULLET_LIST: SlashCommandItem = {\n title: 'Bullet list',\n description: 'Unordered list',\n icon: <List size={20} />,\n category: 'Text',\n searchTerms: ['unordered', 'point'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n};\n\nexport const NUMBERED_LIST: SlashCommandItem = {\n title: 'Numbered list',\n description: 'Ordered list',\n icon: <ListOrdered size={20} />,\n category: 'Text',\n searchTerms: ['ordered'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n};\n\nexport const QUOTE: SlashCommandItem = {\n title: 'Quote',\n description: 'Block quote',\n icon: <TextQuote size={20} />,\n category: 'Text',\n searchTerms: ['blockquote'],\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .toggleBlockquote()\n .run();\n },\n};\n\nexport const CODE: SlashCommandItem = {\n title: 'Code block',\n description: 'Code snippet',\n icon: <SquareCode size={20} />,\n category: 'Text',\n searchTerms: ['codeblock'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run();\n },\n};\n\nexport const BUTTON: SlashCommandItem = {\n title: 'Button',\n description: 'Clickable button',\n icon: <MousePointer size={20} />,\n category: 'Layout',\n searchTerms: ['button'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setButton().run();\n },\n};\n\nexport const DIVIDER: SlashCommandItem = {\n title: 'Divider',\n description: 'Horizontal separator',\n icon: <SplitSquareVerticalIcon size={20} />,\n category: 'Layout',\n searchTerms: ['hr', 'divider', 'separator'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setHorizontalRule().run();\n },\n};\n\nexport const SECTION: SlashCommandItem = {\n title: 'Section',\n description: 'Content section',\n icon: <Rows2Icon size={20} />,\n category: 'Layout',\n searchTerms: ['section', 'row', 'container'],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).insertSection().run();\n },\n};\n\nexport const TWO_COLUMNS: SlashCommandItem = {\n title: '2 columns',\n description: 'Two column layout',\n icon: <Columns2 size={20} />,\n category: 'Layout',\n searchTerms: [\n 'columns',\n 'column',\n 'layout',\n 'grid',\n 'split',\n 'side-by-side',\n 'multi-column',\n 'row',\n 'two',\n '2',\n ],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).insertColumns(2).run();\n },\n};\n\nexport const THREE_COLUMNS: SlashCommandItem = {\n title: '3 columns',\n description: 'Three column layout',\n icon: <Columns3 size={20} />,\n category: 'Layout',\n searchTerms: [\n 'columns',\n 'column',\n 'layout',\n 'grid',\n 'split',\n 'multi-column',\n 'row',\n 'three',\n '3',\n ],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).insertColumns(3).run();\n },\n};\n\nexport const FOUR_COLUMNS: SlashCommandItem = {\n title: '4 columns',\n description: 'Four column layout',\n icon: <Columns4 size={20} />,\n category: 'Layout',\n searchTerms: [\n 'columns',\n 'column',\n 'layout',\n 'grid',\n 'split',\n 'multi-column',\n 'row',\n 'four',\n '4',\n ],\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).insertColumns(4).run();\n },\n};\n\nexport const defaultSlashCommands: SlashCommandItem[] = [\n TEXT,\n H1,\n H2,\n H3,\n BULLET_LIST,\n NUMBERED_LIST,\n QUOTE,\n CODE,\n BUTTON,\n DIVIDER,\n SECTION,\n TWO_COLUMNS,\n THREE_COLUMNS,\n FOUR_COLUMNS,\n];\n","import type { SearchableItem } from './types';\n\nexport function scoreItem(item: SearchableItem, query: string): number {\n if (!query) return 100;\n\n const q = query.toLowerCase();\n const title = item.title.toLowerCase();\n const description = item.description.toLowerCase();\n const terms = item.searchTerms?.map((t) => t.toLowerCase()) ?? [];\n\n if (title === q) return 100;\n if (title.startsWith(q)) return 90;\n\n const titleWords = title.split(/\\s+/);\n if (titleWords.some((w) => w.startsWith(q))) return 80;\n\n if (terms.some((t) => t === q)) return 70;\n if (terms.some((t) => t.startsWith(q))) return 60;\n\n if (title.includes(q)) return 40;\n if (terms.some((t) => t.includes(q))) return 30;\n if (description.includes(q)) return 20;\n\n return 0;\n}\n\nexport function filterAndRankItems<T extends SearchableItem>(\n items: T[],\n query: string,\n): T[] {\n const trimmed = query.trim();\n if (!trimmed) return items;\n\n const scored = items\n .map((item) => ({ item, score: scoreItem(item, trimmed) }))\n .filter(({ score }) => score > 0);\n\n scored.sort((a, b) => b.score - a.score);\n\n return scored.map(({ item }) => item);\n}\n","import {\n autoUpdate,\n flip,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react-dom';\nimport type { Editor } from '@tiptap/core';\nimport { PluginKey } from '@tiptap/pm/state';\nimport { useCurrentEditor } from '@tiptap/react';\nimport Suggestion from '@tiptap/suggestion';\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { CommandList } from './command-list';\nimport { defaultSlashCommands } from './commands';\nimport { filterAndRankItems } from './search';\nimport type { SlashCommandItem, SlashCommandRootProps } from './types';\nimport { isAtMaxColumnsDepth } from './utils';\n\nconst pluginKey = new PluginKey('slash-command');\n\ninterface SuggestionState {\n active: boolean;\n query: string;\n items: SlashCommandItem[];\n clientRect: (() => DOMRect | null) | null;\n}\n\nconst INITIAL_STATE: SuggestionState = {\n active: false,\n query: '',\n items: [],\n clientRect: null,\n};\n\nfunction defaultFilterItems(\n items: SlashCommandItem[],\n query: string,\n editor: Editor,\n): SlashCommandItem[] {\n const filtered = isAtMaxColumnsDepth(editor)\n ? items.filter(\n (item) => item.category !== 'Layout' || !item.title.includes('column'),\n )\n : items;\n\n return filterAndRankItems(filtered, query);\n}\n\nexport function SlashCommandRoot({\n items: itemsProp,\n filterItems: filterItemsProp,\n char = '/',\n allow: allowProp,\n children,\n}: SlashCommandRootProps) {\n const { editor } = useCurrentEditor();\n const [state, setState] = useState<SuggestionState>(INITIAL_STATE);\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const itemsRef = useRef(itemsProp ?? defaultSlashCommands);\n const filterRef = useRef(filterItemsProp ?? defaultFilterItems);\n const allowRef = useRef(\n allowProp ??\n (({ editor: e }: { editor: Editor }) => !e.isActive('codeBlock')),\n );\n\n itemsRef.current = itemsProp ?? defaultSlashCommands;\n filterRef.current = filterItemsProp ?? defaultFilterItems;\n allowRef.current =\n allowProp ??\n (({ editor: e }: { editor: Editor }) => !e.isActive('codeBlock'));\n\n const commandRef = useRef<((item: SlashCommandItem) => void) | null>(null);\n const suggestionItemsRef = useRef<SlashCommandItem[]>([]);\n const selectedIndexRef = useRef(0);\n\n suggestionItemsRef.current = state.items;\n selectedIndexRef.current = selectedIndex;\n\n const { refs, floatingStyles } = useFloating({\n open: state.active,\n placement: 'bottom-start',\n middleware: [offset(8), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (!state.clientRect) return;\n refs.setReference({\n getBoundingClientRect: state.clientRect,\n });\n }, [state.clientRect, refs]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [state.items]);\n\n const onSelect = useCallback((index: number) => {\n const item = suggestionItemsRef.current[index];\n if (item && commandRef.current) {\n commandRef.current(item);\n }\n }, []);\n\n useEffect(() => {\n if (!editor) return;\n\n const plugin = Suggestion<SlashCommandItem, SlashCommandItem>({\n pluginKey,\n editor,\n char,\n allow: ({ editor: e }) => allowRef.current({ editor: e }),\n command: ({ editor: e, range, props }) => {\n props.command({ editor: e, range });\n },\n items: ({ query, editor: e }) =>\n filterRef.current(itemsRef.current, query, e),\n render: () => ({\n onStart: (props) => {\n commandRef.current = props.command;\n setState({\n active: true,\n query: props.query,\n items: props.items,\n clientRect: props.clientRect ?? null,\n });\n },\n onUpdate: (props) => {\n commandRef.current = props.command;\n setState({\n active: true,\n query: props.query,\n items: props.items,\n clientRect: props.clientRect ?? null,\n });\n },\n onKeyDown: ({ event }) => {\n if (event.key === 'Escape') {\n setState(INITIAL_STATE);\n return true;\n }\n\n const items = suggestionItemsRef.current;\n if (items.length === 0) return false;\n\n if (event.key === 'ArrowUp') {\n setSelectedIndex((i) => (i + items.length - 1) % items.length);\n return true;\n }\n if (event.key === 'ArrowDown') {\n setSelectedIndex((i) => (i + 1) % items.length);\n return true;\n }\n if (event.key === 'Enter') {\n const item = items[selectedIndexRef.current];\n if (item && commandRef.current) {\n commandRef.current(item);\n }\n return true;\n }\n return false;\n },\n onExit: () => {\n setState(INITIAL_STATE);\n requestAnimationFrame(() => {\n commandRef.current = null;\n });\n },\n }),\n });\n\n editor.registerPlugin(plugin, (newPlugin, plugins) => [\n newPlugin,\n ...plugins,\n ]);\n return () => {\n editor.unregisterPlugin(pluginKey);\n };\n }, [editor, char]);\n\n if (!editor || !state.active) return null;\n\n const renderProps = {\n items: state.items,\n query: state.query,\n selectedIndex,\n onSelect,\n };\n\n let content: ReactNode;\n if (children) {\n content = children(renderProps);\n } else {\n content = <CommandList {...renderProps} />;\n }\n\n return createPortal(\n <div ref={refs.setFloating} style={floatingStyles}>\n {content}\n </div>,\n document.body,\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const require_event_bus = require('./event-bus-fb8U7hrl.cjs');
2
- const require_set_text_alignment = require('./set-text-alignment-Cv72txmv.cjs');
1
+ const require_event_bus = require('./event-bus-BJn1dJM1.cjs');
2
+ const require_set_text_alignment = require('./set-text-alignment-aNb7Ml9N.cjs');
3
3
  let _tiptap_react = require("@tiptap/react");
4
4
  let react = require("react");
5
5
  react = require_event_bus.__toESM(react);
@@ -16,4 +16,4 @@ function setTextAlignment(editor, alignment) {
16
16
 
17
17
  //#endregion
18
18
  export { setTextAlignment as t };
19
- //# sourceMappingURL=set-text-alignment-OA8IMWmO.mjs.map
19
+ //# sourceMappingURL=set-text-alignment-GMXOPMlJ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"set-text-alignment-OA8IMWmO.mjs","names":[],"sources":["../src/utils/set-text-alignment.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core';\n\nexport function setTextAlignment(editor: Editor, alignment: string) {\n const { from, to } = editor.state.selection;\n const tr = editor.state.tr;\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock) {\n const prop = 'align' in node.attrs ? 'align' : 'alignment';\n tr.setNodeMarkup(pos, null, { ...node.attrs, [prop]: alignment });\n }\n });\n editor.view.dispatch(tr);\n}\n"],"mappings":";AAEA,SAAgB,iBAAiB,QAAgB,WAAmB;CAClE,MAAM,EAAE,MAAM,OAAO,OAAO,MAAM;CAClC,MAAM,KAAK,OAAO,MAAM;AACxB,QAAO,MAAM,IAAI,aAAa,MAAM,KAAK,MAAM,QAAQ;AACrD,MAAI,KAAK,aAAa;GACpB,MAAM,OAAO,WAAW,KAAK,QAAQ,UAAU;AAC/C,MAAG,cAAc,KAAK,MAAM;IAAE,GAAG,KAAK;KAAQ,OAAO;IAAW,CAAC;;GAEnE;AACF,QAAO,KAAK,SAAS,GAAG"}
1
+ {"version":3,"file":"set-text-alignment-GMXOPMlJ.mjs","names":[],"sources":["../src/utils/set-text-alignment.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core';\n\nexport function setTextAlignment(editor: Editor, alignment: string) {\n const { from, to } = editor.state.selection;\n const tr = editor.state.tr;\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock) {\n const prop = 'align' in node.attrs ? 'align' : 'alignment';\n tr.setNodeMarkup(pos, null, { ...node.attrs, [prop]: alignment });\n }\n });\n editor.view.dispatch(tr);\n}\n"],"mappings":";AAEA,SAAgB,iBAAiB,QAAgB,WAAmB;CAClE,MAAM,EAAE,MAAM,OAAO,OAAO,MAAM;CAClC,MAAM,KAAK,OAAO,MAAM;AACxB,QAAO,MAAM,IAAI,aAAa,MAAM,KAAK,MAAM,QAAQ;AACrD,MAAI,KAAK,aAAa;GACpB,MAAM,OAAO,WAAW,KAAK,QAAQ,UAAU;AAC/C,MAAG,cAAc,KAAK,MAAM;IAAE,GAAG,KAAK;KAAQ,OAAO;IAAW,CAAC;;GAEnE;AACF,QAAO,KAAK,SAAS,GAAG"}