@gravity-ui/markdown-editor 13.5.3 → 13.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/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/plugins/folding.css +51 -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/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/plugins/folding.css +51 -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/version.js +1 -1
- package/build/styles.css +51 -0
- package/package.json +10 -5
|
@@ -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,51 @@
|
|
|
1
|
+
.pm-h-folding-hidden {
|
|
2
|
+
display: none;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.pm-h-folding-content {
|
|
6
|
+
padding-left: 28px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.pm-h-folding-separator {
|
|
10
|
+
position: relative;
|
|
11
|
+
}
|
|
12
|
+
.pm-h-folding-separator::before {
|
|
13
|
+
position: absolute;
|
|
14
|
+
z-index: 1;
|
|
15
|
+
bottom: -4px;
|
|
16
|
+
left: 0;
|
|
17
|
+
width: 12px;
|
|
18
|
+
height: 12px;
|
|
19
|
+
content: "";
|
|
20
|
+
background-color: var(--g-color-text-secondary);
|
|
21
|
+
mask-image: url('data:image/svg+xml;svg,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M2 7.25a.75.75 0 0 0 0 1.5h5.69l-2.72 2.72a.75.75 0 1 0 1.06 1.06l4-4a.75.75 0 0 0 0-1.06l-4-4a.75.75 0 0 0-1.06 1.06l2.72 2.72zm7.47 4.22a.75.75 0 1 0 1.06 1.06l4-4a.75.75 0 0 0 0-1.06l-4-4a.75.75 0 1 0-1.06 1.06L12.94 8z" clip-rule="evenodd"/></svg>');
|
|
22
|
+
mask-size: 12px;
|
|
23
|
+
transform: translateY(80%);
|
|
24
|
+
}
|
|
25
|
+
.pm-h-folding-separator::after {
|
|
26
|
+
position: absolute;
|
|
27
|
+
z-index: 1;
|
|
28
|
+
bottom: -8px;
|
|
29
|
+
left: 16px;
|
|
30
|
+
display: block;
|
|
31
|
+
width: calc(100% - 16px - 56px - 6px);
|
|
32
|
+
content: "";
|
|
33
|
+
border-top: 1px dashed var(--g-color-line-generic);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.pm-h-folding-label::after {
|
|
37
|
+
position: absolute;
|
|
38
|
+
z-index: 1;
|
|
39
|
+
right: 2px;
|
|
40
|
+
bottom: -6px;
|
|
41
|
+
display: block;
|
|
42
|
+
padding: 0 8px;
|
|
43
|
+
content: attr(data-value);
|
|
44
|
+
color: var(--g-color-text-misc);
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
background-color: var(--g-color-base-misc-medium-hover);
|
|
47
|
+
transform: translate(0, 50%);
|
|
48
|
+
font-size: var(--g-text-body-1-font-size);
|
|
49
|
+
line-height: var(--g-text-body-1-line-height);
|
|
50
|
+
font-weight: var(--g-text-body-font-weight);
|
|
51
|
+
}
|
|
@@ -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';
|
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.1' !== 'undefined' ? '13.6.1' : 'unknown';
|
package/build/styles.css
CHANGED
|
@@ -1153,6 +1153,57 @@ img.ProseMirror-separator {
|
|
|
1153
1153
|
line-height: var(--g-text-code-inline-1-line-height);
|
|
1154
1154
|
font-weight: var(--g-text-code-font-weight);
|
|
1155
1155
|
}
|
|
1156
|
+
.pm-h-folding-hidden {
|
|
1157
|
+
display: none;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
.pm-h-folding-content {
|
|
1161
|
+
padding-left: 28px;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
.pm-h-folding-separator {
|
|
1165
|
+
position: relative;
|
|
1166
|
+
}
|
|
1167
|
+
.pm-h-folding-separator::before {
|
|
1168
|
+
position: absolute;
|
|
1169
|
+
z-index: 1;
|
|
1170
|
+
bottom: -4px;
|
|
1171
|
+
left: 0;
|
|
1172
|
+
width: 12px;
|
|
1173
|
+
height: 12px;
|
|
1174
|
+
content: "";
|
|
1175
|
+
background-color: var(--g-color-text-secondary);
|
|
1176
|
+
mask-image: url('data:image/svg+xml;svg,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M2 7.25a.75.75 0 0 0 0 1.5h5.69l-2.72 2.72a.75.75 0 1 0 1.06 1.06l4-4a.75.75 0 0 0 0-1.06l-4-4a.75.75 0 0 0-1.06 1.06l2.72 2.72zm7.47 4.22a.75.75 0 1 0 1.06 1.06l4-4a.75.75 0 0 0 0-1.06l-4-4a.75.75 0 1 0-1.06 1.06L12.94 8z" clip-rule="evenodd"/></svg>');
|
|
1177
|
+
mask-size: 12px;
|
|
1178
|
+
transform: translateY(80%);
|
|
1179
|
+
}
|
|
1180
|
+
.pm-h-folding-separator::after {
|
|
1181
|
+
position: absolute;
|
|
1182
|
+
z-index: 1;
|
|
1183
|
+
bottom: -8px;
|
|
1184
|
+
left: 16px;
|
|
1185
|
+
display: block;
|
|
1186
|
+
width: calc(100% - 16px - 56px - 6px);
|
|
1187
|
+
content: "";
|
|
1188
|
+
border-top: 1px dashed var(--g-color-line-generic);
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
.pm-h-folding-label::after {
|
|
1192
|
+
position: absolute;
|
|
1193
|
+
z-index: 1;
|
|
1194
|
+
right: 2px;
|
|
1195
|
+
bottom: -6px;
|
|
1196
|
+
display: block;
|
|
1197
|
+
padding: 0 8px;
|
|
1198
|
+
content: attr(data-value);
|
|
1199
|
+
color: var(--g-color-text-misc);
|
|
1200
|
+
border-radius: 4px;
|
|
1201
|
+
background-color: var(--g-color-base-misc-medium-hover);
|
|
1202
|
+
transform: translate(0, 50%);
|
|
1203
|
+
font-size: var(--g-text-body-1-font-size);
|
|
1204
|
+
line-height: var(--g-text-body-1-line-height);
|
|
1205
|
+
font-weight: var(--g-text-body-font-weight);
|
|
1206
|
+
}
|
|
1156
1207
|
.g-md-image-skeleton {
|
|
1157
1208
|
vertical-align: middle;
|
|
1158
1209
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravity-ui/markdown-editor",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.6.1",
|
|
4
4
|
"description": "Markdown wysiwyg and markup editor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"@codemirror/state": "6.4.1",
|
|
168
168
|
"@codemirror/view": "6.26.3",
|
|
169
169
|
"@gravity-ui/i18n": "^1.1.0",
|
|
170
|
-
"@gravity-ui/icons": "^2.
|
|
170
|
+
"@gravity-ui/icons": "^2.10.0",
|
|
171
171
|
"@lezer/highlight": "1.2.0",
|
|
172
172
|
"@lezer/markdown": "1.3.0",
|
|
173
173
|
"@types/is-number": "^7.0.1",
|
|
@@ -199,6 +199,7 @@
|
|
|
199
199
|
"tslib": "^2.3.1"
|
|
200
200
|
},
|
|
201
201
|
"devDependencies": {
|
|
202
|
+
"@diplodoc/folding-headings-extension": "0.1.0",
|
|
202
203
|
"@diplodoc/html-extension": "1.2.7",
|
|
203
204
|
"@diplodoc/latex-extension": "1.0.3",
|
|
204
205
|
"@diplodoc/mermaid-extension": "1.2.1",
|
|
@@ -252,13 +253,16 @@
|
|
|
252
253
|
"typescript": "^4.5.2"
|
|
253
254
|
},
|
|
254
255
|
"peerDependenciesMeta": {
|
|
255
|
-
"@diplodoc/
|
|
256
|
+
"@diplodoc/folding-headings-extension": {
|
|
256
257
|
"optional": true
|
|
257
258
|
},
|
|
258
|
-
"@diplodoc/
|
|
259
|
+
"@diplodoc/html-extension": {
|
|
259
260
|
"optional": true
|
|
260
261
|
},
|
|
261
|
-
"@diplodoc/
|
|
262
|
+
"@diplodoc/latex-extension": {
|
|
263
|
+
"optional": true
|
|
264
|
+
},
|
|
265
|
+
"@diplodoc/mermaid-extension": {
|
|
262
266
|
"optional": true
|
|
263
267
|
},
|
|
264
268
|
"highlight.js": {
|
|
@@ -269,6 +273,7 @@
|
|
|
269
273
|
}
|
|
270
274
|
},
|
|
271
275
|
"peerDependencies": {
|
|
276
|
+
"@diplodoc/folding-headings-extension": "^0.1.0",
|
|
272
277
|
"@diplodoc/html-extension": "^1.2.7",
|
|
273
278
|
"@diplodoc/latex-extension": "^1.0.3",
|
|
274
279
|
"@diplodoc/mermaid-extension": "^1.0.0",
|