sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.40

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 (185) hide show
  1. package/AGENTS.md +642 -88
  2. package/README.md +111 -9
  3. package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
  4. package/dist/components/SAccountListBox/README.md +86 -0
  5. package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
  6. package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
  7. package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
  8. package/dist/components/SAccountListBox/index.d.ts +2 -0
  9. package/dist/components/SBadge/README.md +26 -0
  10. package/dist/components/SBadge/SBadge.d.ts +1 -1
  11. package/dist/components/SBarcodeInput/README.md +9 -1
  12. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
  13. package/dist/components/SButton/README.md +38 -0
  14. package/dist/components/SCalendar/README.md +13 -0
  15. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
  16. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
  17. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
  18. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
  19. package/dist/components/SCalendarBoard/README.md +137 -0
  20. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
  21. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
  22. package/dist/components/SCalendarBoard/index.d.ts +3 -0
  23. package/dist/components/SCalendarBoard/types.d.ts +31 -0
  24. package/dist/components/SCallout/README.md +16 -1
  25. package/dist/components/SCallout/SCallout.d.ts +9 -4
  26. package/dist/components/SCard/README.md +16 -0
  27. package/dist/components/SCard/SCard.d.ts +17 -2
  28. package/dist/components/SCheckbox/README.md +8 -0
  29. package/dist/components/SChipFilter/README.md +339 -14
  30. package/dist/components/SChipFilter/SChipFilter.d.ts +150 -60
  31. package/dist/components/SChipFilter/index.d.ts +1 -1
  32. package/dist/components/SChipInput/README.md +15 -1
  33. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  34. package/dist/components/SChipInput/index.d.ts +1 -1
  35. package/dist/components/SCircleProgress/README.md +8 -0
  36. package/dist/components/SConfirmModal/README.md +17 -1
  37. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  38. package/dist/components/SConfirmModal/index.d.ts +1 -1
  39. package/dist/components/SDatePicker/README.md +20 -2
  40. package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
  41. package/dist/components/SDateRangePicker/README.md +17 -2
  42. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  43. package/dist/components/SDivider/README.md +7 -0
  44. package/dist/components/SDivider/SDivider.d.ts +11 -0
  45. package/dist/components/SDraggableItem/README.md +37 -0
  46. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  47. package/dist/components/SDraggableItem/index.d.ts +1 -1
  48. package/dist/components/SDraggableList/README.md +30 -0
  49. package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
  50. package/dist/components/SDraggableList/index.d.ts +1 -1
  51. package/dist/components/SDrawer/README.md +8 -0
  52. package/dist/components/SDropdownButton/README.md +19 -0
  53. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  54. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  55. package/dist/components/SEditor/README.md +203 -0
  56. package/dist/components/SEditor/SEditor.d.ts +114 -0
  57. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  58. package/dist/components/SEditor/editor.config.d.ts +119 -0
  59. package/dist/components/SEditor/index.d.ts +8 -0
  60. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  61. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  62. package/dist/components/SExpansionItem/README.md +36 -0
  63. package/dist/components/SExpansionItem/index.d.ts +1 -1
  64. package/dist/components/SField/README.md +27 -3
  65. package/dist/components/SField/SField.d.ts +12 -6
  66. package/dist/components/SFilePicker/README.md +15 -1
  67. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  68. package/dist/components/SFooter/README.md +25 -0
  69. package/dist/components/SFooter/SFooter.d.ts +4 -3
  70. package/dist/components/SForm/README.md +11 -0
  71. package/dist/components/SGhostButton/README.md +22 -4
  72. package/dist/components/SGnb/README.md +51 -0
  73. package/dist/components/SGnb/SGnb.d.ts +50 -0
  74. package/dist/components/SGnb/gnb.config.d.ts +10 -3
  75. package/dist/components/SGnb/index.d.ts +1 -1
  76. package/dist/components/SGnbSystem/README.md +186 -0
  77. package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
  78. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
  79. package/dist/components/SGnbSystem/index.d.ts +2 -0
  80. package/dist/components/SGuide/README.md +15 -0
  81. package/dist/components/SIcon/README.md +10 -0
  82. package/dist/components/SIcon/SIcon.d.ts +1 -1
  83. package/dist/components/SIcon/icons.gen.d.ts +4 -0
  84. package/dist/components/SImage/README.md +14 -0
  85. package/dist/components/SInput/README.md +3 -1
  86. package/dist/components/SInput/SInput.d.ts +7 -1
  87. package/dist/components/SKeyValueTable/README.md +86 -0
  88. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
  89. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  90. package/dist/components/SLayout/README.md +21 -0
  91. package/dist/components/SLayout/SLayout.d.ts +4 -0
  92. package/dist/components/SLayout/index.d.ts +1 -1
  93. package/dist/components/SLinearProgress/README.md +15 -0
  94. package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
  95. package/dist/components/SLinearProgress/index.d.ts +1 -1
  96. package/dist/components/SList/README.md +5 -1
  97. package/dist/components/SList/SList.d.ts +0 -2
  98. package/dist/components/SListItem/README.md +41 -0
  99. package/dist/components/SListItem/index.d.ts +1 -1
  100. package/dist/components/SLoadingContainer/loading.d.ts +18 -2
  101. package/dist/components/SLoadingModal/README.md +9 -1
  102. package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
  103. package/dist/components/SLoadingModal/index.d.ts +1 -1
  104. package/dist/components/SNumberInput/README.md +9 -1
  105. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  106. package/dist/components/SPage/README.md +47 -4
  107. package/dist/components/SPage/SPage.d.ts +15 -10
  108. package/dist/components/SPage/SPageHeader.d.ts +18 -11
  109. package/dist/components/SPage/index.d.ts +1 -1
  110. package/dist/components/SPage/page-column.d.ts +25 -0
  111. package/dist/components/SPopover/README.md +15 -0
  112. package/dist/components/SPopup/README.md +19 -0
  113. package/dist/components/SPortal/README.md +18 -0
  114. package/dist/components/SRadio/README.md +20 -0
  115. package/dist/components/SRadioButton/README.md +18 -0
  116. package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
  117. package/dist/components/SRadioCard/README.md +78 -0
  118. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  119. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  120. package/dist/components/SRadioCard/index.d.ts +2 -0
  121. package/dist/components/SScrollArea/README.md +27 -0
  122. package/dist/components/SSearchInput/README.md +63 -0
  123. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  124. package/dist/components/SSearchInput/index.d.ts +1 -0
  125. package/dist/components/SSectionHeaderCard/README.md +37 -0
  126. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
  127. package/dist/components/SSelect/README.md +24 -6
  128. package/dist/components/SSelect/SSelect.d.ts +14 -2
  129. package/dist/components/SSplitter/README.md +15 -0
  130. package/dist/components/SStepper/README.md +26 -0
  131. package/dist/components/SSwitch/README.md +13 -0
  132. package/dist/components/SSystemActionButton/README.md +221 -0
  133. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -0
  134. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  135. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
  136. package/dist/components/STable/README.md +86 -1
  137. package/dist/components/STable/STable.d.ts +121 -11
  138. package/dist/components/STable/index.d.ts +1 -1
  139. package/dist/components/STabs/README.md +12 -1
  140. package/dist/components/STabs/STabs.d.ts +2 -4
  141. package/dist/components/STabs/index.d.ts +1 -1
  142. package/dist/components/STabs/tabs.config.d.ts +3 -4
  143. package/dist/components/STag/README.md +52 -0
  144. package/dist/components/STag/STag.d.ts +3 -1
  145. package/dist/components/STextLink/README.md +18 -0
  146. package/dist/components/STextLink/STextLink.d.ts +4 -0
  147. package/dist/components/STextarea/README.md +1 -1
  148. package/dist/components/STextarea/STextarea.d.ts +7 -1
  149. package/dist/components/STimePicker/README.md +15 -1
  150. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  151. package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
  152. package/dist/components/STimeRangePicker/README.md +27 -1
  153. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  154. package/dist/components/SToast/README.md +24 -0
  155. package/dist/components/SToggle/README.md +8 -0
  156. package/dist/components/SToggle/index.d.ts +1 -1
  157. package/dist/components/STooltip/README.md +24 -0
  158. package/dist/components/STree/README.md +41 -0
  159. package/dist/components/STree/STree.d.ts +8 -0
  160. package/dist/components/STree/index.d.ts +1 -1
  161. package/dist/docs/Gallery.d.ts +9 -0
  162. package/dist/docs/gallery-previews.d.ts +24 -0
  163. package/dist/index.cjs +10754 -5244
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/index.d.ts +8 -0
  166. package/dist/index.js +10718 -5244
  167. package/dist/index.js.map +1 -1
  168. package/dist/lib/doc-sections.d.ts +35 -0
  169. package/dist/lib/field-width.d.ts +31 -0
  170. package/dist/lib/floating-height.d.ts +15 -0
  171. package/dist/lib/story-docs.d.ts +19 -3
  172. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  173. package/dist/llms-full.txt +3263 -228
  174. package/dist/llms.txt +647 -90
  175. package/dist/playground/categories.d.ts +19 -0
  176. package/dist/styles.css +1725 -169
  177. package/dist/theme.css +216 -24
  178. package/eslint/index.mjs +14 -0
  179. package/eslint/lib/table-column.mjs +26 -0
  180. package/eslint/rules/divider-vertical-height.mjs +137 -0
  181. package/eslint/rules/field-width-grade.d.mts +41 -0
  182. package/eslint/rules/field-width-grade.mjs +311 -0
  183. package/eslint/rules/table-column-width.mjs +110 -0
  184. package/eslint/scale.gen.mjs +5 -2
  185. package/package.json +13 -1
