sellmate-design-system-react 9.0.0-beta.60 → 9.0.0-beta.62

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 (43) hide show
  1. package/AGENTS.md +33 -10
  2. package/dist/components/SBadge/README.md +1 -0
  3. package/dist/components/SBadge/SBadge.d.ts +1 -1
  4. package/dist/components/SBarChart/README.md +15 -0
  5. package/dist/components/SBarChart/SBarChart.d.ts +15 -1
  6. package/dist/components/SBarChart/index.d.ts +1 -1
  7. package/dist/components/SCalendarBoard/README.md +2 -1
  8. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +2 -2
  9. package/dist/components/SCalendarBoard/types.d.ts +1 -1
  10. package/dist/components/SCallout/README.md +1 -0
  11. package/dist/components/SCallout/SCallout.d.ts +6 -1
  12. package/dist/components/SChip/README.md +25 -0
  13. package/dist/components/SChip/SChip.d.ts +8 -0
  14. package/dist/components/SChip/index.d.ts +1 -1
  15. package/dist/components/SDonutChart/README.md +91 -0
  16. package/dist/components/SDonutChart/SDonutChart.d.ts +70 -0
  17. package/dist/components/SDonutChart/index.d.ts +1 -0
  18. package/dist/components/SGhostButton/README.md +2 -0
  19. package/dist/components/SLineChart/README.md +15 -0
  20. package/dist/components/SLineChart/SLineChart.d.ts +15 -1
  21. package/dist/components/SLineChart/index.d.ts +1 -1
  22. package/dist/components/SLineChart/lineChart.config.d.ts +11 -7
  23. package/dist/components/SMeatballButton/README.md +67 -0
  24. package/dist/components/SMeatballButton/SMeatballButton.d.ts +36 -0
  25. package/dist/components/SMeatballButton/index.d.ts +1 -0
  26. package/dist/components/SPieChart/README.md +91 -0
  27. package/dist/components/SPieChart/SPieChart.d.ts +69 -0
  28. package/dist/components/SPieChart/index.d.ts +1 -0
  29. package/dist/index.cjs +702 -230
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.js +698 -230
  33. package/dist/index.js.map +1 -1
  34. package/dist/lib/chart/cartesian.d.ts +2 -2
  35. package/dist/lib/chart/radial.d.ts +89 -0
  36. package/dist/lib/chart/tooltip.d.ts +18 -1
  37. package/dist/lib/dropdown-menu.d.ts +19 -0
  38. package/dist/llms-full.txt +361 -22
  39. package/dist/llms.txt +53 -23
  40. package/dist/styles.css +85 -0
  41. package/dist/theme.css +62 -0
  42. package/eslint/scale.gen.mjs +2 -2
  43. package/package.json +1 -1
@@ -47,13 +47,13 @@
47
47
 
48
48
  | 분류 | 컴포넌트 |
49
49
  | --- | --- |
50
- | **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
50
+ | **버튼·링크** | `SButton` `SGhostButton` `SMeatballButton`(⋯ 로 '더 보기' 메뉴를 여는 아이콘 버튼) `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
51
51
  | **입력 (폼)** | `SForm` `SField` `SInput` `SChatInput`(대화 입력창) `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
52
52
  | **날짜·시간** | `SCalendar` `SCalendarBoard`(한 달치 일정 판) `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
53
53
  | **표·목록** | `SChatMessage`(대화의 메시지 한 건) `SChatAttachedFile`(입력창 위, 아직 보내지 않은 첨부 한 칸) `SChatFile`(대화 흐름에 선, 보낸 파일 한 칸) `SChatSystemMessage`(대화 흐름 가운데 서는 시스템 안내) `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
54
54
  | **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SLauncherListBox`(런처 버튼을 눌러 뜨는 서비스 목록) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SLoginCard`(통합 계정 로그인 화면의 카드) `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
55
55
  | **내비게이션** | `STabs` `SPagination` `SStepper` |
56
- | **차트** | `SBarChart`(막대 그래프 — 항목끼리 크기를 견준다. `stacked` 로 항목 안의 구성까지) `SLineChart`(꺾은선 그래프 — 순서가 있는 항목의 추이를 본다. `area` 로 크기까지, `stacked` 로 구성까지) |
56
+ | **차트** | `SBarChart`(막대 그래프 — 항목끼리 크기를 견준다. `stacked` 로 항목 안의 구성까지) `SLineChart`(꺾은선 그래프 — 순서가 있는 항목의 추이를 본다. `area` 로 크기까지, `stacked` 로 구성까지) `SPieChart`(원그래프 — 한 시점의 전체를 몇 개의 몫으로 나눈다) `SDonutChart`(도넛 그래프 — 가운데가 빈 원그래프. 구멍에 글자를 두지 않는다) |
57
57
  | **표시·상태** | `STag` `SBadge` `SIcon` `SLogo`(브랜드 로고를 아이콘처럼 — size 는 높이다) `SImage` `SCallout` `SGuide` |
58
58
  | **진행·로딩** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
59
59
  | **오버레이** | `STooltip` `SPopover` `SPopup` `SDrawer` `SPortal` |
@@ -80,7 +80,7 @@ AI 에이전트는 코드를 생성하기 전에 이 목록을 반드시 지킨
80
80
 
81
81
  | 금지 | 대신 사용 |
82
82
  | --- | --- |
83
- | `<button>` | `SButton`, `SGhostButton`, `SDropdownButton`, `STextLink` |
83
+ | `<button>` | `SButton`, `SGhostButton`, `SMeatballButton`, `SDropdownButton`, `STextLink` |
84
84
  | `<input type="text/password/...">` | `SInput` |
85
85
  | `<input type="search">` | `SSearchInput` |
86
86
  | `<input type="number">` | `SNumberInput` |
@@ -175,8 +175,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
175
175
  | 층 | 무엇인가 | 컴포넌트 |
176
176
  | --- | --- | --- |
177
177
  | **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SGnbSystem`(GNB 맨 아래 판 · 전폭 상단바 오른쪽 끝) `SPage` `SPageHeader`(`SLayout` 안에서 `SPage` 앞에 둔다) |
