sellmate-design-system-react 9.0.0-beta.2 → 9.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/AGENTS.md +488 -90
  2. package/README.md +101 -0
  3. package/dist/components/SBadge/README.md +24 -0
  4. package/dist/components/SBadge/SBadge.d.ts +1 -1
  5. package/dist/components/SBarcodeInput/README.md +9 -1
  6. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
  7. package/dist/components/SButton/README.md +36 -0
  8. package/dist/components/SCalendar/README.md +13 -0
  9. package/dist/components/SCallout/README.md +15 -0
  10. package/dist/components/SCard/README.md +16 -0
  11. package/dist/components/SCard/SCard.d.ts +17 -2
  12. package/dist/components/SCheckbox/README.md +8 -0
  13. package/dist/components/SChipFilter/README.md +288 -5
  14. package/dist/components/SChipFilter/SChipFilter.d.ts +95 -40
  15. package/dist/components/SChipFilter/index.d.ts +1 -1
  16. package/dist/components/SChipInput/README.md +15 -1
  17. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  18. package/dist/components/SCircleProgress/README.md +8 -0
  19. package/dist/components/SConfirmModal/README.md +16 -0
  20. package/dist/components/SDatePicker/README.md +60 -4
  21. package/dist/components/SDatePicker/SDatePicker.d.ts +61 -5
  22. package/dist/components/SDatePicker/index.d.ts +1 -1
  23. package/dist/components/SDateRangePicker/README.md +17 -2
  24. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  25. package/dist/components/SDivider/README.md +4 -0
  26. package/dist/components/SDraggableItem/README.md +37 -0
  27. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  28. package/dist/components/SDraggableList/README.md +29 -0
  29. package/dist/components/SDraggableList/SDraggableList.d.ts +10 -0
  30. package/dist/components/SDraggableList/index.d.ts +1 -1
  31. package/dist/components/SDrawer/README.md +8 -0
  32. package/dist/components/SDropdownButton/README.md +19 -0
  33. package/dist/components/SEditor/EditorBody.d.ts +40 -0
  34. package/dist/components/SEditor/EditorToolbar.d.ts +87 -0
  35. package/dist/components/SEditor/README.md +230 -0
  36. package/dist/components/SEditor/SEditor.d.ts +124 -0
  37. package/dist/components/SEditor/editor-icons.d.ts +59 -0
  38. package/dist/components/SEditor/editor.config.d.ts +85 -0
  39. package/dist/components/SEditor/index.d.ts +2 -0
  40. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  41. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  42. package/dist/components/SExpansionItem/README.md +36 -0
  43. package/dist/components/SField/README.md +27 -2
  44. package/dist/components/SField/SField.d.ts +22 -4
  45. package/dist/components/SFilePicker/README.md +15 -1
  46. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  47. package/dist/components/SFooter/README.md +25 -0
  48. package/dist/components/SFooter/SFooter.d.ts +4 -3
  49. package/dist/components/SForm/README.md +11 -0
  50. package/dist/components/SGhostButton/README.md +20 -2
  51. package/dist/components/SGnb/README.md +45 -0
  52. package/dist/components/SGnb/gnb.config.d.ts +7 -0
  53. package/dist/components/SGuide/README.md +15 -0
  54. package/dist/components/SIcon/README.md +4 -0
  55. package/dist/components/SIcon/SIcon.d.ts +1 -1
  56. package/dist/components/SIcon/icons.gen.d.ts +2 -0
  57. package/dist/components/SImage/README.md +14 -0
  58. package/dist/components/SInput/README.md +3 -1
  59. package/dist/components/SInput/SInput.d.ts +7 -1
  60. package/dist/components/SKeyValueTable/README.md +87 -0
  61. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +14 -3
  62. package/dist/components/SLayout/README.md +16 -0
  63. package/dist/components/SLinearProgress/README.md +8 -0
  64. package/dist/components/SList/README.md +5 -1
  65. package/dist/components/SList/SList.d.ts +0 -2
  66. package/dist/components/SListItem/README.md +41 -0
  67. package/dist/components/SLoadingModal/README.md +8 -0
  68. package/dist/components/SNumberInput/README.md +9 -1
  69. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  70. package/dist/components/SPage/README.md +41 -1
  71. package/dist/components/SPage/SPage.d.ts +24 -2
  72. package/dist/components/SPage/index.d.ts +1 -1
  73. package/dist/components/SPage/page.config.d.ts +8 -0
  74. package/dist/components/SPopover/README.md +15 -0
  75. package/dist/components/SPopup/README.md +19 -0
  76. package/dist/components/SPortal/README.md +14 -0
  77. package/dist/components/SRadio/README.md +20 -0
  78. package/dist/components/SRadioButton/README.md +18 -0
  79. package/dist/components/SScrollArea/README.md +14 -0
  80. package/dist/components/SSearchInput/README.md +61 -0
  81. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  82. package/dist/components/SSearchInput/index.d.ts +1 -0
  83. package/dist/components/SSectionHeaderCard/README.md +44 -20
  84. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +31 -14
  85. package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
  86. package/dist/components/SSelect/README.md +23 -3
  87. package/dist/components/SSelect/SSelect.d.ts +13 -1
  88. package/dist/components/SSplitter/README.md +15 -0
  89. package/dist/components/SStepper/README.md +26 -0
  90. package/dist/components/SSwitch/README.md +13 -0
  91. package/dist/components/STable/README.md +72 -1
  92. package/dist/components/STable/STable.d.ts +129 -11
  93. package/dist/components/STable/index.d.ts +1 -1
  94. package/dist/components/STabs/README.md +12 -1
  95. package/dist/components/STabs/STabs.d.ts +2 -4
  96. package/dist/components/STabs/index.d.ts +1 -1
  97. package/dist/components/STabs/tabs.config.d.ts +3 -4
  98. package/dist/components/STag/README.md +47 -0
  99. package/dist/components/STextLink/README.md +17 -0
  100. package/dist/components/STextLink/STextLink.d.ts +2 -0
  101. package/dist/components/STextarea/README.md +1 -1
  102. package/dist/components/STextarea/STextarea.d.ts +7 -1
  103. package/dist/components/STimePicker/README.md +15 -1
  104. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  105. package/dist/components/STimePicker/timepicker.config.d.ts +7 -0
  106. package/dist/components/STimeRangePicker/README.md +27 -1
  107. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  108. package/dist/components/SToast/README.md +24 -0
  109. package/dist/components/SToggle/README.md +8 -0
  110. package/dist/components/STooltip/README.md +22 -0
  111. package/dist/components/STree/README.md +41 -0
  112. package/dist/components/STree/STree.d.ts +8 -0
  113. package/dist/components/STree/index.d.ts +1 -1
  114. package/dist/index.cjs +4266 -750
  115. package/dist/index.cjs.map +1 -1
  116. package/dist/index.d.ts +3 -0
  117. package/dist/index.js +4249 -750
  118. package/dist/index.js.map +1 -1
  119. package/dist/lib/field-width.d.ts +31 -0
  120. package/dist/lib/story-docs.d.ts +19 -3
  121. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  122. package/dist/llms-full.txt +2337 -183
  123. package/dist/llms.txt +490 -92
  124. package/dist/styles.css +684 -41
  125. package/dist/theme.css +22 -6
  126. package/eslint/index.mjs +10 -0
  127. package/eslint/lib/table-column.mjs +26 -0
  128. package/eslint/rules/field-width-grade.d.mts +41 -0
  129. package/eslint/rules/field-width-grade.mjs +311 -0
  130. package/eslint/rules/table-column-width.mjs +110 -0
  131. package/eslint/scale.gen.mjs +3 -0
  132. package/package.json +13 -1