@@ -1,10 +1,26 @@
1
1
  /** 오버레이 뷰포트 — 스토어를 구독해 SLoadingContainer 를 렌더한다. 직접 배치도 가능. */
2
2
  export declare function SLoadingViewport(): import("react").JSX.Element;
3
3
  export declare const loading: {
4
- /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */
4
+ /**
5
+ * 로딩 오버레이 표시. 겹쳐 부르면 그만큼 쌓이고 **마지막 하나가 걷힐 때** 닫힌다.
6
+ * 반환값은 이 호출 하나만 걷는 함수다(두 번 불러도 한 번만 걷힌다) — `hide()` 대신 이것을
7
+ * 쓰면 짝이 어긋나지 않는다.
8
+ *
9
+ * ⚠️ 메시지만 바꾸려면 `update()` 를 쓴다. `show()` 를 다시 부르면 하나 더 쌓여
10
+ * `hide()` 한 번으로는 닫히지 않는다.
11
+ */
5
12
  show(options?: {
6
13
  message?: string;
14
+ }): () => void;
15
+ /** 표시 중인 메시지 갱신 — 쌓인 수는 그대로다 */
16
+ update(options: {
17
+ message?: string;
7
18
  }): void;
8
- /** 로딩 오버레이 숨김 */
19
+ /** 가장 나중의 show 하나를 걷는다. 남은 것이 없을 때만 오버레이가 닫힌다 */
9
20
  hide(): void;
21
+ /**
22
+ * 쌓인 것을 모두 걷고 즉시 닫는다. 화면 전환·에러 복구처럼 진행 중이던 작업의 짝을 더는
23
+ * 맞출 수 없을 때만 쓴다 — 평소에는 `hide()` 나 `show()` 가 준 함수로 하나씩 걷는다.
24
+ */
25
+ hideAll(): void;
10
26
  };
