@liveblocks/react-tiptap 3.18.4 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/LiveblocksExtension.cjs +2 -1
  2. package/dist/LiveblocksExtension.cjs.map +1 -1
  3. package/dist/LiveblocksExtension.js +2 -1
  4. package/dist/LiveblocksExtension.js.map +1 -1
  5. package/dist/ai/AiExtension.cjs.map +1 -1
  6. package/dist/ai/AiExtension.js.map +1 -1
  7. package/dist/collaboration/collaboration.cjs +10 -12
  8. package/dist/collaboration/collaboration.cjs.map +1 -1
  9. package/dist/collaboration/collaboration.js +10 -12
  10. package/dist/collaboration/collaboration.js.map +1 -1
  11. package/dist/comments/AnchoredThreads.cjs +12 -7
  12. package/dist/comments/AnchoredThreads.cjs.map +1 -1
  13. package/dist/comments/AnchoredThreads.js +12 -7
  14. package/dist/comments/AnchoredThreads.js.map +1 -1
  15. package/dist/comments/CommentsExtension.cjs +102 -120
  16. package/dist/comments/CommentsExtension.cjs.map +1 -1
  17. package/dist/comments/CommentsExtension.js +103 -120
  18. package/dist/comments/CommentsExtension.js.map +1 -1
  19. package/dist/comments/FloatingThreads.cjs +61 -42
  20. package/dist/comments/FloatingThreads.cjs.map +1 -1
  21. package/dist/comments/FloatingThreads.js +62 -43
  22. package/dist/comments/FloatingThreads.js.map +1 -1
  23. package/dist/toolbar/Toolbar.cjs +1 -1
  24. package/dist/toolbar/Toolbar.cjs.map +1 -1
  25. package/dist/toolbar/Toolbar.js +1 -1
  26. package/dist/toolbar/Toolbar.js.map +1 -1
  27. package/dist/types.cjs +1 -1
  28. package/dist/types.cjs.map +1 -1
  29. package/dist/types.js +1 -1
  30. package/dist/types.js.map +1 -1
  31. package/dist/utils.cjs +19 -0
  32. package/dist/utils.cjs.map +1 -1
  33. package/dist/utils.js +18 -1
  34. package/dist/utils.js.map +1 -1
  35. package/dist/version.cjs +1 -1
  36. package/dist/version.js +1 -1
  37. package/package.json +6 -6
@@ -1,11 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useFloating, flip, offset, hide, shift, limitShift, size, autoUpdate } from '@floating-ui/react-dom';
3
+ import { shallow } from '@liveblocks/core';
3
4
  import { useLayoutEffect } from '@liveblocks/react/_private';
4
5
  import { Thread } from '@liveblocks/react-ui';
5
6
  import { useStableComponent, Portal, cn } from '@liveblocks/react-ui/_private';
6
7
  import { useEditorState } from '@tiptap/react';
7
- import { useState, useEffect, useCallback } from 'react';
8
+ import { useState, useCallback, useEffect } from 'react';
8
9
  import { THREADS_PLUGIN_KEY } from '../types.js';
10
+ import { compareDocumentPosition } from '../utils.js';
9
11
 
