@haklex/rich-editor 0.0.39 → 0.0.40

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.
@@ -13,7 +13,7 @@ import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
13
13
  import { TabIndentationPlugin } from "@lexical/react/LexicalTabIndentationPlugin";
14
14
  import { TablePlugin } from "@lexical/react/LexicalTablePlugin";
15
15
  import { Y as $isAlertQuoteNode, d as RendererWrapper, Z as AlertRenderer, _ as SpoilerNode, T as MentionNode, a0 as FootnoteNode, O as KaTeXInlineNode, a1 as AlertQuoteNode, f as editorTheme, a2 as $isBannerNode, a3 as BannerRenderer, a4 as BannerNode, a5 as normalizeBannerType, a6 as $isCodeBlockNode, a7 as CodeBlockRenderer, a8 as CodeBlockNode, i as useFootnoteDefinitions, I as FootnoteSectionNode, v as $isGridContainerNode, K as GridContainerNode, b as builtinNodes, M as KaTeXBlockNode, L as ImageNode, a9 as VideoNode, Q as LinkCardNode, aa as DetailsNode, U as MermaidNode, F as FootnoteDefinitionsProvider, p as $createImageNode, W as computeImageMeta, V as OPEN_IMAGE_UPLOAD_DIALOG_COMMAND, ab as $createKaTeXInlineNode, ac as $createKaTeXBlockNode, ad as $createDetailsNode, ae as $createFootnoteNode, t as $isFootnoteSectionNode, $ as $createFootnoteSectionNode, r as $createMentionNode, g as extractTextContent, af as $createSpoilerNode, s as $createMermaidNode, C as ColorSchemeProvider, R as RendererConfigProvider } from "./theme-gVNBI_ET.js";
16
- import { $getNodeByKey, KEY_ENTER_COMMAND, COMMAND_PRIORITY_CRITICAL, KEY_ARROW_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $getRoot, $createParagraphNode, $isParagraphNode, $getSelection, $isRangeSelection, $insertNodes, createEditor, $isElementNode, $isDecoratorNode, $createNodeSelection, $setSelection, $nodesOfType, createCommand, COMMAND_PRIORITY_EDITOR, $isRootNode, $isNodeSelection, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_ARROW_UP_COMMAND, $isTextNode, $parseSerializedNode, PASTE_COMMAND, $createTextNode, $createLineBreakNode } from "lexical";
16
+ import { $getNodeByKey, KEY_ENTER_COMMAND, COMMAND_PRIORITY_CRITICAL, KEY_ARROW_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $getRoot, $createParagraphNode, $isParagraphNode, $getSelection, $isRangeSelection, $insertNodes, createEditor, $isElementNode, $isDecoratorNode, $createNodeSelection, $setSelection, $nodesOfType, createCommand, COMMAND_PRIORITY_EDITOR, $isRootNode, $isNodeSelection, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_ARROW_UP_COMMAND, $isTextNode, createState, $getState, $addUpdateTag, $setState, $parseSerializedNode, PASTE_COMMAND, $createTextNode, $createLineBreakNode } from "lexical";
17
17
  import { Info, Lightbulb, TriangleAlert, Flag, LayoutGrid, Plus, Minus, Check, Upload, Link2 } from "lucide-react";
18
18
  import { useCallback, useEffect, createElement, useState, createContext, use, useRef, useMemo } from "react";
19
19
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
@@ -1326,6 +1326,49 @@ function BlockExitPlugin() {
1326
1326
  }, [editor]);
1327
1327
  return null;
1328
1328
  }
