sellmate-design-system-react 9.0.0-beta.92 → 9.0.0-beta.94

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 (49) hide show
  1. package/AGENTS.md +21 -2
  2. package/dist/components/SBarChart/README.md +1 -0
  3. package/dist/components/SBarChart/SBarChart.d.ts +7 -0
  4. package/dist/components/SBarcodeInput/README.md +2 -0
  5. package/dist/components/SButton/button.config.d.ts +2 -1
  6. package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +2 -2
  7. package/dist/components/SChatFile/chatFile.config.d.ts +2 -2
  8. package/dist/components/SCheckbox/README.md +2 -0
  9. package/dist/components/SChipFilter/README.md +2 -0
  10. package/dist/components/SGhostButton/README.md +4 -0
  11. package/dist/components/SGnb/gnb.config.d.ts +6 -0
  12. package/dist/components/SIcon/README.md +5 -1
  13. package/dist/components/SIcon/SIcon.d.ts +1 -1
  14. package/dist/components/SInput/README.md +2 -0
  15. package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +2 -7
  16. package/dist/components/SLineChart/README.md +1 -0
  17. package/dist/components/SLineChart/SLineChart.d.ts +5 -0
  18. package/dist/components/SLineChart/lineChart.config.d.ts +1 -2
  19. package/dist/components/SLoadingModal/README.md +2 -2
  20. package/dist/components/SMeatballButton/README.md +2 -0
  21. package/dist/components/SNumberInput/README.md +2 -0
  22. package/dist/components/SRadioCard/README.md +3 -0
  23. package/dist/components/SRadioCard/SRadioCard.d.ts +7 -2
  24. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +3 -1
  25. package/dist/components/SSelect/README.md +9 -4
  26. package/dist/components/SSelect/SSelect.d.ts +18 -4
  27. package/dist/components/SSelect/select.config.d.ts +34 -4
  28. package/dist/components/SStepper/stepper.config.d.ts +9 -3
  29. package/dist/components/STable/README.md +1 -1
  30. package/dist/components/STable/STable.d.ts +3 -0
  31. package/dist/components/STabs/tabs.config.d.ts +3 -8
  32. package/dist/components/STag/README.md +8 -0
  33. package/dist/components/STag/tag.config.d.ts +10 -9
  34. package/dist/components/STimePicker/timepicker.config.d.ts +3 -0
  35. package/dist/components/STree/README.md +2 -0
  36. package/dist/components/STreeTable/STreeTable.examples.d.ts +7 -0
  37. package/dist/index.cjs +1885 -1273
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +1885 -1273
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/chart/cartesian.d.ts +1 -3
  42. package/dist/lib/chart/category-labels.d.ts +37 -0
  43. package/dist/lib/chart/use-element-size.d.ts +4 -1
  44. package/dist/lib/list-box-item.d.ts +16 -0
  45. package/dist/lib/tree-row.d.ts +92 -0
  46. package/dist/llms-full.txt +52 -10
  47. package/dist/llms.txt +21 -2
  48. package/dist/styles.css +237 -88
  49. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -533,6 +533,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
533
533
  | 정해진 범위 안에서 수치 하나·구간을 끌어서 고르게 한다 | `SSlider` | §3-7-16 |
534
534
  | 바코드를 스캔해 받는다 | `SBarcodeInput` | |
535
535
  | 목록에서 하나 고르게 한다 | `SSelect` | §3-7-2 |
536
+ | 계층(카테고리 > 세부분류)을 접고 펴며 드롭다운에서 고르게 한다 | `SSelect` `type="tree"`·`"multi_tree"` | §3-7-2 — 계층을 늘 펼쳐 보여도 되면 `default_depth`·`multi_depth` |
536
537
  | 선택지를 항상 펼쳐 두고 하나 고르게 한다 | `SRadioGroup` | §3-7-2 |
537
538
  | 버튼 모양으로 모드를 하나 고르게 한다 | `SRadioButton` | §3-7-2 |
538
539
  | 선택지마다 설명이 붙어 한 줄로는 안 된다 | `SRadioCardGroup` | §3-7-2 |
@@ -569,13 +570,14 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
569
570
  | 대화의 메시지 한 건을 보여준다 | `SChatMessage` | |
570
571
  | 대화 중간에 시스템이 알리는 사실을 끼운다 (상담사 배정·대화 종료 등) | `SChatSystemMessage` | 사람이 보낸 말이면 `SChatMessage` |
571
572
  | 나열한 항목을 펼쳐 하위 내용을 보여준다 | `SExpansionList` + `SExpansionItem` | §3-7-7 |
572
- | 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 |
573
+ | 부모-자식 계층을 들여쓰기로 보여준다 | `STree` | §3-7-7 — 폼 값으로 드롭다운에서 고르는 것이면 `SSelect` `type="tree"` |
573
574
  | 계층을 이루는 행들을 여러 열로 보여준다 (카테고리 > 상품 > 옵션) | `STreeTable` | §3-7-7 — 한 줄에 라벨 하나면 `STree` |
574
575
  | 사용자가 순서를 드래그로 바꾸게 한다 | `SDraggableList` + `SDraggableItem` | §3-7-6 |
575
576
  | 날짜별 일정을 한 달치 격자로 펼쳐 보여준다 | `SCalendarBoard` | §3-7-4 |
576
577
  | 항목끼리 크기를 눈으로 견주게 한다 (채널별 매출·상품별 판매량) | `SBarChart` | 정확한 값을 읽어야 하면 `STable` — 그래프는 "어느 쪽이 큰가" 를 답하지 "얼마인가" 를 답하지 않는다 |
577
578
  | 순서가 있는 항목의 **추이**를 보여준다 (일·월별 매출 흐름, 기간별 방문 수) | `SLineChart` | 항목 순서에 뜻이 없으면(채널별·상품별) `SBarChart` — 선은 "이어진다" 는 뜻을 덤으로 얹어, 순서 없는 항목을 이으면 없는 흐름을 만든다. 항목이 대여섯 개 안쪽이고 크기를 견주는 것이 목적이면 막대가 낫다 |
578
579
  | 여러 항목의 추이를 **합계와 함께** 보여준다 (채널별 매출이 쌓여 전체가 되는 흐름) | `SLineChart stacked area` | 합계가 뜻을 갖는 값일 때만 쌓는다. 음수가 섞이거나 더해서 뜻이 없는 값(비율·평균)은 쌓지 말고 겹쳐 그린다 |
