@lumir-company/editor 0.4.14 → 0.4.16
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/README.md +135 -8
- package/dist/index.d.mts +81 -1
- package/dist/index.d.ts +81 -1
- package/dist/index.js +1548 -457
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1492 -379
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +258 -41
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
- [업로드 진행률 표시](#업로드-진행률-표시-이미지동영상-공통)
|
|
22
22
|
- [이미지·동영상 업로드 상세 가이드](#이미지동영상-업로드-상세-가이드)
|
|
23
23
|
- [이미지·비디오 삭제](#이미지비디오-삭제)
|
|
24
|
+
- [테이블](#테이블)
|
|
25
|
+
- [글자 크기](#글자-크기)
|
|
24
26
|
- [HTML 미리보기](#html-미리보기)
|
|
25
27
|
- [Placeholder](#placeholder)
|
|
26
28
|
- [링크 프리뷰](#링크-프리뷰)
|
|
@@ -40,6 +42,8 @@
|
|
|
40
42
|
| **S3 연동** | Presigned URL 기반 S3 업로드 내장 |
|
|
41
43
|
| **파일명 커스터마이징** | 업로드 파일명 변경 콜백 + UUID 자동 추가 지원 |
|
|
42
44
|
| **로딩 스피너** | 이미지 업로드 중 자동 스피너 표시 |
|
|
45
|
+
| **테이블** | Notion 스타일 행·열·셀 grip 핸들, 셀 배경색, Excel 셀 붙여넣기 지원 |
|
|
46
|
+
| **글자 크기** | 인라인 글자 크기 변경 (프리셋 8단계 + 기본), 구버전 호환 직렬화 |
|
|
43
47
|
| **성능 최적화** | 애니메이션 비활성화로 빠른 렌더링 |
|
|
44
48
|
| **TypeScript** | 완전한 타입 안전성 |
|
|
45
49
|
| **테마 지원** | 라이트/다크 테마 및 커스텀 테마 |
|
|
@@ -894,6 +898,87 @@ const handleImageDelete = async (imageUrl: string) => {
|
|
|
894
898
|
|
|
895
899
|
---
|
|
896
900
|
|
|
901
|
+
## 테이블
|
|
902
|
+
|
|
903
|
+
슬래시 메뉴(`/`)에서 "Table"을 선택하거나 Excel/스프레드시트 셀을 붙여넣어 테이블을 만들 수 있습니다.
|
|
904
|
+
|
|
905
|
+
### Notion 스타일 grip 핸들
|
|
906
|
+
|
|
907
|
+
셀에 포커스하면 셀 주변에 핸들(grip)이 표시됩니다.
|
|
908
|
+
|
|
909
|
+
| 위치 | 동작 |
|
|
910
|
+
| ------------- | --------------------------------------------------------------------- |
|
|
911
|
+
| **상단 grip** | 클릭 → 열 메뉴 (열 삭제, 왼쪽/오른쪽에 열 추가, 색) / 드래그 → 열 이동 |
|
|
912
|
+
| **좌측 grip** | 클릭 → 행 메뉴 (행 삭제, 위/아래에 행 추가, 색) / 드래그 → 행 이동 |
|
|
913
|
+
| **우측 grip** | hover → 셀 메뉴 (셀 배경색 등) |
|
|
914
|
+
|
|
915
|
+
- 행/열 메뉴가 열리면 해당 행/열 전체가 하이라이트됩니다
|
|
916
|
+
- 표 우측/하단 가장자리 hover 시 행/열 추가 버튼이 표시됩니다
|
|
917
|
+
|
|
918
|
+
### 셀 배경색·정렬
|
|
919
|
+
|
|
920
|
+
- **단일 셀**: 우측 grip 또는 행/열 메뉴의 "색" 항목에서 셀 배경색 적용
|
|
921
|
+
- **다중 셀**: 셀을 드래그로 범위 선택한 뒤 플로팅 툴바의 색상 버튼으로 일괄 적용
|
|
922
|
+
- **정렬**: 셀 선택 후 툴바의 정렬 버튼으로 셀 단위 텍스트 정렬 적용
|
|
923
|
+
|
|
924
|
+
### Excel/스프레드시트 붙여넣기
|
|
925
|
+
|
|
926
|
+
Excel 등에서 복사한 셀 범위를 붙여넣으면(`Ctrl+V`) 이미지가 아닌 **편집 가능한 테이블**로 삽입됩니다. 셀 배경색, 글자색, 정렬, 굵게/기울임/밑줄 서식이 함께 변환됩니다.
|
|
927
|
+
|
|
928
|
+
### 테이블 기능 설정 (`tables` prop)
|
|
929
|
+
|
|
930
|
+
```tsx
|
|
931
|
+
<LumirEditor
|
|
932
|
+
tables={{
|
|
933
|
+
splitCells: true, // 셀 병합/분할 (기본: true)
|
|
934
|
+
cellBackgroundColor: true, // 셀 배경색 (기본: true)
|
|
935
|
+
cellTextColor: true, // 셀 글자색 (기본: true)
|
|
936
|
+
headers: true, // 헤더 행/열 (기본: true)
|
|
937
|
+
}}
|
|
938
|
+
/>
|
|
939
|
+
```
|
|
940
|
+
|
|
941
|
+
테이블 핸들 UI 전체를 끄려면 `tableHandles={false}`를 사용합니다.
|
|
942
|
+
|
|
943
|
+
---
|
|
944
|
+
|
|
945
|
+
## 글자 크기
|
|
946
|
+
|
|
947
|
+
텍스트를 선택한 뒤 **포매팅 툴바** 또는 **상단 고정 툴바(FloatingMenu)** 의 글자 크기 드롭다운으로 인라인 글자 크기를 변경할 수 있습니다.
|
|
948
|
+
|
|
949
|
+
- 프리셋: **기본**(14px, 스타일 제거) / 10 / 12 / 14 / 16 / 18 / 20 / 24 / 28 (px)
|
|
950
|
+
- 테이블 셀 내부 텍스트에도 동일하게 적용됩니다 (인라인 스타일)
|
|
951
|
+
- 외부 HTML(웹페이지·Excel 등)을 붙여넣을 때의 글자 크기는 가져오지 않습니다
|
|
952
|
+
|
|
953
|
+
### 하위호환 직렬화 포맷 (중요)
|
|
954
|
+
|
|
955
|
+
글자 크기는 저장 JSON에서 `styles` 맵이 아닌 **styled-text의 형제(sibling) 키 `fontSize`** 로 직렬화됩니다:
|
|
956
|
+
|
|
957
|
+
```json
|
|
958
|
+
{
|
|
959
|
+
"type": "paragraph",
|
|
960
|
+
"content": [
|
|
961
|
+
{ "type": "text", "text": "큰 글씨", "styles": { "bold": true }, "fontSize": "18px" }
|
|
962
|
+
]
|
|
963
|
+
}
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
이유: BlockNote는 `styles` 맵에 스키마에 없는 스타일 키가 있으면 예외를 던지므로,
|
|
967
|
+
`styles.fontSize`로 저장하면 **fontSize 스펙이 없는 구버전 SDK(≤0.4.15)가 해당 JSON을
|
|
968
|
+
`initialContent`로 로드할 때 에디터가 크래시**합니다. 형제 키 방식은 구버전에서
|
|
969
|
+
조용히 무시되어(글자 크기만 미표시) 안전하게 로드됩니다.
|
|
970
|
+
|
|
971
|
+
- 에디터 로드/저장 시 변환은 자동입니다 (`initialContent` ↔ `onContentChange`)
|
|
972
|
+
- BlockNote 외부 렌더러에서 저장 JSON을 직접 렌더링한다면, 공개 export된
|
|
973
|
+
`liftFontSize(blocks)`로 형제 키를 `styles.fontSize`로 복원한 뒤 사용하세요
|
|
974
|
+
- 직렬화 형태 타입은 `SerializedStyledText`로 export됩니다
|
|
975
|
+
|
|
976
|
+
> ⚠️ 에디터 블록 JSON을 외부로 내보내는 새 경로를 추가할 경우 반드시
|
|
977
|
+
> `lowerFontSize`를 거쳐야 합니다. `styles.fontSize`가 저장 JSON에 유출되면
|
|
978
|
+
> 구버전 소비 앱이 크래시합니다.
|
|
979
|
+
|
|
980
|
+
---
|
|
981
|
+
|
|
897
982
|
## HTML 미리보기
|
|
898
983
|
|
|
899
984
|
LumirEditor는 HTML 파일을 iframe을 사용하여 미리보기할 수 있는 커스텀 블록을 제공합니다. 편집 불가능한 순수 미리보기 기능으로, HTML 문서를 안전하게 표시할 수 있습니다.
|
|
@@ -912,7 +997,7 @@ HTML 파일(`.html`, `.htm`)을 에디터에 드래그 앤 드롭하면 자동
|
|
|
912
997
|
- **특징**:
|
|
913
998
|
- 편집 불가능한 순수 미리보기
|
|
914
999
|
- 접기/펼치기 기능
|
|
915
|
-
- 안전한 sandbox 처리 (`allow-same-origin
|
|
1000
|
+
- 안전한 sandbox 처리 (`allow-scripts`·`allow-same-origin` 미허용 → JavaScript 실행 및 부모 페이지 접근 차단)
|
|
916
1001
|
- 파일명 표시
|
|
917
1002
|
|
|
918
1003
|
#### 2. 슬래시 메뉴
|
|
@@ -926,7 +1011,7 @@ HTML 파일(`.html`, `.htm`)을 에디터에 드래그 앤 드롭하면 자동
|
|
|
926
1011
|
### 특징
|
|
927
1012
|
|
|
928
1013
|
- **iframe 기반**: HTML 문서를 독립된 iframe에서 안전하게 렌더링
|
|
929
|
-
- **Sandbox 보안**: `sandbox="allow-
|
|
1014
|
+
- **Sandbox 보안**: `sandbox="allow-popups allow-forms"` — `allow-scripts`와 `allow-same-origin`을 의도적으로 제외하여 JavaScript 실행과 부모 페이지 접근을 차단
|
|
930
1015
|
- **접기/펼치기**: 헤더 클릭으로 미리보기 영역 토글
|
|
931
1016
|
- **드래그 리사이즈**: 하단 핸들을 드래그하여 높이 조절 가능 (100px ~ 1200px)
|
|
932
1017
|
- **새 창 열기**: HTML 문서를 새 창에서 전체 화면으로 확인
|
|
@@ -956,7 +1041,7 @@ function App() {
|
|
|
956
1041
|
### 프로그래밍 방식으로 블록 삽입
|
|
957
1042
|
|
|
958
1043
|
```tsx
|
|
959
|
-
import {
|
|
1044
|
+
import { HtmlPreviewBlock } from "@lumir-company/editor";
|
|
960
1045
|
|
|
961
1046
|
// 에디터 인스턴스에서 직접 블록 삽입
|
|
962
1047
|
editor.insertBlocks([
|
|
@@ -973,7 +1058,7 @@ editor.insertBlocks([
|
|
|
973
1058
|
|
|
974
1059
|
### 주의사항
|
|
975
1060
|
|
|
976
|
-
- HTML 내용은 iframe의 `sandbox="allow-
|
|
1061
|
+
- HTML 내용은 iframe의 `sandbox="allow-popups allow-forms"` 속성으로 보안이 강화되어 있습니다 (`allow-scripts`·`allow-same-origin` 미허용)
|
|
977
1062
|
- **JavaScript는 의도적으로 비활성화**되어 있습니다 (보안상 이유)
|
|
978
1063
|
- 외부 리소스(CSS, JS, 이미지 등)는 상대 경로가 작동하지 않을 수 있습니다
|
|
979
1064
|
- 인라인 CSS 스타일을 권장합니다
|
|
@@ -1093,7 +1178,9 @@ app.get("/api/link-preview", async (req, res) => {
|
|
|
1093
1178
|
| `editable` | `boolean` | `true` | 편집 가능 여부 |
|
|
1094
1179
|
| `placeholder` | `string` | `undefined` | 빈 블록 안내 텍스트 |
|
|
1095
1180
|
| `linkPreview` | `{ apiEndpoint: string }` | `undefined` | 링크 프리뷰 설정 |
|
|
1096
|
-
| `theme` | `"light" \| "dark"`
|
|
1181
|
+
| `theme` | `"light" \| "dark" \| ThemeObject` | `"light"` | 테마 (커스텀 테마 객체 지원) |
|
|
1182
|
+
| `allowVideoUpload` | `boolean` | `false` | 동영상 업로드 허용 |
|
|
1183
|
+
| `tables` | `TableConfig` | 모두 `true` | 테이블 기능 설정 ([테이블](#테이블) 참고) |
|
|
1097
1184
|
| `className` | `string` | `""` | CSS 클래스 |
|
|
1098
1185
|
| `maxImageFileSize` | `number` | `undefined` | 이미지 최대 용량(바이트). 미설정 시 10MB |
|
|
1099
1186
|
| `maxVideoFileSize` | `number` | `undefined` | 동영상 최대 용량(바이트). 미설정 시 100MB |
|
|
@@ -1150,7 +1237,12 @@ interface LumirEditorProps {
|
|
|
1150
1237
|
onError?: (error: LumirEditorError) => void; // 에러 발생 시 호출
|
|
1151
1238
|
|
|
1152
1239
|
// 기능 설정
|
|
1153
|
-
tables?:
|
|
1240
|
+
tables?: {
|
|
1241
|
+
splitCells?: boolean; // 셀 병합/분할 (기본: true)
|
|
1242
|
+
cellBackgroundColor?: boolean; // 셀 배경색 (기본: true)
|
|
1243
|
+
cellTextColor?: boolean; // 셀 글자색 (기본: true)
|
|
1244
|
+
headers?: boolean; // 헤더 행/열 (기본: true)
|
|
1245
|
+
};
|
|
1154
1246
|
heading?: { levels?: (1 | 2 | 3 | 4 | 5 | 6)[] }; // 헤딩 레벨 설정 (기본: [1,2,3,4,5,6])
|
|
1155
1247
|
defaultStyles?: boolean; // 기본 스타일 활성화 (기본: true)
|
|
1156
1248
|
disableExtensions?: string[]; // 비활성화할 확장 기능 목록
|
|
@@ -1159,7 +1251,7 @@ interface LumirEditorProps {
|
|
|
1159
1251
|
|
|
1160
1252
|
// === UI 설정 ===
|
|
1161
1253
|
editable?: boolean; // 편집 가능 여부 (기본: true)
|
|
1162
|
-
theme?: "light" | "dark" | ThemeObject; // 에디터 테마 (기본: "light")
|
|
1254
|
+
theme?: "light" | "dark" | ThemeObject | { light: ThemeObject; dark: ThemeObject }; // 에디터 테마 (기본: "light")
|
|
1163
1255
|
formattingToolbar?: boolean; // 서식 툴바 표시 (기본: true)
|
|
1164
1256
|
linkToolbar?: boolean; // 링크 툴바 표시 (기본: true)
|
|
1165
1257
|
sideMenu?: boolean; // 사이드 메뉴 표시 (기본: true)
|
|
@@ -1167,6 +1259,8 @@ interface LumirEditorProps {
|
|
|
1167
1259
|
emojiPicker?: boolean; // 이모지 선택기 표시 (기본: true)
|
|
1168
1260
|
filePanel?: boolean; // 파일 패널 표시 (기본: true)
|
|
1169
1261
|
tableHandles?: boolean; // 테이블 핸들 표시 (기본: true)
|
|
1262
|
+
floatingMenu?: boolean; // 상단 고정 플로팅 메뉴 표시 (기본: false)
|
|
1263
|
+
floatingMenuPosition?: "sticky" | "fixed"; // 플로팅 메뉴 위치 (기본: "sticky")
|
|
1170
1264
|
className?: string; // 컨테이너 CSS 클래스
|
|
1171
1265
|
|
|
1172
1266
|
// === 링크 프리뷰 설정 ===
|
|
@@ -1384,7 +1478,40 @@ const url = await uploader(imageFile);
|
|
|
1384
1478
|
|
|
1385
1479
|
## 변경 로그
|
|
1386
1480
|
|
|
1387
|
-
### v0.4.
|
|
1481
|
+
### v0.4.16
|
|
1482
|
+
|
|
1483
|
+
- **인라인 글자 크기 (Font Size)**
|
|
1484
|
+
- 포매팅 툴바·상단 고정 툴바(FloatingMenu)에 글자 크기 드롭다운 추가 (기본 + 10~28px 프리셋 8단계)
|
|
1485
|
+
- 커스텀 `fontSize` 스타일 스펙 등록 (`FontSize` export)
|
|
1486
|
+
- **구버전 호환 직렬화**: 저장 JSON에는 `styles.fontSize` 대신 styled-text 형제 키 `fontSize`로 기록 — fontSize 스펙이 없는 구버전 SDK(≤0.4.15)에서도 파싱 오류 없이 로드(글자 크기만 무시)
|
|
1487
|
+
- `liftFontSize`/`lowerFontSize` 변환 유틸 및 `SerializedStyledText` 타입 공개 export
|
|
1488
|
+
- **`floatingMenu` 사용 시 팝업 포매팅 툴바 동작 개선**
|
|
1489
|
+
- 일반 텍스트 선택 시 선택 팝업 툴바를 표시하지 않음 (상단 고정 툴바와 중복 + 상단 툴바에서 스타일 적용 직후 팝업이 잘못된 위치(0,0)에 재표시되던 문제 수정)
|
|
1490
|
+
- 테이블 셀 컨텍스트(셀 병합·세로 정렬·셀 배경)와 이미지/노드 선택(캡션·교체·다운로드 등)은 팝업에만 있는 도구이므로 기존대로 팝업 표시
|
|
1491
|
+
|
|
1492
|
+
### v0.4.15
|
|
1493
|
+
|
|
1494
|
+
- **Notion 스타일 테이블 셀 색상·정렬·포커스 핸들**
|
|
1495
|
+
- 셀 focus 시 상(열)·좌(행)·우(셀) gutter/grip 표시, grip 클릭으로 행·열·셀 드롭다운 메뉴 (`LumirTableHandlesController`)
|
|
1496
|
+
- 셀 배경색 지원: 셀 메뉴의 "색" 항목 및 플로팅 툴바에서 다중 셀 드래그 선택 후 일괄 적용
|
|
1497
|
+
- 텍스트 색·배경 vs 셀 배경을 구분한 컨텍스트 라벨 색상 컨트롤
|
|
1498
|
+
- 상단 고정 툴바(FloatingMenu)의 정렬·배경색 버튼이 테이블 셀에 올바르게 적용되도록 수정
|
|
1499
|
+
- 행/열 grip 메뉴가 열려 범위 하이라이트 중일 때 셀 우측 grip 미노출 처리
|
|
1500
|
+
|
|
1501
|
+
### v0.4.14
|
|
1502
|
+
|
|
1503
|
+
- **Excel/스프레드시트 셀 붙여넣기 → 편집 가능한 테이블**
|
|
1504
|
+
- Excel 복사 시 클립보드의 비트맵 이미지가 업로드되어 테이블이 무시되던 문제 수정
|
|
1505
|
+
- 클립보드 HTML에 `<table>`이 있으면 이미지보다 우선 파싱하여 실제 테이블 블록 생성
|
|
1506
|
+
- Excel 서식(셀 배경, 글자색, 정렬, 굵게/기울임/밑줄)을 BlockNote 속성으로 매핑
|
|
1507
|
+
|
|
1508
|
+
### v0.4.13
|
|
1509
|
+
|
|
1510
|
+
- **@tiptap/core 외부화(externalize)**
|
|
1511
|
+
- 번들에 포함된 @tiptap/core 중복으로 발생하던 `proseMirrorPlugins` 런타임 에러 수정
|
|
1512
|
+
- `@tiptap/core`를 peerDependency로 전환하고 빌드에서 external 처리
|
|
1513
|
+
|
|
1514
|
+
### v0.4.12
|
|
1388
1515
|
|
|
1389
1516
|
- **Numbered List & Bullet List font size 14px**
|
|
1390
1517
|
- Numbered List & Bullet List의 font size 14px로 일반 텍스트 크기와 통일성 있게 변경
|
package/dist/index.d.mts
CHANGED
|
@@ -138,6 +138,53 @@ interface LumirEditorProps {
|
|
|
138
138
|
onImageDelete?: (imageUrl: string) => void;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
/**
|
|
142
|
+
* 글자 크기(fontSize) 직렬화 호환 레이어.
|
|
143
|
+
*
|
|
144
|
+
* 배경:
|
|
145
|
+
* - BlockNote는 인라인 `styles` 맵에 스키마에 없는 키가 있으면
|
|
146
|
+
* `style ${name} not found in styleSchema` 예외를 던진다(blockToNode →
|
|
147
|
+
* styledTextToNodes). 이미 배포된 구버전 SDK(≤0.4.15, fontSize 스펙 없음)가
|
|
148
|
+
* `styles.fontSize`가 포함된 JSON을 initialContent로 받으면 에디터 생성이
|
|
149
|
+
* 실패하며 React 트리가 크래시한다.
|
|
150
|
+
* - 반면 styled-text 객체의 **형제(sibling) 키**는 BlockNote가 읽지 않으므로
|
|
151
|
+
* 조용히 무시된다(크래시 없음).
|
|
152
|
+
*
|
|
153
|
+
* 전략:
|
|
154
|
+
* - 저장/전달용 JSON(onContentChange 출력)에서는 `styles.fontSize`를 형제 키
|
|
155
|
+
* `fontSize`로 내린다(lowerFontSize).
|
|
156
|
+
* - 로드 시(initialContent)에는 형제 키를 다시 `styles.fontSize`로 올려
|
|
157
|
+
* 신버전 에디터가 렌더링하게 한다(liftFontSize).
|
|
158
|
+
*
|
|
159
|
+
* ⚠️ 불변 규칙: 에디터 외부로 블록 JSON을 내보내는 모든 경로는 반드시
|
|
160
|
+
* lowerFontSize를 거쳐야 한다(현재 출력 표면은 onContentChange 유일).
|
|
161
|
+
* styles.fontSize가 저장 JSON에 유출되면 구버전 소비 앱이 크래시한다.
|
|
162
|
+
*/
|
|
163
|
+
/**
|
|
164
|
+
* 직렬화(저장) 포맷의 styled-text 항목.
|
|
165
|
+
* fontSize는 styles 맵이 아닌 형제 키로 존재한다 — 구버전 SDK(≤0.4.15)는
|
|
166
|
+
* styles만 순회하므로 이 키를 조용히 무시한다(파싱 오류 없음).
|
|
167
|
+
*/
|
|
168
|
+
type SerializedStyledText = {
|
|
169
|
+
type: "text";
|
|
170
|
+
text: string;
|
|
171
|
+
styles: Record<string, unknown>;
|
|
172
|
+
/** 인라인 글자 크기(예: "18px"). 구버전 SDK에서는 무시됨 */
|
|
173
|
+
fontSize?: string;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* 출력 방향: `styles.fontSize` → 형제 키 `fontSize`.
|
|
177
|
+
* onContentChange로 내보내는 블록 JSON에 적용해 구버전 SDK 크래시를 방지한다.
|
|
178
|
+
* 입력을 변형하지 않는다(불변).
|
|
179
|
+
*/
|
|
180
|
+
declare function lowerFontSize(blocks: DefaultPartialBlock[]): DefaultPartialBlock[];
|
|
181
|
+
/**
|
|
182
|
+
* 입력 방향: 형제 키 `fontSize` → `styles.fontSize`.
|
|
183
|
+
* initialContent를 에디터에 넘기기 전에 적용해 글자 크기를 복원한다.
|
|
184
|
+
* 입력을 변형하지 않는다(불변).
|
|
185
|
+
*/
|
|
186
|
+
declare function liftFontSize(blocks: DefaultPartialBlock[]): DefaultPartialBlock[];
|
|
187
|
+
|
|
141
188
|
/**
|
|
142
189
|
* 콘텐츠 관리 유틸리티
|
|
143
190
|
* 기본 블록 생성 및 콘텐츠 검증 로직을 담당
|
|
@@ -852,6 +899,13 @@ declare const schema: BlockNoteSchema<_blocknote_core.BlockSchemaFromSpecs<{
|
|
|
852
899
|
implementation: any;
|
|
853
900
|
};
|
|
854
901
|
}>, _blocknote_core.StyleSchemaFromSpecs<{
|
|
902
|
+
fontSize: {
|
|
903
|
+
config: {
|
|
904
|
+
type: string;
|
|
905
|
+
propSchema: "string";
|
|
906
|
+
};
|
|
907
|
+
implementation: _blocknote_core.StyleImplementation;
|
|
908
|
+
};
|
|
855
909
|
bold: {
|
|
856
910
|
config: {
|
|
857
911
|
type: string;
|
|
@@ -980,6 +1034,32 @@ interface FloatingMenuProps {
|
|
|
980
1034
|
*/
|
|
981
1035
|
declare const FloatingMenu: React.FC<FloatingMenuProps>;
|
|
982
1036
|
|
|
1037
|
+
/**
|
|
1038
|
+
* 인라인 글자 크기 커스텀 스타일.
|
|
1039
|
+
*
|
|
1040
|
+
* - propSchema "string": 값으로 "18px" 같은 CSS 크기를 가진다.
|
|
1041
|
+
* - HTML 직렬화: `<span data-style-type="fontSize" data-value="18px" style="font-size:18px">`
|
|
1042
|
+
* (BlockNote가 data-* 속성과 파싱 규칙을 자동 생성 → 신버전 에디터 간 복사/붙여넣기 왕복 보장,
|
|
1043
|
+
* 구버전 에디터는 매칭 파싱 규칙이 없어 조용히 무시)
|
|
1044
|
+
*
|
|
1045
|
+
* ⚠️ 저장 JSON 하위호환: BlockNote는 styles 맵에 스키마에 없는 키가 있으면
|
|
1046
|
+
* `style ... not found in styleSchema` 예외를 던지므로, 저장 JSON에는
|
|
1047
|
+
* styles.fontSize 대신 형제 키 fontSize로 직렬화한다.
|
|
1048
|
+
* → src/utils/font-size-serialization.ts (liftFontSize/lowerFontSize) 참고.
|
|
1049
|
+
*/
|
|
1050
|
+
declare const FontSize: {
|
|
1051
|
+
config: {
|
|
1052
|
+
type: string;
|
|
1053
|
+
propSchema: "string";
|
|
1054
|
+
};
|
|
1055
|
+
implementation: _blocknote_core.StyleImplementation;
|
|
1056
|
+
};
|
|
1057
|
+
/** 툴바 드롭다운에서 제공하는 프리셋 (본문 기본은 14px = "기본") */
|
|
1058
|
+
declare const FONT_SIZE_PRESETS: readonly ["10px", "12px", "14px", "16px", "18px", "20px", "24px", "28px"];
|
|
1059
|
+
type FontSizePreset = (typeof FONT_SIZE_PRESETS)[number];
|
|
1060
|
+
|
|
1061
|
+
declare function FontSizeButton(): react_jsx_runtime.JSX.Element | null;
|
|
1062
|
+
|
|
983
1063
|
/**
|
|
984
1064
|
* 색상 팔레트 상수
|
|
985
1065
|
* BlockNote 기본 색상 팔레트와 일치
|
|
@@ -1002,4 +1082,4 @@ declare const BACKGROUND_COLORS: ColorItem[];
|
|
|
1002
1082
|
*/
|
|
1003
1083
|
declare const getHexFromColorValue: (value: string, type: "text" | "background") => string;
|
|
1004
1084
|
|
|
1005
|
-
export { BACKGROUND_COLORS, type ColorItem, ContentUtils, type DefaultPartialBlock, EditorConfig, type EditorType, FloatingMenu, HtmlPreviewBlock, schema as HtmlPreviewSchema, type LinkMetadata, LinkPreviewBlock, LumirEditor, LumirEditorError, type LumirEditorProps, type LumirErrorCode, type LumirErrorDetails, type S3UploaderConfig, TEXT_COLORS, clearMetadataCache, cn, createS3Uploader, fetchLinkMetadata, getHexFromColorValue };
|
|
1085
|
+
export { BACKGROUND_COLORS, type ColorItem, ContentUtils, type DefaultPartialBlock, EditorConfig, type EditorType, FONT_SIZE_PRESETS, FloatingMenu, FontSize, FontSizeButton, type FontSizePreset, HtmlPreviewBlock, schema as HtmlPreviewSchema, type LinkMetadata, LinkPreviewBlock, LumirEditor, LumirEditorError, type LumirEditorProps, type LumirErrorCode, type LumirErrorDetails, type S3UploaderConfig, type SerializedStyledText, TEXT_COLORS, clearMetadataCache, cn, createS3Uploader, fetchLinkMetadata, getHexFromColorValue, liftFontSize, lowerFontSize };
|
package/dist/index.d.ts
CHANGED
|
@@ -138,6 +138,53 @@ interface LumirEditorProps {
|
|
|
138
138
|
onImageDelete?: (imageUrl: string) => void;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
/**
|
|
142
|
+
* 글자 크기(fontSize) 직렬화 호환 레이어.
|
|
143
|
+
*
|
|
144
|
+
* 배경:
|
|
145
|
+
* - BlockNote는 인라인 `styles` 맵에 스키마에 없는 키가 있으면
|
|
146
|
+
* `style ${name} not found in styleSchema` 예외를 던진다(blockToNode →
|
|
147
|
+
* styledTextToNodes). 이미 배포된 구버전 SDK(≤0.4.15, fontSize 스펙 없음)가
|
|
148
|
+
* `styles.fontSize`가 포함된 JSON을 initialContent로 받으면 에디터 생성이
|
|
149
|
+
* 실패하며 React 트리가 크래시한다.
|
|
150
|
+
* - 반면 styled-text 객체의 **형제(sibling) 키**는 BlockNote가 읽지 않으므로
|
|
151
|
+
* 조용히 무시된다(크래시 없음).
|
|
152
|
+
*
|
|
153
|
+
* 전략:
|
|
154
|
+
* - 저장/전달용 JSON(onContentChange 출력)에서는 `styles.fontSize`를 형제 키
|
|
155
|
+
* `fontSize`로 내린다(lowerFontSize).
|
|
156
|
+
* - 로드 시(initialContent)에는 형제 키를 다시 `styles.fontSize`로 올려
|
|
157
|
+
* 신버전 에디터가 렌더링하게 한다(liftFontSize).
|
|
158
|
+
*
|
|
159
|
+
* ⚠️ 불변 규칙: 에디터 외부로 블록 JSON을 내보내는 모든 경로는 반드시
|
|
160
|
+
* lowerFontSize를 거쳐야 한다(현재 출력 표면은 onContentChange 유일).
|
|
161
|
+
* styles.fontSize가 저장 JSON에 유출되면 구버전 소비 앱이 크래시한다.
|
|
162
|
+
*/
|
|
163
|
+
/**
|
|
164
|
+
* 직렬화(저장) 포맷의 styled-text 항목.
|
|
165
|
+
* fontSize는 styles 맵이 아닌 형제 키로 존재한다 — 구버전 SDK(≤0.4.15)는
|
|
166
|
+
* styles만 순회하므로 이 키를 조용히 무시한다(파싱 오류 없음).
|
|
167
|
+
*/
|
|
168
|
+
type SerializedStyledText = {
|
|
169
|
+
type: "text";
|
|
170
|
+
text: string;
|
|
171
|
+
styles: Record<string, unknown>;
|
|
172
|
+
/** 인라인 글자 크기(예: "18px"). 구버전 SDK에서는 무시됨 */
|
|
173
|
+
fontSize?: string;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* 출력 방향: `styles.fontSize` → 형제 키 `fontSize`.
|
|
177
|
+
* onContentChange로 내보내는 블록 JSON에 적용해 구버전 SDK 크래시를 방지한다.
|
|
178
|
+
* 입력을 변형하지 않는다(불변).
|
|
179
|
+
*/
|
|
180
|
+
declare function lowerFontSize(blocks: DefaultPartialBlock[]): DefaultPartialBlock[];
|
|
181
|
+
/**
|
|
182
|
+
* 입력 방향: 형제 키 `fontSize` → `styles.fontSize`.
|
|
183
|
+
* initialContent를 에디터에 넘기기 전에 적용해 글자 크기를 복원한다.
|
|
184
|
+
* 입력을 변형하지 않는다(불변).
|
|
185
|
+
*/
|
|
186
|
+
declare function liftFontSize(blocks: DefaultPartialBlock[]): DefaultPartialBlock[];
|
|
187
|
+
|
|
141
188
|
/**
|
|
142
189
|
* 콘텐츠 관리 유틸리티
|
|
143
190
|
* 기본 블록 생성 및 콘텐츠 검증 로직을 담당
|
|
@@ -852,6 +899,13 @@ declare const schema: BlockNoteSchema<_blocknote_core.BlockSchemaFromSpecs<{
|
|
|
852
899
|
implementation: any;
|
|
853
900
|
};
|
|
854
901
|
}>, _blocknote_core.StyleSchemaFromSpecs<{
|
|
902
|
+
fontSize: {
|
|
903
|
+
config: {
|
|
904
|
+
type: string;
|
|
905
|
+
propSchema: "string";
|
|
906
|
+
};
|
|
907
|
+
implementation: _blocknote_core.StyleImplementation;
|
|
908
|
+
};
|
|
855
909
|
bold: {
|
|
856
910
|
config: {
|
|
857
911
|
type: string;
|
|
@@ -980,6 +1034,32 @@ interface FloatingMenuProps {
|
|
|
980
1034
|
*/
|
|
981
1035
|
declare const FloatingMenu: React.FC<FloatingMenuProps>;
|
|
982
1036
|
|
|
1037
|
+
/**
|
|
1038
|
+
* 인라인 글자 크기 커스텀 스타일.
|
|
1039
|
+
*
|
|
1040
|
+
* - propSchema "string": 값으로 "18px" 같은 CSS 크기를 가진다.
|
|
1041
|
+
* - HTML 직렬화: `<span data-style-type="fontSize" data-value="18px" style="font-size:18px">`
|
|
1042
|
+
* (BlockNote가 data-* 속성과 파싱 규칙을 자동 생성 → 신버전 에디터 간 복사/붙여넣기 왕복 보장,
|
|
1043
|
+
* 구버전 에디터는 매칭 파싱 규칙이 없어 조용히 무시)
|
|
1044
|
+
*
|
|
1045
|
+
* ⚠️ 저장 JSON 하위호환: BlockNote는 styles 맵에 스키마에 없는 키가 있으면
|
|
1046
|
+
* `style ... not found in styleSchema` 예외를 던지므로, 저장 JSON에는
|
|
1047
|
+
* styles.fontSize 대신 형제 키 fontSize로 직렬화한다.
|
|
1048
|
+
* → src/utils/font-size-serialization.ts (liftFontSize/lowerFontSize) 참고.
|
|
1049
|
+
*/
|
|
1050
|
+
declare const FontSize: {
|
|
1051
|
+
config: {
|
|
1052
|
+
type: string;
|
|
1053
|
+
propSchema: "string";
|
|
1054
|
+
};
|
|
1055
|
+
implementation: _blocknote_core.StyleImplementation;
|
|
1056
|
+
};
|
|
1057
|
+
/** 툴바 드롭다운에서 제공하는 프리셋 (본문 기본은 14px = "기본") */
|
|
1058
|
+
declare const FONT_SIZE_PRESETS: readonly ["10px", "12px", "14px", "16px", "18px", "20px", "24px", "28px"];
|
|
1059
|
+
type FontSizePreset = (typeof FONT_SIZE_PRESETS)[number];
|
|
1060
|
+
|
|
1061
|
+
declare function FontSizeButton(): react_jsx_runtime.JSX.Element | null;
|
|
1062
|
+
|
|
983
1063
|
/**
|
|
984
1064
|
* 색상 팔레트 상수
|
|
985
1065
|
* BlockNote 기본 색상 팔레트와 일치
|
|
@@ -1002,4 +1082,4 @@ declare const BACKGROUND_COLORS: ColorItem[];
|
|
|
1002
1082
|
*/
|
|
1003
1083
|
declare const getHexFromColorValue: (value: string, type: "text" | "background") => string;
|
|
1004
1084
|
|
|
1005
|
-
export { BACKGROUND_COLORS, type ColorItem, ContentUtils, type DefaultPartialBlock, EditorConfig, type EditorType, FloatingMenu, HtmlPreviewBlock, schema as HtmlPreviewSchema, type LinkMetadata, LinkPreviewBlock, LumirEditor, LumirEditorError, type LumirEditorProps, type LumirErrorCode, type LumirErrorDetails, type S3UploaderConfig, TEXT_COLORS, clearMetadataCache, cn, createS3Uploader, fetchLinkMetadata, getHexFromColorValue };
|
|
1085
|
+
export { BACKGROUND_COLORS, type ColorItem, ContentUtils, type DefaultPartialBlock, EditorConfig, type EditorType, FONT_SIZE_PRESETS, FloatingMenu, FontSize, FontSizeButton, type FontSizePreset, HtmlPreviewBlock, schema as HtmlPreviewSchema, type LinkMetadata, LinkPreviewBlock, LumirEditor, LumirEditorError, type LumirEditorProps, type LumirErrorCode, type LumirErrorDetails, type S3UploaderConfig, type SerializedStyledText, TEXT_COLORS, clearMetadataCache, cn, createS3Uploader, fetchLinkMetadata, getHexFromColorValue, liftFontSize, lowerFontSize };
|