@@ -10,7 +10,7 @@
10
10
  |------|------|---------|-------------|
11
11
  | `open?` | `boolean` | — | |
12
12
  | `persistent?` | `boolean` | — | 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** |
13
- | `state?` | `LoadingModalState` | `'loading'` | 상태 (loading: 스피너, error: 경고 아이콘) |
13
+ | `state?` | `SLoadingModalState` | `'loading'` | 상태 (loading: 스피너, error: 경고 아이콘) |
14
14
  | `progress?` | `number` | — | 진행률 (0–100) — 지정 시 determinate 스피너 |
15
15
  | `message?` | `string \| string[]` | — | 메시지 (없으면 state 기본값) |
16
16
  | `useButton?` | `boolean` | `false` | 하단 버튼 표시 |
@@ -26,6 +26,14 @@
26
26
  | `onClose` | `() => void` | 닫기(X) 버튼 클릭 (sdClose) — error 상태에서만 노출 |
27
27
  | `onButtonClick` | `() => void` | 버튼 클릭 (sdClick) |
28
28
 
29
+ ## Types
30
+
31
+ ### SLoadingModalState
32
+
33
+ ```ts
34
+ export type SLoadingModalState = 'loading' | 'error';
35
+ ```
36
+
29
37
  ## Dependencies
30
38
 
31
39
  ### Used by
