@haklex/rich-editor 0.1.1 → 0.3.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 (65) hide show
  1. package/dist/AlertQuoteEditNode-C55sxsR3.js +267 -0
  2. package/dist/KaTeXRenderer-CQQT3BMw.js +215 -0
  3. package/dist/LinkCardRenderer-CigqFwCv.js +45 -0
  4. package/dist/MermaidPlugin-BrOr-wQi.js +67 -0
  5. package/dist/RubyRenderer-jOkydJHg.js +15 -0
  6. package/dist/SubmitShortcutPlugin-DhyVFzoj.js +2186 -0
  7. package/dist/commands-entry.mjs +54 -74
  8. package/dist/components/decorators/PollEditDecorator.d.ts +13 -0
  9. package/dist/components/decorators/PollEditDecorator.d.ts.map +1 -0
  10. package/dist/components/renderers/PollRenderer.d.ts +3 -0
  11. package/dist/components/renderers/PollRenderer.d.ts.map +1 -0
  12. package/dist/config-B5BuLljq.js +1633 -0
  13. package/dist/config-edit.d.ts.map +1 -1
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/context/PollDataContext.d.ts +11 -0
  16. package/dist/context/PollDataContext.d.ts.map +1 -0
  17. package/dist/extractPolls-DO31LNrp.js +116 -0
  18. package/dist/grid.css-CJCkLTZc.js +44 -0
  19. package/dist/index.d.ts +5 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.mjs +121 -180
  22. package/dist/katex.css-CIOEOXyd.js +145 -0
  23. package/dist/node-registry-Dz5OTkh4.js +946 -0
  24. package/dist/nodes/PollEditNode.d.ts +14 -0
  25. package/dist/nodes/PollEditNode.d.ts.map +1 -0
  26. package/dist/nodes/PollNode.d.ts +52 -0
  27. package/dist/nodes/PollNode.d.ts.map +1 -0
  28. package/dist/nodes-entry.d.ts +3 -0
  29. package/dist/nodes-entry.d.ts.map +1 -1
  30. package/dist/nodes-entry.mjs +5 -50
  31. package/dist/normalizeSerializedEditorState-B-1wmGzd.js +78 -0
  32. package/dist/plugins-entry.mjs +3 -28
  33. package/dist/renderers-entry.mjs +41 -61
  34. package/dist/rich-editor.css +2 -1
  35. package/dist/static-entry.d.ts +5 -0
  36. package/dist/static-entry.d.ts.map +1 -1
  37. package/dist/static-entry.mjs +16 -66
  38. package/dist/styles/index.d.ts +2 -0
  39. package/dist/styles/index.d.ts.map +1 -1
  40. package/dist/styles/poll-edit.css.d.ts +35 -0
  41. package/dist/styles/poll-edit.css.d.ts.map +1 -0
  42. package/dist/styles/poll.css.d.ts +43 -0
  43. package/dist/styles/poll.css.d.ts.map +1 -0
  44. package/dist/styles-entry.mjs +3 -21
  45. package/dist/theme-B5B2EOWM.js +1099 -0
  46. package/dist/types/poll.d.ts +36 -0
  47. package/dist/types/poll.d.ts.map +1 -0
  48. package/dist/types/renderer-config.d.ts +3 -0
  49. package/dist/types/renderer-config.d.ts.map +1 -1
  50. package/dist/utils/extractPolls.d.ts +4 -0
  51. package/dist/utils/extractPolls.d.ts.map +1 -0
  52. package/package.json +30 -30
  53. package/dist/AlertQuoteEditNode-sPNf3_7P.js +0 -293
  54. package/dist/KaTeXRenderer-CQyQzNTJ.js +0 -218
  55. package/dist/LinkCardRenderer-QmkOlyXb.js +0 -36
  56. package/dist/MermaidPlugin-DKuGUcCG.js +0 -101
  57. package/dist/PresentDialogContext-DRroMIoK.js +0 -71
  58. package/dist/RubyRenderer-CJQmODir.js +0 -14
  59. package/dist/SubmitShortcutPlugin-D9uKYHda.js +0 -2427
  60. package/dist/config-Dl3ZkytB.js +0 -1362
  61. package/dist/grid.css-Md5-Cfx_.js +0 -11
  62. package/dist/katex.css-Csc-7N7u.js +0 -28
  63. package/dist/node-registry-CovhHUB6.js +0 -824
  64. package/dist/normalizeSerializedEditorState-k5G4xSi9.js +0 -85
  65. package/dist/theme-lEwScxEX.js +0 -1113
