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
@@ -11,7 +11,6 @@
11
11
  | `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
12
12
  | `useGap?` | `boolean` | `false` | 리스트 아이템 사이 gap 토큰 적용 여부 |
13
13
  | `usePadding?` | `boolean` | `false` | 리스트 컨테이너 padding 토큰 적용 여부 |
14
- | `separator?` | `boolean` | `false` | 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 |
15
14
 
16
15
  ## Dependencies
17
16
 
@@ -20,10 +19,15 @@
20
19
  - [SDraggableList](../SDraggableList)
21
20
  - [SExpansionList](../SExpansionList)
22
21
 
22
+ ### Depends on
23
+
24
+ - [SDivider](../SDivider)
25
+
23
26
  ### Graph
24
27
 
25
28
  ```mermaid
26
29
  graph TD;
30
+ SList --> SDivider
27
31
  SDraggableList --> SList
28
32
  SExpansionList --> SList
29
33
  style SList fill:#f9f,stroke:#333,stroke-width:4px
@@ -6,7 +6,5 @@ export interface SListProps extends HTMLAttributes<HTMLDivElement> {
6
6
  useGap?: boolean;
7
7
  /** 리스트 컨테이너 padding 토큰 적용 여부 */
8
8
  usePadding?: boolean;
9
- /** 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 */
10
- separator?: boolean;
11
9
  }
12
10
  export declare const SList: import("react").ForwardRefExoticComponent<SListProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -23,6 +23,47 @@
23
23
  | `size?` | `SListItemSize` | `'sm'` | 타이포그래피 크기 |
24
24
  | `disabled?` | `boolean` | `false` | 비활성 상태 여부 |
25
25
 
26
+ ## Types
27
+
28
+ ### SListItemSlot
29
+
30
+ ```ts
31
+ export type SListItemSlot = ReactNode | SListItemRenderProp;
32
+ ```
33
+
34
+ ### SListItemSupportingTextPosition
35
+
36
+ ```ts
37
+ export type SListItemSupportingTextPosition = 'right' | 'bottom';
38
+ ```
39
+
40
+ ### SListItemInteraction
41
+
42
+ ```ts
43
+ export type SListItemInteraction = 'chevron';
44
+ ```
45
+
46
+ ### SListItemSize
47
+
48
+ ```ts
49
+ export type SListItemSize = 'sm' | 'md';
50
+ ```
51
+
52
+ ### SListItemRenderProp
53
+
54
+ ```ts
55
+ export type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;
56
+ ```
57
+
58
+ ### SListItemRenderState
59
+
60
+ ```ts
61
+ export interface SListItemRenderState {
62
+ hovered: boolean;
63
+ disabled: boolean;
64
+ }
65
+ ```
66
+
26
67
  ## Dependencies
27
68
 
28
69
  ### Used by
@@ -26,6 +26,14 @@
26
26
  | `onClose` | `() => void` | 닫기(X) 버튼 클릭 (sdClose) — error 상태에서만 노출 |
27
27
  | `onButtonClick` | `() => void` | 버튼 클릭 (sdClick) |
28
28
 
29
+ ## Types
30
+
31
+ ### LoadingModalState
32
+
33
+ ```ts
34
+ export type LoadingModalState = 'loading' | 'error';
35
+ ```
36
+
29
37
  ## Dependencies
30
38
 
31
39
  ### Used by
@@ -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
  }
@@ -27,9 +27,49 @@
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 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
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` 이 무시된다. |
31
33
  | `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
32
34
 