@@ -1,4 +1,4 @@
1
- export type LoadingModalState = 'loading' | 'error';
1
+ export type SLoadingModalState = 'loading' | 'error';
2
2
  export interface SLoadingModalProps {
3
3
  open?: boolean;
4
4
  onOpenChange?: (open: boolean) => void;
@@ -7,7 +7,7 @@ export interface SLoadingModalProps {
7
7
  /** 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** */
8
8
  persistent?: boolean;
9
9
  /** 상태 (loading: 스피너, error: 경고 아이콘) */
10
- state?: LoadingModalState;
10
+ state?: SLoadingModalState;
11
11
  /** 진행률 (0–100) — 지정 시 determinate 스피너 */
12
12
  progress?: number;
13
13
  /** 메시지 (없으면 state 기본값) */
@@ -1 +1 @@
1
- export { SLoadingModal, type SLoadingModalProps } from './SLoadingModal';
1
+ export { SLoadingModal, type SLoadingModalProps, type SLoadingModalState } from './SLoadingModal';
@@ -40,7 +40,7 @@
40
40
  | `hint?` | `string` | — | |
41
41
  | `error?` | `boolean` | — | |
42
42
  | `errorMessage?` | `string` | — | |
43
- | `width?` | `number \| string` | — | |
43
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `max`(= 스키마 상한)로 고른다. 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다) |
44
44
  | `className?` | `string` | — | |
45
45
  | `style?` | `CSSProperties` | — | |
46
46
 
@@ -52,6 +52,14 @@
52
52
  | `onFocus` | `(e: React.FocusEvent<HTMLInputElement>) => void` | 포커스 이벤트 (sdFocus) |
53
53
  | `onBlur` | `(e: React.FocusEvent<HTMLInputElement>) => void` | 블러 이벤트 (sdBlur) |
54
54
 
55
+ ## Types
56
+
57
+ ### SNumberInputSize
58
+
59
+ ```ts
60
+ export type SNumberInputSize = SFieldSize;
61
+ ```
62
+
55
63
  ## Dependencies
56
64
 
57
65
  ### Used by
@@ -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 SNumberInputSize = SFieldSize;
8
9
  export interface SNumberInputProps {
9
10
  /** 입력 값 */
@@ -59,7 +60,12 @@ export interface SNumberInputProps {
59
60
  hint?: string;
60
61
  error?: boolean;
61
62
  errorMessage?: string;
62
- width?: number | string;
63
+ /**
64
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
65
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `max`(= 스키마 상한)로 고른다.
66
+ * 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다)
67
+ */
68
+ width?: SFieldWidth;
63
69
  className?: string;
64
70
  style?: CSSProperties;
65
71
  }
@@ -10,9 +10,9 @@
10
10
  |------|------|---------|-------------|
11
11
  | `title` | `string` | — | 타이틀 (필수) |
12
12
  | `subText?` | `string` | — | 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. |
13
- | `fix?` | `boolean` | `false` | true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경, 서브 텍스트가 타이틀 아래로 내려간다. |
13
+ | `fix?` | `boolean` | `false` | true: 높이 56 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 구분선 없음, 서브 텍스트가 타이틀 아래로 내려간다. 배경은 두 베리에이션 모두 흰 면이다. |
14
14
  | `slot?` | `ReactNode` | — | 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. |
15
- | `scrolled?` | `boolean` | `false` | `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다. fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건 scrolled 가 아니라 fix 다. |
15
+ | `scrolled?` | `boolean` | — | 아래 콘텐츠가 스크롤을 시작했는지. fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 흰 면 그대로다 — scrolled 가 더하는 것은 그림자뿐이다. `SLayout` 안에 놓았으면 **주지 않는다** — 같은 열의 `SPage` 가 자기 스크롤 상태를 올려 자동으로 들어온다. 스크롤 컨테이너를 앱이 직접 쥔 단독 배치에서만 `onScroll` 에서 준다. |
16
16
 
17
17
  #### Events
18
18
 
@@ -27,12 +27,54 @@
27
27
  | Prop | Type | Default | Description |
28
28
  |------|------|---------|-------------|
29
29
  | `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
30
- | `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
30
+ | `scrollEndSpacing?` | `boolean` | `false` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. **기본은 꺼져 있다.** 페이지 스크롤 자체가 예외이기 때문이다 — 대부분의 화면은 본문이 창을 꽉 채우고 스크롤은 각 영역 안에서 일어난다. 여백을 조건 없이 붙이면 내용이 화면에 거의 딱 맞는 페이지까지 그 여백 때문에 스크롤되게 만든다. 페이지가 실제로 스크롤되는 화면(`contentHeight="auto"` + 내용이 창보다 김)에서만 켠다. 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다. |
31
+ | `overlayScrollbar?` | `boolean` | `false` | true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
31
32
  | `contentHeight?` | `SPageContentHeight` | `'auto'` | 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다. `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로 `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />` 구성이 성립한다. `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다. |
32
- | `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
33
+
34
+ ## Types
35
+
36
+ ### SPageBackground
37
+
38
+ ```ts
39
+ export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
40
+ ```
41
+
42
+ ### SPageContentHeight
43
+
44
+ ```ts
45
+ export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
46
+ ```
47
+
48
+ ### PAGE_BACKGROUNDS
49
+
50
+ ```ts
51
+ /**
52
+ * 페이지 배경 — 표면의 역할로 이름을 붙인다(리터럴 색이 아니다).
53
+ * - frame: 콘텐츠를 얹는 흰 표면 (sys.color.bg.frame)
54
+ * - neutral: 한 단계 눌러앉은 회색 표면 (sys.color.bg.neutralLight)
55
+ * - screen: 카드·패널이 떠 있는 앱 바탕 (sys.color.bg.screen)
56
+ */
57
+ export const PAGE_BACKGROUNDS = ['frame', 'neutral', 'screen'] as const;
58
+ ```
59
+
60
+ ### PAGE_CONTENT_HEIGHTS
61
+
62
+ ```ts
63
+ /**
64
+ * 본문 높이 모드 — 페이지가 스크롤할지, 본문이 남은 높이를 채울지.
65
+ * - auto: 콘텐츠가 흐르고, 넘치면 페이지가 스크롤한다
66
+ * - fill: 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다.
67
+ * 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용.
68
+ */
69
+ export const PAGE_CONTENT_HEIGHTS = ['auto', 'fill'] as const;
70
+ ```
33
71
 
34
72
  ## Dependencies
35
73
 
74
+ ### Used by
75
+
76
+ - [SLayout](../SLayout)
77
+
36
78
  ### Depends on
37
79
 
38
80
  - [SGhostButton](../SGhostButton)
@@ -44,5 +86,6 @@
44
86
  graph TD;
45
87
  SPage --> SGhostButton
46
88
  SPage --> SLayout
89
+ SLayout --> SPage
47
90
  style SPage fill:#f9f,stroke:#333,stroke-width:4px
48
91
  ```
@@ -1,6 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
2
  import type { SPageBackground, SPageContentHeight } from './page.config';
3
- import { type SPageHeaderProps } from './SPageHeader';
4
3
  export interface SPageProps extends HTMLAttributes<HTMLElement> {
5
4
  /**
6
5
  * 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.
@@ -9,9 +8,20 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
9
8
  background?: SPageBackground;
10
9
  /**
11
10
  * 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다.
12
- * 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
11
+ *
12
+ * **기본은 꺼져 있다.** 페이지 스크롤 자체가 예외이기 때문이다 — 대부분의 화면은 본문이
13
+ * 창을 꽉 채우고 스크롤은 각 영역 안에서 일어난다. 여백을 조건 없이 붙이면 내용이 화면에
14
+ * 거의 딱 맞는 페이지까지 그 여백 때문에 스크롤되게 만든다.
15
+ *
16
+ * 페이지가 실제로 스크롤되는 화면(`contentHeight="auto"` + 내용이 창보다 김)에서만 켠다.
17
+ * 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다.
13
18
  */
14
19
  scrollEndSpacing?: boolean;
20
+ /**
21
+ * true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다.
22
+ * 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다.
23
+ */
24
+ overlayScrollbar?: boolean;
15
25
  /**
16
26
  * 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다.
17
27
  *
@@ -23,11 +33,6 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
23
33
  * `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다.
24
34
  */
25
35
  contentHeight?: SPageContentHeight;
26
- /**
27
- * 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다.
28
- * `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다.
29
- */
30
- header?: SPageHeaderProps;
31
36
  }
32
37
  /**
33
38
  * SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.
@@ -39,8 +44,8 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
39
44
  * - header="full": SLayout 이 깐 grid 의 "page" 영역 = 상단바 아래·메뉴 오른쪽 자리를 차지한다.
40
45
  * 좌표가 아니라 이름으로 잡으므로 프레임의 열·행 구성이 바뀌어도 여기는 그대로다.
41
46
  *
42
- * **`header` prop 을 주면** 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다(fix 베리에이션이
43
- * 늘 보이는 높이 56 바가 되도록). 주지 않으면 이전과 동일하게 동작한다 — ref·className·style·
44
- * 나머지 속성이 전부 스크롤 영역 자체(`<main>`)에 그대로 붙는다.
47
+ * **페이지 제목은 `SLayout` 안에서 앞에 놓은 `SPageHeader` 가 만든다.** 그때 SLayout 이 헤더와
48
+ * 이 페이지를 한 열로 묶으므로(page-column.tsx) 여기서는 자리를 잡지 않고, 대신 자기 스크롤
49
+ * 상태를 그 열에 올린다 — 헤더가 그 값으로 floating 그림자를 켠다.
45
50
  */
46
51
  export declare const SPage: import("react").ForwardRefExoticComponent<SPageProps & import("react").RefAttributes<HTMLElement>>;
@@ -5,9 +5,9 @@ export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slo
5
5
  /** 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. */
6
6
  subText?: string;
7
7
  /**
8
- * true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄.
9
- * false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경,
10
- * 서브 텍스트가 타이틀 아래로 내려간다.
8
+ * true: 높이 56 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄.
9
+ * false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 구분선 없음,
10
+ * 서브 텍스트가 타이틀 아래로 내려간다. 배경은 두 베리에이션 모두 흰 면이다.
11
11
  */
12
12
  fix?: boolean;
13
13
  /** 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. */
@@ -15,18 +15,25 @@ export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slo
15
15
  /** 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. */
16
16
  slot?: ReactNode;
17
17
  /**
18
- * `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다.
19
- * fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는
20
- * 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건
21
- * scrolled 가 아니라 fix 다.
22
- * @nodemo SPage 가 스크롤 이벤트로 넣어준다 — 사용자가 직접 시연할 값이 아니다.
18
+ * 아래 콘텐츠가 스크롤을 시작했는지. fix=false 일 때만 의미가 있다: 스크롤이 시작되면
19
+ * 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 흰 면 그대로다 —
20
+ * scrolled 가 더하는 것은 그림자뿐이다.
21
+ *
22
+ * `SLayout` 안에 놓았으면 **주지 않는다** — 같은 열의 `SPage` 가 자기 스크롤 상태를 올려
23
+ * 자동으로 들어온다. 스크롤 컨테이너를 앱이 직접 쥔 단독 배치에서만 `onScroll` 에서 준다.
23
24
  */
24
25
  scrolled?: boolean;
25
26
  }