580
+ | 항목 이름이 길어 가로축에서 서로 겹친다 (상품명·채널명, `2026-10-01` 같은 날짜) | 순서 없는 항목은 `SBarChart direction="horizontal"` — 이름 열이 가장 긴 이름에 맞춰 넓어진다. 순서가 있어 세로 축을 지켜야 하면(날짜순 막대·`SLineChart`) `rotateCategoryLabels` | 이름이 짧아 겹치지 않으면 켜지 않는다 — 켜면 늘 기울어 읽기만 나빠진다. 기울여도 너무 긴 이름은 차트가 말줄임하고 전체 이름은 툴팁에 뜬다. 말줄임 폭·각도를 직접 주지 않는다. 나란히 놓인 차트는 켜고 끄기를 맞춰야 그림 높이가 같다 |
579
581
  | 항목의 크기와 **그 안의 구성**을 함께 보여준다 (주문 상태별 내역, 유입 경로별 몫) | `SBarChart stacked` | 계열끼리 견주는 것이 목적이면 `stacked` 없이 나란히 세운다. 더해서 뜻이 없는 값(비율·평균)은 쌓지 않는다 — 합계 라벨이 거짓말이 된다 |
580
582
  | 한 시점의 **전체를 몇 개의 몫으로** 나눠 보여준다 (채널별 매출 비중, 회원 등급 구성) | `SPieChart` | 조각이 대여섯 개를 넘거나 몫끼리 크기를 견주는 것이 목적이면 `SBarChart` — 사람은 각도보다 길이를 정확히 견준다. 순서가 있는 추이(월별)는 몫이 아니라 흐름이라 `SLineChart`. 0·음수는 그려지지 않으므로 증감은 원으로 나타내지 않는다. 조각은 큰 순으로 넘긴다. 폭은 부모를 따르고 그림은 그 폭의 정사각형이다 — 폭이 필요하면 `className` 으로 폭만 주고 높이는 주지 않는다 (`SDonutChart` 도 같다) |
581
583
  | 한 시점의 전체를 몫으로 나누되 **가운데가 빈 고리 모양**으로 보여준다 (시안이 도넛일 때) | `SDonutChart` | 쓰임·데이터 규칙은 `SPieChart` 와 같고 모양만 다르다 — 시안이 정한 쪽을 쓴다. **구멍에 합계·라벨을 겹쳐 올리지 않는다.** 합계 같은 값이 필요하면 차트 바깥(카드 제목·요약 값)에 적는다. 여러 기간에 걸친 구성 변화는 원을 여러 개 늘어놓지 말고 `SBarChart stacked` |
@@ -1766,11 +1768,28 @@ tableRef.current.scrollToRow(row); // 복원
1766
1768
  - **쓰는 자리는 설정 화면·마법사(스텝)의 소수 결정이다.** 고르고 나면 뒤 화면이 통째로 바뀌거나 되돌리기 어려운 선택 — 평가 대상자 범위(전체/특정 구성원), 상담 자동 배정 방식 같은 것. 목록 필터·표 안 조건처럼 같은 선택지가 화면마다 반복 노출되는 자리에는 `SRadioGroup` 을 쓴다.
1767
1769
  - `SRadioCard` 단독은 `SRadioCardGroup` 이 만들 수 없는 배치에만 쓴다 — 나열은 그룹이 맡는다 (§2-2).
1768
1770
  - 카드 안에 상태 배지를 넣으려면 `tag` 슬롯에 `STag` 를 준다. 라벨 문자열에 "(추천)" 처럼 섞어 쓰지 않는다.
1771
+ - **한 선택지에 딸린 추가 입력(지정일·요청 사항 등)은 그 카드의 슬롯에 넣는다** — `SRadioCard` 는 `children`, `SRadioCardGroup` 은 옵션의 `content`. 카드 아래에 따로 입력을 늘어놓지 않는다. 슬롯은 서브타이틀 아래에 들여써서 놓이고 라디오의 클릭 영역 밖이라, 입력을 눌러도 카드 선택이 바뀌지 않는다. 들여쓰기·간격은 카드가 넣으므로 직접 주지 않는다. 고른 카드에만 보여주고, 카드를 `disabled` 로 두면 슬롯의 컨트롤도 함께 `disabled` 로 둔다(카드가 대신 잠그지 않는다).
1769
1772
  - **카드처럼 생겼다고 `SCard`/`SSectionHeaderCard` 로 감싸지 않는다.** `SRadioCard` 자체가 완결된 요소이고, 나열 간격은 `SRadioCardGroup` 의 `direction` 이 맞춘다 (§2-2).
1770
1773
 
1774
+ ##### 후보에 상하 관계가 있으면 — depth vs tree
1775
+
1776
+ 계층은 `options` 의 `children` 으로 만든다. 평평한 `default`·`multi` 에 분류명을 라벨에 섞어 늘어놓지 않는다. 남는 선택은 **계층을 어떻게 보여주는가**와 **그룹이 값이 되는가**다.
1777
+
1778
+ | 상황 | `type` |
1779
+ | --- | --- |
1780
+ | 그룹이 몇 개 안 돼 늘 펼쳐 둬도 한눈에 읽힌다. 그룹은 분류 헤더일 뿐 값이 아니다 | `default_depth` · `multi_depth` |
1781
+ | 그룹·단계가 많아 다 펼치면 목록이 길어진다 — 접어 두고 필요한 갈래만 편다 | `tree` · `multi_tree` |
1782
+ | **그룹 자체도 값**이다 (예: "패션의류" 전체를 하나의 조건으로 고른다) — 단일 선택 | `tree` |
1783
+
1784
+ - **값에 무엇이 담기는가.** `default_depth`·`multi_depth`·`multi_tree` 는 언제나 **리프만** 담긴다 — `multi_tree`·`multi_depth` 의 그룹 체크박스는 그 아래 리프를 한꺼번에 넣고 뺄 뿐, 그룹의 `value` 는 값이 되지 않는다. 그룹의 `value` 가 값으로 오는 것은 `tree` 뿐이다.
1785
+ - **펼침 상태는 `SSelect` 가 쥔다.** 열 때마다 선택값을 품은 그룹이 펼쳐지고, 검색 중에는 걸린 줄이 보이도록 결과를 전부 펼친다. 앱이 펼칠 그룹을 따로 들고 있지 않는다.
1786
+ - 그룹의 `disabled` 는 그 줄의 선택만 막는다 — 마우스(화살표)로도 키보드(→)로도 접고 펴기는 되므로 아래의 고를 수 있는 자식에 닿는 길은 남는다.
1787
+ - 하위가 전부 비활성이면 `multi_tree`·depth 타입은 그룹도 함께 잠그므로 앱이 어미에 `disabled` 를 다시 달 필요가 없다. `tree` 는 그룹 자체가 값이라 하위가 막혀도 그룹은 고를 수 있다 — 그룹까지 막으려면 그룹에 `disabled` 를 직접 준다.
1788
+ - 드롭다운 없이 화면에 계층을 펼쳐 두고 여러 개를 체크하게 하는 것이면 `SSelect` 가 아니라 `STree` 다 (§3-7-7).
1789
+
1771
1790
  ##### 여러 개 고른 값을 칩으로 보여줄 때 — `valueDisplay="chip"`