35
+ ## Types
36
+
37
+ ### SPageBackground
38
+
39
+ ```ts
40
+ export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
41
+ ```
42
+
43
+ ### SPageContentHeight
44
+
45
+ ```ts
46
+ export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
47
+ ```
48
+
49
+ ### PAGE_BACKGROUNDS
50
+
51
+ ```ts
52
+ /**
53
+ * 페이지 배경 — 표면의 역할로 이름을 붙인다(리터럴 색이 아니다).
54
+ * - frame: 콘텐츠를 얹는 흰 표면 (sys.color.bg.frame)
55
+ * - neutral: 한 단계 눌러앉은 회색 표면 (sys.color.bg.neutralLight)
56
+ * - screen: 카드·패널이 떠 있는 앱 바탕 (sys.color.bg.screen)
57
+ */
58
+ export const PAGE_BACKGROUNDS = ['frame', 'neutral', 'screen'] as const;
59
+ ```
60
+
61
+ ### PAGE_CONTENT_HEIGHTS
62
+
63
+ ```ts
64
+ /**
65
+ * 본문 높이 모드 — 페이지가 스크롤할지, 본문이 남은 높이를 채울지.
66
+ * - auto: 콘텐츠가 흐르고, 넘치면 페이지가 스크롤한다
67
+ * - fill: 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다.
68
+ * 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용.
69
+ */
70
+ export const PAGE_CONTENT_HEIGHTS = ['auto', 'fill'] as const;
71
+ ```
72
+
33
73
  ## Dependencies
34
74
 
35
75
  ### Depends on
@@ -1,5 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
- import type { SPageBackground } from './page.config';
2
+ import type { SPageBackground, SPageContentHeight } from './page.config';
3
3
  import { type SPageHeaderProps } from './SPageHeader';
