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

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 (130) hide show
  1. package/AGENTS.md +463 -89
  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/SCard.d.ts +1 -1
  11. package/dist/components/SCheckbox/README.md +8 -0
  12. package/dist/components/SChipFilter/README.md +288 -5
  13. package/dist/components/SChipFilter/SChipFilter.d.ts +95 -40
  14. package/dist/components/SChipFilter/index.d.ts +1 -1
  15. package/dist/components/SChipInput/README.md +15 -1
  16. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  17. package/dist/components/SCircleProgress/README.md +8 -0
  18. package/dist/components/SConfirmModal/README.md +16 -0
  19. package/dist/components/SDatePicker/README.md +60 -4
  20. package/dist/components/SDatePicker/SDatePicker.d.ts +61 -5
  21. package/dist/components/SDatePicker/index.d.ts +1 -1
  22. package/dist/components/SDateRangePicker/README.md +17 -2
  23. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  24. package/dist/components/SDivider/README.md +4 -0
  25. package/dist/components/SDraggableItem/README.md +37 -0
  26. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  27. package/dist/components/SDraggableList/README.md +29 -0
  28. package/dist/components/SDraggableList/SDraggableList.d.ts +10 -0
  29. package/dist/components/SDraggableList/index.d.ts +1 -1
  30. package/dist/components/SDrawer/README.md +8 -0
  31. package/dist/components/SDropdownButton/README.md +19 -0
  32. package/dist/components/SEditor/EditorBody.d.ts +40 -0
  33. package/dist/components/SEditor/EditorToolbar.d.ts +87 -0
  34. package/dist/components/SEditor/README.md +230 -0
  35. package/dist/components/SEditor/SEditor.d.ts +124 -0
  36. package/dist/components/SEditor/editor-icons.d.ts +59 -0
  37. package/dist/components/SEditor/editor.config.d.ts +85 -0
  38. package/dist/components/SEditor/index.d.ts +2 -0
  39. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  40. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  41. package/dist/components/SExpansionItem/README.md +36 -0
  42. package/dist/components/SField/README.md +27 -2
  43. package/dist/components/SField/SField.d.ts +22 -4
  44. package/dist/components/SFilePicker/README.md +15 -1
  45. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  46. package/dist/components/SFooter/README.md +21 -0
  47. package/dist/components/SForm/README.md +11 -0
  48. package/dist/components/SGhostButton/README.md +20 -2
  49. package/dist/components/SGnb/README.md +45 -0
  50. package/dist/components/SGnb/gnb.config.d.ts +7 -0
  51. package/dist/components/SGuide/README.md +15 -0
  52. package/dist/components/SIcon/README.md +4 -0
  53. package/dist/components/SIcon/SIcon.d.ts +1 -1
  54. package/dist/components/SIcon/icons.gen.d.ts +2 -0
  55. package/dist/components/SImage/README.md +14 -0
  56. package/dist/components/SInput/README.md +3 -1
  57. package/dist/components/SInput/SInput.d.ts +7 -1
  58. package/dist/components/SKeyValueTable/README.md +87 -0
  59. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +14 -3
  60. package/dist/components/SLayout/README.md +16 -0
  61. package/dist/components/SLinearProgress/README.md +8 -0
  62. package/dist/components/SList/README.md +5 -1
  63. package/dist/components/SList/SList.d.ts +0 -2
  64. package/dist/components/SListItem/README.md +41 -0
  65. package/dist/components/SLoadingModal/README.md +8 -0
  66. package/dist/components/SNumberInput/README.md +9 -1
  67. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  68. package/dist/components/SPage/README.md +41 -1
  69. package/dist/components/SPage/SPage.d.ts +24 -2
  70. package/dist/components/SPage/index.d.ts +1 -1
  71. package/dist/components/SPage/page.config.d.ts +8 -0
  72. package/dist/components/SPopover/README.md +15 -0
  73. package/dist/components/SPopup/README.md +19 -0
  74. package/dist/components/SPortal/README.md +14 -0
  75. package/dist/components/SRadio/README.md +20 -0
  76. package/dist/components/SRadioButton/README.md +18 -0
  77. package/dist/components/SScrollArea/README.md +14 -0
  78. package/dist/components/SSearchInput/README.md +61 -0
  79. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  80. package/dist/components/SSearchInput/index.d.ts +1 -0
  81. package/dist/components/SSectionHeaderCard/README.md +39 -20
  82. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +21 -14
  83. package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
  84. package/dist/components/SSelect/README.md +25 -3
  85. package/dist/components/SSelect/SSelect.d.ts +13 -1
  86. package/dist/components/SSplitter/README.md +15 -0
  87. package/dist/components/SStepper/README.md +26 -0
  88. package/dist/components/SSwitch/README.md +13 -0
  89. package/dist/components/STable/README.md +72 -1
  90. package/dist/components/STable/STable.d.ts +129 -11
  91. package/dist/components/STable/index.d.ts +1 -1
  92. package/dist/components/STabs/README.md +12 -1
  93. package/dist/components/STabs/STabs.d.ts +2 -4
  94. package/dist/components/STabs/index.d.ts +1 -1
  95. package/dist/components/STabs/tabs.config.d.ts +3 -4
  96. package/dist/components/STag/README.md +47 -0
  97. package/dist/components/STextLink/README.md +17 -0
  98. package/dist/components/STextLink/STextLink.d.ts +2 -0
  99. package/dist/components/STextarea/README.md +1 -1
  100. package/dist/components/STextarea/STextarea.d.ts +7 -1
  101. package/dist/components/STimePicker/README.md +15 -1
  102. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  103. package/dist/components/STimePicker/timepicker.config.d.ts +7 -0
  104. package/dist/components/STimeRangePicker/README.md +27 -1
  105. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  106. package/dist/components/SToast/README.md +24 -0
  107. package/dist/components/SToggle/README.md +8 -0
  108. package/dist/components/STooltip/README.md +22 -0
  109. package/dist/components/STree/README.md +41 -0
  110. package/dist/components/STree/STree.d.ts +8 -0
  111. package/dist/components/STree/index.d.ts +1 -1
  112. package/dist/index.cjs +3987 -496
  113. package/dist/index.cjs.map +1 -1
  114. package/dist/index.d.ts +3 -0
  115. package/dist/index.js +3970 -496
  116. package/dist/index.js.map +1 -1
  117. package/dist/lib/field-width.d.ts +31 -0
  118. package/dist/lib/story-docs.d.ts +19 -3
  119. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  120. package/dist/llms-full.txt +2312 -198
  121. package/dist/llms.txt +465 -91
  122. package/dist/styles.css +672 -41
  123. package/dist/theme.css +22 -6
  124. package/eslint/index.mjs +10 -0
  125. package/eslint/lib/table-column.mjs +26 -0
  126. package/eslint/rules/field-width-grade.d.mts +41 -0
  127. package/eslint/rules/field-width-grade.mjs +311 -0
  128. package/eslint/rules/table-column-width.mjs +110 -0
  129. package/eslint/scale.gen.mjs +3 -0
  130. package/package.json +13 -1
