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
package/AGENTS.md CHANGED
@@ -39,13 +39,13 @@
39
39
 
40
40
  | 분류 | 컴포넌트 |
41
41
  | --- | --- |
42
- | **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
42
+ | **버튼·링크** | `SButton` `SGhostButton` `SMeatballButton`(⋯ 로 '더 보기' 메뉴를 여는 아이콘 버튼) `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
43
43
  | **입력 (폼)** | `SForm` `SField` `SInput` `SChatInput`(대화 입력창) `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
44
44
  | **날짜·시간** | `SCalendar` `SCalendarBoard`(한 달치 일정 판) `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
45
45
  | **표·목록** | `SChatMessage`(대화의 메시지 한 건) `SChatAttachedFile`(입력창 위, 아직 보내지 않은 첨부 한 칸) `SChatFile`(대화 흐름에 선, 보낸 파일 한 칸) `SChatSystemMessage`(대화 흐름 가운데 서는 시스템 안내) `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
46
46
  | **레이아웃** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system 패널에 한 줄씩 쌓는 액션 행 — 버튼 고르기는 §3-5) `SAccountListBox`(계정 행을 눌러 뜨는 계정 패널) `SLauncherListBox`(런처 버튼을 눌러 뜨는 서비스 목록) `SPage` `SPageHeader`(페이지 제목 영역 — `SLayout` 안에서 `SPage` 앞에 둔다) `SSectionHeaderCard` `SCard` `SLoginCard`(통합 계정 로그인 화면의 카드) `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
47
47
  | **내비게이션** | `STabs` `SPagination` `SStepper` |
48
- | **차트** | `SBarChart`(막대 그래프 — 항목끼리 크기를 견준다. `stacked` 로 항목 안의 구성까지) `SLineChart`(꺾은선 그래프 — 순서가 있는 항목의 추이를 본다. `area` 로 크기까지, `stacked` 로 구성까지) |
48
+ | **차트** | `SBarChart`(막대 그래프 — 항목끼리 크기를 견준다. `stacked` 로 항목 안의 구성까지) `SLineChart`(꺾은선 그래프 — 순서가 있는 항목의 추이를 본다. `area` 로 크기까지, `stacked` 로 구성까지) `SPieChart`(원그래프 — 한 시점의 전체를 몇 개의 몫으로 나눈다) `SDonutChart`(도넛 그래프 — 가운데가 빈 원그래프. 구멍에 글자를 두지 않는다) |
49
49
  | **표시·상태** | `STag` `SBadge` `SIcon` `SLogo`(브랜드 로고를 아이콘처럼 — size 는 높이다) `SImage` `SCallout` `SGuide` |
50
50
  | **진행·로딩** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
51
51
  | **오버레이** | `STooltip` `SPopover` `SPopup` `SDrawer` `SPortal` |
@@ -72,7 +72,7 @@ AI 에이전트는 코드를 생성하기 전에 이 목록을 반드시 지킨
72
72
 
73
73
  | 금지 | 대신 사용 |
74
74
  | --- | --- |
75
- | `<button>` | `SButton`, `SGhostButton`, `SDropdownButton`, `STextLink` |
75
+ | `<button>` | `SButton`, `SGhostButton`, `SMeatballButton`, `SDropdownButton`, `STextLink` |
76
76
  | `<input type="text/password/...">` | `SInput` |
77
77
  | `<input type="search">` | `SSearchInput` |
78
78
  | `<input type="number">` | `SNumberInput` |
@@ -167,8 +167,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
167
167
  | 층 | 무엇인가 | 컴포넌트 |
168
168
  | --- | --- | --- |
169
169
  | **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SGnbSystem`(GNB 맨 아래 판 · 전폭 상단바 오른쪽 끝) `SPage` `SPageHeader`(`SLayout` 안에서 `SPage` 앞에 둔다) |
170
- | **블록** | `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` |
171
- | **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `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` |
170
+ | **블록** | `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` |
171
+ | **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `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` |
172
172
  | **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `SLogo` `STextLink` `SChip` |
173
173
  | **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SAccountListBox`(계정 행에 붙어 뜬다 — 직접 띄우지 않는다) `SLauncherListBox`(런처 버튼에 붙어 뜬다 — 직접 띄우지 않는다) `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
174
174
 
@@ -254,7 +254,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
254
254
  | 용도 | 클래스 |
255
255
  | --- | --- |
256
256
  | 페이지/섹션 제목 | `typo-heading-lg`(18px) · `typo-heading-md`(16px) · `typo-heading-sm`(14px) · `typo-heading-xs`(12px) |
257
- | 본문 | `typo-body-lg-*` (16px) · `typo-body-md-*`(14px) · `typo-body-sm-*`(12px) · `typo-body-xs-default`(11px) — `*` = `default`/`medium`/`bold` |
257
+ | 카드·아이템 안의 메인 수치 데이터 | `typo-heading-xl`(24px) — 제목에 쓰지 않는다 |
258
+ | 본문 | `typo-body-lg-*` (16px) · `typo-body-md-*`(14px) · `typo-body-sm-*`(12px) · `typo-body-xs-default`(11px) — `*` = `default`/`medium`/`semibold`/`bold` |
258
259
  | 테이블 | `typo-table-header` · `typo-table-body` · `typo-table-accent` |
259
260
  | 컨트롤·필드·피드백·내비 | `typo-control-*` `typo-field-*` `typo-feedback-*` `typo-navigation-*` (컴포넌트 내부용 — 직접 쓸 일은 드묾) |
260
261
 
@@ -324,7 +325,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
324
325
  | `SCheckbox` | **`gap-sd-24`** | `gap-sd-8` |
