@cloud-ru/ds-markdown 1.0.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/CHANGELOG.md +8 -0
- package/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/cjs/components/Markdown/CodeBlock.d.ts +9 -0
- package/dist/cjs/components/Markdown/CodeBlock.js +58 -0
- package/dist/cjs/components/Markdown/Markdown.d.ts +2 -0
- package/dist/cjs/components/Markdown/Markdown.js +25 -0
- package/dist/cjs/components/Markdown/index.d.ts +1 -0
- package/dist/cjs/components/Markdown/index.js +17 -0
- package/dist/cjs/components/Markdown/styles.module.css +205 -0
- package/dist/cjs/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
- package/dist/cjs/components/MarkdownEditor/MarkdownEditor.js +176 -0
- package/dist/cjs/components/MarkdownEditor/index.d.ts +1 -0
- package/dist/cjs/components/MarkdownEditor/index.js +17 -0
- package/dist/cjs/components/MarkdownEditor/styles.module.css +273 -0
- package/dist/cjs/components/Toolbar/Toolbar.d.ts +9 -0
- package/dist/cjs/components/Toolbar/Toolbar.js +173 -0
- package/dist/cjs/components/Toolbar/constants.d.ts +13 -0
- package/dist/cjs/components/Toolbar/constants.js +40 -0
- package/dist/cjs/components/Toolbar/hooks/index.d.ts +2 -0
- package/dist/cjs/components/Toolbar/hooks/index.js +18 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.js +59 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.js +87 -0
- package/dist/cjs/components/Toolbar/index.d.ts +2 -0
- package/dist/cjs/components/Toolbar/index.js +20 -0
- package/dist/cjs/components/Toolbar/styles.module.css +17 -0
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +20 -0
- package/dist/cjs/constants.d.ts +65 -0
- package/dist/cjs/constants.js +67 -0
- package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
- package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.js +61 -0
- package/dist/cjs/helperComponents/ButtonHeading/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ButtonHeading/index.js +17 -0
- package/dist/cjs/helperComponents/ButtonHeading/styles.module.css +3 -0
- package/dist/cjs/helperComponents/Buttons/Buttons.d.ts +10 -0
- package/dist/cjs/helperComponents/Buttons/Buttons.js +21 -0
- package/dist/cjs/helperComponents/Buttons/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Buttons/index.js +17 -0
- package/dist/cjs/helperComponents/Buttons/styles.module.css +17 -0
- package/dist/cjs/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
- package/dist/cjs/helperComponents/Modals/CustomizeTableModal.js +39 -0
- package/dist/cjs/helperComponents/Modals/ImageModal.d.ts +7 -0
- package/dist/cjs/helperComponents/Modals/ImageModal.js +44 -0
- package/dist/cjs/helperComponents/Modals/LinkModal.d.ts +13 -0
- package/dist/cjs/helperComponents/Modals/LinkModal.js +42 -0
- package/dist/cjs/helperComponents/Modals/index.d.ts +3 -0
- package/dist/cjs/helperComponents/Modals/index.js +19 -0
- package/dist/cjs/helperComponents/Modals/styles.module.css +17 -0
- package/dist/cjs/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
- package/dist/cjs/helperComponents/PrivateButton/PrivateButton.js +27 -0
- package/dist/cjs/helperComponents/PrivateButton/index.d.ts +1 -0
- package/dist/cjs/helperComponents/PrivateButton/index.js +17 -0
- package/dist/cjs/helperComponents/PrivateButton/styles.module.css +140 -0
- package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
- package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.js +12 -0
- package/dist/cjs/helperComponents/TableSelectItem/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TableSelectItem/index.js +17 -0
- package/dist/cjs/helperComponents/TableSelectItem/styles.module.css +101 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +27 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.js +17 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
- package/dist/cjs/helperComponents/index.d.ts +6 -0
- package/dist/cjs/helperComponents/index.js +22 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/locale/index.d.ts +199 -0
- package/dist/cjs/locale/index.js +104 -0
- package/dist/cjs/lowlight.d.ts +14 -0
- package/dist/cjs/lowlight.js +35 -0
- package/dist/cjs/mixins.css +0 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/rawMarkdownCommands.d.ts +16 -0
- package/dist/cjs/rawMarkdownCommands.js +145 -0
- package/dist/cjs/style.css +875 -0
- package/dist/cjs/styles/syntax.module.css +47 -0
- package/dist/cjs/toolbarApi.d.ts +33 -0
- package/dist/cjs/toolbarApi.js +100 -0
- package/dist/cjs/types.d.ts +52 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/components/Markdown/CodeBlock.d.ts +9 -0
- package/dist/esm/components/Markdown/CodeBlock.js +52 -0
- package/dist/esm/components/Markdown/Markdown.d.ts +2 -0
- package/dist/esm/components/Markdown/Markdown.js +19 -0
- package/dist/esm/components/Markdown/index.d.ts +1 -0
- package/dist/esm/components/Markdown/index.js +1 -0
- package/dist/esm/components/Markdown/styles.module.css +205 -0
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.js +170 -0
- package/dist/esm/components/MarkdownEditor/index.d.ts +1 -0
- package/dist/esm/components/MarkdownEditor/index.js +1 -0
- package/dist/esm/components/MarkdownEditor/styles.module.css +273 -0
- package/dist/esm/components/Toolbar/Toolbar.d.ts +9 -0
- package/dist/esm/components/Toolbar/Toolbar.js +167 -0
- package/dist/esm/components/Toolbar/constants.d.ts +13 -0
- package/dist/esm/components/Toolbar/constants.js +37 -0
- package/dist/esm/components/Toolbar/hooks/index.d.ts +2 -0
- package/dist/esm/components/Toolbar/hooks/index.js +2 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.js +56 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.js +84 -0
- package/dist/esm/components/Toolbar/index.d.ts +2 -0
- package/dist/esm/components/Toolbar/index.js +2 -0
- package/dist/esm/components/Toolbar/styles.module.css +17 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +4 -0
- package/dist/esm/constants.d.ts +65 -0
- package/dist/esm/constants.js +61 -0
- package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
- package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.js +55 -0
- package/dist/esm/helperComponents/ButtonHeading/index.d.ts +1 -0
- package/dist/esm/helperComponents/ButtonHeading/index.js +1 -0
- package/dist/esm/helperComponents/ButtonHeading/styles.module.css +3 -0
- package/dist/esm/helperComponents/Buttons/Buttons.d.ts +10 -0
- package/dist/esm/helperComponents/Buttons/Buttons.js +13 -0
- package/dist/esm/helperComponents/Buttons/index.d.ts +1 -0
- package/dist/esm/helperComponents/Buttons/index.js +1 -0
- package/dist/esm/helperComponents/Buttons/styles.module.css +17 -0
- package/dist/esm/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
- package/dist/esm/helperComponents/Modals/CustomizeTableModal.js +33 -0
- package/dist/esm/helperComponents/Modals/ImageModal.d.ts +7 -0
- package/dist/esm/helperComponents/Modals/ImageModal.js +38 -0
- package/dist/esm/helperComponents/Modals/LinkModal.d.ts +13 -0
- package/dist/esm/helperComponents/Modals/LinkModal.js +36 -0
- package/dist/esm/helperComponents/Modals/index.d.ts +3 -0
- package/dist/esm/helperComponents/Modals/index.js +3 -0
- package/dist/esm/helperComponents/Modals/styles.module.css +17 -0
- package/dist/esm/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
- package/dist/esm/helperComponents/PrivateButton/PrivateButton.js +21 -0
- package/dist/esm/helperComponents/PrivateButton/index.d.ts +1 -0
- package/dist/esm/helperComponents/PrivateButton/index.js +1 -0
- package/dist/esm/helperComponents/PrivateButton/styles.module.css +140 -0
- package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
- package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.js +6 -0
- package/dist/esm/helperComponents/TableSelectItem/index.d.ts +1 -0
- package/dist/esm/helperComponents/TableSelectItem/index.js +1 -0
- package/dist/esm/helperComponents/TableSelectItem/styles.module.css +101 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +21 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/index.js +1 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
- package/dist/esm/helperComponents/index.d.ts +6 -0
- package/dist/esm/helperComponents/index.js +6 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/locale/index.d.ts +199 -0
- package/dist/esm/locale/index.js +101 -0
- package/dist/esm/lowlight.d.ts +14 -0
- package/dist/esm/lowlight.js +29 -0
- package/dist/esm/mixins.css +0 -0
- package/dist/esm/rawMarkdownCommands.d.ts +16 -0
- package/dist/esm/rawMarkdownCommands.js +135 -0
- package/dist/esm/style.css +875 -0
- package/dist/esm/styles/syntax.module.css +47 -0
- package/dist/esm/toolbarApi.d.ts +33 -0
- package/dist/esm/toolbarApi.js +96 -0
- package/dist/esm/types.d.ts +52 -0
- package/dist/esm/types.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +84 -0
- package/src/components/Markdown/CodeBlock.tsx +96 -0
- package/src/components/Markdown/Markdown.tsx +47 -0
- package/src/components/Markdown/index.ts +1 -0
- package/src/components/Markdown/styles.module.scss +105 -0
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +322 -0
- package/src/components/MarkdownEditor/index.ts +1 -0
- package/src/components/MarkdownEditor/styles.module.scss +201 -0
- package/src/components/Toolbar/Toolbar.tsx +292 -0
- package/src/components/Toolbar/constants.tsx +63 -0
- package/src/components/Toolbar/hooks/index.ts +2 -0
- package/src/components/Toolbar/hooks/useToolbarHotkeys.ts +74 -0
- package/src/components/Toolbar/hooks/useToolbarOverflow.ts +102 -0
- package/src/components/Toolbar/index.ts +2 -0
- package/src/components/Toolbar/styles.module.scss +29 -0
- package/src/components/index.ts +4 -0
- package/src/constants.ts +67 -0
- package/src/helperComponents/ButtonHeading/ButtonHeading.tsx +100 -0
- package/src/helperComponents/ButtonHeading/index.ts +1 -0
- package/src/helperComponents/ButtonHeading/styles.module.scss +5 -0
- package/src/helperComponents/Buttons/Buttons.tsx +30 -0
- package/src/helperComponents/Buttons/index.ts +1 -0
- package/src/helperComponents/Buttons/styles.module.scss +26 -0
- package/src/helperComponents/Modals/CustomizeTableModal.tsx +82 -0
- package/src/helperComponents/Modals/ImageModal.tsx +84 -0
- package/src/helperComponents/Modals/LinkModal.tsx +92 -0
- package/src/helperComponents/Modals/index.ts +3 -0
- package/src/helperComponents/Modals/styles.module.scss +21 -0
- package/src/helperComponents/PrivateButton/PrivateButton.tsx +88 -0
- package/src/helperComponents/PrivateButton/index.ts +1 -0
- package/src/helperComponents/PrivateButton/styles.module.scss +77 -0
- package/src/helperComponents/TableSelectItem/TableSelectItem.tsx +43 -0
- package/src/helperComponents/TableSelectItem/index.ts +1 -0
- package/src/helperComponents/TableSelectItem/styles.module.scss +26 -0
- package/src/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.tsx +48 -0
- package/src/helperComponents/TableSelectSettingsGrid/index.ts +1 -0
- package/src/helperComponents/TableSelectSettingsGrid/styles.module.scss +65 -0
- package/src/helperComponents/index.ts +6 -0
- package/src/index.ts +4 -0
- package/src/locale/index.ts +105 -0
- package/src/lowlight.ts +30 -0
- package/src/mixins.scss +123 -0
- package/src/rawMarkdownCommands.ts +179 -0
- package/src/styles/syntax.module.scss +54 -0
- package/src/toolbarApi.ts +152 -0
- package/src/types.ts +56 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useToolbarOverflow = useToolbarOverflow;
|
|
4
|
+
const utils_1 = require("@cloud-ru/ds-utils");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
/**
|
|
7
|
+
* Считает, сколько кнопок тулбара помещается по ширине, остальные — в overflow («Ещё»).
|
|
8
|
+
* Возвращает `rootRef` (корень тулбара, под ResizeObserver), `moreButtonRef` (для измерения
|
|
9
|
+
* «веса» overflow-группы) и `visibleCount` (число видимых кнопок).
|
|
10
|
+
*
|
|
11
|
+
* Края слотов кэшируются в полной раскладке (все кнопки, без More) и переиспользуются при
|
|
12
|
+
* пересчёте — поэтому не нужно арифметически приближать гэпы/дивайдеры.
|
|
13
|
+
*/
|
|
14
|
+
function useToolbarOverflow(items) {
|
|
15
|
+
const rootRef = (0, react_1.useRef)(null);
|
|
16
|
+
const moreButtonRef = (0, react_1.useRef)(null);
|
|
17
|
+
// Правый край каждого слота (отн. левого края тулбара), измеренный в ПОЛНОЙ раскладке.
|
|
18
|
+
const slotEdgesRef = (0, react_1.useRef)(new Map());
|
|
19
|
+
// Реальная ширина группы «дивайдер + More» — измеряется, когда More присутствует в DOM.
|
|
20
|
+
const moreReserveRef = (0, react_1.useRef)(48);
|
|
21
|
+
const [visibleCount, setVisibleCount] = (0, react_1.useState)(items.length);
|
|
22
|
+
(0, utils_1.useLayoutEffect)(() => {
|
|
23
|
+
const root = rootRef.current;
|
|
24
|
+
if (!root) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const edges = slotEdgesRef.current;
|
|
28
|
+
edges.clear();
|
|
29
|
+
let rafId = 0;
|
|
30
|
+
const measure = () => {
|
|
31
|
+
const rootRect = root.getBoundingClientRect();
|
|
32
|
+
const padRight = parseFloat(getComputedStyle(root).paddingRight) || 0;
|
|
33
|
+
// Правая граница контентной области тулбара (отн. левого края root).
|
|
34
|
+
const limit = root.clientWidth - padRight;
|
|
35
|
+
const slots = Array.from(root.querySelectorAll('[data-toolbar-slot]'));
|
|
36
|
+
// Кэшируем края только в полной раскладке (все items, без More) — иначе край
|
|
37
|
+
// зависел бы от текущего visibleCount/набора дивайдеров и был бы неверным для пересчёта.
|
|
38
|
+
if (slots.length === items.length) {
|
|
39
|
+
for (const slot of slots) {
|
|
40
|
+
const id = slot.dataset.toolbarItem;
|
|
41
|
+
if (id) {
|
|
42
|
+
edges.set(id, slot.getBoundingClientRect().right - rootRect.left);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Реальный «вес» More-группы (дивайдер + гэпы + кнопка): от правого края последнего
|
|
47
|
+
// видимого слота до правого края More-кнопки. Уточняется, как только More появляется.
|
|
48
|
+
const moreEl = moreButtonRef.current;
|
|
49
|
+
if (moreEl && slots.length > 0) {
|
|
50
|
+
const lastRight = slots[slots.length - 1].getBoundingClientRect().right - rootRect.left - moreReserveRef.current;
|
|
51
|
+
moreReserveRef.current = moreEl.getBoundingClientRect().right - rootRect.left - lastRight;
|
|
52
|
+
}
|
|
53
|
+
// Края ещё не собраны (нет полного рендера, напр. items только что изменились) —
|
|
54
|
+
// показываем всё и перезамеряем на следующем кадре, когда все слоты окажутся в DOM.
|
|
55
|
+
if (!items.every(id => edges.has(id))) {
|
|
56
|
+
setVisibleCount(items.length);
|
|
57
|
+
rafId = requestAnimationFrame(measure);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Всё помещается без overflow — показываем все кнопки, без More.
|
|
61
|
+
const fullRight = edges.get(items[items.length - 1]) ?? 0;
|
|
62
|
+
if (fullRight <= limit) {
|
|
63
|
+
setVisibleCount(items.length);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Иначе — максимум k кнопок, после которых ещё влезает группа «│ More».
|
|
67
|
+
const reserve = moreReserveRef.current;
|
|
68
|
+
let fits = 0;
|
|
69
|
+
for (const id of items) {
|
|
70
|
+
if ((edges.get(id) ?? 0) + reserve > limit) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
fits += 1;
|
|
74
|
+
}
|
|
75
|
+
setVisibleCount(Math.max(fits, 1));
|
|
76
|
+
};
|
|
77
|
+
measure();
|
|
78
|
+
const observer = new ResizeObserver(measure);
|
|
79
|
+
observer.observe(root);
|
|
80
|
+
return () => {
|
|
81
|
+
observer.disconnect();
|
|
82
|
+
if (rafId)
|
|
83
|
+
cancelAnimationFrame(rafId);
|
|
84
|
+
};
|
|
85
|
+
}, [items]);
|
|
86
|
+
return { rootRef, moreButtonRef, visibleCount };
|
|
87
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.DEFAULT_TOOLBAR = void 0;
|
|
18
|
+
__exportStar(require("./Toolbar"), exports);
|
|
19
|
+
var constants_1 = require("./constants");
|
|
20
|
+
Object.defineProperty(exports, "DEFAULT_TOOLBAR", { enumerable: true, get: function () { return constants_1.DEFAULT_TOOLBAR; } });
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.root{
|
|
2
|
+
overflow:hidden;
|
|
3
|
+
display:flex;
|
|
4
|
+
flex-shrink:0;
|
|
5
|
+
align-items:center;
|
|
6
|
+
box-sizing:border-box;
|
|
7
|
+
padding:var(--sn-markdown-anatomy-size-buttons-paddingTop, var(--sn-primitive-dimension-8, 8px)) var(--sn-markdown-anatomy-size-buttons-paddingHorizontal, var(--sn-primitive-dimension-8, 8px)) var(--sn-markdown-anatomy-size-buttons-paddingBottom, var(--sn-primitive-dimension-6, 6px));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.tooltipTrigger{
|
|
11
|
+
display:inline-flex;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.tableCustomizeOption{
|
|
15
|
+
align-items:flex-start;
|
|
16
|
+
align-self:center;
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// Публичные компоненты пакета. Toolbar — внутренний,
|
|
18
|
+
// импортируется напрямую по относительным путям и наружу не экспортируется.
|
|
19
|
+
__exportStar(require("./Markdown"), exports);
|
|
20
|
+
__exportStar(require("./MarkdownEditor"), exports);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export declare const TOOLBAR_ITEM: {
|
|
2
|
+
readonly Heading: "heading";
|
|
3
|
+
readonly Bold: "bold";
|
|
4
|
+
readonly Italic: "italic";
|
|
5
|
+
readonly Strikethrough: "strikethrough";
|
|
6
|
+
readonly Link: "link";
|
|
7
|
+
readonly InlineCode: "inline-code";
|
|
8
|
+
readonly BulletList: "bullet-list";
|
|
9
|
+
readonly OrderedList: "ordered-list";
|
|
10
|
+
readonly BlockQuote: "block-quote";
|
|
11
|
+
readonly BlockCode: "block-code";
|
|
12
|
+
readonly Table: "table";
|
|
13
|
+
readonly Image: "image";
|
|
14
|
+
};
|
|
15
|
+
export declare const HEADING_LEVEL: {
|
|
16
|
+
readonly H1: 1;
|
|
17
|
+
readonly H2: 2;
|
|
18
|
+
readonly H3: 3;
|
|
19
|
+
readonly H4: 4;
|
|
20
|
+
readonly H5: 5;
|
|
21
|
+
};
|
|
22
|
+
export declare const ON_CHANGE_DEBOUNCE_MS = 150;
|
|
23
|
+
export declare const TEST_IDS: {
|
|
24
|
+
readonly viewer: "markdown";
|
|
25
|
+
readonly viewerCodeCopy: "markdown__code-copy";
|
|
26
|
+
readonly editor: "markdown-editor";
|
|
27
|
+
readonly editorHeader: "markdown-editor__header";
|
|
28
|
+
readonly editorPreviewToggle: "markdown-editor__preview-toggle";
|
|
29
|
+
readonly editorLabel: "markdown-editor__label";
|
|
30
|
+
readonly editorClear: "markdown-editor__clear";
|
|
31
|
+
readonly editorContent: "markdown-editor__content";
|
|
32
|
+
readonly editorField: "markdown-editor__field";
|
|
33
|
+
readonly editorRawInput: "markdown-editor__raw-input";
|
|
34
|
+
readonly toolbar: "markdown-editor__toolbar";
|
|
35
|
+
readonly toolbarButton: "markdown-editor__toolbar-button";
|
|
36
|
+
readonly toolbarMore: "markdown-editor__toolbar-more";
|
|
37
|
+
readonly toolbarMoreList: "markdown-editor__toolbar-more-list";
|
|
38
|
+
readonly toolbarHeading: "markdown-editor__toolbar-heading";
|
|
39
|
+
readonly headingDropdown: "markdown-editor__heading-dropdown";
|
|
40
|
+
readonly headingOption: "markdown-editor__heading-option";
|
|
41
|
+
readonly tableGridPicker: "markdown-editor__table-picker";
|
|
42
|
+
readonly tablePickerCell: "markdown-editor__table-cell";
|
|
43
|
+
readonly tableCustomize: "markdown-editor__table-customize";
|
|
44
|
+
readonly customizeModal: "markdown-editor__customize-table";
|
|
45
|
+
readonly customizeColumns: "markdown-editor__customize-table-columns";
|
|
46
|
+
readonly customizeRows: "markdown-editor__customize-table-rows";
|
|
47
|
+
readonly customizeCancel: "markdown-editor__customize-table-cancel";
|
|
48
|
+
readonly customizeAdd: "markdown-editor__customize-table-add";
|
|
49
|
+
readonly linkModal: "markdown-editor__link-modal";
|
|
50
|
+
readonly linkModalUrl: "markdown-editor__link-modal-url";
|
|
51
|
+
readonly linkModalTitle: "markdown-editor__link-modal-title";
|
|
52
|
+
readonly linkModalCancel: "markdown-editor__link-modal-cancel";
|
|
53
|
+
readonly linkModalAdd: "markdown-editor__link-modal-add";
|
|
54
|
+
readonly imageModal: "markdown-editor__image-modal";
|
|
55
|
+
readonly imageModalUrl: "markdown-editor__image-modal-url";
|
|
56
|
+
readonly imageModalAlt: "markdown-editor__image-modal-alt";
|
|
57
|
+
readonly imageModalCancel: "markdown-editor__image-modal-cancel";
|
|
58
|
+
readonly imageModalAdd: "markdown-editor__image-modal-add";
|
|
59
|
+
};
|
|
60
|
+
/** Стабильный data-test-id конкретной кнопки тулбара (`markdown-editor__toolbar-button--bold`). */
|
|
61
|
+
export declare const toolbarButtonTestId: (item: string) => string;
|
|
62
|
+
/** data-test-id пункта heading-дропдауна (`…__heading-option--paragraph` | `…--2`). */
|
|
63
|
+
export declare const headingOptionTestId: (level: number | "paragraph") => string;
|
|
64
|
+
/** data-test-id ячейки table-picker'а (`…__table-cell--2x3`). */
|
|
65
|
+
export declare const tableCellTestId: (rows: number, cols: number) => string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tableCellTestId = exports.headingOptionTestId = exports.toolbarButtonTestId = exports.TEST_IDS = exports.ON_CHANGE_DEBOUNCE_MS = exports.HEADING_LEVEL = exports.TOOLBAR_ITEM = void 0;
|
|
4
|
+
exports.TOOLBAR_ITEM = {
|
|
5
|
+
Heading: 'heading',
|
|
6
|
+
Bold: 'bold',
|
|
7
|
+
Italic: 'italic',
|
|
8
|
+
Strikethrough: 'strikethrough',
|
|
9
|
+
Link: 'link',
|
|
10
|
+
InlineCode: 'inline-code',
|
|
11
|
+
BulletList: 'bullet-list',
|
|
12
|
+
OrderedList: 'ordered-list',
|
|
13
|
+
BlockQuote: 'block-quote',
|
|
14
|
+
BlockCode: 'block-code',
|
|
15
|
+
Table: 'table',
|
|
16
|
+
Image: 'image',
|
|
17
|
+
};
|
|
18
|
+
exports.HEADING_LEVEL = { H1: 1, H2: 2, H3: 3, H4: 4, H5: 5 };
|
|
19
|
+
exports.ON_CHANGE_DEBOUNCE_MS = 150;
|
|
20
|
+
exports.TEST_IDS = {
|
|
21
|
+
viewer: 'markdown',
|
|
22
|
+
viewerCodeCopy: 'markdown__code-copy',
|
|
23
|
+
editor: 'markdown-editor',
|
|
24
|
+
editorHeader: 'markdown-editor__header',
|
|
25
|
+
editorPreviewToggle: 'markdown-editor__preview-toggle',
|
|
26
|
+
editorLabel: 'markdown-editor__label',
|
|
27
|
+
editorClear: 'markdown-editor__clear',
|
|
28
|
+
editorContent: 'markdown-editor__content',
|
|
29
|
+
// Оболочка поля (FieldShell из @cloud-ru/ds-fields) — общая для raw и preview.
|
|
30
|
+
editorField: 'markdown-editor__field',
|
|
31
|
+
// Нативная textarea в raw-режиме.
|
|
32
|
+
editorRawInput: 'markdown-editor__raw-input',
|
|
33
|
+
toolbar: 'markdown-editor__toolbar',
|
|
34
|
+
toolbarButton: 'markdown-editor__toolbar-button',
|
|
35
|
+
toolbarMore: 'markdown-editor__toolbar-more',
|
|
36
|
+
toolbarMoreList: 'markdown-editor__toolbar-more-list',
|
|
37
|
+
toolbarHeading: 'markdown-editor__toolbar-heading',
|
|
38
|
+
headingDropdown: 'markdown-editor__heading-dropdown',
|
|
39
|
+
headingOption: 'markdown-editor__heading-option',
|
|
40
|
+
tableGridPicker: 'markdown-editor__table-picker',
|
|
41
|
+
tablePickerCell: 'markdown-editor__table-cell',
|
|
42
|
+
tableCustomize: 'markdown-editor__table-customize',
|
|
43
|
+
customizeModal: 'markdown-editor__customize-table',
|
|
44
|
+
customizeColumns: 'markdown-editor__customize-table-columns',
|
|
45
|
+
customizeRows: 'markdown-editor__customize-table-rows',
|
|
46
|
+
customizeCancel: 'markdown-editor__customize-table-cancel',
|
|
47
|
+
customizeAdd: 'markdown-editor__customize-table-add',
|
|
48
|
+
linkModal: 'markdown-editor__link-modal',
|
|
49
|
+
linkModalUrl: 'markdown-editor__link-modal-url',
|
|
50
|
+
linkModalTitle: 'markdown-editor__link-modal-title',
|
|
51
|
+
linkModalCancel: 'markdown-editor__link-modal-cancel',
|
|
52
|
+
linkModalAdd: 'markdown-editor__link-modal-add',
|
|
53
|
+
imageModal: 'markdown-editor__image-modal',
|
|
54
|
+
imageModalUrl: 'markdown-editor__image-modal-url',
|
|
55
|
+
imageModalAlt: 'markdown-editor__image-modal-alt',
|
|
56
|
+
imageModalCancel: 'markdown-editor__image-modal-cancel',
|
|
57
|
+
imageModalAdd: 'markdown-editor__image-modal-add',
|
|
58
|
+
};
|
|
59
|
+
/** Стабильный data-test-id конкретной кнопки тулбара (`markdown-editor__toolbar-button--bold`). */
|
|
60
|
+
const toolbarButtonTestId = (item) => `${exports.TEST_IDS.toolbarButton}--${item}`;
|
|
61
|
+
exports.toolbarButtonTestId = toolbarButtonTestId;
|
|
62
|
+
/** data-test-id пункта heading-дропдауна (`…__heading-option--paragraph` | `…--2`). */
|
|
63
|
+
const headingOptionTestId = (level) => `${exports.TEST_IDS.headingOption}--${level}`;
|
|
64
|
+
exports.headingOptionTestId = headingOptionTestId;
|
|
65
|
+
/** data-test-id ячейки table-picker'а (`…__table-cell--2x3`). */
|
|
66
|
+
const tableCellTestId = (rows, cols) => `${exports.TEST_IDS.tablePickerCell}--${rows}x${cols}`;
|
|
67
|
+
exports.tableCellTestId = tableCellTestId;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ToolbarApi } from '../../toolbarApi';
|
|
2
|
+
export type ButtonHeadingProps = {
|
|
3
|
+
/** Бэкенд команд тулбара (WYSIWYG либо raw markdown). */
|
|
4
|
+
api: ToolbarApi;
|
|
5
|
+
};
|
|
6
|
+
export declare function ButtonHeading({ api }: ButtonHeadingProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ButtonHeading = ButtonHeading;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const system_1 = require("@cloud-ru/ds-icons/interface/system");
|
|
9
|
+
const list_1 = require("@cloud-ru/ds-list");
|
|
10
|
+
const portal_context_1 = require("@cloud-ru/ds-portal-context");
|
|
11
|
+
const react_1 = require("react");
|
|
12
|
+
const constants_1 = require("../../constants");
|
|
13
|
+
const locale_1 = require("../../locale");
|
|
14
|
+
const PrivateButton_1 = require("../PrivateButton");
|
|
15
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
16
|
+
// Кнопка-триггер выбора уровня заголовка: иконка текущего уровня. Открывает Droplist со списком уровней.
|
|
17
|
+
const HEADING_LEVELS = [1, 2, 3, 4, 5];
|
|
18
|
+
const ICON_FOR = {
|
|
19
|
+
1: system_1.Heading1SVG,
|
|
20
|
+
2: system_1.Heading2SVG,
|
|
21
|
+
3: system_1.Heading3SVG,
|
|
22
|
+
4: system_1.Heading4SVG,
|
|
23
|
+
5: system_1.Heading5SVG,
|
|
24
|
+
};
|
|
25
|
+
function ButtonHeading({ api }) {
|
|
26
|
+
const portalContext = (0, portal_context_1.usePortalContext)();
|
|
27
|
+
const { t } = locale_1.markdownLocale.useTranslations();
|
|
28
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
29
|
+
const activeLevel = HEADING_LEVELS.find(lvl => api.isHeadingActive(lvl));
|
|
30
|
+
const TriggerIcon = activeLevel != null ? ICON_FOR[activeLevel] : system_1.HeadingSVG;
|
|
31
|
+
const selectLevel = (lvl) => {
|
|
32
|
+
if (lvl == null) {
|
|
33
|
+
api.setParagraph();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
api.toggleHeading(lvl);
|
|
37
|
+
}
|
|
38
|
+
setOpen(false);
|
|
39
|
+
};
|
|
40
|
+
const items = [
|
|
41
|
+
{
|
|
42
|
+
id: 'paragraph',
|
|
43
|
+
content: { label: 'Paragraph' },
|
|
44
|
+
checked: activeLevel == null,
|
|
45
|
+
onClick: () => selectLevel(null),
|
|
46
|
+
'data-test-id': (0, constants_1.headingOptionTestId)('paragraph'),
|
|
47
|
+
},
|
|
48
|
+
...HEADING_LEVELS.map((lvl) => {
|
|
49
|
+
const Icon = ICON_FOR[lvl];
|
|
50
|
+
return {
|
|
51
|
+
id: `heading-${lvl}`,
|
|
52
|
+
beforeContent: (0, jsx_runtime_1.jsx)(Icon, {}),
|
|
53
|
+
content: { label: `Heading ${lvl}` },
|
|
54
|
+
checked: activeLevel === lvl,
|
|
55
|
+
onClick: () => selectLevel(lvl),
|
|
56
|
+
'data-test-id': (0, constants_1.headingOptionTestId)(lvl),
|
|
57
|
+
};
|
|
58
|
+
}),
|
|
59
|
+
];
|
|
60
|
+
return ((0, jsx_runtime_1.jsx)(list_1.Droplist, { size: 'm', selection: { mode: 'single', value: activeLevel }, container: portalContext, open: open, onOpenChange: setOpen, placement: 'bottom-start', items: items, triggerClassName: styles_module_scss_1.default.trigger, "data-test-id": constants_1.TEST_IDS.headingDropdown, children: (0, jsx_runtime_1.jsx)(PrivateButton_1.PrivateButton, { icon: (0, jsx_runtime_1.jsx)(TriggerIcon, {}), tip: { title: t('toolbar.heading') }, withChevron: true, checked: activeLevel != null, "aria-label": t('toolbar.heading'), "data-toolbar-slot": true, "data-toolbar-item": constants_1.TOOLBAR_ITEM.Heading, "data-test-id": constants_1.TEST_IDS.toolbarHeading, "aria-expanded": open }) }));
|
|
61
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ButtonHeading';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./ButtonHeading"), exports);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type ButtonsProps = {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
};
|
|
5
|
+
export declare function Buttons({ children }: ButtonsProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export type ButtonsGroupProps = {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
};
|
|
9
|
+
export declare function ButtonsGroup({ children }: ButtonsGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function ButtonsDivider(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Buttons = Buttons;
|
|
7
|
+
exports.ButtonsGroup = ButtonsGroup;
|
|
8
|
+
exports.ButtonsDivider = ButtonsDivider;
|
|
9
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
10
|
+
const divider_1 = require("@cloud-ru/ds-divider");
|
|
11
|
+
const constants_1 = require("../../constants");
|
|
12
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
13
|
+
function Buttons({ children }) {
|
|
14
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.TEST_IDS.toolbar, role: 'toolbar', children: children }));
|
|
15
|
+
}
|
|
16
|
+
function ButtonsGroup({ children }) {
|
|
17
|
+
return (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.group, children: children });
|
|
18
|
+
}
|
|
19
|
+
function ButtonsDivider() {
|
|
20
|
+
return (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical', className: styles_module_scss_1.default.divider });
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Buttons';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Buttons"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.root{
|
|
2
|
+
overflow:hidden;
|
|
3
|
+
display:flex;
|
|
4
|
+
flex:0 0 auto;
|
|
5
|
+
gap:var(--sn-markdown-anatomy-size-buttons-gap, var(--sn-primitive-dimension-8, 8px));
|
|
6
|
+
box-sizing:border-box;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.group{
|
|
10
|
+
display:flex;
|
|
11
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
12
|
+
align-items:center;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.divider[data-orientation=vertical]{
|
|
16
|
+
height:auto;
|
|
17
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type CustomizeTableModalProps = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose(): void;
|
|
4
|
+
/** Вставить таблицу заданного размера. */
|
|
5
|
+
onSubmit(rows: number, cols: number): void;
|
|
6
|
+
};
|
|
7
|
+
export declare function CustomizeTableModal({ open, onClose, onSubmit }: CustomizeTableModalProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CustomizeTableModal = CustomizeTableModal;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const button_1 = require("@cloud-ru/ds-button");
|
|
9
|
+
const fields_1 = require("@cloud-ru/ds-fields");
|
|
10
|
+
const modal_1 = require("@cloud-ru/ds-modal");
|
|
11
|
+
const portal_context_1 = require("@cloud-ru/ds-portal-context");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const constants_1 = require("../../constants");
|
|
14
|
+
const locale_1 = require("../../locale");
|
|
15
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
16
|
+
const DEFAULT_SIZE = 1;
|
|
17
|
+
function CustomizeTableModal({ open, onClose, onSubmit }) {
|
|
18
|
+
const { t } = locale_1.markdownLocale.useTranslations();
|
|
19
|
+
const portalContext = (0, portal_context_1.usePortalContext)();
|
|
20
|
+
const [columns, setColumns] = (0, react_1.useState)(DEFAULT_SIZE);
|
|
21
|
+
const [rows, setRows] = (0, react_1.useState)(DEFAULT_SIZE);
|
|
22
|
+
// Сбрасываем значения при каждом открытии, чтобы модалка не помнила прошлый ввод.
|
|
23
|
+
(0, react_1.useEffect)(() => {
|
|
24
|
+
if (open) {
|
|
25
|
+
setColumns(DEFAULT_SIZE);
|
|
26
|
+
setRows(DEFAULT_SIZE);
|
|
27
|
+
}
|
|
28
|
+
}, [open]);
|
|
29
|
+
const handleAdd = () => onSubmit(rows, columns);
|
|
30
|
+
return (
|
|
31
|
+
// TODO: заменить на адаптив
|
|
32
|
+
(0, jsx_runtime_1.jsx)(modal_1.Modal, { open: open, onClose: onClose, container: portalContext.current ?? undefined, title: t('table.customize'), "data-test-id": constants_1.TEST_IDS.customizeModal, content: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.fields, children: [(0, jsx_runtime_1.jsx)(fields_1.FieldStepper, { size: 'm', className: styles_module_scss_1.default.field, label: t('table.columns'), min: DEFAULT_SIZE, value: columns, onChange: setColumns, "data-test-id": constants_1.TEST_IDS.customizeColumns }), (0, jsx_runtime_1.jsx)(fields_1.FieldStepper, { size: 'm', className: styles_module_scss_1.default.field, label: t('table.rows'), min: DEFAULT_SIZE, value: rows, onChange: setRows, "data-test-id": constants_1.TEST_IDS.customizeRows })] }), footer: (0, jsx_runtime_1.jsx)(button_1.ButtonGroup, { size: 'm', primaryAction: { label: t('add'), onClick: handleAdd, 'data-test-id': constants_1.TEST_IDS.customizeAdd }, secondaryAction: {
|
|
33
|
+
appearance: 'neutral',
|
|
34
|
+
view: 'outline',
|
|
35
|
+
label: t('cancel'),
|
|
36
|
+
onClick: onClose,
|
|
37
|
+
'data-test-id': constants_1.TEST_IDS.customizeCancel,
|
|
38
|
+
}, className: styles_module_scss_1.default.buttons }) }));
|
|
39
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ImageModal = ImageModal;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const button_1 = require("@cloud-ru/ds-button");
|
|
9
|
+
const fields_1 = require("@cloud-ru/ds-fields");
|
|
10
|
+
const modal_1 = require("@cloud-ru/ds-modal");
|
|
11
|
+
const portal_context_1 = require("@cloud-ru/ds-portal-context");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const constants_1 = require("../../constants");
|
|
14
|
+
const locale_1 = require("../../locale");
|
|
15
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
16
|
+
function ImageModal({ open, onClose, onSubmit }) {
|
|
17
|
+
const { t } = locale_1.markdownLocale.useTranslations();
|
|
18
|
+
const portalContext = (0, portal_context_1.usePortalContext)();
|
|
19
|
+
const [url, setUrl] = (0, react_1.useState)('');
|
|
20
|
+
const [alt, setAlt] = (0, react_1.useState)('');
|
|
21
|
+
// Сбрасываем поля при каждом открытии.
|
|
22
|
+
(0, react_1.useEffect)(() => {
|
|
23
|
+
if (open) {
|
|
24
|
+
setUrl('');
|
|
25
|
+
setAlt('');
|
|
26
|
+
}
|
|
27
|
+
}, [open]);
|
|
28
|
+
const trimmedUrl = url.trim();
|
|
29
|
+
const handleAdd = () => onSubmit(trimmedUrl, alt.trim() || 'image');
|
|
30
|
+
return (
|
|
31
|
+
// TODO: заменить на адаптив
|
|
32
|
+
(0, jsx_runtime_1.jsx)(modal_1.Modal, { open: open, onClose: onClose, container: portalContext.current ?? undefined, title: t('image.title'), "data-test-id": constants_1.TEST_IDS.imageModal, content: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.fields, "data-column": true, children: [(0, jsx_runtime_1.jsx)(fields_1.FieldCombo, { size: 'm', label: t('image.url'), placeholder: t('image.placeholder'), value: url, onChange: setUrl, autoFocus: true, "data-test-id": constants_1.TEST_IDS.imageModalUrl }), (0, jsx_runtime_1.jsx)(fields_1.FieldCombo, { size: 'm', label: t('image.alt'), value: alt, onChange: setAlt, "data-test-id": constants_1.TEST_IDS.imageModalAlt })] }), footer: (0, jsx_runtime_1.jsx)(button_1.ButtonGroup, { size: 'm', primaryAction: {
|
|
33
|
+
label: t('add'),
|
|
34
|
+
onClick: handleAdd,
|
|
35
|
+
disabled: trimmedUrl === '',
|
|
36
|
+
'data-test-id': constants_1.TEST_IDS.imageModalAdd,
|
|
37
|
+
}, secondaryAction: {
|
|
38
|
+
appearance: 'neutral',
|
|
39
|
+
view: 'outline',
|
|
40
|
+
label: t('cancel'),
|
|
41
|
+
onClick: onClose,
|
|
42
|
+
'data-test-id': constants_1.TEST_IDS.imageModalCancel,
|
|
43
|
+
}, className: styles_module_scss_1.default.buttons }) }));
|
|
44
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type LinkProps = {
|
|
2
|
+
href?: string;
|
|
3
|
+
title?: string;
|
|
4
|
+
};
|
|
5
|
+
type LinkModalProps = {
|
|
6
|
+
open: boolean;
|
|
7
|
+
/** Текущий href (для редактирования существующей ссылки). */
|
|
8
|
+
initial?: LinkProps;
|
|
9
|
+
onClose(): void;
|
|
10
|
+
onSubmit(props: LinkProps): void;
|
|
11
|
+
};
|
|
12
|
+
export declare function LinkModal({ open, initial, onClose, onSubmit }: LinkModalProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LinkModal = LinkModal;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const button_1 = require("@cloud-ru/ds-button");
|
|
9
|
+
const fields_1 = require("@cloud-ru/ds-fields");
|
|
10
|
+
const modal_1 = require("@cloud-ru/ds-modal");
|
|
11
|
+
const portal_context_1 = require("@cloud-ru/ds-portal-context");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const constants_1 = require("../../constants");
|
|
14
|
+
const locale_1 = require("../../locale");
|
|
15
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
16
|
+
function LinkModal({ open, initial, onClose, onSubmit }) {
|
|
17
|
+
const { t } = locale_1.markdownLocale.useTranslations();
|
|
18
|
+
const portalContext = (0, portal_context_1.usePortalContext)();
|
|
19
|
+
const [linkProps, setLinkProps] = (0, react_1.useState)(initial);
|
|
20
|
+
// Префилл значением при каждом открытии (текущий href либо пусто).
|
|
21
|
+
(0, react_1.useEffect)(() => {
|
|
22
|
+
if (open) {
|
|
23
|
+
setLinkProps({ href: initial?.href, title: initial?.title });
|
|
24
|
+
}
|
|
25
|
+
}, [open, initial?.href, initial?.title]);
|
|
26
|
+
const trimmedUrl = linkProps?.href?.trim() ?? '';
|
|
27
|
+
const handleAdd = () => onSubmit({ href: trimmedUrl, title: linkProps?.title });
|
|
28
|
+
return (
|
|
29
|
+
// TODO: заменить на адаптив
|
|
30
|
+
(0, jsx_runtime_1.jsx)(modal_1.Modal, { open: open, onClose: onClose, container: portalContext.current ?? undefined, title: t('link.title'), "data-test-id": constants_1.TEST_IDS.linkModal, content: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.fields, "data-column": true, children: [(0, jsx_runtime_1.jsx)(fields_1.FieldCombo, { size: 'm', label: t('link.titleField.label'), placeholder: t('link.titleField.placeholder'), value: linkProps?.title ?? '', onChange: title => setLinkProps(prev => ({ ...prev, title })), autoFocus: !initial?.title, "data-test-id": constants_1.TEST_IDS.linkModalTitle }), (0, jsx_runtime_1.jsx)(fields_1.FieldCombo, { size: 'm', label: t('link.urlField.label'), placeholder: t('link.urlField.placeholder'), value: linkProps?.href ?? '', autoFocus: Boolean(initial?.title), onChange: href => setLinkProps(prev => ({ ...prev, href })), "data-test-id": constants_1.TEST_IDS.linkModalUrl })] }), footer: (0, jsx_runtime_1.jsx)(button_1.ButtonGroup, { size: 'm', primaryAction: {
|
|
31
|
+
label: t('add'),
|
|
32
|
+
onClick: handleAdd,
|
|
33
|
+
disabled: trimmedUrl === '',
|
|
34
|
+
'data-test-id': constants_1.TEST_IDS.linkModalAdd,
|
|
35
|
+
}, secondaryAction: {
|
|
36
|
+
appearance: 'neutral',
|
|
37
|
+
view: 'outline',
|
|
38
|
+
label: t('cancel'),
|
|
39
|
+
onClick: onClose,
|
|
40
|
+
'data-test-id': constants_1.TEST_IDS.linkModalCancel,
|
|
41
|
+
}, className: styles_module_scss_1.default.buttons }) }));
|
|
42
|
+
}
|