10
12
  function FloatingThreads({
11
13
  threads,
@@ -14,57 +16,84 @@ function FloatingThreads({
14
16
  ...props
15
17
  }) {
16
18
  const Thread$1 = useStableComponent(components?.Thread, Thread);
17
- const { pluginState } = useEditorState({
19
+ const activeThreadIds = useEditorState({
18
20
  editor,
19
21
  selector: (ctx) => {
20
- if (!ctx?.editor?.state) return { pluginState: void 0 };
22
+ if (!ctx?.editor?.state) {
23
+ return void 0;
24
+ }
21
25
  const state = THREADS_PLUGIN_KEY.getState(ctx.editor.state);
22
- return {
23
- pluginState: state
24
- };
26
+ return state?.activeThreadIds;
25
27
  },
26
28
  equalityFn: (prev, next) => {
27
29
  if (!prev || !next) return false;
28
- return prev.pluginState?.selectedThreadPos === next.pluginState?.selectedThreadPos && prev.pluginState?.selectedThreadId === next.pluginState?.selectedThreadId;
30
+ return shallow(prev, next);
29
31
  }
30
- }) ?? { pluginState: void 0 };
31
- const [activeThread, setActiveThread] = useState(null);
32
- useEffect(() => {
33
- if (!editor || !pluginState) {
34
- setActiveThread(null);
32
+ }) ?? void 0;
33
+ const [range, setRange] = useState(null);
34
+ const handleUpdateRange = useCallback(() => {
35
+ if (!editor || !editor.view || editor.view.isDestroyed || !activeThreadIds) {
36
+ setRange(null);
35
37
  return;
36
38
  }
37
- const { selectedThreadId, selectedThreadPos } = pluginState;
38
- if (selectedThreadId === null || selectedThreadPos === null) {
39
- setActiveThread(null);
39
+ if (activeThreadIds.length === 0) {
40
+ setRange(null);
40
41
  return;
41
42
  }
42
- const active = (threads ?? []).find(
43
- (thread) => selectedThreadId === thread.id
43
+ const activeThreads = (threads ?? []).filter(
44
+ (thread) => activeThreadIds.includes(thread.id) && !thread.resolved
44
45
  );
45
- setActiveThread(active ?? null);
46
- }, [editor, pluginState, threads]);
46
+ if (activeThreads.length === 0) {
47
+ setRange(null);
48
+ return;
49
+ }
50
+ const elements = /* @__PURE__ */ new Set();
51
+ for (const id of activeThreadIds) {
52
+ const els = editor.view.dom.querySelectorAll(
53
+ `span.lb-tiptap-thread-mark[data-lb-thread-id="${id}"]`
54
+ );
55
+ els.forEach((el) => elements.add(el));
56
+ }
57
+ const sorted = Array.from(elements).sort(compareDocumentPosition);
58
+ if (sorted.length === 0) {
59
+ setRange(null);
60
+ return;
61
+ }
62
+ const domRange = document.createRange();
63
+ domRange.setStartBefore(sorted[0]);
64
+ domRange.setEndAfter(sorted[sorted.length - 1]);
65
+ setRange({ range: domRange, threads: activeThreads });
66
+ }, [editor, activeThreadIds, threads]);
67
+ useEffect(() => {
68
+ if (!editor) return;
69
+ editor.on("transaction", handleUpdateRange);
70
+ return () => {
71
+ editor.off("transaction", handleUpdateRange);
72
+ };
73
+ }, [editor, handleUpdateRange]);
74
+ useLayoutEffect(handleUpdateRange, [handleUpdateRange]);
47
75
  const handleEscapeKeydown = useCallback(() => {
48
- if (!editor || activeThread === null) return false;
76
+ if (!editor || range === null) return false;
49
77
  editor.commands.selectThread(null);
50
78
  return true;
51
- }, [activeThread, editor]);
52
- if (!activeThread || !editor || activeThread.resolved) return null;
53
- return /* @__PURE__ */ jsx(FloatingThreadPortal, { thread: activeThread, editor, ...props, children: activeThread && /* @__PURE__ */ jsx(
79
+ }, [editor, range]);
80
+ if (range === null) {
81
+ return null;
82
+ }
83
+ return /* @__PURE__ */ jsx(FloatingThreadPortal, { range: range.range, ...props, children: range.threads.map((thread) => /* @__PURE__ */ jsx(
54
84
  ThreadWrapper,
55
85
  {
56
- thread: activeThread,
86
+ thread,
57
87
  Thread: Thread$1,
58
88
  onEscapeKeydown: handleEscapeKeydown,
59
89
  className: "lb-tiptap-floating-threads-thread"
60
90
  },
61
- activeThread.id
62
- ) });
91
+ thread.id
92
+ )) });
63
93
  }
64
94
  const FLOATING_THREAD_COLLISION_PADDING = 10;
65
95
  function FloatingThreadPortal({
66
- editor,
67
- thread,
96
+ range,
68
97
  children,
69
98
  className,
70
99
  style,
@@ -106,21 +135,11 @@ function FloatingThreadPortal({
106
135
  });
107
136
  }
108
137
  });
109
- const updateRef = useCallback(() => {
110
- const el = editor.view.dom.querySelector(
111
- `[data-lb-thread-id="${thread.id}"]`
112
- );
113
- if (el) {
114
- setReference(el);
115
- }
116
- }, [setReference, editor, thread.id]);
117
- useEffect(() => {
118
- editor.on("transaction", updateRef);
119
- return () => {
120
- editor.off("transaction", updateRef);
121
- };
122
- }, [editor, updateRef]);
123
- useLayoutEffect(updateRef, [updateRef]);
138
+ useLayoutEffect(() => {
139
+ setReference({
140
+ getBoundingClientRect: () => range.getBoundingClientRect()
141
+ });
142
+ }, [setReference, range]);
124
143
  return /* @__PURE__ */ jsx(Portal, { asChild: true, children: /* @__PURE__ */ jsx(
125
144
  "div",
126
145
  {
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingThreads.js","sources":["../../src/comments/FloatingThreads.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type { BaseMetadata, DCM, DTM, ThreadData } from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n Thread as DefaultThread,\n type ThreadProps,\n} from \"@liveblocks/react-ui\";\nimport { cn, Portal, useStableComponent } from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport {\n type ComponentType,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\n\nimport { THREADS_PLUGIN_KEY } from \"../types\";\n\ntype FloatingThreadsComponents = {\n Thread: ComponentType<ThreadProps>;\n};\n\nexport interface FloatingThreadsProps<\n TM extends BaseMetadata = DTM,\n CM extends BaseMetadata = DCM,\n> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * The threads to display.\n */\n threads: ThreadData<TM, CM>[];\n\n /**\n * Override the component's components.\n */\n components?: Partial<FloatingThreadsComponents>;\n\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n}\n\nexport function FloatingThreads({\n threads,\n components,\n editor,\n ...props\n}: FloatingThreadsProps) {\n const Thread = useStableComponent(components?.Thread, DefaultThread);\n\n const { pluginState } = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx?.editor?.state) return { pluginState: undefined };\n const state = THREADS_PLUGIN_KEY.getState(ctx.editor.state);\n return {\n pluginState: state,\n };\n },\n equalityFn: (prev, next) => {\n if (!prev || !next) return false;\n return (\n prev.pluginState?.selectedThreadPos ===\n next.pluginState?.selectedThreadPos &&\n prev.pluginState?.selectedThreadId ===\n next.pluginState?.selectedThreadId\n );\n },\n }) ?? { pluginState: undefined };\n\n const [activeThread, setActiveThread] = useState<ThreadData | null>(null);\n\n useEffect(() => {\n if (!editor || !pluginState) {\n setActiveThread(null);\n return;\n }\n const { selectedThreadId, selectedThreadPos } = pluginState;\n if (selectedThreadId === null || selectedThreadPos === null) {\n setActiveThread(null);\n return;\n }\n const active = (threads ?? []).find(\n (thread) => selectedThreadId === thread.id\n );\n setActiveThread(active ?? null);\n }, [editor, pluginState, threads]);\n\n const handleEscapeKeydown = useCallback((): boolean => {\n if (!editor || activeThread === null) return false;\n editor.commands.selectThread(null);\n return true;\n }, [activeThread, editor]);\n\n if (!activeThread || !editor || activeThread.resolved) return null;\n\n return (\n <FloatingThreadPortal thread={activeThread} editor={editor} {...props}>\n {activeThread && (\n <ThreadWrapper\n key={activeThread.id}\n thread={activeThread}\n Thread={Thread}\n onEscapeKeydown={handleEscapeKeydown}\n className=\"lb-tiptap-floating-threads-thread\"\n />\n )}\n </FloatingThreadPortal>\n );\n}\n\ninterface FloatingThreadPortalProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> {\n thread: ThreadData;\n editor: Editor;\n children: ReactNode;\n}\n\nexport const FLOATING_THREAD_COLLISION_PADDING = 10;\n\nfunction FloatingThreadPortal({\n editor,\n thread,\n children,\n className,\n style,\n ...props\n}: FloatingThreadPortalProps) {\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"absolute\",\n placement: \"bottom\",\n middleware: [\n flip({ padding: FLOATING_THREAD_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: FLOATING_THREAD_COLLISION_PADDING }),\n shift({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n limiter: limitShift(),\n }),\n size({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n const updateRef = useCallback(() => {\n const el = editor.view.dom.querySelector(\n `[data-lb-thread-id=\"${thread.id}\"]`\n );\n if (el) {\n setReference(el);\n }\n }, [setReference, editor, thread.id]);\n\n // Remote cursor updates and other edits can cause the ref to break\n useEffect(() => {\n editor.on(\"transaction\", updateRef);\n return () => {\n editor.off(\"transaction\", updateRef);\n };\n }, [editor, updateRef]);\n\n useLayoutEffect(updateRef, [updateRef]);\n\n return (\n <Portal asChild>\n <div\n ref={setFloating}\n {...props}\n style={{\n ...style,\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n }}\n className={cn(\n \"lb-root lb-portal lb-elevation lb-tiptap-floating lb-tiptap-floating-threads\",\n className\n )}\n >\n {children}\n </div>\n </Portal>\n );\n}\n\ninterface ThreadWrapperProps extends ThreadProps {\n thread: ThreadData;\n Thread: ComponentType<ThreadProps>;\n onEscapeKeydown: () => void;\n}\n\nfunction ThreadWrapper({\n thread,\n Thread,\n onEscapeKeydown,\n onKeyDown,\n ...threadProps\n}: ThreadWrapperProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n // TODO: Add ability to preventDefault on keydown to override the default behavior, e.g. to show an alert dialog\n if (event.key === \"Escape\") {\n onEscapeKeydown();\n }\n },\n [onEscapeKeydown, onKeyDown]\n );\n\n return <Thread thread={thread} onKeyDown={handleKeyDown} {...threadProps} />;\n}\n"],"names":["Thread","DefaultThread"],"mappings":"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"}
1
+ {"version":3,"file":"FloatingThreads.js","sources":["../../src/comments/FloatingThreads.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport {\n type BaseMetadata,\n type DCM,\n type DTM,\n shallow,\n type ThreadData,\n} from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n Thread as DefaultThread,\n type ThreadProps,\n} from \"@liveblocks/react-ui\";\nimport { cn, Portal, useStableComponent } from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport {\n type ComponentType,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\n\nimport { THREADS_PLUGIN_KEY } from \"../types\";\nimport { compareDocumentPosition } from \"../utils\";\n\ntype FloatingThreadsComponents = {\n Thread: ComponentType<ThreadProps>;\n};\n\nexport interface FloatingThreadsProps<\n TM extends BaseMetadata = DTM,\n CM extends BaseMetadata = DCM,\n> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * The threads to display.\n */\n threads: ThreadData<TM, CM>[];\n\n /**\n * Override the component's components.\n */\n components?: Partial<FloatingThreadsComponents>;\n\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n}\n\nexport function FloatingThreads({\n threads,\n components,\n editor,\n ...props\n}: FloatingThreadsProps) {\n const Thread = useStableComponent(components?.Thread, DefaultThread);\n\n const activeThreadIds =\n useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx?.editor?.state) {\n return undefined;\n }\n\n const state = THREADS_PLUGIN_KEY.getState(ctx.editor.state);\n\n return state?.activeThreadIds;\n },\n equalityFn: (prev, next) => {\n if (!prev || !next) return false;\n return shallow(prev, next);\n },\n }) ?? undefined;\n\n const [range, setRange] = useState<{\n range: Range;\n threads: ThreadData[];\n } | null>(null);\n\n const handleUpdateRange = useCallback(() => {\n if (\n !editor ||\n !editor.view ||\n editor.view.isDestroyed ||\n !activeThreadIds\n ) {\n setRange(null);\n return;\n }\n\n if (activeThreadIds.length === 0) {\n setRange(null);\n return;\n }\n\n const activeThreads = (threads ?? []).filter(\n (thread) => activeThreadIds.includes(thread.id) && !thread.resolved\n );\n if (activeThreads.length === 0) {\n setRange(null);\n return;\n }\n\n // A thread mark can be split across multiple DOM elements (e.g. when\n // overlapping with another mark), so we collect every matching element and\n // build a DOM range spanning from the first to the last one.\n const elements = new Set<HTMLElement>();\n for (const id of activeThreadIds) {\n const els = editor.view.dom.querySelectorAll<HTMLElement>(\n `span.lb-tiptap-thread-mark[data-lb-thread-id=\"${id}\"]`\n );\n els.forEach((el) => elements.add(el));\n }\n\n const sorted = Array.from(elements).sort(compareDocumentPosition);\n if (sorted.length === 0) {\n setRange(null);\n return;\n }\n\n const domRange = document.createRange();\n domRange.setStartBefore(sorted[0]);\n domRange.setEndAfter(sorted[sorted.length - 1]);\n setRange({ range: domRange, threads: activeThreads });\n }, [editor, activeThreadIds, threads]);\n\n // Remote cursor updates and other edits can shift the underlying DOM\n // elements, so we recompute the range on every change.\n useEffect(() => {\n if (!editor) return;\n editor.on(\"transaction\", handleUpdateRange);\n return () => {\n editor.off(\"transaction\", handleUpdateRange);\n };\n }, [editor, handleUpdateRange]);\n\n useLayoutEffect(handleUpdateRange, [handleUpdateRange]);\n\n const handleEscapeKeydown = useCallback((): boolean => {\n if (!editor || range === null) return false;\n editor.commands.selectThread(null);\n return true;\n }, [editor, range]);\n\n if (range === null) {\n return null;\n }\n\n return (\n <FloatingThreadPortal range={range.range} {...props}>\n {range.threads.map((thread) => (\n <ThreadWrapper\n key={thread.id}\n thread={thread}\n Thread={Thread}\n onEscapeKeydown={handleEscapeKeydown}\n className=\"lb-tiptap-floating-threads-thread\"\n />\n ))}\n </FloatingThreadPortal>\n );\n}\n\ninterface FloatingThreadPortalProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> {\n range: Range;\n children: ReactNode;\n}\n\nexport const FLOATING_THREAD_COLLISION_PADDING = 10;\n\nfunction FloatingThreadPortal({\n range,\n children,\n className,\n style,\n ...props\n}: FloatingThreadPortalProps) {\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"absolute\",\n placement: \"bottom\",\n middleware: [\n flip({ padding: FLOATING_THREAD_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: FLOATING_THREAD_COLLISION_PADDING }),\n shift({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n limiter: limitShift(),\n }),\n size({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n useLayoutEffect(() => {\n setReference({\n getBoundingClientRect: () => range.getBoundingClientRect(),\n });\n }, [setReference, range]);\n\n return (\n <Portal asChild>\n <div\n ref={setFloating}\n {...props}\n style={{\n ...style,\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n }}\n className={cn(\n \"lb-root lb-portal lb-elevation lb-tiptap-floating lb-tiptap-floating-threads\",\n className\n )}\n >\n {children}\n </div>\n </Portal>\n );\n}\n\ninterface ThreadWrapperProps extends ThreadProps {\n thread: ThreadData;\n Thread: ComponentType<ThreadProps>;\n onEscapeKeydown: () => void;\n}\n\nfunction ThreadWrapper({\n thread,\n Thread,\n onEscapeKeydown,\n onKeyDown,\n ...threadProps\n}: ThreadWrapperProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n // TODO: Add ability to preventDefault on keydown to override the default behavior, e.g. to show an alert dialog\n if (event.key === \"Escape\") {\n onEscapeKeydown();\n }\n },\n [onEscapeKeydown, onKeyDown]\n );\n\n return <Thread thread={thread} onKeyDown={handleKeyDown} {...threadProps} />;\n}\n"],"names":["Thread","DefaultThread"],"mappings":"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"}
@@ -279,7 +279,7 @@ function ToolbarSectionInline() {
279
279
  {
280
280
  name: "Strikethrough",
281
281
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.StrikethroughIcon, {}),
282
- shortcut: "Mod-U",
282
+ shortcut: "Mod-Shift-S",
283
283
  onClick: () => editor.chain().focus().toggleStrike().run(),
284
284
  disabled: !editor.can().chain().focus().toggleStrike().run(),
285
285
  active: editor.isActive("strike")
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.cjs","sources":["../../src/toolbar/Toolbar.tsx"],"sourcesContent":["import {\n BlockquoteIcon,\n BoldIcon,\n Button,\n CheckIcon,\n cn,\n CodeIcon,\n CommentIcon,\n H1Icon,\n H2Icon,\n H3Icon,\n ItalicIcon,\n ListOrderedIcon,\n ListUnorderedIcon,\n QuestionMarkIcon,\n RedoIcon,\n SelectButton,\n ShortcutTooltip,\n SparklesIcon,\n StrikethroughIcon,\n TextIcon,\n TooltipProvider,\n UnderlineIcon,\n UndoIcon,\n useLiveblocksUiConfig,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Select as SelectPrimitive, Toggle as TogglePrimitive } from \"radix-ui\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent,\n ReactNode,\n} from \"react\";\nimport { forwardRef, useCallback, useContext, useMemo } from \"react\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type { AiExtensionStorage, ExtendedChainedCommands } from \"../types\";\nimport { FloatingToolbarContext, FloatingToolbarExternal } from \"./shared\";\n\nexport const BLOCK_SELECT_SIDE_OFFSET = 10;\nexport const FLOATING_ELEMENT_COLLISION_PADDING = 10;\n\nexport interface ToolbarSlotProps {\n editor: Editor;\n}\n\nexport type ToolbarSlot = ReactNode | ComponentType<ToolbarSlotProps>;\n\nexport interface ToolbarProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The content of the toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the toolbar.\n */\n after?: ToolbarSlot;\n}\n\nexport interface ToolbarButtonProps extends ComponentProps<\"button\"> {\n /**\n * The name of this button displayed in its tooltip.\n */\n name: string;\n\n /**\n * An optional icon displayed in this button.\n */\n icon?: ReactNode;\n\n /**\n * An optional keyboard shortcut displayed in this button's tooltip.\n *\n * @example\n * \"Mod-Alt-B\" → \"⌘⌥B\" in Apple environments, \"⌃⌥B\" otherwise\n * \"Ctrl-Shift-Escape\" → \"⌃⇧⎋\"\n * \"Space\" → \"␣\"\n */\n shortcut?: string;\n}\n\nexport interface ToolbarToggleProps extends ToolbarButtonProps {\n /**\n * Whether the button is toggled.\n */\n active: boolean;\n}\n\nexport interface ToolbarBlockSelectorItem {\n /**\n * The name of this block element, displayed as the label of this item.\n */\n name: string;\n\n /**\n * Optionally replace the name used as the label of this item by any content.\n */\n label?: ReactNode;\n\n /**\n * An optional icon displayed in this item.\n */\n icon?: ReactNode;\n\n /**\n * Whether this block element is currently active.\n * Set to `\"default\"` to display this item when no other item is active.\n */\n isActive: ((editor: Editor) => boolean) | \"default\";\n\n /**\n * A callback invoked when this item is selected.\n */\n setActive: (editor: Editor) => void;\n}\n\nexport interface ToolbarBlockSelectorProps extends ComponentProps<\"button\"> {\n /**\n * The items displayed in this block selector.\n * When provided as an array, the default items are overridden. To avoid this,\n * a function can be provided instead and it will receive the default items.\n *\n * @example\n * <Toolbar.BlockSelector\n * items={[\n * {\n * name: \"Text\",\n * isActive: \"default\",\n * setActive: () => { ... },\n * },\n * {\n * name: \"Heading 1\",\n * isActive: () => { ... },\n * setActive: () => { ... },\n * },\n * ]}\n * />\n *\n * @example\n * <Toolbar.BlockSelector\n * items={(defaultItems) => [\n * ...defaultItems,\n * {\n * name: \"Custom block\",\n * isActive: () => { ... },\n * setActive: () => { ... },\n * },\n * ]}\n * />\n */\n items?:\n | ToolbarBlockSelectorItem[]\n | ((\n defaultItems: ToolbarBlockSelectorItem[]\n ) => ToolbarBlockSelectorItem[]);\n}\n\nexport type ToolbarSeparatorProps = ComponentProps<\"div\">;\n\nexport function applyToolbarSlot(\n slot: ToolbarSlot,\n props: ToolbarSlotProps\n): ReactNode {\n if (typeof slot === \"function\") {\n const Component = slot;\n\n return <Component {...props} />;\n }\n\n return slot;\n}\n\nconst ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ icon, children, name, shortcut, onKeyDown, ...props }, forwardedRef) => {\n const floatingToolbarContext = useContext(FloatingToolbarContext);\n const closeFloatingToolbar = floatingToolbarContext?.close;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (\n !event.isDefaultPrevented() &&\n closeFloatingToolbar &&\n event.key === \"Escape\"\n ) {\n closeFloatingToolbar();\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [onKeyDown, closeFloatingToolbar]\n );\n\n return (\n <ShortcutTooltip content={name} shortcut={shortcut}>\n <Button\n type=\"button\"\n variant=\"toolbar\"\n ref={forwardedRef}\n icon={icon}\n aria-label={!children ? name : undefined}\n // Safari doesn't mark buttons as focusable, which breaks `relatedTarget`\n // in focus/blur events. https://bugs.webkit.org/show_bug.cgi?id=254655\n tabIndex={0}\n {...props}\n onKeyDown={handleKeyDown}\n >\n {!children && !icon ? name : children}\n </Button>\n </ShortcutTooltip>\n );\n }\n);\n\nconst ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>(\n ({ active, ...props }, forwardedRef) => {\n return (\n <TogglePrimitive.Root asChild pressed={active}>\n <ToolbarButton ref={forwardedRef} {...props} />\n </TogglePrimitive.Root>\n );\n }\n);\n\nfunction createDefaultBlockSelectorItems(\n editor: Editor\n): ToolbarBlockSelectorItem[] {\n const items: (ToolbarBlockSelectorItem | null)[] = [\n {\n name: \"Text\",\n icon: <TextIcon />,\n isActive: \"default\",\n setActive: (editor) => editor.chain().focus().clearNodes().run(),\n },\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 1\",\n icon: <H1Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 1 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 1 })\n .run(),\n }\n : null,\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 2\",\n icon: <H2Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 2 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 2 })\n .run(),\n }\n : null,\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 3\",\n icon: <H3Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 3 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 3 })\n .run(),\n }\n : null,\n \"toggleBulletList\" in editor.commands\n ? {\n name: \"Bullet list\",\n icon: <ListUnorderedIcon />,\n isActive: (editor) => editor.isActive(\"bulletList\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleBulletList\">\n )\n .toggleBulletList()\n .run(),\n }\n : null,\n \"toggleOrderedList\" in editor.commands\n ? {\n name: \"Numbered list\",\n icon: <ListOrderedIcon />,\n isActive: (editor) => editor.isActive(\"orderedList\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleOrderedList\">\n )\n .toggleOrderedList()\n .run(),\n }\n : null,\n \"toggleBlockquote\" in editor.commands\n ? {\n name: \"Blockquote\",\n icon: <BlockquoteIcon />,\n isActive: (editor) => editor.isActive(\"blockquote\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleBlockquote\">\n )\n .toggleBlockquote()\n .run(),\n }\n : null,\n ];\n\n return items.filter(Boolean) as ToolbarBlockSelectorItem[];\n}\n\nconst ToolbarBlockSelector = forwardRef<\n HTMLButtonElement,\n ToolbarBlockSelectorProps\n>(({ items, onKeyDown, ...props }, forwardedRef) => {\n const { portalContainer } = useLiveblocksUiConfig();\n const floatingToolbarContext = useContext(FloatingToolbarContext);\n const closeFloatingToolbar = floatingToolbarContext?.close;\n const editor = useCurrentEditor(\n \"BlockSelector\",\n \"Toolbar or FloatingToolbar\"\n );\n const resolvedItems = useMemo(() => {\n if (Array.isArray(items)) {\n return items;\n }\n\n const defaultItems = createDefaultBlockSelectorItems(editor);\n\n return items ? items(defaultItems) : defaultItems;\n }, [editor, items]);\n let defaultItem: ToolbarBlockSelectorItem | undefined;\n let activeItem = editor.isInitialized\n ? resolvedItems.find((item) => {\n if (item.isActive === \"default\") {\n defaultItem = item;\n return false;\n }\n\n return item.isActive(editor);\n })\n : undefined;\n\n if (!activeItem) {\n activeItem = defaultItem;\n }\n\n const handleItemChange = (name: string) => {\n const item = resolvedItems.find((item) => item.name === name);\n\n if (item) {\n item.setActive(editor);\n\n // If present in a floating toolbar, close it on change\n floatingToolbarContext?.close();\n }\n };\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (\n !event.isDefaultPrevented() &&\n closeFloatingToolbar &&\n event.key === \"Escape\"\n ) {\n closeFloatingToolbar();\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [onKeyDown, closeFloatingToolbar]\n );\n\n return (\n <SelectPrimitive.Root\n value={activeItem?.name}\n onValueChange={handleItemChange}\n >\n <ShortcutTooltip content=\"Turn into…\">\n <SelectPrimitive.Trigger\n asChild\n {...props}\n ref={forwardedRef}\n onKeyDown={handleKeyDown}\n disabled={resolvedItems.length === 0}\n >\n <SelectButton variant=\"toolbar\">\n {activeItem?.name ?? \"Turn into…\"}\n </SelectButton>\n </SelectPrimitive.Trigger>\n </ShortcutTooltip>\n <SelectPrimitive.Portal container={portalContainer}>\n <FloatingToolbarExternal>\n <SelectPrimitive.Content\n position=\"popper\"\n sideOffset={BLOCK_SELECT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n className=\"lb-root lb-portal lb-elevation lb-dropdown lb-select-dropdown lb-tiptap-block-selector-dropdown\"\n >\n {resolvedItems.map((item) => (\n <SelectPrimitive.Item\n key={item.name}\n value={item.name}\n className=\"lb-dropdown-item\"\n data-name={item.name}\n >\n {item.icon ? (\n <span className=\"lb-dropdown-item-icon lb-icon-container\">\n {item.icon}\n </span>\n ) : null}\n <span className=\"lb-dropdown-item-label\">\n {item.label ?? item.name}\n </span>\n {item.name === activeItem?.name ? (\n <span className=\"lb-dropdown-item-accessory lb-icon-container\">\n <CheckIcon />\n </span>\n ) : null}\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Content>\n </FloatingToolbarExternal>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n );\n});\n\nconst ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(\n ({ className, ...props }, forwardedRef) => {\n return (\n <div\n ref={forwardedRef}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\"lb-tiptap-toolbar-separator\", className)}\n {...props}\n />\n );\n }\n);\n\nfunction ToolbarSectionHistory() {\n const editor = useCurrentEditor(\n \"SectionHistory\",\n \"Toolbar or FloatingToolbar\"\n );\n\n return (\n <>\n <ToolbarButton\n name=\"Undo\"\n icon={<UndoIcon />}\n shortcut=\"Mod-Z\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().chain().focus().undo().run()}\n />\n <ToolbarButton\n name=\"Redo\"\n icon={<RedoIcon />}\n shortcut=\"Mod-Shift-Z\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().chain().focus().redo().run()}\n />\n </>\n );\n}\n\nfunction ToolbarSectionInline() {\n const editor = useCurrentEditor(\n \"SectionInline\",\n \"Toolbar or FloatingToolbar\"\n );\n const supportsBold = \"toggleBold\" in editor.commands;\n const supportsItalic = \"toggleItalic\" in editor.commands;\n const supportsUnderline = \"toggleUnderline\" in editor.commands;\n const supportsStrike = \"toggleStrike\" in editor.commands;\n const supportsCode = \"toggleCode\" in editor.commands;\n\n return (\n <>\n {supportsBold && (\n <ToolbarToggle\n name=\"Bold\"\n icon={<BoldIcon />}\n shortcut=\"Mod-B\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleBold\">)\n .toggleBold()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleBold\">\n )\n .toggleBold()\n .run()\n }\n active={editor.isActive(\"bold\")}\n />\n )}\n {supportsItalic && (\n <ToolbarToggle\n name=\"Italic\"\n icon={<ItalicIcon />}\n shortcut=\"Mod-I\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleItalic\">)\n .toggleItalic()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleItalic\">\n )\n .toggleItalic()\n .run()\n }\n active={editor.isActive(\"italic\")}\n />\n )}\n {supportsUnderline && (\n <ToolbarToggle\n name=\"Underline\"\n icon={<UnderlineIcon />}\n shortcut=\"Mod-U\"\n onClick={() =>\n (\n editor\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleUnderline\">\n )\n .toggleUnderline()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleUnderline\">\n )\n .toggleUnderline()\n .run()\n }\n active={editor.isActive(\"underline\")}\n />\n )}\n {supportsStrike && (\n <ToolbarToggle\n name=\"Strikethrough\"\n icon={<StrikethroughIcon />}\n shortcut=\"Mod-U\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleStrike\">)\n .toggleStrike()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleStrike\">\n )\n .toggleStrike()\n .run()\n }\n active={editor.isActive(\"strike\")}\n />\n )}\n {supportsCode && (\n <ToolbarToggle\n name=\"Inline code\"\n icon={<CodeIcon />}\n shortcut=\"Mod-E\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleCode\">)\n .toggleCode()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleCode\">\n )\n .toggleCode()\n .run()\n }\n active={editor.isActive(\"code\")}\n />\n )}\n </>\n );\n}\n\nfunction ToolbarSectionCollaboration() {\n const editor = useCurrentEditor(\n \"SectionCollaboration\",\n \"Toolbar or FloatingToolbar\"\n );\n const supportsThread = \"addPendingComment\" in editor.commands;\n\n return (\n <>\n {supportsThread && (\n <ToolbarButton\n name=\"Add a comment\"\n icon={<CommentIcon />}\n onClick={() =>\n (\n editor\n .chain()\n .focus() as ExtendedChainedCommands<\"addPendingComment\">\n )\n .addPendingComment()\n .run()\n }\n >\n Comment\n </ToolbarButton>\n )}\n </>\n );\n}\n\nfunction ToolbarSectionAi() {\n const editor = useCurrentEditor(\"SectionAi\", \"Toolbar or FloatingToolbar\");\n const supportsAi = \"askAi\" in editor.commands;\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage | undefined)\n ?.name;\n\n return (\n <>\n {supportsAi && (\n <>\n <ToolbarButton\n name={`Ask ${aiName} anything…`}\n icon={<SparklesIcon />}\n onClick={() =>\n (\n editor.chain().focus() as ExtendedChainedCommands<\"askAi\">\n ).askAi()\n }\n >\n Ask {aiName}\n </ToolbarButton>\n <ToolbarButton\n name=\"Explain\"\n icon={<QuestionMarkIcon />}\n onClick={() =>\n (\n editor.chain().focus() as ExtendedChainedCommands<\"askAi\">\n ).askAi(\"Explain what the text is about\")\n }\n >\n Explain\n </ToolbarButton>\n </>\n )}\n </>\n );\n}\n\nfunction DefaultToolbarContent({ editor }: ToolbarSlotProps) {\n const supportsThread = \"addPendingComment\" in editor.commands;\n const supportsAi = \"askAi\" in editor.commands;\n\n return (\n <>\n <ToolbarSectionHistory />\n <ToolbarSeparator />\n {supportsAi ? (\n <>\n <ToolbarSectionAi />\n <ToolbarSeparator />\n </>\n ) : null}\n <ToolbarBlockSelector />\n <ToolbarSectionInline />\n {supportsThread ? (\n <>\n <ToolbarSeparator />\n <ToolbarSectionCollaboration />\n </>\n ) : null}\n </>\n );\n}\n\n/**\n * A static toolbar containing actions and values related to the editor.\n *\n * @example\n * <Toolbar editor={editor} />\n *\n * @example\n * <Toolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </Toolbar>\n */\nexport const Toolbar = Object.assign(\n forwardRef<HTMLDivElement, ToolbarProps>(\n (\n {\n before,\n after,\n children = DefaultToolbarContent,\n editor,\n className,\n ...props\n },\n forwardedRef\n ) => {\n // Re-render the toolbar when the editor content and selection change.\n useEditorState({\n editor,\n equalityFn: Object.is,\n selector: (ctx) => ctx.editor?.state,\n });\n\n if (!editor) {\n return null;\n }\n\n const slotProps: ToolbarSlotProps = { editor };\n\n return (\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <div\n ref={forwardedRef}\n role=\"toolbar\"\n aria-label=\"Toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\"lb-root lb-tiptap-toolbar\", className)}\n {...props}\n >\n {applyToolbarSlot(before, slotProps)}\n {applyToolbarSlot(children, slotProps)}\n {applyToolbarSlot(after, slotProps)}\n </div>\n </EditorProvider>\n </TooltipProvider>\n );\n }\n ),\n {\n /**\n * A button for triggering actions.\n *\n * @example\n * <Toolbar.Button name=\"Comment\" shortcut=\"Mod-Shift-E\" onClick={() => { ... }} />\n *\n * @example\n * <Toolbar.Button name=\"Mention someone\" icon={<Icon.Mention />} onClick={() => { ... }} />\n */\n Button: ToolbarButton,\n\n /**\n * A toggle button for values that can be active or inactive.\n *\n * @example\n * <Toolbar.Toggle name=\"Bold\" active={isBold} />\n *\n * @example\n * <Toolbar.Toggle name=\"Italic\" icon={<Icon.Italic />} shortcut=\"Mod-I\" active={isItalic} onClick={() => { ... }} />\n */\n Toggle: ToolbarToggle,\n\n /**\n * A dropdown selector to switch between different block types.\n *\n * @example\n * <Toolbar.BlockSelector />\n */\n BlockSelector: ToolbarBlockSelector,\n\n /**\n * A visual (and accessible) separator to separate sections in a toolbar.\n */\n Separator: ToolbarSeparator,\n\n /**\n * A section containing history actions. (e.g. undo, redo)\n */\n SectionHistory: ToolbarSectionHistory,\n\n /**\n * A section containing inline formatting actions. (e.g. bold, italic, underline, ...)\n */\n SectionInline: ToolbarSectionInline,\n\n /**\n * A section containing collaborative actions. (e.g. adding a comment)\n */\n SectionCollaboration: ToolbarSectionCollaboration,\n\n /**\n * A section containing AI actions. (e.g. opening the AI toolbar)\n */\n SectionAi: ToolbarSectionAi,\n }\n);\n"],"names":["jsx","forwardRef","useContext","FloatingToolbarContext","useCallback","ShortcutTooltip","Button","TogglePrimitive","TextIcon","editor","H1Icon","H2Icon","H3Icon","ListUnorderedIcon","ListOrderedIcon","BlockquoteIcon","useLiveblocksUiConfig","useCurrentEditor","useMemo","item","jsxs","SelectPrimitive","SelectButton","FloatingToolbarExternal","CheckIcon","cn","Fragment","UndoIcon","RedoIcon","BoldIcon","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeIcon","CommentIcon","SparklesIcon","QuestionMarkIcon","useEditorState","TooltipProvider","EditorProvider"],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar.cjs","sources":["../../src/toolbar/Toolbar.tsx"],"sourcesContent":["import {\n BlockquoteIcon,\n BoldIcon,\n Button,\n CheckIcon,\n cn,\n CodeIcon,\n CommentIcon,\n H1Icon,\n H2Icon,\n H3Icon,\n ItalicIcon,\n ListOrderedIcon,\n ListUnorderedIcon,\n QuestionMarkIcon,\n RedoIcon,\n SelectButton,\n ShortcutTooltip,\n SparklesIcon,\n StrikethroughIcon,\n TextIcon,\n TooltipProvider,\n UnderlineIcon,\n UndoIcon,\n useLiveblocksUiConfig,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Select as SelectPrimitive, Toggle as TogglePrimitive } from \"radix-ui\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent,\n ReactNode,\n} from \"react\";\nimport { forwardRef, useCallback, useContext, useMemo } from \"react\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type { AiExtensionStorage, ExtendedChainedCommands } from \"../types\";\nimport { FloatingToolbarContext, FloatingToolbarExternal } from \"./shared\";\n\nexport const BLOCK_SELECT_SIDE_OFFSET = 10;\nexport const FLOATING_ELEMENT_COLLISION_PADDING = 10;\n\nexport interface ToolbarSlotProps {\n editor: Editor;\n}\n\nexport type ToolbarSlot = ReactNode | ComponentType<ToolbarSlotProps>;\n\nexport interface ToolbarProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The content of the toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the toolbar.\n */\n after?: ToolbarSlot;\n}\n\nexport interface ToolbarButtonProps extends ComponentProps<\"button\"> {\n /**\n * The name of this button displayed in its tooltip.\n */\n name: string;\n\n /**\n * An optional icon displayed in this button.\n */\n icon?: ReactNode;\n\n /**\n * An optional keyboard shortcut displayed in this button's tooltip.\n *\n * @example\n * \"Mod-Alt-B\" → \"⌘⌥B\" in Apple environments, \"⌃⌥B\" otherwise\n * \"Ctrl-Shift-Escape\" → \"⌃⇧⎋\"\n * \"Space\" → \"␣\"\n */\n shortcut?: string;\n}\n\nexport interface ToolbarToggleProps extends ToolbarButtonProps {\n /**\n * Whether the button is toggled.\n */\n active: boolean;\n}\n\nexport interface ToolbarBlockSelectorItem {\n /**\n * The name of this block element, displayed as the label of this item.\n */\n name: string;\n\n /**\n * Optionally replace the name used as the label of this item by any content.\n */\n label?: ReactNode;\n\n /**\n * An optional icon displayed in this item.\n */\n icon?: ReactNode;\n\n /**\n * Whether this block element is currently active.\n * Set to `\"default\"` to display this item when no other item is active.\n */\n isActive: ((editor: Editor) => boolean) | \"default\";\n\n /**\n * A callback invoked when this item is selected.\n */\n setActive: (editor: Editor) => void;\n}\n\nexport interface ToolbarBlockSelectorProps extends ComponentProps<\"button\"> {\n /**\n * The items displayed in this block selector.\n * When provided as an array, the default items are overridden. To avoid this,\n * a function can be provided instead and it will receive the default items.\n *\n * @example\n * <Toolbar.BlockSelector\n * items={[\n * {\n * name: \"Text\",\n * isActive: \"default\",\n * setActive: () => { ... },\n * },\n * {\n * name: \"Heading 1\",\n * isActive: () => { ... },\n * setActive: () => { ... },\n * },\n * ]}\n * />\n *\n * @example\n * <Toolbar.BlockSelector\n * items={(defaultItems) => [\n * ...defaultItems,\n * {\n * name: \"Custom block\",\n * isActive: () => { ... },\n * setActive: () => { ... },\n * },\n * ]}\n * />\n */\n items?:\n | ToolbarBlockSelectorItem[]\n | ((\n defaultItems: ToolbarBlockSelectorItem[]\n ) => ToolbarBlockSelectorItem[]);\n}\n\nexport type ToolbarSeparatorProps = ComponentProps<\"div\">;\n\nexport function applyToolbarSlot(\n slot: ToolbarSlot,\n props: ToolbarSlotProps\n): ReactNode {\n if (typeof slot === \"function\") {\n const Component = slot;\n\n return <Component {...props} />;\n }\n\n return slot;\n}\n\nconst ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ icon, children, name, shortcut, onKeyDown, ...props }, forwardedRef) => {\n const floatingToolbarContext = useContext(FloatingToolbarContext);\n const closeFloatingToolbar = floatingToolbarContext?.close;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (\n !event.isDefaultPrevented() &&\n closeFloatingToolbar &&\n event.key === \"Escape\"\n ) {\n closeFloatingToolbar();\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [onKeyDown, closeFloatingToolbar]\n );\n\n return (\n <ShortcutTooltip content={name} shortcut={shortcut}>\n <Button\n type=\"button\"\n variant=\"toolbar\"\n ref={forwardedRef}\n icon={icon}\n aria-label={!children ? name : undefined}\n // Safari doesn't mark buttons as focusable, which breaks `relatedTarget`\n // in focus/blur events. https://bugs.webkit.org/show_bug.cgi?id=254655\n tabIndex={0}\n {...props}\n onKeyDown={handleKeyDown}\n >\n {!children && !icon ? name : children}\n </Button>\n </ShortcutTooltip>\n );\n }\n);\n\nconst ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>(\n ({ active, ...props }, forwardedRef) => {\n return (\n <TogglePrimitive.Root asChild pressed={active}>\n <ToolbarButton ref={forwardedRef} {...props} />\n </TogglePrimitive.Root>\n );\n }\n);\n\nfunction createDefaultBlockSelectorItems(\n editor: Editor\n): ToolbarBlockSelectorItem[] {\n const items: (ToolbarBlockSelectorItem | null)[] = [\n {\n name: \"Text\",\n icon: <TextIcon />,\n isActive: \"default\",\n setActive: (editor) => editor.chain().focus().clearNodes().run(),\n },\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 1\",\n icon: <H1Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 1 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 1 })\n .run(),\n }\n : null,\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 2\",\n icon: <H2Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 2 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 2 })\n .run(),\n }\n : null,\n \"toggleHeading\" in editor.commands\n ? {\n name: \"Heading 3\",\n icon: <H3Icon />,\n isActive: (editor) => editor.isActive(\"heading\", { level: 3 }),\n setActive: (editor) =>\n (\n editor.chain().focus().clearNodes() as ExtendedChainedCommands<\n \"toggleHeading\",\n [{ level: number }]\n >\n )\n .toggleHeading({ level: 3 })\n .run(),\n }\n : null,\n \"toggleBulletList\" in editor.commands\n ? {\n name: \"Bullet list\",\n icon: <ListUnorderedIcon />,\n isActive: (editor) => editor.isActive(\"bulletList\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleBulletList\">\n )\n .toggleBulletList()\n .run(),\n }\n : null,\n \"toggleOrderedList\" in editor.commands\n ? {\n name: \"Numbered list\",\n icon: <ListOrderedIcon />,\n isActive: (editor) => editor.isActive(\"orderedList\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleOrderedList\">\n )\n .toggleOrderedList()\n .run(),\n }\n : null,\n \"toggleBlockquote\" in editor.commands\n ? {\n name: \"Blockquote\",\n icon: <BlockquoteIcon />,\n isActive: (editor) => editor.isActive(\"blockquote\"),\n setActive: (editor) =>\n (\n editor\n .chain()\n .focus()\n .clearNodes() as ExtendedChainedCommands<\"toggleBlockquote\">\n )\n .toggleBlockquote()\n .run(),\n }\n : null,\n ];\n\n return items.filter(Boolean) as ToolbarBlockSelectorItem[];\n}\n\nconst ToolbarBlockSelector = forwardRef<\n HTMLButtonElement,\n ToolbarBlockSelectorProps\n>(({ items, onKeyDown, ...props }, forwardedRef) => {\n const { portalContainer } = useLiveblocksUiConfig();\n const floatingToolbarContext = useContext(FloatingToolbarContext);\n const closeFloatingToolbar = floatingToolbarContext?.close;\n const editor = useCurrentEditor(\n \"BlockSelector\",\n \"Toolbar or FloatingToolbar\"\n );\n const resolvedItems = useMemo(() => {\n if (Array.isArray(items)) {\n return items;\n }\n\n const defaultItems = createDefaultBlockSelectorItems(editor);\n\n return items ? items(defaultItems) : defaultItems;\n }, [editor, items]);\n let defaultItem: ToolbarBlockSelectorItem | undefined;\n let activeItem = editor.isInitialized\n ? resolvedItems.find((item) => {\n if (item.isActive === \"default\") {\n defaultItem = item;\n return false;\n }\n\n return item.isActive(editor);\n })\n : undefined;\n\n if (!activeItem) {\n activeItem = defaultItem;\n }\n\n const handleItemChange = (name: string) => {\n const item = resolvedItems.find((item) => item.name === name);\n\n if (item) {\n item.setActive(editor);\n\n // If present in a floating toolbar, close it on change\n floatingToolbarContext?.close();\n }\n };\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (\n !event.isDefaultPrevented() &&\n closeFloatingToolbar &&\n event.key === \"Escape\"\n ) {\n closeFloatingToolbar();\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [onKeyDown, closeFloatingToolbar]\n );\n\n return (\n <SelectPrimitive.Root\n value={activeItem?.name}\n onValueChange={handleItemChange}\n >\n <ShortcutTooltip content=\"Turn into…\">\n <SelectPrimitive.Trigger\n asChild\n {...props}\n ref={forwardedRef}\n onKeyDown={handleKeyDown}\n disabled={resolvedItems.length === 0}\n >\n <SelectButton variant=\"toolbar\">\n {activeItem?.name ?? \"Turn into…\"}\n </SelectButton>\n </SelectPrimitive.Trigger>\n </ShortcutTooltip>\n <SelectPrimitive.Portal container={portalContainer}>\n <FloatingToolbarExternal>\n <SelectPrimitive.Content\n position=\"popper\"\n sideOffset={BLOCK_SELECT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n className=\"lb-root lb-portal lb-elevation lb-dropdown lb-select-dropdown lb-tiptap-block-selector-dropdown\"\n >\n {resolvedItems.map((item) => (\n <SelectPrimitive.Item\n key={item.name}\n value={item.name}\n className=\"lb-dropdown-item\"\n data-name={item.name}\n >\n {item.icon ? (\n <span className=\"lb-dropdown-item-icon lb-icon-container\">\n {item.icon}\n </span>\n ) : null}\n <span className=\"lb-dropdown-item-label\">\n {item.label ?? item.name}\n </span>\n {item.name === activeItem?.name ? (\n <span className=\"lb-dropdown-item-accessory lb-icon-container\">\n <CheckIcon />\n </span>\n ) : null}\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Content>\n </FloatingToolbarExternal>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n );\n});\n\nconst ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(\n ({ className, ...props }, forwardedRef) => {\n return (\n <div\n ref={forwardedRef}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\"lb-tiptap-toolbar-separator\", className)}\n {...props}\n />\n );\n }\n);\n\nfunction ToolbarSectionHistory() {\n const editor = useCurrentEditor(\n \"SectionHistory\",\n \"Toolbar or FloatingToolbar\"\n );\n\n return (\n <>\n <ToolbarButton\n name=\"Undo\"\n icon={<UndoIcon />}\n shortcut=\"Mod-Z\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().chain().focus().undo().run()}\n />\n <ToolbarButton\n name=\"Redo\"\n icon={<RedoIcon />}\n shortcut=\"Mod-Shift-Z\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().chain().focus().redo().run()}\n />\n </>\n );\n}\n\nfunction ToolbarSectionInline() {\n const editor = useCurrentEditor(\n \"SectionInline\",\n \"Toolbar or FloatingToolbar\"\n );\n const supportsBold = \"toggleBold\" in editor.commands;\n const supportsItalic = \"toggleItalic\" in editor.commands;\n const supportsUnderline = \"toggleUnderline\" in editor.commands;\n const supportsStrike = \"toggleStrike\" in editor.commands;\n const supportsCode = \"toggleCode\" in editor.commands;\n\n return (\n <>\n {supportsBold && (\n <ToolbarToggle\n name=\"Bold\"\n icon={<BoldIcon />}\n shortcut=\"Mod-B\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleBold\">)\n .toggleBold()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleBold\">\n )\n .toggleBold()\n .run()\n }\n active={editor.isActive(\"bold\")}\n />\n )}\n {supportsItalic && (\n <ToolbarToggle\n name=\"Italic\"\n icon={<ItalicIcon />}\n shortcut=\"Mod-I\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleItalic\">)\n .toggleItalic()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleItalic\">\n )\n .toggleItalic()\n .run()\n }\n active={editor.isActive(\"italic\")}\n />\n )}\n {supportsUnderline && (\n <ToolbarToggle\n name=\"Underline\"\n icon={<UnderlineIcon />}\n shortcut=\"Mod-U\"\n onClick={() =>\n (\n editor\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleUnderline\">\n )\n .toggleUnderline()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleUnderline\">\n )\n .toggleUnderline()\n .run()\n }\n active={editor.isActive(\"underline\")}\n />\n )}\n {supportsStrike && (\n <ToolbarToggle\n name=\"Strikethrough\"\n icon={<StrikethroughIcon />}\n shortcut=\"Mod-Shift-S\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleStrike\">)\n .toggleStrike()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleStrike\">\n )\n .toggleStrike()\n .run()\n }\n active={editor.isActive(\"strike\")}\n />\n )}\n {supportsCode && (\n <ToolbarToggle\n name=\"Inline code\"\n icon={<CodeIcon />}\n shortcut=\"Mod-E\"\n onClick={() =>\n (editor.chain().focus() as ExtendedChainedCommands<\"toggleCode\">)\n .toggleCode()\n .run()\n }\n disabled={\n !(\n editor\n .can()\n .chain()\n .focus() as ExtendedChainedCommands<\"toggleCode\">\n )\n .toggleCode()\n .run()\n }\n active={editor.isActive(\"code\")}\n />\n )}\n </>\n );\n}\n\nfunction ToolbarSectionCollaboration() {\n const editor = useCurrentEditor(\n \"SectionCollaboration\",\n \"Toolbar or FloatingToolbar\"\n );\n const supportsThread = \"addPendingComment\" in editor.commands;\n\n return (\n <>\n {supportsThread && (\n <ToolbarButton\n name=\"Add a comment\"\n icon={<CommentIcon />}\n onClick={() =>\n (\n editor\n .chain()\n .focus() as ExtendedChainedCommands<\"addPendingComment\">\n )\n .addPendingComment()\n .run()\n }\n >\n Comment\n </ToolbarButton>\n )}\n </>\n );\n}\n\nfunction ToolbarSectionAi() {\n const editor = useCurrentEditor(\"SectionAi\", \"Toolbar or FloatingToolbar\");\n const supportsAi = \"askAi\" in editor.commands;\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage | undefined)\n ?.name;\n\n return (\n <>\n {supportsAi && (\n <>\n <ToolbarButton\n name={`Ask ${aiName} anything…`}\n icon={<SparklesIcon />}\n onClick={() =>\n (\n editor.chain().focus() as ExtendedChainedCommands<\"askAi\">\n ).askAi()\n }\n >\n Ask {aiName}\n </ToolbarButton>\n <ToolbarButton\n name=\"Explain\"\n icon={<QuestionMarkIcon />}\n onClick={() =>\n (\n editor.chain().focus() as ExtendedChainedCommands<\"askAi\">\n ).askAi(\"Explain what the text is about\")\n }\n >\n Explain\n </ToolbarButton>\n </>\n )}\n </>\n );\n}\n\nfunction DefaultToolbarContent({ editor }: ToolbarSlotProps) {\n const supportsThread = \"addPendingComment\" in editor.commands;\n const supportsAi = \"askAi\" in editor.commands;\n\n return (\n <>\n <ToolbarSectionHistory />\n <ToolbarSeparator />\n {supportsAi ? (\n <>\n <ToolbarSectionAi />\n <ToolbarSeparator />\n </>\n ) : null}\n <ToolbarBlockSelector />\n <ToolbarSectionInline />\n {supportsThread ? (\n <>\n <ToolbarSeparator />\n <ToolbarSectionCollaboration />\n </>\n ) : null}\n </>\n );\n}\n\n/**\n * A static toolbar containing actions and values related to the editor.\n *\n * @example\n * <Toolbar editor={editor} />\n *\n * @example\n * <Toolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </Toolbar>\n */\nexport const Toolbar = Object.assign(\n forwardRef<HTMLDivElement, ToolbarProps>(\n (\n {\n before,\n after,\n children = DefaultToolbarContent,\n editor,\n className,\n ...props\n },\n forwardedRef\n ) => {\n // Re-render the toolbar when the editor content and selection change.\n useEditorState({\n editor,\n equalityFn: Object.is,\n selector: (ctx) => ctx.editor?.state,\n });\n\n if (!editor) {\n return null;\n }\n\n const slotProps: ToolbarSlotProps = { editor };\n\n return (\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <div\n ref={forwardedRef}\n role=\"toolbar\"\n aria-label=\"Toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\"lb-root lb-tiptap-toolbar\", className)}\n {...props}\n >\n {applyToolbarSlot(before, slotProps)}\n {applyToolbarSlot(children, slotProps)}\n {applyToolbarSlot(after, slotProps)}\n </div>\n </EditorProvider>\n </TooltipProvider>\n );\n }\n ),\n {\n /**\n * A button for triggering actions.\n *\n * @example\n * <Toolbar.Button name=\"Comment\" shortcut=\"Mod-Shift-E\" onClick={() => { ... }} />\n *\n * @example\n * <Toolbar.Button name=\"Mention someone\" icon={<Icon.Mention />} onClick={() => { ... }} />\n */\n Button: ToolbarButton,\n\n /**\n * A toggle button for values that can be active or inactive.\n *\n * @example\n * <Toolbar.Toggle name=\"Bold\" active={isBold} />\n *\n * @example\n * <Toolbar.Toggle name=\"Italic\" icon={<Icon.Italic />} shortcut=\"Mod-I\" active={isItalic} onClick={() => { ... }} />\n */\n Toggle: ToolbarToggle,\n\n /**\n * A dropdown selector to switch between different block types.\n *\n * @example\n * <Toolbar.BlockSelector />\n */\n BlockSelector: ToolbarBlockSelector,\n\n /**\n * A visual (and accessible) separator to separate sections in a toolbar.\n */\n Separator: ToolbarSeparator,\n\n /**\n * A section containing history actions. (e.g. undo, redo)\n */\n SectionHistory: ToolbarSectionHistory,\n\n /**\n * A section containing inline formatting actions. (e.g. bold, italic, underline, ...)\n */\n SectionInline: ToolbarSectionInline,\n\n /**\n * A section containing collaborative actions. (e.g. adding a comment)\n */\n SectionCollaboration: ToolbarSectionCollaboration,\n\n /**\n * A section containing AI actions. (e.g. opening the AI toolbar)\n */\n SectionAi: ToolbarSectionAi,\n }\n);\n"],"names":["jsx","forwardRef","useContext","FloatingToolbarContext","useCallback","ShortcutTooltip","Button","TogglePrimitive","TextIcon","editor","H1Icon","H2Icon","H3Icon","ListUnorderedIcon","ListOrderedIcon","BlockquoteIcon","useLiveblocksUiConfig","useCurrentEditor","useMemo","item","jsxs","SelectPrimitive","SelectButton","FloatingToolbarExternal","CheckIcon","cn","Fragment","UndoIcon","RedoIcon","BoldIcon","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeIcon","CommentIcon","SparklesIcon","QuestionMarkIcon","useEditorState","TooltipProvider","EditorProvider"],"mappings":"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"}
@@ -277,7 +277,7 @@ function ToolbarSectionInline() {
277
277
  {
278
278
  name: "Strikethrough",
279
279
  icon: /* @__PURE__ */ jsx(StrikethroughIcon, {}),
280
- shortcut: "Mod-U",
280
+ shortcut: "Mod-Shift-S",
281
281
  onClick: () => editor.chain().focus().toggleStrike().run(),
282
282
  disabled: !editor.can().chain().focus().toggleStrike().run(),
283
283
  active: editor.isActive("strike")