1772
1791
 
1773
- - **`type="multi"`·`"multi_depth"` 에서 `valueDisplay="chip"` 을 주면** 선택값이 트리거에 칩으로 뜨고, 칩의 × 로 하나씩 뺄 수 있다. 기본(`text`)은 라벨을 쉼표로 이어 한 줄로 말줄임한다. 고른 값 하나하나를 확인하고 바로 빼야 하는 자리면 `chip`, 몇 개 골랐는지만 보이면 되는 조회 필터면 `text` 를 쓴다.
1792
+ - **`type="multi"`·`"multi_depth"`·`"multi_tree"` 에서 `valueDisplay="chip"` 을 주면** 선택값이 트리거에 칩으로 뜨고, 칩의 × 로 하나씩 뺄 수 있다. 기본(`text`)은 라벨을 쉼표로 이어 한 줄로 말줄임한다. 고른 값 하나하나를 확인하고 바로 빼야 하는 자리면 `chip`, 몇 개 골랐는지만 보이면 되는 조회 필터면 `text` 를 쓴다.
1774
1793
  - **후보가 정해진 목록에서 고르는 것이면 `SSelect` 의 `chip` 이고, 사용자가 값을 직접 타이핑해 쌓는 것이면 `SChipInput` 이다.** 목록에서 고른 값을 `SChipInput` 에 옮겨 담거나, `SSelect` 옆에 `SChip` 을 따로 나열해 선택값을 흉내 내지 않는다.
1775
1794
  - **단일 선택 type 에는 주지 않는다.** 무시되고 `text` 로 보인다. 단일 선택의 값 비우기는 `clearable` 이 맡는다.
1776
1795
  - 칩이 한 줄을 넘으면 줄바꿈하고 트리거가 그만큼 높아진다. 높이·칩 간격은 `SSelect` 가 토큰으로 넣는다 — 직접 주지 않는다.
@@ -20,6 +20,7 @@
20
20
  | `tickCount?` | `number` | `8` | 값 축 눈금 개수 |
21
21
  | `barSize?` | `number` | `BAR_SIZE_MAX` | 막대 두께 상한(px, 24~80). 낮추면 좌우 여백 상한도 같은 비율로 따라 내려온다 |
22
22
  | `showValueLabel?` | `boolean` | `true` | 막대마다 값을 적는다 |
23
+ | `rotateCategoryLabels?` | `boolean` | `false` | 항목 이름을 -45° 기울인다. 이름이 막대 묶음 폭보다 길어 서로 겹칠 때 쓴다. 기울여도 너무 긴 이름은 말줄임되고, 전체 이름은 툴팁 제목에서 읽힌다. 이름이 아주 길면 기울이기보다 `direction='horizontal'` 이 먼저다. 세로 막대에서만 쓴다 — 가로 막대는 이름 열이 가장 긴 이름에 맞춰 넓어지므로 무시한다 |
23
24
  | `showLegend?` | `boolean` | `true` | 범례를 보인다 |
24
25
  | `legendPosition?` | `SBarChartLegendPosition` | `'top'` | 범례 위치 |
25
26
  | `showTooltip?` | `boolean` | `true` | 막대에 마우스를 올리면 값 상자를 띄운다 |