325
326
  | `SRadio` | **`gap-sd-24`** | `gap-sd-8` |
326
327
  | `STextLink` | **`gap-sd-16`**(sm) / **`gap-sd-24`**(md·lg) | `gap-sd-4` |
327
- | `SGhostButton` | `gap-sd-4` | `gap-sd-4` |
328
+ | `SGhostButton` · `SMeatballButton` | `gap-sd-4` | `gap-sd-4` |
328
329
  | `SButton` | `gap-sd-8` (xs·sm·md) / **`gap-sd-12`**(lg) | 〃 |
329
330
  | `STag` | `gap-sd-8` | `gap-sd-8` |
330
331
  | `SToggle` | `gap-sd-8` | `gap-sd-8` |
@@ -565,10 +566,12 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
565
566
  | 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 |
566
567
  | 사용자가 순서를 드래그로 바꾸게 한다 | `SDraggableList` + `SDraggableItem` | §3-7-6 |
567
568
  | 날짜별 일정을 한 달치 격자로 펼쳐 보여준다 | `SCalendarBoard` | §3-7-4 |
568
- | 항목끼리 크기를 눈으로 견주게 한다 (기간별 추이·채널별 비중) | `SBarChart` | 정확한 값을 읽어야 하면 `STable` — 그래프는 "어느 쪽이 큰가" 를 답하지 "얼마인가" 를 답하지 않는다 |
569
+ | 항목끼리 크기를 눈으로 견주게 한다 (채널별 매출·상품별 판매량) | `SBarChart` | 정확한 값을 읽어야 하면 `STable` — 그래프는 "어느 쪽이 큰가" 를 답하지 "얼마인가" 를 답하지 않는다 |
569
570
  | 순서가 있는 항목의 **추이**를 보여준다 (일·월별 매출 흐름, 기간별 방문 수) | `SLineChart` | 항목 순서에 뜻이 없으면(채널별·상품별) `SBarChart` — 선은 "이어진다" 는 뜻을 덤으로 얹어, 순서 없는 항목을 이으면 없는 흐름을 만든다. 항목이 대여섯 개 안쪽이고 크기를 견주는 것이 목적이면 막대가 낫다 |
570
571
  | 여러 항목의 추이를 **합계와 함께** 보여준다 (채널별 매출이 쌓여 전체가 되는 흐름) | `SLineChart stacked area` | 합계가 뜻을 갖는 값일 때만 쌓는다. 음수가 섞이거나 더해서 뜻이 없는 값(비율·평균)은 쌓지 말고 겹쳐 그린다 |
571
572
  | 항목의 크기와 **그 안의 구성**을 함께 보여준다 (주문 상태별 내역, 유입 경로별 몫) | `SBarChart stacked` | 계열끼리 견주는 것이 목적이면 `stacked` 없이 나란히 세운다. 더해서 뜻이 없는 값(비율·평균)은 쌓지 않는다 — 합계 라벨이 거짓말이 된다 |
573
+ | 한 시점의 **전체를 몇 개의 몫으로** 나눠 보여준다 (채널별 매출 비중, 회원 등급 구성) | `SPieChart` | 조각이 대여섯 개를 넘거나 몫끼리 크기를 견주는 것이 목적이면 `SBarChart` — 사람은 각도보다 길이를 정확히 견준다. 순서가 있는 추이(월별)는 몫이 아니라 흐름이라 `SLineChart`. 0·음수는 그려지지 않으므로 증감은 원으로 나타내지 않는다. 조각은 큰 순으로 넘긴다. 폭은 부모를 따르고 그림은 그 폭의 정사각형이다 — 폭이 필요하면 `className` 으로 폭만 주고 높이는 주지 않는다 (`SDonutChart` 도 같다) |
574
+ | 한 시점의 전체를 몫으로 나누되 **가운데가 빈 고리 모양**으로 보여준다 (시안이 도넛일 때) | `SDonutChart` | 쓰임·데이터 규칙은 `SPieChart` 와 같고 모양만 다르다 — 시안이 정한 쪽을 쓴다. **구멍에 합계·라벨을 겹쳐 올리지 않는다.** 합계 같은 값이 필요하면 차트 바깥(카드 제목·요약 값)에 적는다. 여러 기간에 걸친 구성 변화는 원을 여러 개 늘어놓지 말고 `SBarChart stacked` |
572
575
  | 표 위에 건수 요약과 액션을 얹는다 | `STableBar` | 표의 이름도 여기 `title` 슬롯에 넣는다 — 제목만으로 블록을 따로 세우지 않는다. §4-2 |
573
576
  | 상태·분류를 라벨로 찍는다 | `STag` | §3-1 |
574
577
  | 색 점만으로 상태를 찍는다 | `SBadge` | §3-1 |
@@ -583,6 +586,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
583
586
  | --- | --- | --- |
584
587
  | 라벨이 있는 일반 액션을 준다 | `SButton` | §3-5 |
585
588
  | 아이콘 하나로 뜻이 통하는 부가 조작을 준다 | `SGhostButton` | §3-5-5 |
589
+ | 자리가 좁아 부가 조작 여러 개를 ⋯ 뒤 메뉴로 접어 둔다 | `SMeatballButton` | §3-5-5 |
586
590
  | 한 버튼에 여러 선택지를 매단다 | `SDropdownButton` | §3-5-4 |
587
591
  | GNB system 패널에서 한 줄짜리 행 액션을 준다 | `SSystemActionButton` | §3-5-7 |
588
592
 
@@ -682,7 +686,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
682
686
  | --- | --- |
683
687
  | `default` | 흰 면 위 (`SPage background="frame"`) — 옅은 회색 면이라 페이지와 구분된다 |
