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.
- package/AGENTS.md +21 -2
- package/dist/components/SBarChart/README.md +1 -0
- package/dist/components/SBarChart/SBarChart.d.ts +7 -0
- package/dist/components/SBarcodeInput/README.md +2 -0
- package/dist/components/SButton/button.config.d.ts +2 -1
- package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +2 -2
- package/dist/components/SChatFile/chatFile.config.d.ts +2 -2
- package/dist/components/SCheckbox/README.md +2 -0
- package/dist/components/SChipFilter/README.md +2 -0
- package/dist/components/SGhostButton/README.md +4 -0
- package/dist/components/SGnb/gnb.config.d.ts +6 -0
- package/dist/components/SIcon/README.md +5 -1
- package/dist/components/SIcon/SIcon.d.ts +1 -1
- package/dist/components/SInput/README.md +2 -0
- package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +2 -7
- package/dist/components/SLineChart/README.md +1 -0
- package/dist/components/SLineChart/SLineChart.d.ts +5 -0
- package/dist/components/SLineChart/lineChart.config.d.ts +1 -2
- package/dist/components/SLoadingModal/README.md +2 -2
- package/dist/components/SMeatballButton/README.md +2 -0
- package/dist/components/SNumberInput/README.md +2 -0
- package/dist/components/SRadioCard/README.md +3 -0
- package/dist/components/SRadioCard/SRadioCard.d.ts +7 -2
- package/dist/components/SRadioCard/SRadioCardGroup.d.ts +3 -1
- package/dist/components/SSelect/README.md +9 -4
- package/dist/components/SSelect/SSelect.d.ts +18 -4
- package/dist/components/SSelect/select.config.d.ts +34 -4
- package/dist/components/SStepper/stepper.config.d.ts +9 -3
- package/dist/components/STable/README.md +1 -1
- package/dist/components/STable/STable.d.ts +3 -0
- package/dist/components/STabs/tabs.config.d.ts +3 -8
- package/dist/components/STag/README.md +8 -0
- package/dist/components/STag/tag.config.d.ts +10 -9
- package/dist/components/STimePicker/timepicker.config.d.ts +3 -0
- package/dist/components/STree/README.md +2 -0
- package/dist/components/STreeTable/STreeTable.examples.d.ts +7 -0
- package/dist/index.cjs +1885 -1273
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1885 -1273
- package/dist/index.js.map +1 -1
- package/dist/lib/chart/cartesian.d.ts +1 -3
- package/dist/lib/chart/category-labels.d.ts +37 -0
- package/dist/lib/chart/use-element-size.d.ts +4 -1
- package/dist/lib/list-box-item.d.ts +16 -0
- package/dist/lib/tree-row.d.ts +92 -0
- package/dist/llms-full.txt +52 -10
- package/dist/llms.txt +21 -2
- package/dist/styles.css +237 -88
- 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
|
```
|
|
@@ -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
|
-
/** 칩 안 클립 아이콘 크기
|
|
18
|
-
readonly iconSize:
|
|
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
|
-
/** 칩 안 클립 아이콘 크기
|
|
25
|
-
readonly iconSize:
|
|
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` | `
|
|
19
|
-
| `height?` | `number \| string` | `
|
|
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'` |
|
|
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` | 트리거
|
|
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 =
|
|
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
|
-
/** 트리거
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
20
|
-
|
|
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) */
|