@@ -1,6 +1,4 @@
1
1
  import { type CSSProperties, type ReactNode } from 'react';
2
- import { type SColor } from '../../lib/color';
3
- import { type SIconName } from '../SIcon';
4
2
  import { type SSelectOption } from '../SSelect';
5
3
  export type SRow = Record<string, any>;
6
4
  /** `STableColumn.renderCell`에 전달되는 컨텍스트 */
@@ -20,24 +18,88 @@ export interface STableCellContext {
20
18
  /** STable이 이 셀에 적용하려던 스타일 (패딩·정렬·폭·sticky offset 포함) */
21
19
  style: CSSProperties;
22
20
  }
23
- export interface STableColumn {
21
+ /** 값 접근: 필드명 또는 접근 함수 */
22
+ export type STableColumnField = string | ((row: SRow) => any);
23
+ interface STableColumnBase {
24
24
  name: string;
25
25
  label: string;
26
- /** 값 접근: 필드명 또는 접근 함수 */
27
- field: string | ((row: SRow) => any);
28
26
  align?: 'left' | 'center' | 'right';
29
- width?: string;
30
- /** 고정폭 없이 자동 너비 (sticky/resize 계산에서 제외) */
27
+ /**
28
+ * 컬럼 너비. **px 로만 준다** — 숫자는 px 로 해석하고, 문자열은 `'120px'` 형태만 받는다.
29
+ *
30
+ * % · `clamp()` · `min()` 은 쓰지 않는다. 폭은 `<colgroup>` 의 `<col width>` 로 들어가는데
31
+ * 테이블이 `table-fixed` 라 함수형 값은 계산되지 않고 통째로 무시된다 — 화면은 조용히
32
+ * auto 폭으로 떨어진다. `'30%'` 는 더 나쁘게 30px 로 읽힌다.
33
+ *
34
+ * 생략하면 기본 120px 이다. 내용이 들어가는 열은 값 길이에 맞춰 폭을 명시한다 —
35
+ * 폭을 주지 않은 열만 다른 열에 눌려 무너지거나 늘어난다.
36
+ */
37
+ width?: number | `${number}px`;
38
+ /**
39
+ * 고정폭 없이 남은 폭을 흡수한다 (sticky/resize 계산에서 제외).
40
+ *
41
+ * **남은 폭을 먹는 스페이서 열 하나에만 쓴다.** 내용이 들어가는 열에 주면 폭이 다른 열에
42
+ * 좌우돼 화면마다 달라진다 — 내용 열은 px 로 폭을 명시한다.
43
+ */
31
44
  autoWidth?: boolean;
32
- /** 리사이즈 최소/최대 너비 (px) */
45
+ /**
46
+ * 리사이즈 하한/상한 (px). **`resizable` 로 끄는 손잡이의 이동 범위일 뿐, 레이아웃에는
47
+ * 관여하지 않는다** — 폭을 주지 않은 열이 이 값 안에서 잡히는 것이 아니다.
48
+ */
33
49
  minWidth?: number;
34
50
  maxWidth?: number;
35
51
  /** 표시 포맷 */
36
52
  format?: (value: any, row: SRow) => string;
37
53
  visible?: boolean;
38
- icon?: SIconName;
39
- /** 헤더 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
40
- iconColor?: SColor;
54
+ /**
55
+ * 헤더 라벨 뒤 도움말 툴팁 (각 항목이 한 줄). `SKeyValueTable` 의 `field.helpText` 와 같은 역할 —
56
+ * 라벨만으로 뜻이 통하지 않는 컬럼의 산출 기준·단위를 설명한다.
57
+ *
58
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
59
+ */
60
+ helpText?: string[];
61
+ /**
62
+ * 라벨 뒤 필수 표시(`*`). `SKeyValueTable` 의 `field.required` 와 같은 규칙 —
63
+ * 그 열의 값을 반드시 채워야 하는 입력 열에만 쓴다.
64
+ *
65
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
66
+ */
67
+ required?: boolean;
68
+ /**
69
+ * 셀 값을 직접 고칠 수 있는 열. 라벨 뒤에 `pageEdit` 표식이 붙는다.
70
+ *
71
+ * **표식일 뿐 버튼이 아니다** — 실제로 고치는 UI 는 셀(`render`)이 그린다. 표식만 켜 두면
72
+ * 고칠 수 있다고 해 놓고 고칠 방법이 없는 열이 된다.
73
+ *
74
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
75
+ */
76
+ editable?: boolean;
77
+ /**
78
+ * 셀을 눌러 다른 화면으로 넘어가는 열. 라벨 뒤에 `pageMove` 표식이 붙는다.
79
+ *
80
+ * **표식일 뿐 버튼이 아니다** — 넘어가는 것은 셀(`render`)의 링크·클릭이 한다.
81
+ *
82
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
83
+ */
84
+ navigable?: boolean;
85
+ /**
86
+ * 정렬 가능한 열인지. 켜면 헤더 라벨 뒤에 정렬 버튼이 붙는다 — 누르는 곳은 그 버튼뿐이고
87
+ * 헤더 셀 전체가 클릭 영역이 되지는 않는다.
88
+ *
89
+ * 정렬 상태는 컴포넌트가 갖지 않는다 — `STable` 의 `sort` · `onSortChange` 로 주고받는다.
90
+ * `renderHeader` 로 헤더를 통째로 교체하면 버튼도 그리지 않는다 (헤더 전체가 소비 앱 책임).
91
+ */
92
+ sortable?: boolean;
93
+ /**
94
+ * 셀에 무엇이 들어가는지. 좌우 여백이 여기서 갈린다 — 기본은 `text`(넓게).
95
+ *
96
+ * 자기 폭을 가진 컨트롤(`SInput`·`SNumberInput`·`SSelect` 등)이 들어가는 열은 `control` 로 준다.
97
+ * 텍스트와 같은 넓은 여백을 두면 컨트롤이 쓸 폭이 그만큼 줄어 같은 열 폭에서도 좁아 보인다.
98
+ *
99
+ * `SKeyValueTable` 은 `field.type` 으로 이 판정을 스스로 하지만, `STable` 의 셀은 소비 앱이 넘긴
100
+ * 임의의 `render` 결과라 컴포넌트가 알 수 없다. 그래서 열 단위로 받는다.
101
+ */
102
+ contentType?: 'text' | 'control';
41
103
  /** 셀 커스텀 렌더 (React 확장) — `<td>` 안쪽 내용만 교체한다 */
42
104
  render?: (row: SRow, value: any) => ReactNode;
43
105
  /**
@@ -59,6 +121,17 @@ export interface STableColumn {
59
121
  thClass?: string;
60
122
  thStyle?: CSSProperties;
61
123
  }
124
+ /**
125
+ * `autoWidth` 스페이서 열은 값을 그리지 않으므로 `field` 를 생략할 수 있다.
126
+ * 그 밖의 열은 값 접근자가 있어야 한다.
127
+ */
128
+ export type STableColumn = STableColumnBase & ({
129
+ autoWidth: true;
130
+ field?: STableColumnField;
131
+ } | {
132
+ autoWidth?: false;
133
+ field: STableColumnField;
134
+ });
62
135
  export interface STablePagination {
63
136
  page: number;
64
137
  rowsPerPage: number;
@@ -68,6 +141,12 @@ export interface STableStickyColumn {
68
141
  left?: number;
69
142
  right?: number;
70
143
  }
144
+ /** 정렬 상태 — 어느 열을 어느 방향으로 정렬했는가 */
145
+ export interface STableSort {
146
+ /** 정렬 기준 컬럼의 `name` */
147
+ name: string;
148
+ dir: 'asc' | 'desc';
149
+ }
71
150
  /** STable ref 명령형 API (sd-table @Method 대응) */
72
151
  export interface STableHandle {
73
152
  /** 행 선택 여부 */
@@ -99,6 +178,19 @@ export interface STableProps {
99
178
  selectable?: boolean;
100
179
  selected?: SRow[];
101
180
  onSelectedChange?: (rows: SRow[]) => void;
181
+ /**
182
+ * 정렬 상태 (controlled). `null`·미지정이면 정렬 없음.
183
+ *
184
+ * 컴포넌트는 정렬 상태를 갖지 않는다 — 서버 정렬이면 이 값이 곧 조회 조건이고,
185
+ * 뒤로가기·새로고침·링크 공유로 복원돼야 하므로 진실은 URL·store 쪽에 있어야 한다.
186
+ * 행을 실제로 정렬하는 것도 소비 앱 몫이다 (`STable` 은 받은 순서대로 그린다).
187
+ */
188
+ sort?: STableSort | null;
189
+ /**
190
+ * 정렬 헤더 클릭 (`asc → desc → 해제` 3단). 해제되면 `null` 이 온다.
191
+ * 다중 정렬은 1차 안에서 지원하지 않는다.
192
+ */
193
+ onSortChange?: (sort: STableSort | null) => void;
102
194
  /** 컬럼 너비 조절 */
103
195
  resizable?: boolean;
104
196
  width?: string;
@@ -109,6 +201,16 @@ export interface STableProps {
109
201
  stickyColumn?: STableStickyColumn;
110
202
  /** border-radius 제어 */
111
203
  radius?: 'default' | 'useTop' | 'full';
204
+ /**
205
+ * 바깥 테두리. 기본은 `true`.
206
+ *
207
+ * `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 —
208
+ * 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다.
209
+ *
210
+ * 페이지네이션 바의 테두리와 1px 겹침(`-mt-px`)도 함께 꺼진다. 본문 테두리가 없으면 겹칠 대상이
211
+ * 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다.
212
+ */
213
+ bordered?: boolean;
112
214
  noDataLabel?: string;
113
215
  /**
114
216
  * 데이터가 없을 때 body 영역 전체를 대체하는 슬롯.
@@ -116,7 +218,14 @@ export interface STableProps {
116
218
  */
117
219
  noDataSlot?: ReactNode;
118
220
  isLoading?: boolean;
221
+ /** 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로) */
119
222
  dense?: boolean;
223
+ /**
224
+ * 밀도 변경 (`useDensityToggle` 로 띄운 토글을 눌렀을 때). 컴포넌트는 밀도 상태를 갖지 않는다 —
225
+ * `dense` 가 곧 현재 상태이고, 그 진실은 페이지에 있다. 사용자가 고른 밀도를 다음 방문까지
226
+ * 기억해 두는 것(로컬 저장 등)도 페이지 몫이다.
227
+ */
228
+ onDenseChange?: (dense: boolean) => void;
120
229
  /** true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 */
121
230
  noHover?: boolean;
122
231
  /** 페이지네이션 (있으면 하단 표시) */
@@ -126,6 +235,14 @@ export interface STableProps {
126
235
  useInternalPagination?: boolean;
127
236
  /** 페이지당 행 수 셀렉트 표시 */
128
237
  useRowsPerPageSelect?: boolean;
238
+ /**
239
+ * 페이지네이션 바에 밀도 토글(`좁게 보기` · `넓게 보기`) 표시.
240
+ *
241
+ * **페이지네이션이 있을 때만 나타난다** — 토글이 사는 곳이 그 바이기 때문이다.
242
+ * `onDenseChange` 와 함께 준다. 밀도는 컴포넌트가 갖지 않으므로, 핸들러 없이 켜면 눌러도
243
+ * 아무 일도 일어나지 않는다.
244
+ */
245
+ useDensityToggle?: boolean;
129
246
  rowsPerPageOption?: SSelectOption[];
130
247
  onRowsPerPageChange?: (perPage: number) => void;
131
248
  /** 가상 스크롤 */
@@ -155,3 +272,4 @@ export interface STableProps {
155
272
  * 내부 페이지네이션 + rows-per-page + 가상 스크롤 + 로딩 + dense.
156
273
  */
157
274
  export declare const STable: import("react").ForwardRefExoticComponent<STableProps & import("react").RefAttributes<STableHandle>>;
275
+ export {};
@@ -1 +1 @@
1
- export { STable, type STableProps, type STableColumn, type STableCellContext, type STablePagination, type STableStickyColumn, type STableHandle, type SRow, } from './STable';
1
+ export { STable, type STableProps, type STableColumn, type STableColumnField, type STableSort, type STableCellContext, type STablePagination, type STableStickyColumn, type STableHandle, type SRow, } from './STable';
@@ -10,7 +10,6 @@
10
10
  |------|------|---------|-------------|
11
11
  | `value` | `string` | — | 현재 선택된 탭 value |
12
12
  | `tabs` | `STabOption[]` | — | 탭 옵션 목록 |
13
- | `size?` | `STabSize` | `'md'` | 탭 크기 (main 전용) |
14
13
  | `isSub?` | `boolean` | `false` | 서브 탭(밑줄형) 스타일 |
15
14
  | `vertical?` | `boolean` | `false` | 세로 배치 (sub 전용 — main 폴더형은 항상 가로) |
16
15
  | `className?` | `string` | — | |
@@ -22,6 +21,18 @@
22
21
  |-------|------|-------------|
23
22
  | `onValueChange` | `(value: string) => void` | 탭 변경 (sdUpdate) |
24
23
 
24
+ ## Types
25
+
26
+ ### STabOption
27
+
28
+ ```ts
29
+ export interface STabOption {
30
+ label: string;
31
+ value: string;
32
+ badge?: string | number;
33
+ }
34
+ ```
35
+
25
36
  ## Dependencies
26
37
 
27
38
  ### Depends on
@@ -1,5 +1,5 @@
1
1
  import { type CSSProperties } from 'react';
2
- import { type STabSize, type STabOption } from './tabs.config';
2
+ import { type STabOption } from './tabs.config';
3
3
  export interface STabsProps {
4
4
  /** 현재 선택된 탭 value */
5
5
  value: string;
@@ -7,8 +7,6 @@ export interface STabsProps {
7
7
  tabs: STabOption[];
8
8
  /** 탭 변경 (sdUpdate) */
9
9
  onValueChange?: (value: string) => void;
10
- /** 탭 크기 (main 전용) */
11
- size?: STabSize;
12
10
  /** 서브 탭(밑줄형) 스타일 */
13
11
  isSub?: boolean;
14
12
  /** 세로 배치 (sub 전용 — main 폴더형은 항상 가로) */
@@ -21,4 +19,4 @@ export interface STabsProps {
21
19
  * main = 폴더형(탭 줄에 파란 baseline, 탭은 위쪽만 둥글고 하단 테두리 없음),
22
20
  * sub = 밑줄형(선택 시 하단 라인). 뱃지(STag), 세로 배치, value 제어 + onValueChange(sdUpdate).
23
21
  */
24
- export declare function STabs({ value, tabs, onValueChange, size, isSub, vertical, className, style, }: STabsProps): import("react").JSX.Element;
22
+ export declare function STabs({ value, tabs, onValueChange, isSub, vertical, className, style, }: STabsProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export { STabs, type STabsProps } from './STabs';
2
- export { type STabOption, type STabSize } from './tabs.config';
2
+ export { type STabOption } from './tabs.config';
@@ -1,14 +1,13 @@
1
- export type STabSize = 'md' | 'lg';
2
1
  export interface STabOption {
3
2
  label: string;
4
3
  value: string;
5
4
  badge?: string | number;
6
5
  }
7
- /** main(분절형) 사이즈별 레이아웃 — size는 높이·패딩만 바꾸고 폰트는 고정 */
8
- export declare const TAB_MAIN_SIZE: Record<STabSize, {
6
+ /** main(분절형) 레이아웃 */
7
+ export declare const TAB_MAIN_SIZE: {
9
8
  height: number;
10
9
  paddingX: number;
11
- }>;
10
+ };
12
11
  /** 탭 타이포 (main/sub 공통, token: typography.navigation.sm) */
13
12
  export declare const TAB_TYPOGRAPHY: {
14
13
  fontSize: number;
@@ -16,6 +16,53 @@
16
16
  | `iconLeft?` | `boolean` | `true` | 아이콘을 레이블 왼쪽에 배치 |
17
17
  | `width?` | `string \| number` | — | 태그 너비 (숫자면 px, 문자열이면 그대로 적용). 미지정 시 콘텐츠 크기 |
18
18
 
19
+ ## Types
20
+
21
+ ### STagShape
22
+
23
+ ```ts
24
+ export type STagShape = (typeof TAG_SHAPES)[number];
25
+ ```
26
+
27
+ ### STagSize
28
+
29
+ ```ts
30
+ export type STagSize = (typeof TAG_SIZES)[number];
31
+ ```
32
+
33
+ ### STagColor
34
+
35
+ ```ts
36
+ export type STagColor = (typeof TAG_COLORS)[number];
37
+ ```
38
+
39
+ ### TAG_SHAPES
40
+
41
+ ```ts
42
+ export const TAG_SHAPES = ['square', 'pill'] as const;
43
+ ```
44
+
45
+ ### TAG_SIZES
46
+
47
+ ```ts
48
+ export const TAG_SIZES = ['xs', 'sm', 'md'] as const;
49
+ ```
50
+
51
+ ### TAG_COLORS
52
+
53
+ ```ts
54
+ export const TAG_COLORS = [
55
+ 'grey',
56
+ 'red',
57
+ 'orange',
58
+ 'yellow',
59
+ 'green',
60
+ 'blue',
61
+ 'darkblue',
62
+ 'indigo',
63
+ ] as const;
64
+ ```
65
+
19
66
  ## Dependencies
20
67
 
21
68
  ### Used by
@@ -11,6 +11,7 @@
11
11
  | `label?` | `string` | `''` | 레이블 |
12
12
  | `icon?` | `SIconName` | — | 좌측 아이콘 |
13
13
  | `iconColor?` | `SColor` | — | 좌측 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 |
14
+ | `iconRotate?` | `0 \| 90 \| 180 \| 270` | — | 좌측 아이콘 회전 각도. 같은 아이콘을 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) |
14
15
  | `labelClass?` | `string` | — | 레이블 span에 추가할 클래스 |
15
16
  | `rightArrow?` | `STextLinkArrow` | `'none'` | 우측 화살표 |
16
17
  | `underline?` | `boolean` | `false` | 밑줄 여부 |
@@ -24,6 +25,20 @@
24
25
  |-------|------|-------------|
25
26
  | `onClick` | `() => void` | |
26
27
 
28
+ ## Types
29
+
30
+ ### STextLinkArrow
31
+
32
+ ```ts
33
+ export type STextLinkArrow = 'none' | 'chevron' | 'caret';
34
+ ```
35
+
36
+ ### STextLinkSize
37
+
38
+ ```ts
39
+ export type STextLinkSize = 'sm' | 'md' | 'lg';
40
+ ```
41
+
27
42
  ## Dependencies
28
43
 
29
44
  ### Used by
@@ -31,6 +46,7 @@
31
46
  - [SChipFilter](../SChipFilter)
32
47
  - [SChipInput](../SChipInput)
33
48
  - [SPopover](../SPopover)
49
+ - [STable](../STable)
34
50
 
35
51
  ### Depends on
36
52
 
@@ -46,5 +62,6 @@ graph TD;
46
62
  SChipFilter --> STextLink
47
63
  SChipInput --> STextLink
48
64
  SPopover --> STextLink
65
+ STable --> STextLink
49
66
  style STextLink fill:#f9f,stroke:#333,stroke-width:4px
50
67
  ```
@@ -10,6 +10,8 @@ export interface STextLinkProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'o
10
10
  icon?: SIconName;
11
11
  /** 좌측 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
12
12
  iconColor?: SColor;
13
+ /** 좌측 아이콘 회전 각도. 같은 아이콘을 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) */
14
+ iconRotate?: 0 | 90 | 180 | 270;
13
15
  /** 레이블 span에 추가할 클래스 */
14
16
  labelClass?: string;
15
17
  /** 우측 화살표 */
@@ -27,7 +27,7 @@
27
27
  | `hint?` | `string` | — | |
28
28
  | `error?` | `boolean` | — | |
29
29
  | `errorMessage?` | `string` | — | |
30
- | `width?` | `number \| string` | — | |
30
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
31
31
  | `disabled?` | `boolean` | `false` | |
32
32
  | `readOnly?` | `boolean` | `false` | |
33
33
  | `className?` | `string` | — | |
@@ -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 interface STextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'onChange'> {
8
9
  /** 값 (제어) */
9
10
  value?: string;
@@ -41,7 +42,12 @@ export interface STextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextArea
41
42
  hint?: string;
42
43
  error?: boolean;
43
44
  errorMessage?: string;
44
- width?: number | string;
45
+ /**
46
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
47
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다.
48
+ * 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다.
49
+ */
50
+ width?: SFieldWidth;
45
51
  disabled?: boolean;
46
52
  readOnly?: boolean;
47
53
  className?: string;
@@ -16,7 +16,7 @@
16
16
  | `clearable?` | `boolean` | `false` | |
17
17
  | `useMeridiem?` | `boolean` | — | 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. |
18
18
  | `minuteStep?` | `number` | `1` | |
19
- | `width?` | `number \| string` | — | |
19
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
20
20
  | `name?` | `string` | — | |
21
21
  | `rules?` | `Rule[]` | — | |
22
22
  | `status?` | `SFieldStatus` | — | |
@@ -41,6 +41,20 @@
41
41
  | `onValueChange` | `(time: string \| null) => void` | 선택 변경 (sdUpdate) |
42
42
  | `onOpenChange` | `(open: boolean) => void` | 열림/닫힘 변경 (sdDropDownShow) |
43
43
 
44
+ ## Types
45
+
46
+ ### STimePickerType
47
+
48
+ ```ts
49
+ export type STimePickerType = 'default' | 'midday';
50
+ ```
51
+
52
+ ### STimePickerSize
53
+
54
+ ```ts
55
+ export type STimePickerSize = 'sm' | 'md';
56
+ ```
57
+
44
58
  ## Dependencies
45
59
 
46
60
  ### Used by
@@ -5,6 +5,7 @@ import { type SColor } from '../../lib/color';
5
5
  import { type Rule } from '../../lib/form';
6
6
  import { type STooltipProps } from '../STooltip';
7
7
  import { type STimePickerSize, type STimePickerType } from './timepicker.config';
8
+ import { type SFieldWidth } from '../../lib/field-width';
8
9
  export type { STimePickerSize, STimePickerType } from './timepicker.config';
9
10
  export interface STimePickerProps {
10
11
  /** 선택 시간 (HH:mm) */
@@ -22,7 +23,12 @@ export interface STimePickerProps {
22
23
  /** 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. */
23
24
  useMeridiem?: boolean;
24
25
  minuteStep?: number;
25
- width?: number | string;
26
+ /**
27
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
28
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다.
29
+ * 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다.
30
+ */
31
+ width?: SFieldWidth;
26
32
  name?: string;
27
33
  rules?: Rule[];
28
34
  status?: SFieldStatus;
@@ -1,3 +1,4 @@
1
+ import { type SFieldWidthGrade } from '../../lib/field-width';
1
2
  export type STimePickerSize = 'sm' | 'md';
2
3
  export type STimePickerType = 'default' | 'midday';
3
4
  export type STimePickerMeridiem = 'AM' | 'PM';
@@ -12,6 +13,12 @@ export declare const TIMEPICKER_SIZE_CONFIG: Record<STimePickerSize, {
12
13
  lineHeight: number;
13
14
  minWidth: number;
14
15
  fieldMinWidth: number;
16
+ /**
17
+ * 필드 상한(폭 등급). 값 길이가 HH:mm 으로 정해져 있어, width="100%" 를 받아도 행 전체로
18
+ * 늘어나지 않게 막는다 (SKeyValueTable 이 모든 컨트롤에 100% 를 넘긴다).
19
+ * px 가 아니라 등급으로 두어 `--cmp-field-width-*` 가 바뀌면 함께 따라가게 한다.
20
+ */
21
+ fieldMaxWidth: SFieldWidthGrade;
15
22
  }>;
16
23
  export declare function clampTimePart(value: number, min: number, max: number): number;
17
24
  export declare function padTimePart(value: number): string;
@@ -17,7 +17,7 @@
17
17
  | `useMeridiem?` | `boolean` | — | 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. |
18
18
  | `minuteStep?` | `number` | `1` | |
19
19
  | `rangeOrder?` | `STimeRangePickerRangeOrder` | `'strict'` | 범위 순서 정책. strict는 시작 시간이 종료 시간보다 늦어지지 않도록 보정합니다. |
20
- | `width?` | `number \| string` | — | |
20
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
21
21
  | `name?` | `string` | — | |
22
22
  | `rules?` | `Rule[]` | — | |
23
23
  | `status?` | `SFieldStatus` | — | |
@@ -42,6 +42,32 @@
42
42
  | `onValueChange` | `(range: STimeRangeValue) => void` | 선택 변경 (sdUpdate) |
43
43
  | `onOpenChange` | `(open: boolean) => void` | 열림/닫힘 변경 (sdDropDownShow) |
44
44
 
45
+ ## Types
46
+
47
+ ### STimeRangeValue
48
+
49
+ ```ts
50
+ export type STimeRangeValue = [string, string] | null;
51
+ ```
52
+
53
+ ### STimeRangePickerType
54
+
55
+ ```ts
56
+ export type STimeRangePickerType = STimePickerType;
57
+ ```
58
+
59
+ ### STimeRangePickerSize
60
+
61
+ ```ts
62
+ export type STimeRangePickerSize = STimePickerSize;
63
+ ```
64
+
65
+ ### STimeRangePickerRangeOrder
66
+
67
+ ```ts
68
+ export type STimeRangePickerRangeOrder = 'strict' | 'allow-cross-day';
69
+ ```
70
+
45
71
  ## Dependencies
46
72
 
47
73
  ### Depends on
@@ -6,6 +6,7 @@ import { type Rule } from '../../lib/form';
6
6
  import { type STooltipProps } from '../STooltip';
7
7
  import { type STimeRangePickerRangeOrder, type STimeRangePickerSize, type STimeRangePickerType, type STimeRangeValue } from './time-range-picker.config';
8
8
  export type { STimeRangePickerSize, STimeRangePickerRangeOrder, STimeRangePickerType, STimeRangeValue, } from './time-range-picker.config';
9
+ import { type SFieldWidth } from '../../lib/field-width';
9
10
  export interface STimeRangePickerProps {
10
11
  /** 선택 시간 범위 [시작, 종료] (HH:mm) */
11
12
  value?: STimeRangeValue;
@@ -24,7 +25,12 @@ export interface STimeRangePickerProps {
24
25
  minuteStep?: number;
25
26
  /** 범위 순서 정책. strict는 시작 시간이 종료 시간보다 늦어지지 않도록 보정합니다. */
26
27
  rangeOrder?: STimeRangePickerRangeOrder;
27
- width?: number | string;
28
+ /**
29
+ * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
30
+ * 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다.
31
+ * 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다.
32
+ */
33
+ width?: SFieldWidth;
28
34
  name?: string;
29
35
  rules?: Rule[];
30
36
  status?: SFieldStatus;
@@ -51,6 +51,30 @@
51
51
  | `onClose` | `() => void` | 닫기 (sdClose) |
52
52
  | `onButtonClick` | `(e: MouseEvent) => void` | 버튼 클릭 (sdButtonClick) |
53
53
 
54
+ ## Types
55
+
56
+ ### SToastPosition
57
+
58
+ ```ts
59
+ export type SToastPosition =
60
+ 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
61
+ ```
62
+
63
+ ### SToastNotifyOptions
64
+
65
+ ```ts
66
+ export interface SToastNotifyOptions extends Omit<SToastProps, 'onClose'> {
67
+ /** 자동 닫힘 지연(ms). 0이면 자동 닫힘 없음 (없으면 defaultDuration) */
68
+ duration?: number;
69
+ }
70
+ ```
71
+
72
+ ### SToastType
73
+
74
+ ```ts
75
+ export type SToastType = 'default' | 'danger' | 'caution' | 'complete' | 'accent' | 'info';
76
+ ```
77
+
54
78
  ## Dependencies
55
79
 
56
80
  ### Depends on
@@ -21,3 +21,11 @@
21
21
  |-------|------|-------------|
22
22
  | `onValueChange` | `(value: boolean) => void` | 변경 (sdUpdate) |
23
23
 
24
+ ## Types
25
+
26
+ ### SToggleSize
27
+
28
+ ```ts
29
+ export type SToggleSize = 'xs' | 'sm';
30
+ ```
31
+
@@ -40,6 +40,26 @@
40
40
  | `show` | `() => void` | 툴팁을 표시합니다. |
41
41
  | `hide` | `() => void` | 툴팁을 숨깁니다. |
42
42
 
43
+ ## Types
44
+
45
+ ### STooltipTrigger
46
+
47
+ ```ts
48
+ export type STooltipTrigger = 'hover' | 'click' | 'none';
49
+ ```
50
+
51
+ ### STooltipPlacement
52
+
53
+ ```ts
54
+ export type STooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
55
+ ```
56
+
57
+ ### STooltipType
58
+
59
+ ```ts
60
+ export type STooltipType = 'default' | 'danger' | 'warning' | 'accent';
61
+ ```
62
+
43
63
  ## Dependencies
44
64
 
45
65
  ### Used by
@@ -49,6 +69,7 @@
49
69
  - [SKeyValueTable](../SKeyValueTable)
50
70
  - [SSectionHeaderCard](../SSectionHeaderCard)
51
71
  - [SStepper](../SStepper)
72
+ - [STable](../STable)
52
73
 
53
74
  ### Depends on
54
75
 
@@ -66,5 +87,6 @@ graph TD;
66
87
  SKeyValueTable --> STooltip
67
88
  SSectionHeaderCard --> STooltip
68
89
  SStepper --> STooltip
90
+ STable --> STooltip
69
91
  style STooltip fill:#f9f,stroke:#333,stroke-width:4px
70
92
  ```