178
- | **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SChatMessage` `SChatSystemMessage` `SChatInput` `SLoginCard`(유일하게 `SPage` 밖에 선다 — 로그인 화면 자체가 자기 자리다, §4-6) `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `SBarChart` `SLineChart` `STabs` `SStepper` `SPagination` `SDivider` |
179
- | **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SChatAttachedFile` `SChatFile` `SImage` `SLinearProgress` `SCircleProgress` |
178
+ | **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SChatMessage` `SChatSystemMessage` `SChatInput` `SLoginCard`(유일하게 `SPage` 밖에 선다 — 로그인 화면 자체가 자기 자리다, §4-6) `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `SBarChart` `SLineChart` `SPieChart` `SDonutChart` `STabs` `SStepper` `SPagination` `SDivider` |
179
+ | **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SMeatballButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SChatAttachedFile` `SChatFile` `SImage` `SLinearProgress` `SCircleProgress` |
180
180
  | **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `SLogo` `STextLink` `SChip` |
181
181
  | **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SAccountListBox`(계정 행에 붙어 뜬다 — 직접 띄우지 않는다) `SLauncherListBox`(런처 버튼에 붙어 뜬다 — 직접 띄우지 않는다) `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
182
182
 
@@ -262,7 +262,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
262
262
  | 용도 | 클래스 |
263
263
  | --- | --- |
264
264
  | 페이지/섹션 제목 | `typo-heading-lg`(18px) · `typo-heading-md`(16px) · `typo-heading-sm`(14px) · `typo-heading-xs`(12px) |
265
- | 본문 | `typo-body-lg-*` (16px) · `typo-body-md-*`(14px) · `typo-body-sm-*`(12px) · `typo-body-xs-default`(11px) — `*` = `default`/`medium`/`bold` |
265
+ | 카드·아이템 안의 메인 수치 데이터 | `typo-heading-xl`(24px) — 제목에 쓰지 않는다 |
266
+ | 본문 | `typo-body-lg-*` (16px) · `typo-body-md-*`(14px) · `typo-body-sm-*`(12px) · `typo-body-xs-default`(11px) — `*` = `default`/`medium`/`semibold`/`bold` |
266
267
  | 테이블 | `typo-table-header` · `typo-table-body` · `typo-table-accent` |
267
268
  | 컨트롤·필드·피드백·내비 | `typo-control-*` `typo-field-*` `typo-feedback-*` `typo-navigation-*` (컴포넌트 내부용 — 직접 쓸 일은 드묾) |
268
269
 
@@ -332,7 +333,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
332
333
  | `SCheckbox` | **`gap-sd-24`** | `gap-sd-8` |
333
334
  | `SRadio` | **`gap-sd-24`** | `gap-sd-8` |
334
335
  | `STextLink` | **`gap-sd-16`**(sm) / **`gap-sd-24`**(md·lg) | `gap-sd-4` |
335
- | `SGhostButton` | `gap-sd-4` | `gap-sd-4` |
336
+ | `SGhostButton` · `SMeatballButton` | `gap-sd-4` | `gap-sd-4` |
336
337
  | `SButton` | `gap-sd-8` (xs·sm·md) / **`gap-sd-12`**(lg) | 〃 |
337
338
  | `STag` | `gap-sd-8` | `gap-sd-8` |
338
339
  | `SToggle` | `gap-sd-8` | `gap-sd-8` |
@@ -573,10 +574,12 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
573
574
  | 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 |
574
575
  | 사용자가 순서를 드래그로 바꾸게 한다 | `SDraggableList` + `SDraggableItem` | §3-7-6 |
575
576
  | 날짜별 일정을 한 달치 격자로 펼쳐 보여준다 | `SCalendarBoard` | §3-7-4 |
576
- | 항목끼리 크기를 눈으로 견주게 한다 (기간별 추이·채널별 비중) | `SBarChart` | 정확한 값을 읽어야 하면 `STable` — 그래프는 "어느 쪽이 큰가" 를 답하지 "얼마인가" 를 답하지 않는다 |
577
+ | 항목끼리 크기를 눈으로 견주게 한다 (채널별 매출·상품별 판매량) | `SBarChart` | 정확한 값을 읽어야 하면 `STable` — 그래프는 "어느 쪽이 큰가" 를 답하지 "얼마인가" 를 답하지 않는다 |
577
578
  | 순서가 있는 항목의 **추이**를 보여준다 (일·월별 매출 흐름, 기간별 방문 수) | `SLineChart` | 항목 순서에 뜻이 없으면(채널별·상품별) `SBarChart` — 선은 "이어진다" 는 뜻을 덤으로 얹어, 순서 없는 항목을 이으면 없는 흐름을 만든다. 항목이 대여섯 개 안쪽이고 크기를 견주는 것이 목적이면 막대가 낫다 |
578
579
  | 여러 항목의 추이를 **합계와 함께** 보여준다 (채널별 매출이 쌓여 전체가 되는 흐름) | `SLineChart stacked area` | 합계가 뜻을 갖는 값일 때만 쌓는다. 음수가 섞이거나 더해서 뜻이 없는 값(비율·평균)은 쌓지 말고 겹쳐 그린다 |
579
580
  | 항목의 크기와 **그 안의 구성**을 함께 보여준다 (주문 상태별 내역, 유입 경로별 몫) | `SBarChart stacked` | 계열끼리 견주는 것이 목적이면 `stacked` 없이 나란히 세운다. 더해서 뜻이 없는 값(비율·평균)은 쌓지 않는다 — 합계 라벨이 거짓말이 된다 |
581
+ | 한 시점의 **전체를 몇 개의 몫으로** 나눠 보여준다 (채널별 매출 비중, 회원 등급 구성) | `SPieChart` | 조각이 대여섯 개를 넘거나 몫끼리 크기를 견주는 것이 목적이면 `SBarChart` — 사람은 각도보다 길이를 정확히 견준다. 순서가 있는 추이(월별)는 몫이 아니라 흐름이라 `SLineChart`. 0·음수는 그려지지 않으므로 증감은 원으로 나타내지 않는다. 조각은 큰 순으로 넘긴다. 폭은 부모를 따르고 그림은 그 폭의 정사각형이다 — 폭이 필요하면 `className` 으로 폭만 주고 높이는 주지 않는다 (`SDonutChart` 도 같다) |
582
+ | 한 시점의 전체를 몫으로 나누되 **가운데가 빈 고리 모양**으로 보여준다 (시안이 도넛일 때) | `SDonutChart` | 쓰임·데이터 규칙은 `SPieChart` 와 같고 모양만 다르다 — 시안이 정한 쪽을 쓴다. **구멍에 합계·라벨을 겹쳐 올리지 않는다.** 합계 같은 값이 필요하면 차트 바깥(카드 제목·요약 값)에 적는다. 여러 기간에 걸친 구성 변화는 원을 여러 개 늘어놓지 말고 `SBarChart stacked` |
580
583
  | 표 위에 건수 요약과 액션을 얹는다 | `STableBar` | 표의 이름도 여기 `title` 슬롯에 넣는다 — 제목만으로 블록을 따로 세우지 않는다. §4-2 |