26
27
  /**
27
- * SPage 위에 얹는 페이지 타이틀 영역(pageHeader 포팅). `SPage` 가 `header` prop 값으로
28
- * 내부적으로만 렌더한다 — 직접 임포트해 쓰지 않는다 (SPage.tsx 참고).
29
- * fix 로 bar(높이 고정·흰 배경) / plain(투명·최소 높이) 두 베리에이션을 고른다.
28
+ * 페이지 타이틀 영역(pageHeader 포팅).
29
+ * fix 로 bar(높이 고정·하단 구분선) / plain(최소 높이) 두 베리에이션을 고른다 — 배경은 둘 다 흰 면이다.
30
30
  * 뒤로가기 버튼은 onBack 유무로 나타나며, 없을 때는 타이틀 쪽에 4px 여백이 대신 들어간다.
31
+ *
32
+ * **셸 안에서는 `SLayout` 의 자식으로 `SGnb` 와 `SPage` 사이에 놓는다.** SLayout 이 이 헤더부터
33
+ * 뒤를 하나의 페이지 열로 묶어(page-column.tsx) 스크롤·페이지 패딩 밖 상단에 고정하고,
34
+ * plain 일 때 `SPage` 가 올린 스크롤 상태를 열이 대신 물려준다.
35
+ *
36
+ * 셸 밖에 직접 놓을 수도 있다 — 스크롤 컨테이너를 앱이 쥐고 있는 단독 화면이다. 그때는 그림자만
37
+ * 앱 몫이 된다: 스크롤 컨테이너의 `onScroll` 에서 `scrolled` 를 넣어야 뜬다.
31
38
  */
