@storkspear/post-editor-react 0.1.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/LICENSE +21 -0
- package/README.md +12 -0
- package/dist/ColorPicker.d.ts +11 -0
- package/dist/ColorPicker.d.ts.map +1 -0
- package/dist/ColorPicker.js +30 -0
- package/dist/ColorPicker.js.map +1 -0
- package/dist/DrawioModal.d.ts +9 -0
- package/dist/DrawioModal.d.ts.map +1 -0
- package/dist/DrawioModal.js +97 -0
- package/dist/DrawioModal.js.map +1 -0
- package/dist/FontMenu.d.ts +14 -0
- package/dist/FontMenu.d.ts.map +1 -0
- package/dist/FontMenu.js +14 -0
- package/dist/FontMenu.js.map +1 -0
- package/dist/Icon.d.ts +69 -0
- package/dist/Icon.d.ts.map +1 -0
- package/dist/Icon.js +47 -0
- package/dist/Icon.js.map +1 -0
- package/dist/InsertHandle.d.ts +14 -0
- package/dist/InsertHandle.d.ts.map +1 -0
- package/dist/InsertHandle.js +60 -0
- package/dist/InsertHandle.js.map +1 -0
- package/dist/PickMenu.d.ts +61 -0
- package/dist/PickMenu.d.ts.map +1 -0
- package/dist/PickMenu.js +57 -0
- package/dist/PickMenu.js.map +1 -0
- package/dist/Popover.d.ts +20 -0
- package/dist/Popover.d.ts.map +1 -0
- package/dist/Popover.js +22 -0
- package/dist/Popover.js.map +1 -0
- package/dist/PostTitle.d.ts +33 -0
- package/dist/PostTitle.d.ts.map +1 -0
- package/dist/PostTitle.js +171 -0
- package/dist/PostTitle.js.map +1 -0
- package/dist/SelectionBubble.d.ts +6 -0
- package/dist/SelectionBubble.d.ts.map +1 -0
- package/dist/SelectionBubble.js +71 -0
- package/dist/SelectionBubble.js.map +1 -0
- package/dist/TableTools.d.ts +10 -0
- package/dist/TableTools.d.ts.map +1 -0
- package/dist/TableTools.js +200 -0
- package/dist/TableTools.js.map +1 -0
- package/dist/Toolbar.d.ts +17 -0
- package/dist/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar.js +333 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/UrlPrompt.d.ts +24 -0
- package/dist/UrlPrompt.d.ts.map +1 -0
- package/dist/UrlPrompt.js +53 -0
- package/dist/UrlPrompt.js.map +1 -0
- package/dist/VariantMenu.d.ts +47 -0
- package/dist/VariantMenu.d.ts.map +1 -0
- package/dist/VariantMenu.js +21 -0
- package/dist/VariantMenu.js.map +1 -0
- package/dist/WidthToggle.d.ts +19 -0
- package/dist/WidthToggle.d.ts.map +1 -0
- package/dist/WidthToggle.js +17 -0
- package/dist/WidthToggle.js.map +1 -0
- package/dist/bubbleShows.d.ts +10 -0
- package/dist/bubbleShows.d.ts.map +1 -0
- package/dist/bubbleShows.js +29 -0
- package/dist/bubbleShows.js.map +1 -0
- package/dist/content-baked.d.ts +22 -0
- package/dist/content-baked.d.ts.map +1 -0
- package/dist/content-baked.js +21 -0
- package/dist/content-baked.js.map +1 -0
- package/dist/content.d.ts +29 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +35 -0
- package/dist/content.js.map +1 -0
- package/dist/extensions/DiagramView.d.ts +26 -0
- package/dist/extensions/DiagramView.d.ts.map +1 -0
- package/dist/extensions/DiagramView.js +146 -0
- package/dist/extensions/DiagramView.js.map +1 -0
- package/dist/extensions/FigureView.d.ts +3 -0
- package/dist/extensions/FigureView.d.ts.map +1 -0
- package/dist/extensions/FigureView.js +108 -0
- package/dist/extensions/FigureView.js.map +1 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/objects/ObjectFloat.d.ts +11 -0
- package/dist/objects/ObjectFloat.d.ts.map +1 -0
- package/dist/objects/ObjectFloat.js +42 -0
- package/dist/objects/ObjectFloat.js.map +1 -0
- package/dist/objects/ObjectLayer.d.ts +10 -0
- package/dist/objects/ObjectLayer.d.ts.map +1 -0
- package/dist/objects/ObjectLayer.js +20 -0
- package/dist/objects/ObjectLayer.js.map +1 -0
- package/dist/objects/blockSize.d.ts +30 -0
- package/dist/objects/blockSize.d.ts.map +1 -0
- package/dist/objects/blockSize.js +56 -0
- package/dist/objects/blockSize.js.map +1 -0
- package/dist/objects/code.d.ts +3 -0
- package/dist/objects/code.d.ts.map +1 -0
- package/dist/objects/code.js +55 -0
- package/dist/objects/code.js.map +1 -0
- package/dist/objects/diagram.d.ts +21 -0
- package/dist/objects/diagram.d.ts.map +1 -0
- package/dist/objects/diagram.js +109 -0
- package/dist/objects/diagram.js.map +1 -0
- package/dist/objects/diagramGlyphs.d.ts +12 -0
- package/dist/objects/diagramGlyphs.d.ts.map +1 -0
- package/dist/objects/diagramGlyphs.js +49 -0
- package/dist/objects/diagramGlyphs.js.map +1 -0
- package/dist/objects/divider.d.ts +22 -0
- package/dist/objects/divider.d.ts.map +1 -0
- package/dist/objects/divider.js +60 -0
- package/dist/objects/divider.js.map +1 -0
- package/dist/objects/figure.d.ts +3 -0
- package/dist/objects/figure.d.ts.map +1 -0
- package/dist/objects/figure.js +62 -0
- package/dist/objects/figure.js.map +1 -0
- package/dist/objects/imageRow.d.ts +3 -0
- package/dist/objects/imageRow.d.ts.map +1 -0
- package/dist/objects/imageRow.js +29 -0
- package/dist/objects/imageRow.js.map +1 -0
- package/dist/objects/quote.d.ts +6 -0
- package/dist/objects/quote.d.ts.map +1 -0
- package/dist/objects/quote.js +13 -0
- package/dist/objects/quote.js.map +1 -0
- package/dist/objects/quoteGlyphs.d.ts +6 -0
- package/dist/objects/quoteGlyphs.d.ts.map +1 -0
- package/dist/objects/quoteGlyphs.js +28 -0
- package/dist/objects/quoteGlyphs.js.map +1 -0
- package/dist/objects/quoteRow.d.ts +3 -0
- package/dist/objects/quoteRow.d.ts.map +1 -0
- package/dist/objects/quoteRow.js +61 -0
- package/dist/objects/quoteRow.js.map +1 -0
- package/dist/objects/registry.d.ts +60 -0
- package/dist/objects/registry.d.ts.map +1 -0
- package/dist/objects/registry.js +45 -0
- package/dist/objects/registry.js.map +1 -0
- package/dist/objects/table.d.ts +11 -0
- package/dist/objects/table.d.ts.map +1 -0
- package/dist/objects/table.js +136 -0
- package/dist/objects/table.js.map +1 -0
- package/dist/objects/useDomRect.d.ts +14 -0
- package/dist/objects/useDomRect.d.ts.map +1 -0
- package/dist/objects/useDomRect.js +32 -0
- package/dist/objects/useDomRect.js.map +1 -0
- package/dist/objects/useEngaged.d.ts +14 -0
- package/dist/objects/useEngaged.d.ts.map +1 -0
- package/dist/objects/useEngaged.js +41 -0
- package/dist/objects/useEngaged.js.map +1 -0
- package/dist/pickItems.d.ts +36 -0
- package/dist/pickItems.d.ts.map +1 -0
- package/dist/pickItems.js +40 -0
- package/dist/pickItems.js.map +1 -0
- package/dist/recentColors.d.ts +7 -0
- package/dist/recentColors.d.ts.map +1 -0
- package/dist/recentColors.js +30 -0
- package/dist/recentColors.js.map +1 -0
- package/dist/seeds/drawio/aws.d.ts +15 -0
- package/dist/seeds/drawio/aws.d.ts.map +1 -0
- package/dist/seeds/drawio/aws.js +15 -0
- package/dist/seeds/drawio/aws.js.map +1 -0
- package/dist/seeds/drawio/azure.d.ts +14 -0
- package/dist/seeds/drawio/azure.d.ts.map +1 -0
- package/dist/seeds/drawio/azure.js +14 -0
- package/dist/seeds/drawio/azure.js.map +1 -0
- package/dist/seeds/drawio/ec2docker.d.ts +15 -0
- package/dist/seeds/drawio/ec2docker.d.ts.map +1 -0
- package/dist/seeds/drawio/ec2docker.js +15 -0
- package/dist/seeds/drawio/ec2docker.js.map +1 -0
- package/dist/seeds/drawio/userflow.d.ts +21 -0
- package/dist/seeds/drawio/userflow.d.ts.map +1 -0
- package/dist/seeds/drawio/userflow.js +21 -0
- package/dist/seeds/drawio/userflow.js.map +1 -0
- package/dist/seeds/mermaid.d.ts +19 -0
- package/dist/seeds/mermaid.d.ts.map +1 -0
- package/dist/seeds/mermaid.js +82 -0
- package/dist/seeds/mermaid.js.map +1 -0
- package/dist/useAnchoredPos.d.ts +22 -0
- package/dist/useAnchoredPos.d.ts.map +1 -0
- package/dist/useAnchoredPos.js +57 -0
- package/dist/useAnchoredPos.js.map +1 -0
- package/dist/useDismiss.d.ts +17 -0
- package/dist/useDismiss.d.ts.map +1 -0
- package/dist/useDismiss.js +36 -0
- package/dist/useDismiss.js.map +1 -0
- package/dist/useLastVariant.d.ts +9 -0
- package/dist/useLastVariant.d.ts.map +1 -0
- package/dist/useLastVariant.js +33 -0
- package/dist/useLastVariant.js.map +1 -0
- package/dist/useUploadCount.d.ts +3 -0
- package/dist/useUploadCount.d.ts.map +1 -0
- package/dist/useUploadCount.js +9 -0
- package/dist/useUploadCount.js.map +1 -0
- package/package.json +57 -0
- package/src/editor-ui.css +737 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { Icon } from '../Icon.js';
|
|
4
|
+
import { VariantMenu } from '../VariantMenu.js';
|
|
5
|
+
import {} from '@storkspear/post-editor-core/vocab';
|
|
6
|
+
import { QUOTE_LABEL, quoteItems } from './quote.js';
|
|
7
|
+
import { QuoteGlyph } from './quoteGlyphs.js';
|
|
8
|
+
import { QUOTE_VARIANTS } from '@storkspear/post-editor-core/vocab';
|
|
9
|
+
/** 인용 안에 출처 줄이 이미 있는가 */
|
|
10
|
+
function hasSource(m) {
|
|
11
|
+
return m.node.lastChild?.type.name === 'quoteSource';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 인용이 잡혔을 때의 아랫줄.
|
|
15
|
+
*
|
|
16
|
+
* 표·사진·코드와 같은 틀(registry)에 얹는다. 모양 고르기는 여기 드롭다운에도 있고,
|
|
17
|
+
* 글자 버블 앞줄(QuoteBubble)에도 있다 — 손이 글에 있을 때 굳이 아래로 내려가지 않게.
|
|
18
|
+
*/
|
|
19
|
+
function QuoteRow({ editor, m }) {
|
|
20
|
+
const [menu, setMenu] = useState(false);
|
|
21
|
+
const anchor = useRef(null);
|
|
22
|
+
const c = () => editor.chain().focus();
|
|
23
|
+
const variant = m.node.attrs.variant ?? 'bar';
|
|
24
|
+
const on = hasSource(m);
|
|
25
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "tb-anchor", ref: anchor, children: [_jsxs("button", { type: "button", className: `tb-btn tb-caret-btn${menu ? ' is-on' : ''}`, title: `인용 모양 — ${QUOTE_LABEL[variant]}`, "aria-label": "\uC778\uC6A9 \uBAA8\uC591", onMouseDown: (e) => e.preventDefault(), onClick: () => setMenu((v) => !v), children: [_jsx(Icon, { name: "quote" }), _jsx("i", { className: "tb-caret" })] }), menu && (_jsx(VariantMenu, { ariaLabel: "\uC778\uC6A9 \uBAA8\uC591", columns: 1, anchorRef: anchor, items: quoteItems, value: variant, onPick: (v) => c().setQuoteVariant(v).run(), onClose: () => setMenu(false) }))] }), _jsx("button", { type: "button", className: `tb-btn${on ? ' is-on' : ''}`, title: on ? '출처 줄 지우기 (비어 있을 때만)' : '출처 줄 넣기', "aria-label": "\uCD9C\uCC98", onMouseDown: (e) => e.preventDefault(), onClick: () => c().toggleQuoteSource().run(), children: _jsx("span", { className: "tb-txt", children: "\uCD9C\uCC98" }) }), _jsx("span", { className: "tb-div" }), _jsx("button", { type: "button", className: "tb-btn", title: "\uC778\uC6A9 \uD480\uAE30", onMouseDown: (e) => e.preventDefault(), onClick: () => c().lift('blockquote').run(), children: _jsx("span", { className: "tb-txt", children: "\uC778\uC6A9 \uD480\uAE30" }) }), _jsx("button", { type: "button", className: "tb-btn", title: "\uC778\uC6A9 \uC0AD\uC81C", onMouseDown: (e) => e.preventDefault(), onClick: () => c().deleteRange({ from: m.pos, to: m.pos + m.node.nodeSize }).run(), children: _jsx(Icon, { name: "trash" }) })] }));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 모양 일곱 개를 **바로 누르는** 줄. 떠 있는 바와 글자 버블이 같이 쓴다.
|
|
29
|
+
*
|
|
30
|
+
* 드롭다운을 한 번 더 여는 것과 다르다. 인용은 모양을 갈아 보며 고르는 물건이라
|
|
31
|
+
* 「열고 → 고르고 → 닫고」 가 매번 걸린다.
|
|
32
|
+
* 지금 모양이 눌린 채로 보여서 「무엇이 잡혔는지」도 이 줄이 말해 준다.
|
|
33
|
+
*/
|
|
34
|
+
function QuoteShapes({ editor, m }) {
|
|
35
|
+
const c = () => editor.chain().focus();
|
|
36
|
+
const variant = m.node.attrs.variant ?? 'bar';
|
|
37
|
+
return (_jsx(_Fragment, { children: QUOTE_VARIANTS.map((v) => (_jsx("button", { type: "button", className: `tb-btn tb-qv${variant === v ? ' is-on' : ''}`, title: QUOTE_LABEL[v], "aria-label": QUOTE_LABEL[v], "aria-pressed": variant === v, onMouseDown: (e) => e.preventDefault(), onClick: () => c().setQuoteVariant(v).run(), children: _jsx(QuoteGlyph, { v: v }) }, v))) }));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 글자를 잡았을 때 **글자 버블 앞에 붙는 줄.**
|
|
41
|
+
*
|
|
42
|
+
* 인용 바와 글자 버블이 따로 뜨면 인용의 왼쪽 위에서 서로 포갠다.
|
|
43
|
+
* 네이버는 인용 안에서 글자 서식을 아예 안 준다 — 겹칠 일이 없다.
|
|
44
|
+
* 우리는 글자 서식을 살리는 쪽이라, 대신 **둘을 한 줄로 합친다.**
|
|
45
|
+
* 삭제는 여기 두지 않는다 — 글을 잡은 채 옆에 휴지통이 있으면 지우려던 게 글이 아니라 인용이 된다.
|
|
46
|
+
*/
|
|
47
|
+
function QuoteBubble({ editor, m }) {
|
|
48
|
+
return (_jsxs(_Fragment, { children: [_jsx(QuoteShapes, { editor: editor, m: m }), _jsx("button", { type: "button", className: "tb-btn", title: "\uC778\uC6A9 \uD480\uAE30 \u2014 \uBCF8\uBB38\uC73C\uB85C", onMouseDown: (e) => e.preventDefault(), onClick: () => editor.chain().focus().lift('blockquote').run(), children: _jsx("span", { className: "tb-txt", children: "\uBCF8\uBB38" }) })] }));
|
|
49
|
+
}
|
|
50
|
+
export const quoteObject = {
|
|
51
|
+
name: 'blockquote',
|
|
52
|
+
label: '인용',
|
|
53
|
+
allowsText: true,
|
|
54
|
+
Row: QuoteRow,
|
|
55
|
+
/**
|
|
56
|
+
* 인용은 **떠 있는 바를 갖지 않는다.** 모양 고르기는 글자 버블 앞에 붙는다 —
|
|
57
|
+
* 둘 다 띄우면 인용 위에서 서로 포갠다.
|
|
58
|
+
*/
|
|
59
|
+
Bubble: QuoteBubble,
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=quoteRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quoteRow.js","sourceRoot":"","sources":["../../src/objects/quoteRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { Editor } from '@tiptap/react';
|
|
3
|
+
import type { Node as PMNode } from '@tiptap/pm/model';
|
|
4
|
+
export type ObjectMatch = {
|
|
5
|
+
kind: string;
|
|
6
|
+
pos: number;
|
|
7
|
+
node: PMNode;
|
|
8
|
+
dom: HTMLElement;
|
|
9
|
+
};
|
|
10
|
+
export interface ObjectKind {
|
|
11
|
+
/** 노드 이름 */
|
|
12
|
+
name: string;
|
|
13
|
+
/** 툴바 아랫줄 왼쪽에 붙는 한글 이름 ("표", "사진", "일정") */
|
|
14
|
+
label: string;
|
|
15
|
+
/** Float 기준 요소 보정 — NodeView 래퍼가 낀 경우 안쪽 실제 요소로 */
|
|
16
|
+
anchor?: (dom: HTMLElement) => HTMLElement | null;
|
|
17
|
+
/** 'T' 버튼으로 글 서식줄로 되돌아갈 수 있는가 (표·이미지 캡션처럼 안에 글이 있는 것만) */
|
|
18
|
+
allowsText?: boolean;
|
|
19
|
+
/** 툴바 아랫줄을 교체하는 내용 (필수) */
|
|
20
|
+
/** 아랫줄에 그릴 것. **없어도 된다** — 코드 블록처럼 줄에 둘 게 없는 것도 있다 */
|
|
21
|
+
Row?: FC<{
|
|
22
|
+
editor: Editor;
|
|
23
|
+
m: ObjectMatch;
|
|
24
|
+
}>;
|
|
25
|
+
/** 객체 위에 뜨는 작은 바 */
|
|
26
|
+
Float?: FC<{
|
|
27
|
+
editor: Editor;
|
|
28
|
+
m: ObjectMatch;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* 글자를 잡았을 때 **글자 버블 앞에 붙는 줄.**
|
|
32
|
+
* 이게 있는 종류는 그 동안 `Float` 을 내린다 — 둘 다 띄우면 서로 포갠다.
|
|
33
|
+
*/
|
|
34
|
+
Bubble?: FC<{
|
|
35
|
+
editor: Editor;
|
|
36
|
+
m: ObjectMatch;
|
|
37
|
+
}>;
|
|
38
|
+
/** 기하 오버레이 (표의 머리띠·경계 + 등) */
|
|
39
|
+
Overlay?: FC<{
|
|
40
|
+
editor: Editor;
|
|
41
|
+
m: ObjectMatch;
|
|
42
|
+
}>;
|
|
43
|
+
/** 폰에서도 Float 을 띄울지 (기본 false) */
|
|
44
|
+
phoneFloat?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 선택된 객체에 따라 툴바가 바뀌는 구조의 유일한 등록처.
|
|
48
|
+
*
|
|
49
|
+
* 표·이미지·일정이 각자 툴바를 갖게 만들면 네 번째 객체에서 또 만들게 된다.
|
|
50
|
+
* 여기 항목 하나를 더하면 아랫줄 교체·떠 있는 바·오버레이가 따라온다.
|
|
51
|
+
*/
|
|
52
|
+
export declare const OBJECTS: Record<string, ObjectKind>;
|
|
53
|
+
export declare function registerObject(kind: ObjectKind): void;
|
|
54
|
+
/**
|
|
55
|
+
* 지금 선택된 객체를 찾는다.
|
|
56
|
+
* NodeSelection 이면 그 노드, 아니면 커서 위치에서 **깊은 쪽부터** 올라가며 첫 등록 노드.
|
|
57
|
+
* 깊은 쪽부터인 이유: 표 셀 안의 이미지를 골랐을 때 표가 아니라 이미지가 이겨야 한다.
|
|
58
|
+
*/
|
|
59
|
+
export declare function findActiveObject(editor: Editor): ObjectMatch | null;
|
|
60
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/objects/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,KAAK,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEtD,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAAA;AAEvF,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAA;IACjD,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2BAA2B;IAC3B,sDAAsD;IACtD,GAAG,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IAC5C,oBAAoB;IACpB,KAAK,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IAC9C;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IAC/C,8BAA8B;IAC9B,OAAO,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IAChD,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAM,CAAA;AAErD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,QAE9C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAyBnE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { NodeSelection } from '@tiptap/pm/state';
|
|
2
|
+
/**
|
|
3
|
+
* 선택된 객체에 따라 툴바가 바뀌는 구조의 유일한 등록처.
|
|
4
|
+
*
|
|
5
|
+
* 표·이미지·일정이 각자 툴바를 갖게 만들면 네 번째 객체에서 또 만들게 된다.
|
|
6
|
+
* 여기 항목 하나를 더하면 아랫줄 교체·떠 있는 바·오버레이가 따라온다.
|
|
7
|
+
*/
|
|
8
|
+
export const OBJECTS = {};
|
|
9
|
+
export function registerObject(kind) {
|
|
10
|
+
OBJECTS[kind.name] = kind;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 지금 선택된 객체를 찾는다.
|
|
14
|
+
* NodeSelection 이면 그 노드, 아니면 커서 위치에서 **깊은 쪽부터** 올라가며 첫 등록 노드.
|
|
15
|
+
* 깊은 쪽부터인 이유: 표 셀 안의 이미지를 골랐을 때 표가 아니라 이미지가 이겨야 한다.
|
|
16
|
+
*/
|
|
17
|
+
export function findActiveObject(editor) {
|
|
18
|
+
const { state, view } = editor;
|
|
19
|
+
const sel = state.selection;
|
|
20
|
+
const build = (pos, node) => {
|
|
21
|
+
const kind = OBJECTS[node.type.name];
|
|
22
|
+
if (!kind)
|
|
23
|
+
return null;
|
|
24
|
+
const dom = view.nodeDOM(pos);
|
|
25
|
+
if (!(dom instanceof HTMLElement))
|
|
26
|
+
return null;
|
|
27
|
+
return { kind: node.type.name, pos, node, dom };
|
|
28
|
+
};
|
|
29
|
+
if (sel instanceof NodeSelection) {
|
|
30
|
+
const m = build(sel.from, sel.node);
|
|
31
|
+
if (m)
|
|
32
|
+
return m;
|
|
33
|
+
}
|
|
34
|
+
const $from = state.selection.$from;
|
|
35
|
+
for (let d = $from.depth; d > 0; d--) {
|
|
36
|
+
const node = $from.node(d);
|
|
37
|
+
if (!OBJECTS[node.type.name])
|
|
38
|
+
continue;
|
|
39
|
+
const m = build($from.before(d), node);
|
|
40
|
+
if (m)
|
|
41
|
+
return m;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/objects/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AA8BhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAA+B,EAAE,CAAA;AAErD,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAA;IAE3B,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,IAAY,EAAsB,EAAE;QAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,CAAC,GAAG,YAAY,WAAW,CAAC;YAAE,OAAO,IAAI,CAAA;QAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;IACjD,CAAC,CAAA;IAED,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAA;IACnC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAQ;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/react';
|
|
2
|
+
import { type VariantItem } from '../VariantMenu.js';
|
|
3
|
+
import { type TablePreset } from '@storkspear/post-editor-core/vocab';
|
|
4
|
+
import type { ObjectKind } from './registry.js';
|
|
5
|
+
/** style 문자열 안의 width:NN% 를 읽는다 (표 폭은 style 속성이 소유한다) */
|
|
6
|
+
export declare function tableWidthPct(editor: Editor): number;
|
|
7
|
+
export declare const PRESET_LABEL: Record<TablePreset, string>;
|
|
8
|
+
/** 툴바의 표 ▾ 도 같은 목록을 쓴다 — 넣기 메뉴와 아랫줄이 따로 목록을 가지면 어긋난다 */
|
|
9
|
+
export declare const presetItems: VariantItem<TablePreset>[];
|
|
10
|
+
export declare const tableObject: ObjectKind;
|
|
11
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/objects/table.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAG3C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAA2D,KAAK,WAAW,EAAoB,MAAM,oCAAoC,CAAA;AAEhJ,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAA;AAEzD,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAIpD,CAAA;AA2BD,wDAAwD;AACxD,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,EAE/C,CAAA;AAyMH,eAAO,MAAM,WAAW,EAAE,UAMzB,CAAA"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { Icon } from '../Icon.js';
|
|
4
|
+
import { ColorPicker } from '../ColorPicker.js';
|
|
5
|
+
import { VariantMenu } from '../VariantMenu.js';
|
|
6
|
+
import { TABLE_LINES, TABLE_PRESETS, TABLE_RADII } from '@storkspear/post-editor-core/vocab';
|
|
7
|
+
import { TableTools } from '../TableTools.js';
|
|
8
|
+
/** style 문자열 안의 width:NN% 를 읽는다 (표 폭은 style 속성이 소유한다) */
|
|
9
|
+
export function tableWidthPct(editor) {
|
|
10
|
+
const st = editor.getAttributes('table').style ?? '';
|
|
11
|
+
const m = /width\s*:\s*([\d.]+)%/.exec(st);
|
|
12
|
+
return m ? Math.round(Number(m[1])) : 100;
|
|
13
|
+
}
|
|
14
|
+
export const PRESET_LABEL = {
|
|
15
|
+
grid: '전체 격자', head: '머리행 강조', dashgrid: '점선 격자', rows: '가로줄만',
|
|
16
|
+
topline: '윗선 강조', minimal: '최소선', stripes: '줄무늬', column: '첫 열 강조', clean: '선 없음',
|
|
17
|
+
inkhead: '머리행 검정', navy: '남색 줄무늬', frame: '굵은 테두리', ledger: '장부',
|
|
18
|
+
};
|
|
19
|
+
const RADIUS_LABEL = { soft: '살짝', round: '둥글게' };
|
|
20
|
+
/**
|
|
21
|
+
* 메뉴에 놓이는 순서. **알파벳도 vocab 순서도 아니다** — 닮은 것끼리 한 줄에 놓아야 눈이 고른다.
|
|
22
|
+
* `TABLE_PRESETS` 에서 하나라도 빠지면 아래 assert 가 잡는다(어휘가 늘었는데 메뉴는 그대로인 상태 방지).
|
|
23
|
+
*/
|
|
24
|
+
const PRESET_ORDER = [
|
|
25
|
+
'grid', 'dashgrid', 'frame', 'inkhead',
|
|
26
|
+
'rows', 'stripes', 'topline', 'ledger',
|
|
27
|
+
'head', 'navy', 'column', 'minimal',
|
|
28
|
+
'clean',
|
|
29
|
+
];
|
|
30
|
+
if (PRESET_ORDER.length !== TABLE_PRESETS.length) {
|
|
31
|
+
throw new Error(`표 프리셋 순서에 빠진 것이 있습니다: ${TABLE_PRESETS.filter((p) => !PRESET_ORDER.includes(p)).join(', ')}`);
|
|
32
|
+
}
|
|
33
|
+
const LINE_LABEL = { solid: '실선', dashed: '파선', dotted: '점선', double: '이중선' };
|
|
34
|
+
/** 미리보기는 진짜 3×2 표 — prose.css 가 본문과 똑같이 그린다 */
|
|
35
|
+
const miniTable = (extra) => (_jsx("table", { ...extra, style: { margin: 0, fontSize: '0.42rem', lineHeight: 1.2, width: '100%' }, children: _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsx("th", { children: "\uAC00" }), _jsx("th", { children: "\uB098" }), _jsx("th", { children: "\uB2E4" })] }), _jsxs("tr", { children: [_jsx("td", { children: "1" }), _jsx("td", { children: "2" }), _jsx("td", { children: "3" })] }), _jsxs("tr", { children: [_jsx("td", { children: "4" }), _jsx("td", { children: "5" }), _jsx("td", { children: "6" })] })] }) }));
|
|
36
|
+
/** 툴바의 표 ▾ 도 같은 목록을 쓴다 — 넣기 메뉴와 아랫줄이 따로 목록을 가지면 어긋난다 */
|
|
37
|
+
export const presetItems = PRESET_ORDER.map((p) => ({
|
|
38
|
+
value: p, label: PRESET_LABEL[p], preview: miniTable({ 'data-preset': p }),
|
|
39
|
+
}));
|
|
40
|
+
const lineItems = TABLE_LINES.map((l) => ({
|
|
41
|
+
value: l, label: LINE_LABEL[l], preview: miniTable({ 'data-preset': 'grid', 'data-line': l }),
|
|
42
|
+
}));
|
|
43
|
+
function Btn({ on, title, disabled, cls = '', children }) {
|
|
44
|
+
return (_jsx("button", { type: "button", className: `tb-btn ${cls}`.trim(), title: title, "aria-label": title, disabled: disabled, onMouseDown: (e) => e.preventDefault(), onClick: on, children: children }));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 표가 잡혔을 때의 아랫줄.
|
|
48
|
+
*
|
|
49
|
+
* 네이버 블로그의 표 도구를 기준으로 삼는다.
|
|
50
|
+
* - 고르는 것은 **아이콘 + 미리보기 팝오버**다. 무엇이 되는지는 이름이 아니라 그림이 말한다.
|
|
51
|
+
* - **선 모양과 선 색은 「표 테두리」 하나에 있다.** 둘은 같은 것을 정한다.
|
|
52
|
+
* - 행·열 추가/삭제는 여기 없다. 표 위·왼쪽 손잡이의 `+` 와 `⋯` 메뉴가 그 일을 하고,
|
|
53
|
+
* 거기서는 "어느 자리에" 들어가는지가 보인다.
|
|
54
|
+
*/
|
|
55
|
+
function TableRow({ editor }) {
|
|
56
|
+
const [open, setOpen] = useState(null);
|
|
57
|
+
const presetAnchor = useRef(null);
|
|
58
|
+
const borderAnchor = useRef(null);
|
|
59
|
+
const bgAnchor = useRef(null);
|
|
60
|
+
const c = () => editor.chain().focus();
|
|
61
|
+
const pct = tableWidthPct(editor);
|
|
62
|
+
const attrs = editor.getAttributes('table');
|
|
63
|
+
const preset = attrs.preset ?? 'grid';
|
|
64
|
+
const line = attrs.line ?? null;
|
|
65
|
+
const radius = attrs.radius ?? null;
|
|
66
|
+
const toggle = (k) => setOpen((v) => (v === k ? null : k));
|
|
67
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "tb-anchor", ref: presetAnchor, children: [_jsxs("button", { type: "button", className: `tb-btn${open === 'preset' ? ' is-on' : ''}`, title: `표 스타일 — ${PRESET_LABEL[preset]}`, "aria-label": "\uD45C \uC2A4\uD0C0\uC77C", onMouseDown: (e) => e.preventDefault(), onClick: () => toggle('preset'), children: [_jsx(Icon, { name: "tableStyle" }), _jsx("span", { className: "tb-txt", children: "\uC2A4\uD0C0\uC77C" })] }), open === 'preset' && (_jsx(VariantMenu, { ariaLabel: "\uD45C \uC2A4\uD0C0\uC77C", columns: 4, anchorRef: presetAnchor, items: presetItems, value: preset, onPick: (p) => c().setTablePreset(p).run(), onClose: () => setOpen(null) }))] }), _jsxs("div", { className: "tb-anchor", ref: borderAnchor, children: [_jsxs("button", { type: "button", className: `tb-btn${open === 'border' ? ' is-on' : ''}`, title: `표 테두리 — ${line ? LINE_LABEL[line] : '실선'}${radius ? ` · 모서리 ${RADIUS_LABEL[radius]}` : ''}`, "aria-label": "\uD45C \uD14C\uB450\uB9AC", onMouseDown: (e) => e.preventDefault(), onClick: () => toggle('border'), children: [_jsx(Icon, { name: "tableBorder" }), _jsx("span", { className: "tb-txt", children: "\uD14C\uB450\uB9AC" })] }), open === 'border' && (_jsx(BorderPopover, { editor: editor, line: line, radius: radius, anchorRef: borderAnchor, onClose: () => setOpen(null) }))] }), _jsxs("div", { className: "tb-anchor", ref: bgAnchor, children: [_jsxs("button", { type: "button", className: `tb-btn${open === 'bg' ? ' is-on' : ''}`, title: "\uC140 \uBC30\uACBD\uC0C9", "aria-label": "\uC140 \uBC30\uACBD\uC0C9", onMouseDown: (e) => e.preventDefault(), onClick: () => toggle('bg'), children: [_jsx(Icon, { name: "bucket" }), _jsx("span", { className: "tb-txt", children: "\uC140 \uC0C9" })] }), open === 'bg' && (_jsx(ColorPicker, { label: "\uC140 \uBC30\uACBD\uC0C9", anchorRef: bgAnchor, onPick: (hex) => c().setCellBackground(hex).run(), onClear: () => c().setCellBackground(null).run(), onClose: () => setOpen(null) }))] }), _jsx("span", { className: "tb-div" }), _jsxs("label", { className: "tb-width-inline", children: ["\uD3ED", _jsx("input", { type: "range", min: 30, max: 100, step: 1, value: pct, onChange: (ev) => c().setTableWidth(Number(ev.target.value)).run() }), _jsx("b", { children: pct }), _jsx("i", { children: "%" })] }), _jsx("span", { className: "tb-div" }), _jsxs(Btn, { title: "\uC120\uD0DD\uD55C \uC140\uB4E4\uC744 \uD558\uB098\uB85C \uD569\uCE58\uAE30", on: () => c().mergeCells().run(), children: [_jsx(Icon, { name: "cellMerge" }), _jsx("span", { className: "tb-txt", children: "\uBCD1\uD569" })] }), _jsxs(Btn, { title: "\uD569\uCCD0\uC9C4 \uC140\uC744 \uB2E4\uC2DC \uB098\uB204\uAE30", on: () => c().splitCell().run(), children: [_jsx(Icon, { name: "cellSplit" }), _jsx("span", { className: "tb-txt", children: "\uBD84\uD560" })] }), _jsx("span", { className: "tb-div tb-phone-only" }), _jsx(Btn, { cls: "tb-phone-only", title: "\uC774 \uD589 \uC120\uD0DD", on: () => selectBand(editor, 'row'), children: _jsx("span", { className: "tb-txt", children: "\uD589" }) }), _jsx(Btn, { cls: "tb-phone-only", title: "\uC774 \uC5F4 \uC120\uD0DD", on: () => selectBand(editor, 'col'), children: _jsx("span", { className: "tb-txt", children: "\uC5F4" }) })] }));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 표 테두리 팝오버 — 선 모양 셋과 색을 한 자리에.
|
|
71
|
+
*
|
|
72
|
+
* 네이버는 `확인` 을 눌러야 닫히지만 우리는 즉시 적용한다. 되돌리기가 ⌘Z 로 되므로
|
|
73
|
+
* 확인 단계를 두면 손만 더 간다.
|
|
74
|
+
*/
|
|
75
|
+
function BorderPopover({ editor, line, radius, anchorRef, onClose }) {
|
|
76
|
+
const [colorOpen, setColorOpen] = useState(false);
|
|
77
|
+
const colorAnchor = useRef(null);
|
|
78
|
+
const c = () => editor.chain().focus();
|
|
79
|
+
return (_jsx(_Fragment, { children: _jsx(VariantMenu, { ariaLabel: "\uD45C \uD14C\uB450\uB9AC", columns: 4, anchorRef: anchorRef, items: lineItems, value: line ?? 'solid', onPick: (l) => c().setTableLineStyle(l === 'solid' ? null : l).run(), onClose: () => { if (!colorOpen)
|
|
80
|
+
onClose(); }, footer: _jsxs(_Fragment, { children: [_jsxs("div", { className: "vm-axis", "aria-label": "\uBAA8\uC11C\uB9AC", children: [_jsx("span", { className: "vm-axis-name", children: "\uBAA8\uC11C\uB9AC" }), _jsx("button", { type: "button", className: `vm-chip${radius == null ? ' is-on' : ''}`, title: "\uAC01\uC9C0\uAC8C", onMouseDown: (e) => e.preventDefault(), onClick: () => c().setTableRadius(null).run(), children: "\uAC01\uC9C0\uAC8C" }), TABLE_RADII.map((r) => (_jsx("button", { type: "button", className: `vm-chip${radius === r ? ' is-on' : ''}`, title: `모서리 ${RADIUS_LABEL[r]}`, onMouseDown: (e) => e.preventDefault(), onClick: () => c().setTableRadius(r).run(), children: RADIUS_LABEL[r] }, r)))] }), _jsxs("div", { className: "vm-footer", ref: colorAnchor, children: [_jsxs("button", { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => setColorOpen((v) => !v), children: [_jsx(Icon, { name: "bucket", size: 15 }), " \uC120 \uC0C9"] }), colorOpen && (_jsx(ColorPicker, { label: "\uD45C \uC120 \uC0C9", anchorRef: colorAnchor, onPick: (hex) => c().setTableLineColor(hex).run(), onClear: () => c().setTableLineColor(null).run(), onClose: () => { setColorOpen(false); onClose(); } }))] })] }) }) }));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 지금 커서가 있는 행/열 전체를 잡는다 (폰용).
|
|
84
|
+
*
|
|
85
|
+
* `selectParentNode()` 를 쓰면 안 된다 — 그건 셀이 아니라 **문단**을 잡는다.
|
|
86
|
+
*/
|
|
87
|
+
function selectBand(editor, kind) {
|
|
88
|
+
const { state } = editor;
|
|
89
|
+
const $f = state.selection.$from;
|
|
90
|
+
let rowDepth = -1;
|
|
91
|
+
for (let d = $f.depth; d > 0; d--)
|
|
92
|
+
if ($f.node(d).type.name === 'tableRow') {
|
|
93
|
+
rowDepth = d;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
if (rowDepth < 0)
|
|
97
|
+
return;
|
|
98
|
+
const rowPos = $f.before(rowDepth);
|
|
99
|
+
const row = $f.node(rowDepth);
|
|
100
|
+
if (kind === 'row') {
|
|
101
|
+
const cells = [];
|
|
102
|
+
let at = rowPos + 1;
|
|
103
|
+
row.forEach((cell) => { cells.push(at); at += cell.nodeSize; });
|
|
104
|
+
if (cells.length)
|
|
105
|
+
editor.chain().focus().setCellSelection({ anchorCell: cells[0], headCell: cells[cells.length - 1] }).run();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// 열: 이 셀이 몇 번째인지 세고, 표의 첫 행·마지막 행에서 같은 자리를 잡는다
|
|
109
|
+
const cellPos = $f.before(rowDepth + 1);
|
|
110
|
+
let index = 0, at = rowPos + 1;
|
|
111
|
+
row.forEach((cell) => { if (at < cellPos)
|
|
112
|
+
index++; at += cell.nodeSize; });
|
|
113
|
+
const table = $f.node(rowDepth - 1);
|
|
114
|
+
const tablePos = $f.before(rowDepth - 1);
|
|
115
|
+
const nth = (rowIdx) => {
|
|
116
|
+
let p = tablePos + 1;
|
|
117
|
+
for (let i = 0; i < rowIdx; i++)
|
|
118
|
+
p += table.child(i).nodeSize;
|
|
119
|
+
let q = p + 1;
|
|
120
|
+
const r = table.child(rowIdx);
|
|
121
|
+
for (let i = 0; i < index && i < r.childCount; i++)
|
|
122
|
+
q += r.child(i).nodeSize;
|
|
123
|
+
return q;
|
|
124
|
+
};
|
|
125
|
+
if (table.childCount) {
|
|
126
|
+
editor.chain().focus().setCellSelection({ anchorCell: nth(0), headCell: nth(table.childCount - 1) }).run();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export const tableObject = {
|
|
130
|
+
name: 'table',
|
|
131
|
+
label: '표',
|
|
132
|
+
allowsText: true,
|
|
133
|
+
Row: TableRow,
|
|
134
|
+
Overlay: ({ editor }) => _jsx(TableTools, { editor: editor }),
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/objects/table.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/react';
|
|
2
|
+
export type Rect = {
|
|
3
|
+
left: number;
|
|
4
|
+
top: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* 편집 중 움직이는 DOM 요소의 화면 좌표를 따라간다.
|
|
10
|
+
* TableTools 가 쓰던 measure 루프(transaction·selectionUpdate·scroll·resize)를 뽑아
|
|
11
|
+
* 표 오버레이와 객체 툴바가 같은 좌표계를 공유하게 한다.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useDomRect(editor: Editor, pick: () => HTMLElement | null | undefined): Rect | null;
|
|
14
|
+
//# sourceMappingURL=useDomRect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDomRect.d.ts","sourceRoot":"","sources":["../../src/objects/useDomRect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAO/E;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAuBlG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
const rectOf = (el) => {
|
|
3
|
+
const r = el.getBoundingClientRect();
|
|
4
|
+
return { left: r.left, top: r.top, width: r.width, height: r.height };
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* 편집 중 움직이는 DOM 요소의 화면 좌표를 따라간다.
|
|
8
|
+
* TableTools 가 쓰던 measure 루프(transaction·selectionUpdate·scroll·resize)를 뽑아
|
|
9
|
+
* 표 오버레이와 객체 툴바가 같은 좌표계를 공유하게 한다.
|
|
10
|
+
*/
|
|
11
|
+
export function useDomRect(editor, pick) {
|
|
12
|
+
const [rect, setRect] = useState(null);
|
|
13
|
+
const measure = useCallback(() => {
|
|
14
|
+
const el = pick();
|
|
15
|
+
setRect(el ? rectOf(el) : null);
|
|
16
|
+
}, [pick]);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
measure();
|
|
19
|
+
editor.on('selectionUpdate', measure);
|
|
20
|
+
editor.on('transaction', measure);
|
|
21
|
+
window.addEventListener('scroll', measure, true);
|
|
22
|
+
window.addEventListener('resize', measure);
|
|
23
|
+
return () => {
|
|
24
|
+
editor.off('selectionUpdate', measure);
|
|
25
|
+
editor.off('transaction', measure);
|
|
26
|
+
window.removeEventListener('scroll', measure, true);
|
|
27
|
+
window.removeEventListener('resize', measure);
|
|
28
|
+
};
|
|
29
|
+
}, [editor, measure]);
|
|
30
|
+
return rect;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=useDomRect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDomRect.js","sourceRoot":"","sources":["../../src/objects/useDomRect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKxD,MAAM,MAAM,GAAG,CAAC,EAAe,EAAQ,EAAE;IACvC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;IACpC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;AACvE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,IAA0C;IACnF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,EAAE,CAAA;QACjB,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAA;QACT,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QACrC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QACjC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC1C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;YAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACnD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAErB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/react';
|
|
2
|
+
/**
|
|
3
|
+
* 객체 UI(떠 있는 바·오버레이·문맥줄)를 띄워 둘 상황인가.
|
|
4
|
+
*
|
|
5
|
+
* 선택만 보고 띄우면 **에디터 밖을 눌러도 바가 그대로 남는다.** ProseMirror 는 포커스를 잃어도
|
|
6
|
+
* NodeSelection 을 유지하므로 "선택됨" 은 계속 참이기 때문이다.
|
|
7
|
+
*
|
|
8
|
+
* 반대로 `editor.isFocused` 만 보면 툴바의 `select`·슬라이더를 만지는 순간 줄이 사라지고,
|
|
9
|
+
* 프로그램으로 선택만 옮긴 경우(자동 검사·AI 초안 열기)에도 UI 가 안 뜬다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 **"밖을 눌렀다"는 적극적 증거가 있을 때만** 내린다.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useEngaged(_editor: Editor): boolean;
|
|
14
|
+
//# sourceMappingURL=useEngaged.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEngaged.d.ts","sourceRoot":"","sources":["../../src/objects/useEngaged.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAW3C;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAsBnD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 편집면과 우리 UI — 이 안을 누르거나 포커스가 들어오면 여전히 편집 중이다.
|
|
4
|
+
*
|
|
5
|
+
* 클래스 이름을 손으로 나열하다가 표 오버레이(`.tt-layer`)를 빠뜨려서,
|
|
6
|
+
* 행·열 손잡이를 누르는 순간 오버레이가 사라지고 클릭이 증발했다.
|
|
7
|
+
* 그래서 목록이 아니라 **규약**으로 바꾼다 — 떠 있는 편집 UI 는 전부 `data-editor-ui` 를 단다.
|
|
8
|
+
*/
|
|
9
|
+
const MINE = '.ProseMirror, [data-editor-ui]';
|
|
10
|
+
/**
|
|
11
|
+
* 객체 UI(떠 있는 바·오버레이·문맥줄)를 띄워 둘 상황인가.
|
|
12
|
+
*
|
|
13
|
+
* 선택만 보고 띄우면 **에디터 밖을 눌러도 바가 그대로 남는다.** ProseMirror 는 포커스를 잃어도
|
|
14
|
+
* NodeSelection 을 유지하므로 "선택됨" 은 계속 참이기 때문이다.
|
|
15
|
+
*
|
|
16
|
+
* 반대로 `editor.isFocused` 만 보면 툴바의 `select`·슬라이더를 만지는 순간 줄이 사라지고,
|
|
17
|
+
* 프로그램으로 선택만 옮긴 경우(자동 검사·AI 초안 열기)에도 UI 가 안 뜬다.
|
|
18
|
+
*
|
|
19
|
+
* 그래서 **"밖을 눌렀다"는 적극적 증거가 있을 때만** 내린다.
|
|
20
|
+
*/
|
|
21
|
+
export function useEngaged(_editor) {
|
|
22
|
+
const [engaged, setEngaged] = useState(true);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const inside = (t) => {
|
|
25
|
+
const node = t instanceof Node ? t : null;
|
|
26
|
+
const el = node instanceof HTMLElement ? node : node?.parentElement;
|
|
27
|
+
return !!el?.closest(MINE);
|
|
28
|
+
};
|
|
29
|
+
const onEvent = (ev) => setEngaged(inside(ev.target));
|
|
30
|
+
document.addEventListener('mousedown', onEvent, true);
|
|
31
|
+
document.addEventListener('touchstart', onEvent, true);
|
|
32
|
+
document.addEventListener('focusin', onEvent);
|
|
33
|
+
return () => {
|
|
34
|
+
document.removeEventListener('mousedown', onEvent, true);
|
|
35
|
+
document.removeEventListener('touchstart', onEvent, true);
|
|
36
|
+
document.removeEventListener('focusin', onEvent);
|
|
37
|
+
};
|
|
38
|
+
}, []);
|
|
39
|
+
return engaged;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=useEngaged.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEngaged.js","sourceRoot":"","sources":["../../src/objects/useEngaged.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAG3C;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,gCAAgC,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,CAAC,CAAqB,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACzC,MAAM,EAAE,GAAG,IAAI,YAAY,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAA;YACnE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC,CAAA;QACD,MAAM,OAAO,GAAG,CAAC,EAAS,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;QAE5D,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACrD,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACtD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC7C,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACxD,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACzD,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PickOption } from './PickMenu.js';
|
|
2
|
+
import type { IconName } from './Icon.js';
|
|
3
|
+
/**
|
|
4
|
+
* 어휘 → 메뉴 항목. **한 벌만 만든다.**
|
|
5
|
+
*
|
|
6
|
+
* 같은 목록을 쓰는 자리가 둘 이상이다 — 글자 크기는 툴바와 글자 버블이,
|
|
7
|
+
* 언어는 툴바의 ▾ 와 코드 블록 위의 바가 쓴다. 각자 `map` 을 적어 두면
|
|
8
|
+
* 한쪽만 늘어난다.
|
|
9
|
+
* 목록의 내용 자체는 core 의 `vocab.ts` 하나가 정한다 — 여기는 표기만 붙인다.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 글꼴만 **함수**다.
|
|
13
|
+
*
|
|
14
|
+
* 나머지 목록은 어휘가 고정이지만 글꼴은 소비자가 `configureFonts({ extra })` 로 더한다
|
|
15
|
+
* (레포에 직접 들고 있는 글꼴 — 공개 패키지가 재배포할 수 없는 것들). 모듈 최상단에서
|
|
16
|
+
* 한 번 `map` 해 두면 그 호출을 못 본다 — 부팅 순서에 따라 조용히 빈 목록이 된다.
|
|
17
|
+
*/
|
|
18
|
+
export declare const fontItems: () => PickOption<string>[];
|
|
19
|
+
export declare const SIZE_ITEMS: PickOption<string>[];
|
|
20
|
+
/** 빈 값이 「기본」 — 표기를 저장하지 않고 본문 기본(prose.css 의 --leading)을 물려받는다 */
|
|
21
|
+
export declare const LH_ITEMS: PickOption<string>[];
|
|
22
|
+
/** 빈 값이 「텍스트」 — 강조 없이 그대로 */
|
|
23
|
+
export declare const LANG_ITEMS: PickOption<string>[];
|
|
24
|
+
/**
|
|
25
|
+
* 문단 스타일 — h1 은 글 제목이 이미 쓰고 있으므로 본문에는 h2~h4 만 준다.
|
|
26
|
+
* 숫자는 본문 안에서 세어 「제목 1·2·3」 이라 부른다.
|
|
27
|
+
*/
|
|
28
|
+
export type BlockKind = 'p' | 'h2' | 'h3' | 'h4';
|
|
29
|
+
export declare const BLOCK_ITEMS: PickOption<BlockKind>[];
|
|
30
|
+
export type AlignKind = 'left' | 'center' | 'right' | 'justify';
|
|
31
|
+
export declare const ALIGN_ITEMS: {
|
|
32
|
+
value: AlignKind;
|
|
33
|
+
icon: IconName;
|
|
34
|
+
label: string;
|
|
35
|
+
}[];
|
|
36
|
+
//# sourceMappingURL=pickItems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickItems.d.ts","sourceRoot":"","sources":["../src/pickItems.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEtC;;;;;;;GAOG;AACH;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,QAAO,UAAU,CAAC,MAAM,CAAC,EACwB,CAAA;AAEvE,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EACsB,CAAA;AAEjE,kEAAkE;AAClE,eAAO,MAAM,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,EAGxC,CAAA;AAED,6BAA6B;AAC7B,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAG1C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAChD,eAAO,MAAM,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,EAG9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAC/D,eAAO,MAAM,WAAW,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAK5E,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { FONTS, FONT_SIZES, LINE_HEIGHTS } from '@storkspear/post-editor-core/vocab';
|
|
2
|
+
import { LANGUAGES } from '@storkspear/post-editor-core/highlight';
|
|
3
|
+
/**
|
|
4
|
+
* 어휘 → 메뉴 항목. **한 벌만 만든다.**
|
|
5
|
+
*
|
|
6
|
+
* 같은 목록을 쓰는 자리가 둘 이상이다 — 글자 크기는 툴바와 글자 버블이,
|
|
7
|
+
* 언어는 툴바의 ▾ 와 코드 블록 위의 바가 쓴다. 각자 `map` 을 적어 두면
|
|
8
|
+
* 한쪽만 늘어난다.
|
|
9
|
+
* 목록의 내용 자체는 core 의 `vocab.ts` 하나가 정한다 — 여기는 표기만 붙인다.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 글꼴만 **함수**다.
|
|
13
|
+
*
|
|
14
|
+
* 나머지 목록은 어휘가 고정이지만 글꼴은 소비자가 `configureFonts({ extra })` 로 더한다
|
|
15
|
+
* (레포에 직접 들고 있는 글꼴 — 공개 패키지가 재배포할 수 없는 것들). 모듈 최상단에서
|
|
16
|
+
* 한 번 `map` 해 두면 그 호출을 못 본다 — 부팅 순서에 따라 조용히 빈 목록이 된다.
|
|
17
|
+
*/
|
|
18
|
+
export const fontItems = () => FONTS.map((f) => ({ value: f.value, label: f.label, font: f.value }));
|
|
19
|
+
export const SIZE_ITEMS = FONT_SIZES.map((z) => ({ value: String(z), label: String(z) }));
|
|
20
|
+
/** 빈 값이 「기본」 — 표기를 저장하지 않고 본문 기본(prose.css 의 --leading)을 물려받는다 */
|
|
21
|
+
export const LH_ITEMS = [
|
|
22
|
+
{ value: '', label: '기본' },
|
|
23
|
+
...LINE_HEIGHTS.map((v) => ({ value: String(v), label: `${v}%` })),
|
|
24
|
+
];
|
|
25
|
+
/** 빈 값이 「텍스트」 — 강조 없이 그대로 */
|
|
26
|
+
export const LANG_ITEMS = [
|
|
27
|
+
{ value: '', label: '텍스트' },
|
|
28
|
+
...LANGUAGES.map((l) => ({ value: l.id, label: l.label })),
|
|
29
|
+
];
|
|
30
|
+
export const BLOCK_ITEMS = [
|
|
31
|
+
{ value: 'p', label: '본문' }, { value: 'h2', label: '제목 1' },
|
|
32
|
+
{ value: 'h3', label: '제목 2' }, { value: 'h4', label: '제목 3' },
|
|
33
|
+
];
|
|
34
|
+
export const ALIGN_ITEMS = [
|
|
35
|
+
{ value: 'left', icon: 'alignLeft', label: '왼쪽 정렬' },
|
|
36
|
+
{ value: 'center', icon: 'alignCenter', label: '가운데 정렬' },
|
|
37
|
+
{ value: 'right', icon: 'alignRight', label: '오른쪽 정렬' },
|
|
38
|
+
{ value: 'justify', icon: 'alignJustify', label: '양쪽 정렬' },
|
|
39
|
+
];
|
|
40
|
+
//# sourceMappingURL=pickItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickItems.js","sourceRoot":"","sources":["../src/pickItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAIlE;;;;;;;GAOG;AACH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAyB,EAAE,CAClD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,UAAU,GACrB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEjE,kEAAkE;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAyB;IAC5C,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;IAC1B,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;CACnE,CAAA;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;CAC3D,CAAA;AAOD,MAAM,CAAC,MAAM,WAAW,GAA4B;IAClD,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IAC3D,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;CAC/D,CAAA;AAGD,MAAM,CAAC,MAAM,WAAW,GAA0D;IAChF,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;IACpD,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;IACzD,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE;IACvD,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;CAC3D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recentColors.d.ts","sourceRoot":"","sources":["../src/recentColors.ts"],"names":[],"mappings":"AAWA,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhD;AAED,wBAAgB,eAAe;;oBAEI,MAAM;EACxC"}
|