sellmate-design-system-react 9.0.0-beta.22 → 9.0.0-beta.25
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/AGENTS.md +44 -4
- package/dist/components/SChipFilter/README.md +87 -64
- package/dist/components/SChipFilter/SChipFilter.d.ts +43 -25
- package/dist/components/SChipFilter/index.d.ts +1 -1
- package/dist/components/SDraggableList/README.md +1 -0
- package/dist/components/SDraggableList/SDraggableList.d.ts +1 -0
- package/dist/components/SEditor/EditorBody.d.ts +4 -8
- package/dist/components/SEditor/EditorToolbar.d.ts +16 -10
- package/dist/components/SEditor/README.md +4 -31
- package/dist/components/SEditor/SEditor.d.ts +9 -19
- package/dist/components/SEditor/editor-icons.d.ts +11 -7
- package/dist/components/SEditor/editor.config.d.ts +52 -18
- package/dist/components/SEditor/index.d.ts +7 -1
- package/dist/components/SEditor/use-is-mobile.d.ts +1 -1
- package/dist/components/SIcon/README.md +2 -0
- package/dist/components/SSystemActionButton/README.md +129 -0
- package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +79 -0
- package/dist/components/SSystemActionButton/index.d.ts +2 -0
- package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +87 -0
- package/dist/components/STag/README.md +2 -0
- package/dist/index.cjs +813 -472
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +808 -467
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +265 -99
- package/dist/llms.txt +48 -6
- package/dist/styles.css +443 -38
- package/dist/theme.css +89 -1
- package/eslint/scale.gen.mjs +2 -2
- package/package.json +2 -4
package/AGENTS.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
| 분류 | 컴포넌트 |
|
|
28
28
|
| --- | --- |
|
|
29
|
-
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
|
|
29
|
+
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `STextLink` `SSwitch` `SToggle` |
|
|
30
30
|
| **입력 (폼)** | `SForm` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
31
31
|
| **날짜·시간** | `SCalendar` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
32
32
|
| **표·목록** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
@@ -152,7 +152,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
152
152
|
| --- | --- | --- |
|
|
153
153
|
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SPage`(제목 영역은 `header` prop) |
|
|
154
154
|
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
155
|
-
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
155
|
+
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
156
156
|
| **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
|
|
157
157
|
| **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
|
|
158
158
|
|
|
@@ -523,6 +523,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
523
523
|
| 라벨이 있는 일반 액션을 준다 | `SButton` | §3-5 |
|
|
524
524
|
| 아이콘 하나로 뜻이 통하는 부가 조작을 준다 | `SGhostButton` | §3-5-5 |
|
|
525
525
|
| 한 버튼에 여러 선택지를 매단다 | `SDropdownButton` | §3-5-4 |
|
|
526
|
+
| GNB system 패널에서 한 줄짜리 행 액션을 준다 | `SSystemActionButton` | §3-5-7 |
|
|
526
527
|
|
|
527
528
|
#### D. 화면을 담고 나눈다
|
|
528
529
|
|
|
@@ -1012,6 +1013,7 @@ const columns: STableColumn[] = [
|
|
|
1012
1013
|
| **아이콘 하나로 뜻이 통하는 부가 조작** | **`SGhostButton`** — 라벨이 없는 아이콘 전용 버튼 (아래 3-5-5) |
|
|
1013
1014
|
| 본문 속 이동 링크 | `STextLink` |
|
|
1014
1015
|
| 메인 액션 + 부가 메뉴 | `SDropdownButton` |
|
|
1016
|
+
| **GNB system 패널의 한 줄 액션** | **`SSystemActionButton`** — 행 전체가 버튼인 표면형 (아래 3-5-7) |
|
|
1015
1017
|
|
|
1016
1018
|
#### 3-5-1. 채움 버튼은 페이지당 개수 제한이 있다
|
|
1017
1019
|
|
|
@@ -1144,6 +1146,34 @@ const columns: STableColumn[] = [
|
|
|
1144
1146
|
</div>
|
|
1145
1147
|
```
|
|
1146
1148
|
|
|
1149
|
+
#### 3-5-7. `SSystemActionButton` — GNB system 패널의 한 줄 액션
|
|
1150
|
+
|
|
1151
|
+
**행 전체가 하나의 버튼**인 표면형 컨트롤이다. 아이콘 프레임 + 라벨 + 우측 액션이 한 줄에 붙고, hover 하면 표면색이 한 단계 바뀐다.
|
|
1152
|
+
|
|
1153
|
+
| 상황 | 사용 |
|
|
1154
|
+
| --- | --- |
|
|
1155
|
+
| 페이지·모달의 일반 액션 | `SButton` — 라벨 폭만큼만 차지한다 |
|
|
1156
|
+
| 목록에서 항목 하나를 고르게 한다 | `SListItem` · `STree` (§3-7-6·§3-7-7) |
|
|
1157
|
+
| 좌측 내비게이션의 메뉴 | `SGnb` 의 `menus` (§4-1) |
|
|
1158
|
+
| **GNB system 패널에서 설정·연결 상태를 한 줄씩 쌓고, 그 줄을 눌러 들어가게 한다** | **`SSystemActionButton`** |
|
|
1159
|
+
|
|
1160
|
+
**무엇이 그려지는지는 `type` 이 정한다.** 타입마다 다른 값만 `option` 으로 받으므로, 타입에 맞지 않는 `option` 은 타입 에러가 된다.
|
|
1161
|
+
|
|
1162
|
+
| `type` | 선행 아이콘 | 라벨 | 우측 | 언제 |
|
|
1163
|
+
| --- | --- | --- | --- | --- |
|
|
1164
|
+
| `account` | `user` 고정 | `label` | 없음 | 로그인한 계정을 보여주고 계정 화면으로 보낼 때 |
|
|
1165
|
+
| `select` | `option.icon` (필수) | `label` | 화살표 | 눌러서 하위 화면으로 들어갈 때 |
|
|
1166
|
+
| `switch` | `option.icon` (필수) | `label` | `option.text` + 새로고침 | 지금 붙어 있는 대상을 갈아 끼울 때 |
|
|
1167
|
+
| `subSelect` | `option.icon` (필수) | `label` | `option.text` + 화살표 | 지금 선택돼 있는 값을 함께 보여줄 때 |
|
|
1168
|
+
| `status` | 없음 | 상태 태그(`option.color`·`option.label`) | 화살표 | 라벨 대신 상태 자체가 제목일 때 |
|
|
1169
|
+
|
|
1170
|
+
- **`SPage` 본문에 직접 놓지 않는다.** 폭을 가득 채우는 행이라 페이지에 바로 놓으면 표처럼 보인다. GNB system 패널·`SDrawer`·`SPopover` 처럼 **좁은 폭이 정해진 자리**에 쌓는다. 행 사이 간격은 `--cmp-gnb-system-panel-gap` 이다.
|
|
1171
|
+
- **`color` 는 놓이는 표면을 따라간다** — 흰 면이면 `light`, 오션블루 면이면 `dark`, 네이비 면이면 `darker`. 배경과 다른 색을 고르면 버튼만 떠 보인다.
|
|
1172
|
+
- **상태는 default·hover 둘뿐이다.** 토큰에 selected 가 없으므로 "지금 열려 있는 항목"을 이 버튼으로 표시하지 않는다. 선택 상태가 필요한 자리면 `SGnb` 메뉴나 `SListItem`(§3-7-6) 이다.
|
|
1173
|
+
- **선행 아이콘이 비는 행은 없다.** `account` 는 `user` 고정, `status` 는 태그가 자리를 차지하고, 나머지는 `option.icon` 이 필수다.
|
|
1174
|
+
- **우측 아이콘은 `type` 이 정하므로 밖에서 바꾸지 않는다.** 화살표가 필요한데 문구가 없으면 `select`, 문구가 함께 필요하면 `subSelect` 다.
|
|
1175
|
+
- 높이·라운드·아이콘 크기·좌우 여백은 전부 토큰이 넣는다. 직접 주지 않는다.
|
|
1176
|
+
|
|
1147
1177
|
### 3-6. 영역 나누기 — SDivider vs SSplitter
|
|
1148
1178
|
|
|
1149
1179
|
| 상황 | 사용 |
|
|
@@ -1217,9 +1247,19 @@ const columns: STableColumn[] = [
|
|
|
1217
1247
|
|
|
1218
1248
|
`SEditor` 는 **서식이 값의 일부일 때만** 쓴다. 값을 HTML 문자열로 주고받으므로 저장·검색·비교가 평문보다 비싸고, 화면에 다시 보여줄 때도 HTML 로 렌더해야 한다. 서식이 필요 없는 메모·사유는 `STextarea` 다 — "입력창이 커 보여서" 고르는 컴포넌트가 아니다. 반대로 공지·안내문·상품 상세처럼 **작성자가 정한 강조와 목록이 그대로 보여야 하는 글**이면 `STextarea` 로는 표현할 수 없다.
|
|
1219
1249
|
|
|
1220
|
-
`SEditor` 도 `SInput`·`STextarea` 와 같은 폼 필드다 — `label`·`hint`·`rules`·`errorMessage` 를 자기 prop 으로 받고 `SForm` 제출 검증에도 들어간다. 빈 문서는 빈 문자열로 나오므로 `required` 규칙이 그대로 걸린다.
|
|
1250
|
+
`SEditor` 도 `SInput`·`STextarea` 와 같은 폼 필드다 — `label`·`hint`·`rules`·`errorMessage` 를 자기 prop 으로 받고 `SForm` 제출 검증에도 들어간다. 빈 문서는 빈 문자열로 나오므로 `required` 규칙이 그대로 걸린다. **툴바를 끄는 길은 없다** — 서식 입력이 필요 없는 자리라면 서식 없는 `SEditor` 가 아니라 `STextarea` 를 고른다.
|
|
1251
|
+
|
|
1252
|
+
툴바는 **프리셋 둘 중 하나뿐이다.** 기본은 쓸 수 있는 것을 모두 보이고, **`simple` 을 켜면 글자에 거는 서식만 남는다** — 목록·정렬·인용·코드·링크·이미지·구분선이 빠지고 선택했을 때 뜨는 판도 같은 범위로 줄어든다. 받은 글의 **문단 구조까지 작성자를 따라가면 곤란한 자리**(좁은 칸의 메모·사유·짧은 안내문)가 `simple` 이다. 항목을 직접 조합하는 prop 은 없다 — 화면마다 다른 툴바가 서면 그 자체가 학습 비용이 된다.
|
|
1253
|
+
|
|
1254
|
+
본문에서 따옴표·하이픈·화살표는 **자동으로 치환된다**(`"` → `“”`, `--` → `—`, `->` → `→`). 끌 수 없으므로, 상품 코드·규격 문자열처럼 **입력한 그대로 남아야 하는 값**은 `SEditor` 본문이 아니라 `SInput` 으로 따로 받는다.
|
|
1255
|
+
|
|
1256
|
+
툴바는 **자리를 지킨다**(고정). 긴 글을 쓰는 동안 막대가 화면 밖으로 나가지 않으므로, 툴바를 따로 감싸거나 위치를 주지 않는다.
|
|
1257
|
+
|
|
1258
|
+
툴바에는 **글자 크기 드롭다운**과 **글자색 팔레트**가 들어 있다 — 작성자가 문단마다 크기·색을 직접 지정할 수 있고, 크기 목록 맨 위 `기본` 은 지정을 떼는 자리다. 크기 눈금은 화면 타이포(§2-1)가 아니라 워드프로세서의 눈금이라 본문보다 훨씬 큰 단계까지 있다. **눈금도 팔레트도 좁히는 prop 이 없다** — 화면마다 고를 수 있는 것이 다르면 같은 글이 어디에 붙느냐에 따라 다르게 보이기 때문이다. 그래서 **작성자가 화면 리듬을 벗어나면 곤란한 자리(상품 상세 설명·반복 노출되는 안내문 등)라면 `SEditor` 가 맞는 자리인지 먼저 본다** — 서식이 값의 일부가 아니라면 `STextarea` 다. 고른 크기·색은 저장되는 HTML 에 그대로 남아 나중에 되돌릴 수 없다.
|
|
1259
|
+
|
|
1260
|
+
본문에는 **표**도 들어간다 — 툴바의 `표` 드롭다운에서 격자를 끌어 크기를 고르고(최대 8행 × 10열), 행·열을 늘리고, 칸을 병합한다. **열 너비는 균등 고정이고 바꿀 수 없다**: 너비를 저장하면 그 값이 px 로 박혀 작성한 화면보다 좁은 곳에서 표가 넘친다. 대신 어떤 폭에서도 표가 상자 안에 들어오도록 열을 고르게 나눈다 — 열이 많은 표는 좁은 칸에서 글자가 잘게 접히므로, **열이 넷을 넘어가는 표라면 `SEditor` 본문이 아니라 `STable` 이 맞는 자리인지 본다.** 표는 작성자가 쓰는 글의 일부일 때만 여기에 있고, 데이터를 줄 세워 보여 주는 것은 `STable` 이다.
|
|
1221
1261
|
|
|
1222
|
-
글을 선택하면 **그 위에 서식 판이 뜬다**(버블 메뉴). 툴바까지 커서를 옮기지 않고 바로 굵게·색·링크를
|
|
1262
|
+
글을 선택하면 **그 위에 서식 판이 뜬다**(버블 메뉴). 툴바까지 커서를 옮기지 않고 바로 굵게·색·링크를 거는 길이다. **끄고 켜는 prop 은 없다** — 편집할 수 있으면 언제나 뜨고, 읽기 전용·비활성일 때는 뜨지 않는다. 화면마다 있고 없고가 달라지면 그 자체가 학습 비용이 되기 때문이다. 판의 구성은 `simple` 이 막대와 함께 정한다. 뜨는 자리는 DS 가 잡는다, 직접 감싸거나 위치를 주지 않는다.
|
|
1223
1263
|
|
|
1224
1264
|
`SEditor` 는 화면에 처음 놓일 때 **에디터 엔진을 따로 불러온다** — 앱 초기 번들에는 들어가지 않는다. 그동안은 같은 크기의 빈 편집 영역이 자리를 지키므로 레이아웃은 흔들리지 않지만, **마운트하자마자 `ref.current.getHTML()` 로 값을 읽거나 툴바를 누를 수는 없다.** 열자마자 커서를 놓고 싶으면 `ref.current.focus()` 를 그냥 부르면 된다 — 준비되는 순간 대신 실행된다.
|
|
1225
1265
|
|
|
@@ -77,14 +77,15 @@ export interface SChipFilterChangeDetail {
|
|
|
77
77
|
|
|
78
78
|
```ts
|
|
79
79
|
/** 필터 하나의 정의. type에 따라 쓸 수 있는 속성이 달라진다 —
|
|
80
|
-
* options는
|
|
81
|
-
* render는 custom 에만 있다 */
|
|
80
|
+
* options는 select·select-multi·keyword, presets·maxRange·radioButton은
|
|
81
|
+
* datepicker-range·datepicker-statistics, render는 custom 에만 있다 */
|
|
82
82
|
export type SChipFilterField =
|
|
83
|
-
|
|
|
84
|
-
|
|
|
83
|
+
| SChipFilterSelectField
|
|
84
|
+
| SChipFilterSelectMultiField
|
|
85
|
+
| SChipFilterDatePickerDayField
|
|
86
|
+
| SChipFilterDatePickerRangeField
|
|
87
|
+
| SChipFilterDatePickerStatisticsField
|
|
85
88
|
| SChipFilterKeywordField
|
|
86
|
-
| SChipFilterDateField
|
|
87
|
-
| SChipFilterPeriodField
|
|
88
89
|
| SChipFilterCustomField;
|
|
89
90
|
```
|
|
90
91
|
|
|
@@ -112,21 +113,57 @@ export type SChipFilterValue =
|
|
|
112
113
|
| undefined;
|
|
113
114
|
```
|
|
114
115
|
|
|
115
|
-
###
|
|
116
|
+
### SChipFilterSelectField
|
|
116
117
|
|
|
117
118
|
```ts
|
|
118
119
|
/** 후보 하나를 고른다 */
|
|
119
|
-
export interface
|
|
120
|
-
type: '
|
|
120
|
+
export interface SChipFilterSelectField extends SChipFilterOptionsField {
|
|
121
|
+
type: 'select';
|
|
121
122
|
}
|
|
122
123
|
```
|
|
123
124
|
|
|
124
|
-
###
|
|
125
|
+
### SChipFilterSelectMultiField
|
|
125
126
|
|
|
126
127
|
```ts
|
|
127
128
|
/** 후보 여럿을 고른다 */
|
|
128
|
-
export interface
|
|
129
|
-
type: 'multi';
|
|
129
|
+
export interface SChipFilterSelectMultiField extends SChipFilterOptionsField {
|
|
130
|
+
type: 'select-multi';
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### SChipFilterDatePickerDayField
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
/** 날짜 하나를 고른다 — 캘린더 트리거 하나만 놓인다. 프리셋으로 고르게 하거나 시작~종료를
|
|
138
|
+
* 받아야 하면 datepicker-range 다 */
|
|
139
|
+
export interface SChipFilterDatePickerDayField extends SChipFilterFieldBase {
|
|
140
|
+
type: 'datepicker-day';
|
|
141
|
+
/** 캘린더 트리거의 placeholder */
|
|
142
|
+
placeholder?: string;
|
|
143
|
+
/** 선택 가능 범위 */
|
|
144
|
+
selectable?: [string, string];
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### SChipFilterDatePickerRangeField
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
/** 기간(시작~종료)을 고른다. presets를 주면 프리셋 라디오 목록으로 고르고,
|
|
152
|
+
* 주지 않으면 기간 피커 하나만 놓인다 */
|
|
153
|
+
export interface SChipFilterDatePickerRangeField extends SChipFilterPresetsField {
|
|
154
|
+
type: 'datepicker-range';
|
|
155
|
+
/** presets를 필터 바에 세그먼트 라디오로 펼쳐 놓는다(팝오버 없음).
|
|
156
|
+
* 기본 false — 칩 클릭 시 팝오버 안에 세로 라디오 목록(+사용자 지정 선택 시 기간 피커) */
|
|
157
|
+
radioButton?: boolean;
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### SChipFilterDatePickerStatisticsField
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
/** 집계 단위(일·월·분기·반기·연)와 그 단위의 값을 함께 고른다 */
|
|
165
|
+
export interface SChipFilterDatePickerStatisticsField extends SChipFilterPresetsField {
|
|
166
|
+
type: 'datepicker-statistics';
|
|
130
167
|
}
|
|
131
168
|
```
|
|
132
169
|
|
|
@@ -151,29 +188,6 @@ export interface SChipFilterKeywordField extends SChipFilterOptionsField {
|
|
|
151
188
|
}
|
|
152
189
|
```
|
|
153
190
|
|
|
154
|
-
### SChipFilterDateField
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
/** 날짜 하나 또는 기간을 고른다 */
|
|
158
|
-
export interface SChipFilterDateField extends SChipFilterPresetsField {
|
|
159
|
-
type: 'date';
|
|
160
|
-
/** presets 없이 단일 캘린더 트리거로 동작할 때의 placeholder */
|
|
161
|
-
placeholder?: string;
|
|
162
|
-
/** presets를 필터 바에 세그먼트 라디오로 펼쳐 놓는다(팝오버 없음).
|
|
163
|
-
* 기본 false — 칩 클릭 시 팝오버 안에 세로 라디오 목록(+사용자 지정 선택 시 기간 피커) */
|
|
164
|
-
radioButton?: boolean;
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### SChipFilterPeriodField
|
|
169
|
-
|
|
170
|
-
```ts
|
|
171
|
-
/** 집계 단위(일·월·분기·반기·연)와 그 단위의 값을 함께 고른다 */
|
|
172
|
-
export interface SChipFilterPeriodField extends SChipFilterPresetsField {
|
|
173
|
-
type: 'period';
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
191
|
### SChipFilterCustomField
|
|
178
192
|
|
|
179
193
|
```ts
|
|
@@ -211,7 +225,7 @@ export interface SChipFilterKeywordValue {
|
|
|
211
225
|
### SChipFilterPeriodValue
|
|
212
226
|
|
|
213
227
|
```ts
|
|
214
|
-
/**
|
|
228
|
+
/** datepicker-statistics 필드 값 — 선택 단위(unit)와 그 단위의 입력값(value)을 함께 보관한다 */
|
|
215
229
|
export interface SChipFilterPeriodValue {
|
|
216
230
|
unit: SChipFilterPeriodUnit;
|
|
217
231
|
value?: string | number | SDateRangeValue | null;
|
|
@@ -228,35 +242,13 @@ export type SChipFilterCustomValue = Record<string, unknown>;
|
|
|
228
242
|
### SChipFilterOptionsField
|
|
229
243
|
|
|
230
244
|
```ts
|
|
231
|
-
/** 후보 목록에서 고르는 필터 —
|
|
245
|
+
/** 후보 목록에서 고르는 필터 — select·select-multi·keyword */
|
|
232
246
|
export interface SChipFilterOptionsField extends SChipFilterFieldBase {
|
|
233
247
|
/** 고를 수 있는 후보 목록 */
|
|
234
248
|
options?: SChipFilterOption[];
|
|
235
249
|
}
|
|
236
250
|
```
|
|
237
251
|
|
|
238
|
-
### SChipFilterKeywordInput
|
|
239
|
-
|
|
240
|
-
```ts
|
|
241
|
-
/** keyword 필드의 입력 방식 — 무엇을 키워드 하나의 끝으로 볼지 */
|
|
242
|
-
export type SChipFilterKeywordInput = 'tag' | 'csv';
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### SChipFilterPresetsField
|
|
246
|
-
|
|
247
|
-
```ts
|
|
248
|
-
/** 프리셋으로 기간을 고르는 필터 — date·period */
|
|
249
|
-
export interface SChipFilterPresetsField extends SChipFilterFieldBase {
|
|
250
|
-
/** 프리셋 라디오 목록. date에서 지정하지 않으면 단일 캘린더 트리거로 동작하고,
|
|
251
|
-
* period에서 지정하지 않으면 일별·월별·분기별·반기별·연도별·사용자 지정 기본 목록을 쓴다 */
|
|
252
|
-
presets?: SChipFilterDatePreset[];
|
|
253
|
-
/** 선택 가능 범위 */
|
|
254
|
-
selectable?: [string, string];
|
|
255
|
-
/** "사용자 지정" 프리셋으로 기간을 고를 때의 최대 선택 일수 */
|
|
256
|
-
maxRange?: number;
|
|
257
|
-
}
|
|
258
|
-
```
|
|
259
|
-
|
|
260
252
|
### SChipFilterFieldBase
|
|
261
253
|
|
|
262
254
|
```ts
|
|
@@ -273,9 +265,17 @@ export interface SChipFilterFieldBase {
|
|
|
273
265
|
* required도 같은 효과를 낸다 — 처음부터 바에 보이는 것은 fixed이거나 required인 필드뿐이고,
|
|
274
266
|
* 나머지는 전부 "필터 추가"에서 골라야 나타난다 */
|
|
275
267
|
fixed?: boolean;
|
|
276
|
-
/** 초기값 및 clearable 클릭 시 되돌아갈 값.
|
|
277
|
-
*
|
|
278
|
-
*
|
|
268
|
+
/** 초기값 및 clearable 클릭 시 되돌아갈 값.
|
|
269
|
+
*
|
|
270
|
+
* **`fixed` 또는 `required` 필드에서만 쓴다.** 그 외 필드에 지정하면 무시하고 콘솔에 알린다 —
|
|
271
|
+
* 뺄 수 있는 필터는 처음에 바에 없는데, 값 맵에는 기본값이 채워져 **보이지도 지울 수도 없는
|
|
272
|
+
* 조건이 검색에 걸린다.** 칩을 지워 값을 비워도 "검색 초기화"가 그 값을 되돌려 놓아 필터가
|
|
273
|
+
* 조용히 되살아난다. 처음부터 값이 정해져 있어야 하는 필터라면 그것이 `fixed`·`required` 다.
|
|
274
|
+
*
|
|
275
|
+
* required인데 지정하지 않으면 타입별 내장 기본값(select: 첫 번째 옵션,
|
|
276
|
+
* datepicker-day·datepicker-range: 오늘 날짜)을 대신 쓴다. 인라인(radioButton) datepicker-range
|
|
277
|
+
* 필드는 팝오버 없이 바에 바로 노출되어 빈 상태로 둘 수 없으므로, 이 규칙과 무관하게 언제나
|
|
278
|
+
* 오늘이 채워진다 */
|
|
279
279
|
defaultValue?: SChipFilterValue;
|
|
280
280
|
/** 이 필터만 비활성. 바에 남아 있되 팝오버가 열리지 않고 clearable도 눌리지 않는다.
|
|
281
281
|
* 바 전체를 잠그려면 SChipFilterProps.disabled를 쓴다 — 둘은 OR로 합쳐진다 */
|
|
@@ -283,6 +283,28 @@ export interface SChipFilterFieldBase {
|
|
|
283
283
|
}
|
|
284
284
|
```
|
|
285
285
|
|
|
286
|
+
### SChipFilterPresetsField
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
/** 프리셋으로 기간을 고르는 필터 — datepicker-range·datepicker-statistics */
|
|
290
|
+
export interface SChipFilterPresetsField extends SChipFilterFieldBase {
|
|
291
|
+
/** 프리셋 라디오 목록. datepicker-range에서 지정하지 않으면 프리셋 없이 기간 피커 하나만 놓이고,
|
|
292
|
+
* datepicker-statistics에서 지정하지 않으면 일별·월별·분기별·반기별·연도별·사용자 지정 기본 목록을 쓴다 */
|
|
293
|
+
presets?: SChipFilterDatePreset[];
|
|
294
|
+
/** 선택 가능 범위 */
|
|
295
|
+
selectable?: [string, string];
|
|
296
|
+
/** "사용자 지정" 프리셋으로 기간을 고를 때의 최대 선택 일수 */
|
|
297
|
+
maxRange?: number;
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### SChipFilterKeywordInput
|
|
302
|
+
|
|
303
|
+
```ts
|
|
304
|
+
/** keyword 필드의 입력 방식 — 무엇을 키워드 하나의 끝으로 볼지 */
|
|
305
|
+
export type SChipFilterKeywordInput = 'tag' | 'csv';
|
|
306
|
+
```
|
|
307
|
+
|
|
286
308
|
### SChipFilterMatchMode
|
|
287
309
|
|
|
288
310
|
```ts
|
|
@@ -308,7 +330,7 @@ export interface SChipFilterOption {
|
|
|
308
330
|
### SChipFilterDatePreset
|
|
309
331
|
|
|
310
332
|
```ts
|
|
311
|
-
/**
|
|
333
|
+
/** datepicker-range·datepicker-statistics 필드의 프리셋 라디오 항목 (오늘/지난 7일/일별/월별/사용자 지정 등) */
|
|
312
334
|
export interface SChipFilterDatePreset {
|
|
313
335
|
/** 프리셋 식별자 */
|
|
314
336
|
value: string;
|
|
@@ -316,7 +338,8 @@ export interface SChipFilterDatePreset {
|
|
|
316
338
|
label: string;
|
|
317
339
|
/** true면 "사용자 지정" — 선택 시 날짜/기간 피커가 추가로 노출된다. resolve는 무시된다. */
|
|
318
340
|
custom?: boolean;
|
|
319
|
-
/** custom이 아닐 때 실제 값을 계산한다. 단일 날짜(string) 또는 기간([start,end]) 모두 가능
|
|
341
|
+
/** custom이 아닐 때 실제 값을 계산한다. 단일 날짜(string) 또는 기간([start,end]) 모두 가능 —
|
|
342
|
+
* datepicker-range 에서는 'd' 를 그 하루짜리 기간 ['d', 'd'] 와 같은 값으로 본다 */
|
|
320
343
|
resolve?: () => string | SDateRangeValue;
|
|
321
344
|
}
|
|
322
345
|
```
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
2
|
import { type SDateRangeValue } from '../SDateRangePicker';
|
|
3
3
|
/** 필터가 값을 받는 방식. 각 값에 대응하는 필드 인터페이스가 따로 있다 —
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* SChipFilterSelectField·SChipFilterSelectMultiField·SChipFilterKeywordField·
|
|
5
|
+
* SChipFilterDatePickerDayField·SChipFilterDatePickerRangeField·
|
|
6
|
+
* SChipFilterDatePickerStatisticsField·SChipFilterCustomField */
|
|
6
7
|
export type SChipFilterType = SChipFilterField['type'];
|
|
7
8
|
export type SChipFilterOptionValue = string | number;
|
|
8
9
|
export type SChipFilterMatchMode = 'contains' | 'exact' | 'excludes';
|
|
@@ -12,7 +13,7 @@ export interface SChipFilterOption {
|
|
|
12
13
|
label: string;
|
|
13
14
|
disabled?: boolean;
|
|
14
15
|
}
|
|
15
|
-
/**
|
|
16
|
+
/** datepicker-range·datepicker-statistics 필드의 프리셋 라디오 항목 (오늘/지난 7일/일별/월별/사용자 지정 등) */
|
|
16
17
|
export interface SChipFilterDatePreset {
|
|
17
18
|
/** 프리셋 식별자 */
|
|
18
19
|
value: string;
|
|
@@ -20,7 +21,8 @@ export interface SChipFilterDatePreset {
|
|
|
20
21
|
label: string;
|
|
21
22
|
/** true면 "사용자 지정" — 선택 시 날짜/기간 피커가 추가로 노출된다. resolve는 무시된다. */
|
|
22
23
|
custom?: boolean;
|
|
23
|
-
/** custom이 아닐 때 실제 값을 계산한다. 단일 날짜(string) 또는 기간([start,end]) 모두 가능
|
|
24
|
+
/** custom이 아닐 때 실제 값을 계산한다. 단일 날짜(string) 또는 기간([start,end]) 모두 가능 —
|
|
25
|
+
* datepicker-range 에서는 'd' 를 그 하루짜리 기간 ['d', 'd'] 와 같은 값으로 본다 */
|
|
24
26
|
resolve?: () => string | SDateRangeValue;
|
|
25
27
|
}
|
|
26
28
|
/** keyword 필드에서 matchModes 활성 시 사용하는 값 형태 — 입력해 추가한 키워드 목록 */
|
|
@@ -28,7 +30,7 @@ export interface SChipFilterKeywordValue {
|
|
|
28
30
|
keywords: string[];
|
|
29
31
|
mode: SChipFilterMatchMode;
|
|
30
32
|
}
|
|
31
|
-
/**
|
|
33
|
+
/** datepicker-statistics 필드 값 — 선택 단위(unit)와 그 단위의 입력값(value)을 함께 보관한다 */
|
|
32
34
|
export interface SChipFilterPeriodValue {
|
|
33
35
|
unit: SChipFilterPeriodUnit;
|
|
34
36
|
value?: string | number | SDateRangeValue | null;
|
|
@@ -50,23 +52,31 @@ export interface SChipFilterFieldBase {
|
|
|
50
52
|
* required도 같은 효과를 낸다 — 처음부터 바에 보이는 것은 fixed이거나 required인 필드뿐이고,
|
|
51
53
|
* 나머지는 전부 "필터 추가"에서 골라야 나타난다 */
|
|
52
54
|
fixed?: boolean;
|
|
53
|
-
/** 초기값 및 clearable 클릭 시 되돌아갈 값.
|
|
54
|
-
*
|
|
55
|
-
*
|
|
55
|
+
/** 초기값 및 clearable 클릭 시 되돌아갈 값.
|
|
56
|
+
*
|
|
57
|
+
* **`fixed` 또는 `required` 필드에서만 쓴다.** 그 외 필드에 지정하면 무시하고 콘솔에 알린다 —
|
|
58
|
+
* 뺄 수 있는 필터는 처음에 바에 없는데, 값 맵에는 기본값이 채워져 **보이지도 지울 수도 없는
|
|
59
|
+
* 조건이 검색에 걸린다.** 칩을 지워 값을 비워도 "검색 초기화"가 그 값을 되돌려 놓아 필터가
|
|
60
|
+
* 조용히 되살아난다. 처음부터 값이 정해져 있어야 하는 필터라면 그것이 `fixed`·`required` 다.
|
|
61
|
+
*
|
|
62
|
+
* required인데 지정하지 않으면 타입별 내장 기본값(select: 첫 번째 옵션,
|
|
63
|
+
* datepicker-day·datepicker-range: 오늘 날짜)을 대신 쓴다. 인라인(radioButton) datepicker-range
|
|
64
|
+
* 필드는 팝오버 없이 바에 바로 노출되어 빈 상태로 둘 수 없으므로, 이 규칙과 무관하게 언제나
|
|
65
|
+
* 오늘이 채워진다 */
|
|
56
66
|
defaultValue?: SChipFilterValue;
|
|
57
67
|
/** 이 필터만 비활성. 바에 남아 있되 팝오버가 열리지 않고 clearable도 눌리지 않는다.
|
|
58
68
|
* 바 전체를 잠그려면 SChipFilterProps.disabled를 쓴다 — 둘은 OR로 합쳐진다 */
|
|
59
69
|
disabled?: boolean;
|
|
60
70
|
}
|
|
61
|
-
/** 후보 목록에서 고르는 필터 —
|
|
71
|
+
/** 후보 목록에서 고르는 필터 — select·select-multi·keyword */
|
|
62
72
|
export interface SChipFilterOptionsField extends SChipFilterFieldBase {
|
|
63
73
|
/** 고를 수 있는 후보 목록 */
|
|
64
74
|
options?: SChipFilterOption[];
|
|
65
75
|
}
|
|
66
|
-
/** 프리셋으로 기간을 고르는 필터 —
|
|
76
|
+
/** 프리셋으로 기간을 고르는 필터 — datepicker-range·datepicker-statistics */
|
|
67
77
|
export interface SChipFilterPresetsField extends SChipFilterFieldBase {
|
|
68
|
-
/** 프리셋 라디오 목록.
|
|
69
|
-
*
|
|
78
|
+
/** 프리셋 라디오 목록. datepicker-range에서 지정하지 않으면 프리셋 없이 기간 피커 하나만 놓이고,
|
|
79
|
+
* datepicker-statistics에서 지정하지 않으면 일별·월별·분기별·반기별·연도별·사용자 지정 기본 목록을 쓴다 */
|
|
70
80
|
presets?: SChipFilterDatePreset[];
|
|
71
81
|
/** 선택 가능 범위 */
|
|
72
82
|
selectable?: [string, string];
|
|
@@ -74,12 +84,12 @@ export interface SChipFilterPresetsField extends SChipFilterFieldBase {
|
|
|
74
84
|
maxRange?: number;
|
|
75
85
|
}
|
|
76
86
|
/** 후보 하나를 고른다 */
|
|
77
|
-
export interface
|
|
78
|
-
type: '
|
|
87
|
+
export interface SChipFilterSelectField extends SChipFilterOptionsField {
|
|
88
|
+
type: 'select';
|
|
79
89
|
}
|
|
80
90
|
/** 후보 여럿을 고른다 */
|
|
81
|
-
export interface
|
|
82
|
-
type: 'multi';
|
|
91
|
+
export interface SChipFilterSelectMultiField extends SChipFilterOptionsField {
|
|
92
|
+
type: 'select-multi';
|
|
83
93
|
}
|
|
84
94
|
/** keyword 필드의 입력 방식 — 무엇을 키워드 하나의 끝으로 볼지 */
|
|
85
95
|
export type SChipFilterKeywordInput = 'tag' | 'csv';
|
|
@@ -99,18 +109,26 @@ export interface SChipFilterKeywordField extends SChipFilterOptionsField {
|
|
|
99
109
|
* 기본 false — 2개(포함/일치)만 */
|
|
100
110
|
excludeMode?: boolean;
|
|
101
111
|
}
|
|
102
|
-
/** 날짜
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
/** 날짜 하나를 고른다 — 캘린더 트리거 하나만 놓인다. 프리셋으로 고르게 하거나 시작~종료를
|
|
113
|
+
* 받아야 하면 datepicker-range 다 */
|
|
114
|
+
export interface SChipFilterDatePickerDayField extends SChipFilterFieldBase {
|
|
115
|
+
type: 'datepicker-day';
|
|
116
|
+
/** 캘린더 트리거의 placeholder */
|
|
106
117
|
placeholder?: string;
|
|
118
|
+
/** 선택 가능 범위 */
|
|
119
|
+
selectable?: [string, string];
|
|
120
|
+
}
|
|
121
|
+
/** 기간(시작~종료)을 고른다. presets를 주면 프리셋 라디오 목록으로 고르고,
|
|
122
|
+
* 주지 않으면 기간 피커 하나만 놓인다 */
|
|
123
|
+
export interface SChipFilterDatePickerRangeField extends SChipFilterPresetsField {
|
|
124
|
+
type: 'datepicker-range';
|
|
107
125
|
/** presets를 필터 바에 세그먼트 라디오로 펼쳐 놓는다(팝오버 없음).
|
|
108
126
|
* 기본 false — 칩 클릭 시 팝오버 안에 세로 라디오 목록(+사용자 지정 선택 시 기간 피커) */
|
|
109
127
|
radioButton?: boolean;
|
|
110
128
|
}
|
|
111
129
|
/** 집계 단위(일·월·분기·반기·연)와 그 단위의 값을 함께 고른다 */
|
|
112
|
-
export interface
|
|
113
|
-
type: '
|
|
130
|
+
export interface SChipFilterDatePickerStatisticsField extends SChipFilterPresetsField {
|
|
131
|
+
type: 'datepicker-statistics';
|
|
114
132
|
}
|
|
115
133
|
/** 칩+팝오버를 거치지 않고 바에 놓을 노드를 앱이 직접 그린다 */
|
|
116
134
|
export interface SChipFilterCustomField extends SChipFilterFieldBase {
|
|
@@ -126,9 +144,9 @@ export interface SChipFilterCustomField extends SChipFilterFieldBase {
|
|
|
126
144
|
}) => ReactNode;
|
|
127
145
|
}
|
|
128
146
|
/** 필터 하나의 정의. type에 따라 쓸 수 있는 속성이 달라진다 —
|
|
129
|
-
* options는
|
|
130
|
-
* render는 custom 에만 있다 */
|
|
131
|
-
export type SChipFilterField =
|
|
147
|
+
* options는 select·select-multi·keyword, presets·maxRange·radioButton은
|
|
148
|
+
* datepicker-range·datepicker-statistics, render는 custom 에만 있다 */
|
|
149
|
+
export type SChipFilterField = SChipFilterSelectField | SChipFilterSelectMultiField | SChipFilterDatePickerDayField | SChipFilterDatePickerRangeField | SChipFilterDatePickerStatisticsField | SChipFilterKeywordField | SChipFilterCustomField;
|
|
132
150
|
export interface SChipFilterChangeDetail {
|
|
133
151
|
key: string;
|
|
134
152
|
value: SChipFilterValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SChipFilter, type SChipFilterChangeDetail, type SChipFilterCustomField, type
|
|
1
|
+
export { SChipFilter, type SChipFilterChangeDetail, type SChipFilterCustomField, type SChipFilterDatePickerDayField, type SChipFilterDatePickerRangeField, type SChipFilterDatePickerStatisticsField, type SChipFilterDatePreset, type SChipFilterField, type SChipFilterFieldBase, type SChipFilterGroup, type SChipFilterGroupRule, type SChipFilterHandle, type SChipFilterKeywordField, type SChipFilterKeywordInput, type SChipFilterKeywordValue, type SChipFilterMatchMode, type SChipFilterOption, type SChipFilterOptionValue, type SChipFilterOptionsField, type SChipFilterPresetsField, type SChipFilterProps, type SChipFilterSelectField, type SChipFilterSelectMultiField, type SChipFilterType, type SChipFilterValue, type SChipFilterValueMap, } from './SChipFilter';
|
|
@@ -3,6 +3,7 @@ import { type SListProps } from '../SList';
|
|
|
3
3
|
export interface SDraggableListRenderState {
|
|
4
4
|
onDragHandleMouseDown: (event: MouseEvent<HTMLDivElement>) => void;
|
|
5
5
|
selected: boolean;
|
|
6
|
+
disabled: boolean;
|
|
6
7
|
depth: number;
|
|
7
8
|
}
|
|
8
9
|
export type SDraggableListDropIntent = 'before' | 'inside' | 'after';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CSSProperties, type RefObject } from 'react';
|
|
2
|
-
import { type
|
|
2
|
+
import { type SEditorToolbarItem } from './editor.config';
|
|
3
3
|
import type { SEditorHandle } from './SEditor';
|
|
4
4
|
import type { TiptapApi } from './tiptap-api';
|
|
5
5
|
export interface EditorBodyProps {
|
|
@@ -15,17 +15,13 @@ export interface EditorBodyProps {
|
|
|
15
15
|
/** 에디터 인스턴스가 생겼다 — 껍데기가 밀린 focus() 를 흘려보낸다 */
|
|
16
16
|
onReady: () => void;
|
|
17
17
|
placeholder: string;
|
|
18
|
-
typography: boolean;
|
|
19
18
|
editable: boolean;
|
|
20
19
|
disabled: boolean;
|
|
21
20
|
minHeight?: number | string;
|
|
22
21
|
maxHeight?: number | string;
|
|
23
|
-
toolbar: SEditorToolbarItem[]
|
|
24
|
-
/** 선택 영역 위에 뜨는 서식
|
|
25
|
-
bubbleMenu: SEditorToolbarItem[]
|
|
26
|
-
fontSizes: number[];
|
|
27
|
-
colors: SEditorColorOption[];
|
|
28
|
-
highlights: SEditorColorOption[];
|
|
22
|
+
toolbar: SEditorToolbarItem[];
|
|
23
|
+
/** 선택 영역 위에 뜨는 서식 판 — 편집할 수 있으면 언제나 뜬다 (SEditor 주석 참고) */
|
|
24
|
+
bubbleMenu: SEditorToolbarItem[];
|
|
29
25
|
onImageUpload?: (file: File) => Promise<string>;
|
|
30
26
|
editorClass?: string;
|
|
31
27
|
editorStyle?: CSSProperties;
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import type { Editor } from '@tiptap/core';
|
|
2
|
-
import { type
|
|
2
|
+
import { type SEditorHeadingLevel, type SEditorToolbarItem } from './editor.config';
|
|
3
3
|
import type { TiptapApi } from './tiptap-api';
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* 툴바 막대 — 엔진을 불러오는 동안 SEditor 가 같은 높이를 잡아 두는 데도 쓴다.
|
|
6
|
+
*
|
|
7
|
+
* **자리를 고정한다.** 긴 글을 쓰는 동안 막대가 화면 밖으로 나가면 서식을 걸 때마다 위로
|
|
8
|
+
* 되돌아가야 한다. 편집 영역이 자기 안에서 스크롤할 때(`maxHeight`)는 막대가 그 위에 있어
|
|
9
|
+
* 이미 남아 있고, 상한 없이 자라 페이지가 스크롤할 때는 `sticky` 가 화면 위쪽에 붙여 둔다.
|
|
10
|
+
*
|
|
11
|
+
* 글이 막대 아래로 지나가므로 배경을 칠해야 한다 — 필드가 상태(읽기전용·비활성)마다 다른
|
|
12
|
+
* 색을 쓰므로 값을 다시 적지 않고 `bg-inherit` 로 테두리 박스의 색을 그대로 받는다.
|
|
13
|
+
*/
|
|
14
|
+
export declare const TOOLBAR_BAR_CLASS = "sticky top-0 z-[1] flex flex-wrap items-center gap-[2px] border-b border-solid bg-inherit px-[8px] py-[4px]";
|
|
6
15
|
export declare const TOOLBAR_BAR_STYLE: {
|
|
7
16
|
borderBottomColor: string;
|
|
8
17
|
};
|
|
@@ -14,8 +23,6 @@ declare const readEditorState: (e: Editor) => {
|
|
|
14
23
|
underline: boolean;
|
|
15
24
|
strike: boolean;
|
|
16
25
|
code: boolean;
|
|
17
|
-
superscript: boolean;
|
|
18
|
-
subscript: boolean;
|
|
19
26
|
alignLeft: boolean;
|
|
20
27
|
alignCenter: boolean;
|
|
21
28
|
alignRight: boolean;
|
|
@@ -26,9 +33,11 @@ declare const readEditorState: (e: Editor) => {
|
|
|
26
33
|
blockquote: boolean;
|
|
27
34
|
codeBlock: boolean;
|
|
28
35
|
link: boolean;
|
|
36
|
+
inTable: boolean;
|
|
37
|
+
canMergeCells: boolean;
|
|
38
|
+
canSplitCell: boolean;
|
|
29
39
|
linkHref: string;
|
|
30
40
|
color: string;
|
|
31
|
-
highlight: string;
|
|
32
41
|
fontSize: string;
|
|
33
42
|
canUndo: boolean;
|
|
34
43
|
canRedo: boolean;
|
|
@@ -42,9 +51,6 @@ export interface EditorToolbarBarProps {
|
|
|
42
51
|
/** 없으면 버튼을 눌러도 아무 일도 하지 않는다 (그때는 disabled 로 함께 잠근다) */
|
|
43
52
|
editor: Editor | null;
|
|
44
53
|
items: SEditorToolbarItem[];
|
|
45
|
-
fontSizes: readonly number[];
|
|
46
|
-
colors: SEditorColorOption[];
|
|
47
|
-
highlights: SEditorColorOption[];
|
|
48
54
|
/** 이미지 업로드 훅. 없으면 `image` 항목을 그리지 않는다 */
|
|
49
55
|
onImageUpload?: (file: File) => Promise<string>;
|
|
50
56
|
/** 편집 불가(비활성·읽기전용·엔진 로딩 중) — 모든 버튼을 잠근다 */
|
|
@@ -66,7 +72,7 @@ interface EditorToolbarProps extends Omit<EditorToolbarBarProps, 'state'> {
|
|
|
66
72
|
* 그래서 엔진을 불러오는 동안에도 SEditor 가 같은 막대를 그려 자리를 지킬 수 있다.
|
|
67
73
|
* 버튼 개수·아이콘이 같아야 줄바꿈까지 같아, 엔진이 붙는 순간 화면이 밀리지 않는다.
|
|
68
74
|
*/
|
|
69
|
-
export declare function EditorToolbarBar({ state, editor, items,
|
|
75
|
+
export declare function EditorToolbarBar({ state, editor, items, onImageUpload, disabled, variant, }: EditorToolbarBarProps): import("react").JSX.Element;
|
|
70
76
|
/**
|
|
71
77
|
* 버블 메뉴 — 글을 선택하면 그 위에 서식 판이 뜬다.
|
|
72
78
|
*
|