neuphlo-editor 0.3.13 → 0.4.2

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.
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/headless/index.ts
32
+ var headless_exports = {};
33
+ __export(headless_exports, {
34
+ EditorBubble: () => EditorBubble,
35
+ EditorBubbleItem: () => EditorBubbleItem,
36
+ EditorCommand: () => EditorCommand,
37
+ EditorCommandItem: () => EditorCommandItem,
38
+ EditorCommandList: () => EditorCommandList,
39
+ EditorCommandOut: () => EditorCommandOut,
40
+ EditorContent: () => EditorContent,
41
+ EditorRoot: () => EditorRoot,
42
+ Placeholder: () => import_extension_placeholder.Placeholder,
43
+ SlashCommand: () => Command2,
44
+ StarterKit: () => import_starter_kit.StarterKit,
45
+ createSuggestionItems: () => createSuggestionItems,
46
+ handleCommandNavigation: () => handleCommandNavigation,
47
+ renderSlashCommandItems: () => renderItems,
48
+ useEditor: () => import_react10.useCurrentEditor
49
+ });
50
+ module.exports = __toCommonJS(headless_exports);
51
+ var import_react10 = require("@tiptap/react");
52
+
53
+ // src/headless/components/editor.tsx
54
+ var import_react = require("@tiptap/react");
55
+ var import_react2 = require("react");
56
+ var import_jotai2 = require("jotai");
57
+
58
+ // src/headless/utils/store.ts
59
+ var store_exports = {};
60
+ __export(store_exports, {
61
+ novelStore: () => novelStore
62
+ });
63
+ var import_jotai = require("jotai");
64
+ __reExport(store_exports, require("jotai"));
65
+ var novelStore = (0, import_jotai.createStore)();
66
+
67
+ // src/headless/components/editor.tsx
68
+ var import_jsx_runtime = require("react/jsx-runtime");
69
+ var EditorRoot = ({ children }) => {
70
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jotai2.Provider, { store: novelStore, children });
71
+ };
72
+ var EditorContent = (0, import_react2.forwardRef)(
73
+ ({ className, children, initialContent, content, ...rest }, ref) => {
74
+ const effectiveContent = content ?? initialContent;
75
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref, className, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.EditorProvider, { ...rest, content: effectiveContent, children }) });
76
+ }
77
+ );
78
+ EditorContent.displayName = "EditorContent";
79
+
80
+ // src/headless/components/editor-bubble.tsx
81
+ var import_react3 = require("@tiptap/react");
82
+ var import_menus = require("@tiptap/react/menus");
83
+ var import_jsx_runtime2 = require("react/jsx-runtime");
84
+ function EditorBubble({ className, children, options }) {
85
+ const { editor } = (0, import_react3.useCurrentEditor)();
86
+ if (!editor) return null;
87
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_menus.BubbleMenu, { editor, options, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className, children }) });
88
+ }
89
+
90
+ // src/headless/components/editor-bubble-item.tsx
91
+ var import_react4 = require("react");
92
+ var import_react5 = require("@tiptap/react");
93
+ var import_jsx_runtime3 = require("react/jsx-runtime");
94
+ var EditorBubbleItem = (0, import_react4.forwardRef)(({ children, asChild, onSelect, ...rest }, ref) => {
95
+ const { editor } = (0, import_react5.useCurrentEditor)();
96
+ if (!editor) return null;
97
+ const handleClick = (e) => {
98
+ e.preventDefault();
99
+ onSelect?.(editor);
100
+ };
101
+ if (asChild && (0, import_react4.isValidElement)(children)) {
102
+ const child = children;
103
+ const childOnClick = child.props?.onClick;
104
+ const mergedOnClick = (e) => {
105
+ childOnClick?.(e);
106
+ if (!e?.defaultPrevented) onSelect?.(editor);
107
+ };
108
+ return (0, import_react4.cloneElement)(child, {
109
+ ...rest,
110
+ ref: child.ref ?? ref,
111
+ onClick: mergedOnClick
112
+ });
113
+ }
114
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { ref, ...rest, onClick: handleClick, children });
115
+ });
116
+ EditorBubbleItem.displayName = "EditorBubbleItem";
117
+
118
+ // src/headless/components/editor-command.tsx
119
+ var import_jotai4 = require("jotai");
120
+ var import_react6 = require("react");
121
+ var import_cmdk = require("cmdk");
122
+
123
+ // src/headless/utils/atoms.ts
124
+ var import_jotai3 = require("jotai");
125
+ var queryAtom = (0, import_jotai3.atom)("");
126
+ var rangeAtom = (0, import_jotai3.atom)(null);
127
+
128
+ // src/headless/components/editor-command.tsx
129
+ var import_tunnel_rat = __toESM(require("tunnel-rat"), 1);
130
+ var import_jsx_runtime4 = require("react/jsx-runtime");
131
+ var commandTunnel = (0, import_tunnel_rat.default)();
132
+ var EditorCommandOut = ({
133
+ query,
134
+ range
135
+ }) => {
136
+ const setQuery = (0, import_jotai4.useSetAtom)(queryAtom, { store: novelStore });
137
+ const setRange = (0, import_jotai4.useSetAtom)(rangeAtom, { store: novelStore });
138
+ (0, import_react6.useEffect)(() => {
139
+ setQuery(query);
140
+ }, [query, setQuery]);
141
+ (0, import_react6.useEffect)(() => {
142
+ setRange(range);
143
+ }, [range, setRange]);
144
+ (0, import_react6.useEffect)(() => {
145
+ const navigationKeys = ["ArrowUp", "ArrowDown", "Enter"];
146
+ const onKeyDown = (e) => {
147
+ if (navigationKeys.includes(e.key)) {
148
+ e.preventDefault();
149
+ const commandRef = document.querySelector("#slash-command");
150
+ if (commandRef)
151
+ commandRef.dispatchEvent(
152
+ new KeyboardEvent("keydown", {
153
+ key: e.key,
154
+ cancelable: true,
155
+ bubbles: true
156
+ })
157
+ );
158
+ return false;
159
+ }
160
+ };
161
+ document.addEventListener("keydown", onKeyDown);
162
+ return () => {
163
+ document.removeEventListener("keydown", onKeyDown);
164
+ };
165
+ }, []);
166
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(commandTunnel.Out, {});
167
+ };
168
+ var CommandAny = import_cmdk.Command;
169
+ var EditorCommand = (0, import_react6.forwardRef)(
170
+ ({ children, className, ...rest }, ref) => {
171
+ const [query, setQuery] = (0, import_jotai4.useAtom)(queryAtom);
172
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(commandTunnel.In, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
173
+ CommandAny,
174
+ {
175
+ ref,
176
+ onKeyDown: (e) => {
177
+ e.stopPropagation();
178
+ },
179
+ id: "slash-command",
180
+ className,
181
+ ...rest,
182
+ children: [
183
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
184
+ CommandAny.Input,
185
+ {
186
+ value: query,
187
+ onValueChange: setQuery,
188
+ style: { display: "none" }
189
+ }
190
+ ),
191
+ children
192
+ ]
193
+ }
194
+ ) });
195
+ }
196
+ );
197
+ var EditorCommandList = import_cmdk.Command.List;
198
+ EditorCommand.displayName = "EditorCommand";
199
+
200
+ // src/headless/components/editor-command-item.tsx
201
+ var import_react7 = require("react");
202
+ var import_cmdk2 = require("cmdk");
203
+ var import_react8 = require("@tiptap/react");
204
+ var import_jotai5 = require("jotai");
205
+ var import_jsx_runtime5 = require("react/jsx-runtime");
206
+ var CommandItemAny = import_cmdk2.CommandItem;
207
+ var EditorCommandItem = (0, import_react7.forwardRef)(({ children, onCommand, ...rest }, ref) => {
208
+ const { editor } = (0, import_react8.useCurrentEditor)();
209
+ const range = (0, import_jotai5.useAtomValue)(rangeAtom);
210
+ if (!editor || !range) return null;
211
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
212
+ CommandItemAny,
213
+ {
214
+ ref,
215
+ ...rest,
216
+ onSelect: () => onCommand({ editor, range }),
217
+ children
218
+ }
219
+ );
220
+ });
221
+ EditorCommandItem.displayName = "EditorCommandItem";
222
+
223
+ // src/headless/extensions/index.ts
224
+ var import_starter_kit = require("@tiptap/starter-kit");
225
+ var import_extension_placeholder = require("@tiptap/extension-placeholder");
226
+
227
+ // src/headless/extensions/slash-command.tsx
228
+ var import_react9 = require("@tiptap/react");
229
+ var import_suggestion = __toESM(require("@tiptap/suggestion"), 1);
230
+ var import_core = require("@tiptap/core");
231
+ var Command2 = import_core.Extension.create({
232
+ name: "slash-command",
233
+ addOptions() {
234
+ return {
235
+ suggestion: {
236
+ char: "/",
237
+ command: (ctx) => {
238
+ ctx.props.command({ editor: ctx.editor, range: ctx.range });
239
+ }
240
+ }
241
+ };
242
+ },
243
+ addProseMirrorPlugins() {
244
+ const base = this.options.suggestion ?? {};
245
+ return [
246
+ (0, import_suggestion.default)({
247
+ editor: this.editor,
248
+ char: base.char ?? "/",
249
+ items: base.items ?? (() => ["/"]),
250
+ command: (ctx) => {
251
+ if (typeof ctx?.props?.command === "function") {
252
+ ctx.props.command({ editor: ctx.editor, range: ctx.range });
253
+ }
254
+ },
255
+ ...base
256
+ })
257
+ ];
258
+ }
259
+ });
260
+ var renderItems = (elementRef) => {
261
+ let component = null;
262
+ let container = null;
263
+ const destroy = () => {
264
+ component?.destroy();
265
+ component = null;
266
+ if (container) {
267
+ container.remove();
268
+ container = null;
269
+ }
270
+ };
271
+ const updatePosition = (clientRect) => {
272
+ if (!container || !clientRect) return;
273
+ const top = Math.round(clientRect.bottom + 8);
274
+ const left = Math.round(clientRect.left);
275
+ container.style.top = `${top}px`;
276
+ container.style.left = `${left}px`;
277
+ };
278
+ return {
279
+ onStart: (props) => {
280
+ const { selection } = props.editor.state;
281
+ const parentNode = selection.$from.node(selection.$from.depth);
282
+ const blockType = parentNode.type.name;
283
+ if (blockType === "codeBlock") return false;
284
+ component = new import_react9.ReactRenderer(EditorCommandOut, {
285
+ props: {
286
+ query: props.query ?? "",
287
+ range: props.range
288
+ },
289
+ editor: props.editor
290
+ });
291
+ container = document.createElement("div");
292
+ container.style.position = "fixed";
293
+ container.style.zIndex = "9999";
294
+ container.style.minWidth = "240px";
295
+ (elementRef?.current ?? document.body).appendChild(container);
296
+ container.appendChild(component.element);
297
+ const rect = typeof props.clientRect === "function" ? props.clientRect() : null;
298
+ if (rect) updatePosition(rect);
299
+ },
300
+ onUpdate: (props) => {
301
+ component?.updateProps({
302
+ query: props.query ?? "",
303
+ range: props.range
304
+ });
305
+ const rect = typeof props.clientRect === "function" ? props.clientRect() : null;
306
+ if (rect) updatePosition(rect);
307
+ },
308
+ onKeyDown: ({ event }) => {
309
+ if (event.key === "Escape") {
310
+ destroy();
311
+ return true;
312
+ }
313
+ return false;
314
+ },
315
+ onExit: () => {
316
+ destroy();
317
+ }
318
+ };
319
+ };
320
+ var createSuggestionItems = (items) => items;
321
+ var handleCommandNavigation = (event) => {
322
+ if (["ArrowUp", "ArrowDown", "Enter"].includes(event.key)) {
323
+ const slashCommand = document.querySelector("#slash-command");
324
+ if (slashCommand) return true;
325
+ }
326
+ };
327
+ // Annotate the CommonJS export names for ESM import in node:
328
+ 0 && (module.exports = {
329
+ EditorBubble,
330
+ EditorBubbleItem,
331
+ EditorCommand,
332
+ EditorCommandItem,
333
+ EditorCommandList,
334
+ EditorCommandOut,
335
+ EditorContent,
336
+ EditorRoot,
337
+ Placeholder,
338
+ SlashCommand,
339
+ StarterKit,
340
+ createSuggestionItems,
341
+ handleCommandNavigation,
342
+ renderSlashCommandItems,
343
+ useEditor
344
+ });
345
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-bubble.tsx","../../src/headless/components/editor-bubble-item.tsx","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/slash-command.tsx"],"sourcesContent":["export { useCurrentEditor as useEditor } from \"@tiptap/react\"\n\nexport {\n EditorRoot,\n EditorContent,\n type EditorContentProps,\n} from \"./components/editor\"\n\nexport { EditorBubble } from \"./components/editor-bubble\"\nexport { EditorBubbleItem } from \"./components/editor-bubble-item\"\nexport {\n EditorCommand,\n EditorCommandList,\n EditorCommandOut,\n} from \"./components/editor-command\"\nexport { EditorCommandItem } from \"./components/editor-command-item\"\n\nexport { Placeholder, StarterKit } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useCurrentEditor } from \"@tiptap/react\";\nimport { BubbleMenu as BubbleMenuReact } from \"@tiptap/react/menus\";\nimport type { ReactNode } from \"react\";\n\nexport interface EditorBubbleProps {\n readonly className?: string;\n readonly children: ReactNode;\n readonly options?: Record<string, unknown>;\n}\n\nexport function EditorBubble({ className, children, options }: EditorBubbleProps) {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <BubbleMenuReact editor={editor} options={options}>\n <div className={className}>{children}</div>\n </BubbleMenuReact>\n );\n}\n","import { forwardRef, isValidElement, cloneElement } from \"react\"\nimport type { ComponentPropsWithoutRef, ReactElement, ReactNode } from \"react\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\ninterface EditorBubbleItemProps {\n readonly children: ReactNode\n readonly asChild?: boolean\n readonly onSelect?: (editor: TiptapEditor) => void\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n\n if (!editor) return null\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onSelect?.(editor)\n }\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<any>\n const childOnClick = (child.props as any)?.onClick as\n | ((e: any) => void)\n | undefined\n const mergedOnClick = (e: any) => {\n childOnClick?.(e)\n if (!e?.defaultPrevented) onSelect?.(editor)\n }\n\n return cloneElement(child, {\n ...rest,\n ref: (child as any).ref ?? ref,\n onClick: mergedOnClick,\n })\n }\n\n return (\n <div ref={ref} {...rest} onClick={handleClick}>\n {children}\n </div>\n )\n})\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\"\n\nexport default EditorBubbleItem\n","import { useAtom, useSetAtom } from \"jotai\"\nimport { useEffect, forwardRef } from \"react\"\nimport { Command } from \"cmdk\"\nimport { queryAtom, rangeAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { FC } from \"react\"\nimport type { Range } from \"@tiptap/core\"\nimport tunnel from \"tunnel-rat\"\n\nconst commandTunnel: any = (tunnel as any)()\n\ninterface EditorCommandOutProps {\n readonly query: string\n readonly range: Range\n}\n\nexport const EditorCommandOut: FC<EditorCommandOutProps> = ({\n query,\n range,\n}) => {\n const setQuery = useSetAtom(queryAtom, { store: novelStore })\n const setRange = useSetAtom(rangeAtom, { store: novelStore })\n\n useEffect(() => {\n setQuery(query)\n }, [query, setQuery])\n\n useEffect(() => {\n setRange(range)\n }, [range, setRange])\n\n useEffect(() => {\n const navigationKeys = [\"ArrowUp\", \"ArrowDown\", \"Enter\"]\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault()\n const commandRef = document.querySelector(\"#slash-command\")\n\n if (commandRef)\n commandRef.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: e.key,\n cancelable: true,\n bubbles: true,\n })\n )\n\n return false\n }\n }\n document.addEventListener(\"keydown\", onKeyDown)\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown)\n }\n }, [])\n\n return <commandTunnel.Out />\n}\n\nconst CommandAny: any = Command\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const [query, setQuery] = useAtom(queryAtom)\n\n return (\n <commandTunnel.In>\n <CommandAny\n ref={ref}\n onKeyDown={(e: any) => {\n e.stopPropagation()\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n <CommandAny.Input\n value={query}\n onValueChange={setQuery}\n style={{ display: \"none\" }}\n />\n {children}\n </CommandAny>\n </commandTunnel.In>\n )\n }\n)\nexport const EditorCommandList: any = Command.List\n\nEditorCommand.displayName = \"EditorCommand\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\n\n","import { forwardRef } from \"react\"\nimport { CommandEmpty, CommandItem } from \"cmdk\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom } from \"../utils/atoms\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n}\n\nconst CommandItemAny: any = CommandItem\nconst CommandEmptyAny: any = CommandEmpty\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom)\n\n if (!editor || !range) return null\n\n return (\n <CommandItemAny\n ref={ref}\n {...(rest as any)}\n onSelect={() => onCommand({ editor, range })}\n >\n {children}\n </CommandItemAny>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty: any = CommandEmptyAny\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\"\nexport { Placeholder } from \"@tiptap/extension-placeholder\"\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\"\nexport { Link } from \"./Link\"\n","import { ReactRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { RefObject, ReactNode } from \"react\"\nimport { EditorCommandOut } from \"../components/editor-command\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n }),\n ]\n },\n})\n\nexport const renderItems = (elementRef?: RefObject<Element> | null) => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n const top = Math.round(clientRect.bottom + 8)\n const left = Math.round(clientRect.left)\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n if (blockType === \"codeBlock\") return false\n\n component = new ReactRenderer(EditorCommandOut, {\n props: {\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n container.style.minWidth = \"240px\"\n ;(elementRef?.current ?? document.body).appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n component?.updateProps({\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n destroy()\n return true\n }\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n"],"mappings":"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","names":["Command","import_react","import_react","import_jotai","import_react","import_jsx_runtime","BubbleMenuReact","import_react","import_jsx_runtime","import_jotai","import_react","import_jotai","import_jsx_runtime","tunnel","import_react","import_cmdk","import_jotai","import_jsx_runtime","import_react","Command","Suggestion"]}
@@ -0,0 +1,70 @@
1
+ import { Editor } from '@tiptap/react';
2
+ export { useCurrentEditor as useEditor } from '@tiptap/react';
3
+ export { a as EditorContent, b as EditorContentProps, E as EditorRoot } from '../editor-DI3_SEDt.cjs';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import * as react from 'react';
6
+ import { ReactNode, FC, RefObject } from 'react';
7
+ import { Range, Extension } from '@tiptap/core';
8
+ export { StarterKit } from '@tiptap/starter-kit';
9
+ export { Placeholder } from '@tiptap/extension-placeholder';
10
+
11
+ interface EditorBubbleProps {
12
+ readonly className?: string;
13
+ readonly children: ReactNode;
14
+ readonly options?: Record<string, unknown>;
15
+ }
16
+ declare function EditorBubble({ className, children, options }: EditorBubbleProps): react_jsx_runtime.JSX.Element | null;
17
+
18
+ interface EditorBubbleItemProps {
19
+ readonly children: ReactNode;
20
+ readonly asChild?: boolean;
21
+ readonly onSelect?: (editor: Editor) => void;
22
+ }
23
+ declare const EditorBubbleItem: react.ForwardRefExoticComponent<EditorBubbleItemProps & Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "onSelect"> & react.RefAttributes<HTMLDivElement>>;
24
+
25
+ interface EditorCommandOutProps {
26
+ readonly query: string;
27
+ readonly range: Range;
28
+ }
29
+ declare const EditorCommandOut: FC<EditorCommandOutProps>;
30
+ declare const EditorCommand: react.ForwardRefExoticComponent<Omit<any, "ref"> & react.RefAttributes<HTMLDivElement>>;
31
+ declare const EditorCommandList: any;
32
+
33
+ declare const EditorCommandItem: react.ForwardRefExoticComponent<Omit<any, "ref"> & react.RefAttributes<HTMLDivElement>>;
34
+
35
+ declare const Command: Extension<any, any>;
36
+ declare const renderItems: (elementRef?: RefObject<Element> | null) => {
37
+ onStart: (props: {
38
+ editor: any;
39
+ clientRect: (() => DOMRect | null) | null;
40
+ query?: string;
41
+ range?: any;
42
+ }) => false | undefined;
43
+ onUpdate: (props: {
44
+ editor: any;
45
+ clientRect: (() => DOMRect | null) | null;
46
+ query?: string;
47
+ range?: any;
48
+ }) => void;
49
+ onKeyDown: ({ event }: {
50
+ event: KeyboardEvent;
51
+ }) => boolean;
52
+ onExit: () => void;
53
+ };
54
+ interface SuggestionItem {
55
+ title: string;
56
+ description: string;
57
+ icon: ReactNode;
58
+ searchTerms?: string[];
59
+ command?: (props: {
60
+ editor: any;
61
+ range: {
62
+ from: number;
63
+ to: number;
64
+ };
65
+ }) => void;
66
+ }
67
+ declare const createSuggestionItems: (items: SuggestionItem[]) => SuggestionItem[];
68
+ declare const handleCommandNavigation: (event: KeyboardEvent) => true | undefined;
69
+
70
+ export { EditorBubble, EditorBubbleItem, EditorCommand, EditorCommandItem, EditorCommandList, EditorCommandOut, Command as SlashCommand, createSuggestionItems, handleCommandNavigation, renderItems as renderSlashCommandItems };
@@ -0,0 +1,70 @@
1
+ import { Editor } from '@tiptap/react';
2
+ export { useCurrentEditor as useEditor } from '@tiptap/react';
3
+ export { a as EditorContent, b as EditorContentProps, E as EditorRoot } from '../editor-DI3_SEDt.js';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import * as react from 'react';
6
+ import { ReactNode, FC, RefObject } from 'react';
7
+ import { Range, Extension } from '@tiptap/core';
8
+ export { StarterKit } from '@tiptap/starter-kit';
9
+ export { Placeholder } from '@tiptap/extension-placeholder';
10
+
11
+ interface EditorBubbleProps {
12
+ readonly className?: string;
13
+ readonly children: ReactNode;
14
+ readonly options?: Record<string, unknown>;
15
+ }
16
+ declare function EditorBubble({ className, children, options }: EditorBubbleProps): react_jsx_runtime.JSX.Element | null;
17
+
18
+ interface EditorBubbleItemProps {
19
+ readonly children: ReactNode;
20
+ readonly asChild?: boolean;
21
+ readonly onSelect?: (editor: Editor) => void;
22
+ }
23
+ declare const EditorBubbleItem: react.ForwardRefExoticComponent<EditorBubbleItemProps & Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "onSelect"> & react.RefAttributes<HTMLDivElement>>;
24
+
25
+ interface EditorCommandOutProps {
26
+ readonly query: string;
27
+ readonly range: Range;
28
+ }
29
+ declare const EditorCommandOut: FC<EditorCommandOutProps>;
30
+ declare const EditorCommand: react.ForwardRefExoticComponent<Omit<any, "ref"> & react.RefAttributes<HTMLDivElement>>;
31
+ declare const EditorCommandList: any;
32
+
33
+ declare const EditorCommandItem: react.ForwardRefExoticComponent<Omit<any, "ref"> & react.RefAttributes<HTMLDivElement>>;
34
+
35
+ declare const Command: Extension<any, any>;
36
+ declare const renderItems: (elementRef?: RefObject<Element> | null) => {
37
+ onStart: (props: {
38
+ editor: any;
39
+ clientRect: (() => DOMRect | null) | null;
40
+ query?: string;
41
+ range?: any;
42
+ }) => false | undefined;
43
+ onUpdate: (props: {
44
+ editor: any;
45
+ clientRect: (() => DOMRect | null) | null;
46
+ query?: string;
47
+ range?: any;
48
+ }) => void;
49
+ onKeyDown: ({ event }: {
50
+ event: KeyboardEvent;
51
+ }) => boolean;
52
+ onExit: () => void;
53
+ };
54
+ interface SuggestionItem {
55
+ title: string;
56
+ description: string;
57
+ icon: ReactNode;
58
+ searchTerms?: string[];
59
+ command?: (props: {
60
+ editor: any;
61
+ range: {
62
+ from: number;
63
+ to: number;
64
+ };
65
+ }) => void;
66
+ }
67
+ declare const createSuggestionItems: (items: SuggestionItem[]) => SuggestionItem[];
68
+ declare const handleCommandNavigation: (event: KeyboardEvent) => true | undefined;
69
+
70
+ export { EditorBubble, EditorBubbleItem, EditorCommand, EditorCommandItem, EditorCommandList, EditorCommandOut, Command as SlashCommand, createSuggestionItems, handleCommandNavigation, renderItems as renderSlashCommandItems };
@@ -0,0 +1,35 @@
1
+ import {
2
+ Command,
3
+ EditorBubble,
4
+ EditorBubbleItem,
5
+ EditorCommand,
6
+ EditorCommandItem,
7
+ EditorCommandList,
8
+ EditorCommandOut,
9
+ EditorContent,
10
+ EditorRoot,
11
+ Placeholder,
12
+ StarterKit,
13
+ createSuggestionItems,
14
+ handleCommandNavigation,
15
+ renderItems,
16
+ useCurrentEditor
17
+ } from "../chunk-M6GRNJJ6.js";
18
+ export {
19
+ EditorBubble,
20
+ EditorBubbleItem,
21
+ EditorCommand,
22
+ EditorCommandItem,
23
+ EditorCommandList,
24
+ EditorCommandOut,
25
+ EditorContent,
26
+ EditorRoot,
27
+ Placeholder,
28
+ Command as SlashCommand,
29
+ StarterKit,
30
+ createSuggestionItems,
31
+ handleCommandNavigation,
32
+ renderItems as renderSlashCommandItems,
33
+ useCurrentEditor as useEditor
34
+ };
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,3 @@
1
+ /* Optional: include a default highlight.js theme for code token colors */
2
+ @import "highlight.js/styles/github.css";
3
+