1329
+ const blockIdState = createState("blockId", {
1330
+ parse: (v) => typeof v === "string" ? v : ""
1331
+ });
1332
+ const NORMALIZATION_TAG = "block-id-normalization";
1333
+ function BlockIdPlugin() {
1334
+ const [editor] = useLexicalComposerContext();
1335
+ useEffect(() => {
1336
+ return editor.registerUpdateListener(({ tags }) => {
1337
+ if (tags.has(NORMALIZATION_TAG)) return;
1338
+ editor.read(() => {
1339
+ const children = $getRoot().getChildren();
1340
+ let needsUpdate = false;
1341
+ const seen = /* @__PURE__ */ new Set();
1342
+ for (const child of children) {
1343
+ const id = $getState(child, blockIdState);
1344
+ if (id === "" || seen.has(id)) {
1345
+ needsUpdate = true;
1346
+ break;
1347
+ }
1348
+ seen.add(id);
1349
+ }
1350
+ if (!needsUpdate) return;
1351
+ editor.update(
1352
+ () => {
1353
+ $addUpdateTag("history-merge");
1354
+ const children2 = $getRoot().getChildren();
1355
+ const seen2 = /* @__PURE__ */ new Set();
1356
+ for (const child of children2) {
1357
+ let id = $getState(child, blockIdState);
1358
+ if (id === "" || seen2.has(id)) {
1359
+ id = crypto.randomUUID();
1360
+ $setState(child, blockIdState, id);
1361
+ }
1362
+ seen2.add(id);
1363
+ }
1364
+ },
1365
+ { tag: NORMALIZATION_TAG }
1366
+ );
1367
+ });
1368
+ });
1369
+ }, [editor]);
1370
+ return null;
1371
+ }
1329
1372
  function EditorRefPlugin({ onEditorReady }) {
1330
1373
  const [editor] = useLexicalComposerContext();
1331
1374
  const callbackRef = useRef(onEditorReady);
@@ -2434,6 +2477,7 @@ function RichEditor({
2434
2477
  /* @__PURE__ */ jsx(CheckListPlugin, {}),
2435
2478
  /* @__PURE__ */ jsx(BlockExitPlugin, {}),
2436
2479
  /* @__PURE__ */ jsx(AutoLinkPlugin, {}),
2480
+ /* @__PURE__ */ jsx(BlockIdPlugin, {}),
2437
2481
  /* @__PURE__ */ jsx(EditorRefPlugin, { onEditorReady }),
2438
2482
  autoFocus && /* @__PURE__ */ jsx(AutoFocusPlugin, {}),
2439
2483
  children,
@@ -2451,14 +2495,15 @@ export {
2451
2495
  NESTED_EDITOR_NODES as N,
2452
2496
  RichEditor as R,
2453
2497
  allEditNodes as a,
2454
- FootnoteSectionEditNode as b,
2498
+ blockIdState as b,
2455
2499
  customEditNodes as c,
2456
- INSERT_IMAGE_COMMAND as d,
2457
- INSERT_KATEX_BLOCK_COMMAND as e,
2458
- INSERT_KATEX_INLINE_COMMAND as f,
2500
+ FootnoteSectionEditNode as d,
2501
+ INSERT_IMAGE_COMMAND as e,
2502
+ INSERT_KATEX_BLOCK_COMMAND as f,
2459
2503
  getResolvedEditNodes as g,
2460
- INSERT_MERMAID_COMMAND as h,
2461
- defaultImageUpload as i,
2504
+ INSERT_KATEX_INLINE_COMMAND as h,
2505
+ INSERT_MERMAID_COMMAND as i,
2506
+ defaultImageUpload as j,
2462
2507
  setResolvedEditNodes as s,
2463
2508
  useImageUpload as u
2464
2509
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RichEditor.d.ts","sourceRoot":"","sources":["../../src/components/RichEditor.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAI/C,wBAAgB,UAAU,CAAC,EACzB,YAAY,EACZ,QAAQ,EACR,OAAmB,EACnB,KAAe,EACf,WAAkC,EAClC,QAAQ,EACR,SAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,QAAQ,GACT,EAAE,eAAe,+BAyEjB"}
1
+ {"version":3,"file":"RichEditor.d.ts","sourceRoot":"","sources":["../../src/components/RichEditor.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAI/C,wBAAgB,UAAU,CAAC,EACzB,YAAY,EACZ,QAAQ,EACR,OAAmB,EACnB,KAAe,EACf,WAAkC,EAClC,QAAQ,EACR,SAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,QAAQ,GACT,EAAE,eAAe,+BA0EjB"}
package/dist/editor.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { R, a, c, g, s } from "./RichEditor-BcbNmzGB.js";
1
+ import { R, a, c, g, s } from "./RichEditor-DnJwe663.js";
2
2
  import { a as a2, b, c as c2 } from "./theme-gVNBI_ET.js";
3
3
  export {
4
4
  R as RichEditor,
package/dist/index.d.ts CHANGED
@@ -69,4 +69,7 @@ export { NestedContentRendererProvider, useNestedContentRenderer, } from './cont
69
69
  export type { FootnoteStaticRendererProps } from './components/renderers/FootnoteStaticRenderer';
70
70
  export { FootnoteStaticRenderer } from './components/renderers/FootnoteStaticRenderer';
71
71
  export { extractTextContent } from './utils/extractTextContent';
72
+ export { blockIdState } from './plugins/BlockIdPlugin';
73
+ export type { AnchorError, AnchorResult, BlockAnchor, CommentAnchor, RangeAnchor, } from './utils/comment-anchor';
74
+ export { buildBlockAnchor, buildRangeAnchor } from './utils/comment-anchor';
72
75
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,12 +1,14 @@
1
- import { A, F, b, I, d, e, f, h, N, R, a, c, i, g, s, u } from "./RichEditor-BcbNmzGB.js";
1
+ import { b as blockIdState } from "./RichEditor-DnJwe663.js";
2
+ import { A, F, d, I, e, f, h, i, N, R, a, c, j, g, s, u } from "./RichEditor-DnJwe663.js";
2
3
  import { h as useFootnoteContent, j as useFootnoteDisplayNumber } from "./theme-gVNBI_ET.js";
3
- import { $, o, p, q, r, s as s2, t, v, w, x, y, z, A as A2, B, D, E, G, H, C, F as F2, I as I2, J, K, L, M, O, P, Q, S, T, U, N as N2, V, a as a2, b as b2, W, e as e2, c as c2, X, f as f2, g as g2, u as u2, i as i2, k, l, m, n } from "./theme-gVNBI_ET.js";
4
+ import { $, o, p, q, r, s as s2, t, v, w, x, y, z, A as A2, B, D, E, G, H, C, F as F2, I as I2, J, K, L, M, O, P, Q, S, T, U, N as N2, V, a as a2, b, W, e as e2, c as c2, X, f as f2, g as g2, u as u2, i as i2, k, l, m, n } from "./theme-gVNBI_ET.js";
4
5
  import { a as a3, c as c3, g as g3, n as n2 } from "./utils-fpeaZV1R.js";
5
6
  import { r as r2 } from "./shared.css-BqX4HjVE.js";
6
7
  import { articleTheme, commentTheme, noteTheme, vars } from "@haklex/rich-style-token";
7
8
  import { jsx, jsxs } from "react/jsx-runtime";
8
9
  import { TooltipRoot, TooltipTrigger, TooltipContent } from "@haklex/rich-editor-ui";
9
10
  import { useCallback } from "react";
11
+ import { $getRoot, $getSelection, $isRangeSelection, $getState, $isElementNode, $isTextNode, $isLineBreakNode } from "lexical";
10
12
  function FootnoteRenderer({ identifier }) {
11
13
  const content = useFootnoteContent(identifier);
12
14
  const displayNumber = useFootnoteDisplayNumber(identifier);
@@ -49,6 +51,161 @@ function FootnoteRenderer({ identifier }) {
49
51
  content ? /* @__PURE__ */ jsx(TooltipContent, { children: content }) : null
50
52
  ] }) });
51
53
  }
54
+ function computeBlockFingerprint(block) {
55
+ const text = block.getTextContent();
56
+ const input = text.slice(0, 200) + String(text.length);
57
+ let hash = 5381;
58
+ for (let i3 = 0; i3 < input.length; i3++) {
59
+ hash = (hash << 5) + hash + (input.codePointAt(i3) ?? 0) | 0;
60
+ }
61
+ return (hash >>> 0).toString(16);
62
+ }
63
+ function $getRootBlock(node) {
64
+ const root = $getRoot();
65
+ let current = node;
66
+ while (current) {
67
+ const parent = current.getParent();
68
+ if (parent === root && "getChildren" in current) {
69
+ return current;
70
+ }
71
+ current = parent;
72
+ }
73
+ return null;
74
+ }
75
+ function $resolveSelectionPoint(selection, which) {
76
+ const point = selection[which];
77
+ const node = point.getNode();
78
+ if ($isElementNode(node)) {
79
+ const children = node.getChildren();
80
+ if (point.offset < children.length) {
81
+ return { node: children[point.offset], offset: 0 };
82
+ }
83
+ const last = children.at(-1);
84
+ if (last && $isTextNode(last)) {
85
+ return { node: last, offset: last.getTextContentSize() };
86
+ }
87
+ return { node, offset: 0 };
88
+ }
89
+ return { node, offset: point.offset };
90
+ }
91
+ function $getTextOffsetInBlock(block, targetNode, targetOffset) {
92
+ let offset = 0;
93
+ function walk(node) {
94
+ if (node.is(targetNode)) {
95
+ offset += targetOffset;
96
+ return true;
97
+ }
98
+ if ($isTextNode(node)) {
99
+ offset += node.getTextContentSize();
100
+ } else if ($isLineBreakNode(node)) {
101
+ offset += 1;
102
+ } else if ($isElementNode(node)) {
103
+ for (const child of node.getChildren()) {
104
+ if (walk(child)) return true;
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ for (const child of block.getChildren()) {
110
+ if (walk(child)) break;
111
+ }
112
+ return offset;
113
+ }
114
+ function $buildBlockAnchorData(block) {
115
+ const blockId = $getState(block, blockIdState);
116
+ if (!blockId) {
117
+ return { ok: false, error: "no-block-id" };
118
+ }
119
+ return {
120
+ ok: true,
121
+ anchor: {
122
+ mode: "block",
123
+ blockId,
124
+ blockType: block.getType(),
125
+ blockFingerprint: computeBlockFingerprint(block),
126
+ snapshotText: block.getTextContent().slice(0, 300)
127
+ }
128
+ };
129
+ }
130
+ function buildBlockAnchor(editor, blockKey) {
131
+ return editor.read(() => {
132
+ if (blockKey) {
133
+ const node = $getRoot().getChildren().find((c4) => c4.getKey() === blockKey);
134
+ if (!node || !("getChildren" in node)) {
135
+ return { ok: false, error: "not-root-block" };
136
+ }
137
+ return $buildBlockAnchorData(node);
138
+ }
139
+ const selection = $getSelection();
140
+ if (!$isRangeSelection(selection)) {
141
+ return { ok: false, error: "no-selection" };
142
+ }
143
+ const anchorNode = selection.anchor.getNode();
144
+ const block = $getRootBlock(anchorNode);
145
+ if (!block) {
146
+ return { ok: false, error: "not-root-block" };
147
+ }
148
+ return $buildBlockAnchorData(block);
149
+ });
150
+ }
151
+ function buildRangeAnchor(editor) {
152
+ return editor.read(() => {
153
+ const selection = $getSelection();
154
+ if (!$isRangeSelection(selection)) {
155
+ return { ok: false, error: "no-selection" };
156
+ }
157
+ if (selection.isCollapsed()) {
158
+ return { ok: false, error: "collapsed" };
159
+ }
160
+ const anchorBlock = $getRootBlock(selection.anchor.getNode());
161
+ const focusBlock = $getRootBlock(selection.focus.getNode());
162
+ if (!anchorBlock || !focusBlock) {
163
+ return { ok: false, error: "not-root-block" };
164
+ }
165
+ if (anchorBlock !== focusBlock) {
166
+ return { ok: false, error: "cross-block" };
167
+ }
168
+ const block = anchorBlock;
169
+ const blockId = $getState(block, blockIdState);
170
+ if (!blockId) {
171
+ return { ok: false, error: "no-block-id" };
172
+ }
173
+ const anchorPoint = $resolveSelectionPoint(selection, "anchor");
174
+ const focusPoint = $resolveSelectionPoint(selection, "focus");
175
+ let startOffset = $getTextOffsetInBlock(
176
+ block,
177
+ anchorPoint.node,
178
+ anchorPoint.offset
179
+ );
180
+ let endOffset = $getTextOffsetInBlock(
181
+ block,
182
+ focusPoint.node,
183
+ focusPoint.offset
184
+ );
185
+ if (startOffset > endOffset) {
186
+ [startOffset, endOffset] = [endOffset, startOffset];
187
+ }
188
+ const text = block.getTextContent();
189
+ const quote = text.slice(startOffset, endOffset);
190
+ const prefix = text.slice(Math.max(0, startOffset - 50), startOffset);
191
+ const suffix = text.slice(endOffset, endOffset + 50);
192
+ return {
193
+ ok: true,
194
+ anchor: {
195
+ mode: "range",
196
+ blockId,
197
+ blockType: block.getType(),
198
+ blockFingerprint: computeBlockFingerprint(block),
199
+ snapshotText: text.slice(0, 300),
200
+ quote,
201
+ prefix,
202
+ suffix,
203
+ startOffset,
204
+ endOffset
205
+ }
206
+ };
207
+ });
208
+ }
52
209
  export {
53
210
  $ as $createFootnoteSectionNode,
54
211
  o as $createGridContainerNode,
@@ -73,15 +230,15 @@ export {
73
230
  F2 as FootnoteDefinitionsProvider,
74
231
  F as FootnotePlugin,
75
232
  FootnoteRenderer,
76
- b as FootnoteSectionEditNode,
233
+ d as FootnoteSectionEditNode,
77
234
  I2 as FootnoteSectionNode,
78
235
  J as FootnoteStaticRenderer,
79
236
  K as GridContainerNode,
80
237
  I as INSERT_ALERT_COMMAND,
81
- d as INSERT_IMAGE_COMMAND,
82
- e as INSERT_KATEX_BLOCK_COMMAND,
83
- f as INSERT_KATEX_INLINE_COMMAND,
84
- h as INSERT_MERMAID_COMMAND,
238
+ e as INSERT_IMAGE_COMMAND,
239
+ f as INSERT_KATEX_BLOCK_COMMAND,
240
+ h as INSERT_KATEX_INLINE_COMMAND,
241
+ i as INSERT_MERMAID_COMMAND,
85
242
  L as ImageNode,
86
243
  M as KaTeXBlockNode,
87
244
  O as KaTeXInlineNode,
@@ -98,7 +255,10 @@ export {
98
255
  a2 as allNodes,
99
256
  articleTheme,
100
257
  a3 as articleVariant,
101
- b2 as builtinNodes,
258
+ blockIdState,
259
+ buildBlockAnchor,
260
+ buildRangeAnchor,
261
+ b as builtinNodes,
102
262
  commentTheme,
103
263
  c3 as commentVariant,
104
264
  W as computeImageMeta,
@@ -106,7 +266,7 @@ export {
106
266
  c as customEditNodes,
107
267
  c2 as customNodes,
108
268
  X as decodeThumbHash,
109
- i as defaultImageUpload,
269
+ j as defaultImageUpload,
110
270
  f2 as editorTheme,
111
271
  g2 as extractTextContent,
112
272
  g as getResolvedEditNodes,
@@ -0,0 +1,3 @@
1
+ export declare const blockIdState: import('lexical').StateConfig<"blockId", string>;
2
+ export declare function BlockIdPlugin(): null;
3
+ //# sourceMappingURL=BlockIdPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockIdPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/BlockIdPlugin.tsx"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,kDAEvB,CAAA;AAIF,wBAAgB,aAAa,SA6C5B"}
@@ -0,0 +1,32 @@
1
+ import { LexicalEditor } from 'lexical';
2
+ export interface BlockAnchor {
3
+ mode: 'block';
4
+ blockId: string;
5
+ blockType: string;
6
+ blockFingerprint: string;
7
+ snapshotText: string;
8
+ }
9
+ export interface RangeAnchor {
10
+ mode: 'range';
11
+ blockId: string;
12
+ blockType: string;
13
+ blockFingerprint: string;
14
+ snapshotText: string;
15
+ quote: string;
16
+ prefix: string;
17
+ suffix: string;
18
+ startOffset: number;
19
+ endOffset: number;
20
+ }
21
+ export type CommentAnchor = BlockAnchor | RangeAnchor;
22
+ export type AnchorError = 'no-selection' | 'cross-block' | 'collapsed' | 'no-block-id' | 'not-root-block';
23
+ export type AnchorResult<T> = {
24
+ ok: true;
25
+ anchor: T;
26
+ } | {
27
+ ok: false;
28
+ error: AnchorError;
29
+ };
30
+ export declare function buildBlockAnchor(editor: LexicalEditor, blockKey?: string): AnchorResult<BlockAnchor>;
31
+ export declare function buildRangeAnchor(editor: LexicalEditor): AnchorResult<RangeAnchor>;
32
+ //# sourceMappingURL=comment-anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-anchor.d.ts","sourceRoot":"","sources":["../../src/utils/comment-anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAGd,MAAM,SAAS,CAAA;AAahB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAA;AAErD,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,aAAa,GACb,WAAW,GACX,aAAa,GACb,gBAAgB,CAAA;AAEpB,MAAM,MAAM,YAAY,CAAC,CAAC,IACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACvB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAgGrC,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC,WAAW,CAAC,CAyB3B;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,GACpB,YAAY,CAAC,WAAW,CAAC,CAmE3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haklex/rich-editor",
3
- "version": "0.0.39",
3
+ "version": "0.0.40",
4
4
  "description": "Core rich text editor based on Lexical",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,9 +29,9 @@
29
29
  ],
30
30
  "dependencies": {
31
31
  "thumbhash": "^0.1.1",
32
- "@haklex/rich-headless": "0.0.39",
33
- "@haklex/rich-editor-ui": "0.0.39",
34
- "@haklex/rich-style-token": "0.0.39"
32
+ "@haklex/rich-editor-ui": "0.0.40",
33
+ "@haklex/rich-style-token": "0.0.40",
34
+ "@haklex/rich-headless": "0.0.40"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@base-ui/react": "^1.2.0",
@@ -52,7 +52,7 @@
52
52
  "lucide-react": "^0.574.0",
53
53
  "react": "^19.2.4",
54
54
  "react-dom": "^19.2.4",
55
- "shiki": "^3.22.0",
55
+ "shiki": "^3.23.0",
56
56
  "typescript": "^5.9.3",
57
57
  "vite": "^7.3.1",
58
58
  "vite-plugin-dts": "^4.5.4"