@olddevs/ui 4.2.2 → 4.4.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 (84) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/components/navigation/MegaMenu.d.ts +43 -23
  3. package/dist/components/navigation/MegaMenu.d.ts.map +1 -1
  4. package/dist/components/navigation/MegaMenu.js +110 -47
  5. package/dist/components/navigation/MegaMenu.js.map +1 -1
  6. package/dist/components/navigation/useMenuAim.d.ts +8 -8
  7. package/dist/components/navigation/useMenuAim.d.ts.map +1 -1
  8. package/dist/components/overlays/Menu.d.ts +4 -2
  9. package/dist/components/overlays/Menu.d.ts.map +1 -1
  10. package/dist/components/overlays/Menu.js.map +1 -1
  11. package/dist/editor/RichTextEditor.d.ts.map +1 -1
  12. package/dist/editor/RichTextEditor.js +38 -4
  13. package/dist/editor/RichTextEditor.js.map +1 -1
  14. package/dist/editor/core/handle.d.ts +1 -5
  15. package/dist/editor/core/handle.d.ts.map +1 -1
  16. package/dist/editor/core/handle.js +1 -13
  17. package/dist/editor/core/handle.js.map +1 -1
  18. package/dist/editor/core/handleWatchers.d.ts +6 -0
  19. package/dist/editor/core/handleWatchers.d.ts.map +1 -0
  20. package/dist/editor/core/handleWatchers.js +14 -0
  21. package/dist/editor/core/handleWatchers.js.map +1 -0
  22. package/dist/editor/core/tools.d.ts +7 -2
  23. package/dist/editor/core/tools.d.ts.map +1 -1
  24. package/dist/editor/core/tools.js +2 -1
  25. package/dist/editor/core/tools.js.map +1 -1
  26. package/dist/editor/features/toc/RichTextToc.d.ts +63 -0
  27. package/dist/editor/features/toc/RichTextToc.d.ts.map +1 -0
  28. package/dist/editor/features/toc/RichTextToc.js +372 -0
  29. package/dist/editor/features/toc/RichTextToc.js.map +1 -0
  30. package/dist/editor/features/toc/headings.d.ts +31 -0
  31. package/dist/editor/features/toc/headings.d.ts.map +1 -0
  32. package/dist/editor/features/toc/headings.js +25 -0
  33. package/dist/editor/features/toc/headings.js.map +1 -0
  34. package/dist/editor/features/toc/stickyOffset.d.ts +3 -0
  35. package/dist/editor/features/toc/stickyOffset.d.ts.map +1 -0
  36. package/dist/editor/features/toc/stickyOffset.js +14 -0
  37. package/dist/editor/features/toc/stickyOffset.js.map +1 -0
  38. package/dist/editor/index.d.ts +2 -0
  39. package/dist/editor/index.d.ts.map +1 -1
  40. package/dist/editor/index.js +1 -0
  41. package/dist/editor/index.js.map +1 -1
  42. package/dist/i18n/defaults.d.ts.map +1 -1
  43. package/dist/i18n/defaults.js +1 -0
  44. package/dist/i18n/defaults.js.map +1 -1
  45. package/dist/i18n/messages.d.ts +5 -0
  46. package/dist/i18n/messages.d.ts.map +1 -1
  47. package/dist/locales/ru.d.ts.map +1 -1
  48. package/dist/locales/ru.js +1 -0
  49. package/dist/locales/ru.js.map +1 -1
  50. package/docs/api/messages.en.md +743 -0
  51. package/docs/api/messages.md +1 -0
  52. package/docs/api/utilities.en.md +233 -0
  53. package/docs/components/content/rich-text-toc.en.md +130 -0
  54. package/docs/components/content/rich-text-toc.md +129 -0
  55. package/docs/components/index.en.md +3 -2
  56. package/docs/components/index.md +2 -1
  57. package/docs/components/inputs/rich-text-editor.en.md +52 -34
  58. package/docs/components/inputs/rich-text-editor.md +20 -2
  59. package/docs/components/navigation/mega-menu.en.md +86 -61
  60. package/docs/components/navigation/mega-menu.md +81 -56
  61. package/docs/components/overlays/menu.en.md +8 -4
  62. package/docs/components/overlays/menu.md +6 -3
  63. package/docs/conventions.en.md +318 -0
  64. package/docs/getting-started.en.md +5 -5
  65. package/docs/getting-started.md +4 -4
  66. package/docs/glossary.en.md +24 -23
  67. package/docs/glossary.md +23 -22
  68. package/docs/index.en.md +53 -0
  69. package/llms.txt +2 -1
  70. package/package.json +1 -1
  71. package/src/components/navigation/MegaMenu.tsx +300 -140
  72. package/src/components/navigation/useMenuAim.ts +19 -19
  73. package/src/components/overlays/Menu.tsx +12 -2
  74. package/src/editor/RichTextEditor.tsx +107 -3
  75. package/src/editor/core/handle.ts +2 -23
  76. package/src/editor/core/handleWatchers.ts +27 -0
  77. package/src/editor/core/tools.ts +9 -2
  78. package/src/editor/features/toc/RichTextToc.tsx +712 -0
  79. package/src/editor/features/toc/headings.ts +70 -0
  80. package/src/editor/features/toc/stickyOffset.ts +21 -0
  81. package/src/editor/index.ts +2 -0
  82. package/src/i18n/defaults.ts +1 -0
  83. package/src/i18n/messages.ts +5 -0
  84. package/src/locales/ru.ts +1 -0