581
584
  | 상태·분류를 라벨로 찍는다 | `STag` | §3-1 |
582
585
  | 색 점만으로 상태를 찍는다 | `SBadge` | §3-1 |
@@ -591,6 +594,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
591
594
  | --- | --- | --- |
592
595
  | 라벨이 있는 일반 액션을 준다 | `SButton` | §3-5 |
593
596
  | 아이콘 하나로 뜻이 통하는 부가 조작을 준다 | `SGhostButton` | §3-5-5 |
597
+ | 자리가 좁아 부가 조작 여러 개를 ⋯ 뒤 메뉴로 접어 둔다 | `SMeatballButton` | §3-5-5 |
594
598
  | 한 버튼에 여러 선택지를 매단다 | `SDropdownButton` | §3-5-4 |
595
599
  | GNB system 패널에서 한 줄짜리 행 액션을 준다 | `SSystemActionButton` | §3-5-7 |
596
600
 
@@ -690,7 +694,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
690
694
  | --- | --- |
691
695
  | `default` | 흰 면 위 (`SPage background="frame"`) — 옅은 회색 면이라 페이지와 구분된다 |
692
696
  | `white` | 회색 면 위 (`background="neutral"`·`"screen"`) — 그 위에서는 `default` 가 배경에 묻힌다 |
693
- | `danger` | 경고. 좌측에 "주의사항" 타이틀이 붙으므로 단순 안내에는 쓰지 않는다 |
697
+ | `danger` | 경고. 좌측에 "주의사항" 타이틀이 붙으므로 단순 안내에는 쓰지 않는다. 주변에 이미 경고 맥락(제목 등)이 있어 타이틀이 중복되면 `showTitle={false}` 로 타이틀만 뺀다 — 경고 면은 유지된다 |
694
698
 
695
699
  ### 3-3. 플로팅/오버레이류
696
700
 
@@ -1213,6 +1217,7 @@ tableRef.current.scrollToRow(row); // 복원
1213
1217
  | 일반 액션 | `SButton` (`color`: `primary` / `secondary` / `neutral` / `danger`, `outline`, `size`: xs~md) |
1214
1218
  | **삭제 등 파괴적 액션** | **`SButton color="danger"`** 또는 **`color="danger" outline`** (아래 3-5-3) |
1215
1219
  | **아이콘 하나로 뜻이 통하는 부가 조작** | **`SGhostButton`** — 라벨이 없는 아이콘 전용 버튼 (아래 3-5-5) |
1220
+ | **부가 조작 여러 개를 ⋯ 메뉴로 접기** | **`SMeatballButton`** — ⋯ 아이콘 버튼 + `SDropdownButton` 과 같은 메뉴 (아래 3-5-5) |
1216
1221
  | 본문 속 이동 링크 | `STextLink` |
1217
1222
  | 메인 액션 + 부가 메뉴 | `SDropdownButton` |
1218
1223
  | **GNB system 패널의 한 줄 액션** | **`SSystemActionButton`** — 행 전체가 버튼인 표면형 (아래 3-5-7) |
@@ -1326,6 +1331,24 @@ tableRef.current.scrollToRow(row); // 복원
1326
1331
  ❌ <SGhostButton icon="download" ariaLabel="엑셀 다운로드" /> // 목록의 주 액션 → SButton