684
688
  | `white` | 회색 면 위 (`background="neutral"`·`"screen"`) — 그 위에서는 `default` 가 배경에 묻힌다 |
685
- | `danger` | 경고. 좌측에 "주의사항" 타이틀이 붙으므로 단순 안내에는 쓰지 않는다 |
689
+ | `danger` | 경고. 좌측에 "주의사항" 타이틀이 붙으므로 단순 안내에는 쓰지 않는다. 주변에 이미 경고 맥락(제목 등)이 있어 타이틀이 중복되면 `showTitle={false}` 로 타이틀만 뺀다 — 경고 면은 유지된다 |
686
690
 
687
691
  ### 3-3. 플로팅/오버레이류
688
692
 
@@ -1205,6 +1209,7 @@ tableRef.current.scrollToRow(row); // 복원
1205
1209
  | 일반 액션 | `SButton` (`color`: `primary` / `secondary` / `neutral` / `danger`, `outline`, `size`: xs~md) |
1206
1210
  | **삭제 등 파괴적 액션** | **`SButton color="danger"`** 또는 **`color="danger" outline`** (아래 3-5-3) |
1207
1211
  | **아이콘 하나로 뜻이 통하는 부가 조작** | **`SGhostButton`** — 라벨이 없는 아이콘 전용 버튼 (아래 3-5-5) |
1212
+ | **부가 조작 여러 개를 ⋯ 메뉴로 접기** | **`SMeatballButton`** — ⋯ 아이콘 버튼 + `SDropdownButton` 과 같은 메뉴 (아래 3-5-5) |
1208
1213
  | 본문 속 이동 링크 | `STextLink` |
1209
1214
  | 메인 액션 + 부가 메뉴 | `SDropdownButton` |
1210
1215
  | **GNB system 패널의 한 줄 액션** | **`SSystemActionButton`** — 행 전체가 버튼인 표면형 (아래 3-5-7) |
@@ -1318,6 +1323,24 @@ tableRef.current.scrollToRow(row); // 복원
1318
1323
  ❌ <SGhostButton icon="download" ariaLabel="엑셀 다운로드" /> // 목록의 주 액션 → SButton
1319
1324
  ```
1320
1325
 
1326
+ ##### `SMeatballButton` — ⋯ 뒤에 메뉴를 접어 둘 때
1327
+
1328
+ 자리가 좁아 부가 조작을 하나하나 아이콘으로 늘어놓을 수 없을 때, **⋯ 하나로 접고 누르면 메뉴를 띄운다.** 버튼의 크기·색·hover·툴팁은 `SGhostButton` 과, 메뉴 모양은 `SDropdownButton` 과 같다.
1329
+
1330
+ - **메뉴는 컴포넌트가 띄운다.** `items` 를 넘기고 선택은 `onItemClick(value)` 로 받는다. 메뉴를 따로 만들어 붙이지 않고, 열림 상태(`aria-expanded`)도 직접 넣지 않는다.
1331
+ - **`SGhostButton icon="etc"` 로 직접 만들지 않는다.** '더 보기' 메뉴는 항상 `SMeatballButton` 이다.
1332
+ - **`intent` 는 `default` / `inverse` 뿐이다.** ⋯ 는 조작이 아니라 메뉴를 여는 것이므로 `action`·`danger` 색을 받지 않는다. 어두운 배경 위에서만 `inverse`.
1333
+ - 툴팁·`ariaLabel` 은 기본 문구가 들어 있어 **주지 않아도 된다.** 한 화면에 ⋯ 가 여러 개라 무엇의 메뉴인지 구분해야 할 때만 `tooltipText` 를 바꾼다(`ariaLabel` 이 따라간다).
1334
+ - 메인 액션에 변형 동작을 곁들이는 것이면 `SMeatballButton` 이 아니라 `SDropdownButton split`(§3-5-4)이다.
1335
+
1336
+ ```tsx
1337
+ ✅ <SMeatballButton size="xs" // 행 끝 부가 조작 묶음
1338
+ items={[{ value: 'copy', label: '복제', icon: 'copy' }, { value: 'remove', label: '삭제', icon: 'remove' }]}
1339
+ onItemClick={v => handleRowAction(row, v)} />
1340
+ ✅ <SMeatballButton intent="inverse" items={items} onItemClick={onAction} /> // 어두운 배경 위
1341
+ ❌ <SGhostButton icon="etc" ariaLabel="더 보기" onClick={openMyMenu} /> // 직접 조립 → SMeatballButton
1342
+ ```
1343
+
1321
1344
  #### 3-5-6. 그 밖
1322
1345
 
1323
1346
  - 라벨은 **동사(+목적어)** — `저장` · `적치 지시` · `송장 재출력`
@@ -1683,7 +1706,7 @@ useEffect(() => {
1683
1706
  - **`SCalendar` 와 `SCalendarBoard` 는 방향이 반대다.** `SCalendar` 는 날짜를 **고르는** 달력(칸에는 점만 찍힌다)이고, `SCalendarBoard` 는 일정을 **읽는** 달력이다 — 칸마다 일정이 줄로 쌓이고, 칸 높이에 담기는 줄 수를 넘으면 "N개 더보기" 로 접히고, **"더보기" 또는 일정이 있는 칸 아무 데나** 누르면 **그 칸을 덮으며 뜨는 판**에 그 날짜의 일정이 전부 펼쳐진다. 폭도 다르다: `SCalendar` 는 제 폭을 갖는 요소, `SCalendarBoard` 는 페이지 폭을 채우는 블록이다.
1684
1707
  - **`SCalendarBoard` 는 기본이 읽기 전용 판이다.** 날짜 칸을 눌러 **고르게** 하려면 `selectable` 을 켠다 — 켜야 `onValueChange(date, events)` 로 고른 날짜와 **그 날짜의 일정**이 함께 온다. 다만 **일정이 있는 칸은 `selectable` 과 무관하게 눌린다** — 그때는 목록 판이 열린다. 둘 다 켜져 있으면 고르기와 열기가 함께 일어난다. 일정 버튼과 "N개 더보기" 도 항상 눌린다.
1685
1708
  - **칸 배경과 일정 색은 다른 층이다.** 그날의 성격(마감·완료·휴무 등)은 `dayColors` 로 **칸 전체**에 칠하고(`default` `danger` `accent` `complete` `dim`), 일정 하나의 색은 `events[].color` 로 준다. 둘을 섞어 쓰면 서로를 가리지 않고 함께 읽힌다.
1686
- - 일정 왼쪽의 색 점은 `SBadge` 다 — `events[].color` 프리셋이 점 색까지 정하고, 따로 주려면 `dotColor` 에 `SBadge` 9색 중 하나를 넣는다 (§3-1).
1709
+ - 일정 왼쪽의 색 점은 `SBadge` 다 — `events[].color` 프리셋이 점 색까지 정하고, 따로 주려면 `dotColor` 에 `SBadge` 색(`SBadgeColor`) 중 하나를 넣는다 (§3-1).
1687
1710
  - **칸 본문을 통째로 바꾸려면 `dayContent` 다.** 일정으로 표현되지 않는 그날치 요약(재고·매출 같은)을 칸에 얹을 때 쓴다. **슬롯을 준 날짜는 그 날짜의 `events` 를 그리지 않고 목록 판도 열지 않는다** — 한 칸에 둘을 겹쳐 담지 않는다. 일정과 요약을 함께 보여야 하면 요약을 일정 한 건(`events[]`)으로 넣는다.
1688
1711
  - **`SCalendarBoard` 는 높이를 부모에게서 받는다.** 행이 그 높이를 균등하게 나눠 갖고, 칸 높이가 다시 "한 칸에 몇 줄이 보일지" 를 정한다. 그래서 **놓는 자리에 높이를 준다** — 페이지 본문의 남은 높이를 채우려면 `SPage` 안에서 스택을 `flex-1 min-h-0` 으로 두고 판에 `h-full` 을 준다. 높이를 주지 않으면 칸이 최소 높이로 주저앉아 한두 줄만 보인다.
1689
1712
  - **한 칸에 몇 줄을 펼칠지는 컴포넌트가 잰다.** 조절하는 prop 이 없다 — 칸 높이에서 나오는 값이라 따로 정할 것이 아니다. 줄이 넘치면 마지막 한 줄을 "N개 더보기" 에 내주므로 **접히든 아니든 칸 높이가 같다.** **소비 앱이 `events` 를 미리 잘라 넘기지 않는다.** 잘라 넘기면 "N개 더보기" 의 수가 실제 건수와 어긋나고, 눌러도 나머지가 나오지 않는다.
@@ -30,6 +30,7 @@ export const BADGE_COLORS = [
30
30
  'blue',
31
31
  'darkblue',
32
32
  'indigo',
33
+ 'purple',
33
34
  'grey',
34
35
  ] as const;
35
36
  ```
