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.
@@ -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. 컴포넌트 인덱스 (72종)
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sellmate-design-system-react",
3
- "version": "9.0.0-beta.45",
3
+ "version": "9.0.0-beta.46",
4
4
  "description": "Sellmate Design System — React (TypeScript + Tailwind v4) port",
5
5
  "license": "UNLICENSED",
6
6
  "keywords": [