1327
1332
  ```
1328
1333
 
1334
+ ##### `SMeatballButton` — ⋯ 뒤에 메뉴를 접어 둘 때
1335
+
1336
+ 자리가 좁아 부가 조작을 하나하나 아이콘으로 늘어놓을 수 없을 때, **⋯ 하나로 접고 누르면 메뉴를 띄운다.** 버튼의 크기·색·hover·툴팁은 `SGhostButton` 과, 메뉴 모양은 `SDropdownButton` 과 같다.
1337
+
1338
+ - **메뉴는 컴포넌트가 띄운다.** `items` 를 넘기고 선택은 `onItemClick(value)` 로 받는다. 메뉴를 따로 만들어 붙이지 않고, 열림 상태(`aria-expanded`)도 직접 넣지 않는다.
1339
+ - **`SGhostButton icon="etc"` 로 직접 만들지 않는다.** '더 보기' 메뉴는 항상 `SMeatballButton` 이다.
1340
+ - **`intent` 는 `default` / `inverse` 뿐이다.** ⋯ 는 조작이 아니라 메뉴를 여는 것이므로 `action`·`danger` 색을 받지 않는다. 어두운 배경 위에서만 `inverse`.
1341
+ - 툴팁·`ariaLabel` 은 기본 문구가 들어 있어 **주지 않아도 된다.** 한 화면에 ⋯ 가 여러 개라 무엇의 메뉴인지 구분해야 할 때만 `tooltipText` 를 바꾼다(`ariaLabel` 이 따라간다).
1342
+ - 메인 액션에 변형 동작을 곁들이는 것이면 `SMeatballButton` 이 아니라 `SDropdownButton split`(§3-5-4)이다.
1343
+
1344
+ ```tsx
1345
+ ✅ <SMeatballButton size="xs" // 행 끝 부가 조작 묶음
1346
+ items={[{ value: 'copy', label: '복제', icon: 'copy' }, { value: 'remove', label: '삭제', icon: 'remove' }]}
1347
+ onItemClick={v => handleRowAction(row, v)} />
1348
+ ✅ <SMeatballButton intent="inverse" items={items} onItemClick={onAction} /> // 어두운 배경 위
1349
+ ❌ <SGhostButton icon="etc" ariaLabel="더 보기" onClick={openMyMenu} /> // 직접 조립 → SMeatballButton
1350
+ ```
1351
+
1329
1352
  #### 3-5-6. 그 밖
1330
1353
 
1331
1354
  - 라벨은 **동사(+목적어)** — `저장` · `적치 지시` · `송장 재출력`
@@ -1691,7 +1714,7 @@ useEffect(() => {
1691
1714
  - **`SCalendar` 와 `SCalendarBoard` 는 방향이 반대다.** `SCalendar` 는 날짜를 **고르는** 달력(칸에는 점만 찍힌다)이고, `SCalendarBoard` 는 일정을 **읽는** 달력이다 — 칸마다 일정이 줄로 쌓이고, 칸 높이에 담기는 줄 수를 넘으면 "N개 더보기" 로 접히고, **"더보기" 또는 일정이 있는 칸 아무 데나** 누르면 **그 칸을 덮으며 뜨는 판**에 그 날짜의 일정이 전부 펼쳐진다. 폭도 다르다: `SCalendar` 는 제 폭을 갖는 요소, `SCalendarBoard` 는 페이지 폭을 채우는 블록이다.
1692
1715
  - **`SCalendarBoard` 는 기본이 읽기 전용 판이다.** 날짜 칸을 눌러 **고르게** 하려면 `selectable` 을 켠다 — 켜야 `onValueChange(date, events)` 로 고른 날짜와 **그 날짜의 일정**이 함께 온다. 다만 **일정이 있는 칸은 `selectable` 과 무관하게 눌린다** — 그때는 목록 판이 열린다. 둘 다 켜져 있으면 고르기와 열기가 함께 일어난다. 일정 버튼과 "N개 더보기" 도 항상 눌린다.
1693
1716
  - **칸 배경과 일정 색은 다른 층이다.** 그날의 성격(마감·완료·휴무 등)은 `dayColors` 로 **칸 전체**에 칠하고(`default` `danger` `accent` `complete` `dim`), 일정 하나의 색은 `events[].color` 로 준다. 둘을 섞어 쓰면 서로를 가리지 않고 함께 읽힌다.
1694
- - 일정 왼쪽의 색 점은 `SBadge` 다 — `events[].color` 프리셋이 점 색까지 정하고, 따로 주려면 `dotColor` 에 `SBadge` 9색 중 하나를 넣는다 (§3-1).
1717
+ - 일정 왼쪽의 색 점은 `SBadge` 다 — `events[].color` 프리셋이 점 색까지 정하고, 따로 주려면 `dotColor` 에 `SBadge` 색(`SBadgeColor`) 중 하나를 넣는다 (§3-1).
1695
1718
  - **칸 본문을 통째로 바꾸려면 `dayContent` 다.** 일정으로 표현되지 않는 그날치 요약(재고·매출 같은)을 칸에 얹을 때 쓴다. **슬롯을 준 날짜는 그 날짜의 `events` 를 그리지 않고 목록 판도 열지 않는다** — 한 칸에 둘을 겹쳐 담지 않는다. 일정과 요약을 함께 보여야 하면 요약을 일정 한 건(`events[]`)으로 넣는다.
1696
1719
  - **`SCalendarBoard` 는 높이를 부모에게서 받는다.** 행이 그 높이를 균등하게 나눠 갖고, 칸 높이가 다시 "한 칸에 몇 줄이 보일지" 를 정한다. 그래서 **놓는 자리에 높이를 준다** — 페이지 본문의 남은 높이를 채우려면 `SPage` 안에서 스택을 `flex-1 min-h-0` 으로 두고 판에 `h-full` 을 준다. 높이를 주지 않으면 칸이 최소 높이로 주저앉아 한두 줄만 보인다.
1697
1720
  - **한 칸에 몇 줄을 펼칠지는 컴포넌트가 잰다.** 조절하는 prop 이 없다 — 칸 높이에서 나오는 값이라 따로 정할 것이 아니다. 줄이 넘치면 마지막 한 줄을 "N개 더보기" 에 내주므로 **접히든 아니든 칸 높이가 같다.** **소비 앱이 `events` 를 미리 잘라 넘기지 않는다.** 잘라 넘기면 "N개 더보기" 의 수가 실제 건수와 어긋나고, 눌러도 나머지가 나오지 않는다.
@@ -2770,16 +2793,16 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2770
2793
  ### 색상 팔레트 (text-{family}-{step}, bg-…, border-…)
2771
2794
  - white
2772
2795
  - black
2773
- - grey: 10 20 25 30 35 45 50 55 60 65 70 80 85 90 95 05 strong subtle
2774
- - red: 15 20 30 45 60 70 75 80 85 90 95 99 strong subtle
2775
- - orange: 10 20 35 45 55 60 65 75 85 90 95 99 strong subtle
2796
+ - grey: 10 20 25 30 35 45 50 55 60 65 70 80 85 90 95 05 strong moderate subtle
2797
+ - red: 15 20 30 45 60 70 75 80 85 90 95 99 strong moderate subtle
2798
+ - orange: 10 20 35 45 55 60 65 75 85 90 95 99 strong moderate subtle
2776
2799
  - yellow: 10 20 25 30 40 45 50 60 70 80 90 95 strong moderate subtle
2777
2800
  - olive: 10 15 20 30 45 55 65 70 80 90 95 05
2778
- - green: 15 25 45 55 65 70 75 80 85 90 95 99 strong subtle
2801
+ - green: 15 25 45 55 65 70 75 80 85 90 95 99 strong moderate subtle
2779
2802
  - steelblue: 10 25 45 60 65 70 75 80 85 90 95 99
2780
2803
  - oceanblue: 15 25 50 60 65 70 75 80 85 90 95 99
2781
2804
  - brilliantblue: 10 20 25 40 50 60 70 75 80 85 90 95 99 05
2782
- - purple: 15 25 45 55 65 70 75 80 85 90 95 99 strong subtle
2805
+ - purple: 15 25 45 55 65 70 75 80 85 90 95 99 strong moderate subtle
2783
2806
  - bg: screen frame brand subtle accent accentLight accentBright accentFaint deep danger dangerLight warning caution progress success neutralLight neutralBright tableHeader
2784
2807
  - fg: primary secondary tertiary quaternary brand subtleWarm subtleCool deep success successLight dangerLight accent accentLight danger warning inverse
2785
2808
  - border: default strong bold accent accentLight danger warning success
@@ -2787,13 +2810,13 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2787
2810
  - link: accent
2788
2811
  - divider: default
2789
2812
  - lightblue: strong subtle
2790
- - blue: strong subtle
2791
- - darkblue: strong subtle
2792
- - indigo: strong subtle
2813
+ - blue: strong moderate subtle
2814
+ - darkblue: strong moderate subtle
2815
+ - indigo: strong moderate subtle
2793
2816
  - primary: 10 20 25 40 50 60 70 75 80 85 90 95 99 05
2794
- - danger: 15 20 30 45 60 70 75 80 85 90 95 99 strong subtle
2795
- - success: 15 25 45 55 65 70 75 80 85 90 95 99 strong subtle
2796
- - warning: 10 20 35 45 55 60 65 75 85 90 95 99 strong subtle
2817
+ - danger: 15 20 30 45 60 70 75 80 85 90 95 99 strong moderate subtle
2818
+ - success: 15 25 45 55 65 70 75 80 85 90 95 99 strong moderate subtle
2819
+ - warning: 10 20 35 45 55 60 65 75 85 90 95 99 strong moderate subtle
2797
2820
 
2798
2821
  ### 타이포그래피 프리셋 (클래스 하나로 size/weight/line-height 적용)
2799
2822
  | 클래스 | size | weight | line-height |
@@ -2803,6 +2826,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2803
2826
  | typo-heading-sm | 14px | 700 | 24px |
2804
2827
  | typo-heading-md | 16px | 700 | 26px |
2805
2828
  | typo-heading-lg | 18px | 700 | 30px |
2829
+ | typo-heading-xl | 24px | 700 | 38px |
2806
2830
  | typo-body-xs-default | 11px | 400 | 18px |
2807
2831
  | typo-body-sm-default | 12px | 400 | 20px |
2808
2832
  | typo-body-sm-medium | 12px | 500 | 20px |
@@ -2814,6 +2838,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2814
2838
  | typo-body-md-bold | 14px | 700 | 24px |
2815
2839
  | typo-body-lg-default | 16px | 400 | 26px |
2816
2840
  | typo-body-lg-medium | 16px | 500 | 26px |
2841
+ | typo-body-lg-semibold | 16px | 600 | 26px |
2817
2842
  | typo-body-lg-bold | 16px | 700 | 26px |
2818
2843
  | typo-control-xs-default | 12px | 400 | 20px |
2819
2844
  | typo-control-xs-medium | 12px | 500 | 20px |
@@ -2827,6 +2852,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2827
2852
  | typo-feedback-xs | 11px | 500 | 18px |
2828
2853
  | typo-feedback-sm-regular | 12px | 400 | 20px |
2829
2854
  | typo-feedback-sm-medium | 12px | 500 | 20px |
2855
+ | typo-feedback-sm-semibold | 12px | 600 | 20px |
2830
2856
  | typo-feedback-sm-bold | 12px | 700 | 20px |
2831
2857
  | typo-feedback-sm-underline | 12px | 500 | 20px |
2832
2858
  | typo-feedback-md-bold | 14px | 700 | 24px |
@@ -2877,6 +2903,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2877
2903
  --sys-color-bg-success
2878
2904
  --sys-color-bg-tableHeader
2879
2905
  --sys-color-bg-warning
2906
+ --sys-color-blue-moderate
2880
2907
  --sys-color-blue-strong
2881
2908
  --sys-color-blue-subtle
2882
2909
  --sys-color-border-accent
@@ -2888,6 +2915,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2888
2915
  --sys-color-border-success
2889
2916
  --sys-color-border-warning
2890
2917
  --sys-color-control-bg-inverseHover
2918
+ --sys-color-darkblue-moderate
2891
2919
  --sys-color-darkblue-strong
2892
2920
  --sys-color-darkblue-subtle
2893
2921
  --sys-color-disabled-bg
@@ -2923,6 +2951,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2923
2951
  --sys-color-field-text-default
2924
2952
  --sys-color-field-text-placeholder
2925
2953
  --sys-color-field-text-readOnly
2954
+ --sys-color-indigo-moderate
2926
2955
  --sys-color-indigo-strong
2927
2956
  --sys-color-indigo-subtle
2928
2957
  --sys-color-lightblue-strong
@@ -2942,6 +2971,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
2942
2971
  --sys-color-purple-90
2943
2972
  --sys-color-purple-95
2944
2973
  --sys-color-purple-99
2974
+ --sys-color-purple-moderate
2945
2975
  --sys-color-purple-strong
2946
2976
  --sys-color-purple-subtle
2947
2977
 
@@ -3098,6 +3128,7 @@ export const BADGE_COLORS = [
3098
3128
  'blue',
3099
3129
  'darkblue',
3100
3130
  'indigo',
3131
+ 'purple',
3101
3132
  'grey',
3102
3133
  ] as const;
3103
3134
  ```