@@ -0,0 +1,63 @@
1
+ import { type HTMLAttributes, type RefObject } from "react";
2
+ import type { RichTextEditorHandle } from "../../RichTextEditor.js";
3
+ export interface RichTextTocProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
4
+ /**
5
+ * Ref на Просмотр (`RichTextView`) или на Хэндл Редактора (`RichTextEditor`),
6
+ * чьи заголовки показывает Оглавление. Заголовки читаются из DOM цели после
7
+ * монтирования: до гидратации полосы нет.
8
+ *
9
+ * Список следит за Документом: новый `html` Просмотра, новое значение
10
+ * Редактора и правка в нём пересобирают его с короткой задержкой. Редактор
11
+ * в `readOnly` работает так же, как Просмотр. Редактор в правке тоже
12
+ * поддержан — список пересобирается, а переход не двигает каретку, — но
13
+ * контрактом этот режим не обещан. Движок Редактора появляется после
14
+ * монтирования, и Оглавление ждёт его само.
15
+ */
16
+ target: RefObject<HTMLElement | RichTextEditorHandle | null>;
17
+ /**
18
+ * Имя CSS-переменной с высотой липкой шапки экрана ([ADR-0016]). Переход
19
+ * ставит заголовок под шапку, а не за неё, и подсветка считает раздел
20
+ * текущим от нижнего края шапки. Переменной нет — отступом служит
21
+ * `scroll-margin-top` заголовка. По умолчанию `--topbar-h`: её публикует `TopBar`.
22
+ */
23
+ offsetVar?: string;
24
+ /**
25
+ * Ширина списка — длина CSS или пиксели. Постоянная, а не по самому длинному
26
+ * заголовку: список не меняет размер от Документа к Документу. Заголовок, что
27
+ * не помещается, обрезается многоточием, полный текст — в подсказке пункта.
28
+ * По умолчанию 240px.
29
+ */
30
+ listWidth?: number | string;
31
+ }
32
+ /**
33
+ * Оглавление Документа: полоса штрихов, по одному на заголовок, штрих текущего
34
+ * раздела подсвечен. Наведение раскрывает список заголовков, пункт ведёт к
35
+ * заголовку.
36
+ *
37
+ * Отдельный компонент, а не проп Просмотра (ADR-0066): `RichTextView` остаётся
38
+ * серверным, а место Оглавления — колонку, липкость, скрытие на узком экране —
39
+ * решает вёрстка экрана. Меньше двух заголовков — компонент ничего не рисует.
40
+ */
41
+ export declare const RichTextToc: import("react").ForwardRefExoticComponent<RichTextTocProps & import("react").RefAttributes<HTMLDivElement>>;
42
+ /**
43
+ * Ядро Оглавления: общее у `RichTextToc` и Инструмента `toc` Редактора
44
+ * (ADR-0068). Две настройки — только для кита, наружу не выходят: Редактор
45
+ * сам знает, где край его липкой Панели, и сам ставит каретку при переходе.
46
+ */
47
+ export interface TocCoreProps extends RichTextTocProps {
48
+ /**
49
+ * Нижний край липкого верха в пикселях: от него считают подсветка, переход и
50
+ * шаг полосы. Нет — высота из `offsetVar`.
51
+ */
52
+ stickyTop?: () => number | null;
53
+ /** Поставить фокус при переходе самому; `true` — поставлен. */
54
+ focusHeading?: (heading: HTMLElement) => boolean;
55
+ /**
56
+ * Опустить полосу так, чтобы первый штрих стоял на середине первой строки
57
+ * первого заголовка: в поле Редактора полоса и заголовок начинаются с одного
58
+ * уровня, а не полоса выше текста.
59
+ */
60
+ alignToFirstHeading?: boolean;
61
+ }
62
+ export declare const TocCore: import("react").ForwardRefExoticComponent<TocCoreProps & import("react").RefAttributes<HTMLDivElement>>;
63
+ //# sourceMappingURL=RichTextToc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextToc.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/toc/RichTextToc.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAIpE,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACxF;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AA4OD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,6GAIvB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IACjD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,OAAO,yGAmYlB,CAAC"}
@@ -0,0 +1,372 @@
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 { collectHeadings, documentRoot } from "./headings.js";
9
+ import { stickyOffset } from "./stickyOffset.js";
10
+ const STROKE_WIDTH = ["w-3.5", "w-3", "w-2.5", "w-2"];
11
+ const CURRENT_STROKE = "bg-accent-strong h-[3px] w-4";
12
+ const ITEM_INDENT = ["pl-0", "pl-2.5", "pl-5", "pl-7.5"];
13
+ const strokeWidth = (depth) => STROKE_WIDTH[Math.min(depth, STROKE_WIDTH.length - 1)];
14
+ const itemIndent = (depth) => ITEM_INDENT[Math.min(depth, ITEM_INDENT.length - 1)];
15
+ const OPEN_DELAY = 200;
16
+ const CLOSE_DELAY = 300;
17
+ const REBUILD_DELAY = 150;
18
+ const STRIP_GAP = 6;
19
+ const STRIP_CELL = 3;
20
+ const STRIP_PADDING = 8;
21
+ const STRIP_MARGIN = 16;
22
+ const PIN_SETTLE = 150;
23
+ const SPY_SLACK = 8;
24
+ function prefersReducedMotion() {
25
+ return (typeof window.matchMedia === "function" &&
26
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches);
27
+ }
28
+ function scrollParent(node) {
29
+ for (let parent = node.parentElement; parent; parent = parent.parentElement) {
30
+ if (parent === document.body || parent === document.documentElement)
31
+ return null;
32
+ const { overflowY } = getComputedStyle(parent);
33
+ if (/(auto|scroll|overlay)/.test(overflowY) && parent.scrollHeight > parent.clientHeight) {
34
+ return parent;
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ const FLASH_DURATION = 1600;
40
+ function scaleCurve(node, token) {
41
+ return getComputedStyle(node).getPropertyValue(token).trim() || "ease";
42
+ }
43
+ function flash(heading) {
44
+ if (typeof heading.animate !== "function")
45
+ return;
46
+ const accent = getComputedStyle(heading).getPropertyValue("--accent-strong").trim();
47
+ const color = accent ? `color-mix(in srgb, ${accent} 24%, transparent)` : "transparent";
48
+ heading.animate([
49
+ { backgroundColor: color, boxShadow: `0 0 0 6px ${color}`, borderRadius: "4px" },
50
+ { backgroundColor: "transparent", boxShadow: "0 0 0 6px transparent", borderRadius: "4px" },
51
+ ], { duration: FLASH_DURATION, easing: scaleCurve(heading, "--ease-enter") });
52
+ }
53
+ function jumpTo(heading, offset, focusHeading) {
54
+ if (focusHeading?.(heading)) {
55
+ }
56
+ else if (!heading.parentElement?.closest('[contenteditable="true"]')) {
57
+ if (!heading.hasAttribute("tabindex")) {
58
+ heading.setAttribute("tabindex", "-1");
59
+ heading.addEventListener("blur", () => heading.removeAttribute("tabindex"), { once: true });
60
+ }
61
+ heading.focus({ preventScroll: true });
62
+ }
63
+ flash(heading);
64
+ const behavior = prefersReducedMotion() ? "auto" : "smooth";
65
+ if (offset === null) {
66
+ heading.scrollIntoView({ behavior, block: "start" });
67
+ return;
68
+ }
69
+ const scroller = scrollParent(heading);
70
+ const top = heading.getBoundingClientRect().top;
71
+ if (scroller) {
72
+ const edge = scroller.getBoundingClientRect().top;
73
+ scroller.scrollTo({ top: scroller.scrollTop + top - edge, behavior });
74
+ }
75
+ else {
76
+ window.scrollTo({ top: window.scrollY + top - offset, behavior });
77
+ }
78
+ }
79
+ function currentIndex(headings, offset) {
80
+ const first = headings[0];
81
+ if (!first)
82
+ return -1;
83
+ const scroller = scrollParent(first.element);
84
+ const edge = scroller ? scroller.getBoundingClientRect().top : (offset ?? 0);
85
+ const line = edge + SPY_SLACK;
86
+ const atEnd = scroller
87
+ ? scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 2
88
+ : window.scrollY + window.innerHeight >= document.documentElement.scrollHeight - 2;
89
+ const bottom = scroller ? scroller.getBoundingClientRect().bottom : window.innerHeight;
90
+ let current = 0;
91
+ headings.forEach((heading, index) => {
92
+ const top = heading.element.getBoundingClientRect().top;
93
+ if (top <= line || (atEnd && top < bottom))
94
+ current = index;
95
+ });
96
+ return current;
97
+ }
98
+ function keepVisible(item, box) {
99
+ if (!item || !box)
100
+ return;
101
+ const itemRect = item.getBoundingClientRect();
102
+ const boxRect = box.getBoundingClientRect();
103
+ if (itemRect.top < boxRect.top)
104
+ box.scrollTop -= boxRect.top - itemRect.top;
105
+ else if (itemRect.bottom > boxRect.bottom)
106
+ box.scrollTop += itemRect.bottom - boxRect.bottom;
107
+ }
108
+ function resolveTarget(target) {
109
+ const value = target.current;
110
+ if (!value)
111
+ return null;
112
+ if (!("editor" in value))
113
+ return value;
114
+ const { editor } = value;
115
+ return editor && !editor.isDestroyed ? editor.view.dom : null;
116
+ }
117
+ function sameHeadings(a, b) {
118
+ return (a.length === b.length &&
119
+ a.every((heading, index) => heading.element === b[index].element &&
120
+ heading.text === b[index].text &&
121
+ heading.depth === b[index].depth));
122
+ }
123
+ function stripGap(count, offset) {
124
+ if (count < 2)
125
+ return STRIP_GAP;
126
+ const room = window.innerHeight - (offset ?? 0) - STRIP_MARGIN * 2 - STRIP_PADDING - count * STRIP_CELL;
127
+ return Math.max(0, Math.min(STRIP_GAP, room / (count - 1)));
128
+ }
129
+ function fitsBeside(strip, target) {
130
+ const own = strip.getBoundingClientRect();
131
+ const text = documentRoot(target).getBoundingClientRect();
132
+ return own.left >= 0 && own.right <= text.left;
133
+ }
134
+ export const RichTextToc = forwardRef(function RichTextToc(props, ref) {
135
+ return _jsx(TocCore, { ref: ref, ...props });
136
+ });
137
+ export const TocCore = forwardRef(function TocCore({ target, offsetVar = "--topbar-h", listWidth = 240, stickyTop, focusHeading, alignToFirstHeading = false, className, style, ...rest }, ref) {
138
+ const latest = useRef({ stickyTop, focusHeading, offsetVar });
139
+ useEffect(() => {
140
+ latest.current = { stickyTop, focusHeading, offsetVar };
141
+ });
142
+ const offsetNow = useCallback(() => {
143
+ const own = latest.current;
144
+ return own.stickyTop ? own.stickyTop() : stickyOffset(own.offsetVar);
145
+ }, []);
146
+ const messages = useMessages();
147
+ const [element, setElement] = useState(null);
148
+ const [headings, setHeadings] = useState([]);
149
+ const [gap, setGap] = useState(STRIP_GAP);
150
+ const [current, setCurrent] = useState(0);
151
+ const [open, setOpen] = useState(false);
152
+ const [fits, setFits] = useState(true);
153
+ const stripRef = useRef(null);
154
+ const focusOnOpen = useRef(false);
155
+ const navRef = useRef(null);
156
+ const keyHandled = useRef(false);
157
+ useEffect(() => {
158
+ const resolve = () => setElement(resolveTarget(target));
159
+ resolve();
160
+ return watchHandleEditor(target, resolve);
161
+ }, [target]);
162
+ useEffect(() => {
163
+ if (!element) {
164
+ setHeadings((prev) => (prev.length ? [] : prev));
165
+ return;
166
+ }
167
+ const read = () => {
168
+ const next = collectHeadings(element);
169
+ setHeadings((prev) => (sameHeadings(prev, next) ? prev : next));
170
+ };
171
+ read();
172
+ let timer;
173
+ const observer = new MutationObserver(() => {
174
+ clearTimeout(timer);
175
+ timer = setTimeout(read, REBUILD_DELAY);
176
+ });
177
+ observer.observe(documentRoot(element), {
178
+ childList: true,
179
+ subtree: true,
180
+ characterData: true,
181
+ });
182
+ return () => {
183
+ clearTimeout(timer);
184
+ observer.disconnect();
185
+ };
186
+ }, [element]);
187
+ useEffect(() => {
188
+ if (headings.length < 2)
189
+ return;
190
+ let frame = 0;
191
+ const update = () => {
192
+ frame = 0;
193
+ setGap(stripGap(headings.length, offsetNow()));
194
+ };
195
+ const schedule = () => {
196
+ if (!frame)
197
+ frame = requestAnimationFrame(update);
198
+ };
199
+ update();
200
+ window.addEventListener("resize", schedule);
201
+ return () => {
202
+ if (frame)
203
+ cancelAnimationFrame(frame);
204
+ window.removeEventListener("resize", schedule);
205
+ };
206
+ }, [headings.length, offsetVar, offsetNow]);
207
+ const pinned = useRef(null);
208
+ const settle = (lock) => {
209
+ window.clearTimeout(lock.timer);
210
+ lock.timer = window.setTimeout(() => {
211
+ lock.settled = true;
212
+ }, PIN_SETTLE);
213
+ };
214
+ const pin = (index) => {
215
+ if (pinned.current)
216
+ window.clearTimeout(pinned.current.timer);
217
+ pinned.current = { index, settled: false, timer: 0 };
218
+ settle(pinned.current);
219
+ setCurrent(index);
220
+ };
221
+ useEffect(() => {
222
+ if (headings.length < 2)
223
+ return;
224
+ let frame = 0;
225
+ const update = () => {
226
+ frame = 0;
227
+ setCurrent(currentIndex(headings, offsetNow()));
228
+ };
229
+ const schedule = (event) => {
230
+ const scrolled = event?.target;
231
+ if (scrolled instanceof Element && !scrolled.contains(headings[0].element)) {
232
+ return;
233
+ }
234
+ const lock = pinned.current;
235
+ if (lock && !lock.settled) {
236
+ settle(lock);
237
+ return;
238
+ }
239
+ pinned.current = null;
240
+ if (!frame)
241
+ frame = requestAnimationFrame(update);
242
+ };
243
+ update();
244
+ document.addEventListener("scroll", schedule, { capture: true, passive: true });
245
+ window.addEventListener("resize", schedule);
246
+ return () => {
247
+ if (frame)
248
+ cancelAnimationFrame(frame);
249
+ document.removeEventListener("scroll", schedule, { capture: true });
250
+ window.removeEventListener("resize", schedule);
251
+ };
252
+ }, [headings, offsetVar, offsetNow]);
253
+ useEffect(() => () => window.clearTimeout(pinned.current?.timer), []);
254
+ useEffect(() => {
255
+ const strip = stripRef.current;
256
+ const node = element;
257
+ if (!strip || !node)
258
+ return;
259
+ let frame = 0;
260
+ const measure = () => {
261
+ frame = 0;
262
+ const next = fitsBeside(strip, node);
263
+ setFits(next);
264
+ if (!next)
265
+ setOpen(false);
266
+ };
267
+ const schedule = () => {
268
+ if (!frame)
269
+ frame = requestAnimationFrame(measure);
270
+ };
271
+ measure();
272
+ window.addEventListener("resize", schedule);
273
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
274
+ observer?.observe(node);
275
+ observer?.observe(document.documentElement);
276
+ return () => {
277
+ if (frame)
278
+ cancelAnimationFrame(frame);
279
+ window.removeEventListener("resize", schedule);
280
+ observer?.disconnect();
281
+ };
282
+ }, [element, headings.length]);
283
+ const [lead, setLead] = useState(0);
284
+ useEffect(() => {
285
+ const first = headings[0]?.element;
286
+ const root = stripRef.current?.parentElement;
287
+ const column = root?.parentElement;
288
+ if (!alignToFirstHeading || !first || !column || !element)
289
+ return;
290
+ const measure = () => {
291
+ const box = first.getBoundingClientRect();
292
+ const line = parseFloat(getComputedStyle(first).lineHeight) || box.height;
293
+ const center = box.top + Math.min(line, box.height) / 2;
294
+ const next = center - column.getBoundingClientRect().top - STRIP_PADDING / 2 - STRIP_CELL / 2;
295
+ setLead(Math.max(0, Math.round(next)));
296
+ };
297
+ measure();
298
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
299
+ observer?.observe(element);
300
+ return () => observer?.disconnect();
301
+ }, [alignToFirstHeading, headings, element]);
302
+ const listRef = useCallback((node) => {
303
+ navRef.current = node;
304
+ if (!node)
305
+ return;
306
+ const items = node.querySelectorAll("button");
307
+ keepVisible(items[current], node.parentElement);
308
+ if (!focusOnOpen.current)
309
+ return;
310
+ focusOnOpen.current = false;
311
+ (items[current] ?? items[0])?.focus();
312
+ }, [current]);
313
+ if (headings.length < 2)
314
+ return null;
315
+ const label = messages.editor.toc;
316
+ const onStripKeyDown = (event) => {
317
+ if (event.key !== "Enter" && event.key !== " ")
318
+ return;
319
+ event.preventDefault();
320
+ keyHandled.current = true;
321
+ if (open && navRef.current) {
322
+ const items = navRef.current.querySelectorAll("button");
323
+ (items[current] ?? items[0])?.focus();
324
+ return;
325
+ }
326
+ focusOnOpen.current = true;
327
+ setOpen(true);
328
+ };
329
+ const onListKeyDown = (event) => {
330
+ const items = [...event.currentTarget.querySelectorAll("button")];
331
+ const index = items.indexOf(document.activeElement);
332
+ const next = event.key === "ArrowDown"
333
+ ? Math.min(index + 1, items.length - 1)
334
+ : event.key === "ArrowUp"
335
+ ? Math.max(index - 1, 0)
336
+ : event.key === "Home"
337
+ ? 0
338
+ : event.key === "End"
339
+ ? items.length - 1
340
+ : null;
341
+ if (next === null)
342
+ return;
343
+ event.preventDefault();
344
+ items[next]?.focus();
345
+ };
346
+ 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: () => {
347
+ if (keyHandled.current) {
348
+ keyHandled.current = false;
349
+ return;
350
+ }
351
+ if (!open)
352
+ focusOnOpen.current = true;
353
+ setOpen(true);
354
+ }, 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
355
+ ? CURRENT_STROKE
356
+ : 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) => {
357
+ if (element?.contains(event.target))
358
+ event.preventDefault();
359
+ }, onPointerDownOutside: (event) => {
360
+ if (stripRef.current?.contains(event.target))
361
+ event.preventDefault();
362
+ }, 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) => {
363
+ pin(index);
364
+ jumpTo(heading.element, offsetNow(), latest.current.focusHeading);
365
+ const item = event.currentTarget;
366
+ if (event.detail > 0 && document.activeElement === item)
367
+ item.blur();
368
+ }, children: [_jsx("span", { "aria-hidden": true, className: "flex w-4 shrink-0 items-center", children: _jsx("span", { className: cn("rounded-full", index === current
369
+ ? CURRENT_STROKE
370
+ : 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))) }) }) })] }) }));
371
+ });
372
+ //# 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,31 @@
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
+ export declare function collectHeadings(target: HTMLElement): TocHeading[];
31
+ //# 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,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,EAAE,CAejE"}
@@ -0,0 +1,25 @@
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) {
14
+ const root = documentRoot(target);
15
+ const found = [...root.querySelectorAll(HEADING)].filter((heading) => isStructural(heading, root) && heading.textContent?.trim());
16
+ const levels = found.map((heading) => Number(heading.tagName[1]));
17
+ const top = Math.min(...levels);
18
+ return found.map((element, index) => ({
19
+ element,
20
+ text: element.textContent?.trim() ?? "",
21
+ level: levels[index],
22
+ depth: levels[index] - top,
23
+ }));
24
+ }
25
+ //# 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;AAGD,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,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,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CACxE,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"}
@@ -21,6 +21,8 @@ export type { RichTextDocument } from "./core/jsonDocument.js";
21
21
  export { useRichTextEditorState } from "./hooks/useRichTextEditorState.js";
