@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.
Files changed (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/ColorPicker.d.ts +11 -0
  4. package/dist/ColorPicker.d.ts.map +1 -0
  5. package/dist/ColorPicker.js +30 -0
  6. package/dist/ColorPicker.js.map +1 -0
  7. package/dist/DrawioModal.d.ts +9 -0
  8. package/dist/DrawioModal.d.ts.map +1 -0
  9. package/dist/DrawioModal.js +97 -0
  10. package/dist/DrawioModal.js.map +1 -0
  11. package/dist/FontMenu.d.ts +14 -0
  12. package/dist/FontMenu.d.ts.map +1 -0
  13. package/dist/FontMenu.js +14 -0
  14. package/dist/FontMenu.js.map +1 -0
  15. package/dist/Icon.d.ts +69 -0
  16. package/dist/Icon.d.ts.map +1 -0
  17. package/dist/Icon.js +47 -0
  18. package/dist/Icon.js.map +1 -0
  19. package/dist/InsertHandle.d.ts +14 -0
  20. package/dist/InsertHandle.d.ts.map +1 -0
  21. package/dist/InsertHandle.js +60 -0
  22. package/dist/InsertHandle.js.map +1 -0
  23. package/dist/PickMenu.d.ts +61 -0
  24. package/dist/PickMenu.d.ts.map +1 -0
  25. package/dist/PickMenu.js +57 -0
  26. package/dist/PickMenu.js.map +1 -0
  27. package/dist/Popover.d.ts +20 -0
  28. package/dist/Popover.d.ts.map +1 -0
  29. package/dist/Popover.js +22 -0
  30. package/dist/Popover.js.map +1 -0
  31. package/dist/PostTitle.d.ts +33 -0
  32. package/dist/PostTitle.d.ts.map +1 -0
  33. package/dist/PostTitle.js +171 -0
  34. package/dist/PostTitle.js.map +1 -0
  35. package/dist/SelectionBubble.d.ts +6 -0
  36. package/dist/SelectionBubble.d.ts.map +1 -0
  37. package/dist/SelectionBubble.js +71 -0
  38. package/dist/SelectionBubble.js.map +1 -0
  39. package/dist/TableTools.d.ts +10 -0
  40. package/dist/TableTools.d.ts.map +1 -0
  41. package/dist/TableTools.js +200 -0
  42. package/dist/TableTools.js.map +1 -0
  43. package/dist/Toolbar.d.ts +17 -0
  44. package/dist/Toolbar.d.ts.map +1 -0
  45. package/dist/Toolbar.js +333 -0
  46. package/dist/Toolbar.js.map +1 -0
  47. package/dist/UrlPrompt.d.ts +24 -0
  48. package/dist/UrlPrompt.d.ts.map +1 -0
  49. package/dist/UrlPrompt.js +53 -0
  50. package/dist/UrlPrompt.js.map +1 -0
  51. package/dist/VariantMenu.d.ts +47 -0
  52. package/dist/VariantMenu.d.ts.map +1 -0
  53. package/dist/VariantMenu.js +21 -0
  54. package/dist/VariantMenu.js.map +1 -0
  55. package/dist/WidthToggle.d.ts +19 -0
  56. package/dist/WidthToggle.d.ts.map +1 -0
  57. package/dist/WidthToggle.js +17 -0
  58. package/dist/WidthToggle.js.map +1 -0
  59. package/dist/bubbleShows.d.ts +10 -0
  60. package/dist/bubbleShows.d.ts.map +1 -0
  61. package/dist/bubbleShows.js +29 -0
  62. package/dist/bubbleShows.js.map +1 -0
  63. package/dist/content-baked.d.ts +22 -0
  64. package/dist/content-baked.d.ts.map +1 -0
  65. package/dist/content-baked.js +21 -0
  66. package/dist/content-baked.js.map +1 -0
  67. package/dist/content.d.ts +29 -0
  68. package/dist/content.d.ts.map +1 -0
  69. package/dist/content.js +35 -0
  70. package/dist/content.js.map +1 -0
  71. package/dist/extensions/DiagramView.d.ts +26 -0
  72. package/dist/extensions/DiagramView.d.ts.map +1 -0
  73. package/dist/extensions/DiagramView.js +146 -0
  74. package/dist/extensions/DiagramView.js.map +1 -0
  75. package/dist/extensions/FigureView.d.ts +3 -0
  76. package/dist/extensions/FigureView.d.ts.map +1 -0
  77. package/dist/extensions/FigureView.js +108 -0
  78. package/dist/extensions/FigureView.js.map +1 -0
  79. package/dist/index.d.ts +100 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +166 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/objects/ObjectFloat.d.ts +11 -0
  84. package/dist/objects/ObjectFloat.d.ts.map +1 -0
  85. package/dist/objects/ObjectFloat.js +42 -0
  86. package/dist/objects/ObjectFloat.js.map +1 -0
  87. package/dist/objects/ObjectLayer.d.ts +10 -0
  88. package/dist/objects/ObjectLayer.d.ts.map +1 -0
  89. package/dist/objects/ObjectLayer.js +20 -0
  90. package/dist/objects/ObjectLayer.js.map +1 -0
  91. package/dist/objects/blockSize.d.ts +30 -0
  92. package/dist/objects/blockSize.d.ts.map +1 -0
  93. package/dist/objects/blockSize.js +56 -0
  94. package/dist/objects/blockSize.js.map +1 -0
  95. package/dist/objects/code.d.ts +3 -0
  96. package/dist/objects/code.d.ts.map +1 -0
  97. package/dist/objects/code.js +55 -0
  98. package/dist/objects/code.js.map +1 -0
  99. package/dist/objects/diagram.d.ts +21 -0
  100. package/dist/objects/diagram.d.ts.map +1 -0
  101. package/dist/objects/diagram.js +109 -0
  102. package/dist/objects/diagram.js.map +1 -0
  103. package/dist/objects/diagramGlyphs.d.ts +12 -0
  104. package/dist/objects/diagramGlyphs.d.ts.map +1 -0
  105. package/dist/objects/diagramGlyphs.js +49 -0
  106. package/dist/objects/diagramGlyphs.js.map +1 -0
  107. package/dist/objects/divider.d.ts +22 -0
  108. package/dist/objects/divider.d.ts.map +1 -0
  109. package/dist/objects/divider.js +60 -0
  110. package/dist/objects/divider.js.map +1 -0
  111. package/dist/objects/figure.d.ts +3 -0
  112. package/dist/objects/figure.d.ts.map +1 -0
  113. package/dist/objects/figure.js +62 -0
  114. package/dist/objects/figure.js.map +1 -0
  115. package/dist/objects/imageRow.d.ts +3 -0
  116. package/dist/objects/imageRow.d.ts.map +1 -0
  117. package/dist/objects/imageRow.js +29 -0
  118. package/dist/objects/imageRow.js.map +1 -0
  119. package/dist/objects/quote.d.ts +6 -0
  120. package/dist/objects/quote.d.ts.map +1 -0
  121. package/dist/objects/quote.js +13 -0
  122. package/dist/objects/quote.js.map +1 -0
  123. package/dist/objects/quoteGlyphs.d.ts +6 -0
  124. package/dist/objects/quoteGlyphs.d.ts.map +1 -0
  125. package/dist/objects/quoteGlyphs.js +28 -0
  126. package/dist/objects/quoteGlyphs.js.map +1 -0
  127. package/dist/objects/quoteRow.d.ts +3 -0
  128. package/dist/objects/quoteRow.d.ts.map +1 -0
  129. package/dist/objects/quoteRow.js +61 -0
  130. package/dist/objects/quoteRow.js.map +1 -0
  131. package/dist/objects/registry.d.ts +60 -0
  132. package/dist/objects/registry.d.ts.map +1 -0
  133. package/dist/objects/registry.js +45 -0
  134. package/dist/objects/registry.js.map +1 -0
  135. package/dist/objects/table.d.ts +11 -0
  136. package/dist/objects/table.d.ts.map +1 -0
  137. package/dist/objects/table.js +136 -0
  138. package/dist/objects/table.js.map +1 -0
  139. package/dist/objects/useDomRect.d.ts +14 -0
  140. package/dist/objects/useDomRect.d.ts.map +1 -0
  141. package/dist/objects/useDomRect.js +32 -0
  142. package/dist/objects/useDomRect.js.map +1 -0
  143. package/dist/objects/useEngaged.d.ts +14 -0
  144. package/dist/objects/useEngaged.d.ts.map +1 -0
  145. package/dist/objects/useEngaged.js +41 -0
  146. package/dist/objects/useEngaged.js.map +1 -0
  147. package/dist/pickItems.d.ts +36 -0
  148. package/dist/pickItems.d.ts.map +1 -0
  149. package/dist/pickItems.js +40 -0
  150. package/dist/pickItems.js.map +1 -0
  151. package/dist/recentColors.d.ts +7 -0
  152. package/dist/recentColors.d.ts.map +1 -0
  153. package/dist/recentColors.js +30 -0
  154. package/dist/recentColors.js.map +1 -0
  155. package/dist/seeds/drawio/aws.d.ts +15 -0
  156. package/dist/seeds/drawio/aws.d.ts.map +1 -0
  157. package/dist/seeds/drawio/aws.js +15 -0
  158. package/dist/seeds/drawio/aws.js.map +1 -0
  159. package/dist/seeds/drawio/azure.d.ts +14 -0
  160. package/dist/seeds/drawio/azure.d.ts.map +1 -0
  161. package/dist/seeds/drawio/azure.js +14 -0
  162. package/dist/seeds/drawio/azure.js.map +1 -0
  163. package/dist/seeds/drawio/ec2docker.d.ts +15 -0
  164. package/dist/seeds/drawio/ec2docker.d.ts.map +1 -0
  165. package/dist/seeds/drawio/ec2docker.js +15 -0
  166. package/dist/seeds/drawio/ec2docker.js.map +1 -0
  167. package/dist/seeds/drawio/userflow.d.ts +21 -0
  168. package/dist/seeds/drawio/userflow.d.ts.map +1 -0
  169. package/dist/seeds/drawio/userflow.js +21 -0
  170. package/dist/seeds/drawio/userflow.js.map +1 -0
  171. package/dist/seeds/mermaid.d.ts +19 -0
  172. package/dist/seeds/mermaid.d.ts.map +1 -0
  173. package/dist/seeds/mermaid.js +82 -0
  174. package/dist/seeds/mermaid.js.map +1 -0
  175. package/dist/useAnchoredPos.d.ts +22 -0
  176. package/dist/useAnchoredPos.d.ts.map +1 -0
  177. package/dist/useAnchoredPos.js +57 -0
  178. package/dist/useAnchoredPos.js.map +1 -0
  179. package/dist/useDismiss.d.ts +17 -0
  180. package/dist/useDismiss.d.ts.map +1 -0
  181. package/dist/useDismiss.js +36 -0
  182. package/dist/useDismiss.js.map +1 -0
  183. package/dist/useLastVariant.d.ts +9 -0
  184. package/dist/useLastVariant.d.ts.map +1 -0
  185. package/dist/useLastVariant.js +33 -0
  186. package/dist/useLastVariant.js.map +1 -0
  187. package/dist/useUploadCount.d.ts +3 -0
  188. package/dist/useUploadCount.d.ts.map +1 -0
  189. package/dist/useUploadCount.js +9 -0
  190. package/dist/useUploadCount.js.map +1 -0
  191. package/package.json +57 -0
  192. 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,7 @@
1
+ export declare function loadRecent(): string[];
2
+ export declare function pushRecent(hex: string): string[];
3
+ export declare function useRecentColors(): {
4
+ recent: string[];
5
+ remember: (hex: string) => void;
6
+ };
7
+ //# sourceMappingURL=recentColors.d.ts.map
@@ -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"}