32
39
  export declare const SPageHeader: import("react").ForwardRefExoticComponent<SPageHeaderProps & import("react").RefAttributes<HTMLElement>>;
@@ -1,3 +1,3 @@
1
1
  export { SPage, type SPageProps } from './SPage';
2
2
  export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, } from './page.config';
3
- export { type SPageHeaderProps } from './SPageHeader';
3
+ export { SPageHeader, type SPageHeaderProps } from './SPageHeader';
@@ -0,0 +1,25 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * 페이지 열이 `SPageHeader` 와 `SPage` 사이에서 중개하는 것.
4
+ *
5
+ * 둘은 형제라 서로를 볼 수 없는데, 헤더의 그림자는 페이지의 스크롤에서 나온다.
6
+ * 열이 그 사이에 서서 값을 옮긴다 — 아래(SPage)가 올리고 위(SPageHeader)가 읽는다.
7
+ */
8
+ export interface SPageColumnValue {
9
+ /** 페이지가 스크롤을 시작했는지. `SPage` 가 올리고 `SPageHeader` 가 그림자로 쓴다. */
10
+ scrolled: boolean;
11
+ /** `SPage` 가 자기 스크롤 상태를 올린다. */
12
+ setScrolled: (scrolled: boolean) => void;
13
+ }
14
+ export declare const SPageColumnContext: import("react").Context<SPageColumnValue | null>;
15
+ /**
16
+ * 페이지 열 — `SLayout` 이 `SPageHeader` 자식을 보면 그 자식부터 뒤를 이 열로 묶는다.
17
+ * 헤더는 위에 고정되고(자기 shrink-0) 그 아래 `SPage` 가 남은 높이를 먹는다.
18
+ *
19
+ * 자리(그리드 area)는 프레임이 정한다. 열 자체는 배경을 칠하지 않는다 — 헤더도 `SPage` 도
20
+ * 자기 면을 스스로 칠하므로 열의 배경은 어디에서도 드러나지 않는다.
21
+ */
22
+ export declare function SPageColumn({ full, children }: {
23
+ full: boolean;
24
+ children: ReactNode;
25
+ }): import("react").JSX.Element;
@@ -33,6 +33,21 @@
33
33
  | `onLeftLinkClick` | `() => void` | 하단 좌측 링크 클릭 |
34
34
  | `onButtonClick` | `() => void` | 하단 우측 버튼 클릭 |
35
35
 
36
+ ## Types
37
+
38
+ ### SPopoverPlacement
39
+
40
+ ```ts
41
+ export type SPopoverPlacement = 'top' | 'bottom' | 'left' | 'right';
42
+ ```
43
+
44
+ ### SPopoverType
45
+
46
+ ```ts
47
+ /** 색상 타입 — default: 다크 배경 / danger·warning·accent: 라이트 배경 (component.popover 토큰) */
48
+ export type SPopoverType = 'default' | 'danger' | 'warning' | 'accent';
49
+ ```
50
+
36
51
  ## Dependencies
37
52
 
38
53
  ### Depends on
@@ -24,6 +24,25 @@
24
24
  |-------|------|-------------|
25
25
  | `onSubmit` | `() => void` | 확인 버튼 클릭 (sdSubmit) |
26
26
 
27
+ ## Types
28
+
29
+ ### SPopupType
30
+
31
+ ```ts
32
+ export type SPopupType = 'default' | 'light';
33
+ ```
34
+
35
+ ### SPopupSubmitButton
36
+
37
+ ```ts
38
+ export interface SPopupSubmitButton {
39
+ label?: string;
40
+ color?: SButtonColor;
41
+ outline?: boolean;
42
+ size?: SButtonSize;
43
+ }
44
+ ```
45
+
27
46
  ## Dependencies
28
47
 
29
48
  ### Depends on
@@ -34,18 +34,36 @@
34
34
  | `onCloseAutoFocus` | `(event: Event) => void` | 닫힐 때 포커스 복귀 처리 (기본은 Radix가 앵커로 포커스를 되돌림). e.preventDefault()로 막을 수 있다. |
35
35
  | `onPointerDownOutside` | `(event: Event) => void` | 바깥 영역 pointerdown 으로 닫힘이 시작될 때 (앵커 위 클릭·persistent 는 제외). |
36
36
 