@@ -3138,6 +3169,7 @@ export const BADGE_COLORS = [
3138
3169
  | `showTooltip?` | `boolean` | `true` | 막대에 마우스를 올리면 값 상자를 띄운다 |
3139
3170
  | `formatValue?` | `(value: number) => string` | `defaultFormat` | 값 표시 형식 |
3140
3171
  | `height?` | `number \| string` | — | 차트 높이. **아래 축 텍스트까지 포함한 값**이다 — 그림은 그만큼 줄어든다 |
3172
+ | `tooltipFooter?` | `(category: SBarChartTooltipCategory) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락 (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
3141
3173
  | `className?` | `string` | — | |
3142
3174
  | `style?` | `CSSProperties` | — | |
3143
3175
 
@@ -3218,6 +3250,20 @@ export interface SBarChartPoint {
3218
3250
  }
3219
3251
  ```
3220
3252
 
3253
+ ### SBarChartTooltipCategory
3254
+
3255
+ ```ts
3256
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
3257
+ export interface SBarChartTooltipCategory {
3258
+ /** 카테고리 인덱스 */
3259
+ categoryIndex: number;
3260
+ /** 카테고리 이름 */
3261
+ name: string;
3262
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다 */
3263
+ points: SBarChartPoint[];
3264
+ }
3265
+ ```
3266
+
3221
3267
  ---
3222
3268
 
3223
3269
  # SBarcodeInput
@@ -3478,7 +3524,7 @@ export interface SCalendarBoardEvent {
3478
3524
  label: string;
3479
3525
  /** 색상 프리셋 — 배경과 점 색이 함께 정해진다 */
3480
3526
  color?: SCalendarBoardEventColor;
3481
- /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 9색을 쓴다 */
3527
+ /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 색(`SBadgeColor`)을 쓴다 */
3482
3528
  dotColor?: SBadgeColor;
3483
3529
  /** 본문 텍스트 — 예: `"RV20260728-000006"`. 평문만 받는다 */
3484
3530
  description?: string;
@@ -3526,6 +3572,7 @@ export const CALENDAR_BOARD_EVENT_COLORS = [
3526
3572
  'yellow',
3527
3573
  'orange',
3528
3574
  'red',
3575
+ 'purple',
3529
3576
  'white',
3530
3577
  ] as const;
3531
3578
  ```
@@ -3555,6 +3602,7 @@ export const CALENDAR_BOARD_EVENT_COLORS = [
3555
3602
  | Prop | Type | Default | Description |
3556
3603
  |------|------|---------|-------------|
3557
3604
  | `type?` | `SCalloutType` | `'default'` | 콜아웃 타입 (색상·아이콘·타이틀 결정). - `default` — 옅은 회색 면. 흰 페이지(`background="frame"`) 위의 기본 안내. - `white` — 같은 안내인데 배경만 흰 면. 회색 면(`neutral`·`screen`) 위에서 default 가 묻힐 때. - `danger` — 좌측에 주의사항 타이틀이 붙는 경고. |
3605
+ | `showTitle?` | `boolean` | `true` | `danger` 좌측의 주의사항 타이틀(아이콘+라벨) 표시 여부. 기본 `true`. `false` 면 타이틀만 빠지고 danger 의 면·테두리·본문색은 그대로다. 다른 타입에는 영향이 없다. |
3558
3606
  | `message?` | `SCalloutMessage[]` | `[]` | 표시할 메시지 목록 (배열 중첩으로 depth 표현). 각 문자열은 인라인 HTML(`<b>`, `<a>` 등)을 허용하며 sanitizeInlineHtml 로 살균 후 렌더된다. |
3559
3607
  | `children?` | `ReactNode` | — | message 대신 직접 본문을 넣을 때 |
3560
3608
  | `className?` | `string` | — | |
@@ -3863,6 +3911,7 @@ export type SCheckboxValue = boolean | unknown[] | null;
3863
3911
 
3864
3912
  | Prop | Type | Default | Description |
3865
3913
  |------|------|---------|-------------|
3914
+ | `color?` | `SChipColor` | — | 색상. 주지 않으면 기본 회색 칩이다. 색은 기본 상태에만 입힌다 — error·편집 중·disabled 는 상태 토큰이 우선한다. 색상은 컴포넌트 토큰 `--cmp-chip-chip-<color>-{bg,content,border}` 를 참조한다. |
3866
3915
  | `name?` | `string` | — | 폼 연동용 name |
3867
3916
  | `value?` | `string` | `''` | 칩 텍스트 값 |
3868
3917
  | `error?` | `boolean` | — | 에러 상태 |
@@ -3890,6 +3939,30 @@ export type SCheckboxValue = boolean | unknown[] | null;
3890
3939
  | `focus` | `() => void` | 편집 input에 포커스합니다. |
3891
3940
  | `getNativeElement` | `() => HTMLElement \| null` | 네이티브 편집 엘리먼트를 반환합니다. |
3892
3941
 
3942
+ ## Types
3943
+
3944
+ ### SChipColor
3945
+
3946
+ ```ts
3947
+ export type SChipColor = (typeof CHIP_COLORS)[number];
3948
+ ```
3949
+
3950
+ ### CHIP_COLORS
3951
+
3952
+ ```ts
3953
+ export const CHIP_COLORS = [
3954
+ 'red',
3955
+ 'orange',
3956
+ 'yellow',
3957
+ 'green',
3958
+ 'blue',
3959
+ 'darkblue',
3960
+ 'indigo',
3961
+ 'purple',
3962
+ 'grey',
3963
+ ] as const;
3964
+ ```
3965
+
3893
3966
  ## Dependencies
3894
3967
 
3895
3968
  ### Used by
@@ -4742,6 +4815,99 @@ export type SDateRangePickerSize = SFieldSize;
4742
4815
 
4743
4816
  ---
4744
4817
 
4818
+ # SDonutChart
4819
+
4820
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4821
+
4822
+ ### SDonutChart
4823
+
4824
+ #### Props
4825
+
4826
+ | Prop | Type | Default | Description |
4827
+ |------|------|---------|-------------|
4828
+ | `data` | `SDonutChartSlice[]` | — | 조각 목록. 주는 순서대로 12시에서 시계 방향으로 그린다 — 보통 큰 순으로 준다 |
4829
+ | `palette?` | `SDonutChartPalette` | `'multi'` | 색 팔레트. `custom` 일 때만 `colors` 를 본다 |
4830
+ | `colors?` | `SDonutChartColor[]` | — | `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 |
4831
+ | `showValueLabel?` | `boolean` | `false` | 고리 위에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 |
4832
+ | `showLegend?` | `boolean` | `true` | 범례를 보인다 |
4833
+ | `legendPosition?` | `SDonutChartLegendPosition` | `'top'` | 범례 위치 |
4834
+ | `showTooltip?` | `boolean` | `true` | 조각에 마우스를 올리면 값 상자를 띄운다 |
4835
+ | `formatValue?` | `(value: number) => string` | — | 값 표시 형식 |
4836
+ | `tooltipFooter?` | `(slice: SDonutChartSlicePoint) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락 (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
4837
+ | `className?` | `string` | — | 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 |
4838
+ | `style?` | `CSSProperties` | — | |
4839
+
4840
+ #### Events
4841
+
4842
+ | Event | Type | Description |
4843
+ |-------|------|-------------|
4844
+ | `onSliceClick` | `(slice: SDonutChartSlicePoint) => void` | 조각을 눌렀을 때 |
4845
+
4846
+ ## Types
4847
+
4848
+ ### SDonutChartSlice
4849
+
4850
+ ```ts
4851
+ /** 조각 하나 — 범례 한 줄에 대응한다. */
4852
+ export interface SDonutChartSlice {
4853
+ /** 범례·툴팁에 표시할 이름 */
4854
+ name: string;
4855
+ /** 값. 0·음수는 그리지 않는다 — 원은 전체에 대한 몫만 나타낼 수 있다 */
4856
+ value: number;
4857
+ }
4858
+ ```
4859
+
4860
+ ### SDonutChartPalette
4861
+
4862
+ ```ts
4863
+ /**
4864
+ * 색 팔레트. 조각마다 색이 달라야 하므로 한 색(`default`)은 없다.
4865
+ * - `multi` 서로 무관한 항목(11색)을 순서대로
4866
+ * - `gradation` 한 지표의 단계(6색)를 진한 쪽부터 순서대로 — 조각을 큰 순으로 줄 때
4867
+ * - `custom` `colors` 로 고른 색을 순서대로
4868
+ */
4869
+ export type SDonutChartPalette = 'multi' | 'gradation' | 'custom';
4870
+ ```
4871
+
4872
+ ### SDonutChartColor
4873
+
4874
+ ```ts
4875
+ /**
4876
+ * `palette='custom'` 에서 고를 수 있는 색 이름.
4877
+ * positive=늘어남 · negative=줄어듦 · neutral=변화 없음 을 뜻하므로 뜻에 맞게 고른다.
4878
+ */
4879
+ export type SDonutChartColor =
4880
+ | 'positivePrimary'
4881
+ | 'positiveSecondary'
4882
+ | 'negativePrimary'
4883
+ | 'negativeSecondary'
4884
+ | 'neutralPrimary'
4885
+ | 'neutralSecondary';
4886
+ ```
4887
+
4888
+ ### SDonutChartLegendPosition
4889
+
4890
+ ```ts
4891
+ /** 범례 위치. */
4892
+ export type SDonutChartLegendPosition = 'top' | 'bottom';
4893
+ ```
4894
+
4895
+ ### SDonutChartSlicePoint
4896
+
4897
+ ```ts
4898
+ /** 클릭이 가리키는 조각. */
4899
+ export interface SDonutChartSlicePoint {
4900
+ /** `data` 안에서의 인덱스 */
4901
+ index: number;
4902
+ name: string;
4903
+ value: number;
4904
+ /** 그려진 조각 전체의 합에 대한 몫(0~1) */
4905
+ ratio: number;
4906
+ }
4907
+ ```
4908
+
4909
+ ---
4910
+
4745
4911
  # SDraggableItem
4746
4912
 
4747
4913
  > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
@@ -5658,6 +5824,7 @@ export type SGhostButtonIntent = 'default' | 'danger' | 'action' | 'subAction' |
5658
5824
  - [SGnb](../SGnb)
5659
5825
  - [SGuide](../SGuide)
5660
5826
  - [SInput](../SInput)
5827
+ - [SMeatballButton](../SMeatballButton)
5661
5828
  - [SModalContainer](../SModalContainer)
5662
5829
  - [SOverlayHeader](../SOverlayHeader)
5663
5830
  - [SPage](../SPage)
@@ -6518,6 +6685,7 @@ export type SLayoutHeader = SGnbHeader;
6518
6685
  | `showTooltip?` | `boolean` | `true` | 항목에 마우스를 올리면 값 상자를 띄운다 |
6519
6686
  | `formatValue?` | `(value: number) => string` | `defaultFormat` | 값 표시 형식 |
6520
6687
  | `height?` | `number \| string` | — | 차트 높이. **아래 축 텍스트까지 포함한 값**이다 — 그림은 그만큼 줄어든다 |
6688
+ | `tooltipFooter?` | `(category: SLineChartTooltipCategory) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락 (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
6521
6689
  | `className?` | `string` | — | |
6522
6690
  | `style?` | `CSSProperties` | — | |
6523
6691
 
@@ -6598,6 +6766,20 @@ export interface SLineChartPoint {
6598
6766
  }
6599
6767
  ```
6600
6768
 
6769
+ ### SLineChartTooltipCategory
6770
+
6771
+ ```ts
6772
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
6773
+ export interface SLineChartTooltipCategory {
6774
+ /** 카테고리 인덱스 */
6775
+ categoryIndex: number;
6776
+ /** 카테고리 이름 */
6777
+ name: string;
6778
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다. 누적이어도 각 계열이 제 몫으로 가진 값이다 */
6779
+ points: SLineChartPoint[];
6780
+ }
6781
+ ```
6782
+
6601
6783
  ---
6602
6784
 
6603
6785
  # SLinearProgress
@@ -6913,6 +7095,70 @@ export const LOGO_NAMES = ['sellmate'] as const;
6913
7095
 
6914
7096
  ---
6915
7097
 
7098
+ # SMeatballButton
7099
+
7100
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
7101
+
7102
+ ### SMeatballButton
7103
+
7104
+ #### Props
7105
+
7106
+ | Prop | Type | Default | Description |
7107
+ |------|------|---------|-------------|
7108
+ | `size?` | `SMeatballButtonSize` | `'sm'` | 버튼 크기 |
7109
+ | `intent?` | `SMeatballButtonIntent` | `'default'` | 색상 의도. 어두운 배경 위에서는 inverse |
7110
+ | `items?` | `SMeatballButtonItem[]` | `[]` | 메뉴 항목 목록 |
7111
+ | `tooltipText?` | `string` | `'기능 더 보기'` | 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. |
7112
+ | `ariaLabel?` | `string` | — | 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 '기능 더 보기' |
7113
+ | `disabled?` | `boolean` | `false` | 비활성 |
7114
+ | `className?` | `string` | — | 버튼을 감싸는 요소의 클래스. 위치 조정(absolute 배치 등)용 |
7115
+ | `style?` | `CSSProperties` | — | 버튼을 감싸는 요소의 스타일. 위치 조정용 |
7116
+
7117
+ #### Events
7118
+
7119
+ | Event | Type | Description |
7120
+ |-------|------|-------------|
7121
+ | `onItemClick` | `(value: string \| number) => void` | 메뉴 항목 선택 |
7122
+ | `onOpenChange` | `(open: boolean) => void` | 열림/닫힘 변경 |
7123
+
7124
+ #### Methods (ref)
7125
+
7126
+ | Method | Type | Description |
7127
+ |--------|------|-------------|
7128
+ | `open` | `() => void` | 메뉴 열기 |
7129
+ | `close` | `() => void` | 메뉴 닫기 |
7130
+
7131
+ ## Types
7132
+
7133
+ ### SMeatballButtonSize
7134
+
7135
+ ```ts
7136
+ export type SMeatballButtonSize = SGhostButtonSize;
7137
+ ```
7138
+
7139
+ ### SMeatballButtonIntent
7140
+
7141
+ ```ts
7142
+ export type SMeatballButtonIntent = 'default' | 'inverse';
7143
+ ```
7144
+
7145
+ ### SMeatballButtonItem
7146
+
7147
+ ```ts
7148
+ /** 메뉴 항목 — SDropdownButton 과 같은 모양이다 */
7149
+ export type SMeatballButtonItem = SDropdownButtonItem;
7150
+ ```
7151
+
7152
+ ## Dependencies
7153
+
7154
+ ### Depends on
7155
+
7156
+ - [SGhostButton](../SGhostButton)
7157
+
7158
+ ### Graph
7159
+
7160
+ ---
7161
+
6916
7162
  # SModal
6917
7163
 
6918
7164
  > 수작성 문서 — SModal 은 컴포넌트가 아니라 **명령형 모달 서비스**라 `docs:gen`(Props/Events 표) 대상이 아니다.
@@ -7475,6 +7721,99 @@ export const PAGE_CONTENT_WIDTHS = ['full', 'fixed', 'fixedCenter'] as const;
7475
7721
 
7476
7722
  ---
7477
7723
 
7724
+ # SPieChart
7725
+
7726
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
7727
+
7728
+ ### SPieChart
7729
+
7730
+ #### Props
7731
+
7732
+ | Prop | Type | Default | Description |
7733
+ |------|------|---------|-------------|
7734
+ | `data` | `SPieChartSlice[]` | — | 조각 목록. 주는 순서대로 12시에서 시계 방향으로 그린다 — 보통 큰 순으로 준다 |
7735
+ | `palette?` | `SPieChartPalette` | `'multi'` | 색 팔레트. `custom` 일 때만 `colors` 를 본다 |
7736
+ | `colors?` | `SPieChartColor[]` | — | `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 |
7737
+ | `showValueLabel?` | `boolean` | `false` | 조각 안에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 |
7738
+ | `showLegend?` | `boolean` | `true` | 범례를 보인다 |
7739
+ | `legendPosition?` | `SPieChartLegendPosition` | `'top'` | 범례 위치 |
7740
+ | `showTooltip?` | `boolean` | `true` | 조각에 마우스를 올리면 값 상자를 띄운다 |
7741
+ | `formatValue?` | `(value: number) => string` | — | 값 표시 형식 |
7742
+ | `tooltipFooter?` | `(slice: SPieChartSlicePoint) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락 (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
7743
+ | `className?` | `string` | — | 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 |
7744
+ | `style?` | `CSSProperties` | — | |
7745
+
7746
+ #### Events
7747
+
7748
+ | Event | Type | Description |
7749
+ |-------|------|-------------|
7750
+ | `onSliceClick` | `(slice: SPieChartSlicePoint) => void` | 조각을 눌렀을 때 |
7751
+
7752
+ ## Types
7753
+
7754
+ ### SPieChartSlice
7755
+
7756
+ ```ts
7757
+ /** 조각 하나 — 범례 한 줄에 대응한다. */
7758
+ export interface SPieChartSlice {
7759
+ /** 범례·툴팁에 표시할 이름 */
7760
+ name: string;
7761
+ /** 값. 0·음수는 그리지 않는다 — 원은 전체에 대한 몫만 나타낼 수 있다 */
7762
+ value: number;
7763
+ }
7764
+ ```
7765
+
7766
+ ### SPieChartPalette
7767
+
7768
+ ```ts
7769
+ /**
7770
+ * 색 팔레트. 조각마다 색이 달라야 하므로 한 색(`default`)은 없다.
7771
+ * - `multi` 서로 무관한 항목(11색)을 순서대로
7772
+ * - `gradation` 한 지표의 단계(6색)를 진한 쪽부터 순서대로 — 조각을 큰 순으로 줄 때
7773
+ * - `custom` `colors` 로 고른 색을 순서대로
7774
+ */
7775
+ export type SPieChartPalette = 'multi' | 'gradation' | 'custom';
7776
+ ```
7777
+
7778
+ ### SPieChartColor
7779
+
7780
+ ```ts
7781
+ /**
7782
+ * `palette='custom'` 에서 고를 수 있는 색 이름.
7783
+ * positive=늘어남 · negative=줄어듦 · neutral=변화 없음 을 뜻하므로 뜻에 맞게 고른다.
7784
+ */
7785
+ export type SPieChartColor =
7786
+ | 'positivePrimary'
7787
+ | 'positiveSecondary'
7788
+ | 'negativePrimary'
7789
+ | 'negativeSecondary'
7790
+ | 'neutralPrimary'
7791
+ | 'neutralSecondary';
7792
+ ```
7793
+
7794
+ ### SPieChartLegendPosition
7795
+
7796
+ ```ts
7797
+ /** 범례 위치. */
7798
+ export type SPieChartLegendPosition = 'top' | 'bottom';
7799
+ ```
7800
+
7801
+ ### SPieChartSlicePoint
7802
+
7803
+ ```ts
7804
+ /** 클릭이 가리키는 조각. */
7805
+ export interface SPieChartSlicePoint {
7806
+ /** `data` 안에서의 인덱스 */
7807
+ index: number;
7808
+ name: string;
7809
+ value: number;
7810
+ /** 그려진 조각 전체의 합에 대한 몫(0~1) */
7811
+ ratio: number;
7812
+ }
7813
+ ```
7814
+
7815
+ ---
7816
+
7478
7817
  # SPopover
7479
7818
 
7480
7819
  > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.