sellmate-design-system-react 4.3.0 → 5.0.1
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 +18 -0
- package/README.md +2 -2
- package/dist/components/SActionModal/README.md +6 -4
- package/dist/components/SActionModal/SActionModal.d.ts +3 -12
- package/dist/components/SActionModal/index.d.ts +1 -1
- package/dist/components/SButton/README.md +2 -6
- package/dist/components/SConfirmModal/README.md +1 -1
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +1 -1
- package/dist/components/SDrawer/README.md +8 -5
- package/dist/components/SDrawer/SDrawer.d.ts +14 -11
- package/dist/components/SFooter/README.md +40 -0
- package/dist/components/SFooter/SFooter.d.ts +36 -0
- package/dist/components/SFooter/index.d.ts +1 -0
- package/dist/components/SGhostButton/README.md +2 -2
- package/dist/components/SGnb/README.md +0 -5
- package/dist/components/SGnb/SGnb.d.ts +6 -2
- package/dist/components/SGnb/gnb.config.d.ts +2 -0
- package/dist/components/SLayout/README.md +1 -6
- package/dist/components/SLayout/SLayout.d.ts +39 -17
- package/dist/components/SLoadingModal/README.md +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.d.ts +1 -1
- package/dist/components/SModalContainer/README.md +1 -1
- package/dist/components/SModalContainer/SModalContainer.d.ts +6 -2
- package/dist/components/SOverlayHeader/README.md +45 -0
- package/dist/components/SOverlayHeader/SOverlayHeader.d.ts +28 -0
- package/dist/components/SOverlayHeader/index.d.ts +1 -0
- package/dist/components/SPage/SPage.d.ts +2 -2
- package/dist/components/SPopup/README.md +2 -2
- package/dist/index.cjs +439 -256
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +439 -256
- package/dist/index.js.map +1 -1
- package/dist/lib/global-overlay.d.ts +17 -0
- package/dist/lib/isomorphic-layout-effect.d.ts +8 -0
- package/dist/llms-full.txt +109 -23
- package/dist/llms.txt +18 -0
- package/dist/styles.css +27 -17
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 모달 위에 뜨는 전역 레이어(토스트·로딩)의 표식.
|
|
3
|
+
*
|
|
4
|
+
* 이 레이어들은 모달보다 위(Z_INDEX.toast/loading > Z_INDEX.modalHost)에 뜨지만 DOM 상으로는
|
|
5
|
+
* body 직속이라, Radix Dialog 입장에서는 '모달 바깥'이다. 표식이 없으면 토스트 닫기 버튼을
|
|
6
|
+
* 누르는 것만으로 바깥 클릭으로 처리돼 persistent 모달은 흔들리고 일반 모달은 닫혀버린다.
|
|
7
|
+
*/
|
|
8
|
+
export declare const GLOBAL_OVERLAY_ATTR = "data-s-global-overlay";
|
|
9
|
+
/** 전역 레이어 루트에 펼쳐 넣는다. */
|
|
10
|
+
export declare const globalOverlayProps: {
|
|
11
|
+
"data-s-global-overlay": string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Radix 의 outside 이벤트(pointerDownOutside/focusOutside/interactOutside)가
|
|
15
|
+
* 전역 레이어에서 비롯됐는지 판별한다. Radix 는 원본 이벤트를 `detail.originalEvent` 에 담는다.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isFromGlobalOverlay(event: Event): boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 페인트 **전에** 부모로 상태를 올려야 할 때 쓴다.
|
|
4
|
+
* useEffect 로 올리면 등록 전 값(예: 폭 0)으로 한 프레임이 먼저 그려져 레이아웃이 번쩍인다.
|
|
5
|
+
*
|
|
6
|
+
* 서버에는 레이아웃 단계가 없어 useLayoutEffect 가 경고를 내므로 SSR 에서는 useEffect 로 내린다.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useIsomorphicLayoutEffect: typeof useEffect;
|
package/dist/llms-full.txt
CHANGED
|
@@ -404,6 +404,24 @@ SModal.create({ component: OrderModal, componentProps: { orderId } })
|
|
|
404
404
|
.onDismissed(() => {});
|
|
405
405
|
```
|
|
406
406
|
|
|
407
|
+
#### 3-3-5. 닫기 경로 — `persistent` 는 기본이 `true` 다
|
|
408
|
+
|
|
409
|
+
모달 3종(`SActionModal` · `SConfirmModal` · `SLoadingModal`)과 `SDrawer` 는 **백드롭 클릭·ESC 로 닫히지 않는 것이 기본**이다. 닫기 시도는 흔들림(shake)으로만 반응한다. 작성 중인 내용을 실수로 잃지 않게 하기 위한 것이다.
|
|
410
|
+
|
|
411
|
+
| | 기본 닫기 경로 | 백드롭·ESC |
|
|
412
|
+
| --- | --- | --- |
|
|
413
|
+
| `SActionModal` · `SConfirmModal` · `SLoadingModal` | X 버튼, 모달 안의 버튼 | 막힘 (흔들림) |
|
|
414
|
+
| `SDrawer` | X 버튼, footer 버튼 | 막힘 (흔들림) |
|
|
415
|
+
| `SPopover` · `STooltip` · `SSelect` 등 floating | 바깥 클릭·ESC | **막지 않는다** — 이 규칙의 대상이 아니다 |
|
|
416
|
+
|
|
417
|
+
따라서 다음을 지킨다.
|
|
418
|
+
|
|
419
|
+
- **닫을 수단을 반드시 하나는 둔다.** `SActionModal` 에 `showClose` 도 `button`/`footerLeft` 도 없으면 사용자가 모달을 닫을 방법이 없다. 백드롭이 더 이상 탈출구가 아니다.
|
|
420
|
+
- **`persistent` 를 `true` 로 직접 주지 않는다.** 기본값이므로 중복이다.
|
|
421
|
+
- **`persistent={false}` 는 잃을 입력이 없을 때만.** 단순 알림처럼 임의로 닫혀도 아무것도 사라지지 않는 경우로 한정한다.
|
|
422
|
+
|
|
423
|
+
작성 중인 내용이 있을 때 닫기를 시도하면 이탈 안내를 띄우는 것은 **소비 앱 몫**이다. 디자인 시스템은 dirty 상태를 알지 못하므로 백드롭·ESC 를 일괄 차단할 뿐이다. 안내가 필요하면 앱이 자체 dirty 판정 후 `SModal.confirm` 으로 띄운다.
|
|
424
|
+
|
|
407
425
|
### 3-4. 테이블 컬럼 정렬
|
|
408
426
|
|
|
409
427
|
**값의 크기를 비교하는 숫자 컬럼은 예외 없이 오른쪽 정렬한다** (`align: 'right'`).
|
|
@@ -1143,10 +1161,10 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1143
1161
|
| Prop | Type | Default | Description |
|
|
1144
1162
|
|------|------|---------|-------------|
|
|
1145
1163
|
| `open?` | `boolean` | — | |
|
|
1146
|
-
| `persistent?` | `boolean` | — |
|
|
1164
|
+
| `persistent?` | `boolean` | — | 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** |
|
|
1147
1165
|
| `modalTitle?` | `string` | `''` | |
|
|
1148
1166
|
| `description?` | `ReactNode` | — | 제목 오른쪽에 붙는 보조 설명 (sd-action-modal 의 header-sub-title 슬롯). 문자열이면 서브텍스트 스타일로 렌더하고, 노드를 넘기면 그대로 배치한다. |
|
|
1149
|
-
| `button?` | `
|
|
1167
|
+
| `button?` | `SFooterButton` | — | 하단 액션 버튼 (주 액션 1개). 의도적으로 단수다 — 보조 버튼(취소·삭제 등)은 `footerLeft` 슬롯에 직접 배치한다. |
|
|
1150
1168
|
| `footerLeft?` | `ReactNode` | — | footer 좌측 영역 (sd-action-modal 의 bottom-sub-content 슬롯). 보조 버튼이나 안내 문구를 넣는다. 버튼을 하나 더 쓰고 싶을 때 여기에 SButton 을 넣는다. |
|
|
1151
1169
|
| `width?` | `number \| string` | — | |
|
|
1152
1170
|
| `height?` | `number \| string` | — | |
|
|
@@ -1163,8 +1181,9 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1163
1181
|
|
|
1164
1182
|
### Depends on
|
|
1165
1183
|
|
|
1166
|
-
- [
|
|
1184
|
+
- [SFooter](../SFooter)
|
|
1167
1185
|
- [SModalContainer](../SModalContainer)
|
|
1186
|
+
- [SOverlayHeader](../SOverlayHeader)
|
|
1168
1187
|
|
|
1169
1188
|
### Graph
|
|
1170
1189
|
|
|
@@ -1273,14 +1292,12 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1273
1292
|
|
|
1274
1293
|
### Used by
|
|
1275
1294
|
|
|
1276
|
-
- [SActionModal](../SActionModal)
|
|
1277
1295
|
- [SConfirmModal](../SConfirmModal)
|
|
1278
|
-
- [SDrawer](../SDrawer)
|
|
1279
1296
|
- [SDropdownButton](../SDropdownButton)
|
|
1297
|
+
- [SFooter](../SFooter)
|
|
1280
1298
|
- [SKeyValueTable](../SKeyValueTable)
|
|
1281
1299
|
- [SLoadingModal](../SLoadingModal)
|
|
1282
1300
|
- [SPopover](../SPopover)
|
|
1283
|
-
- [SPopup](../SPopup)
|
|
1284
1301
|
- [SToast](../SToast)
|
|
1285
1302
|
|
|
1286
1303
|
### Depends on
|
|
@@ -1572,7 +1589,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1572
1589
|
| Prop | Type | Default | Description |
|
|
1573
1590
|
|------|------|---------|-------------|
|
|
1574
1591
|
| `open?` | `boolean` | — | |
|
|
1575
|
-
| `persistent?` | `boolean` | — |
|
|
1592
|
+
| `persistent?` | `boolean` | — | 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** |
|
|
1576
1593
|
| `type?` | `SConfirmModalType` | `'positive'` | 타입 (아이콘·메인버튼 색 결정) |
|
|
1577
1594
|
| `modalTitle?` | `string` | `''` | |
|
|
1578
1595
|
| `titleClass?` | `string` | — | 제목 엘리먼트에 추가할 클래스 (sd-confirm-modal titleClass) |
|
|
@@ -1861,9 +1878,12 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1861
1878
|
| Prop | Type | Default | Description |
|
|
1862
1879
|
|------|------|---------|-------------|
|
|
1863
1880
|
| `open?` | `boolean` | — | 표시 여부 |
|
|
1864
|
-
| `persistent?` | `boolean` | `
|
|
1881
|
+
| `persistent?` | `boolean` | `true` | backdrop·ESC로 닫히지 않고 흔들림 효과를 준다. **기본값 true** — Drawer는 내용을 작성·구성하는 곳이라 임의 닫힘을 막는 것이 기본이다. 닫기 경로는 X 버튼과 footer 버튼뿐이다. false로 주면 backdrop·ESC 닫기가 열린다. |
|
|
1865
1882
|
| `title?` | `string` | `''` | 접근성 제목 및 헤더 제목 |
|
|
1866
1883
|
| `width?` | `number \| string` | `572` | Drawer 너비. 기본값은 Figma drawer 기준 572px이다. |
|
|
1884
|
+
| `resizable?` | `boolean` | `false` | true면 왼쪽 테두리를 드래그해 너비를 조절할 수 있다. |
|
|
1885
|
+
| `minWidth?` | `number \| string` | — | 리사이즈 가능한 최소 너비(px, %, vw, vh) |
|
|
1886
|
+
| `maxWidth?` | `number \| string` | — | 리사이즈 가능한 최대 너비(px, %, vw, vh) |
|
|
1867
1887
|
| `footerLeft?` | `ReactNode` | — | footer 좌측 슬롯 |
|
|
1868
1888
|
| `button?` | `SDrawerButton` | — | 우측 기본 액션 버튼 |
|
|
1869
1889
|
| `children?` | `ReactNode` | — | |
|
|
@@ -1881,8 +1901,8 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1881
1901
|
|
|
1882
1902
|
### Depends on
|
|
1883
1903
|
|
|
1884
|
-
- [
|
|
1885
|
-
- [
|
|
1904
|
+
- [SFooter](../SFooter)
|
|
1905
|
+
- [SOverlayHeader](../SOverlayHeader)
|
|
1886
1906
|
|
|
1887
1907
|
### Graph
|
|
1888
1908
|
|
|
@@ -2133,6 +2153,40 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2133
2153
|
|
|
2134
2154
|
---
|
|
2135
2155
|
|
|
2156
|
+
# SFooter
|
|
2157
|
+
|
|
2158
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
2159
|
+
|
|
2160
|
+
### SFooter
|
|
2161
|
+
|
|
2162
|
+
#### Props
|
|
2163
|
+
|
|
2164
|
+
| Prop | Type | Default | Description |
|
|
2165
|
+
|------|------|---------|-------------|
|
|
2166
|
+
| `bg?` | `SFooterBg` | `'white'` | 배경색 |
|
|
2167
|
+
| `left?` | `ReactNode` | — | footer 좌측 slot |
|
|
2168
|
+
| `children?` | `ReactNode` | — | footer 좌측 slot. left와 함께 쓰면 left 뒤에 렌더된다 |
|
|
2169
|
+
| `button?` | `SFooterButton` | — | 우측 기본 액션 버튼 |
|
|
2170
|
+
| `className?` | `string` | — | |
|
|
2171
|
+
| `leftClassName?` | `string` | — | |
|
|
2172
|
+
| `style?` | `CSSProperties` | — | |
|
|
2173
|
+
|
|
2174
|
+
## Dependencies
|
|
2175
|
+
|
|
2176
|
+
### Used by
|
|
2177
|
+
|
|
2178
|
+
- [SActionModal](../SActionModal)
|
|
2179
|
+
- [SDrawer](../SDrawer)
|
|
2180
|
+
- [SPopup](../SPopup)
|
|
2181
|
+
|
|
2182
|
+
### Depends on
|
|
2183
|
+
|
|
2184
|
+
- [SButton](../SButton)
|
|
2185
|
+
|
|
2186
|
+
### Graph
|
|
2187
|
+
|
|
2188
|
+
---
|
|
2189
|
+
|
|
2136
2190
|
# SForm
|
|
2137
2191
|
|
|
2138
2192
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
@@ -2203,12 +2257,12 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2203
2257
|
- [SCalendar](../SCalendar)
|
|
2204
2258
|
- [SChip](../SChip)
|
|
2205
2259
|
- [SDateRangePicker](../SDateRangePicker)
|
|
2206
|
-
- [SDrawer](../SDrawer)
|
|
2207
2260
|
- [SFilePicker](../SFilePicker)
|
|
2208
2261
|
- [SGnb](../SGnb)
|
|
2209
2262
|
- [SGuide](../SGuide)
|
|
2210
2263
|
- [SInput](../SInput)
|
|
2211
2264
|
- [SModalContainer](../SModalContainer)
|
|
2265
|
+
- [SOverlayHeader](../SOverlayHeader)
|
|
2212
2266
|
- [SPopover](../SPopover)
|
|
2213
2267
|
- [SSelect](../SSelect)
|
|
2214
2268
|
- [STimePicker](../STimePicker)
|
|
@@ -2261,10 +2315,6 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2261
2315
|
|
|
2262
2316
|
## Dependencies
|
|
2263
2317
|
|
|
2264
|
-
### Used by
|
|
2265
|
-
|
|
2266
|
-
- [SLayout](../SLayout)
|
|
2267
|
-
|
|
2268
2318
|
### Depends on
|
|
2269
2319
|
|
|
2270
2320
|
- [SGhostButton](../SGhostButton)
|
|
@@ -2482,7 +2532,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2482
2532
|
|------|------|---------|-------------|
|
|
2483
2533
|
| `type?` | `SLayoutType` | `'box'` | 메뉴 스타일: box(라운드) / belt(풀폭 행). 자식 SGnb 가 이 값을 따른다. |
|
|
2484
2534
|
| `header?` | `SLayoutHeader` | `'fix'` | 레이아웃 구조: fix(가로 분할) / full(풀폭 상단바). 자식 SGnb·SPage 가 이 값을 따른다. |
|
|
2485
|
-
| `useRail?` | `boolean` | `false` | GNB 좌측 레일 사용 여부. 자식 SGnb 가 이 값을 따르고,
|
|
2535
|
+
| `useRail?` | `boolean` | `false` | GNB 좌측 레일 사용 여부. 자식 SGnb 가 이 값을 따르고, 그만큼 넓어진 컬럼 폭을 되올린다. 레일에 children 없는 아이템이 있으면 SGnb 가 full 상단바를 요구하고, 이 레이아웃도 그에 맞춰 full 그리드로 선다. |
|
|
2486
2536
|
| `folded?` | `boolean` | — | GNB 접힘 상태 (controlled) |
|
|
2487
2537
|
| `defaultFolded?` | `boolean` | `false` | GNB 초기 접힘 상태 (uncontrolled) |
|
|
2488
2538
|
|
|
@@ -2499,10 +2549,6 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2499
2549
|
- [SGnb](../SGnb)
|
|
2500
2550
|
- [SPage](../SPage)
|
|
2501
2551
|
|
|
2502
|
-
### Depends on
|
|
2503
|
-
|
|
2504
|
-
- [SGnb](../SGnb)
|
|
2505
|
-
|
|
2506
2552
|
### Graph
|
|
2507
2553
|
|
|
2508
2554
|
---
|
|
@@ -2626,7 +2672,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2626
2672
|
| Prop | Type | Default | Description |
|
|
2627
2673
|
|------|------|---------|-------------|
|
|
2628
2674
|
| `open?` | `boolean` | — | |
|
|
2629
|
-
| `persistent?` | `boolean` | — |
|
|
2675
|
+
| `persistent?` | `boolean` | — | 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** |
|
|
2630
2676
|
| `state?` | `LoadingModalState` | `'loading'` | 상태 (loading: 스피너, error: 경고 아이콘) |
|
|
2631
2677
|
| `progress?` | `number` | — | 진행률 (0–100) — 지정 시 determinate 스피너 |
|
|
2632
2678
|
| `message?` | `string \| string[]` | — | 메시지 (없으면 state 기본값) |
|
|
@@ -2868,7 +2914,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
2868
2914
|
| `open?` | `boolean` | — | 표시 여부 (제어) |
|
|
2869
2915
|
| `ariaTitle?` | `string` | `'모달'` | 접근성 제목 (스크린리더용). 시각 제목은 children이 담당 |
|
|
2870
2916
|
| `showClose?` | `boolean` | `false` | 우측 상단 닫기 버튼 |
|
|
2871
|
-
| `persistent?` | `boolean` | `
|
|
2917
|
+
| `persistent?` | `boolean` | `true` | 백드롭 클릭·ESC로 닫히지 않고 흔들림(shake) 애니메이션 (sd-modal-container persistent). **기본값 true** — 모달은 작성 중인 내용을 잃지 않도록 임의 닫힘을 막는 것이 기본이다. 닫기 경로는 X 버튼과 모달 안의 버튼뿐이다. false로 주면 백드롭·ESC 닫기가 열린다. |
|
|
2872
2918
|
| `width?` | `number \| string` | — | 너비/높이 |
|
|
2873
2919
|
| `height?` | `number \| string` | — | |
|
|
2874
2920
|
| `children?` | `ReactNode` | — | |
|
|
@@ -2967,6 +3013,46 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
2967
3013
|
|
|
2968
3014
|
---
|
|
2969
3015
|
|
|
3016
|
+
# SOverlayHeader
|
|
3017
|
+
|
|
3018
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
3019
|
+
|
|
3020
|
+
### SOverlayHeader
|
|
3021
|
+
|
|
3022
|
+
#### Props
|
|
3023
|
+
|
|
3024
|
+
| Prop | Type | Default | Description |
|
|
3025
|
+
|------|------|---------|-------------|
|
|
3026
|
+
| `title?` | `ReactNode` | — | 시각 제목 |
|
|
3027
|
+
| `description?` | `ReactNode` | — | 제목 오른쪽 보조 설명 |
|
|
3028
|
+
| `showClose?` | `boolean` | `false` | 닫기 버튼 표시 |
|
|
3029
|
+
| `reserveCloseSpace?` | `boolean` | `false` | 외부 absolute 닫기 버튼 공간 확보 |
|
|
3030
|
+
| `className?` | `string` | — | |
|
|
3031
|
+
| `titleClassName?` | `string` | — | |
|
|
3032
|
+
| `descriptionClassName?` | `string` | — | |
|
|
3033
|
+
| `style?` | `CSSProperties` | — | |
|
|
3034
|
+
|
|
3035
|
+
#### Events
|
|
3036
|
+
|
|
3037
|
+
| Event | Type | Description |
|
|
3038
|
+
|-------|------|-------------|
|
|
3039
|
+
| `onClose` | `() => void` | 닫기 버튼 클릭 |
|
|
3040
|
+
|
|
3041
|
+
## Dependencies
|
|
3042
|
+
|
|
3043
|
+
### Used by
|
|
3044
|
+
|
|
3045
|
+
- [SActionModal](../SActionModal)
|
|
3046
|
+
- [SDrawer](../SDrawer)
|
|
3047
|
+
|
|
3048
|
+
### Depends on
|
|
3049
|
+
|
|
3050
|
+
- [SGhostButton](../SGhostButton)
|
|
3051
|
+
|
|
3052
|
+
### Graph
|
|
3053
|
+
|
|
3054
|
+
---
|
|
3055
|
+
|
|
2970
3056
|
# SPage
|
|
2971
3057
|
|
|
2972
3058
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
@@ -3102,7 +3188,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3102
3188
|
|
|
3103
3189
|
### Depends on
|
|
3104
3190
|
|
|
3105
|
-
- [
|
|
3191
|
+
- [SFooter](../SFooter)
|
|
3106
3192
|
|
|
3107
3193
|
### Graph
|
|
3108
3194
|
|
package/dist/llms.txt
CHANGED
|
@@ -405,6 +405,24 @@ SModal.create({ component: OrderModal, componentProps: { orderId } })
|
|
|
405
405
|
.onDismissed(() => {});
|
|
406
406
|
```
|
|
407
407
|
|
|
408
|
+
#### 3-3-5. 닫기 경로 — `persistent` 는 기본이 `true` 다
|
|
409
|
+
|
|
410
|
+
모달 3종(`SActionModal` · `SConfirmModal` · `SLoadingModal`)과 `SDrawer` 는 **백드롭 클릭·ESC 로 닫히지 않는 것이 기본**이다. 닫기 시도는 흔들림(shake)으로만 반응한다. 작성 중인 내용을 실수로 잃지 않게 하기 위한 것이다.
|
|
411
|
+
|
|
412
|
+
| | 기본 닫기 경로 | 백드롭·ESC |
|
|
413
|
+
| --- | --- | --- |
|
|
414
|
+
| `SActionModal` · `SConfirmModal` · `SLoadingModal` | X 버튼, 모달 안의 버튼 | 막힘 (흔들림) |
|
|
415
|
+
| `SDrawer` | X 버튼, footer 버튼 | 막힘 (흔들림) |
|
|
416
|
+
| `SPopover` · `STooltip` · `SSelect` 등 floating | 바깥 클릭·ESC | **막지 않는다** — 이 규칙의 대상이 아니다 |
|
|
417
|
+
|
|
418
|
+
따라서 다음을 지킨다.
|
|
419
|
+
|
|
420
|
+
- **닫을 수단을 반드시 하나는 둔다.** `SActionModal` 에 `showClose` 도 `button`/`footerLeft` 도 없으면 사용자가 모달을 닫을 방법이 없다. 백드롭이 더 이상 탈출구가 아니다.
|
|
421
|
+
- **`persistent` 를 `true` 로 직접 주지 않는다.** 기본값이므로 중복이다.
|
|
422
|
+
- **`persistent={false}` 는 잃을 입력이 없을 때만.** 단순 알림처럼 임의로 닫혀도 아무것도 사라지지 않는 경우로 한정한다.
|
|
423
|
+
|
|
424
|
+
작성 중인 내용이 있을 때 닫기를 시도하면 이탈 안내를 띄우는 것은 **소비 앱 몫**이다. 디자인 시스템은 dirty 상태를 알지 못하므로 백드롭·ESC 를 일괄 차단할 뿐이다. 안내가 필요하면 앱이 자체 dirty 판정 후 `SModal.confirm` 으로 띄운다.
|
|
425
|
+
|
|
408
426
|
### 3-4. 테이블 컬럼 정렬
|
|
409
427
|
|
|
410
428
|
**값의 크기를 비교하는 숫자 컬럼은 예외 없이 오른쪽 정렬한다** (`align: 'right'`).
|
package/dist/styles.css
CHANGED
|
@@ -809,6 +809,9 @@
|
|
|
809
809
|
.block {
|
|
810
810
|
display: block;
|
|
811
811
|
}
|
|
812
|
+
.contents {
|
|
813
|
+
display: contents;
|
|
814
|
+
}
|
|
812
815
|
.flex {
|
|
813
816
|
display: flex;
|
|
814
817
|
}
|
|
@@ -886,9 +889,6 @@
|
|
|
886
889
|
.h-\[50px\] {
|
|
887
890
|
height: 50px;
|
|
888
891
|
}
|
|
889
|
-
.h-\[52px\] {
|
|
890
|
-
height: 52px;
|
|
891
|
-
}
|
|
892
892
|
.h-\[56px\] {
|
|
893
893
|
height: 56px;
|
|
894
894
|
}
|
|
@@ -1039,6 +1039,9 @@
|
|
|
1039
1039
|
.w-\[4px\] {
|
|
1040
1040
|
width: 4px;
|
|
1041
1041
|
}
|
|
1042
|
+
.w-\[8px\] {
|
|
1043
|
+
width: 8px;
|
|
1044
|
+
}
|
|
1042
1045
|
.w-\[9px\] {
|
|
1043
1046
|
width: 9px;
|
|
1044
1047
|
}
|
|
@@ -1186,9 +1189,15 @@
|
|
|
1186
1189
|
.min-w-\[var\(--radix-dropdown-menu-trigger-width\)\] {
|
|
1187
1190
|
min-width: var(--radix-dropdown-menu-trigger-width);
|
|
1188
1191
|
}
|
|
1192
|
+
.min-w-px {
|
|
1193
|
+
min-width: 1px;
|
|
1194
|
+
}
|
|
1189
1195
|
.flex-1 {
|
|
1190
1196
|
flex: 1;
|
|
1191
1197
|
}
|
|
1198
|
+
.flex-\[1_0_0\] {
|
|
1199
|
+
flex: 1 0 0;
|
|
1200
|
+
}
|
|
1192
1201
|
.flex-auto {
|
|
1193
1202
|
flex: auto;
|
|
1194
1203
|
}
|
|
@@ -1285,6 +1294,9 @@
|
|
|
1285
1294
|
.cursor-text {
|
|
1286
1295
|
cursor: text;
|
|
1287
1296
|
}
|
|
1297
|
+
.touch-none {
|
|
1298
|
+
touch-action: none;
|
|
1299
|
+
}
|
|
1288
1300
|
.resize {
|
|
1289
1301
|
resize: both;
|
|
1290
1302
|
}
|
|
@@ -1495,8 +1507,8 @@
|
|
|
1495
1507
|
.gap-\[var\(--cmp-guide-contents-title-gap\)\] {
|
|
1496
1508
|
gap: var(--cmp-guide-contents-title-gap);
|
|
1497
1509
|
}
|
|
1498
|
-
.gap-\[var\(--cmp-modal-
|
|
1499
|
-
gap: var(--cmp-modal-
|
|
1510
|
+
.gap-\[var\(--cmp-modal-confirm-button-gap\)\] {
|
|
1511
|
+
gap: var(--cmp-modal-confirm-button-gap);
|
|
1500
1512
|
}
|
|
1501
1513
|
.gap-\[var\(--cmp-overlay-footer-gap\)\] {
|
|
1502
1514
|
gap: var(--cmp-overlay-footer-gap);
|
|
@@ -2108,6 +2120,9 @@
|
|
|
2108
2120
|
.bg-\[var\(--cmp-overlay-footer-bg-default\)\] {
|
|
2109
2121
|
background-color: var(--cmp-overlay-footer-bg-default);
|
|
2110
2122
|
}
|
|
2123
|
+
.bg-\[var\(--cmp-overlay-footer-bg-neutral\)\] {
|
|
2124
|
+
background-color: var(--cmp-overlay-footer-bg-neutral);
|
|
2125
|
+
}
|
|
2111
2126
|
.bg-\[var\(--cmp-overlay-header-bg\)\] {
|
|
2112
2127
|
background-color: var(--cmp-overlay-header-bg);
|
|
2113
2128
|
}
|
|
@@ -2354,15 +2369,9 @@
|
|
|
2354
2369
|
.px-\[var\(--cmp-modal-action-body-paddingX\)\] {
|
|
2355
2370
|
padding-inline: var(--cmp-modal-action-body-paddingX);
|
|
2356
2371
|
}
|
|
2357
|
-
.px-\[var\(--cmp-modal-action-footer-paddingX\)\] {
|
|
2358
|
-
padding-inline: var(--cmp-modal-action-footer-paddingX);
|
|
2359
|
-
}
|
|
2360
2372
|
.px-\[var\(--cmp-overlay-footer-paddingX\)\] {
|
|
2361
2373
|
padding-inline: var(--cmp-overlay-footer-paddingX);
|
|
2362
2374
|
}
|
|
2363
|
-
.px-\[var\(--cmp-overlay-header-paddingX\)\] {
|
|
2364
|
-
padding-inline: var(--cmp-overlay-header-paddingX);
|
|
2365
|
-
}
|
|
2366
2375
|
.px-\[var\(--cmp-pagination-paddingX\)\] {
|
|
2367
2376
|
padding-inline: var(--cmp-pagination-paddingX);
|
|
2368
2377
|
}
|
|
@@ -2450,9 +2459,6 @@
|
|
|
2450
2459
|
.py-\[var\(--cmp-datepicker-calendar-time-paddingY\)\] {
|
|
2451
2460
|
padding-block: var(--cmp-datepicker-calendar-time-paddingY);
|
|
2452
2461
|
}
|
|
2453
|
-
.py-\[var\(--cmp-modal-action-footer-paddingY\)\] {
|
|
2454
|
-
padding-block: var(--cmp-modal-action-footer-paddingY);
|
|
2455
|
-
}
|
|
2456
2462
|
.py-\[var\(--cmp-overlay-footer-paddingY\)\] {
|
|
2457
2463
|
padding-block: var(--cmp-overlay-footer-paddingY);
|
|
2458
2464
|
}
|
|
@@ -2501,6 +2507,9 @@
|
|
|
2501
2507
|
.pr-\[calc\(var\(--cmp-overlay-header-paddingX\)\+20px\)\] {
|
|
2502
2508
|
padding-right: calc(var(--cmp-overlay-header-paddingX) + 20px);
|
|
2503
2509
|
}
|
|
2510
|
+
.pr-\[var\(--cmp-overlay-header-paddingX\)\] {
|
|
2511
|
+
padding-right: var(--cmp-overlay-header-paddingX);
|
|
2512
|
+
}
|
|
2504
2513
|
.pb-\[var\(--cmp-modal-action-body-paddingBottom\)\] {
|
|
2505
2514
|
padding-bottom: var(--cmp-modal-action-body-paddingBottom);
|
|
2506
2515
|
}
|
|
@@ -2852,9 +2861,6 @@
|
|
|
2852
2861
|
.text-\[color\:var\(--cmp-modal-loading-message-color\)\] {
|
|
2853
2862
|
color: var(--cmp-modal-loading-message-color);
|
|
2854
2863
|
}
|
|
2855
|
-
.text-\[color\:var\(--cmp-overlay-header-title-color\)\] {
|
|
2856
|
-
color: var(--cmp-overlay-header-title-color);
|
|
2857
|
-
}
|
|
2858
2864
|
.text-\[color\:var\(--cmp-pagination-item-content-default\)\] {
|
|
2859
2865
|
color: var(--cmp-pagination-item-content-default);
|
|
2860
2866
|
}
|
|
@@ -3039,6 +3045,10 @@
|
|
|
3039
3045
|
--tw-shadow: var(--shadow-overlay);
|
|
3040
3046
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3041
3047
|
}
|
|
3048
|
+
.shadow-\[var\(--shadow-spread-md\)\] {
|
|
3049
|
+
--tw-shadow: var(--shadow-spread-md);
|
|
3050
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3051
|
+
}
|
|
3042
3052
|
.shadow-none {
|
|
3043
3053
|
--tw-shadow: 0 0 #0000;
|
|
3044
3054
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|