@@ -0,0 +1,36 @@
1
+ export type PollMode = 'single' | 'multiple';
2
+ export type PollShowResults = 'always' | 'after-vote' | 'after-close';
3
+ export interface PollOption {
4
+ id: string;
5
+ label: string;
6
+ }
7
+ export interface PollState {
8
+ canVote: boolean;
9
+ closed: boolean;
10
+ errorMessage?: string;
11
+ status: 'loading' | 'ready' | 'error';
12
+ tallies: Record<string, number>;
13
+ totalVotes: number;
14
+ userVote?: string[];
15
+ }
16
+ export interface PollDataAdapter {
17
+ usePollState: (pollId: string) => PollState;
18
+ useSubmit: (pollId: string) => (optionIds: string[]) => Promise<void>;
19
+ }
20
+ export interface PollMetadata {
21
+ closeAt?: string;
22
+ mode: PollMode;
23
+ options: PollOption[];
24
+ pollId: string;
25
+ question: string;
26
+ showResults?: PollShowResults;
27
+ }
28
+ export interface PollRendererProps {
29
+ closeAt?: string;
30
+ mode: PollMode;
31
+ options: PollOption[];
32
+ pollId: string;
33
+ question: string;
34
+ showResults?: PollShowResults;
35
+ }
36
+ //# sourceMappingURL=poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/types/poll.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B"}
@@ -12,6 +12,7 @@ import { MermaidRendererProps } from '../components/renderers/MermaidRenderer';
12
12
  import { RubyRendererProps } from '../components/renderers/RubyRenderer';
13
13
  import { TagRendererProps } from '../components/renderers/TagRenderer';
14
14
  import { VideoRendererProps } from '../components/renderers/VideoRenderer';
15
+ import { PollRendererProps } from './poll';
15
16
  export interface CodeFile {
16
17
  code: string;
17
18
  filename: string;
@@ -63,6 +64,8 @@ export interface RendererConfig {
63
64
  Mention?: ComponentType<MentionRendererProps>;
64
65
  /** Custom renderer for Mermaid diagrams */
65
66
  Mermaid?: ComponentType<MermaidRendererProps>;
67
+ /** Custom renderer for reader-facing vote/poll widgets */
68
+ Poll?: ComponentType<PollRendererProps>;
66
69
  /** Custom renderer for ruby annotations */
67
70
  Ruby?: ComponentType<RubyRendererProps>;
68
71
  /** Custom renderer for inline tag badges */
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-config.d.ts","sourceRoot":"","sources":["../../src/types/renderer-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer-config.d.ts","sourceRoot":"","sources":["../../src/types/renderer-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SerializedEditorState } from 'lexical';
2
+ import { PollMetadata } from '../types/poll';
3
+ export declare function extractPolls(state: SerializedEditorState): PollMetadata[];
4
+ //# sourceMappingURL=extractPolls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractPolls.d.ts","sourceRoot":"","sources":["../../src/utils/extractPolls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAyB,MAAM,SAAS,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAoElD,wBAAgB,YAAY,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,EAAE,CAIzE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haklex/rich-editor",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Core rich text editor based on Lexical",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,46 +45,46 @@
45
45
  "dist"
46
46
  ],
