@olddevs/ui 4.3.0 → 4.5.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 (182) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/editor/RichTextEditor.d.ts +11 -4
  3. package/dist/editor/RichTextEditor.d.ts.map +1 -1
  4. package/dist/editor/RichTextEditor.js +124 -60
  5. package/dist/editor/RichTextEditor.js.map +1 -1
  6. package/dist/editor/RichTextView.d.ts +2 -1
  7. package/dist/editor/RichTextView.d.ts.map +1 -1
  8. package/dist/editor/RichTextView.js.map +1 -1
  9. package/dist/editor/core/containers.d.ts +2 -6
  10. package/dist/editor/core/containers.d.ts.map +1 -1
  11. package/dist/editor/core/containers.js +2 -1
  12. package/dist/editor/core/containers.js.map +1 -1
  13. package/dist/editor/core/customTool.d.ts +8 -2
  14. package/dist/editor/core/customTool.d.ts.map +1 -1
  15. package/dist/editor/core/customTool.js.map +1 -1
  16. package/dist/editor/core/customToolEngine.d.ts +9 -1
  17. package/dist/editor/core/customToolEngine.d.ts.map +1 -1
  18. package/dist/editor/core/customToolEngine.js +12 -0
  19. package/dist/editor/core/customToolEngine.js.map +1 -1
  20. package/dist/editor/core/extensions.d.ts.map +1 -1
  21. package/dist/editor/core/extensions.js +1 -1
  22. package/dist/editor/core/extensions.js.map +1 -1
  23. package/dist/editor/core/handle.d.ts +18 -5
  24. package/dist/editor/core/handle.d.ts.map +1 -1
  25. package/dist/editor/core/handle.js +2 -13
  26. package/dist/editor/core/handle.js.map +1 -1
  27. package/dist/editor/core/handleWatchers.d.ts +36 -0
  28. package/dist/editor/core/handleWatchers.d.ts.map +1 -0
  29. package/dist/editor/core/handleWatchers.js +29 -0
  30. package/dist/editor/core/handleWatchers.js.map +1 -0
  31. package/dist/editor/core/nodeNames.d.ts +7 -0
  32. package/dist/editor/core/nodeNames.d.ts.map +1 -0
  33. package/dist/editor/core/nodeNames.js +2 -0
  34. package/dist/editor/core/nodeNames.js.map +1 -0
  35. package/dist/editor/core/schema.d.ts.map +1 -1
  36. package/dist/editor/core/schema.js +4 -2
  37. package/dist/editor/core/schema.js.map +1 -1
  38. package/dist/editor/core/toolCommands.d.ts +78 -0
  39. package/dist/editor/core/toolCommands.d.ts.map +1 -0
  40. package/dist/editor/core/toolCommands.js +2 -0
  41. package/dist/editor/core/toolCommands.js.map +1 -0
  42. package/dist/editor/core/toolDefinition.d.ts +139 -0
  43. package/dist/editor/core/toolDefinition.d.ts.map +1 -0
  44. package/dist/editor/core/toolDefinition.js +28 -0
  45. package/dist/editor/core/toolDefinition.js.map +1 -0
  46. package/dist/editor/core/toolDescriptor.d.ts +71 -2
  47. package/dist/editor/core/toolDescriptor.d.ts.map +1 -1
  48. package/dist/editor/core/toolDescriptor.js +6 -2
  49. package/dist/editor/core/toolDescriptor.js.map +1 -1
  50. package/dist/editor/core/toolOptions.d.ts +157 -0
  51. package/dist/editor/core/toolOptions.d.ts.map +1 -0
  52. package/dist/editor/core/toolOptions.js +21 -0
  53. package/dist/editor/core/toolOptions.js.map +1 -0
  54. package/dist/editor/core/toolState.d.ts +46 -0
  55. package/dist/editor/core/toolState.d.ts.map +1 -0
  56. package/dist/editor/core/toolState.js +2 -0
  57. package/dist/editor/core/toolState.js.map +1 -0
  58. package/dist/editor/core/tools.d.ts +10 -3
  59. package/dist/editor/core/tools.d.ts.map +1 -1
  60. package/dist/editor/core/tools.js +2 -1
  61. package/dist/editor/core/tools.js.map +1 -1
  62. package/dist/editor/core/viewIsland.d.ts.map +1 -1
  63. package/dist/editor/core/viewIsland.js +2 -1
  64. package/dist/editor/core/viewIsland.js.map +1 -1
  65. package/dist/editor/features/builtins.d.ts +9 -4
  66. package/dist/editor/features/builtins.d.ts.map +1 -1
  67. package/dist/editor/features/builtins.js +36 -7
  68. package/dist/editor/features/builtins.js.map +1 -1
  69. package/dist/editor/features/search/SearchPanel.d.ts.map +1 -1
  70. package/dist/editor/features/search/SearchPanel.js +26 -12
  71. package/dist/editor/features/search/SearchPanel.js.map +1 -1
  72. package/dist/editor/features/search/revealMatch.d.ts +16 -0
  73. package/dist/editor/features/search/revealMatch.d.ts.map +1 -1
  74. package/dist/editor/features/search/revealMatch.js +22 -0
  75. package/dist/editor/features/search/revealMatch.js.map +1 -1
  76. package/dist/editor/features/search/searchPlugin.d.ts +8 -3
  77. package/dist/editor/features/search/searchPlugin.d.ts.map +1 -1
  78. package/dist/editor/features/search/searchPlugin.js +17 -6
  79. package/dist/editor/features/search/searchPlugin.js.map +1 -1
  80. package/dist/editor/features/search/searchSnapshot.d.ts +14 -0
  81. package/dist/editor/features/search/searchSnapshot.d.ts.map +1 -0
  82. package/dist/editor/features/search/searchSnapshot.js +17 -0
  83. package/dist/editor/features/search/searchSnapshot.js.map +1 -0
  84. package/dist/editor/features/search/searchTool.d.ts +3 -0
  85. package/dist/editor/features/search/searchTool.d.ts.map +1 -1
  86. package/dist/editor/features/search/searchTool.js +30 -1
  87. package/dist/editor/features/search/searchTool.js.map +1 -1
  88. package/dist/editor/features/toc/RichTextToc.d.ts +91 -0
  89. package/dist/editor/features/toc/RichTextToc.d.ts.map +1 -0
  90. package/dist/editor/features/toc/RichTextToc.js +417 -0
  91. package/dist/editor/features/toc/RichTextToc.js.map +1 -0
  92. package/dist/editor/features/toc/documentHeadings.d.ts +30 -0
  93. package/dist/editor/features/toc/documentHeadings.d.ts.map +1 -0
  94. package/dist/editor/features/toc/documentHeadings.js +20 -0
  95. package/dist/editor/features/toc/documentHeadings.js.map +1 -0
  96. package/dist/editor/features/toc/headings.d.ts +35 -0
  97. package/dist/editor/features/toc/headings.d.ts.map +1 -0
  98. package/dist/editor/features/toc/headings.js +27 -0
  99. package/dist/editor/features/toc/headings.js.map +1 -0
  100. package/dist/editor/features/toc/stickyOffset.d.ts +3 -0
  101. package/dist/editor/features/toc/stickyOffset.d.ts.map +1 -0
  102. package/dist/editor/features/toc/stickyOffset.js +14 -0
  103. package/dist/editor/features/toc/stickyOffset.js.map +1 -0
  104. package/dist/editor/features/toc/tocSnapshot.d.ts +10 -0
  105. package/dist/editor/features/toc/tocSnapshot.d.ts.map +1 -0
  106. package/dist/editor/features/toc/tocSnapshot.js +8 -0
  107. package/dist/editor/features/toc/tocSnapshot.js.map +1 -0
  108. package/dist/editor/features/toc/tocTool.d.ts +6 -0
  109. package/dist/editor/features/toc/tocTool.d.ts.map +1 -0
  110. package/dist/editor/features/toc/tocTool.js +21 -0
  111. package/dist/editor/features/toc/tocTool.js.map +1 -0
  112. package/dist/editor/hooks/useRichTextToolState.d.ts +43 -0
  113. package/dist/editor/hooks/useRichTextToolState.d.ts.map +1 -0
  114. package/dist/editor/hooks/useRichTextToolState.js +77 -0
  115. package/dist/editor/hooks/useRichTextToolState.js.map +1 -0
  116. package/dist/editor/index.d.ts +10 -0
  117. package/dist/editor/index.d.ts.map +1 -1
  118. package/dist/editor/index.js +4 -0
  119. package/dist/editor/index.js.map +1 -1
  120. package/dist/i18n/defaults.d.ts.map +1 -1
  121. package/dist/i18n/defaults.js +1 -0
  122. package/dist/i18n/defaults.js.map +1 -1
  123. package/dist/i18n/messages.d.ts +5 -0
  124. package/dist/i18n/messages.d.ts.map +1 -1
  125. package/dist/locales/ru.d.ts.map +1 -1
  126. package/dist/locales/ru.js +1 -0
  127. package/dist/locales/ru.js.map +1 -1
  128. package/docs/api/editor-extension.en.md +223 -23
  129. package/docs/api/editor-extension.md +224 -22
  130. package/docs/api/messages.en.md +743 -0
  131. package/docs/api/messages.md +1 -0
  132. package/docs/api/migration-notes.en.md +36 -1
  133. package/docs/api/migration-notes.md +35 -0
  134. package/docs/api/utilities.en.md +233 -0
  135. package/docs/components/content/rich-text-toc.en.md +132 -0
  136. package/docs/components/content/rich-text-toc.md +131 -0
  137. package/docs/components/index.en.md +3 -2
  138. package/docs/components/index.md +2 -1
  139. package/docs/components/inputs/rich-text-editor.en.md +277 -43
  140. package/docs/components/inputs/rich-text-editor.md +247 -11
  141. package/docs/conventions.en.md +318 -0
  142. package/docs/getting-started.en.md +7 -7
  143. package/docs/getting-started.md +6 -6
  144. package/docs/glossary.en.md +52 -47
  145. package/docs/glossary.md +51 -46
  146. package/docs/index.en.md +53 -0
  147. package/llms.txt +1 -0
  148. package/package.json +1 -1
  149. package/src/editor/RichTextEditor.tsx +197 -38
  150. package/src/editor/RichTextView.tsx +2 -1
  151. package/src/editor/core/containers.ts +8 -6
  152. package/src/editor/core/customTool.ts +8 -2
  153. package/src/editor/core/customToolEngine.ts +20 -1
  154. package/src/editor/core/extensions.ts +2 -1
  155. package/src/editor/core/handle.ts +26 -23
  156. package/src/editor/core/handleWatchers.ts +72 -0
  157. package/src/editor/core/nodeNames.ts +7 -0
  158. package/src/editor/core/schema.ts +5 -2
  159. package/src/editor/core/toolCommands.ts +85 -0
  160. package/src/editor/core/toolDefinition.ts +208 -0
  161. package/src/editor/core/toolDescriptor.ts +94 -3
  162. package/src/editor/core/toolOptions.ts +211 -0
  163. package/src/editor/core/toolState.ts +56 -0
  164. package/src/editor/core/tools.ts +12 -3
  165. package/src/editor/core/viewIsland.ts +5 -4
  166. package/src/editor/features/builtins.ts +72 -13
  167. package/src/editor/features/search/SearchPanel.tsx +38 -14
  168. package/src/editor/features/search/revealMatch.ts +45 -0
  169. package/src/editor/features/search/searchPlugin.ts +40 -11
  170. package/src/editor/features/search/searchSnapshot.ts +29 -0
  171. package/src/editor/features/search/searchTool.ts +51 -1
  172. package/src/editor/features/toc/RichTextToc.tsx +810 -0
  173. package/src/editor/features/toc/documentHeadings.ts +59 -0
  174. package/src/editor/features/toc/headings.ts +77 -0
  175. package/src/editor/features/toc/stickyOffset.ts +21 -0
  176. package/src/editor/features/toc/tocSnapshot.ts +24 -0
  177. package/src/editor/features/toc/tocTool.ts +41 -0
  178. package/src/editor/hooks/useRichTextToolState.ts +153 -0
  179. package/src/editor/index.ts +21 -0
  180. package/src/i18n/defaults.ts +1 -0
  181. package/src/i18n/messages.ts +5 -0
  182. package/src/locales/ru.ts +1 -0