@@ -70,6 +70,13 @@ export interface SBarChartProps {
70
70
  barSize?: number;
71
71
  /** 막대마다 값을 적는다 */
72
72
  showValueLabel?: boolean;
73
+ /**
74
+ * 항목 이름을 -45° 기울인다. 이름이 막대 묶음 폭보다 길어 서로 겹칠 때 쓴다.
75
+ * 기울여도 너무 긴 이름은 말줄임되고, 전체 이름은 툴팁 제목에서 읽힌다.
76
+ * 이름이 아주 길면 기울이기보다 `direction='horizontal'` 이 먼저다.
77
+ * 세로 막대에서만 쓴다 — 가로 막대는 이름 열이 가장 긴 이름에 맞춰 넓어지므로 무시한다
78
+ */
79
+ rotateCategoryLabels?: boolean;
73
80
  /** 범례를 보인다 */
74
81
  showLegend?: boolean;
75
82
  /** 범례 위치 */
@@ -63,6 +63,7 @@ export type SBarcodeInputSize = SFieldSize;
63
63
 
64
64
  - [SField](../SField)
65
65
  - [SGhostButton](../SGhostButton)
66
+ - [STag](../STag)
66
67
 
67
68
  ### Graph
68
69
 
@@ -70,5 +71,6 @@ export type SBarcodeInputSize = SFieldSize;
70
71
  graph TD;
71
72
  SBarcodeInput --> SField
72
73
  SBarcodeInput --> SGhostButton
74
+ SBarcodeInput --> STag
73
75
  style SBarcodeInput fill:#f9f,stroke:#333,stroke-width:4px
74
76
  ```
@@ -26,7 +26,8 @@ export declare const BUTTON_SIZE_CONFIG: Record<SButtonSize, {
26
26
  height: string;
27
27
  paddingX: string;
28
28
  gap: string;
29
- iconSize: number;
29
+ iconSize: string;
30
+ iconOnlyWidth: string;
30
31
  fontSize: number;
31
32
  fontWeight: number;
32
33
  radius: string;
@@ -14,8 +14,8 @@ export declare const CHAT_ATTACHED_FILE_CONFIG: {
14
14
  readonly contentGap: "gap-(--cmp-chatAttachedFile-content-gap)";
15
15
  /** 클립 아이콘이 앉는 칩 — 내부 패딩·면·라운드 (높이는 아이콘+패딩이 정한다) */
16
16
  readonly tile: "p-(--cmp-chatAttachedFile-icon-wrapper-padding) rounded-(--cmp-chatAttachedFile-icon-wrapper-radius) bg-(--cmp-chatAttachedFile-icon-wrapper-bg)";
17
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
18
- readonly iconSize: 16;
17
+ /** 칩 안 클립 아이콘 크기 */
18
+ readonly iconSize: "var(--cmp-chatAttachedFile-icon-size)";
19
19
  /** 파일명 타이포 프리셋 */
20
20
  readonly nameTypo: "typo-body-sm-default";
21
21
  /** 파일명 텍스트색 */
@@ -21,8 +21,8 @@ export declare const CHAT_FILE_CONFIG: {
21
21
  * 디자인팀에 `icon.wrapper.bg.hover` 를 요청해 나오는 대로 갈아끼운다.
22
22
  */
23
23
  readonly tile: "p-(--cmp-chatFile-icon-wrapper-padding) rounded-(--cmp-chatFile-icon-wrapper-radius) bg-(--cmp-chatFile-icon-wrapper-bg) group-hover/chat-file:bg-(--sys-color-bg-frame)";
24
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
25
- readonly iconSize: 20;
24
+ /** 칩 안 클립 아이콘 크기 */
25
+ readonly iconSize: "var(--cmp-chatFile-icon-size)";
26
26
  /** 파일명 타이포 프리셋 */
27
27
  readonly nameTypo: "typo-body-md-bold";
28
28
  /** 파일명·부가정보 텍스트색 */
@@ -36,6 +36,7 @@ export type SCheckboxValue = boolean | unknown[] | null;
36
36
  ### Used by
37
37
 
38
38
  - [SKeyValueTable](../SKeyValueTable)
39
+ - [SSelect](../SSelect)
39
40
  - [STable](../STable)
40
41
  - [STree](../STree)
41
42
 
@@ -49,6 +50,7 @@ export type SCheckboxValue = boolean | unknown[] | null;
49
50
  graph TD;
50
51
  SCheckbox --> SIcon
51
52
  SKeyValueTable --> SCheckbox
53
+ SSelect --> SCheckbox
52
54
  STable --> SCheckbox
53
55
  STree --> SCheckbox
54
56
  style SCheckbox fill:#f9f,stroke:#333,stroke-width:4px
@@ -400,6 +400,7 @@ export interface SChipFilterDatePreset {
400
400
 
401
401
  - [SDatePicker](../SDatePicker)
402
402
  - [SDateRangePicker](../SDateRangePicker)
403
+ - [SGhostButton](../SGhostButton)
403
404
  - [SIcon](../SIcon)
404
405
  - [SRadio](../SRadio)
405
406
  - [SRadioButton](../SRadioButton)
@@ -414,6 +415,7 @@ export interface SChipFilterDatePreset {
414
415
  graph TD;
415
416
  SChipFilter --> SDatePicker
416
417
  SChipFilter --> SDateRangePicker
418
+ SChipFilter --> SGhostButton
417
419
  SChipFilter --> SIcon
418
420
  SChipFilter --> SRadio
419
421
  SChipFilter --> SRadioButton
@@ -54,6 +54,7 @@ export type SGhostButtonIntent =
54
54
  - [SChatAttachedFile](../SChatAttachedFile)
55
55
  - [SChatInput](../SChatInput)
56
56
  - [SChip](../SChip)
57
+ - [SChipFilter](../SChipFilter)
57
58
  - [SDatePicker](../SDatePicker)
58
59
  - [SDateRangePicker](../SDateRangePicker)
59
60
  - [SFilePicker](../SFilePicker)
@@ -66,6 +67,7 @@ export type SGhostButtonIntent =
66
67
  - [SPage](../SPage)
67
68
  - [SPopover](../SPopover)
68
69
  - [SSearchInput](../SSearchInput)
70
+ - [SSelect](../SSelect)
69
71
  - [STable](../STable)
70
72
  - [STimePicker](../STimePicker)
71
73
  - [STimeRangePicker](../STimeRangePicker)
@@ -91,6 +93,7 @@ graph TD;
91
93
  SChatAttachedFile --> SGhostButton
92
94
  SChatInput --> SGhostButton
93
95
  SChip --> SGhostButton
96
+ SChipFilter --> SGhostButton
94
97
  SDatePicker --> SGhostButton
95
98
  SDateRangePicker --> SGhostButton
96
99
  SFilePicker --> SGhostButton
@@ -103,6 +106,7 @@ graph TD;
103
106
  SPage --> SGhostButton
104
107
  SPopover --> SGhostButton
105
108
  SSearchInput --> SGhostButton
109
+ SSelect --> SGhostButton
106
110
  STable --> SGhostButton
107
111
  STimePicker --> SGhostButton
108
112
  STimeRangePicker --> SGhostButton
@@ -43,10 +43,14 @@ export declare const GNB_MENU: Record<SGnbType, {
43
43
  depth2PaddingLeft: string;
44
44
  depth3PaddingLeft: string;
45
45
  depth1Icon: string;
46
+ depth1Typo: string;
47
+ itemTypo: string;
48
+ itemTypoSelected: string;
46
49
  depth1FontSize: number;
47
50
  depth1LineHeight: number;
48
51
  depth1FontWeight: number;
49
52
  itemFontSize: number;
53
+ /** 하위 메뉴 하이픈 자리표시자 높이(px) = item 타이포 line-height */
50
54
  itemLineHeight: number;
51
55
  itemFontWeight: number;
52
56
  itemFontWeightSelected: number;
@@ -91,6 +95,8 @@ export declare const GNB_RAIL: {
91
95
  itemPaddingBottom: string;
92
96
  itemRadius: string;
93
97
  itemIcon: string;
98
+ itemTypo: string;
99
+ itemTypoSelected: string;
94
100
  itemFontSize: number;
95
101
  itemLineHeight: number;
96
102
  itemFontWeight: number;
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `name` | `SIconName` | — | 아이콘명 |
12
- | `size?` | `number \| string` | `24` | 아이콘 크기(px 또는 CSS 길이) |
12
+ | `size?` | `number \| string` | `24` | 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다 |
13
13
  | `color?` | `SColor` | — | 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상. 미지정 시 currentColor 상속 |
14
14
  | `rotate?` | `0 \| 90 \| 180 \| 270` | — | 회전 각도 |
15
15
  | `label?` | `string` | — | 접근성 라벨. 없으면 aria-hidden 처리 |
@@ -48,6 +48,7 @@
48
48
  - [SLauncherListBox](../SLauncherListBox)
49
49
  - [SListItem](../SListItem)
50
50
  - [SLoadingModal](../SLoadingModal)
51
+ - [SMeatballButton](../SMeatballButton)
51
52
  - [SNumberInput](../SNumberInput)
52
53
  - [SPagination](../SPagination)
53
54
  - [SPopover](../SPopover)
@@ -63,6 +64,7 @@
63
64
  - [STimeRangePicker](../STimeRangePicker)
64
65
  - [SToast](../SToast)
65
66
  - [STooltip](../STooltip)
67
+ - [STree](../STree)
66
68
 
67
69
  ### Graph
68
70
 
@@ -96,6 +98,7 @@ graph TD;
96
98
  SLauncherListBox --> SIcon
97
99
  SListItem --> SIcon
98
100
  SLoadingModal --> SIcon
101
+ SMeatballButton --> SIcon
99
102
  SNumberInput --> SIcon
100
103
  SPagination --> SIcon
101
104
  SPopover --> SIcon
@@ -111,5 +114,6 @@ graph TD;
111
114
  STimeRangePicker --> SIcon
112
115
  SToast --> SIcon
113
116
  STooltip --> SIcon
117
+ STree --> SIcon
114
118
  style SIcon fill:#f9f,stroke:#333,stroke-width:4px
115
119
  ```
@@ -4,7 +4,7 @@ import { type SIconName } from './icons.gen';
4
4
  export interface SIconProps {
5
5
  /** 아이콘명 */
6
6
  name: SIconName;
7
- /** 아이콘 크기(px 또는 CSS 길이) */
7
+ /** 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다 */
8
8
  size?: number | string;
9
9
  /** 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상. 미지정 시 currentColor 상속 */
10
10
  color?: SColor;
@@ -57,6 +57,7 @@
57
57
 
58
58
  - [SField](../SField)
59
59
  - [SGhostButton](../SGhostButton)
60
+ - [STag](../STag)
60
61
 
61
62
  ### Graph
62
63
 
@@ -64,6 +65,7 @@
64
65
  graph TD;
65
66
  SInput --> SField
66
67
  SInput --> SGhostButton
68
+ SInput --> STag
67
69
  SEditor --> SInput
68
70
  SKeyValueTable --> SInput
69
71
  style SInput fill:#f9f,stroke:#333,stroke-width:4px
@@ -94,13 +94,8 @@ export declare const LAUNCHER_LIST_BOX_LAYOUT: {
94
94
  readonly radius: string;
95
95
  /** 패널 상하좌우 여백 */
96
96
  readonly padding: string;
97
- /**
98
- * 패널 그림자.
99
- * 토큰(`component.gnb.launcher.listBox.shadow` = `{shadow.floating}`)은 값이 배열이라
100
- * `--cmp-*` 로 나오지 않는다 — 생성기가 스칼라만 내보내기 때문이다. 그래서 그 별칭이
101
- * 가리키는 스케일 토큰을 직접 쓴다(같은 값이다).
102
- */
103
- readonly shadow: "var(--shadow-floating)";
97
+ /** 패널 그림자 */
98
+ readonly shadow: string;
104
99
  /** 줄 왼쪽 여백 */
105
100
  readonly itemPaddingLeft: string;
106
101
  /** 줄 오른쪽 여백 — 왼쪽보다 좁다(오른쪽 끝은 hover 아이콘 자리다) */
@@ -22,6 +22,7 @@
22
22
  | `tickCount?` | `number` | `8` | 값 축 눈금 개수 |
23
23
  | `showPoint?` | `boolean` | `true` | 데이터 지점마다 점을 찍는다. 꺼도 짚은 항목의 점은 뜬다 |
24
24
  | `showValueLabel?` | `boolean` | `false` | 점마다 값을 적는다. 기본은 끔 — 선 그래프는 항목이 많은 데이터에 쓰는 일이 잦아 숫자가 서로 붙는다. 항목이 대여섯 개 안쪽일 때만 켠다 |
25
+ | `rotateCategoryLabels?` | `boolean` | `false` | 항목 이름을 -45° 기울인다. 이름이 점 간격보다 길어 서로 겹칠 때 쓴다. 기울여도 너무 긴 이름은 말줄임되고, 전체 이름은 툴팁 제목에서 읽힌다 |
25
26
  | `showLegend?` | `boolean` | `true` | 범례를 보인다 |
26
27
  | `legendPosition?` | `SLineChartLegendPosition` | `'top'` | 범례 위치 |
27
28
  | `showTooltip?` | `boolean` | `true` | 항목에 마우스를 올리면 값 상자를 띄운다 |
@@ -78,6 +78,11 @@ export interface SLineChartProps {
78
78
  * 숫자가 서로 붙는다. 항목이 대여섯 개 안쪽일 때만 켠다
79
79
  */
80
80
  showValueLabel?: boolean;
81
+ /**
82
+ * 항목 이름을 -45° 기울인다. 이름이 점 간격보다 길어 서로 겹칠 때 쓴다.
83
+ * 기울여도 너무 긴 이름은 말줄임되고, 전체 이름은 툴팁 제목에서 읽힌다
84
+ */
85
+ rotateCategoryLabels?: boolean;
81
86
  /** 범례를 보인다 */
82
87
  showLegend?: boolean;
83
88
  /** 범례 위치 */
@@ -48,8 +48,7 @@ export declare const POINT_HOVER_RADIUS = 6;
48
48
  export declare const POINT_HALO_RADIUS = 12;
49
49
  export declare const POINT_HALO_OPACITY = "var(--cmp-chart-line-point-opacity-bg)";
50
50
  /**
51
- * 짚은 점이 실제로 차지하는 반지름 — 바탕 원까지다. 툴팁이 이만큼 비켜서고,
52
- * 양끝 점이 잘리지 않게 스크롤 컨테이너도 이만큼 넓어진다.
51
+ * 짚은 점이 실제로 차지하는 반지름 — 바탕 원까지다. 툴팁이 이만큼 비켜선다.
53
52
  */
54
53
  export declare const POINT_HOVER_EXTENT = 12;
55
54
  /**
@@ -15,8 +15,8 @@
15
15
  | `message?` | `string \| string[]` | — | 메시지 (없으면 state 기본값) |
16
16
  | `showButton?` | `boolean` | `false` | 하단 버튼 표시 |
17
17
  | `buttonLabel?` | `string` | — | 버튼 레이블 (없으면 state 기본값) |
18
- | `width?` | `number \| string` | `520` | |
19
- | `height?` | `number \| string` | `320` | |
18
+ | `width?` | `number \| string` | `'var(--cmp-modal-loading-width)'` | |
19
+ | `height?` | `number \| string` | `'var(--cmp-modal-loading-height)'` | |
20
20
 
21
21
  #### Events
22
22
 
@@ -57,11 +57,13 @@ export type SMeatballButtonItem = SDropdownButtonItem;
57
57
  ### Depends on
58
58
 
59
59
  - [SGhostButton](../SGhostButton)
60
+ - [SIcon](../SIcon)
60
61
 
61
62
  ### Graph
62
63
 
63
64
  ```mermaid
64
65
  graph TD;
65
66
  SMeatballButton --> SGhostButton
67
+ SMeatballButton --> SIcon
66
68
  style SMeatballButton fill:#f9f,stroke:#333,stroke-width:4px
67
69
  ```
@@ -73,6 +73,7 @@ export type SNumberInputSize = SFieldSize;
73
73
 
74
74
  - [SField](../SField)
75
75
  - [SIcon](../SIcon)
76
+ - [STag](../STag)
76
77
 
77
78
  ### Graph
78
79
 
@@ -80,6 +81,7 @@ export type SNumberInputSize = SFieldSize;
80
81
  graph TD;
81
82
  SNumberInput --> SField
82
83
  SNumberInput --> SIcon
84
+ SNumberInput --> STag
83
85
  SKeyValueTable --> SNumberInput
84
86
  style SNumberInput fill:#f9f,stroke:#333,stroke-width:4px
85
87
  ```
@@ -32,6 +32,7 @@
32
32
  | `value?` | `SRadioValue \| null` | — | 그룹의 현재 선택 값 |
33
33
  | `label` | `string` | — | 라벨 (첫 줄) |
34
34
  | `subtitle?` | `string` | — | 서브타이틀 (둘째 줄). 라벨 왼쪽 끝에 맞춰 들여쓴다 |
35
+ | `children?` | `ReactNode` | — | 서브타이틀 아래 슬롯. 서브타이틀처럼 라벨 왼쪽 끝에 맞춰 들여쓴다. 카드 테두리 안이지만 라디오의 클릭 영역 밖이라, 입력·버튼 같은 컨트롤을 넣어도 누를 때 카드가 선택되지 않는다 |
35
36
  | `tag?` | `Omit<STagProps, 'size'>` | — | 라벨 오른쪽에 붙일 태그. `STag` 의 props 를 그대로 받되 크기는 `xs` 로 고정된다 |
36
37
  | `disabled?` | `boolean` | `false` | 비활성 |
37
38
  | `name?` | `string` | — | native radio name (form-agnostic 그룹핑) |
@@ -56,6 +57,8 @@ export interface SRadioCardOption {
56
57
  label: string;
57
58
  /** 서브타이틀 (둘째 줄) */
58
59
  subtitle?: string;
60
+ /** 서브타이틀 아래 슬롯 (`SRadioCard` 의 `children`). 라디오의 클릭 영역 밖이다 */
61
+ content?: ReactNode;
59
62
  /** 라벨 오른쪽에 붙일 태그 (`STag` props, 크기는 `xs` 고정) */
60
63
  tag?: Omit<STagProps, 'size'>;
61
64
  /** 이 옵션만 비활성 */
@@ -1,4 +1,4 @@
1
- import { type CSSProperties } from 'react';
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
2
  import { type SRadioValue } from '../SRadio';
3
3
  import { type STagProps } from '../STag';
4
4
  export interface SRadioCardProps {
@@ -10,6 +10,11 @@ export interface SRadioCardProps {
10
10
  label: string;
11
11
  /** 서브타이틀 (둘째 줄). 라벨 왼쪽 끝에 맞춰 들여쓴다 */
12
12
  subtitle?: string;
13
+ /**
14
+ * 서브타이틀 아래 슬롯. 서브타이틀처럼 라벨 왼쪽 끝에 맞춰 들여쓴다.
15
+ * 카드 테두리 안이지만 라디오의 클릭 영역 밖이라, 입력·버튼 같은 컨트롤을 넣어도 누를 때 카드가 선택되지 않는다
16
+ */
17
+ children?: ReactNode;
13
18
  /** 라벨 오른쪽에 붙일 태그. `STag` 의 props 를 그대로 받되 크기는 `xs` 로 고정된다 */
14
19
  tag?: Omit<STagProps, 'size'>;
15
20
  /** 비활성 */
@@ -26,4 +31,4 @@ export interface SRadioCardProps {
26
31
  * 카드 전체가 클릭 영역이며 `value === val` 이면 선택 상태다.
27
32
  * 선택지마다 설명이 붙어 한 줄짜리 `SRadio` 로는 담기 어려울 때 쓴다.
28
33
  */
29
- export declare function SRadioCard({ val, value, label, subtitle, tag, disabled, name, onValueChange, className, style, }: SRadioCardProps): import("react").JSX.Element;
34
+ export declare function SRadioCard({ val, value, label, subtitle, children, tag, disabled, name, onValueChange, className, style, }: SRadioCardProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- import { type CSSProperties } from 'react';
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
2
  import { type SRadioValue } from '../SRadio';
3
3
  import { type STagProps } from '../STag';
4
4
  export interface SRadioCardOption {
@@ -8,6 +8,8 @@ export interface SRadioCardOption {
8
8
  label: string;
9
9
  /** 서브타이틀 (둘째 줄) */
10
10
  subtitle?: string;
11
+ /** 서브타이틀 아래 슬롯 (`SRadioCard` 의 `children`). 라디오의 클릭 영역 밖이다 */
12
+ content?: ReactNode;
11
13
  /** 라벨 오른쪽에 붙일 태그 (`STag` props, 크기는 `xs` 고정) */
12
14
  tag?: Omit<STagProps, 'size'>;
13
15
  /** 이 옵션만 비활성 */
@@ -12,8 +12,8 @@
12
12
  | `valueAsPrimitive?` | `boolean` | `false` | `value`·`onValueChange` 가 옵션 객체 대신 원시값(string|number)을 주고받는다. **기본값 `false`(옵션 객체)는 유지한다** — 원본(sd-select) 호환 때문이고, 뒤집으면 이 값을 주지 않던 화면이 조용히 다른 모양의 값을 받게 되어 타입으로도 잡히지 않는다. 새로 쓰는 화면은 켜는 쪽이 다루기 쉽다 — 서버로 보내는 것도, 폼 상태에 담는 것도 결국 값 하나이기 때문이다. |
13
13
  | `name?` | `string` | — | 폼 연동용 name 속성 |
14
14
  | `options?` | `SSelectOption[]` | `[]` | 옵션 목록 (children으로 계층 표현) |
15
- | `type?` | `SSelectType` | `'default'` | 타입: default | multi | default_depth | multi_depth |
16
- | `valueDisplay?` | `SSelectValueDisplay` | `'text'` | 트리거에 선택값을 보여주는 방식. - `text`: 선택 라벨을 쉼표로 이어 한 줄로 보여준다. 넘치면 말줄임한다. - `chip`: 선택값마다 칩을 낸다. 칩의 × 를 누르면 그 값만 선택에서 빠지고, 드롭다운은 열리지 않는다. 칩이 한 줄을 넘으면 줄바꿈하고 트리거가 그만큼 높아진다. `chip` 은 `multi`·`multi_depth` 에서만 동작한다. 단일 선택 type 에서는 무시하고 `text` 로 보여준다. 전체 선택이면 칩 대신 `allSelectedLabel` 을 보여준다. `multi_depth` 에서 그룹의 하위 리프를 전부 고르면 리프 칩 대신 그룹명 칩 하나로 묶고, 그 칩의 × 는 그룹의 리프를 한꺼번에 뺀다. 비활성(select 자체나 해당 옵션)인 칩에는 × 를 내지 않는다. |
15
+ | `type?` | `SSelectType` | `'default'` | 타입 — 단일/다중 선택과 계층을 어떻게 보여주는지를 정한다. - `default` · `multi`: 평평한 목록 - `default_depth` · `multi_depth`: 계층을 늘 펼친 그룹 헤더로 보여준다. `default_depth` 의 그룹은 고를 수 없고, `multi_depth` 의 그룹 체크박스는 하위 리프를 한꺼번에 토글한다. - `tree` · `multi_tree`: 계층을 접고 펼 수 있는 트리로 보여준다. 처음에는 접혀 있고, 열 때 선택값을 품은 그룹만 펼친다. 검색 중에는 걸린 줄이 보이도록 전부 펼친다. `tree` 는 그룹(부모)도 값으로 고를 수 있다. `multi_tree` 의 그룹 체크박스는 하위 리프를 한꺼번에 토글하고, 방출값에는 리프만 담긴다(`multi_depth` 와 같다). 키보드 → 는 그룹을 펼치거나(펼쳐져 있으면 첫 자식으로 들어가고), ← 는 접거나 부모 줄로 올라간다. 검색 입력에 포커스가 있으면 커서가 그 방향 끝에 닿아 있을 때만 트리 조작으로 쓴다. 그룹의 `disabled` 는 선택만 막고 접고 펴기는 그대로 된다. `tree` 는 하위가 전부 비활성이어도 그룹을 고를 수 있다 (그룹까지 막으려면 그룹에 `disabled` 를 직접 준다). 드롭다운 안의 줄은 `STree` 와 같은 모양(연결선·화살표·체크박스·라벨 타이포)으로 그린다. |
16
+ | `valueDisplay?` | `SSelectValueDisplay` | `'text'` | 트리거에 선택값을 보여주는 방식. - `text`: 선택 라벨을 쉼표로 이어 한 줄로 보여준다. 넘치면 말줄임한다. - `chip`: 선택값마다 칩을 낸다. 칩의 × 를 누르면 그 값만 선택에서 빠지고, 드롭다운은 열리지 않는다. 칩이 한 줄을 넘으면 줄바꿈하고 트리거가 그만큼 높아진다. `chip` 은 `multi`·`multi_depth`·`multi_tree` 에서만 동작한다. 단일 선택 type 에서는 무시하고 `text` 로 보여준다. 전체 선택이면 칩 대신 `allSelectedLabel` 을 보여준다. `multi_depth`·`multi_tree` 에서 그룹의 하위 리프를 전부 고르면 리프 칩 대신 그룹명 칩 하나로 묶고, 그 칩의 × 는 그룹의 리프를 한꺼번에 뺀다. 비활성(select 자체나 해당 옵션)인 칩에는 × 를 내지 않는다. |
17
17
  | `showSearch?` | `boolean` | `false` | 검색 입력 사용 |
18
18
  | `showSelectAll?` | `boolean` | `false` | 전체선택 옵션 사용 (multi 전용) |
19
19
  | `allSelectedLabel?` | `string` | `'전체'` | 전체선택 레이블 |
@@ -61,7 +61,7 @@
61
61
 
62
62
  | Method | Type | Description |
63
63
  |--------|------|-------------|
64
- | `focus` | `() => void` | 트리거 버튼에 포커스 (sdFocus) |
64
+ | `focus` | `() => void` | 트리거(combobox)에 포커스 (sdFocus) |
65
65
  | `open` | `() => void` | 드롭다운 열기 (sdOpen) |
66
66
 
67
67
  ## Types
@@ -94,7 +94,8 @@ export interface SSelectOption {
94
94
  ### SSelectType
95
95
 
96
96
  ```ts
97
- export type SSelectType = 'default' | 'multi' | 'default_depth' | 'multi_depth';
97
+ export type SSelectType =
98
+ 'default' | 'multi' | 'default_depth' | 'multi_depth' | 'tree' | 'multi_tree';
98
99
  ```
99
100
 
100
101
  ### SSelectValueDisplay
@@ -113,8 +114,10 @@ export type SSelectValueDisplay = 'text' | 'chip';
113
114
 
114
115
  ### Depends on
115
116
 
117
+ - [SCheckbox](../SCheckbox)
116
118
  - [SCircleProgress](../SCircleProgress)
117
119
  - [SField](../SField)
120
+ - [SGhostButton](../SGhostButton)
118
121
  - [SIcon](../SIcon)
119
122
  - [SPortal](../SPortal)
120
123
  - [SSearchInput](../SSearchInput)
@@ -123,8 +126,10 @@ export type SSelectValueDisplay = 'text' | 'chip';
123
126
 
124
127
  ```mermaid
125
128
  graph TD;
129
+ SSelect --> SCheckbox
126
130
  SSelect --> SCircleProgress
127
131
  SSelect --> SField
132
+ SSelect --> SGhostButton
128
133
  SSelect --> SIcon
129
134
  SSelect --> SPortal
130
135
  SSelect --> SSearchInput
@@ -8,7 +8,7 @@ import { type SSelectOption, type SSelectType, type SSelectValueDisplay } from '
8
8
  import { type SFieldWidth } from '../../lib/field-width';
9
9
  export type { SSelectOption, SSelectType, SSelectValueDisplay } from './select.config';
10
10
  export interface SSelectHandle {
11
- /** 트리거 버튼에 포커스 (sdFocus) */
11
+ /** 트리거(combobox)에 포커스 (sdFocus) */
12
12
  focus: () => void;
13
13
  /** 드롭다운 열기 (sdOpen) */
14
14
  open: () => void;
@@ -42,7 +42,21 @@ export interface SSelectProps<TValue extends SSelectChangeValue = SSelectChangeV
42
42
  name?: string;
43
43
  /** 옵션 목록 (children으로 계층 표현) */
44
44
  options?: SSelectOption[];
45
- /** 타입: default | multi | default_depth | multi_depth */
45
+ /**
46
+ * 타입 — 단일/다중 선택과 계층을 어떻게 보여주는지를 정한다.
47
+ * - `default` · `multi`: 평평한 목록
48
+ * - `default_depth` · `multi_depth`: 계층을 늘 펼친 그룹 헤더로 보여준다.
49
+ * `default_depth` 의 그룹은 고를 수 없고, `multi_depth` 의 그룹 체크박스는 하위 리프를 한꺼번에 토글한다.
50
+ * - `tree` · `multi_tree`: 계층을 접고 펼 수 있는 트리로 보여준다. 처음에는 접혀 있고, 열 때 선택값을 품은
51
+ * 그룹만 펼친다. 검색 중에는 걸린 줄이 보이도록 전부 펼친다.
52
+ * `tree` 는 그룹(부모)도 값으로 고를 수 있다. `multi_tree` 의 그룹 체크박스는 하위 리프를 한꺼번에
53
+ * 토글하고, 방출값에는 리프만 담긴다(`multi_depth` 와 같다).
54
+ * 키보드 → 는 그룹을 펼치거나(펼쳐져 있으면 첫 자식으로 들어가고), ← 는 접거나 부모 줄로 올라간다.
55
+ * 검색 입력에 포커스가 있으면 커서가 그 방향 끝에 닿아 있을 때만 트리 조작으로 쓴다.
56
+ * 그룹의 `disabled` 는 선택만 막고 접고 펴기는 그대로 된다. `tree` 는 하위가 전부 비활성이어도 그룹을 고를 수 있다
57
+ * (그룹까지 막으려면 그룹에 `disabled` 를 직접 준다).
58
+ * 드롭다운 안의 줄은 `STree` 와 같은 모양(연결선·화살표·체크박스·라벨 타이포)으로 그린다.
59
+ */
46
60
  type?: SSelectType;
47
61
  /**
48
62
  * 트리거에 선택값을 보여주는 방식.
@@ -50,9 +64,9 @@ export interface SSelectProps<TValue extends SSelectChangeValue = SSelectChangeV
50
64
  * - `chip`: 선택값마다 칩을 낸다. 칩의 × 를 누르면 그 값만 선택에서 빠지고, 드롭다운은 열리지 않는다.
51
65
  * 칩이 한 줄을 넘으면 줄바꿈하고 트리거가 그만큼 높아진다.
52
66
  *
53
- * `chip` 은 `multi`·`multi_depth` 에서만 동작한다. 단일 선택 type 에서는 무시하고 `text` 로 보여준다.
67
+ * `chip` 은 `multi`·`multi_depth`·`multi_tree` 에서만 동작한다. 단일 선택 type 에서는 무시하고 `text` 로 보여준다.
54
68
  * 전체 선택이면 칩 대신 `allSelectedLabel` 을 보여준다.
55
- * `multi_depth` 에서 그룹의 하위 리프를 전부 고르면 리프 칩 대신 그룹명 칩 하나로 묶고,
69
+ * `multi_depth`·`multi_tree` 에서 그룹의 하위 리프를 전부 고르면 리프 칩 대신 그룹명 칩 하나로 묶고,
56
70
  * 그 칩의 × 는 그룹의 리프를 한꺼번에 뺀다.
57
71
  * 비활성(select 자체나 해당 옵션)인 칩에는 × 를 내지 않는다.
58
72
  */
@@ -4,7 +4,7 @@ export interface SSelectOption {
4
4
  disabled?: boolean;
5
5
  children?: SSelectOption[];
6
6
  }
7
- export type SSelectType = 'default' | 'multi' | 'default_depth' | 'multi_depth';
7
+ export type SSelectType = 'default' | 'multi' | 'default_depth' | 'multi_depth' | 'tree' | 'multi_tree';
8
8
  /** 트리거에 선택값을 보여주는 방식 — 쉼표로 이은 텍스트 | 값마다 칩 */
9
9
  export type SSelectValueDisplay = 'text' | 'chip';
10
10
  export interface FlatOption {
@@ -12,12 +12,18 @@ export interface FlatOption {
12
12
  label: string;
13
13
  disabled: boolean;
14
14
  depth: number;
15
- /** children 을 가진 그룹(비선택) 노드 */
15
+ /** children 을 가진 그룹 노드 — 그 자체가 값이 되는 것은 `tree` 타입뿐이다 */
16
16
  isGroup: boolean;
17
17
  raw: string | number;
18
18
  }
19
- /** 트리 옵션을 depth 정보를 유지한 평탄 리스트로 변환. */
20
- export declare function flattenOptions(options: SSelectOption[], depth?: number): FlatOption[];
19
+ /**
20
+ * 트리 옵션을 depth 정보를 유지한 평탄 리스트로 변환.
21
+ *
22
+ * @param inheritDisabled 하위가 전부 비활성인 그룹을 비활성으로 칠 것인가. 그룹이 값이 아닌 타입에서는
23
+ * 고를 것이 없는 그룹이라 잠그는 게 맞지만, 그룹 자체가 값인 `tree` 에서는 자식이 막혔다고 그룹까지
24
+ * 고를 수 없게 되면 안 된다 — 그때는 그룹에 직접 준 `disabled` 만 본다.
25
+ */
26
+ export declare function flattenOptions(options: SSelectOption[], depth?: number, inheritDisabled?: boolean): FlatOption[];
21
27
  /** 선택 가능한(비그룹) 옵션만 */
22
28
  export declare const selectableOptions: (flat: FlatOption[]) => FlatOption[];
23
29
  /**
@@ -27,6 +33,30 @@ export declare const selectableOptions: (flat: FlatOption[]) => FlatOption[];
27
33
  * (multi_depth 부모 체크박스의 상태/카운트/토글 계산에 사용)
28
34
  */
29
35
  export declare function collectGroupLeafValues(flat: FlatOption[], groupIndex: number): string[];
36
+ /**
37
+ * 트리 타입에서 접힌 그룹의 자손을 걷어내고 화면에 남는 줄만 돌려준다.
38
+ * `sourceIndex[i]` 는 남은 i 번째 줄이 입력 `rows` 에서 몇 번째였는가 — 접힌 그룹의 하위 리프는
39
+ * 화면에 없어도 그룹 체크박스가 세야 하므로, 그 계산은 입력 `rows` 기준으로 한다.
40
+ */
41
+ export declare function visibleTreeRows(rows: FlatOption[], isExpanded: (group: FlatOption) => boolean): {
42
+ rows: FlatOption[];
43
+ sourceIndex: number[];
44
+ };
45
+ /**
46
+ * 트리 줄마다의 자리 정보 — 화면에 남은 줄(접힘·검색 반영 뒤) 기준이다.
47
+ * - `isLast`·`ancestorLast`: 연결선용. 자기가 같은 부모 아래 마지막 줄인가, 조상(depth 1 부터 부모까지)이
48
+ * 각자 마지막 줄인가. STree 가 재귀로 내려가며 넘기는 값과 같은 모양을 펴진 목록에서 구한다.
49
+ * - `posInSet`·`setSize`: 같은 부모 아래 몇 번째 / 형제가 모두 몇 개. 가상 스크롤로 일부 줄만 DOM 에
50
+ * 있어도 보조기기가 창 안 줄을 트리 전부로 읽지 않게 `aria-posinset`·`aria-setsize` 로 알린다.
51
+ */
52
+ export declare function treeLineInfo(rows: FlatOption[]): {
53
+ isLast: boolean;
54
+ ancestorLast: boolean[];
55
+ posInSet: number;
56
+ setSize: number;
57
+ }[];
58
+ /** 선택값을 품은 그룹들의 value — 트리를 열 때 고른 항목이 보이도록 펼쳐 둘 그룹이다 */
59
+ export declare function ancestorGroupValues(flat: FlatOption[], selected: Set<string>): Set<string>;
30
60
  /** 라벨에 HTML 태그가 있는지 (원본 isHtmlLabel) */
31
61
  export declare const isHtmlLabel: (label: string) => boolean;
32
62
  /** HTML 라벨에서 태그를 제거한 텍스트 (검색 매칭용, 원본 extractText) */