@@ -1,5 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
- export declare const BADGE_COLORS: readonly ["red", "orange", "yellow", "green", "lightblue", "blue", "darkblue", "indigo", "grey"];
2
+ export declare const BADGE_COLORS: readonly ["red", "orange", "yellow", "green", "lightblue", "blue", "darkblue", "indigo", "purple", "grey"];
3
3
  export type SBadgeColor = (typeof BADGE_COLORS)[number];
4
4
  export interface SBadgeProps extends HTMLAttributes<HTMLSpanElement> {
5
5
  /** 뱃지 색상 */
@@ -23,6 +23,7 @@
23
23
  | `showTooltip?` | `boolean` | `true` | 막대에 마우스를 올리면 값 상자를 띄운다 |
24
24
  | `formatValue?` | `(value: number) => string` | `defaultFormat` | 값 표시 형식 |
25
25
  | `height?` | `number \| string` | — | 차트 높이. **아래 축 텍스트까지 포함한 값**이다 — 그림은 그만큼 줄어든다 |
26
+ | `tooltipFooter?` | `(category: SBarChartTooltipCategory) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락 (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
26
27
  | `className?` | `string` | — | |
27
28
  | `style?` | `CSSProperties` | — | |
28
29
 
@@ -103,3 +104,17 @@ export interface SBarChartPoint {
103
104
  }
104
105
  ```
105
106
 
107
+ ### SBarChartTooltipCategory
108
+
109
+ ```ts
110
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
111
+ export interface SBarChartTooltipCategory {
112
+ /** 카테고리 인덱스 */
113
+ categoryIndex: number;
114
+ /** 카테고리 이름 */
115
+ name: string;
116
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다 */
117
+ points: SBarChartPoint[];
118
+ }
119
+ ```
120
+
@@ -1,4 +1,4 @@
1
- import { type CSSProperties } from 'react';
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
2
  /** 막대가 자라는 방향. */
3
3
  export type SBarChartDirection = 'vertical' | 'horizontal';
4
4
  /** 범례 위치. */
@@ -25,6 +25,15 @@ export interface SBarChartPoint {
25
25
  /** 그 지점의 값 */
26
26
  value: number;
27
27
  }
28
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
29
+ export interface SBarChartTooltipCategory {
30
+ /** 카테고리 인덱스 */
31
+ categoryIndex: number;
32
+ /** 카테고리 이름 */
33
+ name: string;
34
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다 */
35
+ points: SBarChartPoint[];
36
+ }
28
37
  /** 한 계열 — 범례 한 줄에 대응한다. */
29
38
  export interface SBarChartSeries {
30
39
  /** 범례·툴팁에 표시할 이름 */
@@ -69,6 +78,11 @@ export interface SBarChartProps {
69
78
  height?: number | string;
70
79
  /** 막대를 눌렀을 때 */
71
80
  onBarClick?: (point: SBarChartPoint) => void;
81
+ /**
82
+ * 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락
83
+ * (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다
84
+ */
85
+ tooltipFooter?: (category: SBarChartTooltipCategory) => ReactNode;
72
86
  className?: string;
73
87
  style?: CSSProperties;
74
88
  }
@@ -1,2 +1,2 @@
1
- export { SBarChart, type SBarChartProps, type SBarChartSeries, type SBarChartPoint, type SBarChartPalette, type SBarChartColor, type SBarChartDirection, type SBarChartLegendPosition, } from './SBarChart';
1
+ export { SBarChart, type SBarChartProps, type SBarChartSeries, type SBarChartPoint, type SBarChartTooltipCategory, type SBarChartPalette, type SBarChartColor, type SBarChartDirection, type SBarChartLegendPosition, } from './SBarChart';
2
2
  export { BAR_SIZE_MIN, BAR_SIZE_MAX, BAR_GAP } from './barChart.config';
@@ -62,7 +62,7 @@ export interface SCalendarBoardEvent {
62
62
  label: string;
63
63
  /** 색상 프리셋 — 배경과 점 색이 함께 정해진다 */
64
64
  color?: SCalendarBoardEventColor;
65
- /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 9색을 쓴다 */
65
+ /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 색(`SBadgeColor`)을 쓴다 */
66
66
  dotColor?: SBadgeColor;
67
67
  /** 본문 텍스트 — 예: `"RV20260728-000006"`. 평문만 받는다 */
68
68
  description?: string;
@@ -110,6 +110,7 @@ export const CALENDAR_BOARD_EVENT_COLORS = [
110
110
  'yellow',
111
111
  'orange',
112
112
  'red',
113
+ 'purple',
113
114
  'white',
114
115
  ] as const;
115
116
  ```
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * 배경은 `--cmp-calendarBoard-eventButton-bg-*` 로 전부 토큰화돼 있다.
5
5
  * 점(dot)은 `SBadge` 가 그리므로 색도 `--cmp-badge-*` 를 그대로 따른다 —
6
- * 9색이 디자인 mock 의 점 hex 와 1:1 로 맞아떨어져 따로 매핑을 두지 않는다.
6
+ * badge 색이 디자인 mock 의 점 hex 와 1:1 로 맞아떨어져 따로 매핑을 두지 않는다.
7
7
  */
8
8
  import type { SBadgeColor } from '../SBadge';
9
- export declare const CALENDAR_BOARD_EVENT_COLORS: readonly ["default", "blue", "oceanBlue", "lightBlue", "green", "yellow", "orange", "red", "white"];
9
+ export declare const CALENDAR_BOARD_EVENT_COLORS: readonly ["default", "blue", "oceanBlue", "lightBlue", "green", "yellow", "orange", "red", "purple", "white"];
10
10
  export type SCalendarBoardEventColor = (typeof CALENDAR_BOARD_EVENT_COLORS)[number];
11
11
  export interface CalendarBoardEventPreset {
12
12
  /** 이벤트 버튼 배경 */
@@ -14,7 +14,7 @@ export interface SCalendarBoardEvent {
14
14
  label: string;
15
15
  /** 색상 프리셋 — 배경과 점 색이 함께 정해진다 */
16
16
  color?: SCalendarBoardEventColor;
17
- /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 9색을 쓴다 */
17
+ /** 왼쪽 점 색만 따로 지정 (프리셋 기본값을 덮어쓴다). 점은 `SBadge` 라 그 색(`SBadgeColor`)을 쓴다 */
18
18
  dotColor?: SBadgeColor;
19
19
  /** 본문 텍스트 — 예: `"RV20260728-000006"`. 평문만 받는다 */
20
20
  description?: string;
@@ -9,6 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `type?` | `SCalloutType` | `'default'` | 콜아웃 타입 (색상·아이콘·타이틀 결정). - `default` — 옅은 회색 면. 흰 페이지(`background="frame"`) 위의 기본 안내. - `white` — 같은 안내인데 배경만 흰 면. 회색 면(`neutral`·`screen`) 위에서 default 가 묻힐 때. - `danger` — 좌측에 주의사항 타이틀이 붙는 경고. |
12
+ | `showTitle?` | `boolean` | `true` | `danger` 좌측의 주의사항 타이틀(아이콘+라벨) 표시 여부. 기본 `true`. `false` 면 타이틀만 빠지고 danger 의 면·테두리·본문색은 그대로다. 다른 타입에는 영향이 없다. |
12
13
  | `message?` | `SCalloutMessage[]` | `[]` | 표시할 메시지 목록 (배열 중첩으로 depth 표현). 각 문자열은 인라인 HTML(`<b>`, `<a>` 등)을 허용하며 sanitizeInlineHtml 로 살균 후 렌더된다. |
13
14
  | `children?` | `ReactNode` | — | message 대신 직접 본문을 넣을 때 |
14
15
  | `className?` | `string` | — | |
@@ -10,6 +10,11 @@ export interface SCalloutProps {
10
10
  * - `danger` — 좌측에 주의사항 타이틀이 붙는 경고.
11
11
  */
12
12
  type?: SCalloutType;
13
+ /**
14
+ * `danger` 좌측의 주의사항 타이틀(아이콘+라벨) 표시 여부. 기본 `true`.
15
+ * `false` 면 타이틀만 빠지고 danger 의 면·테두리·본문색은 그대로다. 다른 타입에는 영향이 없다.
16
+ */
17
+ showTitle?: boolean;
13
18
  /**
14
19
  * 표시할 메시지 목록 (배열 중첩으로 depth 표현).
15
20
  * 각 문자열은 인라인 HTML(`<b>`, `<a>` 등)을 허용하며 sanitizeInlineHtml 로 살균 후 렌더된다.
@@ -22,7 +27,7 @@ export interface SCalloutProps {
22
27
  }
23
28
  /**
24
29
  * SCallout — sd-callout 포팅.
25
- * default/white/danger 타입, 중첩 리스트(불릿은 span으로 렌더), danger는 좌측 타이틀 표시.
30
+ * default/white/danger 타입, 중첩 리스트(불릿은 span으로 렌더), danger는 좌측 타이틀 표시(showTitle 로 끌 수 있다).
26
31
  * 색상은 `--cmp-callout-*` 토큰 참조(white 만 예외 — SURFACE 주석 참고).
27
32
  * message 각 항목은 sanitizeInlineHtml 로 살균한 뒤 innerHTML 로 렌더한다 (원본 sd-callout 과 동일).
28
33
  */
@@ -8,6 +8,7 @@
8
8
 
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
+ | `color?` | `SChipColor` | — | 색상. 주지 않으면 기본 회색 칩이다. 색은 기본 상태에만 입힌다 — error·편집 중·disabled 는 상태 토큰이 우선한다. 색상은 컴포넌트 토큰 `--cmp-chip-chip-<color>-{bg,content,border}` 를 참조한다. |
11
12
  | `name?` | `string` | — | 폼 연동용 name |
12
13
  | `value?` | `string` | `''` | 칩 텍스트 값 |
13
14
  | `error?` | `boolean` | — | 에러 상태 |
@@ -35,6 +36,30 @@
35
36
  | `focus` | `() => void` | 편집 input에 포커스합니다. |
36
37
  | `getNativeElement` | `() => HTMLElement \| null` | 네이티브 편집 엘리먼트를 반환합니다. |
37
38
 
39
+ ## Types
40
+
41
+ ### SChipColor
42
+
43
+ ```ts
44
+ export type SChipColor = (typeof CHIP_COLORS)[number];
45
+ ```
46
+
47
+ ### CHIP_COLORS
48
+
49
+ ```ts
50
+ export const CHIP_COLORS = [
51
+ 'red',
52
+ 'orange',
53
+ 'yellow',
54
+ 'green',
55
+ 'blue',
56
+ 'darkblue',
57
+ 'indigo',
58
+ 'purple',
59
+ 'grey',
60
+ ] as const;
61
+ ```
62
+
38
63
  ## Dependencies
39
64
 
40
65
  ### Used by
@@ -1,6 +1,14 @@
1
1
  import { type CSSProperties } from 'react';
2
2
  import { type Rule } from '../../lib/form';
3
+ export declare const CHIP_COLORS: readonly ["red", "orange", "yellow", "green", "blue", "darkblue", "indigo", "purple", "grey"];
4
+ export type SChipColor = (typeof CHIP_COLORS)[number];
3
5
  export interface SChipProps {
6
+ /**
7
+ * 색상. 주지 않으면 기본 회색 칩이다.
8
+ * 색은 기본 상태에만 입힌다 — error·편집 중·disabled 는 상태 토큰이 우선한다.
9
+ * 색상은 컴포넌트 토큰 `--cmp-chip-chip-<color>-{bg,content,border}` 를 참조한다.
10
+ */
11
+ color?: SChipColor;
4
12
  /** 폼 연동용 name */
5
13
  name?: string;
6
14
  /** 칩 텍스트 값 */
@@ -1 +1 @@
1
- export { SChip, type SChipHandle, type SChipProps } from './SChip';
1
+ export { SChip, CHIP_COLORS, type SChipColor, type SChipHandle, type SChipProps } from './SChip';
@@ -0,0 +1,91 @@
1
+ # SDonutChart
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SDonutChart
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `data` | `SDonutChartSlice[]` | — | 조각 목록. 주는 순서대로 12시에서 시계 방향으로 그린다 — 보통 큰 순으로 준다 |
12
+ | `palette?` | `SDonutChartPalette` | `'multi'` | 색 팔레트. `custom` 일 때만 `colors` 를 본다 |
13
+ | `colors?` | `SDonutChartColor[]` | — | `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 |
14
+ | `showValueLabel?` | `boolean` | `false` | 고리 위에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 |
15
+ | `showLegend?` | `boolean` | `true` | 범례를 보인다 |
16
+ | `legendPosition?` | `SDonutChartLegendPosition` | `'top'` | 범례 위치 |
17
+ | `showTooltip?` | `boolean` | `true` | 조각에 마우스를 올리면 값 상자를 띄운다 |
18
+ | `formatValue?` | `(value: number) => string` | — | 값 표시 형식 |
19
+ | `tooltipFooter?` | `(slice: SDonutChartSlicePoint) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락 (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
20
+ | `className?` | `string` | — | 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 |
21
+ | `style?` | `CSSProperties` | — | |
22
+
23
+ #### Events
24
+
25
+ | Event | Type | Description |
26
+ |-------|------|-------------|
27
+ | `onSliceClick` | `(slice: SDonutChartSlicePoint) => void` | 조각을 눌렀을 때 |
28
+
29
+ ## Types
30
+
31
+ ### SDonutChartSlice
32
+
33
+ ```ts
34
+ /** 조각 하나 — 범례 한 줄에 대응한다. */
35
+ export interface SDonutChartSlice {
36
+ /** 범례·툴팁에 표시할 이름 */
37
+ name: string;
38
+ /** 값. 0·음수는 그리지 않는다 — 원은 전체에 대한 몫만 나타낼 수 있다 */
39
+ value: number;
40
+ }
41
+ ```
42
+
43
+ ### SDonutChartPalette
44
+
45
+ ```ts
46
+ /**
47
+ * 색 팔레트. 조각마다 색이 달라야 하므로 한 색(`default`)은 없다.
48
+ * - `multi` 서로 무관한 항목(11색)을 순서대로
49
+ * - `gradation` 한 지표의 단계(6색)를 진한 쪽부터 순서대로 — 조각을 큰 순으로 줄 때
50
+ * - `custom` `colors` 로 고른 색을 순서대로
51
+ */
52
+ export type SDonutChartPalette = 'multi' | 'gradation' | 'custom';
53
+ ```
54
+
55
+ ### SDonutChartColor
56
+
57
+ ```ts
58
+ /**
59
+ * `palette='custom'` 에서 고를 수 있는 색 이름.
60
+ * positive=늘어남 · negative=줄어듦 · neutral=변화 없음 을 뜻하므로 뜻에 맞게 고른다.
61
+ */
62
+ export type SDonutChartColor =
63
+ | 'positivePrimary'
64
+ | 'positiveSecondary'
65
+ | 'negativePrimary'
66
+ | 'negativeSecondary'
67
+ | 'neutralPrimary'
68
+ | 'neutralSecondary';
69
+ ```
70
+
71
+ ### SDonutChartLegendPosition
72
+
73
+ ```ts
74
+ /** 범례 위치. */
75
+ export type SDonutChartLegendPosition = 'top' | 'bottom';
76
+ ```
77
+
78
+ ### SDonutChartSlicePoint
79
+
80
+ ```ts
81
+ /** 클릭이 가리키는 조각. */
82
+ export interface SDonutChartSlicePoint {
83
+ /** `data` 안에서의 인덱스 */
84
+ index: number;
85
+ name: string;
86
+ value: number;
87
+ /** 그려진 조각 전체의 합에 대한 몫(0~1) */
88
+ ratio: number;
89
+ }
90
+ ```
91
+
@@ -0,0 +1,70 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ /** 범례 위치. */
3
+ export type SDonutChartLegendPosition = 'top' | 'bottom';
4
+ /**
5
+ * 색 팔레트. 조각마다 색이 달라야 하므로 한 색(`default`)은 없다.
6
+ * - `multi` 서로 무관한 항목(11색)을 순서대로
7
+ * - `gradation` 한 지표의 단계(6색)를 진한 쪽부터 순서대로 — 조각을 큰 순으로 줄 때
8
+ * - `custom` `colors` 로 고른 색을 순서대로
9
+ */
10
+ export type SDonutChartPalette = 'multi' | 'gradation' | 'custom';
11
+ /**
12
+ * `palette='custom'` 에서 고를 수 있는 색 이름.
13
+ * positive=늘어남 · negative=줄어듦 · neutral=변화 없음 을 뜻하므로 뜻에 맞게 고른다.
14
+ */
15
+ export type SDonutChartColor = 'positivePrimary' | 'positiveSecondary' | 'negativePrimary' | 'negativeSecondary' | 'neutralPrimary' | 'neutralSecondary';
16
+ /** 조각 하나 — 범례 한 줄에 대응한다. */
17
+ export interface SDonutChartSlice {
18
+ /** 범례·툴팁에 표시할 이름 */
19
+ name: string;
20
+ /** 값. 0·음수는 그리지 않는다 — 원은 전체에 대한 몫만 나타낼 수 있다 */
21
+ value: number;
22
+ }
23
+ /** 클릭이 가리키는 조각. */
24
+ export interface SDonutChartSlicePoint {
25
+ /** `data` 안에서의 인덱스 */
26
+ index: number;
27
+ name: string;
28
+ value: number;
29
+ /** 그려진 조각 전체의 합에 대한 몫(0~1) */
30
+ ratio: number;
31
+ }
32
+ export interface SDonutChartProps {
33
+ /** 조각 목록. 주는 순서대로 12시에서 시계 방향으로 그린다 — 보통 큰 순으로 준다 */
34
+ data: SDonutChartSlice[];
35
+ /** 색 팔레트. `custom` 일 때만 `colors` 를 본다 */
36
+ palette?: SDonutChartPalette;
37
+ /** `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 */
38
+ colors?: SDonutChartColor[];
39
+ /** 고리 위에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 */
40
+ showValueLabel?: boolean;
41
+ /** 범례를 보인다 */
42
+ showLegend?: boolean;
43
+ /** 범례 위치 */
44
+ legendPosition?: SDonutChartLegendPosition;
45
+ /** 조각에 마우스를 올리면 값 상자를 띄운다 */
46
+ showTooltip?: boolean;
47
+ /** 값 표시 형식 */
48
+ formatValue?: (value: number) => string;
49
+ /** 조각을 눌렀을 때 */
50
+ onSliceClick?: (slice: SDonutChartSlicePoint) => void;
51
+ /**
52
+ * 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락
53
+ * (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다
54
+ */
55
+ tooltipFooter?: (slice: SDonutChartSlicePoint) => ReactNode;
56
+ /** 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 */
57
+ className?: string;
58
+ style?: CSSProperties;
59
+ }
60
+ /**
61
+ * SDonutChart — 도넛 그래프.
62
+ *
63
+ * 가운데가 빈 원그래프. `SPieChart` 와 같이 **한 시점의 전체를 몫으로 나눈 것**을 보여준다.
64
+ * 가운데 구멍에는 글자를 두지 않는다 — 합계 같은 값은 차트 바깥에 적는다.
65
+ * 조각이 대여섯 개를 넘거나 몫끼리 견주는 것이 목적이면 `SBarChart` 가 맞다.
66
+ *
67
+ * 폭은 부모를 따르고(기본 100%), 그림은 그 폭을 한 변으로 하는 정사각형이다.
68
+ * 구멍과 고리 두께도 폭에 비례해 늘고 준다.
69
+ */
70
+ export declare const SDonutChart: import("react").ForwardRefExoticComponent<SDonutChartProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1 @@
1
+ export { SDonutChart, type SDonutChartProps, type SDonutChartSlice, type SDonutChartSlicePoint, type SDonutChartPalette, type SDonutChartColor, type SDonutChartLegendPosition, } from './SDonutChart';
@@ -57,6 +57,7 @@ export type SGhostButtonIntent = 'default' | 'danger' | 'action' | 'subAction' |
57
57
  - [SGnb](../SGnb)
58
58
  - [SGuide](../SGuide)
59
59
  - [SInput](../SInput)
60
+ - [SMeatballButton](../SMeatballButton)
60
61
  - [SModalContainer](../SModalContainer)
61
62
  - [SOverlayHeader](../SOverlayHeader)
62
63
  - [SPage](../SPage)
@@ -92,6 +93,7 @@ graph TD;
92
93
  SGnb --> SGhostButton
93
94
  SGuide --> SGhostButton
94
95
  SInput --> SGhostButton
96
+ SMeatballButton --> SGhostButton
95
97
  SModalContainer --> SGhostButton
96
98
  SOverlayHeader --> SGhostButton
97
99
  SPage --> SGhostButton
@@ -24,6 +24,7 @@
24
24
  | `showTooltip?` | `boolean` | `true` | 항목에 마우스를 올리면 값 상자를 띄운다 |
25
25
  | `formatValue?` | `(value: number) => string` | `defaultFormat` | 값 표시 형식 |
26
26
  | `height?` | `number \| string` | — | 차트 높이. **아래 축 텍스트까지 포함한 값**이다 — 그림은 그만큼 줄어든다 |
27
+ | `tooltipFooter?` | `(category: SLineChartTooltipCategory) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락 (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
27
28
  | `className?` | `string` | — | |
28
29
  | `style?` | `CSSProperties` | — | |
29
30
 
@@ -104,3 +105,17 @@ export interface SLineChartPoint {
104
105
  }
105
106
  ```
106
107
 
108
+ ### SLineChartTooltipCategory
109
+
110
+ ```ts
111
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
112
+ export interface SLineChartTooltipCategory {
113
+ /** 카테고리 인덱스 */
114
+ categoryIndex: number;
115
+ /** 카테고리 이름 */
116
+ name: string;
117
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다. 누적이어도 각 계열이 제 몫으로 가진 값이다 */
118
+ points: SLineChartPoint[];
119
+ }
120
+ ```
121
+
@@ -1,4 +1,4 @@
1
- import { type CSSProperties } from 'react';
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
2
  /** 점과 점을 잇는 방식. */
3
3
  export type SLineChartCurve = 'linear' | 'smooth';
4
4
  /** 범례 위치. */
@@ -25,6 +25,15 @@ export interface SLineChartPoint {
25
25
  /** 그 지점의 값. 누적이어도 **그 계열이 제 몫으로 가진 값**이다 */
26
26
  value: number;
27
27
  }
28
+ /** 툴팁 하단(`tooltipFooter`)이 받는 짚은 항목. */
29
+ export interface SLineChartTooltipCategory {
30
+ /** 카테고리 인덱스 */
31
+ categoryIndex: number;
32
+ /** 카테고리 이름 */
33
+ name: string;
34
+ /** 툴팁에 값이 뜬 지점들 — 값이 없는 계열은 빠진다. 누적이어도 각 계열이 제 몫으로 가진 값이다 */
35
+ points: SLineChartPoint[];
36
+ }
28
37
  /** 한 계열 — 선 하나, 범례 한 줄에 대응한다. */
29
38
  export interface SLineChartSeries {
30
39
  /** 범례·툴팁에 표시할 이름 */
@@ -73,6 +82,11 @@ export interface SLineChartProps {
73
82
  height?: number | string;
74
83
  /** 점을 눌렀을 때 */
75
84
  onPointClick?: (point: SLineChartPoint) => void;
85
+ /**
86
+ * 툴팁의 값 아래에 덧붙일 내용. 짚은 항목을 받아 그린다 — 계열 값만으로 모자란 맥락
87
+ * (합계, 전월 대비 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다
88
+ */
89
+ tooltipFooter?: (category: SLineChartTooltipCategory) => ReactNode;
76
90
  className?: string;
77
91
  style?: CSSProperties;
78
92
  }
@@ -1 +1 @@
1
- export { SLineChart, type SLineChartProps, type SLineChartSeries, type SLineChartPoint, type SLineChartCurve, type SLineChartPalette, type SLineChartColor, type SLineChartLegendPosition, } from './SLineChart';
1
+ export { SLineChart, type SLineChartProps, type SLineChartSeries, type SLineChartPoint, type SLineChartTooltipCategory, type SLineChartCurve, type SLineChartPalette, type SLineChartColor, type SLineChartLegendPosition, } from './SLineChart';