eddyter 1.3.80 → 1.3.82

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 (35) hide show
  1. package/dist/{ImageResizer-o0eMm1Mg.js → ImageResizer-Bt7kgv0a.js} +1 -1
  2. package/dist/api/ai/aiAgentService.d.ts +2 -0
  3. package/dist/assets/style.css +1 -1
  4. package/dist/components/ConfigurableEditorWithAuth.d.ts +2 -0
  5. package/dist/components/FileView/index.d.ts +2 -0
  6. package/dist/context/EditorThemeContext.d.ts +8 -0
  7. package/dist/context/HtmlViewContext.d.ts +2 -0
  8. package/dist/context/VoiceRecordingContext.d.ts +30 -0
  9. package/dist/editor/components/FloatingToolbarManager.d.ts +8 -0
  10. package/dist/editor/components/FloatingToolbarPortal.d.ts +6 -0
  11. package/dist/editor/components/ToolbarMount.d.ts +9 -0
  12. package/dist/editor/hooks/useFloatingToolbar.d.ts +7 -0
  13. package/dist/editorConfig.d.ts +1 -0
  14. package/dist/{generateDocxThumbnail-CuC4oE4q.js → generateDocxThumbnail-BMy6Y08H.js} +1 -1
  15. package/dist/{generatePdfThumbnail-Be9_gTd2.js → generatePdfThumbnail-Ck8MvwkP.js} +1 -1
  16. package/dist/{generateXlsxThumbnail-BHmQkbG6.js → generateXlsxThumbnail-By40CwXr.js} +1 -1
  17. package/dist/hooks/useVoiceRecording.d.ts +15 -0
  18. package/dist/{html2pdf.bundle.min-__2qz-Dv.js → html2pdf.bundle.min-DDJswFIT.js} +1 -1
  19. package/dist/{index-BjjpBGeH.js → index-BAeOecnm.js} +589 -553
  20. package/dist/{index-0dB2NNlO.js → index-CCwIE-wd.js} +24 -24
  21. package/dist/index-Jbres5pQ.js +157 -0
  22. package/dist/index-baftIlXa.js +87345 -0
  23. package/dist/index.js +1 -1
  24. package/dist/nodes/FileNode.d.ts +8 -2
  25. package/dist/pages/ConfigurableEditor/ConfigurableEditor.d.ts +1 -0
  26. package/dist/plugins/FloatingFileMenuPlugin.d.ts +3 -0
  27. package/dist/plugins/VoiceTranscriptPlugin.d.ts +2 -16
  28. package/dist/plugins/WordCountPlugin.d.ts +4 -1
  29. package/dist/types.d.ts +2 -0
  30. package/dist/ui/Icons.d.ts +2 -1
  31. package/dist/utils/fontLoader.d.ts +1 -1
  32. package/dist/utils/htmlFormat.d.ts +5 -3
  33. package/package.json +4 -1
  34. package/dist/index-BTnX5edL.js +0 -131
  35. package/dist/index-BiGNE0nG.js +0 -40927
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { J as a, K as r, M as t, N as s, O as o, P as d, Q as v, R as u, U as f, V as n, X as l, Y as w } from "./index-BiGNE0nG.js";
1
+ import { K as a, M as r, N as t, O as s, P as o, Q as d, R as v, U as u, V as f, X as n, Y as l, Z as w } from "./index-baftIlXa.js";
2
2
  export {
3
3
  a as ConfigurableEditor,
4
4
  r as ConfigurableEditorWithAuth,
@@ -1,19 +1,23 @@
1
1
  import { DecoratorNode, DOMConversionMap, DOMExportOutput, EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from '../../node_modules/lexical';
2
+ export type FileDisplayType = "card" | "inline";
2
3
  export interface FilePayload {
3
4
  src: string;
4
5
  fileName: string;
5
6
  fileSize?: number;
7
+ displayType?: FileDisplayType;
6
8
  key?: NodeKey;
7
9
  }
8
10
  export type SerializedFileNode = Spread<{
9
11
  src: string;
10
12
  fileName: string;
11
13
  fileSize?: number;
14
+ displayType?: FileDisplayType;
12
15
  }, SerializedLexicalNode>;
13
16
  export declare class FileNode extends DecoratorNode<JSX.Element> {
14
17
  __src: string;
15
18
  __fileName: string;
16
19
  __fileSize?: number;
20
+ __displayType: FileDisplayType;
17
21
  /** Optional first-page thumbnail (e.g. PDF); used in exportDOM for preview */
18
22
  __previewDataUrl?: string;
19
23
  static getType(): string;
@@ -22,8 +26,10 @@ export declare class FileNode extends DecoratorNode<JSX.Element> {
22
26
  exportDOM(): DOMExportOutput;
23
27
  private formatFileSize;
24
28
  static importDOM(): DOMConversionMap | null;
25
- constructor(src: string, fileName: string, fileSize?: number, key?: NodeKey);
29
+ constructor(src: string, fileName: string, fileSize?: number, displayType?: FileDisplayType, key?: NodeKey);
26
30
  exportJSON(): SerializedFileNode;
31
+ getDisplayType(): FileDisplayType;
32
+ setDisplayType(displayType: FileDisplayType): void;
27
33
  createDOM(config: EditorConfig): HTMLElement;
28
34
  updateDOM(): false;
29
35
  getSrc(): string;
@@ -32,5 +38,5 @@ export declare class FileNode extends DecoratorNode<JSX.Element> {
32
38
  setPreviewDataUrl(url: string): void;
33
39
  decorate(): JSX.Element;
34
40
  }
35
- export declare function $createFileNode({ src, fileName, fileSize, key, }: FilePayload): FileNode;
41
+ export declare function $createFileNode({ src, fileName, fileSize, displayType, key, }: FilePayload): FileNode;
36
42
  export declare function $isFileNode(node: LexicalNode | null | undefined): node is FileNode;
@@ -21,6 +21,7 @@ interface ConfigurableEditorProps {
21
21
  initialContent?: string;
22
22
  onChange?: (html: string) => void;
23
23
  apiKey?: string;
24
+ toolbarTopOffset?: number;
24
25
  }
25
26
  declare const ConfigurableEditor: React.FC<ConfigurableEditorProps>;
26
27
  export default ConfigurableEditor;
@@ -0,0 +1,3 @@
1
+ export default function FloatingFileMenuPlugin({ anchorElem, }: {
2
+ anchorElem?: HTMLElement;
3
+ }): JSX.Element | null;
@@ -2,22 +2,8 @@ export declare const TOGGLE_VOICE_TRANSCRIPT_COMMAND: import('../../node_modules
2
2
  export declare const INSERT_TRANSCRIPT_COMMAND: import('../../node_modules/lexical').LexicalCommand<{
3
3
  text: string;
4
4
  }>;
5
- export declare const useVoiceRecording: (apiKey?: string, language?: string) => {
6
- isRecording: boolean;
7
- isPaused: boolean;
8
- isLoading: boolean;
9
- isProcessing: boolean;
10
- processingStatus: string;
11
- isBatchMode: boolean;
12
- error: string | null;
13
- isConnected: boolean;
14
- elapsedTime: number;
15
- toggleRecording: () => Promise<void>;
16
- pauseRecording: () => void;
17
- resumeRecording: () => void;
18
- setEditor: (editor: any) => void;
19
- };
20
- export declare const VoiceTranscriptButton: ({ editor, apiKey }: {
5
+ export { useVoiceRecording } from '../hooks/useVoiceRecording';
6
+ export declare const VoiceTranscriptButton: ({ editor, apiKey, }: {
21
7
  editor: any;
22
8
  apiKey?: string;
23
9
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,6 @@
1
1
  import { default as React } from 'react';
2
- declare const WordCountPlugin: React.FC;
2
+ interface WordPluginProps {
3
+ isWordCountEnabled: boolean;
4
+ }
5
+ declare const WordCountPlugin: React.FC<WordPluginProps>;
3
6
  export default WordCountPlugin;
package/dist/types.d.ts CHANGED
@@ -37,6 +37,7 @@ export interface ToolbarProps {
37
37
  enableHtmlViewToggle?: boolean;
38
38
  enableNotePanels?: boolean;
39
39
  enableAutocompleteToggle?: boolean;
40
+ enableInlineAutocompleteToggle?: boolean;
40
41
  enableHeadings?: boolean;
41
42
  enableLists?: boolean;
42
43
  enableBlockquote?: boolean;
@@ -142,6 +143,7 @@ export interface EditorConfigTypes {
142
143
  enableHtmlViewToggle: boolean;
143
144
  enableNotePanels: boolean;
144
145
  enableAutocompleteToggle: boolean;
146
+ enableInlineAutocompleteToggle?: boolean;
145
147
  enableHeadings: boolean;
146
148
  enableLists: boolean;
147
149
  enableBlockquote: boolean;
@@ -84,4 +84,5 @@ declare const BugIcon: () => import("react/jsx-runtime").JSX.Element;
84
84
  declare const LockIcon: () => import("react/jsx-runtime").JSX.Element;
85
85
  declare const AiSparkle: () => import("react/jsx-runtime").JSX.Element;
86
86
  declare const CodeSquare: () => import("react/jsx-runtime").JSX.Element;
87
- export { AddCommentIcon, AddImageIcon, AdjustToneIcon, AIChatIcon, AIIcon, AlignBottomIcon, AlignCenterIcon, AlignJustifyIcon, AlignLeftIcon, AlignMiddleIcon, AlignRightIcon, AlignTopIcon, BoldIcon, BugIcon, BulletListIcon, ChartBarIcon, CheckBoxIcon, CheckIcon, ChevronDownIcon, CodeIcon, CompleteSentenceIcon, DisableIcon, EmojifyIcon, FaceSmileIcon, FileIcon, FixGrammarIcon, GenerateImageIcon, Heading1Icon, Heading2Icon, Heading3Icon, Heading4Icon, Heading5Icon, Heading6Icon, HorizontalRuleIcon, HtmlViewIcon, ImageIcon, ItalicIcon, LinkIcon, LockIcon, MagicoonIcon, MakeLongerIcon, MakeShorterIcon, MenuAltIcon, MessageEditIcon, MicrophoneIcon, NoteIcon, NumberListIcon, PauseCircleIcon, ParagraphIcon, PenLineIcon, PerspectiveIcon, PlayCircleIcon, PlusIcon, QuoteIcon, RecordingIcon, RedoIcon, SearchTextIcon, SearchTextIcon2, SendIcon, SignatureIcon, SimplifyIcon, SparkleIcon, StopCircleIcon, StrikethroughIcon, SubscriptIcon, SuperscriptIcon, TodoIcon, TranslateIcon, TypeCapitalizeIcon, TypeLowercaseIcon, TypeUppercaseIcon, UnderlineIcon, UndoIcon, UploadIcon, TableIcon, HighlighterIcon, LightbulbIcon, ClearFormattingIcon, CrossIcon, DownloadIcon, TrashIcon, ExternalLinkIcon, WrapTextLeftIcon, WrapTextRightIcon, AiSparkle, CodeSquare };
87
+ declare const InlineAutocomplete: () => import("react/jsx-runtime").JSX.Element;
88
+ export { AddCommentIcon, AddImageIcon, AdjustToneIcon, AIChatIcon, AIIcon, AlignBottomIcon, AlignCenterIcon, AlignJustifyIcon, AlignLeftIcon, AlignMiddleIcon, AlignRightIcon, AlignTopIcon, BoldIcon, BugIcon, BulletListIcon, ChartBarIcon, CheckBoxIcon, CheckIcon, ChevronDownIcon, CodeIcon, CompleteSentenceIcon, DisableIcon, EmojifyIcon, FaceSmileIcon, FileIcon, FixGrammarIcon, GenerateImageIcon, Heading1Icon, Heading2Icon, Heading3Icon, Heading4Icon, Heading5Icon, Heading6Icon, HorizontalRuleIcon, HtmlViewIcon, ImageIcon, ItalicIcon, LinkIcon, LockIcon, MagicoonIcon, MakeLongerIcon, MakeShorterIcon, MenuAltIcon, MessageEditIcon, MicrophoneIcon, NoteIcon, NumberListIcon, PauseCircleIcon, ParagraphIcon, PenLineIcon, PerspectiveIcon, PlayCircleIcon, PlusIcon, QuoteIcon, RecordingIcon, RedoIcon, SearchTextIcon, SearchTextIcon2, SendIcon, SignatureIcon, SimplifyIcon, SparkleIcon, StopCircleIcon, StrikethroughIcon, SubscriptIcon, SuperscriptIcon, TodoIcon, TranslateIcon, TypeCapitalizeIcon, TypeLowercaseIcon, TypeUppercaseIcon, UnderlineIcon, UndoIcon, UploadIcon, TableIcon, HighlighterIcon, LightbulbIcon, ClearFormattingIcon, CrossIcon, DownloadIcon, TrashIcon, ExternalLinkIcon, WrapTextLeftIcon, WrapTextRightIcon, AiSparkle, CodeSquare, InlineAutocomplete };
@@ -2,7 +2,7 @@
2
2
  * Dynamic font loader for the editor package.
3
3
  *
4
4
  * When the editor is integrated into an external project, that project may not
5
- * load the Google Fonts the editor uses (Geist for UI, Inter/Manrope/etc. for
5
+ * load the Google Fonts the editor uses (Geist for UI, Geist/Poppins/Inter/Manrope/etc. for
6
6
  * content). This utility detects which fonts are missing and injects a single
7
7
  * <link> to the Google Fonts API so they become available everywhere in the
8
8
  * editor — toolbars, dropdowns, slash-commands, content area, etc.
@@ -1,5 +1,7 @@
1
+ export declare function formatHtmlForCodeView(html: string): string;
1
2
  /**
2
- * Simple HTML formatter for the code view: breaks tags onto separate lines
3
- * so minified/single-line HTML is readable. Safe to run on any HTML string.
3
+ * Collapse formatting whitespace (newlines, indentation) between tags so that
4
+ * when we parse this HTML back into the editor we don't get extra text nodes.
5
+ * Use this before applying HTML from the code view to preserve structure.
4
6
  */
5
- export declare function formatHtmlForCodeView(html: string): string;
7
+ export declare function normalizeHtmlBeforeApply(html: string): string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eddyter",
3
3
  "private": false,
4
- "version": "1.3.80",
4
+ "version": "1.3.82",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@9.0.0",
7
7
  "keywords": [
@@ -58,6 +58,7 @@
58
58
  "prepublishOnly": "pnpm build"
59
59
  },
60
60
  "dependencies": {
61
+ "@codemirror/theme-one-dark": "^6.1.3",
61
62
  "@lexical/clipboard": "^0.24.0",
62
63
  "@lexical/code": "^0.24.0",
63
64
  "@lexical/dragon": "^0.24.0",
@@ -84,6 +85,8 @@
84
85
  "@radix-ui/react-tabs": "^1.1.3",
85
86
  "@radix-ui/react-tooltip": "^1.1.8",
86
87
  "@types/react-signature-canvas": "^1.0.7",
88
+ "@uiw/codemirror-extensions-langs": "^4.25.7",
89
+ "@uiw/react-codemirror": "^4.25.7",
87
90
  "axios": "^1.8.1",
88
91
  "class-variance-authority": "^0.7.1",
89
92
  "clsx": "^2.1.1",
@@ -1,131 +0,0 @@
1
- import { jsx as i, jsxs as p } from "react/jsx-runtime";
2
- import { useLexicalComposerContext as U } from "@lexical/react/LexicalComposerContext";
3
- import { $getNodeByKey as v } from "lexical";
4
- import { useState as N, useEffect as y } from "react";
5
- import { v as w, w as L, x as E, F as g, y as j, z as B } from "./index-BiGNE0nG.js";
6
- function W(t, e) {
7
- const l = t.split(".").pop()?.toLowerCase();
8
- return l === "pdf" || e.startsWith("data:application/pdf") ? "pdf" : l === "docx" || e.startsWith("data:application/vnd.openxmlformats") && t.toLowerCase().endsWith(".docx") ? "docx" : l === "xlsx" || l === "xls" || e.startsWith("data:application/vnd.openxmlformats-officedocument.spreadsheetml") || e.startsWith("data:application/vnd.ms-excel") ? "xlsx" : null;
9
- }
10
- function $(t, e) {
11
- const [l, d] = N(null);
12
- return y(() => {
13
- const s = t && e ? W(e, t) : null;
14
- if (!t || !e || !s) {
15
- d(null);
16
- return;
17
- }
18
- let c = !1;
19
- return s === "pdf" ? import("./generatePdfThumbnail-Be9_gTd2.js").then(({ generatePdfThumbnail: o }) => o(t)).then((o) => {
20
- c || d(o);
21
- }).catch(() => {
22
- c || d(null);
23
- }) : s === "docx" ? import("./generateDocxThumbnail-CuC4oE4q.js").then(({ generateDocxThumbnail: o }) => o(t)).then((o) => {
24
- c || d(o);
25
- }).catch(() => {
26
- c || d(null);
27
- }) : s === "xlsx" && import("./generateXlsxThumbnail-BHmQkbG6.js").then(({ generateXlsxThumbnail: o }) => o(t)).then((o) => {
28
- c || d(o);
29
- }).catch(() => {
30
- c || d(null);
31
- }), () => {
32
- c = !0, d(null);
33
- };
34
- }, [t, e]), l;
35
- }
36
- const z = (t) => t ? t < 1024 ? `${t} B` : t < 1024 * 1024 ? `${(t / 1024).toFixed(1)} KB` : t < 1024 * 1024 * 1024 ? `${(t / (1024 * 1024)).toFixed(1)} MB` : `${(t / (1024 * 1024 * 1024)).toFixed(1)} GB` : "", k = (t) => {
37
- const e = t.split(".");
38
- return e.length > 1 ? e[e.length - 1].toLowerCase() : "";
39
- }, b = (t) => {
40
- const e = k(t);
41
- return e === "pdf" || e === "docx" || e === "xlsx" || e === "xls";
42
- }, R = (t) => {
43
- const e = k(t);
44
- return ["pdf", "doc", "docx", "txt", "odt"].includes(e) ? /* @__PURE__ */ i(g, { className: "cteditor-w-8 cteditor-h-8 cteditor-text-blue-500" }) : ["xls", "xlsx", "csv"].includes(e) ? /* @__PURE__ */ i(g, { className: "cteditor-w-8 cteditor-h-8 cteditor-text-green-600" }) : ["zip", "rar", "7z", "tar", "gz"].includes(e) ? /* @__PURE__ */ i(j, { className: "cteditor-w-8 cteditor-h-8 cteditor-text-orange-500" }) : /* @__PURE__ */ i(B, { className: "cteditor-w-8 cteditor-h-8 cteditor-text-gray-500" });
45
- }, _ = ({ src: t, fileName: e, fileSize: l, nodeKey: d }) => {
46
- const [s] = U(), c = $(b(e) ? t : void 0, e);
47
- if (y(() => {
48
- c && s.update(() => {
49
- const n = v(d);
50
- w(n) && n.setPreviewDataUrl(c);
51
- });
52
- }, [s, d, c]), !t || !e)
53
- return console.error("FileView: Missing required props", { src: t, fileName: e, fileSize: l, nodeKey: d }), /* @__PURE__ */ i("div", { className: "cteditor-inline-flex cteditor-items-center cteditor-gap-3 cteditor-px-4 cteditor-py-3 cteditor-my-2 cteditor-border cteditor-border-destructive cteditor-rounded-lg cteditor-bg-destructive/10", children: /* @__PURE__ */ i("div", { className: "cteditor-text-sm cteditor-text-destructive", children: "Error loading file" }) });
54
- const o = (n) => {
55
- n.preventDefault(), n.stopPropagation();
56
- try {
57
- if (t.startsWith("data:")) {
58
- const r = t.split(","), f = r[0].match(/:(.*?);/), D = f ? f[1] : "application/octet-stream", m = atob(r[1]);
59
- let u = m.length;
60
- const x = new Uint8Array(u);
61
- for (; u--; )
62
- x[u] = m.charCodeAt(u);
63
- const P = new Blob([x], { type: D }), h = URL.createObjectURL(P), a = document.createElement("a");
64
- a.href = h, a.download = e, a.style.display = "none", document.body.appendChild(a), a.click(), document.body.removeChild(a), setTimeout(() => URL.revokeObjectURL(h), 100);
65
- } else {
66
- const r = document.createElement("a");
67
- r.href = t, r.download = e, r.style.display = "none", r.target = "_blank", document.body.appendChild(r), r.click(), document.body.removeChild(r);
68
- }
69
- } catch (r) {
70
- console.error("Error downloading file:", r), window.open(t, "_blank");
71
- }
72
- }, F = (n) => {
73
- n.preventDefault(), n.stopPropagation(), s.update(() => {
74
- const r = v(d);
75
- w(r) && r.remove();
76
- });
77
- }, C = b(e) && c;
78
- return /* @__PURE__ */ p(
79
- "div",
80
- {
81
- className: "cteditor-inline-flex cteditor-flex-col cteditor-gap-2 cteditor-py-2 cteditor-px-2 cteditor-my-2 cteditor-border cteditor-border-border cteditor-rounded-lg cteditor-bg-background hover:cteditor-bg-accent/50 cteditor-transition-colors cteditor-cursor-pointer cteditor-max-w-[240px]",
82
- onClick: o,
83
- role: "button",
84
- tabIndex: 0,
85
- onKeyDown: (n) => {
86
- (n.key === "Enter" || n.key === " ") && (n.preventDefault(), o(n));
87
- },
88
- children: [
89
- /* @__PURE__ */ i("div", { className: "cteditor-w-full cteditor-aspect-[120/88] cteditor-rounded cteditor-overflow-hidden cteditor-bg-muted cteditor-flex cteditor-items-center cteditor-justify-center", children: C ? /* @__PURE__ */ i(
90
- "img",
91
- {
92
- src: c,
93
- alt: "",
94
- className: "cteditor-w-full cteditor-h-full cteditor-object-cover"
95
- }
96
- ) : /* @__PURE__ */ i("div", { className: "*:cteditor-size-8", children: R(e) }) }),
97
- /* @__PURE__ */ p("div", { className: "cteditor-flex cteditor-items-start cteditor-gap-2 cteditor-w-full", children: [
98
- /* @__PURE__ */ p("div", { className: "cteditor-flex-1 cteditor-min-w-0", children: [
99
- /* @__PURE__ */ i("div", { className: "cteditor-font-medium cteditor-text-xs cteditor-text-foreground cteditor-truncate", children: e }),
100
- l && /* @__PURE__ */ i("div", { className: "cteditor-text-xs cteditor-text-muted-foreground", children: z(l) })
101
- ] }),
102
- /* @__PURE__ */ p("div", { className: "cteditor-flex cteditor-gap-1 cteditor-flex-shrink-0", children: [
103
- /* @__PURE__ */ i(
104
- "button",
105
- {
106
- onClick: o,
107
- className: "cteditor-p-1 cteditor-rounded-md hover:cteditor-bg-accent cteditor-transition-colors",
108
- "aria-label": "Download file",
109
- title: "Download file",
110
- children: /* @__PURE__ */ i(L, { className: "cteditor-w-4 cteditor-h-4 cteditor-text-muted-foreground" })
111
- }
112
- ),
113
- /* @__PURE__ */ i(
114
- "button",
115
- {
116
- onClick: F,
117
- className: "cteditor-p-1 cteditor-rounded-md hover:cteditor-bg-destructive hover:cteditor-text-destructive-foreground cteditor-transition-colors",
118
- "aria-label": "Delete file",
119
- title: "Delete file",
120
- children: /* @__PURE__ */ i(E, { className: "cteditor-w-4 cteditor-h-4 cteditor-text-muted-foreground" })
121
- }
122
- )
123
- ] })
124
- ] })
125
- ]
126
- }
127
- );
128
- };
129
- export {
130
- _ as default
131
- };