37
+ ## Types
38
+
39
+ ### SPortalPlacement
40
+
41
+ ```ts
42
+ export type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';
43
+ ```
44
+
45
+ ### SPortalAlign
46
+
47
+ ```ts
48
+ export type SPortalAlign = 'start' | 'center' | 'end';
49
+ ```
50
+
37
51
  ## Dependencies
38
52
 
39
53
  ### Used by
40
54
 
55
+ - [SAccountListBox](../SAccountListBox)
41
56
  - [SChipInput](../SChipInput)
57
+ - [SGnbSystem](../SGnbSystem)
42
58
  - [SSelect](../SSelect)
43
59
 
44
60
  ### Graph
45
61
 
46
62
  ```mermaid
47
63
  graph TD;
64
+ SAccountListBox --> SPortal
48
65
  SChipInput --> SPortal
66
+ SGnbSystem --> SPortal
49
67
  SSelect --> SPortal
50
68
  style SPortal fill:#f9f,stroke:#333,stroke-width:4px
51
69
  ```
@@ -42,6 +42,26 @@
42
42
  |-------|------|-------------|
43
43
  | `onValueChange` | `(val: SRadioValue) => void` | 선택 변경 (sdUpdate) — 선택된 val 전달 |
44
44
 
45
+ ## Types
46
+
47
+ ### SRadioOption
48
+
49
+ ```ts
50
+ export interface SRadioOption {
51
+ /** 옵션 값 (sd-radio-group SRadioOption.value) */
52
+ value: SRadioValue;
53
+ label: string;
54
+ disabled?: boolean;
55
+ }
56
+ ```
57
+
58
+ ### SRadioValue
59
+
60
+ ```ts
61
+ /** 라디오 값 타입 (sd-radio SRadioValue) */
62
+ export type SRadioValue = string | number | boolean;
63
+ ```
64
+
45
65
  ## Dependencies
46
66
 
47
67
  ### Used by
@@ -22,6 +22,24 @@
22
22
  |-------|------|-------------|
23
23
  | `onValueChange` | `(value: string \| number) => void` | 변경 (sdUpdate) |
24
24
 
25
+ ## Types
26
+
27
+ ### SRadioButtonOption
28
+
29
+ ```ts
30
+ export interface SRadioButtonOption {
31
+ value: string | number;
32
+ label: string;
33
+ disabled?: boolean;
34
+ }
35
+ ```
36
+
37
+ ### SRadioButtonSize
38
+
39
+ ```ts
40
+ export type SRadioButtonSize = 'xs' | 'sm' | 'md';
41
+ ```
42
+
25
43
  ## Dependencies
26
44
 
27
45
  ### Used by
@@ -1,5 +1,5 @@
1
1
  import { type CSSProperties } from 'react';
