sellmate-design-system-react 9.0.0-beta.45 → 9.0.0-beta.46
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 +48 -4
- package/dist/components/SButton/README.md +2 -0
- package/dist/components/SChatInput/README.md +44 -0
- package/dist/components/SChatInput/SChatInput.d.ts +60 -0
- package/dist/components/SChatInput/index.d.ts +1 -0
- package/dist/components/SChatMessage/README.md +81 -0
- package/dist/components/SChatMessage/SChatMessage.d.ts +102 -0
- package/dist/components/SChatMessage/index.d.ts +1 -0
- package/dist/components/SGhostButton/README.md +2 -0
- package/dist/components/SIcon/README.md +2 -0
- package/dist/components/SIcon/icons.gen.d.ts +1 -0
- package/dist/components/SImage/README.md +5 -0
- package/dist/components/SLoginCard/README.md +34 -0
- package/dist/components/SLoginCard/SLoginCard.d.ts +28 -0
- package/dist/components/SLoginCard/index.d.ts +1 -0
- package/dist/components/SLoginCard/sellmate-wordmark.d.ts +13 -0
- package/dist/components/STextarea/README.md +2 -0
- package/dist/index.cjs +2417 -2091
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2413 -2093
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +204 -4
- package/dist/llms.txt +50 -6
- package/dist/styles.css +86 -0
- package/package.json +1 -1
package/dist/llms-full.txt
CHANGED
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
| 분류 | 컴포넌트 |
|
|
36
36
|
| --- | --- |
|
|
37
37
|
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
|
|
38
|
-
| **입력 (폼)** | `SForm` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
38
|
+
| **입력 (폼)** | `SForm` `SField` `SInput` `SChatInput`(대화 입력창) `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
39
39
|
| **날짜·시간** | `SCalendar` `SCalendarBoard`(한 달치 일정 판) `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
40
|
-
| **표·목록** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
41
|
-
| **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
40
|
+
| **표·목록** | `SChatMessage`(대화의 메시지 한 건) `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
41
|
+
| **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SLoginCard`(통합 계정 로그인 화면의 카드) `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
42
42
|
| **내비게이션** | `STabs` `SPagination` `SStepper` |
|
|
43
43
|
| **표시·상태** | `STag` `SBadge` `SIcon` `SImage` `SCallout` `SGuide` |
|
|
44
44
|
| **진행·로딩** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
|
|
@@ -146,6 +146,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
146
146
|
|
|
147
147
|
**`toLocaleDateString()` 은 쓰지 않는다** — 로케일에 따라 결과가 바뀌어 표기를 지킬 수 없다.
|
|
148
148
|
|
|
149
|
+
**대화 화면의 시각은 예외다.** `SChatMessage` 의 `time` 처럼 말풍선에 붙는 시각은 `오후 5:52` 로 쓴다. 여기서 시각은 정렬하거나 크기를 비교하는 값이 아니라 대화의 흐름을 짚는 표시라, 자릿수를 맞춘 `17:52` 보다 말하듯 읽히는 표기가 맞다. **이 예외는 대화 말풍선에만 열린다** — 같은 화면이라도 표·상세·목록에 들어가는 일시는 그대로 `YYYY-MM-DD HH:mm` 이다.
|
|
150
|
+
|
|
149
151
|
---
|
|
150
152
|
|
|
151
153
|
## 2. 조합 규칙 — 화면을 어떻게 쌓는가
|
|
@@ -159,7 +161,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
159
161
|
| 층 | 무엇인가 | 컴포넌트 |
|
|
160
162
|
| --- | --- | --- |
|
|
161
163
|
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SGnbSystem`(GNB 맨 아래 판 · 전폭 상단바 오른쪽 끝) `SPage` `SPageHeader`(`SLayout` 안에서 `SPage` 앞에 둔다) |
|
|
162
|
-
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
164
|
+
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SChatMessage` `SChatInput` `SLoginCard`(유일하게 `SPage` 밖에 선다 — 로그인 화면 자체가 자기 자리다, §4-6) `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
163
165
|
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
164
166
|
| **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
|
|
165
167
|
| **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SAccountListBox`(계정 행에 붙어 뜬다 — 직접 띄우지 않는다) `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
|
|
@@ -482,6 +484,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
482
484
|
| --- | --- | --- |
|
|
483
485
|
| 한 줄 텍스트를 받는다 | `SInput` | §3-7-1 |
|
|
484
486
|
| 여러 줄 텍스트를 받는다 | `STextarea` | §3-7-1 |
|
|
487
|
+
| 대화 화면 아래에서 메시지를 입력받는다 | `SChatInput` | |
|
|
485
488
|
| 제목·굵게·목록·색 같은 **서식이 남아야 하는** 글을 받는다 | `SEditor` | §3-7-1 |
|
|
486
489
|
| 목록·결과를 검색어로 좁힌다 | `SSearchInput` | §3-7-1 |
|
|
487
490
|
| 숫자(수량·금액)를 받는다 | `SNumberInput` | §3-7-13 |
|
|
@@ -517,6 +520,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
517
520
|
| 여러 건을 여러 열로 보여주고 열끼리 비교하게 한다 | `STable` | §3-7-6 |
|
|
518
521
|
| 항목 하나의 속성들을 `라벨: 값` 으로 보여준다 | `SKeyValueTable` | §4-4 |
|
|
519
522
|
| 한 줄로 읽히는 항목을 세로로 나열한다 | `SList` + `SListItem` | §3-7-6 |
|
|
523
|
+
| 대화의 메시지 한 건을 보여준다 | `SChatMessage` | |
|
|
520
524
|
| 나열한 항목을 펼쳐 하위 내용을 보여준다 | `SExpansionList` + `SExpansionItem` | §3-7-7 |
|
|
521
525
|
| 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 |
|
|
522
526
|
| 사용자가 순서를 드래그로 바꾸게 한다 | `SDraggableList` + `SDraggableItem` | §3-7-6 |
|
|
@@ -550,6 +554,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
550
554
|
| 페이지 제목(+ 서브 텍스트·뒤로가기·우측 슬롯)을 만든다 | `SPageHeader` (`SLayout` 안에서 `SPage` 앞에 둔다) | §4-1 |
|
|
551
555
|
| 제목 있는 섹션으로 묶는다 | `SSectionHeaderCard` | §3-7-8 |
|
|
552
556
|
| 제목 없이 흰 면으로만 묶는다 | `SCard` | §3-7-8 |
|
|
557
|
+
| 통합 계정 로그인 화면을 만든다 | `SLoginCard` | §4-6 |
|
|
553
558
|
| 가로선으로 끊는다 | `SDivider` | §3-6 |
|
|
554
559
|
| 사용자가 영역 크기를 조절하게 한다 | `SSplitter` | §3-6 |
|
|
555
560
|
| 특정 영역 안에서만 스크롤시킨다 | `SScrollArea` | |
|
|
@@ -2234,6 +2239,45 @@ export default function ProductDetailPage() {
|
|
|
2234
2239
|
|
|
2235
2240
|
본문 래퍼는 `className` 을 받지 않으므로(여백은 `padding` prop 으로만 받는다) 루트에서 내려 준다. **하단 액션 영역이 있으면 본문이 더 이상 마지막 자식이 아니다** — 그때는 `[&>div:nth-last-child(2)]` 로 겨눈다. 흔한 구성은 아니다 — 대부분은 `STable` 이 자기 안에서 스크롤하므로 여기까지 갈 일이 없다.
|
|
2236
2241
|
|
|
2242
|
+
### 4-6. 로그인 화면 — SLoginCard
|
|
2243
|
+
|
|
2244
|
+
앱 셸이 아직 없는 유일한 화면이다. `SLayout`·`SGnb`·`SPage` 가 없고, 회색 바탕 위에 카드 하나만 선다.
|
|
2245
|
+
|
|
2246
|
+
```tsx
|
|
2247
|
+
<div className="flex h-screen items-stretch justify-center bg-(--sys-color-bg-neutralLight) p-sd-24">
|
|
2248
|
+
<SLoginCard
|
|
2249
|
+
product="AI assistant"
|
|
2250
|
+
title="셀메이트 AI 어시스턴트와 함께 자료 찾는 시간은 줄이고, 업무는 빠르게!"
|
|
2251
|
+
description="(사내 답변은 사내 문서를 기반으로 답변합니다.)"
|
|
2252
|
+
onLogin={signIn}
|
|
2253
|
+
footerNote="계정이 없다면 담당자에게 문의를 요청해 주세요."
|
|
2254
|
+
/>
|
|
2255
|
+
</div>
|
|
2256
|
+
```
|
|
2257
|
+
|
|
2258
|
+
**바깥 한 겹은 앱이 만든다.** 카드는 화면을 잡지 않는다 — 덕분에 로그인 화면 밖(세션 만료 재인증 등)에서도 같은 카드를 그대로 쓴다. 그 한 겹은 위 세 가지만 하면 되고, 그 이상은 하지 않는다.
|
|
2259
|
+
|
|
2260
|
+
- 바탕은 `bg-(--sys-color-bg-neutralLight)`, 여백은 `p-sd-24`. **여백은 카드가 최소 폭(368px)을 지킬 수 있는 값으로 둔다** — 좌우 합이 창 폭에서 368px 을 남기지 못하면 카드가 넘친다
|
|
2261
|
+
- `items-stretch` — 카드가 남은 높이를 채운다. `items-center` 로 두면 카드가 내용 높이로 줄어든다
|
|
2262
|
+
- `justify-center` — 카드를 가로 가운데에
|
|
2263
|
+
|
|
2264
|
+
| Prop | 용도 |
|
|
2265
|
+
| --- | --- |
|
|
2266
|
+
| `product` | 로고 아래 제품명 (`AI assistant` · `account` · `chat`) |
|
|
2267
|
+
| `title` | 제품을 한 줄로 소개하는 문장 |
|
|
2268
|
+
| `description` | 소개 바로 아래 붙는 보조 설명. 소개와 한 문단으로 읽힌다 — 없으면 생략한다 |
|
|
2269
|
+
| `onLogin` | 로그인 버튼을 눌렀을 때. **버튼은 카드가 그리므로 동작만 넘긴다** — 문구·색·크기는 세 제품에서 같아야 한다 |
|
|
2270
|
+
| `footerNote` | 버튼 아래 안내 문구 |
|
|
2271
|
+
|
|
2272
|
+
**문구 말고는 주지 않는다.** 라운드·간격·타이포·버튼 색은 카드가 쥐고 있어 제품이 달라도 같은 화면이 선다.
|
|
2273
|
+
|
|
2274
|
+
**크기는 부모가 정한다 — `className` 으로 폭을 박지 않는다.** 카드는 폭을 368~640px 사이에서 부모에 맞추고 높이도 부모가 준 만큼 채운다. 밖에서 고정하면 상하한이 무의미해져, 좁은 화면에서 함께 좁아져야 할 카드가 그대로 남아 넘친다. 좁게 세워야 하면 카드가 아니라 바깥 한 겹을 좁힌다.
|
|
2275
|
+
|
|
2276
|
+
**Sellmate 워드마크와 로그인 버튼은 카드가 직접 그린다 — prop 이 없다.** 세 제품이 같은 로고·같은 버튼 문구(`통합 계정으로 로그인`)로 서므로 넘길 것도, 갈아 끼울 것도 없다. 앱이 주는 것은 문구와 `onLogin` 동작뿐이다.
|
|
2277
|
+
|
|
2278
|
+
**로그인 카드 옆에 다른 블록을 두지 않는다.** 이 화면에서 할 일은 로그인 하나이고, 옆에 공지·배너가 붙는 순간 그 뜻이 깨진다. 안내가 필요하면 `description` 이나 `footerNote` 로 넣는다.
|
|
2279
|
+
|
|
2280
|
+
|
|
2237
2281
|
---
|
|
2238
2282
|
|
|
2239
2283
|
## 5. 자가 점검 체크리스트
|
|
@@ -2801,6 +2845,7 @@ export const BUTTON_SIZES = ['xs', 'sm', 'md', 'lg'] as const;
|
|
|
2801
2845
|
- [SFooter](../SFooter)
|
|
2802
2846
|
- [SKeyValueTable](../SKeyValueTable)
|
|
2803
2847
|
- [SLoadingModal](../SLoadingModal)
|
|
2848
|
+
- [SLoginCard](../SLoginCard)
|
|
2804
2849
|
- [SPopover](../SPopover)
|
|
2805
2850
|
- [SToast](../SToast)
|
|
2806
2851
|
|
|
@@ -3060,6 +3105,123 @@ export type SCalloutMessage = string | SCalloutMessage[];
|
|
|
3060
3105
|
|
|
3061
3106
|
---
|
|
3062
3107
|
|
|
3108
|
+
# SChatInput
|
|
3109
|
+
|
|
3110
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
3111
|
+
|
|
3112
|
+
### SChatInput
|
|
3113
|
+
|
|
3114
|
+
#### Props
|
|
3115
|
+
|
|
3116
|
+
| Prop | Type | Default | Description |
|
|
3117
|
+
|------|------|---------|-------------|
|
|
3118
|
+
| `value?` | `string` | `''` | 입력값 (제어) |
|
|
3119
|
+
| `placeholder?` | `string` | `DEFAULT_PLACEHOLDER` | 안내 문구. 세 제품이 같은 말로 서도록 기본값을 쥐고 있다 |
|
|
3120
|
+
| `disabled?` | `boolean` | `false` | 비활성 |
|
|
3121
|
+
| `busy?` | `boolean` | `false` | 응답을 기다리는 중인지. 켜면 전송 버튼 자리에 정지 버튼이 서고 Enter 전송이 잠긴다 — 답이 오는 동안 또 보내지 못하게 막는 자리다. |
|
|
3122
|
+
| `footerAction?` | `ReactNode` | — | 입력창 아래 보조 액션 슬롯. 없으면 그 줄이 통째로 빠진다. 상담 종료처럼 **대화 자체를 끝내는, 전송과 층이 다른 동작**이 오는 자리다. 무엇을 놓을지는 앱이 정하고, 입력창은 가운데에 세우는 것까지만 한다 — `STextLink` 를 넣는 것이 보통이다. |
|
|
3123
|
+
| `maxRows?` | `number` | `DEFAULT_MAX_ROWS` | 입력창이 자랄 수 있는 최대 줄 수. 여기 닿으면 더 자라지 않고 그 안에서 스크롤한다. |
|
|
3124
|
+
| `className?` | `string` | — | 바깥 컨테이너 className (안쪽 textarea 가 아니다) |
|
|
3125
|
+
| `style?` | `CSSProperties` | — | 바깥 컨테이너 style |
|
|
3126
|
+
| `textareaClassName?` | `string` | — | 안쪽 textarea className |
|
|
3127
|
+
|
|
3128
|
+
#### Events
|
|
3129
|
+
|
|
3130
|
+
| Event | Type | Description |
|
|
3131
|
+
|-------|------|-------------|
|
|
3132
|
+
| `onValueChange` | `(value: string) => void` | 값 변경 |
|
|
3133
|
+
| `onSend` | `(value: string) => void` | 전송. 전송 버튼을 누르거나 Enter 를 쳤을 때 현재 값을 넘긴다. **값이 비면 전송 버튼이 잠긴다** — 빈 메시지는 보낼 수 없다. |
|
|
3134
|
+
| `onAttach` | `() => void` | 파일 첨부. **주면 입력창 왼쪽에 첨부 버튼이 선다** |
|
|
3135
|
+
| `onStop` | `() => void` | 정지. `busy` 일 때 정지 버튼을 누르면 불린다 |
|
|
3136
|
+
|
|
3137
|
+
## Dependencies
|
|
3138
|
+
|
|
3139
|
+
### Depends on
|
|
3140
|
+
|
|
3141
|
+
- [SGhostButton](../SGhostButton)
|
|
3142
|
+
- [STextarea](../STextarea)
|
|
3143
|
+
|
|
3144
|
+
### Graph
|
|
3145
|
+
|
|
3146
|
+
---
|
|
3147
|
+
|
|
3148
|
+
# SChatMessage
|
|
3149
|
+
|
|
3150
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
3151
|
+
|
|
3152
|
+
### SChatMessage
|
|
3153
|
+
|
|
3154
|
+
#### Props
|
|
3155
|
+
|
|
3156
|
+
| Prop | Type | Default | Description |
|
|
3157
|
+
|------|------|---------|-------------|
|
|
3158
|
+
| `direction` | `SChatMessageDirection` | `'incoming'` | 받은 메시지(왼쪽)인지 보낸 메시지(오른쪽)인지. **아바타와 이름 유무도 여기서 갈린다** — 받은 메시지에만 아바타와 `sender` 가 선다. 보낸 메시지는 내가 보냈다는 것이 자리로 이미 드러나 얼굴도 이름도 필요 없다. |
|
|
3159
|
+
| `sender?` | `ReactNode` | — | 말풍선 위에 붙는 보낸 사람 이름. 없으면 자리째 빠진다. **받은 메시지에만 쓰인다** — 보낸 메시지에는 넘겨도 그리지 않는다(`direction` 참고). 앱이 데이터를 한 번만 매핑해 방향과 무관하게 넘길 수 있도록 막지 않고 무시한다. |
|
|
3160
|
+
| `time?` | `ReactNode` | — | 말풍선 아래에 붙는 시각. 표기는 앱이 정해 문자열로 넘긴다 — 대화 화면의 시각은 `오후 5:52` 처럼 읽는 표기를 쓰므로 카드가 서식을 강제하지 않는다 (AGENTS.md §1-4 예외). |
|
|
3161
|
+
| `readStatus?` | `SChatMessageReadStatus` | — | 상대가 읽었는지. 시각 왼쪽에 `읽음`·`안 읽음` 으로 붙고, 주지 않으면 표시하지 않는다. **내가 보낸 메시지에만 붙인다** — 받은 메시지에 읽음 표시를 다는 것은 뜻이 없다. |
|
|
3162
|
+
| `avatarSrc?` | `string` | — | 아바타 이미지 경로. 없으면 사람 아이콘 자리표시가 선다. **받은 메시지에만 쓰인다** — 보낸 메시지에는 아바타가 서지 않는다(`direction` 참고). |
|
|
3163
|
+
| `avatarAlt?` | `string` | — | 아바타 대체 텍스트 |
|
|
3164
|
+
| `continued?` | `boolean` | `false` | 같은 사람이 이어서 말한 묶음인지. 켜면 **아바타와 `sender` 를 그리지 않는다** — 말풍선이 위 묶음과 같은 선에서 시작해 한 사람의 말로 이어 읽힌다. 받은 메시지에서는 아바타 자리를 비워 둔 채 남긴다 — 안 남기면 말풍선이 44px 왼쪽으로 밀려 위 묶음과 어긋난다. 보낸 메시지는 아바타가 없으므로 이름만 숨긴다. `time`·`readStatus` 는 그대로 나온다. 시간이 벌어져 묶음을 나눴어도 얼굴은 한 번만 보이면 되고 시각은 묶음마다 필요하기 때문이다. **얼마나 벌어져야 묶음을 나눌지는 앱이 정한다** — 30분이든 하루든 대화의 성격에 달렸으므로 컴포넌트는 기준을 갖지 않고 스위치만 연다. |
|
|
3165
|
+
| `variant?` | `SChatMessageVariant` | `'default'` | 말풍선 종류. `template` 이면 말풍선이 옅은 파랑 면으로 서서 미리 등록된 서식으로 보내진 메시지임을 드러낸다. **`direction` 과 별개 축이라** 받은 메시지에도 보낸 메시지에도 붙는다. |
|
|
3166
|
+
| `actions?` | `ReactNode` | — | 시각 아래에 붙는 동작 슬롯. 없으면 그 줄이 통째로 빠진다. 「상담원 연결」처럼 **이 메시지에 이어서 할 수 있는 동작**이 오는 자리다. 무엇을 놓을지는 앱이 정하고, 메시지는 줄로 세우고 방향에 맞춰 정렬하는 것까지만 한다. 시각과 같은 선에서 시작한다 — 말풍선 끝에서 한 칸 안이다. |
|
|
3167
|
+
| `messages?` | `ReactNode[]` | — | 말풍선 목록. **한 항목이 말풍선 하나**가 되어 위에서 아래로 쌓인다. 한 사람이 연달아 말하면 아바타·이름·시각은 한 번만 서고 말풍선만 늘어난다 — 그 묶음이 이 컴포넌트 한 개다. 말풍선 안에는 글뿐 아니라 버튼 같은 요소도 올 수 있다. |
|
|
3168
|
+
|
|
3169
|
+
## Types
|
|
3170
|
+
|
|
3171
|
+
### SChatMessageDirection
|
|
3172
|
+
|
|
3173
|
+
```ts
|
|
3174
|
+
export type SChatMessageDirection = (typeof CHAT_MESSAGE_DIRECTIONS)[number];
|
|
3175
|
+
```
|
|
3176
|
+
|
|
3177
|
+
### SChatMessageReadStatus
|
|
3178
|
+
|
|
3179
|
+
```ts
|
|
3180
|
+
export type SChatMessageReadStatus = (typeof CHAT_MESSAGE_READ_STATUSES)[number];
|
|
3181
|
+
```
|
|
3182
|
+
|
|
3183
|
+
### SChatMessageVariant
|
|
3184
|
+
|
|
3185
|
+
```ts
|
|
3186
|
+
export type SChatMessageVariant = (typeof CHAT_MESSAGE_VARIANTS)[number];
|
|
3187
|
+
```
|
|
3188
|
+
|
|
3189
|
+
### CHAT_MESSAGE_DIRECTIONS
|
|
3190
|
+
|
|
3191
|
+
```ts
|
|
3192
|
+
/** 메시지가 오는 쪽 — 받은 메시지(incoming)는 왼쪽, 보낸 메시지(outgoing)는 오른쪽에 선다. */
|
|
3193
|
+
export const CHAT_MESSAGE_DIRECTIONS = ['incoming', 'outgoing'] as const;
|
|
3194
|
+
```
|
|
3195
|
+
|
|
3196
|
+
### CHAT_MESSAGE_READ_STATUSES
|
|
3197
|
+
|
|
3198
|
+
```ts
|
|
3199
|
+
/** 상대가 내 메시지를 읽었는지. 시각 왼쪽에 붙는다. */
|
|
3200
|
+
export const CHAT_MESSAGE_READ_STATUSES = ['read', 'unread'] as const;
|
|
3201
|
+
```
|
|
3202
|
+
|
|
3203
|
+
### CHAT_MESSAGE_VARIANTS
|
|
3204
|
+
|
|
3205
|
+
```ts
|
|
3206
|
+
/**
|
|
3207
|
+
* 말풍선의 종류. `template` 은 미리 등록된 서식으로 보내진 메시지다.
|
|
3208
|
+
*
|
|
3209
|
+
* **`direction` 과 별개 축이다** — 받은 메시지도 보낸 메시지도 템플릿일 수 있다.
|
|
3210
|
+
*/
|
|
3211
|
+
export const CHAT_MESSAGE_VARIANTS = ['default', 'template'] as const;
|
|
3212
|
+
```
|
|
3213
|
+
|
|
3214
|
+
## Dependencies
|
|
3215
|
+
|
|
3216
|
+
### Depends on
|
|
3217
|
+
|
|
3218
|
+
- [SIcon](../SIcon)
|
|
3219
|
+
- [SImage](../SImage)
|
|
3220
|
+
|
|
3221
|
+
### Graph
|
|
3222
|
+
|
|
3223
|
+
---
|
|
3224
|
+
|
|
3063
3225
|
# SCheckbox
|
|
3064
3226
|
|
|
3065
3227
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
@@ -4872,6 +5034,7 @@ export type SGhostButtonIntent = 'default' | 'danger' | 'action' | 'subAction' |
|
|
|
4872
5034
|
- [SBarcodeInput](../SBarcodeInput)
|
|
4873
5035
|
- [SCalendar](../SCalendar)
|
|
4874
5036
|
- [SCalendarBoard](../SCalendarBoard)
|
|
5037
|
+
- [SChatInput](../SChatInput)
|
|
4875
5038
|
- [SChip](../SChip)
|
|
4876
5039
|
- [SDatePicker](../SDatePicker)
|
|
4877
5040
|
- [SDateRangePicker](../SDateRangePicker)
|
|
@@ -5251,6 +5414,7 @@ export type SGuideMessage = string | SGuideMessage[];
|
|
|
5251
5414
|
- [SAccountListBox](../SAccountListBox)
|
|
5252
5415
|
- [SButton](../SButton)
|
|
5253
5416
|
- [SCallout](../SCallout)
|
|
5417
|
+
- [SChatMessage](../SChatMessage)
|
|
5254
5418
|
- [SCheckbox](../SCheckbox)
|
|
5255
5419
|
- [SChipFilter](../SChipFilter)
|
|
5256
5420
|
- [SChipInput](../SChipInput)
|
|
@@ -5336,6 +5500,10 @@ export const IMAGE_FITS = ['cover', 'contain', 'fill', 'none', 'scale-down'] as
|
|
|
5336
5500
|
|
|
5337
5501
|
## Dependencies
|
|
5338
5502
|
|
|
5503
|
+
### Used by
|
|
5504
|
+
|
|
5505
|
+
- [SChatMessage](../SChatMessage)
|
|
5506
|
+
|
|
5339
5507
|
### Depends on
|
|
5340
5508
|
|
|
5341
5509
|
- [SCircleProgress](../SCircleProgress)
|
|
@@ -5821,6 +5989,37 @@ export type SLoadingModalState = 'loading' | 'error';
|
|
|
5821
5989
|
|
|
5822
5990
|
---
|
|
5823
5991
|
|
|
5992
|
+
# SLoginCard
|
|
5993
|
+
|
|
5994
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
5995
|
+
|
|
5996
|
+
### SLoginCard
|
|
5997
|
+
|
|
5998
|
+
#### Props
|
|
5999
|
+
|
|
6000
|
+
| Prop | Type | Default | Description |
|
|
6001
|
+
|------|------|---------|-------------|
|
|
6002
|
+
| `product` | `ReactNode` | — | 로고 아래 제품명 (예: `AI assistant` · `account` · `chat`) |
|
|
6003
|
+
| `title` | `ReactNode` | — | 제품을 한 줄로 소개하는 문장 |
|
|
6004
|
+
| `description?` | `ReactNode` | — | 소개 문장 바로 아래 붙는 보조 설명. 소개와 한 덩어리로 읽힌다 |
|
|
6005
|
+
| `footerNote?` | `ReactNode` | — | 버튼 아래 안내 문구 (예: 계정 발급 문의 안내) |
|
|
6006
|
+
|
|
6007
|
+
#### Events
|
|
6008
|
+
|
|
6009
|
+
| Event | Type | Description |
|
|
6010
|
+
|-------|------|-------------|
|
|
6011
|
+
| `onLogin` | `() => void` | 로그인 버튼을 눌렀을 때. 버튼 자체는 카드가 그리므로 **동작만 넘긴다** — 문구·색·크기는 세 제품에서 같아야 해서 카드가 쥐고 있다. |
|
|
6012
|
+
|
|
6013
|
+
## Dependencies
|
|
6014
|
+
|
|
6015
|
+
### Depends on
|
|
6016
|
+
|
|
6017
|
+
- [SButton](../SButton)
|
|
6018
|
+
|
|
6019
|
+
### Graph
|
|
6020
|
+
|
|
6021
|
+
---
|
|
6022
|
+
|
|
5824
6023
|
# SModal
|
|
5825
6024
|
|
|
5826
6025
|
> 수작성 문서 — SModal 은 컴포넌트가 아니라 **명령형 모달 서비스**라 `docs:gen`(Props/Events 표) 대상이 아니다.
|
|
@@ -7810,6 +8009,7 @@ export type STextLinkSize = 'sm' | 'md' | 'lg';
|
|
|
7810
8009
|
|
|
7811
8010
|
### Used by
|
|
7812
8011
|
|
|
8012
|
+
- [SChatInput](../SChatInput)
|
|
7813
8013
|
- [SKeyValueTable](../SKeyValueTable)
|
|
7814
8014
|
|
|
7815
8015
|
### Depends on
|
package/dist/llms.txt
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
| 분류 | 컴포넌트 |
|
|
37
37
|
| --- | --- |
|
|
38
38
|
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
|
|
39
|
-
| **입력 (폼)** | `SForm` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
39
|
+
| **입력 (폼)** | `SForm` `SField` `SInput` `SChatInput`(대화 입력창) `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
40
40
|
| **날짜·시간** | `SCalendar` `SCalendarBoard`(한 달치 일정 판) `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
41
|
-
| **표·목록** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
42
|
-
| **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
41
|
+
| **표·목록** | `SChatMessage`(대화의 메시지 한 건) `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
42
|
+
| **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SLoginCard`(통합 계정 로그인 화면의 카드) `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
43
43
|
| **내비게이션** | `STabs` `SPagination` `SStepper` |
|
|
44
44
|
| **표시·상태** | `STag` `SBadge` `SIcon` `SImage` `SCallout` `SGuide` |
|
|
45
45
|
| **진행·로딩** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
|
|
@@ -147,6 +147,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
147
147
|
|
|
148
148
|
**`toLocaleDateString()` 은 쓰지 않는다** — 로케일에 따라 결과가 바뀌어 표기를 지킬 수 없다.
|
|
149
149
|
|
|
150
|
+
**대화 화면의 시각은 예외다.** `SChatMessage` 의 `time` 처럼 말풍선에 붙는 시각은 `오후 5:52` 로 쓴다. 여기서 시각은 정렬하거나 크기를 비교하는 값이 아니라 대화의 흐름을 짚는 표시라, 자릿수를 맞춘 `17:52` 보다 말하듯 읽히는 표기가 맞다. **이 예외는 대화 말풍선에만 열린다** — 같은 화면이라도 표·상세·목록에 들어가는 일시는 그대로 `YYYY-MM-DD HH:mm` 이다.
|
|
151
|
+
|
|
150
152
|
---
|
|
151
153
|
|
|
152
154
|
## 2. 조합 규칙 — 화면을 어떻게 쌓는가
|
|
@@ -160,7 +162,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
160
162
|
| 층 | 무엇인가 | 컴포넌트 |
|
|
161
163
|
| --- | --- | --- |
|
|
162
164
|
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SGnbSystem`(GNB 맨 아래 판 · 전폭 상단바 오른쪽 끝) `SPage` `SPageHeader`(`SLayout` 안에서 `SPage` 앞에 둔다) |
|
|
163
|
-
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
165
|
+
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SChatMessage` `SChatInput` `SLoginCard`(유일하게 `SPage` 밖에 선다 — 로그인 화면 자체가 자기 자리다, §4-6) `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
164
166
|
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
165
167
|
| **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
|
|
166
168
|
| **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SAccountListBox`(계정 행에 붙어 뜬다 — 직접 띄우지 않는다) `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
|
|
@@ -483,6 +485,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
483
485
|
| --- | --- | --- |
|
|
484
486
|
| 한 줄 텍스트를 받는다 | `SInput` | §3-7-1 |
|
|
485
487
|
| 여러 줄 텍스트를 받는다 | `STextarea` | §3-7-1 |
|
|
488
|
+
| 대화 화면 아래에서 메시지를 입력받는다 | `SChatInput` | |
|
|
486
489
|
| 제목·굵게·목록·색 같은 **서식이 남아야 하는** 글을 받는다 | `SEditor` | §3-7-1 |
|
|
487
490
|
| 목록·결과를 검색어로 좁힌다 | `SSearchInput` | §3-7-1 |
|
|
488
491
|
| 숫자(수량·금액)를 받는다 | `SNumberInput` | §3-7-13 |
|
|
@@ -518,6 +521,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
518
521
|
| 여러 건을 여러 열로 보여주고 열끼리 비교하게 한다 | `STable` | §3-7-6 |
|
|
519
522
|
| 항목 하나의 속성들을 `라벨: 값` 으로 보여준다 | `SKeyValueTable` | §4-4 |
|
|
520
523
|
| 한 줄로 읽히는 항목을 세로로 나열한다 | `SList` + `SListItem` | §3-7-6 |
|
|
524
|
+
| 대화의 메시지 한 건을 보여준다 | `SChatMessage` | |
|
|
521
525
|
| 나열한 항목을 펼쳐 하위 내용을 보여준다 | `SExpansionList` + `SExpansionItem` | §3-7-7 |
|
|
522
526
|
| 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 |
|
|
523
527
|
| 사용자가 순서를 드래그로 바꾸게 한다 | `SDraggableList` + `SDraggableItem` | §3-7-6 |
|
|
@@ -551,6 +555,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
551
555
|
| 페이지 제목(+ 서브 텍스트·뒤로가기·우측 슬롯)을 만든다 | `SPageHeader` (`SLayout` 안에서 `SPage` 앞에 둔다) | §4-1 |
|
|
552
556
|
| 제목 있는 섹션으로 묶는다 | `SSectionHeaderCard` | §3-7-8 |
|
|
553
557
|
| 제목 없이 흰 면으로만 묶는다 | `SCard` | §3-7-8 |
|
|
558
|
+
| 통합 계정 로그인 화면을 만든다 | `SLoginCard` | §4-6 |
|
|
554
559
|
| 가로선으로 끊는다 | `SDivider` | §3-6 |
|
|
555
560
|
| 사용자가 영역 크기를 조절하게 한다 | `SSplitter` | §3-6 |
|
|
556
561
|
| 특정 영역 안에서만 스크롤시킨다 | `SScrollArea` | |
|
|
@@ -2235,6 +2240,45 @@ export default function ProductDetailPage() {
|
|
|
2235
2240
|
|
|
2236
2241
|
본문 래퍼는 `className` 을 받지 않으므로(여백은 `padding` prop 으로만 받는다) 루트에서 내려 준다. **하단 액션 영역이 있으면 본문이 더 이상 마지막 자식이 아니다** — 그때는 `[&>div:nth-last-child(2)]` 로 겨눈다. 흔한 구성은 아니다 — 대부분은 `STable` 이 자기 안에서 스크롤하므로 여기까지 갈 일이 없다.
|
|
2237
2242
|
|
|
2243
|
+
### 4-6. 로그인 화면 — SLoginCard
|
|
2244
|
+
|
|
2245
|
+
앱 셸이 아직 없는 유일한 화면이다. `SLayout`·`SGnb`·`SPage` 가 없고, 회색 바탕 위에 카드 하나만 선다.
|
|
2246
|
+
|
|
2247
|
+
```tsx
|
|
2248
|
+
<div className="flex h-screen items-stretch justify-center bg-(--sys-color-bg-neutralLight) p-sd-24">
|
|
2249
|
+
<SLoginCard
|
|
2250
|
+
product="AI assistant"
|
|
2251
|
+
title="셀메이트 AI 어시스턴트와 함께 자료 찾는 시간은 줄이고, 업무는 빠르게!"
|
|
2252
|
+
description="(사내 답변은 사내 문서를 기반으로 답변합니다.)"
|
|
2253
|
+
onLogin={signIn}
|
|
2254
|
+
footerNote="계정이 없다면 담당자에게 문의를 요청해 주세요."
|
|
2255
|
+
/>
|
|
2256
|
+
</div>
|
|
2257
|
+
```
|
|
2258
|
+
|
|
2259
|
+
**바깥 한 겹은 앱이 만든다.** 카드는 화면을 잡지 않는다 — 덕분에 로그인 화면 밖(세션 만료 재인증 등)에서도 같은 카드를 그대로 쓴다. 그 한 겹은 위 세 가지만 하면 되고, 그 이상은 하지 않는다.
|
|
2260
|
+
|
|
2261
|
+
- 바탕은 `bg-(--sys-color-bg-neutralLight)`, 여백은 `p-sd-24`. **여백은 카드가 최소 폭(368px)을 지킬 수 있는 값으로 둔다** — 좌우 합이 창 폭에서 368px 을 남기지 못하면 카드가 넘친다
|
|
2262
|
+
- `items-stretch` — 카드가 남은 높이를 채운다. `items-center` 로 두면 카드가 내용 높이로 줄어든다
|
|
2263
|
+
- `justify-center` — 카드를 가로 가운데에
|
|
2264
|
+
|
|
2265
|
+
| Prop | 용도 |
|
|
2266
|
+
| --- | --- |
|
|
2267
|
+
| `product` | 로고 아래 제품명 (`AI assistant` · `account` · `chat`) |
|
|
2268
|
+
| `title` | 제품을 한 줄로 소개하는 문장 |
|
|
2269
|
+
| `description` | 소개 바로 아래 붙는 보조 설명. 소개와 한 문단으로 읽힌다 — 없으면 생략한다 |
|
|
2270
|
+
| `onLogin` | 로그인 버튼을 눌렀을 때. **버튼은 카드가 그리므로 동작만 넘긴다** — 문구·색·크기는 세 제품에서 같아야 한다 |
|
|
2271
|
+
| `footerNote` | 버튼 아래 안내 문구 |
|
|
2272
|
+
|
|
2273
|
+
**문구 말고는 주지 않는다.** 라운드·간격·타이포·버튼 색은 카드가 쥐고 있어 제품이 달라도 같은 화면이 선다.
|
|
2274
|
+
|
|
2275
|
+
**크기는 부모가 정한다 — `className` 으로 폭을 박지 않는다.** 카드는 폭을 368~640px 사이에서 부모에 맞추고 높이도 부모가 준 만큼 채운다. 밖에서 고정하면 상하한이 무의미해져, 좁은 화면에서 함께 좁아져야 할 카드가 그대로 남아 넘친다. 좁게 세워야 하면 카드가 아니라 바깥 한 겹을 좁힌다.
|
|
2276
|
+
|
|
2277
|
+
**Sellmate 워드마크와 로그인 버튼은 카드가 직접 그린다 — prop 이 없다.** 세 제품이 같은 로고·같은 버튼 문구(`통합 계정으로 로그인`)로 서므로 넘길 것도, 갈아 끼울 것도 없다. 앱이 주는 것은 문구와 `onLogin` 동작뿐이다.
|
|
2278
|
+
|
|
2279
|
+
**로그인 카드 옆에 다른 블록을 두지 않는다.** 이 화면에서 할 일은 로그인 하나이고, 옆에 공지·배너가 붙는 순간 그 뜻이 깨진다. 안내가 필요하면 `description` 이나 `footerNote` 로 넣는다.
|
|
2280
|
+
|
|
2281
|
+
|
|
2238
2282
|
---
|
|
2239
2283
|
|
|
2240
2284
|
## 5. 자가 점검 체크리스트
|
|
@@ -2504,7 +2548,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2504
2548
|
--sys-color-navigation-gnb-bg-dark
|
|
2505
2549
|
--sys-color-navigation-gnb-bg-system
|
|
2506
2550
|
|
|
2507
|
-
## 3. 컴포넌트 인덱스 (
|
|
2551
|
+
## 3. 컴포넌트 인덱스 (75종)
|
|
2508
2552
|
|
|
2509
2553
|
**Props 는 이 문서에 없다.** 쓸 컴포넌트를 정했으면 그 컴포넌트의 README 를 읽는다.
|
|
2510
2554
|
|
|
@@ -2513,4 +2557,4 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2513
2557
|
예) SButton 을 쓴다면 `dist/components/SButton/README.md`.
|
|
2514
2558
|
prop 을 추측해서 쓰지 말고 반드시 README 로 확인한다 (분류별 용도는 §1 의 "전체 컴포넌트 인덱스" 참조).
|
|
2515
2559
|
|
|
2516
|
-
SAccountListBox · SActionModal · SBadge · SBarcodeInput · SButton · SCalendar · SCalendarBoard · SCallout · SCard · SCheckbox · SChip · SChipFilter · SChipInput · SCircleProgress · SConfirmModal · SDatePicker · SDateRangePicker · SDivider · SDraggableItem · SDraggableList · SDrawer · SDropdownButton · SEditor · SExpansionItem · SExpansionList · SField · SFilePicker · SForm · SGhostButton · SGnb · SGnbSystem · SGuide · SIcon · SImage · SInput · SKeyValueTable · SLayout · SLinearProgress · SList · SListItem · SLoadingContainer · SLoadingModal · SModal · SNumberInput · SPage · SPagination · SPopover · SPopup · SPortal · SRadio · SRadioButton · SRadioCard · SScrollArea · SSearchInput · SSectionHeaderCard · SSelect · SSplitter · SStepper · SSwitch · SSystemActionButton · STable · STableBar · STabs · STag · STextLink · STextarea · STimePicker · STimeRangePicker · SToast · SToggle · STooltip · STree
|
|
2560
|
+
SAccountListBox · SActionModal · SBadge · SBarcodeInput · SButton · SCalendar · SCalendarBoard · SCallout · SCard · SChatInput · SChatMessage · SCheckbox · SChip · SChipFilter · SChipInput · SCircleProgress · SConfirmModal · SDatePicker · SDateRangePicker · SDivider · SDraggableItem · SDraggableList · SDrawer · SDropdownButton · SEditor · SExpansionItem · SExpansionList · SField · SFilePicker · SForm · SGhostButton · SGnb · SGnbSystem · SGuide · SIcon · SImage · SInput · SKeyValueTable · SLayout · SLinearProgress · SList · SListItem · SLoadingContainer · SLoadingModal · SLoginCard · SModal · SNumberInput · SPage · SPagination · SPopover · SPopup · SPortal · SRadio · SRadioButton · SRadioCard · SScrollArea · SSearchInput · SSectionHeaderCard · SSelect · SSplitter · SStepper · SSwitch · SSystemActionButton · STable · STableBar · STabs · STag · STextLink · STextarea · STimePicker · STimeRangePicker · SToast · SToggle · STooltip · STree
|
package/dist/styles.css
CHANGED
|
@@ -1076,15 +1076,24 @@
|
|
|
1076
1076
|
.h-\[420px\] {
|
|
1077
1077
|
height: 420px;
|
|
1078
1078
|
}
|
|
1079
|
+
.h-\[440px\] {
|
|
1080
|
+
height: 440px;
|
|
1081
|
+
}
|
|
1079
1082
|
.h-\[520px\] {
|
|
1080
1083
|
height: 520px;
|
|
1081
1084
|
}
|
|
1085
|
+
.h-\[560px\] {
|
|
1086
|
+
height: 560px;
|
|
1087
|
+
}
|
|
1082
1088
|
.h-\[600px\] {
|
|
1083
1089
|
height: 600px;
|
|
1084
1090
|
}
|
|
1085
1091
|
.h-\[640px\] {
|
|
1086
1092
|
height: 640px;
|
|
1087
1093
|
}
|
|
1094
|
+
.h-\[720px\] {
|
|
1095
|
+
height: 720px;
|
|
1096
|
+
}
|
|
1088
1097
|
.h-\[var\(--cmp-checkbox-size\)\] {
|
|
1089
1098
|
height: var(--cmp-checkbox-size);
|
|
1090
1099
|
}
|
|
@@ -1322,6 +1331,12 @@
|
|
|
1322
1331
|
.w-\[420px\] {
|
|
1323
1332
|
width: 420px;
|
|
1324
1333
|
}
|
|
1334
|
+
.w-\[480px\] {
|
|
1335
|
+
width: 480px;
|
|
1336
|
+
}
|
|
1337
|
+
.w-\[512px\] {
|
|
1338
|
+
width: 512px;
|
|
1339
|
+
}
|
|
1325
1340
|
.w-\[520px\] {
|
|
1326
1341
|
width: 520px;
|
|
1327
1342
|
}
|
|
@@ -1409,6 +1424,12 @@
|
|
|
1409
1424
|
.max-w-\[420px\] {
|
|
1410
1425
|
max-width: 420px;
|
|
1411
1426
|
}
|
|
1427
|
+
.max-w-\[640px\] {
|
|
1428
|
+
max-width: 640px;
|
|
1429
|
+
}
|
|
1430
|
+
.max-w-\[720px\] {
|
|
1431
|
+
max-width: 720px;
|
|
1432
|
+
}
|
|
1412
1433
|
.max-w-\[1200px\] {
|
|
1413
1434
|
max-width: 1200px;
|
|
1414
1435
|
}
|
|
@@ -1460,6 +1481,9 @@
|
|
|
1460
1481
|
.min-w-\[180px\] {
|
|
1461
1482
|
min-width: 180px;
|
|
1462
1483
|
}
|
|
1484
|
+
.min-w-\[368px\] {
|
|
1485
|
+
min-width: 368px;
|
|
1486
|
+
}
|
|
1463
1487
|
.min-w-\[calc\(var\(--cmp-pagination-height\)\*2\+var\(--cmp-pagination-move-gap\)\)\] {
|
|
1464
1488
|
min-width: calc(var(--cmp-pagination-height) * 2 + var(--cmp-pagination-move-gap));
|
|
1465
1489
|
}
|
|
@@ -1528,6 +1552,9 @@
|
|
|
1528
1552
|
.origin-left {
|
|
1529
1553
|
transform-origin: 0;
|
|
1530
1554
|
}
|
|
1555
|
+
.origin-top-left {
|
|
1556
|
+
transform-origin: 0 0;
|
|
1557
|
+
}
|
|
1531
1558
|
.-translate-x-1\/2 {
|
|
1532
1559
|
--tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
|
|
1533
1560
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -1559,6 +1586,9 @@
|
|
|
1559
1586
|
.scale-\[0\.22\] {
|
|
1560
1587
|
scale: 0.22;
|
|
1561
1588
|
}
|
|
1589
|
+
.scale-\[0\.28\] {
|
|
1590
|
+
scale: 0.28;
|
|
1591
|
+
}
|
|
1562
1592
|
.scale-\[0\.42\] {
|
|
1563
1593
|
scale: 0.42;
|
|
1564
1594
|
}
|
|
@@ -1670,6 +1700,9 @@
|
|
|
1670
1700
|
.flex-row {
|
|
1671
1701
|
flex-direction: row;
|
|
1672
1702
|
}
|
|
1703
|
+
.flex-row-reverse {
|
|
1704
|
+
flex-direction: row-reverse;
|
|
1705
|
+
}
|
|
1673
1706
|
.flex-nowrap {
|
|
1674
1707
|
flex-wrap: nowrap;
|
|
1675
1708
|
}
|
|
@@ -2009,6 +2042,12 @@
|
|
|
2009
2042
|
.gap-sd-32 {
|
|
2010
2043
|
gap: var(--spacing-sd-32);
|
|
2011
2044
|
}
|
|
2045
|
+
.gap-sd-40 {
|
|
2046
|
+
gap: var(--spacing-sd-40);
|
|
2047
|
+
}
|
|
2048
|
+
.gap-sd-60 {
|
|
2049
|
+
gap: var(--spacing-sd-60);
|
|
2050
|
+
}
|
|
2012
2051
|
.space-y-4 {
|
|
2013
2052
|
:where(& > :not(:last-child)) {
|
|
2014
2053
|
--tw-space-y-reverse: 0;
|
|
@@ -2133,6 +2172,12 @@
|
|
|
2133
2172
|
.rounded-\[8px\] {
|
|
2134
2173
|
border-radius: 8px;
|
|
2135
2174
|
}
|
|
2175
|
+
.rounded-\[12px\] {
|
|
2176
|
+
border-radius: 12px;
|
|
2177
|
+
}
|
|
2178
|
+
.rounded-\[24px\] {
|
|
2179
|
+
border-radius: 24px;
|
|
2180
|
+
}
|
|
2136
2181
|
.rounded-\[inherit\] {
|
|
2137
2182
|
border-radius: inherit;
|
|
2138
2183
|
}
|
|
@@ -2638,6 +2683,12 @@
|
|
|
2638
2683
|
.bg-\(--sab-icon-bg\) {
|
|
2639
2684
|
background-color: var(--sab-icon-bg);
|
|
2640
2685
|
}
|
|
2686
|
+
.bg-\(--sys-color-bg-accentFaint\) {
|
|
2687
|
+
background-color: var(--sys-color-bg-accentFaint);
|
|
2688
|
+
}
|
|
2689
|
+
.bg-\(--sys-color-bg-brand\) {
|
|
2690
|
+
background-color: var(--sys-color-bg-brand);
|
|
2691
|
+
}
|
|
2641
2692
|
.bg-\(--sys-color-bg-frame\) {
|
|
2642
2693
|
background-color: var(--sys-color-bg-frame);
|
|
2643
2694
|
}
|
|
@@ -2653,6 +2704,9 @@
|
|
|
2653
2704
|
.bg-\(--sys-color-bg-tableHeader\) {
|
|
2654
2705
|
background-color: var(--sys-color-bg-tableHeader);
|
|
2655
2706
|
}
|
|
2707
|
+
.bg-\(--sys-color-field-bg-default\) {
|
|
2708
|
+
background-color: var(--sys-color-field-bg-default);
|
|
2709
|
+
}
|
|
2656
2710
|
.bg-\[\#\.\.\.\] {
|
|
2657
2711
|
background-color: #...;
|
|
2658
2712
|
}
|
|
@@ -2956,6 +3010,12 @@
|
|
|
2956
3010
|
.p-sd-32 {
|
|
2957
3011
|
padding: var(--spacing-sd-32);
|
|
2958
3012
|
}
|
|
3013
|
+
.p-sd-40 {
|
|
3014
|
+
padding: var(--spacing-sd-40);
|
|
3015
|
+
}
|
|
3016
|
+
.p-sd-60 {
|
|
3017
|
+
padding: var(--spacing-sd-60);
|
|
3018
|
+
}
|
|
2959
3019
|
.p-sd-62 {
|
|
2960
3020
|
padding: var(--spacing-sd-62);
|
|
2961
3021
|
}
|
|
@@ -3420,6 +3480,9 @@
|
|
|
3420
3480
|
.text-\[18px\] {
|
|
3421
3481
|
font-size: 18px;
|
|
3422
3482
|
}
|
|
3483
|
+
.text-\[24px\] {
|
|
3484
|
+
font-size: 24px;
|
|
3485
|
+
}
|
|
3423
3486
|
.leading-5 {
|
|
3424
3487
|
--tw-leading: calc(var(--spacing) * 5);
|
|
3425
3488
|
line-height: calc(var(--spacing) * 5);
|
|
@@ -3464,6 +3527,10 @@
|
|
|
3464
3527
|
--tw-leading: 30px;
|
|
3465
3528
|
line-height: 30px;
|
|
3466
3529
|
}
|
|
3530
|
+
.leading-\[36px\] {
|
|
3531
|
+
--tw-leading: 36px;
|
|
3532
|
+
line-height: 36px;
|
|
3533
|
+
}
|
|
3467
3534
|
.leading-\[normal\] {
|
|
3468
3535
|
--tw-leading: normal;
|
|
3469
3536
|
line-height: normal;
|
|
@@ -3532,6 +3599,9 @@
|
|
|
3532
3599
|
--tw-tracking: var(--tracking-wider);
|
|
3533
3600
|
letter-spacing: var(--tracking-wider);
|
|
3534
3601
|
}
|
|
3602
|
+
.text-balance {
|
|
3603
|
+
text-wrap: balance;
|
|
3604
|
+
}
|
|
3535
3605
|
.text-nowrap {
|
|
3536
3606
|
text-wrap: nowrap;
|
|
3537
3607
|
}
|
|
@@ -3541,9 +3611,16 @@
|
|
|
3541
3611
|
.text-wrap {
|
|
3542
3612
|
text-wrap: wrap;
|
|
3543
3613
|
}
|
|
3614
|
+
.break-normal {
|
|
3615
|
+
overflow-wrap: normal;
|
|
3616
|
+
word-break: normal;
|
|
3617
|
+
}
|
|
3544
3618
|
.break-words {
|
|
3545
3619
|
overflow-wrap: break-word;
|
|
3546
3620
|
}
|
|
3621
|
+
.wrap-break-word {
|
|
3622
|
+
overflow-wrap: break-word;
|
|
3623
|
+
}
|
|
3547
3624
|
.break-all {
|
|
3548
3625
|
word-break: break-all;
|
|
3549
3626
|
}
|
|
@@ -3676,9 +3753,18 @@
|
|
|
3676
3753
|
.text-\(--sys-color-disabled-text\) {
|
|
3677
3754
|
color: var(--sys-color-disabled-text);
|
|
3678
3755
|
}
|
|
3756
|
+
.text-\(--sys-color-fg-accentLight\) {
|
|
3757
|
+
color: var(--sys-color-fg-accentLight);
|
|
3758
|
+
}
|
|
3679
3759
|
.text-\(--sys-color-fg-brand\) {
|
|
3680
3760
|
color: var(--sys-color-fg-brand);
|
|
3681
3761
|
}
|
|
3762
|
+
.text-\(--sys-color-fg-deep\) {
|
|
3763
|
+
color: var(--sys-color-fg-deep);
|
|
3764
|
+
}
|
|
3765
|
+
.text-\(--sys-color-fg-inverse\) {
|
|
3766
|
+
color: var(--sys-color-fg-inverse);
|
|
3767
|
+
}
|
|
3682
3768
|
.text-\(--sys-color-fg-primary\) {
|
|
3683
3769
|
color: var(--sys-color-fg-primary);
|
|
3684
3770
|
}
|