@lumir-company/editor 0.4.18 → 0.4.21
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 +47 -18
- package/dist/index.d.mts +12 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.js +523 -57
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +510 -44
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +45 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1261,6 +1261,7 @@ interface LumirEditorProps {
|
|
|
1261
1261
|
tableHandles?: boolean; // 테이블 핸들 표시 (기본: true)
|
|
1262
1262
|
floatingMenu?: boolean; // 상단 고정 플로팅 메뉴 표시 (기본: false)
|
|
1263
1263
|
floatingMenuPosition?: "sticky" | "fixed"; // 플로팅 메뉴 위치 (기본: "sticky")
|
|
1264
|
+
columnDivider?: boolean; // 2단(다단) 컬럼 사이 중앙 세로 구분선 표시 (기본: false)
|
|
1264
1265
|
className?: string; // 컨테이너 CSS 클래스
|
|
1265
1266
|
|
|
1266
1267
|
// === 링크 프리뷰 설정 ===
|
|
@@ -1478,14 +1479,42 @@ const url = await uploader(imageFile);
|
|
|
1478
1479
|
|
|
1479
1480
|
## 변경 로그
|
|
1480
1481
|
|
|
1481
|
-
### v0.4.18
|
|
1482
|
+
### v0.4.21 (2026-06-18)
|
|
1483
|
+
|
|
1484
|
+
- **Word/docx 표 붙여넣기 품질 개선** *(신규)*
|
|
1485
|
+
- **에디터 너비 자동 맞춤**: 에디터보다 넓은 표를 붙여넣으면 각 열 비율을 유지한 채 에디터 너비에 맞춰 축소(가로 스크롤 방지). 열 너비를 colgroup/셀(pt/px/%)에서 읽어 `columnWidths`로 적용
|
|
1486
|
+
- **셀 서식 보존 확대**: 기존(굵게·기울임·밑줄·취소선·글자색·배경색·텍스트 정렬)에 더해 **글자 크기**와 **세로 정렬**(middle/bottom)도 보존
|
|
1487
|
+
- 한계: 글자 크기는 셀 단위 균일 적용, 글꼴(font-family)·정확한 hex 색은 BlockNote 미지원(색은 10색 팔레트 근사)
|
|
1488
|
+
|
|
1489
|
+
### v0.4.20 (2026-06-18)
|
|
1490
|
+
|
|
1491
|
+
- **2단 컬럼 구분선 — 생성 시 선택** *(신규)*
|
|
1492
|
+
- 슬래시 메뉴에서 `2단 컬럼` / `2단 컬럼 (구분선)` 중 골라 삽입 → 선택한 구분선 유무가 그 블록에 **고정**(문서에 `showDivider`로 저장·라운드트립). 구분선 있는/없는 컬럼을 섞어 사용 가능
|
|
1493
|
+
- v0.4.19의 전역 `columnDivider` prop과 별개로, **블록별**로 구분선을 지정
|
|
1494
|
+
- **표 셀에서 Ctrl/Cmd+A → 표 전체 선택** *(신규)*
|
|
1495
|
+
- 셀에 포커스(커서/선택) 시 Ctrl/Cmd+A로 표의 모든 셀을 한 번에 선택(일괄 색·정렬·삭제 등에 유용)
|
|
1496
|
+
- 이미 표 전체가 선택된 상태에서 다시 누르면 문서 전체로 단계적 확장. 표 밖에서는 기본 동작 유지
|
|
1497
|
+
|
|
1498
|
+
### v0.4.19 (2026-06-17)
|
|
1499
|
+
|
|
1500
|
+
- **2단 컬럼 중앙 세로 구분선 (`columnDivider` 옵션)** *(신규)*
|
|
1501
|
+
- `columnDivider` prop(기본 `false`)으로 2단(다단) 컬럼 사이 중앙에 세로 구분선 표시
|
|
1502
|
+
- 구분선 양쪽에 드래그 핸들(grip) 너비만큼 여백을 둬 핸들과 겹치지 않음
|
|
1503
|
+
- 색·여백을 CSS 변수로 조절: `--lumir-column-divider-color`(기본 `#e5e7eb`), `--lumir-column-grip-space`(기본 28px)
|
|
1504
|
+
- **표 전체 종횡비 고정 스케일 (코너 드래그)** *(신규)*
|
|
1505
|
+
- 표 우하단 모서리 hover 시 대각 리사이즈 커서 → 드래그로 표 전체를 종횡비 고정 균일 배율로 확대/축소
|
|
1506
|
+
- 모든 열 너비(`colwidth`)·행 높이(`rowHeight`)에 동일 배율 적용 → 행·열 상대 비율과 표 종횡비 유지
|
|
1507
|
+
- 셀 focus 없이 표 hover만으로 동작(코어 hover 상태 기반), 기존 행/열 개별 리사이즈와 충돌 없음
|
|
1508
|
+
- `tableHandles` prop으로 게이트(행/열 리사이즈와 동일)
|
|
1509
|
+
|
|
1510
|
+
### v0.4.18 (2026-06-17)
|
|
1482
1511
|
|
|
1483
1512
|
- **표 열 삭제 버그 수정 (병합 셀 포함)**
|
|
1484
1513
|
- 그립 메뉴로 첫 열/행 삭제 시, 그립 클릭으로 ProseMirror 선택이 표 밖으로 빠져 삭제가 무시되던 문제 수정(삭제 대상 표를 포커스 표 기준으로 결정적으로 탐색)
|
|
1485
1514
|
- **세로 병합(rowspan) 인접 열**이 있을 때 첫 열이 삭제되지 않던 문제 수정 — 코어 prosemirror-tables가 행의 유일 셀을 지울 때 빈 셀을 남겨(`tableRow+` 스키마) `fixTables`가 원복하던 케이스. 열 삭제를 표 재구성 방식으로 변경해 colspan/rowspan 병합을 안전하게 처리
|
|
1486
1515
|
- 병합 셀이 행 축소로 collapse될 때 **행 높이를 보존**(원래 차지하던 행 높이 합을 유지)
|
|
1487
1516
|
|
|
1488
|
-
### v0.4.17
|
|
1517
|
+
### v0.4.17 (2026-06-16)
|
|
1489
1518
|
|
|
1490
1519
|
- **표 행 높이(세로) 리사이즈**
|
|
1491
1520
|
- 행 경계 hover → 드래그로 행 높이 조절(가로 열 리사이즈와 대칭). 드래그 중 셀 높이가 마우스를 따라 실시간 반영
|
|
@@ -1500,7 +1529,7 @@ const url = await uploader(imageFile);
|
|
|
1500
1529
|
- 공식 `@blocknote/xl-multi-column`(AGPL) 대신 MIT 안전 자체 구현
|
|
1501
1530
|
- *제한(후속 예정)*: 컬럼 안↔밖 DnD/3단 추가, 컬럼 너비 리사이즈, 다중 블록 드래그
|
|
1502
1531
|
|
|
1503
|
-
### v0.4.16
|
|
1532
|
+
### v0.4.16 (2026-06-05)
|
|
1504
1533
|
|
|
1505
1534
|
- **인라인 글자 크기 (Font Size)**
|
|
1506
1535
|
- 포매팅 툴바·상단 고정 툴바(FloatingMenu)에 글자 크기 드롭다운 추가 (기본 + 10~28px 프리셋 8단계)
|
|
@@ -1511,7 +1540,7 @@ const url = await uploader(imageFile);
|
|
|
1511
1540
|
- 일반 텍스트 선택 시 선택 팝업 툴바를 표시하지 않음 (상단 고정 툴바와 중복 + 상단 툴바에서 스타일 적용 직후 팝업이 잘못된 위치(0,0)에 재표시되던 문제 수정)
|
|
1512
1541
|
- 테이블 셀 컨텍스트(셀 병합·세로 정렬·셀 배경)와 이미지/노드 선택(캡션·교체·다운로드 등)은 팝업에만 있는 도구이므로 기존대로 팝업 표시
|
|
1513
1542
|
|
|
1514
|
-
### v0.4.15
|
|
1543
|
+
### v0.4.15 (2026-06-05)
|
|
1515
1544
|
|
|
1516
1545
|
- **Notion 스타일 테이블 셀 색상·정렬·포커스 핸들**
|
|
1517
1546
|
- 셀 focus 시 상(열)·좌(행)·우(셀) gutter/grip 표시, grip 클릭으로 행·열·셀 드롭다운 메뉴 (`LumirTableHandlesController`)
|
|
@@ -1520,25 +1549,25 @@ const url = await uploader(imageFile);
|
|
|
1520
1549
|
- 상단 고정 툴바(FloatingMenu)의 정렬·배경색 버튼이 테이블 셀에 올바르게 적용되도록 수정
|
|
1521
1550
|
- 행/열 grip 메뉴가 열려 범위 하이라이트 중일 때 셀 우측 grip 미노출 처리
|
|
1522
1551
|
|
|
1523
|
-
### v0.4.14
|
|
1552
|
+
### v0.4.14 (2026-05-29)
|
|
1524
1553
|
|
|
1525
1554
|
- **Excel/스프레드시트 셀 붙여넣기 → 편집 가능한 테이블**
|
|
1526
1555
|
- Excel 복사 시 클립보드의 비트맵 이미지가 업로드되어 테이블이 무시되던 문제 수정
|
|
1527
1556
|
- 클립보드 HTML에 `<table>`이 있으면 이미지보다 우선 파싱하여 실제 테이블 블록 생성
|
|
1528
1557
|
- Excel 서식(셀 배경, 글자색, 정렬, 굵게/기울임/밑줄)을 BlockNote 속성으로 매핑
|
|
1529
1558
|
|
|
1530
|
-
### v0.4.13
|
|
1559
|
+
### v0.4.13 (2026-04-03)
|
|
1531
1560
|
|
|
1532
1561
|
- **@tiptap/core 외부화(externalize)**
|
|
1533
1562
|
- 번들에 포함된 @tiptap/core 중복으로 발생하던 `proseMirrorPlugins` 런타임 에러 수정
|
|
1534
1563
|
- `@tiptap/core`를 peerDependency로 전환하고 빌드에서 external 처리
|
|
1535
1564
|
|
|
1536
|
-
### v0.4.12
|
|
1565
|
+
### v0.4.12 (2026-04-03)
|
|
1537
1566
|
|
|
1538
1567
|
- **Numbered List & Bullet List font size 14px**
|
|
1539
1568
|
- Numbered List & Bullet List의 font size 14px로 일반 텍스트 크기와 통일성 있게 변경
|
|
1540
1569
|
|
|
1541
|
-
### v0.4.10
|
|
1570
|
+
### v0.4.10 (2026-03-18)
|
|
1542
1571
|
|
|
1543
1572
|
- **동영상·이미지 업로드 진행률 표시**
|
|
1544
1573
|
- S3 업로드 시 진행률이 0만 보이다가 100으로 바로 완료되던 문제 개선
|
|
@@ -1547,19 +1576,19 @@ const url = await uploader(imageFile);
|
|
|
1547
1576
|
- README: `s3Upload.onProgress` 설명 및 업로드 진행률 표시 섹션 추가
|
|
1548
1577
|
- README: `S3UploaderConfig`에 `onProgress`, `uploadTimeoutMs`, `maxRetries` 문서화
|
|
1549
1578
|
|
|
1550
|
-
### v0.4.9
|
|
1579
|
+
### v0.4.9 (2026-03-17)
|
|
1551
1580
|
|
|
1552
1581
|
- **업로드 용량·타임아웃 사용자 설정**
|
|
1553
1582
|
- `maxImageFileSize`, `maxVideoFileSize` prop 추가 (미설정 시 기본 10MB/100MB)
|
|
1554
1583
|
- `isImageFile(file, maxSize?)`, `isVideoFile(file, maxSize?)` 시그니처 확장
|
|
1555
1584
|
- README: 용량 및 타임아웃 설정 예시 및 `s3Upload.uploadTimeoutMs` 안내 보강
|
|
1556
1585
|
|
|
1557
|
-
### v0.4.8
|
|
1586
|
+
### v0.4.8 (2026-03)
|
|
1558
1587
|
|
|
1559
1588
|
- README update (video & image upload)
|
|
1560
1589
|
- 버전 배포
|
|
1561
1590
|
|
|
1562
|
-
### v0.4.6
|
|
1591
|
+
### v0.4.6 (2026-03)
|
|
1563
1592
|
|
|
1564
1593
|
- **README: S3 Presigned URL API**
|
|
1565
1594
|
- Next.js App Router용 `app/api/s3/presigned/route.ts` 구현 예시 추가 (PutObjectCommand, getSignedUrl)
|
|
@@ -1567,13 +1596,13 @@ const url = await uploader(imageFile);
|
|
|
1567
1596
|
- **README: 이미지·동영상 업로드 경로 분리**
|
|
1568
1597
|
- `fileNameTransform`으로 이미지/동영상 prefix 분리 (`images/`, `videos/`) 예시 및 결과 경로 설명 추가
|
|
1569
1598
|
|
|
1570
|
-
### v0.4.5
|
|
1599
|
+
### v0.4.5 (2026-03-06)
|
|
1571
1600
|
|
|
1572
1601
|
- **README: 이미지·동영상 업로드**
|
|
1573
1602
|
- 지원 형식/용량, 삽입 경로, 설정 방법(s3Upload / uploadFile), 저장 데이터 구조, 삭제 콜백, 에러 처리 정리
|
|
1574
1603
|
- 동영상 블록은 직접 재생 가능한 파일 URL만 지원한다는 안내 추가 (YouTube/Vimeo 링크 미지원)
|
|
1575
1604
|
|
|
1576
|
-
### v0.4.4
|
|
1605
|
+
### v0.4.4 (2026-03-05)
|
|
1577
1606
|
|
|
1578
1607
|
- **Link Preview API 핸들러 내장**
|
|
1579
1608
|
- `@lumir-company/editor/api/link-preview` 서브패스 export 추가
|
|
@@ -1587,7 +1616,7 @@ const url = await uploader(imageFile);
|
|
|
1587
1616
|
- 내장 API 핸들러 export 목록 문서화
|
|
1588
1617
|
- Props API 테이블에 `placeholder`, `linkPreview` 추가
|
|
1589
1618
|
|
|
1590
|
-
### v0.4.3
|
|
1619
|
+
### v0.4.3 (2026-02-23)
|
|
1591
1620
|
|
|
1592
1621
|
- **링크 프리뷰 기능 추가**
|
|
1593
1622
|
- `linkPreview` prop으로 링크 미리보기 활성화 (카카오톡 스타일 OG 카드)
|
|
@@ -1620,7 +1649,7 @@ const url = await uploader(imageFile);
|
|
|
1620
1649
|
- S3 삭제 API 구현 예시 추가
|
|
1621
1650
|
- Props API 문서 업데이트
|
|
1622
1651
|
|
|
1623
|
-
### v0.4.2
|
|
1652
|
+
### v0.4.2 (2026-02-23)
|
|
1624
1653
|
|
|
1625
1654
|
- **코드 구조 리팩토링**
|
|
1626
1655
|
- FloatingMenu 컴포넌트 분리 (Icons, 개별 버튼 컴포넌트)
|
|
@@ -1637,7 +1666,7 @@ const url = await uploader(imageFile);
|
|
|
1637
1666
|
- `LumirErrorCode`, `LumirErrorDetails` 타입 export
|
|
1638
1667
|
- `ColorItem` 타입 export
|
|
1639
1668
|
|
|
1640
|
-
### v0.4.1
|
|
1669
|
+
### v0.4.1 (2026-01-15)
|
|
1641
1670
|
|
|
1642
1671
|
- `preserveExtension` prop 추가 - 확장자 자동 붙이기 제어 (기본: true)
|
|
1643
1672
|
- **중요**: 파일명 변환 시 확장자 위치 수정 (확장자가 항상 맨 뒤에 오도록)
|
|
@@ -1647,14 +1676,14 @@ const url = await uploader(imageFile);
|
|
|
1647
1676
|
- 확장자 제거 사용 사례 문서화
|
|
1648
1677
|
- README 예제 및 설명 개선
|
|
1649
1678
|
|
|
1650
|
-
### v0.4.0
|
|
1679
|
+
### v0.4.0 (2026-01-15)
|
|
1651
1680
|
|
|
1652
1681
|
- 파일명 변환 콜백 (`fileNameTransform`) 추가
|
|
1653
1682
|
- UUID 자동 추가 옵션 (`appendUUID`) 추가
|
|
1654
1683
|
- 여러 이미지 동시 업로드 시 중복 문제 해결
|
|
1655
1684
|
- 문서 대폭 개선
|
|
1656
1685
|
|
|
1657
|
-
### v0.3.3
|
|
1686
|
+
### v0.3.3 (2025-12-11)
|
|
1658
1687
|
|
|
1659
1688
|
- 에디터 재생성 방지 최적화
|
|
1660
1689
|
- 타입 정의 개선
|
package/dist/index.d.mts
CHANGED
|
@@ -119,6 +119,7 @@ interface LumirEditorProps {
|
|
|
119
119
|
onSelectionChange?: () => void;
|
|
120
120
|
className?: string;
|
|
121
121
|
sideMenuAddButton?: boolean;
|
|
122
|
+
columnDivider?: boolean;
|
|
122
123
|
floatingMenu?: boolean;
|
|
123
124
|
floatingMenuPosition?: "sticky" | "fixed";
|
|
124
125
|
linkPreview?: {
|
|
@@ -255,7 +256,7 @@ declare class EditorConfig {
|
|
|
255
256
|
*/
|
|
256
257
|
static getDisabledExtensions(userExtensions?: string[], allowVideo?: boolean, allowAudio?: boolean, allowFile?: boolean): string[];
|
|
257
258
|
}
|
|
258
|
-
declare function LumirEditor({ initialContent, initialEmptyBlocks, uploadFile, s3Upload, tables, heading, defaultStyles, disableExtensions, tabBehavior, trailingBlock, allowVideoUpload, allowAudioUpload, allowFileUpload, maxImageFileSize, maxVideoFileSize, linkPreview, editable, theme, formattingToolbar, linkToolbar, sideMenu, emojiPicker, filePanel, tableHandles, onSelectionChange, className, placeholder, sideMenuAddButton, floatingMenu, floatingMenuPosition, onContentChange, onError, onImageDelete, }: LumirEditorProps): react_jsx_runtime.JSX.Element;
|
|
259
|
+
declare function LumirEditor({ initialContent, initialEmptyBlocks, uploadFile, s3Upload, tables, heading, defaultStyles, disableExtensions, tabBehavior, trailingBlock, allowVideoUpload, allowAudioUpload, allowFileUpload, maxImageFileSize, maxVideoFileSize, linkPreview, editable, theme, formattingToolbar, linkToolbar, sideMenu, emojiPicker, filePanel, tableHandles, onSelectionChange, className, placeholder, sideMenuAddButton, columnDivider, floatingMenu, floatingMenuPosition, onContentChange, onError, onImageDelete, }: LumirEditorProps): react_jsx_runtime.JSX.Element;
|
|
259
260
|
|
|
260
261
|
declare function cn(...inputs: (string | undefined | null | false)[]): string;
|
|
261
262
|
|
|
@@ -435,12 +436,20 @@ declare const schema: BlockNoteSchema<_blocknote_core.BlockSchemaFromSpecs<{
|
|
|
435
436
|
config: {
|
|
436
437
|
type: "columnList";
|
|
437
438
|
content: "none";
|
|
438
|
-
propSchema: {
|
|
439
|
+
propSchema: {
|
|
440
|
+
showDivider: {
|
|
441
|
+
default: false;
|
|
442
|
+
};
|
|
443
|
+
};
|
|
439
444
|
};
|
|
440
445
|
implementation: _blocknote_core.TiptapBlockImplementation<{
|
|
441
446
|
type: "columnList";
|
|
442
447
|
content: "none";
|
|
443
|
-
propSchema: {
|
|
448
|
+
propSchema: {
|
|
449
|
+
showDivider: {
|
|
450
|
+
default: false;
|
|
451
|
+
};
|
|
452
|
+
};
|
|
444
453
|
}, any, _blocknote_core.InlineContentSchema, _blocknote_core.StyleSchema>;
|
|
445
454
|
};
|
|
446
455
|
column: {
|
package/dist/index.d.ts
CHANGED
|
@@ -119,6 +119,7 @@ interface LumirEditorProps {
|
|
|
119
119
|
onSelectionChange?: () => void;
|
|
120
120
|
className?: string;
|
|
121
121
|
sideMenuAddButton?: boolean;
|
|
122
|
+
columnDivider?: boolean;
|
|
122
123
|
floatingMenu?: boolean;
|
|
123
124
|
floatingMenuPosition?: "sticky" | "fixed";
|
|
124
125
|
linkPreview?: {
|
|
@@ -255,7 +256,7 @@ declare class EditorConfig {
|
|
|
255
256
|
*/
|
|
256
257
|
static getDisabledExtensions(userExtensions?: string[], allowVideo?: boolean, allowAudio?: boolean, allowFile?: boolean): string[];
|
|
257
258
|
}
|
|
258
|
-
declare function LumirEditor({ initialContent, initialEmptyBlocks, uploadFile, s3Upload, tables, heading, defaultStyles, disableExtensions, tabBehavior, trailingBlock, allowVideoUpload, allowAudioUpload, allowFileUpload, maxImageFileSize, maxVideoFileSize, linkPreview, editable, theme, formattingToolbar, linkToolbar, sideMenu, emojiPicker, filePanel, tableHandles, onSelectionChange, className, placeholder, sideMenuAddButton, floatingMenu, floatingMenuPosition, onContentChange, onError, onImageDelete, }: LumirEditorProps): react_jsx_runtime.JSX.Element;
|
|
259
|
+
declare function LumirEditor({ initialContent, initialEmptyBlocks, uploadFile, s3Upload, tables, heading, defaultStyles, disableExtensions, tabBehavior, trailingBlock, allowVideoUpload, allowAudioUpload, allowFileUpload, maxImageFileSize, maxVideoFileSize, linkPreview, editable, theme, formattingToolbar, linkToolbar, sideMenu, emojiPicker, filePanel, tableHandles, onSelectionChange, className, placeholder, sideMenuAddButton, columnDivider, floatingMenu, floatingMenuPosition, onContentChange, onError, onImageDelete, }: LumirEditorProps): react_jsx_runtime.JSX.Element;
|
|
259
260
|
|
|
260
261
|
declare function cn(...inputs: (string | undefined | null | false)[]): string;
|
|
261
262
|
|
|
@@ -435,12 +436,20 @@ declare const schema: BlockNoteSchema<_blocknote_core.BlockSchemaFromSpecs<{
|
|
|
435
436
|
config: {
|
|
436
437
|
type: "columnList";
|
|
437
438
|
content: "none";
|
|
438
|
-
propSchema: {
|
|
439
|
+
propSchema: {
|
|
440
|
+
showDivider: {
|
|
441
|
+
default: false;
|
|
442
|
+
};
|
|
443
|
+
};
|
|
439
444
|
};
|
|
440
445
|
implementation: _blocknote_core.TiptapBlockImplementation<{
|
|
441
446
|
type: "columnList";
|
|
442
447
|
content: "none";
|
|
443
|
-
propSchema: {
|
|
448
|
+
propSchema: {
|
|
449
|
+
showDivider: {
|
|
450
|
+
default: false;
|
|
451
|
+
};
|
|
452
|
+
};
|
|
444
453
|
}, any, _blocknote_core.InlineContentSchema, _blocknote_core.StyleSchema>;
|
|
445
454
|
};
|
|
446
455
|
column: {
|