2
- export type SRadioButtonSize = 'xs' | 'sm';
2
+ export type SRadioButtonSize = 'xs' | 'sm' | 'md';
3
3
  export interface SRadioButtonOption {
4
4
  value: string | number;
5
5
  label: string;
@@ -0,0 +1,78 @@
1
+ # SRadioCard
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SRadioCardGroup
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `options?` | `SRadioCardOption[]` | `[]` | 옵션 목록 |
12
+ | `value?` | `SRadioValue \| null` | — | 현재 선택 값 |
13
+ | `direction?` | `'vertical' \| 'horizontal'` | `'vertical'` | 배치 방향 |
14
+ | `disabled?` | `boolean` | `false` | 전체 비활성 |
15
+ | `groupName?` | `string` | — | 라디오 name 속성 (form-agnostic 그룹핑) |
16
+ | `className?` | `string` | — | |
17
+ | `style?` | `CSSProperties` | — | |
18
+
19
+ #### Events
20
+
21
+ | Event | Type | Description |
22
+ |-------|------|-------------|
23
+ | `onValueChange` | `(val: SRadioValue) => void` | 선택 변경 (sdUpdate) |
24
+
25
+ ### SRadioCard
26
+
27
+ #### Props
28
+
29
+ | Prop | Type | Default | Description |
30
+ |------|------|---------|-------------|
31
+ | `val` | `SRadioValue` | — | 이 카드의 값 |
32
+ | `value?` | `SRadioValue \| null` | — | 그룹의 현재 선택 값 |
33
+ | `label` | `string` | — | 라벨 (첫 줄) |
34
+ | `subtitle?` | `string` | — | 서브타이틀 (둘째 줄). 라벨 왼쪽 끝에 맞춰 들여쓴다 |
35
+ | `tag?` | `Omit<STagProps, 'size'>` | — | 라벨 오른쪽에 붙일 태그. `STag` 의 props 를 그대로 받되 크기는 `xs` 로 고정된다 |
36
+ | `disabled?` | `boolean` | `false` | 비활성 |
37
+ | `name?` | `string` | — | native radio name (form-agnostic 그룹핑) |
38
+ | `className?` | `string` | — | |
39
+ | `style?` | `CSSProperties` | — | |
40
+
41
+ #### Events
42
+
43
+ | Event | Type | Description |
44
+ |-------|------|-------------|
45
+ | `onValueChange` | `(val: SRadioValue) => void` | 선택 변경 (sdUpdate) — 선택된 val 전달 |
46
+
47
+ ## Types
48
+
49
+ ### SRadioCardOption
50
+
51
+ ```ts
52
+ export interface SRadioCardOption {
53
+ /** 옵션 값 */
54
+ value: SRadioValue;
55
+ /** 라벨 (첫 줄) */
56
+ label: string;
57
+ /** 서브타이틀 (둘째 줄) */
58
+ subtitle?: string;
59
+ /** 라벨 오른쪽에 붙일 태그 (`STag` props, 크기는 `xs` 고정) */
60
+ tag?: Omit<STagProps, 'size'>;
61
+ /** 이 옵션만 비활성 */
62
+ disabled?: boolean;
63
+ }
64
+ ```
65
+
66
+ ## Dependencies
67
+
68
+ ### Depends on
69
+
70
+ - [STag](../STag)
71
+
72
+ ### Graph
73
+
74
+ ```mermaid
75
+ graph TD;
76
+ SRadioCard --> STag
77
+ style SRadioCard fill:#f9f,stroke:#333,stroke-width:4px
78
+ ```
@@ -0,0 +1,29 @@
1
+ import { type CSSProperties } from 'react';
2
+ import { type SRadioValue } from '../SRadio';
3
+ import { type STagProps } from '../STag';
4
+ export interface SRadioCardProps {
5
+ /** 이 카드의 값 */
6
+ val: SRadioValue;
7
+ /** 그룹의 현재 선택 값 */
8
+ value?: SRadioValue | null;
9
+ /** 라벨 (첫 줄) */
10
+ label: string;
11
+ /** 서브타이틀 (둘째 줄). 라벨 왼쪽 끝에 맞춰 들여쓴다 */
12
+ subtitle?: string;
13
+ /** 라벨 오른쪽에 붙일 태그. `STag` 의 props 를 그대로 받되 크기는 `xs` 로 고정된다 */
14
+ tag?: Omit<STagProps, 'size'>;
15
+ /** 비활성 */
16
+ disabled?: boolean;
17
+ /** native radio name (form-agnostic 그룹핑) */
18
+ name?: string;
19
+ /** 선택 변경 (sdUpdate) — 선택된 val 전달 */
20
+ onValueChange?: (val: SRadioValue) => void;
21
+ className?: string;
22
+ style?: CSSProperties;
23
+ }
24
+ /**
25
+ * SRadioCard — 라디오 + 라벨 + 서브타이틀을 카드 한 장에 담은 선택지.
26
+ * 카드 전체가 클릭 영역이며 `value === val` 이면 선택 상태다.
27
+ * 선택지마다 설명이 붙어 한 줄짜리 `SRadio` 로는 담기 어려울 때 쓴다.
28
+ */
29
+ export declare function SRadioCard({ val, value, label, subtitle, tag, disabled, name, onValueChange, className, style, }: SRadioCardProps): import("react").JSX.Element;
@@ -0,0 +1,36 @@
1
+ import { type CSSProperties } from 'react';
2
+ import { type SRadioValue } from '../SRadio';
3
+ import { type STagProps } from '../STag';
4
+ export interface SRadioCardOption {
5
+ /** 옵션 값 */
6
+ value: SRadioValue;
7
+ /** 라벨 (첫 줄) */
8
+ label: string;
9
+ /** 서브타이틀 (둘째 줄) */
10
+ subtitle?: string;
11
+ /** 라벨 오른쪽에 붙일 태그 (`STag` props, 크기는 `xs` 고정) */
12
+ tag?: Omit<STagProps, 'size'>;
13
+ /** 이 옵션만 비활성 */
14
+ disabled?: boolean;
15
+ }
16
+ export interface SRadioCardGroupProps {
17
+ /** 옵션 목록 */
18
+ options?: SRadioCardOption[];
19
+ /** 현재 선택 값 */
20
+ value?: SRadioValue | null;
21
+ /** 배치 방향 */
22
+ direction?: 'vertical' | 'horizontal';
23
+ /** 전체 비활성 */
24
+ disabled?: boolean;
25
+ /** 라디오 name 속성 (form-agnostic 그룹핑) */
26
+ groupName?: string;
27
+ /** 선택 변경 (sdUpdate) */
28
+ onValueChange?: (val: SRadioValue) => void;
29
+ className?: string;
30
+ style?: CSSProperties;
31
+ }
32
+ /**
33
+ * SRadioCardGroup — `options` 를 SRadioCard 로 렌더하고 카드 사이 간격을 맞춘다.
34
+ * 카드는 컨테이너 폭을 채우므로 horizontal 이면 카드들이 폭을 균등하게 나눠 갖는다.
35
+ */
36
+ export declare function SRadioCardGroup({ options, value, direction, disabled, groupName, onValueChange, className, style, }: SRadioCardGroupProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { SRadioCard, type SRadioCardProps } from './SRadioCard';
2
+ export { SRadioCardGroup, type SRadioCardGroupProps, type SRadioCardOption, } from './SRadioCardGroup';