@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.
- package/dist/core/index.cjs +4 -3
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +3 -3
- package/dist/{create-paste-handler-CGR738bC.d.mts → create-paste-handler-DsJYKisA.d.mts} +1 -1
- package/dist/{create-paste-handler-CGR738bC.d.mts.map → create-paste-handler-DsJYKisA.d.mts.map} +1 -1
- package/dist/{event-bus-fb8U7hrl.cjs → event-bus-BJn1dJM1.cjs} +20 -3
- package/dist/{event-bus-CHEzOS_O.mjs → event-bus-DJpnfDHw.mjs} +14 -3
- package/dist/{event-bus-CHEzOS_O.mjs.map → event-bus-DJpnfDHw.mjs.map} +1 -1
- package/dist/{extension-w5VaUeSw.cjs → extension-CF0s-pGh.cjs} +301 -37
- package/dist/{extension-DyY8_bh4.mjs → extension-DcToBuV0.mjs} +301 -13
- package/dist/extension-DcToBuV0.mjs.map +1 -0
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.d.cts +1 -1
- package/dist/extensions/index.d.cts.map +1 -1
- package/dist/extensions/index.d.mts +2 -2
- package/dist/extensions/index.d.mts.map +1 -1
- package/dist/extensions/index.mjs +3 -3
- package/dist/{extensions-CkjPj2JO.cjs → extensions-B6VCxUmi.cjs} +68 -25
- package/dist/{extensions-BvfmaKCn.mjs → extensions-mStGDfMH.mjs} +63 -20
- package/dist/extensions-mStGDfMH.mjs.map +1 -0
- package/dist/{styles-C-cCyJCn.cjs → global-content-C5WjNoMX.cjs} +88 -0
- package/dist/{styles-_TMw3YxC.mjs → global-content-CjA49_jE.mjs} +78 -2
- package/dist/global-content-CjA49_jE.mjs.map +1 -0
- package/dist/{index-C4KcMQ0R.d.cts → index-LCPnE_xx.d.cts} +66 -3
- package/dist/index-LCPnE_xx.d.cts.map +1 -0
- package/dist/{index-CxX7W63O.d.mts → index-i5JdL0UD.d.mts} +67 -4
- package/dist/index-i5JdL0UD.d.mts.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/plugins/index.cjs +1 -5
- package/dist/plugins/index.d.cts +5 -123
- package/dist/plugins/index.d.cts.map +1 -1
- package/dist/plugins/index.d.mts +5 -123
- package/dist/plugins/index.d.mts.map +1 -1
- package/dist/plugins/index.mjs +2 -2
- package/dist/{root-pS4l8bVZ.mjs → root-BVs63m-4.mjs} +39 -39
- package/dist/root-BVs63m-4.mjs.map +1 -0
- package/dist/{root-Jq1R3tkX.cjs → root-D6lslKju.cjs} +2 -2
- package/dist/{set-text-alignment-OA8IMWmO.mjs → set-text-alignment-GMXOPMlJ.mjs} +1 -1
- package/dist/{set-text-alignment-OA8IMWmO.mjs.map → set-text-alignment-GMXOPMlJ.mjs.map} +1 -1
- package/dist/types-BNEbRz-a.d.cts +47 -0
- package/dist/types-BNEbRz-a.d.cts.map +1 -0
- package/dist/types-C8k-blF7.d.mts +47 -0
- package/dist/types-C8k-blF7.d.mts.map +1 -0
- package/dist/ui/index.cjs +645 -2
- package/dist/ui/index.d.cts +307 -128
- package/dist/ui/index.d.cts.map +1 -1
- package/dist/ui/index.d.mts +263 -84
- package/dist/ui/index.d.mts.map +1 -1
- package/dist/ui/index.mjs +630 -3
- package/dist/ui/index.mjs.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/extension-DyY8_bh4.mjs.map +0 -1
- package/dist/extensions-BvfmaKCn.mjs.map +0 -1
- package/dist/global-content-D_WYaFgX.mjs +0 -78
- package/dist/global-content-D_WYaFgX.mjs.map +0 -1
- package/dist/global-content-bJgotqmA.cjs +0 -89
- package/dist/index-C4KcMQ0R.d.cts.map +0 -1
- package/dist/index-CxX7W63O.d.mts.map +0 -1
- package/dist/root-pS4l8bVZ.mjs.map +0 -1
- package/dist/styles-_TMw3YxC.mjs.map +0 -1
- /package/dist/{set-text-alignment-Cv72txmv.cjs → set-text-alignment-aNb7Ml9N.cjs} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as setTextAlignment } from "./set-text-alignment-
|
|
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-
|
|
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-
|
|
2
|
-
const require_set_text_alignment = require('./set-text-alignment-
|
|
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);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-text-alignment-
|
|
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"}
|