4
4
  export interface SPageProps extends HTMLAttributes<HTMLElement> {
5
5
  /**
@@ -9,9 +9,31 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
9
9
  background?: SPageBackground;
10
10
  /**
11
11
  * 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다.
12
- * 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
12
+ *
13
+ * **기본은 꺼져 있다.** 페이지 스크롤 자체가 예외이기 때문이다 — 대부분의 화면은 본문이
14
+ * 창을 꽉 채우고 스크롤은 각 영역 안에서 일어난다. 여백을 조건 없이 붙이면 내용이 화면에
15
+ * 거의 딱 맞는 페이지까지 그 여백 때문에 스크롤되게 만든다.
16
+ *
17
+ * 페이지가 실제로 스크롤되는 화면(`contentHeight="auto"` + 내용이 창보다 김)에서만 켠다.
18
+ * 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다.
13
19
  */
14
20
  scrollEndSpacing?: boolean;
21
+ /**
22
+ * true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다.
23
+ * 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다.
24
+ */
25
+ overlayScrollbar?: boolean;
26
+ /**
27
+ * 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다.
28
+ *
29
+ * `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서
30
+ * 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로
31
+ * `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />`
32
+ * 구성이 성립한다.
33
+ *
34
+ * `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다.
35
+ */
36
+ contentHeight?: SPageContentHeight;
15
37
  /**
16
38
  * 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다.
17
39
  * `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다.
@@ -1,3 +1,3 @@
1
1
  export { SPage, type SPageProps } from './SPage';
2
- export { PAGE_BACKGROUNDS, type SPageBackground } from './page.config';
2
+ export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, } from './page.config';
3
3
  export { type SPageHeaderProps } from './SPageHeader';
@@ -6,3 +6,11 @@
6
6
  */
7
7
  export declare const PAGE_BACKGROUNDS: readonly ["frame", "neutral", "screen"];
8
8
  export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
9
+ /**
10
+ * 본문 높이 모드 — 페이지가 스크롤할지, 본문이 남은 높이를 채울지.
11
+ * - auto: 콘텐츠가 흐르고, 넘치면 페이지가 스크롤한다
12
+ * - fill: 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다.
13
+ * 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용.
14
+ */
15
+ export declare const PAGE_CONTENT_HEIGHTS: readonly ["auto", "fill"];
16
+ export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
@@ -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,6 +34,20 @@
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
@@ -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';
41
+ ```
42
+
25
43
  ## Dependencies
26
44
 
27
45
  ### Used by
@@ -14,3 +14,17 @@
14
14
  | `maxHeight?` | `string` | — | viewport 최대 높이 (예: '400px'). 비우면 부모 크기를 따른다. |
15
15
  | `maxWidth?` | `string` | — | viewport 최대 너비 (예: '480px'). 비우면 부모 크기를 따른다. |
16
16
 
17
+ ## Types
18
+
19
+ ### SScrollAreaAxis
20
+
21
+ ```ts
22
+ export type SScrollAreaAxis = (typeof SCROLL_AREA_AXES)[number];
23
+ ```
24
+
25
+ ### SCROLL_AREA_AXES
26
+
27
+ ```ts
28
+ export const SCROLL_AREA_AXES = ['vertical', 'horizontal', 'both'] as const;
29
+ ```
30
+
@@ -0,0 +1,61 @@
1
+ # SSearchInput
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SSearchInput
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `value?` | `string \| number` | — | 값 (제어) |
12
+ | `size?` | `SSearchInputSize` | `'sm'` | 크기 |
13
+ | `placeholder?` | `string` | `'결과 내 검색'` | 플레이스홀더 |
14
+ | `clearable?` | `boolean` | `false` | 지우기 버튼 — 값이 있을 때만 나타난다 |
15
+ | `disabled?` | `boolean` | `false` | 비활성 |
16
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. 미지정 시 부모 폭을 채운다. |
17
+ | `focused?` | `boolean` | — | 포커스 상태 (제어/반영) |
18
+ | `hovered?` | `boolean` | — | 호버 상태 (제어/반영) |
19
+ | `inputClass?` | `string` | — | 내부 input 요소 className |
20
+ | `inputStyle?` | `CSSProperties` | — | 내부 input 요소 style |
21
+ | `className?` | `string` | — | |
22
+ | `style?` | `CSSProperties` | — | |
23
+
24
+ #### Events
25
+
26
+ | Event | Type | Description |
27
+ |-------|------|-------------|
28
+ | `onValueChange` | `(value: string) => void` | 값 변경 — 문자열 전달 |
29
+ | `onChange` | `InputHTMLAttributes<HTMLInputElement>['onChange']` | 네이티브 onChange (form-agnostic 연동용, RHF 등) |
30
+ | `onSearch` | `(value: string) => void` | 검색 실행 — Enter 키에서 현재 값과 함께 호출된다. 한글 조합 중의 Enter(IME 확정)는 검색으로 치지 않는다. |
31
+
32
+ ## Types
33
+
34
+ ### SSearchInputSize
35
+
36
+ ```ts
37
+ export type SSearchInputSize = SFieldSize;
38
+ ```
39
+
40
+ ## Dependencies
41
+
42
+ ### Used by
43
+
44
+ - [SSelect](../SSelect)
45
+
46
+ ### Depends on
47
+
48
+ - [SField](../SField)
49
+ - [SGhostButton](../SGhostButton)
50
+ - [SIcon](../SIcon)
51
+
52
+ ### Graph
53
+
54
+ ```mermaid
55
+ graph TD;
56
+ SSearchInput --> SField
57
+ SSearchInput --> SGhostButton
58
+ SSearchInput --> SIcon
59
+ SSelect --> SSearchInput
60
+ style SSearchInput fill:#f9f,stroke:#333,stroke-width:4px
61
+ ```
@@ -0,0 +1,52 @@
1
+ import { type CSSProperties, type InputHTMLAttributes } from 'react';
2
+ import { type SFieldSize } from '../SField';
3
+ import { type SFieldWidth } from '../../lib/field-width';
4
+ export type SSearchInputSize = SFieldSize;
5
+ export interface SSearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'onChange' | 'type' | 'prefix' | 'suffix'> {
6
+ /** 값 (제어) */
7
+ value?: string | number;
8
+ /** 값 변경 — 문자열 전달 */
9
+ onValueChange?: (value: string) => void;
10
+ /** 네이티브 onChange (form-agnostic 연동용, RHF 등) */
11
+ onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];
12
+ /**
13
+ * 검색 실행 — Enter 키에서 현재 값과 함께 호출된다.
14
+ * 한글 조합 중의 Enter(IME 확정)는 검색으로 치지 않는다.
15
+ */
16
+ onSearch?: (value: string) => void;
17
+ /** 크기 */
18
+ size?: SSearchInputSize;
19
+ /** 플레이스홀더 */
20
+ placeholder?: string;
21
+ /** 지우기 버튼 — 값이 있을 때만 나타난다 */
22
+ clearable?: boolean;
23
+ /** 비활성 */
24
+ disabled?: boolean;
25
+ /**
26
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
27
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다.
28
+ * 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다.
29
+ * 미지정 시 부모 폭을 채운다.
30
+ */
31
+ width?: SFieldWidth;
32
+ /** 포커스 상태 (제어/반영) */
33
+ focused?: boolean;
34
+ /** 호버 상태 (제어/반영) */
35
+ hovered?: boolean;
36
+ /** 내부 input 요소 className */
37
+ inputClass?: string;
38
+ /** 내부 input 요소 style */
39
+ inputStyle?: CSSProperties;
40
+ className?: string;
41
+ style?: CSSProperties;
42
+ }
43
+ /**
44
+ * SSearchInput — 목록·결과를 검색어로 좁히는 한 줄 입력.
45
+ *
46
+ * 테두리 박스(border/radius/배경 + hover·focus 강조)는 `SField` 가 소유하고,
47
+ * 이 컴포넌트는 그 안의 돋보기 아이콘 + input 만 그린다.
48
+ * 좌측 아이콘은 **장식**이라 클릭 대상이 아니다 — 검색 실행은 Enter(`onSearch`) 다.
49
+ *
50
+ * 라벨·검증·에러 메시지가 필요한 폼 필드라면 `SInput` 을 쓴다.
51
+ */
52
+ export declare const SSearchInput: import("react").ForwardRefExoticComponent<SSearchInputProps & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1 @@
1
+ export { SSearchInput, type SSearchInputProps, type SSearchInputSize } from './SSearchInput';
@@ -2,43 +2,66 @@
2
2
 
3
3
  > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
4
 
5
- ### SSectionHeaderCardBody
6
-
7
- #### Props
8
-
9
- | Prop | Type | Default | Description |
10
- |------|------|---------|-------------|
11
- | `children?` | `SSectionHeaderCardBodyChildren` | — | 바디 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. |
12
- | `padding?` | `SSectionHeaderCardBodyPadding` | `'default'` | 안쪽 여백. 기본은 `default`. 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`. |
13
-
14
- ### SSectionHeaderCardHeader
5
+ ### SSectionHeaderCard
15
6
 
16
7
  #### Props
17
8
 
18
9
  | Prop | Type | Default | Description |
19
10
  |------|------|---------|-------------|
20
- | `title` | `ReactNode` | — | 헤더 제목 |
21
- | `titleSize?` | `SSectionHeaderCardTitleSize` | `'xs'` | 제목 크기 |
22
- | `marker?` | `boolean` | `false` | 제목 앞 점 표시 여부 |
23
- | `required?` | `boolean` | `false` | 제목 뒤 필수 별 표시 여부 |
11
+ | `title?` | `ReactNode` | — | 헤더 제목 |
12
+ | `titleSize?` | `SSectionHeaderCardTitleSize` | | 제목 크기 |
13
+ | `marker?` | `boolean` | | 제목 앞 점 표시 여부 |
14
+ | `required?` | `boolean` | | 제목 뒤 필수 별 표시 여부 |
24
15
  | `helpText?` | `string[]` | — | 도움말 툴팁 메시지 |
25
16
  | `subtitle?` | `ReactNode` | — | 부제 |
26
17
  | `slot?` | `ReactNode` | — | 헤더 우측 슬롯 |
27
- | `thickness?` | `SSectionHeaderCardThickness` | `false` | 상단 border 색상 타입. false면 표시하지 않습니다. |
18
+ | `thickness?` | `SSectionHeaderCardThickness` | | 상단 border 색상 타입. false면 표시하지 않습니다. |
19
+ | `headerClassName?` | `string` | — | 헤더 영역 클래스 |
20
+ | `padding?` | `SSectionHeaderCardBodyPadding` | — | 바디 안쪽 여백. 기본은 `default`. 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`. |
21
+ | `background?` | `SSectionHeaderCardBodyBackground` | — | 본문 배경. 기본은 `frame` — 카드가 깐 흰 면을 그대로 쓴다. `neutral` 은 바탕을 한 단계 눌러앉혀, 흰 면 덩어리(표·리스트)가 여럿일 때 그것들이 **"면 위에 놓인 객체"로 읽히게** 한다. 위계를 한 단계 더 주고 싶을 때 고르는 선택지이며, **기본값이 틀린 것은 아니다** — 표·리스트는 테두리·라운드·헤더 줄과 간격을 이미 갖고 있어 흰 바탕에서도 경계가 읽힌다. 깔아도 **효과가 없는** 자리가 있다 — 덩어리가 가장자리까지 차는 경우(`padding="none"` 으로 표를 채우면 바탕이 완전히 가려진다), 덩어리에 회색 면이 섞인 경우(그 덩어리가 바탕에 묻힌다), 맨 텍스트나 폼 컨트롤만 있는 본문(떠오를 흰 면이 없다). |
22
+ | `footerLeft?` | `ReactNode` | — | 하단 액션 영역 좌측 슬롯. 보조 버튼(취소·목록 등)이 오는 자리다. `footerLeft` 또는 `button` 중 하나라도 있으면 하단 액션 영역이 렌더된다. |
23
+ | `button?` | `SFooterButton` | — | 하단 액션 영역 우측 주 액션 버튼 |
24
+ | `footerClassName?` | `string` | — | 하단 액션 영역 클래스 |
25
+ | `children?` | `SSectionHeaderCardChildren` | — | 바디 콘텐츠. 특정 컴포넌트 타입으로 제한하지 않습니다. |
28
26
 
29
- ### SSectionHeaderCard
27
+ ## Types
30
28
 
31
- #### Props
29
+ ### SSectionHeaderCardTitleSize
32
30
 
33
- | Prop | Type | Default | Description |
34
- |------|------|---------|-------------|
35
- | `children?` | `SSectionHeaderCardChildren` | — | SSectionHeaderCard 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. |
31
+ ```ts
32
+ export type SSectionHeaderCardTitleSize = 'xs' | 'sm';
33
+ ```
34
+
35
+ ### SSectionHeaderCardThickness
36
+
37
+ ```ts
38
+ export type SSectionHeaderCardThickness = false | 'default' | 'accent';
39
+ ```
40
+
41
+ ### SSectionHeaderCardBodyPadding
42
+
43
+ ```ts
44
+ export type SSectionHeaderCardBodyPadding = 'default' | 'wide' | 'none';
45
+ ```
46
+
47
+ ### SSectionHeaderCardBodyBackground
48
+
49
+ ```ts
50
+ export type SSectionHeaderCardBodyBackground = 'frame' | 'neutral';
51
+ ```
52
+
53
+ ### SSectionHeaderCardChildren
54
+
55
+ ```ts
56
+ export type SSectionHeaderCardChildren = ReactNode;
57
+ ```
36
58
 
37
59
  ## Dependencies
38
60
 
39
61
  ### Depends on
40
62
 
41
63
  - [SBadge](../SBadge)
64
+ - [SFooter](../SFooter)
42
65
  - [SIcon](../SIcon)
43
66
  - [STooltip](../STooltip)
44
67
 
@@ -47,6 +70,7 @@
47
70
  ```mermaid
48
71
  graph TD;
49
72
  SSectionHeaderCard --> SBadge
73
+ SSectionHeaderCard --> SFooter
50
74
  SSectionHeaderCard --> SIcon
51
75
  SSectionHeaderCard --> STooltip
52
76
  style SSectionHeaderCard fill:#f9f,stroke:#333,stroke-width:4px