47
47
  "dependencies": {
48
- "@lexical/code-core": "^0.43.0",
49
- "nanoid": "^5.1.6",
48
+ "@lexical/code-core": "^0.44.0",
49
+ "nanoid": "^5.1.9",
50
50
  "thumbhash": "^0.1.1",
51
- "@haklex/rich-editor-ui": "0.1.1",
52
- "@haklex/rich-headless": "0.1.1",
53
- "@haklex/rich-style-token": "0.1.1"
51
+ "@haklex/rich-editor-ui": "0.3.0",
52
+ "@haklex/rich-headless": "0.3.0",
53
+ "@haklex/rich-style-token": "0.3.0"
54
54
  },
55
55
  "devDependencies": {
56
- "@lexical/extension": "^0.43.0",
57
- "@lexical/link": "^0.43.0",
58
- "@lexical/list": "^0.43.0",
59
- "@lexical/markdown": "^0.43.0",
60
- "@lexical/react": "^0.43.0",
61
- "@lexical/rich-text": "^0.43.0",
62
- "@lexical/table": "^0.43.0",
56
+ "@lexical/extension": "^0.44.0",
57
+ "@lexical/link": "^0.44.0",
58
+ "@lexical/list": "^0.44.0",
59
+ "@lexical/markdown": "^0.44.0",
60
+ "@lexical/react": "^0.44.0",
61
+ "@lexical/rich-text": "^0.44.0",
62
+ "@lexical/table": "^0.44.0",
63
63
  "@types/react": "^19.2.14",
64
64
  "@types/react-dom": "^19.2.3",
65
- "@vanilla-extract/css": "^1.18.0",
66
- "@vanilla-extract/vite-plugin": "^5.1.4",
67
- "katex": "^0.16.37",
68
- "lexical": "^0.43.0",
69
- "lucide-react": "^1.0.0",
70
- "react": "^19.2.4",
71
- "react-dom": "^19.2.4",
72
- "shiki": "^4.0.1",
65
+ "@vanilla-extract/css": "^1.20.1",
66
+ "@vanilla-extract/vite-plugin": "^5.2.2",
67
+ "katex": "^0.16.45",
68
+ "lexical": "^0.44.0",
69
+ "lucide-react": "^1.12.0",
70
+ "react": "^19.2.5",
71
+ "react-dom": "^19.2.5",
72
+ "shiki": "^4.0.2",
73
73
  "typescript": "^5.9.3",
74
- "vite": "^7.3.1",
74
+ "vite": "^8.0.10",
75
75
  "vite-plugin-dts": "^4.5.4"
76
76
  },
