@olddevs/ui 4.5.1 → 4.6.1
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.
- package/CHANGELOG.md +26 -0
- package/dist/editor/RichTextEditor.d.ts +2 -2
- package/dist/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/editor/RichTextEditor.js +3 -0
- package/dist/editor/RichTextEditor.js.map +1 -1
- package/dist/editor/core/blockTypes.d.ts +2 -8
- package/dist/editor/core/blockTypes.d.ts.map +1 -1
- package/dist/editor/core/blockTypes.js +11 -54
- package/dist/editor/core/blockTypes.js.map +1 -1
- package/dist/editor/core/containers.d.ts.map +1 -1
- package/dist/editor/core/containers.js +1 -0
- package/dist/editor/core/containers.js.map +1 -1
- package/dist/editor/core/customMarkdown.js +1 -1
- package/dist/editor/core/customMarkdown.js.map +1 -1
- package/dist/editor/core/customTool.d.ts +6 -6
- package/dist/editor/core/customTool.d.ts.map +1 -1
- package/dist/editor/core/customToolEngine.d.ts +2 -2
- package/dist/editor/core/extensions.d.ts +7 -2
- package/dist/editor/core/extensions.d.ts.map +1 -1
- package/dist/editor/core/extensions.js +96 -64
- package/dist/editor/core/extensions.js.map +1 -1
- package/dist/editor/core/fieldNotice.d.ts +1 -1
- package/dist/editor/core/insertItems.d.ts +5 -28
- package/dist/editor/core/insertItems.d.ts.map +1 -1
- package/dist/editor/core/insertItems.js +3 -94
- package/dist/editor/core/insertItems.js.map +1 -1
- package/dist/editor/core/insertMenuTool.d.ts +13 -0
- package/dist/editor/core/insertMenuTool.d.ts.map +1 -0
- package/dist/editor/core/insertMenuTool.js +20 -0
- package/dist/editor/core/insertMenuTool.js.map +1 -0
- package/dist/editor/core/schema.d.ts +20 -5
- package/dist/editor/core/schema.d.ts.map +1 -1
- package/dist/editor/core/schema.js +18 -3
- package/dist/editor/core/schema.js.map +1 -1
- package/dist/editor/core/shortcuts.d.ts +56 -5
- package/dist/editor/core/shortcuts.d.ts.map +1 -1
- package/dist/editor/core/shortcuts.js +91 -156
- package/dist/editor/core/shortcuts.js.map +1 -1
- package/dist/editor/core/skeleton.d.ts +1 -1
- package/dist/editor/core/skeleton.d.ts.map +1 -1
- package/dist/editor/core/skeleton.js +1 -0
- package/dist/editor/core/skeleton.js.map +1 -1
- package/dist/editor/core/toolButtons.d.ts +3 -3
- package/dist/editor/core/toolDefinition.d.ts +3 -3
- package/dist/editor/core/toolDescriptor.d.ts +49 -30
- package/dist/editor/core/toolDescriptor.d.ts.map +1 -1
- package/dist/editor/core/toolDescriptor.js +2 -5
- package/dist/editor/core/toolDescriptor.js.map +1 -1
- package/dist/editor/core/toolLoader.d.ts +1 -1
- package/dist/editor/core/toolLoader.d.ts.map +1 -1
- package/dist/editor/core/toolOptions.d.ts +19 -2
- package/dist/editor/core/toolOptions.d.ts.map +1 -1
- package/dist/editor/core/toolOptions.js.map +1 -1
- package/dist/editor/core/tools.d.ts +10 -2
- package/dist/editor/core/tools.d.ts.map +1 -1
- package/dist/editor/core/tools.js +1 -0
- package/dist/editor/core/tools.js.map +1 -1
- package/dist/editor/features/builtins.d.ts +6 -8
- package/dist/editor/features/builtins.d.ts.map +1 -1
- package/dist/editor/features/builtins.js +48 -21
- package/dist/editor/features/builtins.js.map +1 -1
- package/dist/editor/features/code/codeBlockTool.d.ts +5 -6
- package/dist/editor/features/code/codeBlockTool.d.ts.map +1 -1
- package/dist/editor/features/code/codeBlockTool.js +10 -1
- package/dist/editor/features/code/codeBlockTool.js.map +1 -1
- package/dist/editor/features/color/colorTools.d.ts +14 -0
- package/dist/editor/features/color/colorTools.d.ts.map +1 -0
- package/dist/editor/features/color/colorTools.js +39 -0
- package/dist/editor/features/color/colorTools.js.map +1 -0
- package/dist/editor/features/details/details.d.ts +68 -0
- package/dist/editor/features/details/details.d.ts.map +1 -0
- package/dist/editor/features/details/details.js +237 -0
- package/dist/editor/features/details/details.js.map +1 -0
- package/dist/editor/features/details/detailsMarkdown.d.ts +17 -0
- package/dist/editor/features/details/detailsMarkdown.d.ts.map +1 -0
- package/dist/editor/features/details/detailsMarkdown.js +84 -0
- package/dist/editor/features/details/detailsMarkdown.js.map +1 -0
- package/dist/editor/features/details/detailsTool.d.ts +16 -0
- package/dist/editor/features/details/detailsTool.d.ts.map +1 -0
- package/dist/editor/features/details/detailsTool.js +39 -0
- package/dist/editor/features/details/detailsTool.js.map +1 -0
- package/dist/editor/features/emoji/emojiTool.d.ts +1 -1
- package/dist/editor/features/heading/headingTool.d.ts +18 -0
- package/dist/editor/features/heading/headingTool.d.ts.map +1 -0
- package/dist/editor/features/heading/headingTool.js +59 -0
- package/dist/editor/features/heading/headingTool.js.map +1 -0
- package/dist/editor/features/history/historyTool.d.ts +15 -0
- package/dist/editor/features/history/historyTool.d.ts.map +1 -0
- package/dist/editor/features/history/historyTool.js +28 -0
- package/dist/editor/features/history/historyTool.js.map +1 -0
- package/dist/editor/features/image/imageTool.d.ts +19 -0
- package/dist/editor/features/image/imageTool.d.ts.map +1 -0
- package/dist/editor/features/image/imageTool.js +28 -0
- package/dist/editor/features/image/imageTool.js.map +1 -0
- package/dist/editor/features/layout/layoutTool.d.ts +11 -0
- package/dist/editor/features/layout/layoutTool.d.ts.map +1 -0
- package/dist/editor/features/layout/layoutTool.js +20 -0
- package/dist/editor/features/layout/layoutTool.js.map +1 -0
- package/dist/editor/features/lists/listTools.d.ts +15 -0
- package/dist/editor/features/lists/listTools.d.ts.map +1 -0
- package/dist/editor/features/lists/listTools.js +78 -0
- package/dist/editor/features/lists/listTools.js.map +1 -0
- package/dist/editor/features/marks/markTools.d.ts +16 -0
- package/dist/editor/features/marks/markTools.d.ts.map +1 -0
- package/dist/editor/features/marks/markTools.js +43 -0
- package/dist/editor/features/marks/markTools.js.map +1 -0
- package/dist/editor/features/search/searchTool.d.ts +1 -1
- package/dist/editor/features/table/tableTool.d.ts +3 -3
- package/dist/editor/features/wrapper/wrapperTool.d.ts +11 -0
- package/dist/editor/features/wrapper/wrapperTool.d.ts.map +1 -0
- package/dist/editor/features/wrapper/wrapperTool.js +32 -0
- package/dist/editor/features/wrapper/wrapperTool.js.map +1 -0
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/schema-entry.d.ts +1 -1
- package/dist/editor/styles/prose.d.ts.map +1 -1
- package/dist/editor/styles/prose.js +26 -0
- package/dist/editor/styles/prose.js.map +1 -1
- package/dist/editor/ui/EditorToolbar.d.ts.map +1 -1
- package/dist/editor/ui/EditorToolbar.js +5 -38
- package/dist/editor/ui/EditorToolbar.js.map +1 -1
- package/dist/editor/ui/SelectionBubble.d.ts.map +1 -1
- package/dist/editor/ui/SelectionBubble.js +1 -1
- package/dist/editor/ui/SelectionBubble.js.map +1 -1
- package/dist/editor/ui/ToolButtonView.d.ts.map +1 -1
- package/dist/editor/ui/ToolButtonView.js +1 -1
- package/dist/editor/ui/ToolButtonView.js.map +1 -1
- package/dist/i18n/defaults.d.ts.map +1 -1
- package/dist/i18n/defaults.js +3 -0
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/messages.d.ts +16 -1
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/icons.d.ts +8 -1
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +1 -1
- package/dist/icons.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +3 -0
- package/dist/locales/ru.js.map +1 -1
- package/docs/api/editor-extension.en.md +68 -68
- package/docs/api/editor-extension.md +55 -55
- package/docs/api/messages.en.md +4 -1
- package/docs/api/messages.md +3 -0
- package/docs/api/migration-notes.en.md +11 -11
- package/docs/api/migration-notes.md +2 -2
- package/docs/api/utilities.en.md +6 -6
- package/docs/components/actions/split-button.en.md +9 -9
- package/docs/components/content/data-display.en.md +1 -1
- package/docs/components/content/layout-primitives.en.md +3 -3
- package/docs/components/content/rich-text-toc.en.md +1 -1
- package/docs/components/content/rich-text-view.en.md +23 -17
- package/docs/components/content/rich-text-view.md +17 -11
- package/docs/components/content/virtual-grid.en.md +2 -2
- package/docs/components/date-time/date-picker.en.md +1 -1
- package/docs/components/inputs/rich-text-editor.en.md +283 -230
- package/docs/components/inputs/rich-text-editor.md +139 -86
- package/docs/components/navigation/mega-menu.en.md +10 -10
- package/docs/components/overlays/menu.en.md +2 -2
- package/docs/components/overlays/shortcuts-help.en.md +1 -1
- package/docs/components/table/data-table.en.md +3 -3
- package/docs/components/table/filter-bar.en.md +1 -1
- package/docs/components/table/toolbar.en.md +1 -1
- package/docs/conventions.en.md +2 -2
- package/docs/conventions.md +1 -1
- package/docs/getting-started.en.md +9 -9
- package/docs/getting-started.md +8 -8
- package/docs/glossary.en.md +193 -133
- package/docs/glossary.md +191 -132
- package/docs/icons.en.md +12 -9
- package/docs/icons.md +3 -0
- package/docs/palette.en.md +3 -3
- package/docs/theming.en.md +6 -6
- package/package.json +2 -1
- package/src/editor/RichTextEditor.tsx +9 -6
- package/src/editor/core/atomText.ts +2 -2
- package/src/editor/core/blockTypes.ts +19 -83
- package/src/editor/core/containers.ts +4 -2
- package/src/editor/core/customMarkdown.ts +2 -2
- package/src/editor/core/customTool.ts +6 -6
- package/src/editor/core/customToolEngine.ts +9 -9
- package/src/editor/core/extensions.ts +165 -110
- package/src/editor/core/fieldNotice.ts +1 -1
- package/src/editor/core/handle.ts +2 -2
- package/src/editor/core/insertItems.ts +12 -158
- package/src/editor/core/insertMenuTool.ts +32 -0
- package/src/editor/core/jsonDocument.ts +1 -1
- package/src/editor/core/schema.ts +42 -7
- package/src/editor/core/shortcuts.ts +116 -177
- package/src/editor/core/skeleton.ts +4 -3
- package/src/editor/core/toolButtons.ts +3 -3
- package/src/editor/core/toolDefinition.ts +4 -4
- package/src/editor/core/toolDescriptor.ts +65 -52
- package/src/editor/core/toolLoader.ts +3 -3
- package/src/editor/core/toolOptions.ts +21 -2
- package/src/editor/core/tools.ts +10 -1
- package/src/editor/core/viewIsland.ts +1 -1
- package/src/editor/features/builtins.ts +76 -41
- package/src/editor/features/code/codeBlockTool.ts +16 -8
- package/src/editor/features/color/colorTools.ts +68 -0
- package/src/editor/features/details/details.ts +389 -0
- package/src/editor/features/details/detailsMarkdown.ts +158 -0
- package/src/editor/features/details/detailsTool.ts +69 -0
- package/src/editor/features/emoji/emojiTool.tsx +1 -1
- package/src/editor/features/heading/headingTool.ts +96 -0
- package/src/editor/features/history/historyTool.ts +42 -0
- package/src/editor/features/image/imageTool.ts +49 -0
- package/src/editor/features/layout/layoutTool.ts +40 -0
- package/src/editor/features/lists/listTools.ts +112 -0
- package/src/editor/features/marks/markTools.ts +78 -0
- package/src/editor/features/search/searchTool.ts +1 -1
- package/src/editor/features/table/tableTool.ts +3 -3
- package/src/editor/features/toc/tocTool.ts +1 -1
- package/src/editor/features/wrapper/wrapperTool.ts +52 -0
- package/src/editor/index.ts +1 -0
- package/src/editor/schema-entry.ts +1 -1
- package/src/editor/styles/prose.ts +49 -0
- package/src/editor/ui/EditorToolbar.tsx +7 -50
- package/src/editor/ui/SelectionBubble.tsx +2 -5
- package/src/editor/ui/ToolButtonView.tsx +2 -1
- package/src/i18n/defaults.ts +3 -0
- package/src/i18n/messages.ts +14 -1
- package/src/icons.ts +7 -0
- package/src/locales/ru.ts +3 -0
|
@@ -10,15 +10,14 @@ import type { ToolDescriptor } from "../../core/toolDescriptor.js";
|
|
|
10
10
|
export declare function codeLanguageOf(pre: Element): CodeLanguageId | null;
|
|
11
11
|
/**
|
|
12
12
|
* Блок кода на описании Инструмента (ADR-0058, п. 11.1): его нет в
|
|
13
|
-
* `basic`, а
|
|
13
|
+
* `basic`, а Extensions тяжелее 10 кБ, поэтому они грузятся тем же
|
|
14
14
|
* загрузчиком, что у своего Инструмента. До загрузки Редактор с блоком кода —
|
|
15
15
|
* Скелет (`RichTextEditor.tsx`).
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* переезжают позже (ADR-0058, «Последствия»).
|
|
17
|
+
* Сочетание `Mod+Alt+C` вешает расширение, поэтому строка справочника — только
|
|
18
|
+
* подпись (`shortcuts`); клавиши пунктов меню и «Формат ›» берутся из
|
|
19
|
+
* `SHORTCUT_KEYS`, место строки — из `SHORTCUT_ORDER`. Кнопка «Блок кода» меню
|
|
20
|
+
* «…» и «¶» — виджеты Панели и остаются у кита.
|
|
22
21
|
*/
|
|
23
22
|
export declare const CODE_BLOCK_TOOL: ToolDescriptor;
|
|
24
23
|
//# sourceMappingURL=codeBlockTool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeBlockTool.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/code/codeBlockTool.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAUnE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAOlE;AAyBD
|
|
1
|
+
{"version":3,"file":"codeBlockTool.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/code/codeBlockTool.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAUnE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAOlE;AAyBD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,cA8C7B,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Node } from "@tiptap/core";
|
|
3
3
|
import { CodeBlockIcon } from "../../../icons.js";
|
|
4
4
|
import { normalizeCodeLanguage } from "./codeLanguages.js";
|
|
5
|
-
import { shortcutKeys } from "../../core/shortcuts.js";
|
|
5
|
+
import { SHORTCUT_KEYS, shortcutKeys } from "../../core/shortcuts.js";
|
|
6
6
|
import { loaded } from "../../core/toolLoader.js";
|
|
7
7
|
const loadCodeBlock = () => import("./codeBlock.js");
|
|
8
8
|
export function codeLanguageOf(pre) {
|
|
@@ -34,6 +34,15 @@ const CodeBlockShape = Node.create({
|
|
|
34
34
|
export const CODE_BLOCK_TOOL = {
|
|
35
35
|
name: "codeBlock",
|
|
36
36
|
load: loadCodeBlock,
|
|
37
|
+
shortcuts: [
|
|
38
|
+
{
|
|
39
|
+
id: "codeBlock",
|
|
40
|
+
group: "blockType",
|
|
41
|
+
tool: "codeBlock",
|
|
42
|
+
keys: SHORTCUT_KEYS.codeBlock,
|
|
43
|
+
label: (m) => m.codeBlock,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
37
46
|
engine: ({ focusToolbar }) => [
|
|
38
47
|
loaded(loadCodeBlock).RichCodeBlock.configure({
|
|
39
48
|
focusToolbar,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeBlockTool.js","sourceRoot":"","sources":["../../../../src/editor/features/code/codeBlockTool.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,qBAAqB,EAAuB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"codeBlockTool.js","sourceRoot":"","sources":["../../../../src/editor/features/code/codeBlockTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ToolDescriptor } from "../../core/toolDescriptor.js";
|
|
2
|
+
/** Цвет текста: Метка `textStyle` с `data-color` и цвет автора. */
|
|
3
|
+
export declare const COLOR_TOOL: ToolDescriptor;
|
|
4
|
+
/** Маркер: Метка `highlight` с `data-color` (несколько цветов). */
|
|
5
|
+
export declare const HIGHLIGHT_TOOL: ToolDescriptor;
|
|
6
|
+
/**
|
|
7
|
+
* Выравнивание: `data-align` на абзаце и заголовке.
|
|
8
|
+
*
|
|
9
|
+
* Клавиши `Mod-Shift-L/E/R` вешает само расширение, а три строки справочника —
|
|
10
|
+
* подпись к ним. Меню «Выравнивание ▾» (`AlignMenu`, `FormatMenus.tsx`) — виджет
|
|
11
|
+
* кита, он читает те же сочетания из `SHORTCUT_KEYS`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const ALIGN_TOOL: ToolDescriptor;
|
|
14
|
+
//# sourceMappingURL=colorTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorTools.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/color/colorTools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAmBnE,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,cAGxB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,cAAc,EAAE,cAG5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,cA0BxB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { SHORTCUT_KEYS } from "../../core/shortcuts.js";
|
|
3
|
+
import { HighlightExtension, TEXT_COLOR_EXTENSIONS, TextAlignExtension, } from "./styleExtensions.js";
|
|
4
|
+
export const COLOR_TOOL = {
|
|
5
|
+
name: "color",
|
|
6
|
+
engine: () => TEXT_COLOR_EXTENSIONS,
|
|
7
|
+
};
|
|
8
|
+
export const HIGHLIGHT_TOOL = {
|
|
9
|
+
name: "highlight",
|
|
10
|
+
engine: () => [HighlightExtension],
|
|
11
|
+
};
|
|
12
|
+
export const ALIGN_TOOL = {
|
|
13
|
+
name: "align",
|
|
14
|
+
engine: () => [TextAlignExtension],
|
|
15
|
+
shortcuts: [
|
|
16
|
+
{
|
|
17
|
+
id: "alignLeft",
|
|
18
|
+
group: "align",
|
|
19
|
+
tool: "align",
|
|
20
|
+
keys: SHORTCUT_KEYS.alignLeft,
|
|
21
|
+
label: (m) => m.alignLeft,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: "alignCenter",
|
|
25
|
+
group: "align",
|
|
26
|
+
tool: "align",
|
|
27
|
+
keys: SHORTCUT_KEYS.alignCenter,
|
|
28
|
+
label: (m) => m.alignCenter,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "alignRight",
|
|
32
|
+
group: "align",
|
|
33
|
+
tool: "align",
|
|
34
|
+
keys: SHORTCUT_KEYS.alignRight,
|
|
35
|
+
label: (m) => m.alignRight,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=colorTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorTools.js","sourceRoot":"","sources":["../../../../src/editor/features/color/colorTools.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAe9B,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,GAAG,EAAE,CAAC,qBAAqB;CACpC,CAAC;AAGF,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,kBAAkB,CAAC;CACnC,CAAC;AASF,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,kBAAkB,CAAC;IAClC,SAAS,EAAE;QACT;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa,CAAC,SAAS;YAC7B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1B;QACD;YACE,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa,CAAC,WAAW;YAC/B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW;SAC5B;QACD;YACE,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa,CAAC,UAAU;YAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU;SAC3B;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type Extensions } from "@tiptap/core";
|
|
2
|
+
import { type Transaction } from "@tiptap/pm/state";
|
|
3
|
+
/**
|
|
4
|
+
* Сворачиваемый Блок (Details) — Блок-контейнер из двух детей: заголовок
|
|
5
|
+
* (`detailsSummary`, строчное содержимое) и содержимое (`detailsContent`, Блоки).
|
|
6
|
+
* Движок — расширение Details из Tiptap (API по нему, ADR-0048: заказчика при
|
|
7
|
+
* выпуске не было); кит добавляет Схему, санитайзер, Markdown и вставку.
|
|
8
|
+
*
|
|
9
|
+
* HTML — КАК У TIPTAP, ТЕГАМИ КИТА, без классов и `style`:
|
|
10
|
+
*
|
|
11
|
+
* ```html
|
|
12
|
+
* <details>
|
|
13
|
+
* <summary>Заголовок</summary>
|
|
14
|
+
* <div data-type="detailsContent"><p>Блоки</p></div>
|
|
15
|
+
* </details>
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* `open` пишется только с Опцией `persist` (по умолчанию нет): раскрытый при
|
|
19
|
+
* правке Блок не публикуется раскрытым без спроса. Обёртка содержимого
|
|
20
|
+
* (`div[data-type="detailsContent"]`) нужна движку, чтобы отличить содержимое от
|
|
21
|
+
* заголовка; чужой HTML без неё (GitHub, браузер: `<details><summary>…</summary>
|
|
22
|
+
* <p>…</p></details>`) читается так же, Схема достраивает её сама.
|
|
23
|
+
*
|
|
24
|
+
* ВЛОЖЕННОСТЬ — КАК У ЛЮБОГО БЛОКА. Details входит в группу `block`: он бывает на
|
|
25
|
+
* верхнем уровне, в колонке Раскладки, Обёртке, цитате, ячейке и в содержимом
|
|
26
|
+
* другого Details. Раскладки и Обёртки внутри него нет — их принимают только
|
|
27
|
+
* Документ и колонка. `isolating`, как у Обёртки: Backspace в начале Блока не
|
|
28
|
+
* выводит текст наружу.
|
|
29
|
+
*
|
|
30
|
+
* Вид Блока в Редакторе — представление узла из Tiptap: `div` с кнопкой
|
|
31
|
+
* раскрытия и классом `is-open`; открытость при `persist: false` живёт только в
|
|
32
|
+
* этом DOM, не в Документе и не в истории правок.
|
|
33
|
+
*/
|
|
34
|
+
/** Имена узлов Схемы движка. */
|
|
35
|
+
export declare const DETAILS_NODE = "details";
|
|
36
|
+
export declare const DETAILS_SUMMARY_NODE = "detailsSummary";
|
|
37
|
+
export declare const DETAILS_CONTENT_NODE = "detailsContent";
|
|
38
|
+
/** Имя обёртки содержимого в `data-type`: так её пишет Tiptap. */
|
|
39
|
+
export declare const DETAILS_CONTENT_TYPE = "detailsContent";
|
|
40
|
+
export interface DetailsEngineOptions {
|
|
41
|
+
/** Пишется ли открытость Блока в Документ (Опция `persist`). */
|
|
42
|
+
persist: boolean;
|
|
43
|
+
/** Имя кнопки раскрытия по тексту заголовка: из каталога, читается при каждой перерисовке. */
|
|
44
|
+
toggleLabel: (text: string) => string;
|
|
45
|
+
}
|
|
46
|
+
declare module "@tiptap/core" {
|
|
47
|
+
interface Commands<ReturnType> {
|
|
48
|
+
detailsBlock: {
|
|
49
|
+
/**
|
|
50
|
+
* Вставить пустой сворачиваемый Блок под текущим Блоком; пустой абзац
|
|
51
|
+
* заменяется. Каретка — в заголовке. Блок раскрыт: с `persist` — атрибутом,
|
|
52
|
+
* без него — сразу после вставки. Из заголовка, списка и ячейки он встаёт под
|
|
53
|
+
* их Блоком, из Обёртки, колонки и цитаты — внутри них.
|
|
54
|
+
*/
|
|
55
|
+
insertDetails: () => ReturnType;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Всё, что нужно Блоку: узел, заголовок и содержимое. */
|
|
60
|
+
export declare function detailsExtensions(options: DetailsEngineOptions): Extensions;
|
|
61
|
+
/**
|
|
62
|
+
* Снять Блок в `pos` (самого Блока или Блока в его содержимом): заголовок
|
|
63
|
+
* становится абзацем, Блоки содержимого идут за ним. Одна правка — отмена одна.
|
|
64
|
+
* Каретка остаётся в своём тексте (в заголовке — в абзаце из него); выделенный
|
|
65
|
+
* узлом Блок исчезает, и каретка встаёт в начало абзаца. `false` — Блока в `pos` нет.
|
|
66
|
+
*/
|
|
67
|
+
export declare function unwrapDetailsAt(tr: Transaction, pos: number): boolean;
|
|
68
|
+
//# sourceMappingURL=details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/details/details.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAI1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,gCAAgC;AAChC,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,mBAAuB,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAgFD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,YAAY,EAAE;YACZ;;;;;eAKG;YACH,aAAa,EAAE,MAAM,UAAU,CAAC;SACjC,CAAC;KACH;CACF;AAkKD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAE3E;AAoCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CA4BrE"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Details, DetailsContent, DetailsSummary } from "@tiptap/extension-details";
|
|
3
|
+
import {} from "@tiptap/core";
|
|
4
|
+
import { Fragment } from "@tiptap/pm/model";
|
|
5
|
+
import { NodeSelection, Plugin, PluginKey, Selection, TextSelection, } from "@tiptap/pm/state";
|
|
6
|
+
import { placeContainerBlock } from "../../core/containers.js";
|
|
7
|
+
import { detailsTokenizer, parseDetails, renderDetails } from "./detailsMarkdown.js";
|
|
8
|
+
export const DETAILS_NODE = "details";
|
|
9
|
+
export const DETAILS_SUMMARY_NODE = "detailsSummary";
|
|
10
|
+
export const DETAILS_CONTENT_NODE = "detailsContent";
|
|
11
|
+
export const DETAILS_CONTENT_TYPE = DETAILS_CONTENT_NODE;
|
|
12
|
+
const OPEN_ON_INSERT = new PluginKey("detailsOpenOnInsert");
|
|
13
|
+
const openOnInsert = new Plugin({
|
|
14
|
+
key: OPEN_ON_INSERT,
|
|
15
|
+
state: {
|
|
16
|
+
init: () => null,
|
|
17
|
+
apply: (tr) => tr.getMeta(OPEN_ON_INSERT) ?? null,
|
|
18
|
+
},
|
|
19
|
+
view: () => ({
|
|
20
|
+
update(view) {
|
|
21
|
+
const pos = OPEN_ON_INSERT.getState(view.state);
|
|
22
|
+
if (pos === null || pos === undefined)
|
|
23
|
+
return;
|
|
24
|
+
queueMicrotask(() => {
|
|
25
|
+
if (view.isDestroyed)
|
|
26
|
+
return;
|
|
27
|
+
const dom = view.nodeDOM(pos);
|
|
28
|
+
if (!(dom instanceof HTMLElement) || dom.getAttribute("data-type") !== DETAILS_NODE)
|
|
29
|
+
return;
|
|
30
|
+
if (dom.classList.contains("is-open"))
|
|
31
|
+
return;
|
|
32
|
+
dom.querySelector(":scope > button")?.click();
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
function summaryText(node) {
|
|
38
|
+
return node.firstChild?.type.name === DETAILS_SUMMARY_NODE ? node.firstChild.textContent : "";
|
|
39
|
+
}
|
|
40
|
+
function isVisibleAt(editor, pos) {
|
|
41
|
+
const { node } = editor.view.domAtPos(pos);
|
|
42
|
+
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
43
|
+
return element !== null && element.offsetParent !== null;
|
|
44
|
+
}
|
|
45
|
+
function moveIntoEmptyContent(editor) {
|
|
46
|
+
const { selection } = editor.state;
|
|
47
|
+
const { $head } = selection;
|
|
48
|
+
if (!selection.empty || $head.parent.type.name !== DETAILS_SUMMARY_NODE)
|
|
49
|
+
return false;
|
|
50
|
+
const content = $head.node(-1).lastChild;
|
|
51
|
+
const first = content?.type.name === DETAILS_CONTENT_NODE ? content.firstChild : null;
|
|
52
|
+
if (!first?.isTextblock || first.content.size > 0)
|
|
53
|
+
return false;
|
|
54
|
+
const start = $head.after() + 1;
|
|
55
|
+
if (!isVisibleAt(editor, start))
|
|
56
|
+
return false;
|
|
57
|
+
const { tr } = editor.state;
|
|
58
|
+
editor.view.dispatch(tr.setSelection(Selection.near(tr.doc.resolve(start), 1)).scrollIntoView());
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
function lastGraphemeLength(text) {
|
|
62
|
+
if (typeof Intl !== "undefined" && "Segmenter" in Intl) {
|
|
63
|
+
const parts = Array.from(new Intl.Segmenter(undefined, { granularity: "grapheme" }).segment(text));
|
|
64
|
+
return parts.at(-1)?.segment.length ?? 1;
|
|
65
|
+
}
|
|
66
|
+
return Array.from(text).at(-1)?.length ?? 1;
|
|
67
|
+
}
|
|
68
|
+
function createDetails({ persist, toggleLabel }) {
|
|
69
|
+
return Details.extend({
|
|
70
|
+
markdownTokenizer: detailsTokenizer,
|
|
71
|
+
parseMarkdown(token, helpers) {
|
|
72
|
+
return parseDetails(token, helpers, this.options.persist);
|
|
73
|
+
},
|
|
74
|
+
renderMarkdown(node, helpers) {
|
|
75
|
+
return renderDetails(node, helpers, this.options.persist);
|
|
76
|
+
},
|
|
77
|
+
addCommands() {
|
|
78
|
+
return {
|
|
79
|
+
...this.parent?.(),
|
|
80
|
+
insertDetails: () => ({ tr, dispatch }) => {
|
|
81
|
+
if (dispatch)
|
|
82
|
+
placeDetails(tr, this.options.persist);
|
|
83
|
+
return true;
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
addKeyboardShortcuts() {
|
|
88
|
+
const upstream = this.parent?.() ?? {};
|
|
89
|
+
return {
|
|
90
|
+
...upstream,
|
|
91
|
+
Enter: (props) => moveIntoEmptyContent(props.editor) || (upstream.Enter?.(props) ?? false),
|
|
92
|
+
Backspace: () => {
|
|
93
|
+
const { selection } = this.editor.state;
|
|
94
|
+
const { empty, $anchor } = selection;
|
|
95
|
+
if (!empty || $anchor.parent.type.name !== DETAILS_SUMMARY_NODE)
|
|
96
|
+
return false;
|
|
97
|
+
if ($anchor.parentOffset === 0)
|
|
98
|
+
return this.editor.commands.unsetDetails();
|
|
99
|
+
const before = $anchor.parent.textBetween(0, $anchor.parentOffset);
|
|
100
|
+
const size = lastGraphemeLength(before);
|
|
101
|
+
return this.editor.commands.command(({ tr }) => {
|
|
102
|
+
tr.delete($anchor.pos - size, $anchor.pos);
|
|
103
|
+
return true;
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
addNodeView() {
|
|
109
|
+
const parentView = this.parent?.();
|
|
110
|
+
if (!parentView)
|
|
111
|
+
return null;
|
|
112
|
+
return (props) => {
|
|
113
|
+
const view = parentView(props);
|
|
114
|
+
const toggle = view.dom.querySelector(":scope > button");
|
|
115
|
+
const stopEvent = (event) => event.target instanceof Node && !!toggle && toggle.contains(event.target);
|
|
116
|
+
toggle?.setAttribute("contenteditable", "false");
|
|
117
|
+
let byKey = false;
|
|
118
|
+
toggle?.addEventListener("keydown", (event) => {
|
|
119
|
+
if (event.key === "Enter" || event.key === " ")
|
|
120
|
+
byKey = true;
|
|
121
|
+
});
|
|
122
|
+
toggle?.addEventListener("blur", () => {
|
|
123
|
+
byKey = false;
|
|
124
|
+
});
|
|
125
|
+
toggle?.addEventListener("click", () => {
|
|
126
|
+
if (!byKey)
|
|
127
|
+
return;
|
|
128
|
+
byKey = false;
|
|
129
|
+
const owner = toggle.ownerDocument;
|
|
130
|
+
const root = view.dom.closest(".ProseMirror");
|
|
131
|
+
let target = toggle;
|
|
132
|
+
const follow = (event) => {
|
|
133
|
+
if (event.target instanceof HTMLElement && event.target !== root)
|
|
134
|
+
target = event.target;
|
|
135
|
+
};
|
|
136
|
+
owner.addEventListener("focusin", follow, true);
|
|
137
|
+
requestAnimationFrame(() => {
|
|
138
|
+
owner.removeEventListener("focusin", follow, true);
|
|
139
|
+
const active = owner.activeElement;
|
|
140
|
+
if (target.isConnected && (active === root || active === target)) {
|
|
141
|
+
target.focus({ preventScroll: true });
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
return { ...view, stopEvent };
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
addProseMirrorPlugins() {
|
|
149
|
+
return [...(this.parent?.() ?? []), ...(this.options.persist ? [] : [openOnInsert])];
|
|
150
|
+
},
|
|
151
|
+
}).configure({
|
|
152
|
+
persist,
|
|
153
|
+
renderToggleButton: ({ element, isOpen, node }) => {
|
|
154
|
+
element.setAttribute("aria-label", toggleLabel(summaryText(node)));
|
|
155
|
+
element.setAttribute("aria-expanded", String(isOpen));
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const KitSummary = DetailsSummary.extend({
|
|
160
|
+
parseHTML: () => [{ tag: "details > summary" }],
|
|
161
|
+
markdownTokenizer: {
|
|
162
|
+
name: DETAILS_SUMMARY_NODE,
|
|
163
|
+
level: "block",
|
|
164
|
+
start: () => -1,
|
|
165
|
+
tokenize: () => undefined,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
const KitContent = DetailsContent.extend({
|
|
169
|
+
markdownTokenizer: {
|
|
170
|
+
name: DETAILS_CONTENT_NODE,
|
|
171
|
+
level: "block",
|
|
172
|
+
start: () => -1,
|
|
173
|
+
tokenize: () => undefined,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
export function detailsExtensions(options) {
|
|
177
|
+
return [createDetails(options), KitSummary, KitContent];
|
|
178
|
+
}
|
|
179
|
+
function placeDetails(tr, persist) {
|
|
180
|
+
const { schema } = tr.doc.type;
|
|
181
|
+
const details = schema.nodes[DETAILS_NODE].create(persist ? { open: true } : null, [
|
|
182
|
+
schema.nodes[DETAILS_SUMMARY_NODE].create(),
|
|
183
|
+
schema.nodes[DETAILS_CONTENT_NODE].create(null, schema.nodes.paragraph.create()),
|
|
184
|
+
]);
|
|
185
|
+
placeContainerBlock(tr, details);
|
|
186
|
+
if (persist)
|
|
187
|
+
return;
|
|
188
|
+
const { $from } = tr.selection;
|
|
189
|
+
for (let depth = $from.depth; depth > 0; depth--) {
|
|
190
|
+
if ($from.node(depth).type.name === DETAILS_NODE) {
|
|
191
|
+
tr.setMeta(OPEN_ON_INSERT, $from.before(depth));
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function detailsAt(tr, pos) {
|
|
197
|
+
const node = tr.doc.nodeAt(pos);
|
|
198
|
+
if (node?.type.name === DETAILS_NODE)
|
|
199
|
+
return { from: pos, node };
|
|
200
|
+
const $pos = tr.doc.resolve(pos);
|
|
201
|
+
if ($pos.parent.type.name !== DETAILS_CONTENT_NODE)
|
|
202
|
+
return null;
|
|
203
|
+
const from = $pos.before($pos.depth - 1);
|
|
204
|
+
const details = tr.doc.nodeAt(from);
|
|
205
|
+
return details?.type.name === DETAILS_NODE ? { from, node: details } : null;
|
|
206
|
+
}
|
|
207
|
+
export function unwrapDetailsAt(tr, pos) {
|
|
208
|
+
const found = detailsAt(tr, pos);
|
|
209
|
+
if (!found)
|
|
210
|
+
return false;
|
|
211
|
+
const { from, node } = found;
|
|
212
|
+
const to = from + node.nodeSize;
|
|
213
|
+
const { schema } = tr.doc.type;
|
|
214
|
+
const summary = node.firstChild;
|
|
215
|
+
const content = node.lastChild;
|
|
216
|
+
const lead = schema.nodes.paragraph.create(null, summary?.content ?? Fragment.empty);
|
|
217
|
+
const blocks = content?.type.name === DETAILS_CONTENT_NODE ? content.content : Fragment.empty;
|
|
218
|
+
const before = tr.selection;
|
|
219
|
+
const wasNode = before instanceof NodeSelection && before.from === from;
|
|
220
|
+
const summaryEnd = from + 1 + (summary?.nodeSize ?? 0);
|
|
221
|
+
const delta = from + lead.nodeSize - (summaryEnd + 1);
|
|
222
|
+
const shift = (at) => (at < summaryEnd ? at - 1 : at + delta);
|
|
223
|
+
const inside = before.from > from && before.to < to;
|
|
224
|
+
tr.replaceWith(from, to, Fragment.from(lead).append(blocks));
|
|
225
|
+
if (wasNode || !inside) {
|
|
226
|
+
tr.setSelection(TextSelection.create(tr.doc, from + 1));
|
|
227
|
+
}
|
|
228
|
+
else if (before instanceof NodeSelection) {
|
|
229
|
+
tr.setSelection(NodeSelection.create(tr.doc, shift(before.from)));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
tr.setSelection(TextSelection.create(tr.doc, shift(before.anchor), shift(before.head)));
|
|
233
|
+
}
|
|
234
|
+
tr.scrollIntoView();
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.js","sourceRoot":"","sources":["../../../../src/editor/features/details/details.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JSONContent, MarkdownParseHelpers, MarkdownRendererHelpers, MarkdownToken, MarkdownTokenizer } from "@tiptap/core";
|
|
2
|
+
/** Токенизатор Блока `details` для `marked` (`markdownTokenizer` расширения). */
|
|
3
|
+
export declare const detailsTokenizer: MarkdownTokenizer;
|
|
4
|
+
/**
|
|
5
|
+
* Токен — в узел Блока: заголовок из текста с Метками, содержимое Блоками (пустое
|
|
6
|
+
* — одним пустым абзацем). Атрибут `open` — только когда он в Схеме (`persist`).
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseDetails(token: MarkdownToken, helpers: MarkdownParseHelpers, persist: boolean): JSONContent;
|
|
9
|
+
/**
|
|
10
|
+
* Узел — в Markdown: открывающий тег с `summary` на своей строке, пустая строка,
|
|
11
|
+
* Блоки через пустую строку, пустая строка, закрывающий тег. Пустая строка после
|
|
12
|
+
* `summary` — то, что заставляет GitHub читать содержимое как Markdown.
|
|
13
|
+
* `<` в заголовке пишется как `<`: иначе текст «a </summary> b» закрыл бы
|
|
14
|
+
* заголовок раньше времени.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderDetails(node: JSONContent, helpers: MarkdownRendererHelpers, persist: boolean): string;
|
|
17
|
+
//# sourceMappingURL=detailsMarkdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detailsMarkdown.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/details/detailsMarkdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAEX,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EAClB,MAAM,cAAc,CAAC;AA2EtB,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,EAAE,iBAiC9B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,WAAW,CAUb;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,OAAO,GACf,MAAM,CAMR"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const OPEN_TAG = /^<details(?:\s[^<>]*)?>/i;
|
|
3
|
+
const ANY_TAG = /<(\/?)details(?:\s[^<>]*)?>/gi;
|
|
4
|
+
const SUMMARY = /^\s*<summary(?:\s[^<>]*)?>([\s\S]*?)<\/summary>[ \t]*/i;
|
|
5
|
+
function maskCode(src) {
|
|
6
|
+
let fence = null;
|
|
7
|
+
const lines = src.split("\n").map((line) => {
|
|
8
|
+
const marker = /^ {0,3}(`{3,}|~{3,})/.exec(line)?.[1];
|
|
9
|
+
if (fence === null && marker) {
|
|
10
|
+
fence = marker[0].repeat(3);
|
|
11
|
+
return " ".repeat(line.length);
|
|
12
|
+
}
|
|
13
|
+
if (fence !== null) {
|
|
14
|
+
if (marker && marker.startsWith(fence))
|
|
15
|
+
fence = null;
|
|
16
|
+
return " ".repeat(line.length);
|
|
17
|
+
}
|
|
18
|
+
return line.replace(/(`+)[^`\n]*?\1/g, (span) => " ".repeat(span.length));
|
|
19
|
+
});
|
|
20
|
+
return lines.join("\n");
|
|
21
|
+
}
|
|
22
|
+
function closingEnd(src, afterOpen) {
|
|
23
|
+
const masked = maskCode(src);
|
|
24
|
+
let level = 1;
|
|
25
|
+
ANY_TAG.lastIndex = afterOpen;
|
|
26
|
+
for (let match = ANY_TAG.exec(masked); match; match = ANY_TAG.exec(masked)) {
|
|
27
|
+
level += match[1] ? -1 : 1;
|
|
28
|
+
if (level === 0)
|
|
29
|
+
return match.index + match[0].length;
|
|
30
|
+
}
|
|
31
|
+
return -1;
|
|
32
|
+
}
|
|
33
|
+
function oneLine(text) {
|
|
34
|
+
return text.replace(/\s+/g, " ").trim();
|
|
35
|
+
}
|
|
36
|
+
export const detailsTokenizer = {
|
|
37
|
+
name: "details",
|
|
38
|
+
level: "block",
|
|
39
|
+
start: (src) => src.search(/^<details[\s>]/im),
|
|
40
|
+
tokenize(src, _tokens, lexer) {
|
|
41
|
+
const open = OPEN_TAG.exec(src);
|
|
42
|
+
if (!open)
|
|
43
|
+
return undefined;
|
|
44
|
+
const end = closingEnd(src, open[0].length);
|
|
45
|
+
if (end < 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
const raw = src.slice(0, end);
|
|
48
|
+
const closeTag = /<\/details(?:\s[^<>]*)?>$/i.exec(raw)?.[0] ?? "";
|
|
49
|
+
const inner = raw.slice(open[0].length, raw.length - closeTag.length);
|
|
50
|
+
const summary = SUMMARY.exec(inner);
|
|
51
|
+
const body = summary ? inner.slice(summary[0].length) : inner;
|
|
52
|
+
const tokens = body.trim() ? lexer.blockTokens(body) : [];
|
|
53
|
+
for (const token of tokens) {
|
|
54
|
+
if (token.text && (!token.tokens || token.tokens.length === 0)) {
|
|
55
|
+
token.tokens = lexer.inlineTokens(token.text);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
type: "details",
|
|
60
|
+
raw,
|
|
61
|
+
open: /^<details(?:\s[^<>]*)?\sopen(?:[\s=>/]|$)/i.test(open[0]),
|
|
62
|
+
summary: summary ? lexer.inlineTokens(oneLine(summary[1] ?? "")) : [],
|
|
63
|
+
tokens,
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
export function parseDetails(token, helpers, persist) {
|
|
68
|
+
const title = helpers
|
|
69
|
+
.parseInline(token.summary ?? [])
|
|
70
|
+
.filter((node) => node.type === "text");
|
|
71
|
+
const blocks = helpers.parseChildren(token.tokens ?? []);
|
|
72
|
+
return helpers.createNode("details", persist && token.open === true ? { open: true } : {}, [
|
|
73
|
+
helpers.createNode("detailsSummary", {}, title),
|
|
74
|
+
helpers.createNode("detailsContent", {}, blocks.length > 0 ? blocks : [{ type: "paragraph" }]),
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
export function renderDetails(node, helpers, persist) {
|
|
78
|
+
const [summary, content] = node.content ?? [];
|
|
79
|
+
const title = summary?.content ? helpers.renderChildren(summary.content) : "";
|
|
80
|
+
const body = content?.content ? helpers.renderChildren(content.content, "\n\n") : "";
|
|
81
|
+
const open = persist && node.attrs?.open ? " open" : "";
|
|
82
|
+
return `<details${open}>\n<summary>${title.replace(/</g, "<")}</summary>\n\n${body}\n\n</details>`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=detailsMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detailsMarkdown.js","sourceRoot":"","sources":["../../../../src/editor/features/details/detailsMarkdown.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAsCb,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAE5C,MAAM,OAAO,GAAG,+BAA+B,CAAC;AAEhD,MAAM,OAAO,GAAG,wDAAwD,CAAC;AAQzE,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC;YAC7B,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,KAAK,GAAG,IAAI,CAAC;YACrD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAGD,SAAS,UAAU,CAAC,GAAW,EAAE,SAAiB;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAGD,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAiC;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,MAAM,MAAM,GAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAI3E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG;YAEH,IAAI,EAAE,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,MAAM;SACU,CAAC;IACrB,CAAC;CACF,CAAC;AAMF,MAAM,UAAU,YAAY,CAC1B,KAAoB,EACpB,OAA6B,EAC7B,OAAgB;IAEhB,MAAM,KAAK,GAAG,OAAO;SAClB,WAAW,CAAE,KAAK,CAAC,OAAuC,IAAI,EAAE,CAAC;SAEjE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACzF,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,CAAC;QAC/C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;KAC/F,CAAC,CAAC;AACL,CAAC;AASD,MAAM,UAAU,aAAa,CAC3B,IAAiB,EACjB,OAAgC,EAChC,OAAgB;IAEhB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,MAAM,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,WAAW,IAAI,eAAe,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolDescriptor } from "../../core/toolDescriptor.js";
|
|
2
|
+
import type { DetailsToolOptions } from "../../core/toolOptions.js";
|
|
3
|
+
/** Умолчания Опций: открытость в Документ не пишется (как `persist` у Tiptap). */
|
|
4
|
+
export declare const DETAILS_DEFAULTS: DetailsToolOptions;
|
|
5
|
+
/**
|
|
6
|
+
* Сворачиваемый Блок на описании Инструмента (ADR-0048): узлы и их клавиатура
|
|
7
|
+
* (`details.ts`), Markdown сырым HTML (`detailsMarkdown.ts`), пункт Меню вставки,
|
|
8
|
+
* Действие «Снять сворачивание» и Признак «контейнер» для содержимого.
|
|
9
|
+
*
|
|
10
|
+
* Своей группы в модели Документа у Блока нет: он входит в `block`, как абзац.
|
|
11
|
+
* Меню ручки — как у Обёртки: «Вверх», «Вниз», «Дублировать», «Удалить» общие, к
|
|
12
|
+
* ним «Снять сворачивание» у самого Блока и у Блока в его содержимом. «Тон ›» у
|
|
13
|
+
* Блока нет — тонов он не знает.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DETAILS_TOOL: ToolDescriptor;
|
|
16
|
+
//# sourceMappingURL=detailsTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detailsTool.d.ts","sourceRoot":"","sources":["../../../../src/editor/features/details/detailsTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAQpE,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,EAAE,kBAAuC,CAAC;AAEvE;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,EAAE,cA2C1B,CAAC"}
|