package/README.md CHANGED
@@ -186,6 +186,8 @@ export default [
186
186
  | `sellmate/component-group-gap` | warn | 같은 컴포넌트를 나열할 때의 그룹 간격 — 배열 방향에 따라 값이 다르다(체크박스 가로 24 / 세로 8) |
187
187
  | `sellmate/table-numeric-align` | warn | 수량 컬럼(금액·수량 등)에 `align: 'right'` 누락 — **`--fix` 로 자동 교정** |
188
188
  | `sellmate/require-locale-number` | warn | 수량 컬럼의 `toLocaleString()` 누락 — 세 자리 콤마 |
189
+ | `sellmate/field-width-grade` | warn | 필드 폭이 `maxLength`(스키마 상한)와 어긋남 — 등급 미지정 · 등급 밖 폭 · 상한 대비 과부족 · 등급 px 직접 지정(**`--fix` 로 등급 이름 치환**) |
190
+ | `sellmate/table-column-width` | warn | 컬럼 폭 미지정(기본 120px 이 조용히 들어감) · px 아닌 폭(`%` `clamp()`) · 값을 그리는 열의 `autoWidth` 오용 |
189
191
  | `sellmate/no-arbitrary-class` | **off** | 토큰이 있는 속성(색·타이포·간격·모서리)의 임의 값 — `text-[14px]`, `bg-[#eee]`. 앱 고유 화면에는 정당한 사용이 많아 기본값은 끕니다 |
190
192
 
191
193
  `className` 뿐 아니라 `cn()`/`clsx()` 인자, 템플릿 리터럴, 객체 키 안까지 검사합니다.
@@ -237,6 +239,105 @@ export default [
237
239
  'sellmate/table-numeric-align': ['error', { allow: ['rank'] }],
238
240
  ```
239
241
 
242
+ ### 필드 폭 등급 (`field-width-grade`)
243
+
244
+ 필드 너비는 **`maxLength`(= 스키마 상한)로 정합니다.** 상한이 등급 안에 들어오면 그 등급으로 고정하고,
245
+ 등급 상한(`xl`)을 넘거나 상한이 아예 없으면 행 전체(`width="100%"` 또는 생략)로 둡니다.
246
+
247
+ **폭은 등급 이름으로 줍니다** — `width="md"` 처럼 씁니다. 등급은 `--cmp-field-width-*` 토큰으로
248
+ 풀리므로 토큰이 바뀌면 화면이 따라갑니다. 같은 값을 px 로 적으면 그 화면만 옛 값에 남습니다.
249
+
250
+ | 등급 | 쓰는 곳 |
251
+ | ---- | ------------- |
252
+ | `xs` | 숫자 필드 전용 |
253
+ | `sm` | |
254
+ | `md` | |
255
+ | `lg` | |
256
+ | `xl` | 정책상 상한 |
257
+
258
+ ```tsx
259
+ // 상한이 등급 안에 들어온다 → 그 등급으로 고정
260
+ <SInput name="code" label="코드" maxLength={10} width="md" />
261
+
262
+ // 상한이 xl 로도 안 담긴다 → 행 전체
263
+ <SInput name="desc" label="설명" maxLength={100} width="100%" />
264
+
265
+ // 숫자 필드의 상한은 maxLength 가 아니라 max 다 (천단위 콤마도 폭을 먹는다)
266
+ <SNumberInput name="qty" label="수량" max={99} width="xs" />
267
+
268
+ // 등급 값과 같은 px 를 적으면 등급 이름으로 자동 수정됩니다 (--fix)
269
+ <SInput name="code" label="코드" maxLength={10} width={160} /> // → width="md"
270
+ ```
271
+
272
+ 대상은 `SInput` · `SNumberInput` · `SBarcodeInput` 입니다. `STextarea` 는 여러 줄로 접혀 상한이 폭을
273
+ 정하지 않고, 셀렉트 계열은 상한 개념이 없어 목록 최장값으로 폭을 정하며, 날짜·시간 계열은 컴포넌트가
274
+ 자체 상한을 갖습니다.
275
+
276
+ **상한도 폭도 변수로 넘기면 검사하지 않습니다.** 정적으로 알 수 없는 것을 위반으로 보고하지 않습니다.
277
+
278
+ ```tsx
279
+ <SInput maxLength={LIMIT} width={fieldWidth} /> // 통과
280
+ <SInput maxLength={10} {...rest} /> // 통과 (spread 안에 width 가 있을 수 있다)
281
+ ```
282
+
283
+ #### 글자수 환산
284
+
285
+ 등급이 몇 글자를 담는지는 토큰 값(글꼴 크기 · 좌우 패딩 · 테두리 · 스테퍼)에서 계산합니다.
286
+ 한글은 전각이라 영숫자의 약 두 배를 먹으므로 **두 기준 사이에는 아무것도 보고하지 않습니다** —
287
+ 영숫자로 채워도 넘칠 때만 "좁다", 한글로 채워도 남을 때만 "넓다" 로 판정합니다.
288
+
289
+ | 등급 | `SInput` (sm) | `SInput` (md) | `SNumberInput` (sm) | `SNumberInput` (sm, `useButton`) |
290
+ | ---- | ------------- | ------------- | ------------------- | -------------------------------- |
291
+ | `xs` | — | — | 영숫자 8 | 영숫자 2 |
292
+ | `sm` | 영숫자 14 / 한글 7 | 영숫자 11 / 한글 6 | 영숫자 14 | 영숫자 8 |
293
+ | `md` | 영숫자 20 / 한글 11 | 영숫자 16 / 한글 9 | 영숫자 20 | 영숫자 14 |
294
+ | `lg` | 영숫자 32 / 한글 17 | 영숫자 26 / 한글 14 | 영숫자 32 | 영숫자 26 |
295
+ | `xl` | 영숫자 68 / 한글 37 | 영숫자 57 / 한글 31 | 영숫자 68 | 영숫자 62 |
296
+
297
+ `SNumberInput` 은 `useButton` 여부로 글자 자리가 크게 갈립니다 — 스테퍼가 없으면 좌우 패딩이
298
+ 두 배가 되고(기본값), 있으면 버튼 두 개와 간격이 폭을 먹습니다. 규칙은 JSX 의 `useButton` 을 읽어
299
+ 둘을 구분합니다.
300
+
301
+ 등급 폭은 `--cmp-field-width-*` 토큰에서 읽으므로 규칙과 컴포넌트가 같은 값을 봅니다.
302
+ 글자수 환산 비율이 팀 기준과 다르면 옵션으로 덮습니다(등급 폭도 덮을 수 있지만, 토큰과 어긋나게 됩니다).
303
+
304
+ ```js
305
+ 'sellmate/field-width-grade': ['warn', {
306
+ charRatio: { narrow: 0.55, wide: 1 },
307
+ }],
308
+ ```
309
+
310
+ ### 컬럼 폭 (`table-column-width`)
311
+
312
+ `STable` 의 컬럼 폭은 `<colgroup>` 의 `<col width>` 로 들어가고 테이블이 `table-fixed` 라,
313
+ **px 이 아닌 값은 에러 없이 화면만 틀어집니다** — `'30%'` 는 `30`(px)으로 읽히고, `clamp()` 같은
314
+ 함수형 값은 폭이 통째로 무효가 된 뒤 auto 로 떨어집니다.
315
+
316
+ ```tsx
317
+ // 내용이 들어가는 열은 전부 폭을 명시한다 (생략하면 기본 120px 이 조용히 들어간다)
318
+ { name: 'name', label: '이름', field: 'name', width: 160 }
319
+ { name: 'code', label: '코드', field: 'code', width: '120px' }
320
+
321
+ // autoWidth 는 남은 폭을 흡수하는 스페이서 열 하나에만 (값을 그리지 않으므로 field 도 없다)
322
+ { name: 'spacer', label: '', autoWidth: true }
323
+
324
+ // ❌ 조용히 깨진다
325
+ { name: 'ratio', label: '비율', field: 'ratio', width: '30%' }
326
+ // ❌ 값을 그리는 열의 autoWidth — 폭이 다른 열에 좌우돼 화면마다 달라진다
327
+ { name: 'title', label: '상품명', field: 'title', autoWidth: true, render: r => r.title }
328
+ ```
329
+
330
+ 검사 대상은 `name`(문자열 리터럴) · `label` 에 더해 **`field` 또는 `autoWidth` 를 가진 객체**입니다.
331
+ 검색 필터 필드나 상세 모달의 키-값 필드가 컬럼과 같은 `{ name, label, ... }` 모양이라, 그 둘만으로
332
+ 판정하면 표와 무관한 객체가 대부분 걸리기 때문입니다. 대신 `{ ...base, name, label }` 처럼 `field` 가
333
+ 스프레드로 들어오는 컬럼은 보고하지 않습니다 — 정적으로 필터 필드와 구분되지 않습니다.
334
+
335
+ 예외는 컬럼 `name` 을 `allow` 로 지정해 뺍니다.
336
+
337
+ ```js
338
+ 'sellmate/table-column-width': ['warn', { allow: ['spacer'] }],
339
+ ```
340
+
240
341
  ### 더 엄격하게 / 더 느슨하게
241
342
 
242
343
  `configs.strict` 는 전 규칙을 error 로 올리고, `<ul>` `<ol>` `<li>` `<svg>` `<label>` 까지 검사하며, 간격 유틸리티에 `sd-` 접두를 강제합니다(`requirePrefix`). 디자인 시스템 규칙을 처음부터 전면 적용하는 신규 프로젝트용입니다.
@@ -10,6 +10,30 @@
10
10
  |------|------|---------|-------------|
11
11
  | `color?` | `SBadgeColor` | `'blue'` | 뱃지 색상 |
12
12
 
13
+ ## Types
14
+
15
+ ### SBadgeColor
16
+
17
+ ```ts
18
+ export type SBadgeColor = (typeof BADGE_COLORS)[number];
19
+ ```
20
+
21
+ ### BADGE_COLORS
22
+
23
+ ```ts
24
+ export const BADGE_COLORS = [
25
+ 'red',
26
+ 'orange',
27
+ 'yellow',
28
+ 'green',
29
+ 'lightblue',
30
+ 'blue',
31
+ 'darkblue',
32
+ 'indigo',
33
+ 'grey',
34
+ ] as const;
35
+ ```
36
+
13
37
  ## Dependencies
14
38
 
15
39
  ### Used by
@@ -1,5 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
- export declare const BADGE_COLORS: readonly ["red", "orange", "yellow", "green", "blue", "darkblue", "indigo", "grey"];
2
+ export declare const BADGE_COLORS: readonly ["red", "orange", "yellow", "green", "lightblue", "blue", "darkblue", "indigo", "grey"];
3
3
  export type SBadgeColor = (typeof BADGE_COLORS)[number];
4
4
  export interface SBadgeProps extends HTMLAttributes<HTMLSpanElement> {
5
5
  /** 뱃지 색상 */
@@ -35,7 +35,7 @@
35
35
  | `hint?` | `string` | — | |
36
36
  | `error?` | `boolean` | — | |
37
37
  | `errorMessage?` | `string` | — | |
38
- | `width?` | `number \| string` | — | |
38
+ | `width?` | `SFieldWidth` | | 컨트롤 너비 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `maxLength`(= 스키마 상한)로 고른다. 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다) |
39
39
  | `className?` | `string` | — | |
40
40
  | `style?` | `CSSProperties` | — | |
41
41
 
@@ -47,6 +47,14 @@
47
47
  | `onFocus` | `() => void` | |
48
48
  | `onBlur` | `() => void` | |
49
49
 
50
+ ## Types
51
+
52
+ ### SBarcodeInputSize
53
+
54
+ ```ts
55
+ export type SBarcodeInputSize = SFieldSize;
56
+ ```
57
+
50
58
  ## Dependencies
51
59
 
52
60
  ### Depends on
@@ -4,6 +4,7 @@ import { type SIconName } from '../SIcon';
4
4
  import { type SColor } from '../../lib/color';
5
5
  import { type Rule } from '../../lib/form';
6
6
  import { type STooltipProps } from '../STooltip';
7
+ import { type SFieldWidth } from '../../lib/field-width';
7
8
  export type SBarcodeInputSize = SFieldSize;
8
9
  export interface SBarcodeInputProps {
9
10
  value?: string | number | null;
@@ -39,7 +40,12 @@ export interface SBarcodeInputProps {
39
40
  hint?: string;
40
41
  error?: boolean;
41
42
  errorMessage?: string;
42
- width?: number | string;
43
+ /**
44
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
45
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `maxLength`(= 스키마 상한)로 고른다.
46
+ * 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다)
47
+ */
48
+ width?: SFieldWidth;
43
49
  className?: string;
44
50
  style?: CSSProperties;
45
51
  }
@@ -15,12 +15,47 @@
15
15
  | `rightIcon?` | `SIconName` | — | 레이블 오른쪽 아이콘 |
16
16
  | `label?` | `string` | — | 버튼 텍스트 (문자열만 — 아이콘은 icon/rightIcon 사용) |
17
17
 
18
+ ## Types
19
+
20
+ ### SButtonColor
21
+
22
+ ```ts
23
+ export type SButtonColor = (typeof BUTTON_COLORS)[number];
24
+ ```
25
+
26
+ ### SButtonSize
27
+
28
+ ```ts
29
+ export type SButtonSize = (typeof BUTTON_SIZES)[number];
30
+ ```
31
+
32
+ ### BUTTON_COLORS
33
+
34
+ ```ts
35
+ /**
36
+ * SButton 색상/사이즈 설정 — sd-button(component.button 토큰) 충실 포팅.
37
+ * Stencil `name`(예: primary_sm)의 preset을 color + outline(boolean) + size 로 분리.
38
+ * - primary / danger : solid·outline 모두 지원
39
+ * - secondary : solid 전용 (outline 스타일 없음 → outline 무시)
40
+ * - neutral : 흰 배경 고정, outline 은 회색 테두리만 추가(solid = 테두리 없는 흰 버튼)
41
+ * 색상은 theme.css의 `--cmp-button-*` CSS 변수를 참조한다.
42
+ */
43
+ export const BUTTON_COLORS = ['primary', 'secondary', 'neutral', 'danger'] as const;
44
+ ```
45
+
46
+ ### BUTTON_SIZES
47
+
48
+ ```ts
49
+ export const BUTTON_SIZES = ['xs', 'sm', 'md', 'lg'] as const;
50
+ ```
51
+
18
52
  ## Dependencies
19
53
 
20
54
  ### Used by
21
55
 
22
56
  - [SConfirmModal](../SConfirmModal)
23
57
  - [SDropdownButton](../SDropdownButton)
58
+ - [SEditor](../SEditor)
24
59
  - [SFooter](../SFooter)
25
60
  - [SKeyValueTable](../SKeyValueTable)
26
61
  - [SLoadingModal](../SLoadingModal)
@@ -38,6 +73,7 @@ graph TD;
38
73
  SButton --> SIcon
39
74
  SConfirmModal --> SButton
40
75
  SDropdownButton --> SButton
76
+ SEditor --> SButton
41
77
  SFooter --> SButton
42
78
  SKeyValueTable --> SButton
43
79
  SLoadingModal --> SButton
@@ -22,6 +22,19 @@
22
22
  | `onValueChange` | `(date: string) => void` | 선택 변경 (sdUpdate) |
23
23
  | `onViewChange` | `(v: { year: number; month: number }) => void` | 보이는 연·월 변경 (sdViewChange) |
24
24
 
25
+ ## Types
26
+
27
+ ### SCalendarEventGroup
28
+
29
+ ```ts
30
+ export interface SCalendarEventGroup {
31
+ /** 도트 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
32
+ color: SColor;
33
+ label: string;
34
+ dates: string[];
35
+ }
36
+ ```
37
+
25
38
  ## Dependencies
26
39
 
27
40
  ### Used by
@@ -14,6 +14,21 @@
14
14
  | `className?` | `string` | — | |
15
15
  | `style?` | `CSSProperties` | — | |
16
16
 
17
+ ## Types
18
+
19
+ ### SCalloutType
20
+
21
+ ```ts
22
+ export type SCalloutType = 'default' | 'danger';
23
+ ```
24
+
25
+ ### SCalloutMessage
26
+
27
+ ```ts
28
+ /** 중첩 메시지: 문자열 또는 (한 단계 더 들어간) 문자열 배열 */
29
+ export type SCalloutMessage = string | SCalloutMessage[];
30
+ ```
31
+
17
32
  ## Dependencies
18
33
 
19
34
  ### Depends on
@@ -9,4 +9,20 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `bordered?` | `boolean` | `false` | 테두리 표시 여부 |
12
+ | `footerLeft?` | `ReactNode` | — | 하단 액션 영역 좌측 슬롯. 보조 버튼(취소·목록 등)이 오는 자리다. `footerLeft` 또는 `button` 중 하나라도 있으면 하단 액션 영역이 렌더된다. |
13
+ | `button?` | `SFooterButton` | — | 하단 액션 영역 우측 주 액션 버튼 |
14
+ | `footerClassName?` | `string` | — | 하단 액션 영역 클래스 |
12
15
 
16
+ ## Dependencies
17
+
18
+ ### Depends on
19
+
20
+ - [SFooter](../SFooter)
21
+
22
+ ### Graph
23
+
24
+ ```mermaid
25
+ graph TD;
26
+ SCard --> SFooter
27
+ style SCard fill:#f9f,stroke:#333,stroke-width:4px
28
+ ```
@@ -1,7 +1,22 @@
1
- import { type HTMLAttributes } from 'react';
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type SFooterButton } from '../SFooter';
2
3
  export interface SCardProps extends HTMLAttributes<HTMLDivElement> {
3
4
  /** 테두리 표시 여부 */
4
5
  bordered?: boolean;
6
+ /**
7
+ * 하단 액션 영역 좌측 슬롯. 보조 버튼(취소·목록 등)이 오는 자리다.
8
+ * `footerLeft` 또는 `button` 중 하나라도 있으면 하단 액션 영역이 렌더된다.
9
+ */
10
+ footerLeft?: ReactNode;
11
+ /** 하단 액션 영역 우측 주 액션 버튼 */
12
+ button?: SFooterButton;
13
+ /** 하단 액션 영역 클래스 */
14
+ footerClassName?: string;
5
15
  }
6
- /** SCard — sd-card 포팅. 라운드 8px, 흰 배경, 옵션 테두리. */
16
+ /**
17
+ * SCard — sd-card 포팅. 라운드 8px, 흰 배경, 옵션 테두리. 콘텐츠는 라운드 경계에서 잘린다.
18
+ *
19
+ * 하단 액션은 `children` 에 직접 두지 않고 `footerLeft`·`button` 으로 넘긴다 — 배경·구분선·여백과
20
+ * 양끝 분리가 컴포넌트 규칙대로 잡히는 자리다.
21
+ */
7
22
  export declare const SCard: import("react").ForwardRefExoticComponent<SCardProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -22,6 +22,14 @@
22
22
  |-------|------|-------------|
23
23
  | `onValueChange` | `(value: boolean \| unknown[]) => void` | 값 변경 (sdUpdate) |
24
24
 
25
+ ## Types
26
+
27
+ ### SCheckboxValue
28
+
29
+ ```ts
30
+ export type SCheckboxValue = boolean | unknown[] | null;
31
+ ```
32
+
25
33
  ## Dependencies
26
34
 
27
35
  ### Used by