@gravity-ui/markdown-editor 13.5.2 → 13.6.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.
- package/build/cjs/bundle/Editor.js +8 -5
- package/build/cjs/bundle/config/icons.d.ts +1 -1
- package/build/cjs/bundle/config/icons.js +1 -0
- package/build/cjs/bundle/config/wysiwyg.d.ts +2 -1
- package/build/cjs/bundle/config/wysiwyg.js +13 -2
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeading.d.ts +12 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeading.js +22 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.d.ts +2 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.js +9 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.d.ts +11 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.js +5 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.d.ts +1 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.js +4 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.d.ts +3 -0
- package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.js +17 -0
- package/build/cjs/extensions/yfm/FoldingHeading/actions.d.ts +2 -0
- package/build/cjs/extensions/yfm/FoldingHeading/actions.js +10 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/index.d.ts +3 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/index.js +6 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.d.ts +2 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.js +27 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.d.ts +2 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.js +17 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.d.ts +2 -0
- package/build/cjs/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.js +26 -0
- package/build/cjs/extensions/yfm/FoldingHeading/const.d.ts +1 -0
- package/build/cjs/extensions/yfm/FoldingHeading/const.js +6 -0
- package/build/cjs/extensions/yfm/FoldingHeading/index.d.ts +1 -0
- package/build/cjs/extensions/yfm/FoldingHeading/index.js +5 -0
- package/build/cjs/extensions/yfm/FoldingHeading/input-rules.d.ts +4 -0
- package/build/cjs/extensions/yfm/FoldingHeading/input-rules.js +31 -0
- package/build/cjs/extensions/yfm/FoldingHeading/plugins/Folding.d.ts +3 -0
- package/build/cjs/extensions/yfm/FoldingHeading/plugins/Folding.js +167 -0
- package/build/cjs/extensions/yfm/FoldingHeading/utils.d.ts +10 -0
- package/build/cjs/extensions/yfm/FoldingHeading/utils.js +30 -0
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +4 -4
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +9 -1
- package/build/cjs/i18n/menubar/en.json +2 -0
- package/build/cjs/i18n/menubar/index.d.ts +3 -1
- package/build/cjs/i18n/menubar/ru.json +2 -0
- package/build/cjs/icons/index.d.ts +1 -1
- package/build/cjs/icons/index.js +2 -1
- package/build/cjs/toolbar/ToolbarButton.js +3 -2
- package/build/cjs/version.js +1 -1
- package/build/esm/bundle/Editor.js +8 -5
- package/build/esm/bundle/config/icons.d.ts +1 -1
- package/build/esm/bundle/config/icons.js +2 -1
- package/build/esm/bundle/config/wysiwyg.d.ts +2 -1
- package/build/esm/bundle/config/wysiwyg.js +12 -1
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeading.d.ts +12 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeading.js +18 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.d.ts +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.js +5 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.d.ts +11 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.js +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.d.ts +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.js +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.d.ts +3 -0
- package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.js +13 -0
- package/build/esm/extensions/yfm/FoldingHeading/actions.d.ts +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/actions.js +7 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/index.d.ts +3 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/index.js +3 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.d.ts +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.js +23 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.d.ts +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.js +13 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.d.ts +2 -0
- package/build/esm/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.js +22 -0
- package/build/esm/extensions/yfm/FoldingHeading/const.d.ts +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/const.js +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/index.d.ts +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/index.js +1 -0
- package/build/esm/extensions/yfm/FoldingHeading/input-rules.d.ts +4 -0
- package/build/esm/extensions/yfm/FoldingHeading/input-rules.js +27 -0
- package/build/esm/extensions/yfm/FoldingHeading/plugins/Folding.d.ts +4 -0
- package/build/esm/extensions/yfm/FoldingHeading/plugins/Folding.js +164 -0
- package/build/esm/extensions/yfm/FoldingHeading/utils.d.ts +10 -0
- package/build/esm/extensions/yfm/FoldingHeading/utils.js +19 -0
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +4 -4
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +9 -1
- package/build/esm/i18n/menubar/en.json +2 -0
- package/build/esm/i18n/menubar/index.d.ts +3 -1
- package/build/esm/i18n/menubar/ru.json +2 -0
- package/build/esm/icons/index.d.ts +1 -1
- package/build/esm/icons/index.js +1 -1
- package/build/esm/toolbar/ToolbarButton.js +3 -2
- package/build/esm/version.js +1 -1
- package/build/styles.css +0 -381
- package/package.json +10 -5
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +0 -26
- package/build/cjs/extensions/markdown/Table/plugins/TableCellContextPlugin/floating.css +0 -11
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/skeleton.css +0 -8
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.css +0 -12
- package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImageForm/ImageForm.css +0 -8
- package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgNodeView.css +0 -4
- package/build/cjs/extensions/yfm/Mermaid/MermaidNodeView/Mermaid.css +0 -33
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +0 -3
- package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/skeleton.css +0 -8
- package/build/cjs/extensions/yfm/YfmFile/YfmFileWidget/view.css +0 -7
- package/build/cjs/extensions/yfm/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlock.css +0 -66
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -66
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/view.css +0 -83
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/yfmTableCellView.css +0 -37
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +0 -9
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +0 -26
- package/build/esm/extensions/markdown/Table/plugins/TableCellContextPlugin/floating.css +0 -11
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/skeleton.css +0 -8
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.css +0 -12
- package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImageForm/ImageForm.css +0 -8
- package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgNodeView.css +0 -4
- package/build/esm/extensions/yfm/Mermaid/MermaidNodeView/Mermaid.css +0 -33
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +0 -3
- package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/skeleton.css +0 -8
- package/build/esm/extensions/yfm/YfmFile/YfmFileWidget/view.css +0 -7
- package/build/esm/extensions/yfm/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlock.css +0 -66
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -66
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/view.css +0 -83
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/yfmTableCellView.css +0 -37
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +0 -9
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Plugin } from 'prosemirror-state';
|
|
2
|
+
import { AddMarkStep, AddNodeMarkStep, DocAttrStep, RemoveMarkStep, RemoveNodeMarkStep, ReplaceStep, } from 'prosemirror-transform';
|
|
3
|
+
import { findChildren } from 'prosemirror-utils';
|
|
4
|
+
import { Decoration, DecorationSet } from 'prosemirror-view';
|
|
5
|
+
import { YfmHeadingAttr } from '../const';
|
|
6
|
+
import { isFoldedHeading, isFoldingHeading, isHeading, isUnfoldedHeading, parseLevel, } from '../utils';
|
|
7
|
+
import './folding.css';
|
|
8
|
+
const CHANGE_META_KEY = 'folding-heading-changed';
|
|
9
|
+
export const foldingPlugin = () => {
|
|
10
|
+
return new Plugin({
|
|
11
|
+
state: {
|
|
12
|
+
init: (_config, state) => buildDecosSet(state.doc),
|
|
13
|
+
apply: (tr, prev) => {
|
|
14
|
+
if (tr.getMeta(CHANGE_META_KEY)) {
|
|
15
|
+
return buildDecosSet(tr.doc);
|
|
16
|
+
}
|
|
17
|
+
if (!tr.docChanged ||
|
|
18
|
+
// Optimization: ignoring trs, that don't change position of blocks in doc
|
|
19
|
+
canSafelyIgnoreTr(tr)) {
|
|
20
|
+
return prev.map(tr.mapping, tr.doc);
|
|
21
|
+
}
|
|
22
|
+
return buildDecosSet(tr.doc);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
props: {
|
|
26
|
+
decorations(state) {
|
|
27
|
+
return this.getState(state);
|
|
28
|
+
},
|
|
29
|
+
handleClickOn(view, _pos, node, nodePos, event, direct) {
|
|
30
|
+
if (direct && isFoldingHeading(node) && isLeftPaddingClick(event)) {
|
|
31
|
+
view.dispatch(view.state.tr
|
|
32
|
+
.setNodeAttribute(nodePos, YfmHeadingAttr.Folding, !node.attrs[YfmHeadingAttr.Folding])
|
|
33
|
+
.setMeta(CHANGE_META_KEY, true));
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
function isLeftPaddingClick(event) {
|
|
40
|
+
const elem = event.target;
|
|
41
|
+
const leftPadding = parseInt(window.getComputedStyle(elem).paddingLeft, 10);
|
|
42
|
+
if (Number.isNaN(leftPadding))
|
|
43
|
+
return true;
|
|
44
|
+
return event.offsetX < leftPadding;
|
|
45
|
+
}
|
|
46
|
+
const safeSteps = [AddMarkStep, AddNodeMarkStep, DocAttrStep, RemoveMarkStep, RemoveNodeMarkStep];
|
|
47
|
+
function canSafelyIgnoreTr(tr) {
|
|
48
|
+
if (isInputTr(tr) || isTextBackspaceTr(tr))
|
|
49
|
+
return true;
|
|
50
|
+
if (tr.steps.every((step) => safeSteps.some((SafeStep) => step instanceof SafeStep)))
|
|
51
|
+
return true;
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function isInputTr(tr) {
|
|
55
|
+
if (tr.steps.length !== 1)
|
|
56
|
+
return false;
|
|
57
|
+
const [step] = tr.steps;
|
|
58
|
+
return (step instanceof ReplaceStep &&
|
|
59
|
+
step.from === step.to &&
|
|
60
|
+
step.slice.content.childCount === 1 &&
|
|
61
|
+
step.slice.content.child(0).type.name === 'text');
|
|
62
|
+
}
|
|
63
|
+
function isTextBackspaceTr(tr) {
|
|
64
|
+
if (tr.steps.length !== 1)
|
|
65
|
+
return false;
|
|
66
|
+
const [step] = tr.steps;
|
|
67
|
+
return step instanceof ReplaceStep && step.to - step.from === 1 && step.slice.size === 0;
|
|
68
|
+
}
|
|
69
|
+
// eslint-disable-next-line complexity
|
|
70
|
+
function buildDecosSet(doc) {
|
|
71
|
+
var _a;
|
|
72
|
+
const contentDecos = {};
|
|
73
|
+
const separatorDecos = {};
|
|
74
|
+
const headings = findChildren(doc, isFoldingHeading, true);
|
|
75
|
+
for (const { node, pos } of headings) {
|
|
76
|
+
// don't add decorations to nested hidden headings and its content
|
|
77
|
+
if ((_a = contentDecos[pos]) === null || _a === void 0 ? void 0 : _a.hidden)
|
|
78
|
+
continue;
|
|
79
|
+
const isFolded = isFoldedHeading(node);
|
|
80
|
+
const nodeLevel = parseLevel(node);
|
|
81
|
+
const $pos = doc.resolve(pos + 1);
|
|
82
|
+
const depth = $pos.depth - 1;
|
|
83
|
+
const parent = $pos.node(depth);
|
|
84
|
+
let idx = $pos.index(depth);
|
|
85
|
+
let child = null;
|
|
86
|
+
if (isFolded) {
|
|
87
|
+
while ((child = parent.maybeChild(++idx))) {
|
|
88
|
+
if (isHeading(child) && parseLevel(child) <= nodeLevel)
|
|
89
|
+
break;
|
|
90
|
+
const childPos = $pos.posAtIndex(idx, depth);
|
|
91
|
+
contentDecos[childPos] = {
|
|
92
|
+
from: childPos,
|
|
93
|
+
to: childPos + child.nodeSize,
|
|
94
|
+
hidden: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
let hLevel = nodeLevel;
|
|
100
|
+
let nextFoldingHeadingFound = false;
|
|
101
|
+
let hidden = false;
|
|
102
|
+
let lastNonHiddenChild = null;
|
|
103
|
+
while ((child = parent.maybeChild(++idx))) {
|
|
104
|
+
const childPos = $pos.posAtIndex(idx, depth);
|
|
105
|
+
if (isHeading(child)) {
|
|
106
|
+
if (isFoldingHeading(child)) {
|
|
107
|
+
nextFoldingHeadingFound = true;
|
|
108
|
+
}
|
|
109
|
+
const level = parseLevel(child);
|
|
110
|
+
if (level <= nodeLevel)
|
|
111
|
+
break;
|
|
112
|
+
if (!hidden) {
|
|
113
|
+
lastNonHiddenChild = { node: child, pos: childPos, level: hLevel };
|
|
114
|
+
}
|
|
115
|
+
if (isUnfoldedHeading(child)) {
|
|
116
|
+
hLevel = level;
|
|
117
|
+
hidden = false;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
hidden = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!hidden) {
|
|
124
|
+
lastNonHiddenChild = { node: child, pos: childPos, level: hLevel };
|
|
125
|
+
}
|
|
126
|
+
if (!nextFoldingHeadingFound) {
|
|
127
|
+
contentDecos[childPos] = {
|
|
128
|
+
from: childPos,
|
|
129
|
+
to: childPos + child.nodeSize,
|
|
130
|
+
hidden: false,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (lastNonHiddenChild && !separatorDecos[lastNonHiddenChild.pos]) {
|
|
135
|
+
const { pos, node, level } = lastNonHiddenChild;
|
|
136
|
+
separatorDecos[pos] = {
|
|
137
|
+
from: pos,
|
|
138
|
+
to: pos + node.nodeSize,
|
|
139
|
+
value: nodeLevel === level ? 'h' + hLevel : `h${nodeLevel}-h${hLevel}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const decorations = [];
|
|
144
|
+
for (const item of Object.values(contentDecos)) {
|
|
145
|
+
const attrs = item.hidden
|
|
146
|
+
? { class: 'pm-h-folding-hidden' }
|
|
147
|
+
: {
|
|
148
|
+
class: 'pm-h-folding-content',
|
|
149
|
+
nodeName: 'div',
|
|
150
|
+
};
|
|
151
|
+
decorations.push(Decoration.node(item.from, item.to, attrs));
|
|
152
|
+
}
|
|
153
|
+
for (const item of Object.values(separatorDecos)) {
|
|
154
|
+
decorations.push(Decoration.node(item.from, item.to, {
|
|
155
|
+
nodeName: 'div',
|
|
156
|
+
class: 'pm-h-folding-label',
|
|
157
|
+
'data-value': item.value,
|
|
158
|
+
}), Decoration.node(item.from, item.to, {
|
|
159
|
+
nodeName: 'div',
|
|
160
|
+
class: 'pm-h-folding-separator',
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
return DecorationSet.create(doc, decorations);
|
|
164
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Node } from 'prosemirror-model';
|
|
2
|
+
import type { Selection } from 'prosemirror-state';
|
|
3
|
+
export { headingType } from '../../markdown/Heading/HeadingSpecs';
|
|
4
|
+
export declare const insideHeading: ({ $anchor, $head }: Selection) => boolean;
|
|
5
|
+
export declare const hasFolding: (sel: Selection) => boolean;
|
|
6
|
+
export declare function isHeading(node: Node): boolean;
|
|
7
|
+
export declare function isFoldingHeading(node: Node): boolean;
|
|
8
|
+
export declare function isFoldedHeading(node: Node): boolean;
|
|
9
|
+
export declare function isUnfoldedHeading(node: Node): boolean;
|
|
10
|
+
export declare function parseLevel(node: Node): number;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { YfmHeadingAttr, headingNodeName } from './const';
|
|
2
|
+
export { headingType } from '../../markdown/Heading/HeadingSpecs';
|
|
3
|
+
export const insideHeading = ({ $anchor, $head }) => $anchor.sameParent($head) && isHeading($head.parent);
|
|
4
|
+
export const hasFolding = (sel) => insideHeading(sel) && sel.$head.parent.attrs[YfmHeadingAttr.Folding] !== null;
|
|
5
|
+
export function isHeading(node) {
|
|
6
|
+
return node.type.name === headingNodeName;
|
|
7
|
+
}
|
|
8
|
+
export function isFoldingHeading(node) {
|
|
9
|
+
return isHeading(node) && typeof node.attrs[YfmHeadingAttr.Folding] === 'boolean';
|
|
10
|
+
}
|
|
11
|
+
export function isFoldedHeading(node) {
|
|
12
|
+
return isHeading(node) && node.attrs[YfmHeadingAttr.Folding] === true;
|
|
13
|
+
}
|
|
14
|
+
export function isUnfoldedHeading(node) {
|
|
15
|
+
return isHeading(node) && node.attrs[YfmHeadingAttr.Folding] === false;
|
|
16
|
+
}
|
|
17
|
+
export function parseLevel(node) {
|
|
18
|
+
return Number.parseInt(node.attrs[YfmHeadingAttr.Level], 10);
|
|
19
|
+
}
|
|
@@ -12,7 +12,7 @@ export const YfmHeadingSpecs = (builder, opts) => {
|
|
|
12
12
|
[YfmHeadingAttr.Id]: { default: '' },
|
|
13
13
|
[YfmHeadingAttr.Level]: { default: 1 },
|
|
14
14
|
[YfmHeadingAttr.DataLine]: { default: null },
|
|
15
|
-
[YfmHeadingAttr.Folding]: { default:
|
|
15
|
+
[YfmHeadingAttr.Folding]: { default: null },
|
|
16
16
|
},
|
|
17
17
|
content: '(text | inline)*',
|
|
18
18
|
group: 'block',
|
|
@@ -35,7 +35,7 @@ export const YfmHeadingSpecs = (builder, opts) => {
|
|
|
35
35
|
{
|
|
36
36
|
id: id || null,
|
|
37
37
|
[YfmHeadingAttr.DataLine]: lineNumber,
|
|
38
|
-
[`data-${YfmHeadingAttr.Folding}`]: folding
|
|
38
|
+
[`data-${YfmHeadingAttr.Folding}`]: folding,
|
|
39
39
|
},
|
|
40
40
|
0,
|
|
41
41
|
// [
|
|
@@ -70,14 +70,14 @@ export const YfmHeadingSpecs = (builder, opts) => {
|
|
|
70
70
|
// attrs[YfmHeadingAttr.Id] = slugify(tokens[index + 1].content);
|
|
71
71
|
// }
|
|
72
72
|
// attrs have id only if it explicitly specified manually
|
|
73
|
-
return Object.assign({ [YfmHeadingAttr.Level]: Number(token.tag.slice(1)), [YfmHeadingAttr.Folding]: (_a = token.meta) === null || _a === void 0 ? void 0 : _a.folding }, attrs);
|
|
73
|
+
return Object.assign({ [YfmHeadingAttr.Level]: Number(token.tag.slice(1)), [YfmHeadingAttr.Folding]: ((_a = token.meta) === null || _a === void 0 ? void 0 : _a.folding) === true ? true : null }, attrs);
|
|
74
74
|
},
|
|
75
75
|
},
|
|
76
76
|
},
|
|
77
77
|
toMd: (state, node) => {
|
|
78
78
|
const folding = node.attrs[YfmHeadingAttr.Folding];
|
|
79
79
|
const level = node.attrs[YfmHeadingAttr.Level];
|
|
80
|
-
state.write(state.repeat('#', level) + (folding ? '+' : '') + ' ');
|
|
80
|
+
state.write(state.repeat('#', level) + (typeof folding === 'boolean' ? '+' : '') + ' ');
|
|
81
81
|
state.renderInline(node);
|
|
82
82
|
const anchor = node.attrs[YfmHeadingAttr.Id];
|
|
83
83
|
if (anchor /*&& anchor !== node.firstChild?.textContent*/) {
|
|
@@ -4,8 +4,16 @@ export { hType, hasParentHeading, headingRule } from '../../../markdown/Heading/
|
|
|
4
4
|
export const getNodeAttrs = (level) => (node) => ({
|
|
5
5
|
[YfmHeadingAttr.Level]: level,
|
|
6
6
|
[YfmHeadingAttr.Id]: node.getAttribute('id') || '',
|
|
7
|
-
[YfmHeadingAttr.Folding]: node
|
|
7
|
+
[YfmHeadingAttr.Folding]: getFoldingAttr(node),
|
|
8
8
|
});
|
|
9
|
+
function getFoldingAttr(node) {
|
|
10
|
+
const value = node.getAttribute(`data-${YfmHeadingAttr.Folding}`);
|
|
11
|
+
if (value === 'true')
|
|
12
|
+
return true;
|
|
13
|
+
if (value === 'false')
|
|
14
|
+
return false;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
9
17
|
// export const slugify = (str: string) =>
|
|
10
18
|
// // same config as in yfm-transform
|
|
11
19
|
// // https://github.com/yandex-cloud/yfm-transform/blob/master/lib/plugins/anchors/index.js#L97-L100
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
"cut": "Cut",
|
|
18
18
|
"emoji": "Emoji",
|
|
19
19
|
"file": "File",
|
|
20
|
+
"folding-heading": "Collapsed section",
|
|
21
|
+
"folding-heading_hint": "The text under the heading can be collapsed or expanded",
|
|
20
22
|
"heading": "Heading",
|
|
21
23
|
"heading1": "Heading 1",
|
|
22
24
|
"heading2": "Heading 2",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "colorify" | "mono" | "text" | "html" | "cut" | "table" | "image" | "code_inline" | "heading" | "note" | "file" | "codeblock" | "checkbox" | "emoji" | "list" | "tabs" | "math" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "undo" | "redo" | "math_inline" | "math_block" | "colorify__color_blue" | "colorify__color_default" | "colorify__color_gray" | "colorify__color_green" | "colorify__color_orange" | "colorify__color_red" | "colorify__color_violet" | "colorify__color_yellow" | "colorify__group_text" | "hrule" | "list__action_lift" | "list__action_sink" | "list_action_disabled" | "mermaid" | "more_action" | "olist" | "ulist", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
1
|
+
export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "colorify" | "mono" | "text" | "html" | "cut" | "table" | "image" | "code_inline" | "heading" | "note" | "file" | "codeblock" | "checkbox" | "emoji" | "list" | "tabs" | "math" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "undo" | "redo" | "math_inline" | "math_block" | "colorify__color_blue" | "colorify__color_default" | "colorify__color_gray" | "colorify__color_green" | "colorify__color_orange" | "colorify__color_red" | "colorify__color_violet" | "colorify__color_yellow" | "colorify__group_text" | "folding-heading" | "folding-heading_hint" | "hrule" | "list__action_lift" | "list__action_sink" | "list_action_disabled" | "mermaid" | "more_action" | "olist" | "ulist", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
2
2
|
[key: string]: any;
|
|
3
3
|
} | undefined) => S extends G ? {
|
|
4
4
|
bold: string;
|
|
@@ -19,6 +19,8 @@ export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "str
|
|
|
19
19
|
cut: string;
|
|
20
20
|
emoji: string;
|
|
21
21
|
file: string;
|
|
22
|
+
"folding-heading": string;
|
|
23
|
+
"folding-heading_hint": string;
|
|
22
24
|
heading: string;
|
|
23
25
|
heading1: string;
|
|
24
26
|
heading2: string;
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
"cut": "Кат",
|
|
18
18
|
"emoji": "Эмодзи",
|
|
19
19
|
"file": "Файл",
|
|
20
|
+
"folding-heading": "Свёрнутый раздел",
|
|
21
|
+
"folding-heading_hint": "Текст под заголовком можно свернуть или раскрыть",
|
|
20
22
|
"heading": "Заголовок",
|
|
21
23
|
"heading1": "Заголовок 1",
|
|
22
24
|
"heading2": "Заголовок 2",
|
|
@@ -2,4 +2,4 @@ import MermaidIcon from './Mermaid';
|
|
|
2
2
|
import MonoIcon from './Mono';
|
|
3
3
|
import TabsIcon from './Tabs';
|
|
4
4
|
export { MermaidIcon, MonoIcon, TabsIcon };
|
|
5
|
-
export { ArrowUturnCcwLeft as UndoIcon, ArrowUturnCwRight as RedoIcon, Bold as BoldIcon, Italic as ItalicIcon, Underline as UnderlineIcon, Strikethrough as StrikethroughIcon, FontCursor as MarkIcon, Text as TextIcon, Heading as HeadingIcon, Heading1 as Heading1Icon, Heading2 as Heading2Icon, Heading3 as Heading3Icon, Heading4 as Heading4Icon, Heading5 as Heading5Icon, Heading6 as Heading6Icon, ListUl as ListBlIcon, ListOl as ListOlIcon, TextOutdent as LiftIcon, TextIndent as SinkIcon, Font as TextColorIcon, Link as LinkIcon, QuoteClose as QuoteIcon, Scissors as CutIcon, Sticker as NoteIcon, Paperclip as FileIcon, Minus as HRuleIcon, LayoutList as TableIcon, ChevronsExpandHorizontal as IframeIcon, SquareCheck as CheckListIcon, Picture as ImageIcon, Person as UserIcon, FaceSmile as EmojiIcon, Code as CodeInlineIcon, FileCode as CodeBlockIcon, Function as FunctionInlineIcon, CurlyBracketsFunction as FunctionBlockIcon, Hashtag as AnchorIcon, SquareDashedText as BlockIcon, LayoutColumns3 as LayoutIcon, Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, } from '@gravity-ui/icons';
|
|
5
|
+
export { ArrowUturnCcwLeft as UndoIcon, ArrowUturnCwRight as RedoIcon, Bold as BoldIcon, Italic as ItalicIcon, Underline as UnderlineIcon, Strikethrough as StrikethroughIcon, FontCursor as MarkIcon, Text as TextIcon, Heading as HeadingIcon, Heading1 as Heading1Icon, Heading2 as Heading2Icon, Heading3 as Heading3Icon, Heading4 as Heading4Icon, Heading5 as Heading5Icon, Heading6 as Heading6Icon, ListUl as ListBlIcon, ListOl as ListOlIcon, TextOutdent as LiftIcon, TextIndent as SinkIcon, Font as TextColorIcon, Link as LinkIcon, QuoteClose as QuoteIcon, Scissors as CutIcon, Sticker as NoteIcon, Paperclip as FileIcon, Minus as HRuleIcon, LayoutList as TableIcon, ChevronsExpandHorizontal as IframeIcon, SquareCheck as CheckListIcon, Picture as ImageIcon, Person as UserIcon, FaceSmile as EmojiIcon, Code as CodeInlineIcon, FileCode as CodeBlockIcon, Function as FunctionInlineIcon, CurlyBracketsFunction as FunctionBlockIcon, Hashtag as AnchorIcon, SquareDashedText as BlockIcon, LayoutColumns3 as LayoutIcon, Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, ArrowChevronRight as FoldingHeadingIcon, } from '@gravity-ui/icons';
|
package/build/esm/icons/index.js
CHANGED
|
@@ -26,4 +26,4 @@ Function as FunctionInlineIcon, CurlyBracketsFunction as FunctionBlockIcon,
|
|
|
26
26
|
//
|
|
27
27
|
Hashtag as AnchorIcon, SquareDashedText as BlockIcon, LayoutColumns3 as LayoutIcon,
|
|
28
28
|
//
|
|
29
|
-
Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, } from '@gravity-ui/icons';
|
|
29
|
+
Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, ArrowChevronRight as FoldingHeadingIcon, } from '@gravity-ui/icons';
|
|
@@ -6,10 +6,11 @@ import { isFunction } from '../lodash';
|
|
|
6
6
|
import { ToolbarTooltipDelay } from './const';
|
|
7
7
|
import './ToolbarButton.css';
|
|
8
8
|
const b = cn('toolbar-button');
|
|
9
|
-
export const ToolbarButtonView = React.forwardRef(function ToolbarButtonView({ icon, title, hotkey, disabledPopoverVisible = true, hintWhenDisabled, active, enabled, onClick, className, }, ref) {
|
|
9
|
+
export const ToolbarButtonView = React.forwardRef(function ToolbarButtonView({ icon, title, hint, hotkey, disabledPopoverVisible = true, hintWhenDisabled, active, enabled, onClick, className, }, ref) {
|
|
10
10
|
var _a;
|
|
11
11
|
const disabled = !active && !enabled;
|
|
12
12
|
const titleText = isFunction(title) ? title() : title;
|
|
13
|
+
const hintText = isFunction(hint) ? hint() : hint;
|
|
13
14
|
const hideHintWhenDisabled = hintWhenDisabled === false || !disabledPopoverVisible || !disabled;
|
|
14
15
|
const hintWhenDisabledText = typeof hintWhenDisabled === 'string'
|
|
15
16
|
? hintWhenDisabled
|
|
@@ -17,7 +18,7 @@ export const ToolbarButtonView = React.forwardRef(function ToolbarButtonView({ i
|
|
|
17
18
|
? hintWhenDisabled()
|
|
18
19
|
: i18n('toolbar_action_disabled');
|
|
19
20
|
return (React.createElement(Popover, { content: hintWhenDisabledText, disabled: hideHintWhenDisabled, tooltipContentClassName: b('action-disabled-tooltip'), placement: ['bottom'] },
|
|
20
|
-
React.createElement(ActionTooltip, { openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, title: titleText, hotkey: hotkey },
|
|
21
|
+
React.createElement(ActionTooltip, { openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, description: hintText, title: titleText, hotkey: hotkey },
|
|
21
22
|
React.createElement(Button, { size: "m", ref: ref, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), extraProps: { 'aria-label': titleText } },
|
|
22
23
|
React.createElement(Icon, { data: icon.data, size: (_a = icon.size) !== null && _a !== void 0 ? _a : 16 })))));
|
|
23
24
|
});
|
package/build/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** During build process, the current version will be injected here */
|
|
2
|
-
export const VERSION = typeof '13.
|
|
2
|
+
export const VERSION = typeof '13.6.0' !== 'undefined' ? '13.6.0' : 'unknown';
|