22
22
  export { RichTextView } from "./RichTextView.js";
23
23
  export type { RichTextViewProps } from "./RichTextView.js";
24
+ export { RichTextToc } from "./features/toc/RichTextToc.js";
25
+ export type { RichTextTocProps } from "./features/toc/RichTextToc.js";
24
26
  export type { FieldNotice, FieldNoticeTone } from "./core/fieldNotice.js";
25
27
  export type { RichTextSurface } from "./styles/surface.js";
26
28
  export { richTextSanitizeConfig, richTextSchema, sanitizeRichText } from "./core/schema.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,IAAI,IAAI,EACjB,QAAQ,GACT,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,IAAI,IAAI,EACjB,QAAQ,GACT,MAAM,sBAAsB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export { RichTextEditor } from "./RichTextEditor.js";
2
2
  export { useRichTextEditorState } from "./hooks/useRichTextEditorState.js";
3
3
  export { RichTextView } from "./RichTextView.js";
4
+ export { RichTextToc } from "./features/toc/RichTextToc.js";
4
5
  export { richTextSanitizeConfig, richTextSchema, sanitizeRichText } from "./core/schema.js";
5
6
  export { RICH_TEXT_PRESETS } from "./core/tools.js";
6
7
  export { markRange } from "./core/customTool.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAS5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAI5D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAS5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/i18n/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAioB9B,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/i18n/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAkoB9B,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,UAAU,CAAC"}
@@ -571,6 +571,7 @@ export const DEFAULT_MESSAGES = {
571
571
  blockMoveDown: "Move down",
572
572
  blockDuplicate: "Duplicate",
573
573
  blockDelete: "Delete",
574
+ toc: "Table of contents",
574
575
  },
575
576
  };
576
577
  export const DEFAULT_LOCALE = "en-US";