@@ -0,0 +1,417 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useCallback, useEffect, useRef, useState, } from "react";
4
+ import { HoverCard, HoverCardContent, HoverCardTrigger, } from "../../../components/overlays/HoverCard.js";
5
+ import { useMessages } from "../../../i18n/useMessages.js";
6
+ import { cn } from "../../../lib/cn.js";
7
+ import { watchHandleEditor } from "../../core/handleWatchers.js";
8
+ import { tocDocumentHeadings } from "./documentHeadings.js";
9
+ import { collectHeadings, documentRoot } from "./headings.js";
10
+ import { stickyOffset } from "./stickyOffset.js";
11
+ const STROKE_WIDTH = ["w-3.5", "w-3", "w-2.5", "w-2"];
12
+ const CURRENT_STROKE = "bg-accent-strong h-[3px] w-4";
13
+ const ITEM_INDENT = ["pl-0", "pl-2.5", "pl-5", "pl-7.5"];
14
+ const strokeWidth = (depth) => STROKE_WIDTH[Math.min(depth, STROKE_WIDTH.length - 1)];
15
+ const itemIndent = (depth) => ITEM_INDENT[Math.min(depth, ITEM_INDENT.length - 1)];
16
+ const OPEN_DELAY = 200;
17
+ const CLOSE_DELAY = 300;
18
+ const ALL_LEVELS = [1, 2, 3, 4];
19
+ const REBUILD_DELAY = 150;
20
+ const STRIP_GAP = 6;
21
+ const STRIP_CELL = 3;
22
+ const STRIP_PADDING = 8;
23
+ const STRIP_MARGIN = 16;
24
+ const PIN_SETTLE = 150;
25
+ const SPY_SLACK = 8;
26
+ function prefersReducedMotion() {
27
+ return (typeof window.matchMedia === "function" &&
28
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches);
29
+ }
30
+ function scrollParent(node) {
31
+ for (let parent = node.parentElement; parent; parent = parent.parentElement) {
32
+ if (parent === document.body || parent === document.documentElement)
33
+ return null;
34
+ const { overflowY } = getComputedStyle(parent);
35
+ if (/(auto|scroll|overlay)/.test(overflowY) && parent.scrollHeight > parent.clientHeight) {
36
+ return parent;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ const FLASH_DURATION = 1600;
42
+ function scaleCurve(node, token) {
43
+ return getComputedStyle(node).getPropertyValue(token).trim() || "ease";
44
+ }
45
+ function flash(heading) {
46
+ if (typeof heading.animate !== "function")
47
+ return;
48
+ const accent = getComputedStyle(heading).getPropertyValue("--accent-strong").trim();
49
+ const color = accent ? `color-mix(in srgb, ${accent} 24%, transparent)` : "transparent";
50
+ heading.animate([
51
+ { backgroundColor: color, boxShadow: `0 0 0 6px ${color}`, borderRadius: "4px" },
52
+ { backgroundColor: "transparent", boxShadow: "0 0 0 6px transparent", borderRadius: "4px" },
53
+ ], { duration: FLASH_DURATION, easing: scaleCurve(heading, "--ease-enter") });
54
+ }
55
+ function jumpTo(heading, offset, focusHeading) {
56
+ if (focusHeading?.(heading)) {
57
+ }
58
+ else if (!heading.parentElement?.closest('[contenteditable="true"]')) {
59
+ if (!heading.hasAttribute("tabindex")) {
60
+ heading.setAttribute("tabindex", "-1");
61
+ heading.addEventListener("blur", () => heading.removeAttribute("tabindex"), { once: true });
62
+ }
63
+ heading.focus({ preventScroll: true });
64
+ }
65
+ flash(heading);
66
+ const behavior = prefersReducedMotion() ? "auto" : "smooth";
67
+ if (offset === null) {
68
+ heading.scrollIntoView({ behavior, block: "start" });
69
+ return;
70
+ }
71
+ const scroller = scrollParent(heading);
72
+ const top = heading.getBoundingClientRect().top;
73
+ if (scroller) {
74
+ const edge = scroller.getBoundingClientRect().top;
75
+ scroller.scrollTo({ top: scroller.scrollTop + top - edge, behavior });
76
+ }
77
+ else {
78
+ window.scrollTo({ top: window.scrollY + top - offset, behavior });
79
+ }
80
+ }
81
+ function currentIndex(headings, offset) {
82
+ const first = headings[0];
83
+ if (!first)
84
+ return -1;
85
+ const scroller = scrollParent(first.element);
86
+ const edge = scroller ? scroller.getBoundingClientRect().top : (offset ?? 0);
87
+ const line = edge + SPY_SLACK;
88
+ const atEnd = scroller
89
+ ? scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 2
90
+ : window.scrollY + window.innerHeight >= document.documentElement.scrollHeight - 2;
91
+ const bottom = scroller ? scroller.getBoundingClientRect().bottom : window.innerHeight;
92
+ let current = 0;
93
+ headings.forEach((heading, index) => {
94
+ const top = heading.element.getBoundingClientRect().top;
95
+ if (top <= line || (atEnd && top < bottom))
96
+ current = index;
97
+ });
98
+ return current;
99
+ }
100
+ function keepVisible(item, box) {
101
+ if (!item || !box)
102
+ return;
103
+ const itemRect = item.getBoundingClientRect();
104
+ const boxRect = box.getBoundingClientRect();
105
+ if (itemRect.top < boxRect.top)
106
+ box.scrollTop -= boxRect.top - itemRect.top;
107
+ else if (itemRect.bottom > boxRect.bottom)
108
+ box.scrollTop += itemRect.bottom - boxRect.bottom;
109
+ }
110
+ function resolveTarget(target) {
111
+ const value = target.current;
112
+ if (!value)
113
+ return null;
114
+ if (!("editor" in value))
115
+ return value;
116
+ const { editor } = value;
117
+ return editor && !editor.isDestroyed ? editor.view.dom : null;
118
+ }
119
+ function sameHeadings(a, b) {
120
+ return (a.length === b.length &&
121
+ a.every((heading, index) => heading.element === b[index].element &&
122
+ heading.text === b[index].text &&
123
+ heading.depth === b[index].depth));
124
+ }
125
+ function stripGap(count, offset) {
126
+ if (count < 2)
127
+ return STRIP_GAP;
128
+ const room = window.innerHeight - (offset ?? 0) - STRIP_MARGIN * 2 - STRIP_PADDING - count * STRIP_CELL;
129
+ return Math.max(0, Math.min(STRIP_GAP, room / (count - 1)));
130
+ }
131
+ function fitsBeside(strip, target) {
132
+ const own = strip.getBoundingClientRect();
133
+ const text = documentRoot(target).getBoundingClientRect();
134
+ return own.left >= 0 && own.right <= text.left;
135
+ }
136
+ export const RichTextToc = forwardRef(function RichTextToc(props, ref) {
137
+ return _jsx(TocCore, { ref: ref, ...props });
138
+ });
139
+ export const TocCore = forwardRef(function TocCore({ target, offsetVar = "--topbar-h", listWidth = 240, levels, stickyTop, focusHeading, alignToFirstHeading = false, onCurrentChange, editor, jumpRef, className, style, ...rest }, ref) {
140
+ const latest = useRef({ stickyTop, focusHeading, offsetVar, levels, onCurrentChange, editor });
141
+ useEffect(() => {
142
+ latest.current = { stickyTop, focusHeading, offsetVar, levels, onCurrentChange, editor };
143
+ });
144
+ const levelsKey = levels ? levels.join(",") : "";
145
+ const offsetNow = useCallback(() => {
146
+ const own = latest.current;
147
+ return own.stickyTop ? own.stickyTop() : stickyOffset(own.offsetVar);
148
+ }, []);
149
+ const messages = useMessages();
150
+ const [element, setElement] = useState(null);
151
+ const [headings, setHeadings] = useState([]);
152
+ const [gap, setGap] = useState(STRIP_GAP);
153
+ const [current, setCurrent] = useState(0);
154
+ useEffect(() => {
155
+ latest.current.onCurrentChange?.(current);
156
+ }, [current]);
157
+ const [open, setOpen] = useState(false);
158
+ const [fits, setFits] = useState(true);
159
+ const stripRef = useRef(null);
160
+ const focusOnOpen = useRef(false);
161
+ const navRef = useRef(null);
162
+ const keyHandled = useRef(false);
163
+ useEffect(() => {
164
+ const resolve = () => setElement(resolveTarget(target));
165
+ resolve();
166
+ return watchHandleEditor(target, resolve);
167
+ }, [target]);
168
+ useEffect(() => {
169
+ if (!element) {
170
+ setHeadings((prev) => (prev.length ? [] : prev));
171
+ return;
172
+ }
173
+ const read = () => {
174
+ const next = collectHeadings(element, latest.current.levels);
175
+ setHeadings((prev) => (sameHeadings(prev, next) ? prev : next));
176
+ };
177
+ read();
178
+ let timer;
179
+ const observer = new MutationObserver(() => {
180
+ clearTimeout(timer);
181
+ timer = setTimeout(read, REBUILD_DELAY);
182
+ });
183
+ observer.observe(documentRoot(element), {
184
+ childList: true,
185
+ subtree: true,
186
+ characterData: true,
187
+ });
188
+ return () => {
189
+ clearTimeout(timer);
190
+ observer.disconnect();
191
+ };
192
+ }, [element, levelsKey]);
193
+ useEffect(() => {
194
+ if (headings.length < 2)
195
+ return;
196
+ let frame = 0;
197
+ const update = () => {
198
+ frame = 0;
199
+ setGap(stripGap(headings.length, offsetNow()));
200
+ };
201
+ const schedule = () => {
202
+ if (!frame)
203
+ frame = requestAnimationFrame(update);
204
+ };
205
+ update();
206
+ window.addEventListener("resize", schedule);
207
+ return () => {
208
+ if (frame)
209
+ cancelAnimationFrame(frame);
210
+ window.removeEventListener("resize", schedule);
211
+ };
212
+ }, [headings.length, offsetVar, offsetNow]);
213
+ const pinned = useRef(null);
214
+ const settle = (lock) => {
215
+ window.clearTimeout(lock.timer);
216
+ lock.timer = window.setTimeout(() => {
217
+ lock.settled = true;
218
+ }, PIN_SETTLE);
219
+ };
220
+ const pin = (index, heading) => {
221
+ if (pinned.current)
222
+ window.clearTimeout(pinned.current.timer);
223
+ pinned.current = { heading, settled: false, timer: 0 };
224
+ settle(pinned.current);
225
+ setCurrent(index);
226
+ };
227
+ const go = (index) => {
228
+ const heading = headings[index];
229
+ if (!heading?.element.isConnected)
230
+ return false;
231
+ pin(index, heading.element);
232
+ jumpTo(heading.element, offsetNow(), latest.current.focusHeading);
233
+ return true;
234
+ };
235
+ const goToSnapshotIndex = (index) => {
236
+ const { editor: engine, levels: shown } = latest.current;
237
+ if (!engine)
238
+ return go(index);
239
+ if (engine.isDestroyed)
240
+ return false;
241
+ const found = tocDocumentHeadings(engine, { levels: shown ?? ALL_LEVELS })[index];
242
+ const node = found && engine.view.nodeDOM(found.pos);
243
+ if (!(node instanceof HTMLElement) || !node.isConnected || !element)
244
+ return false;
245
+ const fresh = collectHeadings(element, shown);
246
+ setHeadings((prev) => (sameHeadings(prev, fresh) ? prev : fresh));
247
+ const listed = fresh.findIndex((heading) => heading.element === node);
248
+ if (listed >= 0)
249
+ pin(listed, node);
250
+ jumpTo(node, offsetNow(), latest.current.focusHeading);
251
+ return true;
252
+ };
253
+ const goRef = useRef(goToSnapshotIndex);
254
+ useEffect(() => {
255
+ goRef.current = goToSnapshotIndex;
256
+ });
257
+ useEffect(() => {
258
+ if (!jumpRef)
259
+ return;
260
+ jumpRef.current = (index) => goRef.current(index);
261
+ return () => {
262
+ jumpRef.current = null;
263
+ };
264
+ }, [jumpRef]);
265
+ useEffect(() => {
266
+ if (headings.length < 2)
267
+ return;
268
+ let frame = 0;
269
+ const update = () => {
270
+ frame = 0;
271
+ const lock = pinned.current;
272
+ const held = lock && !lock.settled ? headings.findIndex((h) => h.element === lock.heading) : -1;
273
+ setCurrent(held >= 0 ? held : currentIndex(headings, offsetNow()));
274
+ };
275
+ const schedule = (event) => {
276
+ const scrolled = event?.target;
277
+ if (scrolled instanceof Element && !scrolled.contains(headings[0].element)) {
278
+ return;
279
+ }
280
+ const lock = pinned.current;
281
+ if (lock && !lock.settled) {
282
+ settle(lock);
283
+ return;
284
+ }
285
+ pinned.current = null;
286
+ if (!frame)
287
+ frame = requestAnimationFrame(update);
288
+ };
289
+ update();
290
+ document.addEventListener("scroll", schedule, { capture: true, passive: true });
291
+ window.addEventListener("resize", schedule);
292
+ return () => {
293
+ if (frame)
294
+ cancelAnimationFrame(frame);
295
+ document.removeEventListener("scroll", schedule, { capture: true });
296
+ window.removeEventListener("resize", schedule);
297
+ };
298
+ }, [headings, offsetVar, offsetNow]);
299
+ useEffect(() => () => window.clearTimeout(pinned.current?.timer), []);
300
+ useEffect(() => {
301
+ const strip = stripRef.current;
302
+ const node = element;
303
+ if (!strip || !node)
304
+ return;
305
+ let frame = 0;
306
+ const measure = () => {
307
+ frame = 0;
308
+ const next = fitsBeside(strip, node);
309
+ setFits(next);
310
+ if (!next)
311
+ setOpen(false);
312
+ };
313
+ const schedule = () => {
314
+ if (!frame)
315
+ frame = requestAnimationFrame(measure);
316
+ };
317
+ measure();
318
+ window.addEventListener("resize", schedule);
319
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
320
+ observer?.observe(node);
321
+ observer?.observe(document.documentElement);
322
+ return () => {
323
+ if (frame)
324
+ cancelAnimationFrame(frame);
325
+ window.removeEventListener("resize", schedule);
326
+ observer?.disconnect();
327
+ };
328
+ }, [element, headings.length]);
329
+ const [lead, setLead] = useState(0);
330
+ useEffect(() => {
331
+ const first = headings[0]?.element;
332
+ const root = stripRef.current?.parentElement;
333
+ const column = root?.parentElement;
334
+ if (!alignToFirstHeading || !first || !column || !element)
335
+ return;
336
+ const measure = () => {
337
+ const box = first.getBoundingClientRect();
338
+ const line = parseFloat(getComputedStyle(first).lineHeight) || box.height;
339
+ const center = box.top + Math.min(line, box.height) / 2;
340
+ const next = center - column.getBoundingClientRect().top - STRIP_PADDING / 2 - STRIP_CELL / 2;
341
+ setLead(Math.max(0, Math.round(next)));
342
+ };
343
+ measure();
344
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
345
+ observer?.observe(element);
346
+ return () => observer?.disconnect();
347
+ }, [alignToFirstHeading, headings, element]);
348
+ const listRef = useCallback((node) => {
349
+ navRef.current = node;
350
+ if (!node)
351
+ return;
352
+ const items = node.querySelectorAll("button");
353
+ keepVisible(items[current], node.parentElement);
354
+ if (!focusOnOpen.current)
355
+ return;
356
+ focusOnOpen.current = false;
357
+ (items[current] ?? items[0])?.focus();
358
+ }, [current]);
359
+ if (headings.length < 2)
360
+ return null;
361
+ const label = messages.editor.toc;
362
+ const onStripKeyDown = (event) => {
363
+ if (event.key !== "Enter" && event.key !== " ")
364
+ return;
365
+ event.preventDefault();
366
+ keyHandled.current = true;
367
+ if (open && navRef.current) {
368
+ const items = navRef.current.querySelectorAll("button");
369
+ (items[current] ?? items[0])?.focus();
370
+ return;
371
+ }
372
+ focusOnOpen.current = true;
373
+ setOpen(true);
374
+ };
375
+ const onListKeyDown = (event) => {
376
+ const items = [...event.currentTarget.querySelectorAll("button")];
377
+ const index = items.indexOf(document.activeElement);
378
+ const next = event.key === "ArrowDown"
379
+ ? Math.min(index + 1, items.length - 1)
380
+ : event.key === "ArrowUp"
381
+ ? Math.max(index - 1, 0)
382
+ : event.key === "Home"
383
+ ? 0
384
+ : event.key === "End"
385
+ ? items.length - 1
386
+ : null;
387
+ if (next === null)
388
+ return;
389
+ event.preventDefault();
390
+ items[next]?.focus();
391
+ };
392
+ return (_jsx("div", { ref: ref, "data-hidden": fits ? undefined : "", className: cn("inline-flex", !fits && "invisible", className), style: alignToFirstHeading ? { ...style, marginTop: lead } : style, ...rest, children: _jsxs(HoverCard, { open: open, onOpenChange: setOpen, openDelay: OPEN_DELAY, closeDelay: CLOSE_DELAY, children: [_jsx(HoverCardTrigger, { asChild: true, children: _jsx("button", { ref: stripRef, type: "button", "aria-label": label, "aria-expanded": open, onClick: () => {
393
+ if (keyHandled.current) {
394
+ keyHandled.current = false;
395
+ return;
396
+ }
397
+ if (!open)
398
+ focusOnOpen.current = true;
399
+ setOpen(true);
400
+ }, onKeyDown: onStripKeyDown, style: { rowGap: gap }, className: "focus-visible:outline-accent-strong flex cursor-pointer flex-col items-start rounded-sm p-1 outline-offset-2 focus-visible:outline-2", children: headings.map((heading, index) => (_jsx("span", { className: "flex h-[3px] w-4 items-center", children: _jsx("span", { "data-toc-stroke": "", "data-depth": heading.depth, "data-current": index === current || undefined, className: cn("rounded-full transition-[width,height,background-color]", index === current
401
+ ? CURRENT_STROKE
402
+ : cn("bg-fg-3 h-0.5", strokeWidth(heading.depth))) }) }, index))) }) }), _jsx(HoverCardContent, { side: "right", align: "start", sideOffset: 8, className: "max-h-[min(70dvh,32rem)] overflow-y-auto overscroll-contain p-1", style: { width: listWidth }, onEscapeKeyDown: () => stripRef.current?.focus(), onFocusOutside: (event) => {
403
+ if (element?.contains(event.target))
404
+ event.preventDefault();
405
+ }, onPointerDownOutside: (event) => {
406
+ if (stripRef.current?.contains(event.target))
407
+ event.preventDefault();
408
+ }, children: _jsx("nav", { ref: listRef, "aria-label": label, onKeyDown: onListKeyDown, children: _jsx("ul", { children: headings.map((heading, index) => (_jsx("li", { children: _jsxs("button", { type: "button", "data-depth": heading.depth, "aria-current": index === current ? "location" : undefined, className: cn("hover:bg-bg-2 focus-visible:bg-bg-2 flex w-full cursor-pointer items-center gap-2.5 rounded-sm py-0.5 pr-2 pl-1.5 text-left text-[13px] leading-[18px] outline-none", index === current ? "bg-bg-2 text-fg-0" : "text-fg-2 hover:text-fg-0"), onClick: (event) => {
409
+ go(index);
410
+ const item = event.currentTarget;
411
+ if (event.detail > 0 && document.activeElement === item)
412
+ item.blur();
413
+ }, children: [_jsx("span", { "aria-hidden": true, className: "flex w-4 shrink-0 items-center", children: _jsx("span", { className: cn("rounded-full", index === current
414
+ ? CURRENT_STROKE
415
+ : cn("bg-fg-3 h-0.5", strokeWidth(heading.depth))) }) }), _jsx("span", { className: cn("min-w-0 truncate", itemIndent(heading.depth)), title: heading.text, children: heading.text })] }) }, index))) }) }) })] }) }));
416
+ });
417
+ //# sourceMappingURL=RichTextToc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextToc.js","sourceRoot":"","sources":["../../../../src/editor/features/toc/RichTextToc.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Editor } from "@tiptap/core";
2
+ import type { TocLevel, TocToolOptions } from "../../core/toolOptions.js";
3
+ /** Заголовок Документа с позицией: по ней команда `jumpTo` находит DOM-узел. */
4
+ export interface TocDocumentHeading {
5
+ level: TocLevel;
6
+ text: string;
7
+ /** Позиция узла заголовка в Документе (для `editor.view.nodeDOM`). */
8
+ pos: number;
9
+ }
10
+ /**
11
+ * Заголовки Оглавления по Документу движка, а не по DOM: ядро Оглавления
12
+ * (`TocCore`) — ленивый чанк, и пока он не пришёл (или нарисован HTML-режим),
13
+ * узлов для обхода нет, а данные экран просит с первого кадра. Это единственный
14
+ * обход, по которому считаются индексы: и снимок Состояния `toc`, и команда
15
+ * `jumpTo` берут заголовок отсюда, поэтому индекс из снимка ведёт к тому же
16
+ * заголовку сразу после правки, не дожидаясь, пока ядро пересоберёт свой список
17
+ * из DOM (`REBUILD_DELAY`).
18
+ *
19
+ * ТЕ ЖЕ ПРАВИЛА, ЧТО У `collectHeadings` (`headings.ts`), иначе индексы разойдутся
20
+ * с пунктами списка: заголовок на верхнем уровне или внутри Обёрток (колонки
21
+ * Раскладки, свои Блоки, цитаты и списки — нет), уровень из `levels`, текст без
22
+ * крайних пробелов не пуст. Текст — тот же, что у `textContent` DOM: мягкий
23
+ * перенос в него не входит, а Текст атома — входит.
24
+ *
25
+ * Обход по верхнему уровню и Обёрткам, а не по всему Документу: стоимость — число
26
+ * Блоков верхнего уровня, она не растёт от вложенности и заметна не будет даже
27
+ * на каждой транзакции.
28
+ */
29
+ export declare function tocDocumentHeadings(editor: Editor, { levels }: Pick<TocToolOptions, "levels">): TocDocumentHeading[];
30
+ //# sourceMappingURL=documentHeadings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentHeadings.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/toc/documentHeadings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO1E,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GACzC,kBAAkB,EAAE,CAkBtB"}
@@ -0,0 +1,20 @@
1
+ import { WRAPPER_NODE } from "../../core/nodeNames.js";
2
+ export function tocDocumentHeadings(editor, { levels }) {
3
+ const headings = [];
4
+ const visit = (parent, start) => parent.forEach((node, offset) => {
5
+ const pos = start + offset;
6
+ if (node.type.name === WRAPPER_NODE)
7
+ return visit(node, pos + 1);
8
+ if (node.type.name !== "heading")
9
+ return;
10
+ const level = node.attrs.level;
11
+ const text = node
12
+ .textBetween(0, node.content.size, "", (leaf) => leaf.type.name === "hardBreak" ? "" : leaf.textContent)
13
+ .trim();
14
+ if (text && levels.includes(level))
15
+ headings.push({ level, text, pos });
16
+ });
17
+ visit(editor.state.doc, 0);
18
+ return headings;
19
+ }
20
+ //# sourceMappingURL=documentHeadings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentHeadings.js","sourceRoot":"","sources":["../../../../src/editor/features/toc/documentHeadings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAmCvD,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,EAAE,MAAM,EAAkC;IAE1C,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAE1C,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAiB,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI;aACd,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CACvD;aACA,IAAI,EAAE,CAAC;QACV,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACL,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Заголовки Документа для Оглавления (`RichTextToc`, ADR-0066).
3
+ *
4
+ * Читаются из DOM цели, а не из строки `html`: один путь для Просмотра,
5
+ * Редактора и JSON-конверта, и переходу всё равно нужен живой узел.
6
+ *
7
+ * Модуль без React и без движка: только обход DOM.
8
+ */
9
+ /** Заголовок в Оглавлении. */
10
+ export interface TocHeading {
11
+ /** Узел заголовка в Документе: к нему ведёт переход. */
12
+ element: HTMLElement;
13
+ /** Текст пункта — текст заголовка без разметки. */
14
+ text: string;
15
+ /** Уровень по тегу: 1 для `h1` … 4 для `h4`. */
16
+ level: number;
17
+ /**
18
+ * Глубина относительно самого крупного заголовка Документа: у него 0. Отступ
19
+ * пункта и длина штриха считаются от неё, а не от уровня, — иначе Документ,
20
+ * где старший заголовок H2, начинался бы с пустой ступени.
21
+ */
22
+ depth: number;
23
+ }
24
+ /**
25
+ * Корень Документа внутри цели. У Просмотра это сам контейнер; у Редактора
26
+ * Документ лежит глубже, в узле движка — Панель и строка статуса снаружи него.
27
+ */
28
+ export declare function documentRoot(target: HTMLElement): HTMLElement;
29
+ /**
30
+ * Заголовки Документа в порядке чтения. `only` — какие уровни (1–4) берутся:
31
+ * остальные не попадают в список, и глубина (`depth`) считается от самого
32
+ * крупного из оставшихся. Нет — все.
33
+ */
34
+ export declare function collectHeadings(target: HTMLElement, only?: readonly number[]): TocHeading[];
35
+ //# sourceMappingURL=headings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/toc/headings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,OAAO,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAcD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D;AAUD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,EAAE,CAkB3F"}
@@ -0,0 +1,27 @@
1
+ const HEADING = "h1, h2, h3, h4";
2
+ const WRAPPER = 'div[data-block="wrapper"]';
3
+ export function documentRoot(target) {
4
+ return target.querySelector(".ProseMirror") ?? target;
5
+ }
6
+ function isStructural(heading, root) {
7
+ for (let node = heading.parentElement; node && node !== root; node = node.parentElement) {
8
+ if (!node.matches(WRAPPER))
9
+ return false;
10
+ }
11
+ return true;
12
+ }
13
+ export function collectHeadings(target, only) {
14
+ const root = documentRoot(target);
15
+ const found = [...root.querySelectorAll(HEADING)].filter((heading) => isStructural(heading, root) &&
16
+ heading.textContent?.trim() &&
17
+ (!only || only.includes(Number(heading.tagName[1]))));
18
+ const levels = found.map((heading) => Number(heading.tagName[1]));
19
+ const top = Math.min(...levels);
20
+ return found.map((element, index) => ({
21
+ element,
22
+ text: element.textContent?.trim() ?? "",
23
+ level: levels[index],
24
+ depth: levels[index] - top,
25
+ }));
26
+ }
27
+ //# sourceMappingURL=headings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings.js","sourceRoot":"","sources":["../../../../src/editor/features/toc/headings.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAO,GAAG,gBAAgB,CAAC;AAUjC,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAM5C,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,OAAO,MAAM,CAAC,aAAa,CAAc,cAAc,CAAC,IAAI,MAAM,CAAC;AACrE,CAAC;AAGD,SAAS,YAAY,CAAC,OAAgB,EAAE,IAAiB;IACvD,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,IAAwB;IAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAGlC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAc,OAAO,CAAC,CAAC,CAAC,MAAM,CACnE,CAAC,OAAO,EAAE,EAAE,CACV,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;QAC3B,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE;QAC3B,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvD,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;QACP,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAE;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAE,GAAG,GAAG;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Высота липкой шапки в пикселях; переменной нет — `null`. */
2
+ export declare function stickyOffset(offsetVar: string): number | null;
3
+ //# sourceMappingURL=stickyOffset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickyOffset.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/toc/stickyOffset.ts"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7D"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { toPixels } from "../../../hooks/useStickyOffset.js";
3
+ let measured = { raw: "", px: null };
4
+ export function stickyOffset(offsetVar) {
5
+ const raw = getComputedStyle(document.documentElement).getPropertyValue(offsetVar).trim();
6
+ if (!raw)
7
+ return null;
8
+ if (raw !== measured.raw) {
9
+ const px = parseFloat(toPixels(raw, "0px"));
10
+ measured = { raw, px: Number.isFinite(px) && px > 0 ? px : null };
11
+ }
12
+ return measured.px;
13
+ }
14
+ //# sourceMappingURL=stickyOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickyOffset.js","sourceRoot":"","sources":["../../../../src/editor/features/toc/stickyOffset.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAO7D,IAAI,QAAQ,GAAuC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAGzE,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1F,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5C,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Editor } from "@tiptap/core";
2
+ import type { TocToolOptions } from "../../core/toolOptions.js";
3
+ import type { TocToolState } from "../../core/toolState.js";
4
+ /**
5
+ * Снимок Состояния `toc` для `useRichTextToolState`: заголовки из
6
+ * `tocDocumentHeadings` без позиций (они в контракт не входят) и текущий раздел.
7
+ * `at` — индекс текущего раздела, который сообщило ядро Оглавления.
8
+ */
9
+ export declare function tocSnapshot(editor: Editor, options: Pick<TocToolOptions, "levels">, at: number | undefined): TocToolState;
10
+ //# sourceMappingURL=tocSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tocSnapshot.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/toc/tocSnapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5E;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,EACvC,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,YAAY,CAOd"}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import { tocDocumentHeadings } from "./documentHeadings.js";
3
+ export function tocSnapshot(editor, options, at) {
4
+ const headings = tocDocumentHeadings(editor, options).map(({ level, text }, index) => ({ level, text, index }));
5
+ const current = headings.length ? Math.min(Math.max(at ?? 0, 0), headings.length - 1) : -1;
6
+ return { headings, current };
7
+ }
8
+ //# sourceMappingURL=tocSnapshot.js.map