@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 @@
|
|
|
1
|
+
{"version":3,"file":"FigureView.js","sourceRoot":"","sources":["../../src/extensions/FigureView.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type Editor } from '@tiptap/react';
|
|
3
|
+
import type { JSONContent } from '@tiptap/core';
|
|
4
|
+
import { type BannerBleed, type ProseWidth } from '@storkspear/post-editor-core';
|
|
5
|
+
import { Toolbar } from './Toolbar.js';
|
|
6
|
+
import { type TitleValue } from './PostTitle.js';
|
|
7
|
+
import { SelectionBubble } from './SelectionBubble.js';
|
|
8
|
+
import { InsertHandle } from './InsertHandle.js';
|
|
9
|
+
import { ObjectLayer } from './objects/ObjectLayer.js';
|
|
10
|
+
import { ObjectFloat } from './objects/ObjectFloat.js';
|
|
11
|
+
import { registerObject } from './objects/registry.js';
|
|
12
|
+
export type PostEditorProps = {
|
|
13
|
+
/**
|
|
14
|
+
* 열 문서 — 저장해 둔 JSON 이거나 HTML 문자열.
|
|
15
|
+
*
|
|
16
|
+
* 제어 컴포넌트가 **아니다.** 타이핑마다 밖에서 되돌리면 커서가 튀므로, 밖에서 온 값이
|
|
17
|
+
* 지금 문서와 실제로 다를 때만 다시 싣는다. 글을 서버에서 불러와 여는 화면(편집 왕복)은
|
|
18
|
+
* 값이 **나중에** 도착하므로, 처음 한 번만 읽으면 편집기가 빈 채로 남는다.
|
|
19
|
+
*
|
|
20
|
+
* HTML 문자열을 주면 각 확장의 `parseHTML` 을 타서 그 자리에서 값이 검증된다.
|
|
21
|
+
* JSON 을 주면 그 관문이 없으므로 `normalizeDoc` 을 먼저 거친다.
|
|
22
|
+
*/
|
|
23
|
+
value?: JSONContent | string | null;
|
|
24
|
+
/** 문서가 바뀔 때마다. `json` 이 저장 정본, `html` 은 표시용. */
|
|
25
|
+
onChange?: (json: JSONContent, html: string) => void;
|
|
26
|
+
/** 편집기가 준비되면 한 번 — 명령을 직접 부르고 싶을 때 */
|
|
27
|
+
onReady?: (editor: Editor) => void;
|
|
28
|
+
editable?: boolean;
|
|
29
|
+
autofocus?: boolean;
|
|
30
|
+
className?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 글 제목. 주면 편집기가 **직접 그린다** — 툴바가 제목의 서체·크기·정렬·색을 다뤄야 하는데,
|
|
33
|
+
* 소비자가 그린 입력칸은 툴바가 손댈 방법이 없다.
|
|
34
|
+
*/
|
|
35
|
+
title?: TitleValue;
|
|
36
|
+
onTitleChange?: (v: TitleValue) => void;
|
|
37
|
+
/** 툴바와 본문 사이에 끼울 그 밖의 것 */
|
|
38
|
+
head?: ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* 본문 폭 — `'measure'`(38rem, 기본) · `'full'`(화면 끝까지) · `'72rem'` 같은 CSS 길이.
|
|
41
|
+
*
|
|
42
|
+
* 툴바에 **폭 고르개가 들어 있다.** 사용자가 고르면 `onWidthChange` 로 알려 주므로,
|
|
43
|
+
* 소비자는 그 값을 저장했다가 발행 쪽 `PostContent` 에 그대로 넘기면 된다.
|
|
44
|
+
*
|
|
45
|
+
* 이건 **편집기의 계약이다.** 소비자가 `--measure-override` 를 `:root` 에
|
|
46
|
+
* 직접 박았는데, 그러면 변수 이름이 숨은 API 가 되고 폭을 고르는 일이 편집기 밖에 떨어진다
|
|
47
|
+
*. 발행 쪽 `PostContent` 에 **같은 값**을 주면 두 화면이 같아진다.
|
|
48
|
+
*/
|
|
49
|
+
width?: ProseWidth;
|
|
50
|
+
/**
|
|
51
|
+
* 제목 배너를 어디까지 펴는가 — `container`(기본) 또는 `viewport`.
|
|
52
|
+
*
|
|
53
|
+
* 편집기가 카드·패널 안에 들어앉는 곳에서 `viewport` 를 주면 **배너가 카드를 뚫고 나간다.**
|
|
54
|
+
* 페이지를 통째로 쓰는 곳에서만 `viewport` 다.
|
|
55
|
+
*/
|
|
56
|
+
bleed?: BannerBleed;
|
|
57
|
+
/**
|
|
58
|
+
* 툴바가 붙을 자리 — 편집기 **위에 이미 고정돼 있는 것**의 높이(px 또는 CSS 길이).
|
|
59
|
+
*
|
|
60
|
+
* 안 주면 0 이라 스크롤할 때 툴바가 그 위로 올라온다 — 툴바가 더 위 층이다.
|
|
61
|
+
* 숫자를 박지 말고 **재서** 넘길 것: 머리줄이 조금만 높아져도 다시 어긋난다.
|
|
62
|
+
*/
|
|
63
|
+
stickyTop?: number | string;
|
|
64
|
+
/** 툴바의 폭 고르개로 폭이 바뀌었을 때. 안 주면 고르개를 그리지 않는다. */
|
|
65
|
+
onWidthChange?: (v: ProseWidth) => void;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* 글 편집기 한 벌 — 툴바·글자 버블·객체 도구·좌측 `+` 가 모두 들어 있다.
|
|
69
|
+
*
|
|
70
|
+
* ```tsx
|
|
71
|
+
* import { PostEditor } from '@storkspear/post-editor-react'
|
|
72
|
+
* import '@storkspear/post-editor-core/styles.css'
|
|
73
|
+
* import '@storkspear/post-editor-core/fonts.css'
|
|
74
|
+
* import '@storkspear/post-editor-react/styles.css'
|
|
75
|
+
*
|
|
76
|
+
* <PostEditor value={doc} onChange={(json, html) => save({ json, html })} />
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* **들어오는 문서는 반드시 `normalizeDoc` 을 거친다.** `setContent(json)` 은 parseHTML 을
|
|
80
|
+
* 타지 않으므로, AI 가 만든 body_json 의 잘못된 값이 검사 없이 문서에 들어온다.
|
|
81
|
+
*/
|
|
82
|
+
export declare function PostEditor({ value, onChange, onReady, editable, autofocus, className, head, title, onTitleChange, width, bleed, stickyTop, onWidthChange }: PostEditorProps): import("react").JSX.Element | null;
|
|
83
|
+
export { PostTitle, EMPTY_TITLE } from './PostTitle.js';
|
|
84
|
+
export type { TitleBanner, TitleValue } from './PostTitle.js';
|
|
85
|
+
/**
|
|
86
|
+
* 저장해 둔 제목을 다시 열 때 쓴다 — 글을 불러와 고치는 화면은 서버에서 온 값을
|
|
87
|
+
* 그대로 믿을 수 없다(사람이 고친 JSON 도, AI 가 만든 것도 들어온다).
|
|
88
|
+
* `normalizeDoc` 이 본문에 하는 일을 제목에 한다.
|
|
89
|
+
*/
|
|
90
|
+
export { normalizeTitle } from '@storkspear/post-editor-core';
|
|
91
|
+
export { PostContent, PostHead } from './content.js';
|
|
92
|
+
export { WidthToggle } from './WidthToggle.js';
|
|
93
|
+
/** 「가운데폭」이 뜻하는 폭 — 저장한 폭을 다시 읽는 쪽이 같은 값을 봐야 한다 */
|
|
94
|
+
export { CENTERED_WIDTH } from '@storkspear/post-editor-core';
|
|
95
|
+
export { Toolbar, SelectionBubble, InsertHandle, ObjectLayer, ObjectFloat, registerObject };
|
|
96
|
+
export { useUploadCount } from './useUploadCount.js';
|
|
97
|
+
export type { Editor } from '@tiptap/react';
|
|
98
|
+
export type { JSONContent } from '@storkspear/post-editor-core';
|
|
99
|
+
export type { BannerBleed, ProseWidth } from '@storkspear/post-editor-core';
|
|
100
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACvF,OAAO,EAAmD,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAuD,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAIrI,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAqBnD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACvC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;CACxC,CAAA;AAaD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAe,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,eAAe,sCAgHlL;AAGD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC1D;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,kDAAkD;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAA;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { EditorContent, ReactNodeViewRenderer, useEditor } from '@tiptap/react';
|
|
4
|
+
import { postEditorExtensions, normalizeDoc, proseWidthStyle } from '@storkspear/post-editor-core';
|
|
5
|
+
import { FigureView } from './extensions/FigureView.js';
|
|
6
|
+
import { DiagramView } from './extensions/DiagramView.js';
|
|
7
|
+
import { Toolbar } from './Toolbar.js';
|
|
8
|
+
import { PostTitle } from './PostTitle.js';
|
|
9
|
+
import { SelectionBubble } from './SelectionBubble.js';
|
|
10
|
+
import { InsertHandle } from './InsertHandle.js';
|
|
11
|
+
import { ObjectLayer } from './objects/ObjectLayer.js';
|
|
12
|
+
import { ObjectFloat } from './objects/ObjectFloat.js';
|
|
13
|
+
import { registerObject } from './objects/registry.js';
|
|
14
|
+
import { tableObject } from './objects/table.js';
|
|
15
|
+
import { dividerObject } from './objects/divider.js';
|
|
16
|
+
import { codeObject } from './objects/code.js';
|
|
17
|
+
import { figureObject } from './objects/figure.js';
|
|
18
|
+
import { quoteObject } from './objects/quoteRow.js';
|
|
19
|
+
import { imageRowObject } from './objects/imageRow.js';
|
|
20
|
+
import { diagramObject } from './objects/diagram.js';
|
|
21
|
+
/**
|
|
22
|
+
* 객체별 툴바 등록 — 모듈이 실려 오는 순간 한 번.
|
|
23
|
+
* 소비자가 이걸 따로 부르게 하면, 안 부른 채 표를 넣고 "도구가 안 뜬다" 고 하게 된다.
|
|
24
|
+
*/
|
|
25
|
+
registerObject(tableObject);
|
|
26
|
+
registerObject(dividerObject);
|
|
27
|
+
registerObject(codeObject);
|
|
28
|
+
registerObject(figureObject);
|
|
29
|
+
registerObject(quoteObject);
|
|
30
|
+
registerObject(imageRowObject);
|
|
31
|
+
registerObject(diagramObject);
|
|
32
|
+
/**
|
|
33
|
+
* 편집기에 실을 형태로 바꾼다.
|
|
34
|
+
*
|
|
35
|
+
* HTML 문자열은 그대로 — `setContent` 가 각 확장의 `parseHTML` 을 태워 값을 검증한다.
|
|
36
|
+
* JSON 은 그 관문을 타지 않으므로 `normalizeDoc` 이 대신 검사한다.
|
|
37
|
+
*/
|
|
38
|
+
function contentOf(value) {
|
|
39
|
+
if (value == null)
|
|
40
|
+
return '';
|
|
41
|
+
return typeof value === 'string' ? value : normalizeDoc(value);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 글 편집기 한 벌 — 툴바·글자 버블·객체 도구·좌측 `+` 가 모두 들어 있다.
|
|
45
|
+
*
|
|
46
|
+
* ```tsx
|
|
47
|
+
* import { PostEditor } from '@storkspear/post-editor-react'
|
|
48
|
+
* import '@storkspear/post-editor-core/styles.css'
|
|
49
|
+
* import '@storkspear/post-editor-core/fonts.css'
|
|
50
|
+
* import '@storkspear/post-editor-react/styles.css'
|
|
51
|
+
*
|
|
52
|
+
* <PostEditor value={doc} onChange={(json, html) => save({ json, html })} />
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* **들어오는 문서는 반드시 `normalizeDoc` 을 거친다.** `setContent(json)` 은 parseHTML 을
|
|
56
|
+
* 타지 않으므로, AI 가 만든 body_json 의 잘못된 값이 검사 없이 문서에 들어온다.
|
|
57
|
+
*/
|
|
58
|
+
export function PostEditor({ value, onChange, onReady, editable = true, autofocus, className, head, title, onTitleChange, width, bleed, stickyTop, onWidthChange }) {
|
|
59
|
+
/**
|
|
60
|
+
* 제목에 손이 가 있는 동안 — 툴바 아랫줄이 제목 서식으로 바뀐다.
|
|
61
|
+
*
|
|
62
|
+
* 판단을 **포커스가 아니라 누른 자리**로 한다. 창이 OS 포커스를 잃으면 focus 이벤트가
|
|
63
|
+
* 아예 안 오고, 툴바 버튼은 `preventDefault` 로 포커스를
|
|
64
|
+
* 옮기지 않으므로 blur 도 안 온다. `useEngaged` 와 같은 규약이다 —
|
|
65
|
+
* 우리 UI(`[data-editor-ui]`) 안을 누른 것은 「자리를 옮긴 것」으로 세지 않는다.
|
|
66
|
+
*/
|
|
67
|
+
const [onTitle, setOnTitle] = useState(false);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const down = (ev) => {
|
|
70
|
+
const node = ev.target instanceof Node ? ev.target : null;
|
|
71
|
+
const el = node instanceof HTMLElement ? node : node?.parentElement;
|
|
72
|
+
if (el?.closest('.post-title')) {
|
|
73
|
+
setOnTitle(true);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (el?.closest('[data-editor-ui]'))
|
|
77
|
+
return;
|
|
78
|
+
setOnTitle(false);
|
|
79
|
+
};
|
|
80
|
+
document.addEventListener('mousedown', down, true);
|
|
81
|
+
document.addEventListener('touchstart', down, true);
|
|
82
|
+
return () => {
|
|
83
|
+
document.removeEventListener('mousedown', down, true);
|
|
84
|
+
document.removeEventListener('touchstart', down, true);
|
|
85
|
+
};
|
|
86
|
+
}, []);
|
|
87
|
+
/**
|
|
88
|
+
* 마지막으로 **우리가 내보낸** 문서. 부모가 `onChange` 로 받은 값을 그대로 `value` 로
|
|
89
|
+
* 되돌려주는 흔한 배선에서, 그것을 다시 싣지 않기 위한 표식이다. 없으면
|
|
90
|
+
* 내보내기 → 되돌아오기 → 다시 싣기 가 서로를 부른다.
|
|
91
|
+
*/
|
|
92
|
+
const lastEmitted = useRef(null);
|
|
93
|
+
/** 마지막으로 **실은** 값. 문자열로 들어오는 경로를 걸러내는 데 쓴다(아래 주석 참조). */
|
|
94
|
+
const lastLoaded = useRef(null);
|
|
95
|
+
const editor = useEditor({
|
|
96
|
+
extensions: postEditorExtensions({
|
|
97
|
+
figureView: ReactNodeViewRenderer(FigureView),
|
|
98
|
+
diagramView: ReactNodeViewRenderer(DiagramView),
|
|
99
|
+
}),
|
|
100
|
+
content: contentOf(value),
|
|
101
|
+
editable,
|
|
102
|
+
autofocus,
|
|
103
|
+
editorProps: { attributes: { class: 'prose-body' } },
|
|
104
|
+
onUpdate: ({ editor: e }) => {
|
|
105
|
+
const json = e.getJSON();
|
|
106
|
+
lastEmitted.current = json;
|
|
107
|
+
onChange?.(json, e.getHTML());
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
useEffect(() => { if (editor)
|
|
111
|
+
onReady?.(editor); }, [editor, onReady]);
|
|
112
|
+
/**
|
|
113
|
+
* 밖에서 문서가 도착하면 싣는다 — 서버에서 글을 불러와 여는 화면이 이 경로다.
|
|
114
|
+
*
|
|
115
|
+
* 두 번 거른다. 우리가 방금 내보낸 그 객체면 건너뛰고(같은 참조), 내용이 지금 문서와
|
|
116
|
+
* 같아도 건너뛴다. 거르지 않으면 타이핑 도중에 문서가 통째로 다시 깔려 커서가 맨 앞으로 튄다.
|
|
117
|
+
*/
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
if (!editor || value == null)
|
|
120
|
+
return;
|
|
121
|
+
if (value === lastEmitted.current)
|
|
122
|
+
return;
|
|
123
|
+
/**
|
|
124
|
+
* 같은 값이 다시 와도 싣지 않는다.
|
|
125
|
+
*
|
|
126
|
+
* JSON 은 지금 문서와 견주면 되지만 **HTML 문자열은 그럴 수 없다** — `getHTML()` 은
|
|
127
|
+
* 들어온 문자열과 표기가 달라 늘 불일치로 나온다. 그래서 문자열은 「직전에 실은 것과
|
|
128
|
+
* 같은가」로 본다. 이 가드가 없으면 `onChange` 의 html 을 그대로 `value` 로 되돌려주는
|
|
129
|
+
* 배선에서 키 입력마다 문서가 다시 깔려 커서·선택·되돌리기가 전부 날아간다.
|
|
130
|
+
*/
|
|
131
|
+
if (typeof value === 'string' && value === lastLoaded.current)
|
|
132
|
+
return;
|
|
133
|
+
const next = contentOf(value);
|
|
134
|
+
if (typeof next !== 'string' && JSON.stringify(next) === JSON.stringify(editor.getJSON()))
|
|
135
|
+
return;
|
|
136
|
+
lastLoaded.current = value;
|
|
137
|
+
editor.commands.setContent(next, { emitUpdate: true });
|
|
138
|
+
}, [editor, value]);
|
|
139
|
+
useEffect(() => { if (editor)
|
|
140
|
+
editor.setEditable(editable); }, [editor, editable]);
|
|
141
|
+
if (!editor)
|
|
142
|
+
return null;
|
|
143
|
+
/**
|
|
144
|
+
* 폭은 **편집기가 들고 있다.** 툴바의 고르개가 여기를 바꾼다.
|
|
145
|
+
* 밖에서 `width` 를 바꿔 주면 그것이 이긴다(글을 다시 열 때 저장된 폭으로 돌아온다).
|
|
146
|
+
*/
|
|
147
|
+
const [w, setW] = useState(width ?? 'measure');
|
|
148
|
+
useEffect(() => { if (width != null)
|
|
149
|
+
setW(width); }, [width]);
|
|
150
|
+
const pickWidth = (v) => { setW(v); onWidthChange?.(v); };
|
|
151
|
+
return (_jsxs(_Fragment, { children: [editable && (_jsx(Toolbar, { editor: editor, title: onTitle && title && onTitleChange ? { value: title, onChange: onTitleChange } : null, width: w, onWidth: onWidthChange ? pickWidth : undefined, stickyTop: stickyTop })), title && onTitleChange && (_jsx(PostTitle, { value: title, onChange: onTitleChange, width: w, bleed: bleed, onFocus: () => setOnTitle(true) })), head, _jsxs("div", { className: `prose editor-surface${className ? ` ${className}` : ''}`, style: proseWidthStyle(w), children: [editable && (_jsxs(_Fragment, { children: [_jsx(SelectionBubble, { editor: editor }), _jsx(ObjectLayer, { editor: editor }), _jsx(ObjectFloat, { editor: editor }), _jsx(InsertHandle, { editor: editor })] })), _jsx(EditorContent, { editor: editor })] })] }));
|
|
152
|
+
}
|
|
153
|
+
export { PostTitle, EMPTY_TITLE } from './PostTitle.js';
|
|
154
|
+
/**
|
|
155
|
+
* 저장해 둔 제목을 다시 열 때 쓴다 — 글을 불러와 고치는 화면은 서버에서 온 값을
|
|
156
|
+
* 그대로 믿을 수 없다(사람이 고친 JSON 도, AI 가 만든 것도 들어온다).
|
|
157
|
+
* `normalizeDoc` 이 본문에 하는 일을 제목에 한다.
|
|
158
|
+
*/
|
|
159
|
+
export { normalizeTitle } from '@storkspear/post-editor-core';
|
|
160
|
+
export { PostContent, PostHead } from './content.js';
|
|
161
|
+
export { WidthToggle } from './WidthToggle.js';
|
|
162
|
+
/** 「가운데폭」이 뜻하는 폭 — 저장한 폭을 다시 읽는 쪽이 같은 값을 봐야 한다 */
|
|
163
|
+
export { CENTERED_WIDTH } from '@storkspear/post-editor-core';
|
|
164
|
+
export { Toolbar, SelectionBubble, InsertHandle, ObjectLayer, ObjectFloat, registerObject };
|
|
165
|
+
export { useUploadCount } from './useUploadCount.js';
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Editor } from '@tiptap/react';
|
|
2
|
+
/**
|
|
3
|
+
* 선택된 객체 위에 뜨는 작은 바.
|
|
4
|
+
*
|
|
5
|
+
* 글자 버블(BubbleMenu)과 따로 두는 이유: 기준이 커서가 아니라 **블록**이고,
|
|
6
|
+
* 표 오버레이와 같은 좌표계(fixed)를 써야 둘이 어긋나지 않는다.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ObjectFloat({ editor }: {
|
|
9
|
+
editor: Editor;
|
|
10
|
+
}): import("react").JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=ObjectFloat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectFloat.d.ts","sourceRoot":"","sources":["../../src/objects/ObjectFloat.tsx"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAM3D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,sCAgCzD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { useEditorState } from '@tiptap/react';
|
|
4
|
+
import { OBJECTS, findActiveObject } from './registry.js';
|
|
5
|
+
import { useDomRect } from './useDomRect.js';
|
|
6
|
+
import { useEngaged } from './useEngaged.js';
|
|
7
|
+
import { bubbleShows } from '../bubbleShows.js';
|
|
8
|
+
/**
|
|
9
|
+
* 선택된 객체 위에 뜨는 작은 바.
|
|
10
|
+
*
|
|
11
|
+
* 글자 버블(BubbleMenu)과 따로 두는 이유: 기준이 커서가 아니라 **블록**이고,
|
|
12
|
+
* 표 오버레이와 같은 좌표계(fixed)를 써야 둘이 어긋나지 않는다.
|
|
13
|
+
*/
|
|
14
|
+
export function ObjectFloat({ editor }) {
|
|
15
|
+
const obj = useEditorState({ editor, selector: () => findActiveObject(editor) });
|
|
16
|
+
const kind = obj ? OBJECTS[obj.kind] : null;
|
|
17
|
+
const pick = useCallback(() => {
|
|
18
|
+
if (!obj || !kind)
|
|
19
|
+
return null;
|
|
20
|
+
return kind.anchor ? kind.anchor(obj.dom) : obj.dom;
|
|
21
|
+
}, [obj, kind]);
|
|
22
|
+
const rect = useDomRect(editor, pick);
|
|
23
|
+
const engaged = useEngaged(editor);
|
|
24
|
+
if (!obj || !kind?.Float || !rect)
|
|
25
|
+
return null;
|
|
26
|
+
// 글자를 잡으면 이 줄은 글자 버블로 합쳐진다 — 둘 다 띄우면 포갠다
|
|
27
|
+
if (kind.Bubble && bubbleShows(editor))
|
|
28
|
+
return null;
|
|
29
|
+
// 에디터 밖을 누르면 감춘다 — 선택은 남아 있어도 편집 중이 아니다
|
|
30
|
+
if (!engaged)
|
|
31
|
+
return null;
|
|
32
|
+
// 대상이 화면 밖으로 스크롤되면 감춘다 — 안 그러면 바만 엉뚱한 자리에 떠 있는다
|
|
33
|
+
if (rect.top + rect.height < 56 || rect.top > window.innerHeight - 8)
|
|
34
|
+
return null;
|
|
35
|
+
// 폰에서는 phoneFloat 가 켜진 종류만
|
|
36
|
+
if (window.matchMedia('(pointer: coarse)').matches && !kind.phoneFloat)
|
|
37
|
+
return null;
|
|
38
|
+
const top = Math.max(6, rect.top - 44);
|
|
39
|
+
const left = Math.max(6, Math.min(window.innerWidth - 6, rect.left + rect.width / 2));
|
|
40
|
+
return (_jsx("div", { className: "obj-float", "data-editor-ui": "", style: { top, left, transform: 'translateX(-50%)' }, role: "toolbar", "aria-label": `${kind.label} 도구`, children: _jsx(kind.Float, { editor: editor, m: obj }) }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ObjectFloat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectFloat.js","sourceRoot":"","sources":["../../src/objects/ObjectFloat.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,cAAc,EAAe,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAuB,CAAA;IACtG,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAE3C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;IACrD,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IAEf,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAGlC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAC9C,yCAAyC;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IACnD,wCAAwC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,gDAAgD;IAChD,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACjF,2BAA2B;IAC3B,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAEnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;IAErF,OAAO,CACL,cAAK,SAAS,EAAC,WAAW,oBAAgB,EAAE,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAC,SAAS,gBAClG,GAAG,IAAI,CAAC,KAAK,KAAK,YAC9B,KAAC,IAAI,CAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,GAAI,GAClC,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Editor } from '@tiptap/react';
|
|
2
|
+
/**
|
|
3
|
+
* 선택된 객체의 오버레이를 그린다.
|
|
4
|
+
* 어떤 객체가 잡혔는지 판단하는 곳은 registry 하나뿐이고,
|
|
5
|
+
* 여기는 그 결과에 달린 컴포넌트를 꽂기만 한다.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ObjectLayer({ editor }: {
|
|
8
|
+
editor: Editor;
|
|
9
|
+
}): import("react").JSX.Element | null;
|
|
10
|
+
//# sourceMappingURL=ObjectLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectLayer.d.ts","sourceRoot":"","sources":["../../src/objects/ObjectLayer.tsx"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAG3D;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,sCAOzD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEngaged } from './useEngaged.js';
|
|
3
|
+
import { useEditorState } from '@tiptap/react';
|
|
4
|
+
import { OBJECTS, findActiveObject } from './registry.js';
|
|
5
|
+
/**
|
|
6
|
+
* 선택된 객체의 오버레이를 그린다.
|
|
7
|
+
* 어떤 객체가 잡혔는지 판단하는 곳은 registry 하나뿐이고,
|
|
8
|
+
* 여기는 그 결과에 달린 컴포넌트를 꽂기만 한다.
|
|
9
|
+
*/
|
|
10
|
+
export function ObjectLayer({ editor }) {
|
|
11
|
+
const obj = useEditorState({ editor, selector: () => findActiveObject(editor) });
|
|
12
|
+
const engaged = useEngaged(editor);
|
|
13
|
+
if (!obj || !engaged)
|
|
14
|
+
return null;
|
|
15
|
+
const kind = OBJECTS[obj.kind];
|
|
16
|
+
if (!kind?.Overlay)
|
|
17
|
+
return null;
|
|
18
|
+
return _jsx(kind.Overlay, { editor: editor, m: obj });
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ObjectLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectLayer.js","sourceRoot":"","sources":["../../src/objects/ObjectLayer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,cAAc,EAAe,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAA;AAExE;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAuB,CAAA;IACtG,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,CAAA;IAC/B,OAAO,KAAC,IAAI,CAAC,OAAO,IAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,GAAI,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/react';
|
|
2
|
+
import type { ObjectMatch } from './registry.js';
|
|
3
|
+
/** 화면의 실제 폭을 읽어 프리셋을 % 로 환산한다 — 드래그와 같은 속성을 쓰므로 어긋나지 않는다 */
|
|
4
|
+
export declare function presets(): {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
pct: number;
|
|
8
|
+
}[];
|
|
9
|
+
export declare function AlignButtons({ editor, m, type }: {
|
|
10
|
+
editor: Editor;
|
|
11
|
+
m: ObjectMatch;
|
|
12
|
+
type: string;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
export declare function WidthSlider({ editor, m, type }: {
|
|
15
|
+
editor: Editor;
|
|
16
|
+
m: ObjectMatch;
|
|
17
|
+
type: string;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
export declare function WidthPresets({ editor, type }: {
|
|
20
|
+
editor: Editor;
|
|
21
|
+
type: string;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* 그 블록을 지운다.
|
|
25
|
+
*
|
|
26
|
+
* `deleteSelection()` 을 쓰면 **캡션에 커서가 있을 때 아무 일도 일어나지 않는다** — 지울 선택이 없기 때문.
|
|
27
|
+
* 지울 대상은 커서가 아니라 잡혀 있는 객체이므로 노드 범위를 직접 지운다.
|
|
28
|
+
*/
|
|
29
|
+
export declare function delNode(editor: Editor, m: ObjectMatch): void;
|
|
30
|
+
//# sourceMappingURL=blockSize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockSize.d.ts","sourceRoot":"","sources":["../../src/objects/blockSize.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAG3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAW7C,4DAA4D;AAC5D,wBAAgB,OAAO,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBvE;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,+BAkBjG;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,+BAUhG;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,+BAY9E;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,QAErD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from '../Icon.js';
|
|
3
|
+
import { BLOCK_ALIGNS } from '@storkspear/post-editor-core/vocab';
|
|
4
|
+
/**
|
|
5
|
+
* 폭·정렬 컨트롤 — **사진과 사진 행이 함께 쓴다.**
|
|
6
|
+
*
|
|
7
|
+
* 둘의 폭 모델이 같기 때문이다(본문 폭 대비 15~100%, 정렬 셋). 각자 한 벌씩 만들면
|
|
8
|
+
* 한쪽만 고쳐져 어긋난다. 바꾸는 노드 이름만 인자로 받는다.
|
|
9
|
+
*/
|
|
10
|
+
const ALIGN_ICON = { left: 'alignLeft', center: 'alignCenter', right: 'alignRight' };
|
|
11
|
+
const ALIGN_LABEL = { left: '왼쪽', center: '가운데', right: '오른쪽' };
|
|
12
|
+
/** 화면의 실제 폭을 읽어 프리셋을 % 로 환산한다 — 드래그와 같은 속성을 쓰므로 어긋나지 않는다 */
|
|
13
|
+
export function presets() {
|
|
14
|
+
const body = document.querySelector('.prose-body');
|
|
15
|
+
const host = body?.getBoundingClientRect().width ?? 1;
|
|
16
|
+
const css = getComputedStyle(document.documentElement);
|
|
17
|
+
const probe = (v, fallback) => {
|
|
18
|
+
const raw = css.getPropertyValue(v).trim();
|
|
19
|
+
if (raw.endsWith('%'))
|
|
20
|
+
return (parseFloat(raw) / 100) * host;
|
|
21
|
+
if (raw.endsWith('rem'))
|
|
22
|
+
return parseFloat(raw) * 16;
|
|
23
|
+
return fallback;
|
|
24
|
+
};
|
|
25
|
+
const measure = probe('--measure-override', host);
|
|
26
|
+
const wide = probe('--wide-override', host);
|
|
27
|
+
const out = [{ key: 'full', label: '꽉', pct: 100 }];
|
|
28
|
+
if (wide < host - 1)
|
|
29
|
+
out.unshift({ key: 'wide', label: '넓게', pct: Math.round((wide / host) * 100) });
|
|
30
|
+
if (measure < host - 1)
|
|
31
|
+
out.unshift({ key: 'text', label: '본문폭', pct: Math.round((measure / host) * 100) });
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
export function AlignButtons({ editor, m, type }) {
|
|
35
|
+
const align = m.node.attrs.align ?? 'center';
|
|
36
|
+
const width = Number(m.node.attrs.width) || 100;
|
|
37
|
+
const full = width >= 100;
|
|
38
|
+
return (_jsx(_Fragment, { children: BLOCK_ALIGNS.map((a) => (_jsx("button", { type: "button", className: `tb-btn${align === a ? ' is-on' : ''}`, disabled: full, title: full ? '폭이 100% 면 정렬이 의미 없습니다' : `${ALIGN_LABEL[a]} 정렬`, "aria-label": `${ALIGN_LABEL[a]} 정렬`, onMouseDown: (e) => e.preventDefault(), onClick: () => editor.chain().focus().updateAttributes(type, { align: a }).run(), children: _jsx(Icon, { name: ALIGN_ICON[a] }) }, a))) }));
|
|
39
|
+
}
|
|
40
|
+
export function WidthSlider({ editor, m, type }) {
|
|
41
|
+
const w = Number(m.node.attrs.width) || 100;
|
|
42
|
+
return (_jsxs("label", { className: "tb-width-inline", children: ["\uD3ED", _jsx("input", { type: "range", min: 15, max: 100, step: 1, value: w, onChange: (e) => editor.chain().focus().updateAttributes(type, { width: Number(e.target.value) }).run() }), _jsx("b", { children: w }), _jsx("i", { children: "%" })] }));
|
|
43
|
+
}
|
|
44
|
+
export function WidthPresets({ editor, type }) {
|
|
45
|
+
return (_jsx(_Fragment, { children: presets().map((p) => (_jsx("button", { type: "button", className: "tb-btn", title: `크기 — ${p.label}`, onMouseDown: (e) => e.preventDefault(), onClick: () => editor.chain().focus().updateAttributes(type, { width: p.pct }).run(), children: _jsx("span", { className: "tb-txt", children: p.label }) }, p.key))) }));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 그 블록을 지운다.
|
|
49
|
+
*
|
|
50
|
+
* `deleteSelection()` 을 쓰면 **캡션에 커서가 있을 때 아무 일도 일어나지 않는다** — 지울 선택이 없기 때문.
|
|
51
|
+
* 지울 대상은 커서가 아니라 잡혀 있는 객체이므로 노드 범위를 직접 지운다.
|
|
52
|
+
*/
|
|
53
|
+
export function delNode(editor, m) {
|
|
54
|
+
editor.chain().focus().deleteRange({ from: m.pos, to: m.pos + m.node.nodeSize }).run();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=blockSize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockSize.js","sourceRoot":"","sources":["../../src/objects/blockSize.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/objects/code.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAA;AAsFzD,eAAO,MAAM,UAAU,EAAE,UASxB,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { normalizeLang, parseRanges } from '@storkspear/post-editor-core/highlight';
|
|
3
|
+
import { CODE_THEMES, oneOf } from '@storkspear/post-editor-core/vocab';
|
|
4
|
+
import { Picker } from '../PickMenu.js';
|
|
5
|
+
import { LANG_ITEMS } from '../pickItems.js';
|
|
6
|
+
/**
|
|
7
|
+
* 속성을 바꾼다.
|
|
8
|
+
*
|
|
9
|
+
* **`focus()` 를 부르지 않는다.** 부르면 입력칸을 치는 도중에 포커스가 편집면으로 끌려가
|
|
10
|
+
* 한 글자마다 포커스가 풀리고, 한글은 조합이 끊겨 자음만 남는다.
|
|
11
|
+
* 선택 위치는 포커스와 무관하게 유지되므로 명령은 그대로 먹는다.
|
|
12
|
+
*/
|
|
13
|
+
/** 「모양」 고르개의 항목. mac 은 언어 라벨을 감추므로 그 사실을 이름에 담는다 */
|
|
14
|
+
const THEME_ITEMS = [
|
|
15
|
+
{ value: 'plain', label: '기본' },
|
|
16
|
+
{ value: 'mac', label: '맥 창' },
|
|
17
|
+
{ value: 'terminal', label: '터미널' },
|
|
18
|
+
];
|
|
19
|
+
const setAttrs = (editor, attrs) => editor.chain().setCodeAttrs(attrs).run();
|
|
20
|
+
/**
|
|
21
|
+
* 코드 블록이 잡혔을 때의 **아랫줄** — 모양과 언어.
|
|
22
|
+
*
|
|
23
|
+
* 표가 아랫줄에 스타일·테두리·셀 색을 두는 것과 같은 자리다. 무엇이 잡혔든 고르는 것은
|
|
24
|
+
* 늘 같은 높이에 있어야 손이 헤매지 않는다.
|
|
25
|
+
*
|
|
26
|
+
* 블록 위에 뜨는 바에도 같은 둘이 있다. 겹쳐 보이지만 하는 일이 다르다 —
|
|
27
|
+
* 위의 바는 **그 블록에 붙어** 따라다니고(여러 개를 오갈 때), 아랫줄은 **자리가 고정**이다.
|
|
28
|
+
* 제목 입력칸은 여기 두지 않는다: 코드를 넣자마자 빈 칸부터 눈에 띄고, 손은 코드에
|
|
29
|
+
* 있는데 칸은 화면 위에 있어 무엇을 고치는 중인지 안 보였다.
|
|
30
|
+
*/
|
|
31
|
+
function CodeRow({ editor, m }) {
|
|
32
|
+
const a = m.node.attrs;
|
|
33
|
+
return (_jsxs(_Fragment, { children: [_jsx(Picker, { title: "\uBAA8\uC591", className: "tb-codetheme", width: 150, items: THEME_ITEMS, value: oneOf(CODE_THEMES, a.theme, 'plain'), onPick: (v) => setAttrs(editor, { theme: v }) }), _jsx("span", { className: "tb-div" }), _jsx(Picker, { title: "\uC5B8\uC5B4", className: "tb-lang", width: 168, items: LANG_ITEMS, value: normalizeLang(a.language) ?? '', onPick: (v) => setAttrs(editor, { language: v || null }) }), _jsx("span", { className: "tb-div" }), _jsx("input", { className: "tb-input tb-code-title", placeholder: "\uC18C\uC2A4\uCF54\uB4DC Title", value: a.title ?? '', onChange: (e) => setAttrs(editor, { title: e.target.value || null }) })] }));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 코드 블록 위에 뜨는 작은 바 — 효과가 보이는 자리에서 고른다.
|
|
37
|
+
*
|
|
38
|
+
* 강조 해제도 여기 둔다. 강조는 본문의 줄 번호를 눌러서 켜는 것이라,
|
|
39
|
+
* 푸는 수단도 그 옆에 있어야 한다(아랫줄에 있으면 무엇을 푸는지가 안 보인다).
|
|
40
|
+
*/
|
|
41
|
+
function CodeFloat({ editor, m }) {
|
|
42
|
+
const a = m.node.attrs;
|
|
43
|
+
const hlCount = parseRanges(a.highlight ?? '').size;
|
|
44
|
+
return (_jsxs(_Fragment, { children: [_jsx(Picker, { title: "\uBAA8\uC591", className: "tb-codetheme", width: 150, items: THEME_ITEMS, value: oneOf(CODE_THEMES, a.theme, 'plain'), onPick: (v) => setAttrs(editor, { theme: v }) }), _jsx("span", { className: "tb-div" }), _jsx(Picker, { title: "\uC5B8\uC5B4", className: "tb-lang", width: 168, items: LANG_ITEMS, value: normalizeLang(a.language) ?? '', onPick: (v) => setAttrs(editor, { language: v || null }) }), hlCount > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "tb-div" }), _jsx("button", { type: "button", className: "tb-btn", title: "\uAC15\uC870\uD55C \uC904 \uC804\uBD80 \uD574\uC81C", onMouseDown: (e) => e.preventDefault(), onClick: () => setAttrs(editor, { highlight: null }), children: _jsxs("span", { className: "tb-txt", children: ["\uAC15\uC870 ", hlCount, "\uC904 \uD574\uC81C"] }) })] }))] }));
|
|
45
|
+
}
|
|
46
|
+
export const codeObject = {
|
|
47
|
+
name: 'codeBlock',
|
|
48
|
+
label: '코드',
|
|
49
|
+
Row: CodeRow,
|
|
50
|
+
Float: CodeFloat,
|
|
51
|
+
phoneFloat: true,
|
|
52
|
+
/** 기준은 코드 블록의 겉상자 — 그 위에 바가 붙는다 */
|
|
53
|
+
anchor: (dom) => (dom.tagName.toLowerCase() === 'details' ? dom : dom.querySelector('details')) ?? dom,
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/objects/code.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type DiagramEngine } from '@storkspear/post-editor-core/vocab';
|
|
2
|
+
import type { VariantRow } from '../VariantMenu.js';
|
|
3
|
+
import { type MermaidSeed } from '../seeds/mermaid.js';
|
|
4
|
+
import type { ObjectKind } from './registry.js';
|
|
5
|
+
export type DrawioSeed = 'aws' | 'azure' | 'ec2docker' | 'userflow';
|
|
6
|
+
export type DiagramSeed = MermaidSeed | DrawioSeed;
|
|
7
|
+
/** 고른 샘플을 노드 attrs 로. drawio 만 기다린다 */
|
|
8
|
+
export declare function loadDiagramSeed(seed: DiagramSeed): Promise<{
|
|
9
|
+
engine: DiagramEngine;
|
|
10
|
+
src: string;
|
|
11
|
+
svg: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* 한 판에 여덟, 두 줄로 나눈다.
|
|
15
|
+
*
|
|
16
|
+
* 다섯은 글로 쓰고 셋은 캔버스를 연다 — 그 갈림이 안 보이면 「AWS 말고 다른 배치도는
|
|
17
|
+
* 어디서 그리나」를 또 묻게 된다. 실제로 나온 질문이다.
|
|
18
|
+
*/
|
|
19
|
+
export declare const diagramRows: VariantRow<DiagramSeed>[];
|
|
20
|
+
export declare const diagramObject: ObjectKind;
|
|
21
|
+
//# sourceMappingURL=diagram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../src/objects/diagram.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAA;AAMzD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAA;AACnE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AA0BlD,uCAAuC;AACvC,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,GACrD,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7D;AAKD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,EAKhD,CAAA;AAiFD,eAAO,MAAM,aAAa,EAAE,UAa3B,CAAA"}
|