77
77
  "peerDependencies": {
78
78
  "@base-ui/react": "^1.1.0",
79
- "@lexical/extension": "^0.43.0",
80
- "@lexical/link": "^0.43.0",
81
- "@lexical/list": "^0.43.0",
82
- "@lexical/markdown": "^0.43.0",
83
- "@lexical/react": "^0.43.0",
84
- "@lexical/rich-text": "^0.43.0",
85
- "@lexical/table": "^0.43.0",
79
+ "@lexical/extension": "^0.44.0",
80
+ "@lexical/link": "^0.44.0",
81
+ "@lexical/list": "^0.44.0",
82
+ "@lexical/markdown": "^0.44.0",
83
+ "@lexical/react": "^0.44.0",
84
+ "@lexical/rich-text": "^0.44.0",
85
+ "@lexical/table": "^0.44.0",
86
86
  "katex": ">=0.16.0",
87
- "lexical": "^0.43.0",
87
+ "lexical": "^0.44.0",
88
88
  "lucide-react": "^1.0.0",
89
89
  "react": ">=19",
90
90
  "react-dom": ">=19",
@@ -1,293 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { $getNodeByKey, KEY_ENTER_COMMAND, COMMAND_PRIORITY_CRITICAL, KEY_ARROW_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $getRoot, $createParagraphNode, $isParagraphNode, $getSelection, $isRangeSelection, $insertNodes, createEditor } from "lexical";
5
- import { Info, Lightbulb, TriangleAlert } from "lucide-react";
6
- import { useCallback, useEffect, createElement } from "react";
7
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
8
- import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
9
- import { ContentEditable } from "@lexical/react/LexicalContentEditable";
10
- import { LexicalErrorBoundary } from "@lexical/react/LexicalErrorBoundary";
11
- import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin";
12
- import { ListPlugin } from "@lexical/react/LexicalListPlugin";
13
- import { LexicalNestedComposer } from "@lexical/react/LexicalNestedComposer";
14
- import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
15
- import { s as $isAlertQuoteNode, t as AlertRenderer, S as SpoilerNode, M as MentionNode, F as FootnoteNode, k as KaTeXInlineNode, T as TagNode, v as AlertQuoteNode, n as editorTheme } from "./theme-lEwScxEX.js";
16
- import { a as RendererWrapper } from "./KaTeXRenderer-CQyQzNTJ.js";
17
- import { CodeNode } from "@lexical/code-core";
18
- import { HorizontalRuleNode } from "@lexical/extension";
19
- import { LinkNode, AutoLinkNode } from "@lexical/link";
20
- import { ListNode, ListItemNode } from "@lexical/list";
21
- import { HeadingNode, QuoteNode } from "@lexical/rich-text";
22
- import { TableNode, TableCellNode, TableRowNode } from "@lexical/table";
23
- function ExitBlockPlugin({
24
- parentEditor,
25
- nodeKey
26
- }) {
27
- const [editor] = useLexicalComposerContext();
28
- useEffect(() => {
29
- const focusParent = () => {
30
- parentEditor.focus(() => {
31
- parentEditor.update(() => {
32
- const alertNode = $getNodeByKey(nodeKey);
33
- if (alertNode) {
34
- const next = alertNode.getNextSibling();
35
- if (next) {
36
- next.selectStart();
37
- }
38
- }
39
- });
40
- });
41
- };
42
- const exitAlert = (removeEmpty) => {
43
- const root = $getRoot();
44
- const lastChild = root.getLastChild();
45
- const shouldRemoveAlert = removeEmpty && root.getChildrenSize() <= 1;
46
- if (removeEmpty && lastChild) {
47
- lastChild.remove();
48
- }
49
- if (shouldRemoveAlert) {
50
- parentEditor.update(
51
- () => {
52
- const alertNode = $getNodeByKey(nodeKey);
53
- if (alertNode) {
54
- const paragraph = $createParagraphNode();
55
- alertNode.insertAfter(paragraph);
56
- alertNode.remove();
57
- paragraph.selectStart();
58
- }
59
- },
60
- { onUpdate: focusParent }
61
- );
62
- } else {
63
- parentEditor.update(
64
- () => {
65
- const alertNode = $getNodeByKey(nodeKey);
66
- if (alertNode) {
67
- let next = alertNode.getNextSibling();
68
- if (!next || !$isParagraphNode(next)) {
69
- next = $createParagraphNode();
70
- alertNode.insertAfter(next);
71
- }
72
- next.selectStart();
73
- }
74
- },
75
- { onUpdate: focusParent }
76
- );
77
- }
78
- };
79
- const isAtLastEmptyParagraph = () => {
80
- const selection = $getSelection();
81
- if (!$isRangeSelection(selection) || !selection.isCollapsed()) return false;
82
- const anchorNode = selection.anchor.getNode();
83
- const topLevelElement = anchorNode.getTopLevelElement();
84
- return topLevelElement && $isParagraphNode(topLevelElement) && topLevelElement.getTextContent() === "" && topLevelElement.getNextSibling() === null;
85
- };
86
- const unregisterEnter = editor.registerCommand(
87
- KEY_ENTER_COMMAND,
88
- (event) => {
89
- if (event?.metaKey || event?.ctrlKey) {
90
- event.preventDefault();
91
- exitAlert(false);
92
- return true;
93
- }
94
- if (!isAtLastEmptyParagraph()) return false;
95
- event?.preventDefault();
96
- exitAlert(true);
97
- return true;
98
- },
99
- COMMAND_PRIORITY_CRITICAL
100
- );
101
- const unregisterArrowDown = editor.registerCommand(
102
- KEY_ARROW_DOWN_COMMAND,
103
- (event) => {
104
- if (!isAtLastEmptyParagraph()) return false;
105
- event?.preventDefault();
106
- exitAlert(false);
107
- return true;
108
- },
109
- COMMAND_PRIORITY_HIGH
110
- );
111
- return () => {
112
- unregisterEnter();
113
- unregisterArrowDown();
114
- };
115
- }, [editor, parentEditor, nodeKey]);
116
- return null;
117
- }
118
- function AlertEditDecorator({ nodeKey, alertType, contentEditor }) {
119
- const [editor] = useLexicalComposerContext();
120
- const editable = editor.isEditable();
121
- const handleTypeChange = useCallback(
122
- (newType) => {
123
- editor.update(() => {
124
- const node = $getNodeByKey(nodeKey);
125
- if ($isAlertQuoteNode(node)) {
126
- node.setAlertType(newType);
127
- }
128
- });
129
- },
130
- [editor, nodeKey]
131
- );
132
- return /* @__PURE__ */ jsxs(Fragment, { children: [
133
- /* @__PURE__ */ jsx(
134
- RendererWrapper,
135
- {
136
- defaultRenderer: AlertRenderer,
137
- rendererKey: "Alert",
138
- props: {
139
- type: alertType,
140
- editable,
141
- onTypeChange: editable ? handleTypeChange : void 0
142
- }
143
- }
144
- ),
145
- /* @__PURE__ */ jsx("div", { className: "rich-alert-content", children: /* @__PURE__ */ jsxs(LexicalNestedComposer, { initialEditor: contentEditor, children: [
146
- /* @__PURE__ */ jsx(
147
- RichTextPlugin,
148
- {
149
- ErrorBoundary: LexicalErrorBoundary,
150
- contentEditable: /* @__PURE__ */ jsx(
151
- ContentEditable,
152
- {
153
- "aria-placeholder": "",
154
- className: "rich-alert-content-editable",
155
- placeholder: /* @__PURE__ */ jsx("span", { style: { display: "none" } }),
156
- style: { outline: "none" }
157
- }
158
- )
159
- }
160
- ),
161
- /* @__PURE__ */ jsx(ListPlugin, {}),
162
- /* @__PURE__ */ jsx(LinkPlugin, {}),
163
- /* @__PURE__ */ jsx(ExitBlockPlugin, { nodeKey, parentEditor: editor })
164
- ] }) })
165
- ] });
166
- }
167
- const NESTED_EDITOR_NODES = [
168
- HeadingNode,
169
- QuoteNode,
170
- ListNode,
171
- ListItemNode,
172
- LinkNode,
173
- AutoLinkNode,
174
- HorizontalRuleNode,
175
- CodeNode,
176
- TableNode,
177
- TableCellNode,
178
- TableRowNode,
179
- SpoilerNode,
180
- MentionNode,
181
- FootnoteNode,
182
- KaTeXInlineNode,
183
- TagNode
184
- ];
185
- function createContentEditor() {
186
- return createEditor({
187
- namespace: "AlertContent",
188
- nodes: NESTED_EDITOR_NODES,
189
- theme: editorTheme,
190
- onError: (error) => {
191
- console.error("[AlertContent]", error);
192
- }
193
- });
194
- }
195
- const _AlertQuoteEditNode = class _AlertQuoteEditNode extends AlertQuoteNode {
196
- constructor(alertType, contentState, key) {
197
- super(alertType, contentState, key);
198
- __publicField(this, "__contentEditor");
199
- this.__contentEditor = createContentEditor();
200
- if (contentState) {
201
- const editorState = this.__contentEditor.parseEditorState(contentState);
202
- this.__contentEditor.setEditorState(editorState);
203
- }
204
- }
205
- static clone(node) {
206
- const cloned = new _AlertQuoteEditNode(
207
- node.__alertType,
208
- node.__contentState,
209
- node.__key
210
- );
211
- cloned.__contentEditor = node.__contentEditor;
212
- return cloned;
213
- }
214
- getContentEditor() {
215
- return this.__contentEditor;
216
- }
217
- static importJSON(serializedNode) {
218
- const node = new _AlertQuoteEditNode(
219
- serializedNode.alertType,
220
- serializedNode.content
221
- );
222
- return node;
223
- }
224
- exportJSON() {
225
- return {
226
- ...super.exportJSON(),
227
- type: "alert-quote",
228
- alertType: this.__alertType,
229
- content: this.__contentEditor.getEditorState().toJSON(),
230
- version: 1
231
- };
232
- }
233
- decorate(_editor, _config) {
234
- return createElement(AlertEditDecorator, {
235
- nodeKey: this.__key,
236
- alertType: this.__alertType,
237
- contentEditor: this.__contentEditor
238
- });
239
- }
240
- };
241
- __publicField(_AlertQuoteEditNode, "commandItems", [
242
- {
243
- title: "Callout",
244
- icon: createElement(Info, { size: 20 }),
245
- description: "Info callout block",
246
- keywords: ["alert", "note", "info", "callout"],
247
- section: "ADVANCED",
248
- placement: ["slash", "toolbar"],
249
- group: "insert",
250
- onSelect: (editor) => {
251
- editor.update(() => {
252
- $insertNodes([$createAlertQuoteEditNode("note")]);
253
- });
254
- }
255
- },
256
- {
257
- title: "Tip",
258
- icon: createElement(Lightbulb, { size: 20 }),
259
- description: "Highlight a useful tip",
260
- keywords: ["alert", "tip", "hint"],
261
- section: "ADVANCED",
262
- placement: ["slash", "toolbar"],
263
- group: "insert",
264
- onSelect: (editor) => {
265
- editor.update(() => {
266
- $insertNodes([$createAlertQuoteEditNode("tip")]);
267
- });
268
- }
269
- },
270
- {
271
- title: "Warning",
272
- icon: createElement(TriangleAlert, { size: 20 }),
273
- description: "Warn about something",
274
- keywords: ["alert", "warning", "caution"],
275
- section: "ADVANCED",
276
- placement: ["slash", "toolbar"],
277
- group: "insert",
278
- onSelect: (editor) => {
279
- editor.update(() => {
280
- $insertNodes([$createAlertQuoteEditNode("warning")]);
281
- });
282
- }
283
- }
284
- ]);
285
- let AlertQuoteEditNode = _AlertQuoteEditNode;
286
- function $createAlertQuoteEditNode(alertType, contentState) {
287
- return new AlertQuoteEditNode(alertType, contentState);
288
- }
289
- export {
290
- $createAlertQuoteEditNode as $,
291
- AlertQuoteEditNode as A,
292
- NESTED_EDITOR_NODES as N
293
- };
@@ -1,218 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { createContext, use, useMemo, createElement, useCallback, useState, useEffect } from "react";
3
- import { s as semanticClassNames, d as sharedStyles, e as clsx, b as katexStyles, k as katexClassNames } from "./katex.css-Csc-7N7u.js";
4
- import { thumbHashToDataURL, rgbaToThumbHash } from "thumbhash";
5
- const RendererConfigContext = createContext({
6
- config: void 0,
7
- mode: "renderer",
8
- variant: "article"
9
- });
10
- function RendererConfigProvider({
11
- config,
12
- mode,
13
- variant,
14
- children
15
- }) {
16
- const value = useMemo(() => ({ config, mode, variant }), [config, mode, variant]);
17
- return /* @__PURE__ */ jsx(RendererConfigContext.Provider, { value, children });
18
- }
19
- function useRendererConfig() {
20
- return use(RendererConfigContext).config;
21
- }
22
- function useRendererMode() {
23
- return use(RendererConfigContext).mode;
24
- }
25
- function useVariant() {
26
- return use(RendererConfigContext).variant;
27
- }
28
- function RendererWrapper({
29
- rendererKey,
30
- defaultRenderer: DefaultRenderer,
31
- props
32
- }) {
33
- const config = useRendererConfig();
34
- const Renderer = config?.[rendererKey] ?? DefaultRenderer;
35
- return /* @__PURE__ */ jsx(Renderer, { ...props });
36
- }
37
- function createRendererDecoration(rendererKey, defaultRenderer, props) {
38
- return createElement(RendererWrapper, {
39
- rendererKey,
40
- defaultRenderer,
41
- props
42
- });
43
- }
44
- const FootnoteDefinitionsContext = createContext({
45
- definitions: {},
46
- displayNumberMap: {}
47
- });
48
- function FootnoteDefinitionsProvider({
49
- definitions,
50
- displayNumberMap,
51
- children
52
- }) {
53
- const value = useMemo(
54
- () => ({ definitions, displayNumberMap }),
55
- [definitions, displayNumberMap]
56
- );
57
- return /* @__PURE__ */ jsx(FootnoteDefinitionsContext, { value, children });
58
- }
59
- function useFootnoteDefinitions() {
60
- return use(FootnoteDefinitionsContext);
61
- }
62
- function useFootnoteContent(identifier) {
63
- const { definitions } = use(FootnoteDefinitionsContext);
64
- return definitions[identifier];
65
- }
66
- function useFootnoteDisplayNumber(identifier) {
67
- const { displayNumberMap } = use(FootnoteDefinitionsContext);
68
- return displayNumberMap[identifier];
69
- }
70
- function FootnoteStaticRenderer({ identifier }) {
71
- const content = useFootnoteContent(identifier);
72
- const displayNumber = useFootnoteDisplayNumber(identifier);
73
- const referenceId = `footnote-ref-${identifier}`;
74
- const targetId = `footnote-${identifier}`;
75
- const handleClick = useCallback(
76
- (e) => {
77
- const target = document.getElementById(targetId) || document.getElementById(`fn-${identifier}`);
78
- if (!target) return;
79
- e.preventDefault();
80
- target.scrollIntoView({ behavior: "smooth", block: "center" });
81
- target.classList.add(semanticClassNames.footnoteHighlight, sharedStyles.footnoteHighlight);
82
- window.setTimeout(() => {
83
- target.classList.remove(
84
- semanticClassNames.footnoteHighlight,
85
- sharedStyles.footnoteHighlight
86
- );
87
- }, 1200);
88
- },
89
- [identifier, targetId]
90
- );
91
- const label = displayNumber ?? identifier;
92
- return /* @__PURE__ */ jsx("span", { className: clsx(semanticClassNames.footnoteRefWrapper, sharedStyles.footnoteRefWrapper), children: /* @__PURE__ */ jsx(
93
- "a",
94
- {
95
- "aria-label": content ? `Footnote ${label}: ${content}` : `Footnote ${label}`,
96
- className: clsx(semanticClassNames.footnoteRef, sharedStyles.footnoteRef),
97
- "data-footnote-ref": identifier,
98
- href: `#${targetId}`,
99
- id: referenceId,
100
- role: "doc-noteref",
101
- onClick: handleClick,
102
- children: label
103
- }
104
- ) });
105
- }
106
- const MAX_DIM = 100;
107
- async function computeImageMeta(file) {
108
- const url = URL.createObjectURL(file);
109
- try {
110
- const img = await loadImage(url);
111
- const { naturalWidth: w, naturalHeight: h } = img;
112
- const scale = Math.min(MAX_DIM / w, MAX_DIM / h, 1);
113
- const sw = Math.round(w * scale);
114
- const sh = Math.round(h * scale);
115
- const canvas = document.createElement("canvas");
116
- canvas.width = sw;
117
- canvas.height = sh;
118
- const ctx = canvas.getContext("2d");
119
- ctx.drawImage(img, 0, 0, sw, sh);
120
- const { data } = ctx.getImageData(0, 0, sw, sh);
121
- const hash = rgbaToThumbHash(sw, sh, data);
122
- const thumbhash = uint8ToBase64(hash);
123
- return { width: w, height: h, thumbhash };
124
- } finally {
125
- URL.revokeObjectURL(url);
126
- }
127
- }
128
- function decodeThumbHash(hash) {
129
- try {
130
- const bytes = base64ToUint8(hash);
131
- return thumbHashToDataURL(bytes);
132
- } catch {
133
- return void 0;
134
- }
135
- }
136
- function loadImage(src) {
137
- return new Promise((resolve, reject) => {
138
- const img = new Image();
139
- img.onload = () => resolve(img);
140
- img.onerror = reject;
141
- img.src = src;
142
- });
143
- }
144
- function uint8ToBase64(bytes) {
145
- let bin = "";
146
- for (const b of bytes) bin += String.fromCodePoint(b);
147
- return btoa(bin);
148
- }
149
- function base64ToUint8(str) {
150
- const bin = atob(str);
151
- const bytes = new Uint8Array(bin.length);
152
- for (let i = 0; i < bin.length; i++) bytes[i] = bin.codePointAt(i);
153
- return bytes;
154
- }
155
- let katexModule = null;
156
- let katexLoadPromise = null;
157
- function loadKaTeX() {
158
- if (katexModule) return Promise.resolve(katexModule);
159
- if (!katexLoadPromise) {
160
- katexLoadPromise = import("katex").then((mod) => {
161
- katexModule = mod;
162
- return katexModule;
163
- });
164
- }
165
- return katexLoadPromise;
166
- }
167
- function KaTeXRenderer({ equation, displayMode }) {
168
- const [html, setHtml] = useState(null);
169
- const [error, setError] = useState(null);
170
- useEffect(() => {
171
- let cancelled = false;
172
- loadKaTeX().then((katex) => {
173
- if (cancelled) return;
174
- const rendered = katex.default.renderToString(equation, {
175
- displayMode,
176
- throwOnError: false
177
- });
178
- setHtml(rendered);
179
- setError(null);
180
- }).catch(() => {
181
- if (cancelled) return;
182
- setHtml(null);
183
- setError("KaTeX is not available");
184
- });
185
- return () => {
186
- cancelled = true;
187
- };
188
- }, [equation, displayMode]);
189
- if (error) {
190
- return /* @__PURE__ */ jsx("code", { className: clsx(katexClassNames.fallback, katexStyles.fallback), children: equation });
191
- }
192
- if (html) {
193
- return /* @__PURE__ */ jsx(
194
- "span",
195
- {
196
- dangerouslySetInnerHTML: { __html: html },
197
- className: displayMode ? clsx(katexClassNames.block, katexStyles.block) : clsx(katexClassNames.inline, katexStyles.inline)
198
- }
199
- );
200
- }
201
- return /* @__PURE__ */ jsx("code", { className: clsx(katexClassNames.fallback, katexStyles.fallback), children: equation });
202
- }
203
- export {
204
- FootnoteDefinitionsProvider as F,
205
- KaTeXRenderer as K,
206
- RendererConfigProvider as R,
207
- RendererWrapper as a,
208
- useFootnoteDefinitions as b,
209
- createRendererDecoration as c,
210
- useFootnoteDisplayNumber as d,
211
- useRendererConfig as e,
212
- useRendererMode as f,
213
- useVariant as g,
214
- FootnoteStaticRenderer as h,
215
- computeImageMeta as i,
216
- decodeThumbHash as j,
217
- useFootnoteContent as u
218
- };