sellmate-design-system-react 9.0.0-beta.61 → 9.0.0-beta.63
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 +510 -136
- package/dist/components/SBarChart/README.md +15 -0
- package/dist/components/SBarChart/SBarChart.d.ts +15 -1
- package/dist/components/SBarChart/index.d.ts +1 -1
- package/dist/components/SCallout/README.md +1 -0
- package/dist/components/SCallout/SCallout.d.ts +6 -1
- package/dist/components/SDonutChart/README.md +2 -4
- package/dist/components/SDonutChart/SDonutChart.d.ts +9 -10
- package/dist/components/SGhostButton/README.md +2 -0
- package/dist/components/SLineChart/README.md +15 -0
- package/dist/components/SLineChart/SLineChart.d.ts +15 -1
- package/dist/components/SLineChart/index.d.ts +1 -1
- package/dist/components/SLineChart/lineChart.config.d.ts +8 -5
- package/dist/components/SMeatballButton/README.md +67 -0
- package/dist/components/SMeatballButton/SMeatballButton.d.ts +36 -0
- package/dist/components/SMeatballButton/index.d.ts +1 -0
- package/dist/components/SPage/README.md +19 -0
- package/dist/components/SPage/SPage.d.ts +11 -2
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page.config.d.ts +8 -0
- package/dist/components/SPieChart/README.md +1 -0
- package/dist/components/SPieChart/SPieChart.d.ts +6 -1
- package/dist/docs/RecipeGallery.d.ts +13 -0
- package/dist/index.cjs +338 -154
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +336 -154
- package/dist/index.js.map +1 -1
- package/dist/lib/chart/radial.d.ts +22 -11
- package/dist/lib/chart/tooltip.d.ts +18 -1
- package/dist/lib/dropdown-menu.d.ts +19 -0
- package/dist/llms-full.txt +628 -140
- package/dist/llms.txt +512 -138
- package/dist/recipes/AppShell.d.ts +21 -0
- package/dist/recipes/ExcelFilePopupPage.d.ts +5 -0
- package/dist/recipes/LoginPage.d.ts +6 -0
- package/dist/recipes/ProductCreatePage.d.ts +1 -0
- package/dist/recipes/ProductCreateSectionsPage.d.ts +5 -0
- package/dist/recipes/ProductDetailInlineEditPage.d.ts +9 -0
- package/dist/recipes/ProductDetailPage.d.ts +1 -0
- package/dist/recipes/ProductListChipFilterPage.d.ts +1 -0
- package/dist/recipes/ProductListPage.d.ts +1 -0
- package/dist/recipes/TransferOrderPopupPage.d.ts +2 -0
- package/dist/recipes/api.d.ts +91 -0
- package/dist/recipes/recipe-story.d.ts +33 -0
- package/dist/recipes/router.d.ts +9 -0
- package/dist/styles.css +21 -3
- package/package.json +3 -1
|
@@ -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';
|
|
@@ -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
|
*/
|
|
@@ -11,14 +11,12 @@
|
|
|
11
11
|
| `data` | `SDonutChartSlice[]` | — | 조각 목록. 주는 순서대로 12시에서 시계 방향으로 그린다 — 보통 큰 순으로 준다 |
|
|
12
12
|
| `palette?` | `SDonutChartPalette` | `'multi'` | 색 팔레트. `custom` 일 때만 `colors` 를 본다 |
|
|
13
13
|
| `colors?` | `SDonutChartColor[]` | — | `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 |
|
|
14
|
-
| `centerLabel?` | `ReactNode` | — | 가운데 윗줄에 적을 이름 (예: "총 주문") |
|
|
15
|
-
| `centerValue?` | `ReactNode` | — | 가운데 큰 값. 주지 않으면 그려진 조각의 합계를 `formatValue` 로 적는다 |
|
|
16
|
-
| `hideCenter?` | `boolean` | `false` | 가운데를 비운다 — 합계 대신 범례·툴팁만으로 읽게 할 때 |
|
|
17
14
|
| `showValueLabel?` | `boolean` | `false` | 고리 위에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 |
|
|
18
15
|
| `showLegend?` | `boolean` | `true` | 범례를 보인다 |
|
|
19
16
|
| `legendPosition?` | `SDonutChartLegendPosition` | `'top'` | 범례 위치 |
|
|
20
17
|
| `showTooltip?` | `boolean` | `true` | 조각에 마우스를 올리면 값 상자를 띄운다 |
|
|
21
|
-
| `formatValue?` | `(value: number) => string` |
|
|
18
|
+
| `formatValue?` | `(value: number) => string` | — | 값 표시 형식 |
|
|
19
|
+
| `tooltipFooter?` | `(slice: SDonutChartSlicePoint) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락 (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
|
|
22
20
|
| `className?` | `string` | — | 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 |
|
|
23
21
|
| `style?` | `CSSProperties` | — | |
|
|
24
22
|
|
|
@@ -36,12 +36,6 @@ export interface SDonutChartProps {
|
|
|
36
36
|
palette?: SDonutChartPalette;
|
|
37
37
|
/** `palette='custom'` 에서 쓸 색 이름을 조각 순서대로. 조각보다 짧으면 앞에서부터 순환하고, 비어 있으면 `multi` 로 그린다 */
|
|
38
38
|
colors?: SDonutChartColor[];
|
|
39
|
-
/** 가운데 윗줄에 적을 이름 (예: "총 주문") */
|
|
40
|
-
centerLabel?: ReactNode;
|
|
41
|
-
/** 가운데 큰 값. 주지 않으면 그려진 조각의 합계를 `formatValue` 로 적는다 */
|
|
42
|
-
centerValue?: ReactNode;
|
|
43
|
-
/** 가운데를 비운다 — 합계 대신 범례·툴팁만으로 읽게 할 때 */
|
|
44
|
-
hideCenter?: boolean;
|
|
45
39
|
/** 고리 위에 몫(%)을 적는다. 좁은 조각은 글자가 넘치므로 적지 않는다 */
|
|
46
40
|
showValueLabel?: boolean;
|
|
47
41
|
/** 범례를 보인다 */
|
|
@@ -50,10 +44,15 @@ export interface SDonutChartProps {
|
|
|
50
44
|
legendPosition?: SDonutChartLegendPosition;
|
|
51
45
|
/** 조각에 마우스를 올리면 값 상자를 띄운다 */
|
|
52
46
|
showTooltip?: boolean;
|
|
53
|
-
/** 값 표시 형식
|
|
47
|
+
/** 값 표시 형식 */
|
|
54
48
|
formatValue?: (value: number) => string;
|
|
55
49
|
/** 조각을 눌렀을 때 */
|
|
56
50
|
onSliceClick?: (slice: SDonutChartSlicePoint) => void;
|
|
51
|
+
/**
|
|
52
|
+
* 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락
|
|
53
|
+
* (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다
|
|
54
|
+
*/
|
|
55
|
+
tooltipFooter?: (slice: SDonutChartSlicePoint) => ReactNode;
|
|
57
56
|
/** 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 */
|
|
58
57
|
className?: string;
|
|
59
58
|
style?: CSSProperties;
|
|
@@ -61,11 +60,11 @@ export interface SDonutChartProps {
|
|
|
61
60
|
/**
|
|
62
61
|
* SDonutChart — 도넛 그래프.
|
|
63
62
|
*
|
|
64
|
-
* `SPieChart` 와 같이 **한 시점의 전체를 몫으로 나눈 것**을
|
|
65
|
-
*
|
|
63
|
+
* 가운데가 빈 원그래프. `SPieChart` 와 같이 **한 시점의 전체를 몫으로 나눈 것**을 보여준다.
|
|
64
|
+
* 가운데 구멍에는 글자를 두지 않는다 — 합계 같은 값은 차트 바깥에 적는다.
|
|
66
65
|
* 조각이 대여섯 개를 넘거나 몫끼리 견주는 것이 목적이면 `SBarChart` 가 맞다.
|
|
67
66
|
*
|
|
68
67
|
* 폭은 부모를 따르고(기본 100%), 그림은 그 폭을 한 변으로 하는 정사각형이다.
|
|
69
|
-
* 고리
|
|
68
|
+
* 구멍과 고리 두께도 폭에 비례해 늘고 준다.
|
|
70
69
|
*/
|
|
71
70
|
export declare const SDonutChart: import("react").ForwardRefExoticComponent<SDonutChartProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -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';
|
|
@@ -47,13 +47,16 @@ export declare const BAND_MIN = 40;
|
|
|
47
47
|
/** 점과 값 라벨 사이 간격(px) — 막대 차트와 같다. */
|
|
48
48
|
export declare const VALUE_LABEL_GAP = 6;
|
|
49
49
|
/**
|
|
50
|
-
* 영역 채움의
|
|
50
|
+
* 영역 채움의 불투명도 — 선 바로 아래가 가장 진하고 바닥으로 갈수록 옅어진다.
|
|
51
51
|
*
|
|
52
|
-
* 선은 또렷하게 두고 영역만 물리는 값이다.
|
|
53
|
-
*
|
|
54
|
-
* `area` 를 끄거나 `stacked` 로 쌓는다.
|
|
52
|
+
* 선은 또렷하게 두고 영역만 물리는 값이다. 세로 그라데이션이라 채움이 바닥에서 거의
|
|
53
|
+
* 사라져, 계열이 여럿일 때 채움끼리 겹쳐 색이 탁해지는 것도 덜하다. 그래도 겹쳐 그리는
|
|
54
|
+
* 것 자체의 한계는 남으므로, 계열이 많으면 `area` 를 끄거나 `stacked` 로 쌓는다.
|
|
55
|
+
*
|
|
56
|
+
* 위쪽 30% 는 맞는 토큰이 없어 값으로 둔다(불투명도 토큰은 5·8·40·60·80 뿐이다).
|
|
55
57
|
*/
|
|
56
|
-
export declare const
|
|
58
|
+
export declare const AREA_OPACITY_TOP = "30%";
|
|
59
|
+
export declare const AREA_OPACITY_BOTTOM = "var(--opacity-005)";
|
|
57
60
|
export declare const LINE_DATA_LABEL_COLOR = "var(--cmp-chart-bar-dataLabel-color-default)";
|
|
58
61
|
/** 값 라벨의 타이포 — 짚은 항목만 굵고 크게 뜬다(막대 차트와 같은 규칙). */
|
|
59
62
|
export declare const LINE_DATA_LABEL_TYPO = "typo-body-sm-medium";
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SMeatballButton
|
|
2
|
+
|
|
3
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
4
|
+
|
|
5
|
+
### SMeatballButton
|
|
6
|
+
|
|
7
|
+
#### Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
|------|------|---------|-------------|
|
|
11
|
+
| `size?` | `SMeatballButtonSize` | `'sm'` | 버튼 크기 |
|
|
12
|
+
| `intent?` | `SMeatballButtonIntent` | `'default'` | 색상 의도. 어두운 배경 위에서는 inverse |
|
|
13
|
+
| `items?` | `SMeatballButtonItem[]` | `[]` | 메뉴 항목 목록 |
|
|
14
|
+
| `tooltipText?` | `string` | `'기능 더 보기'` | 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. |
|
|
15
|
+
| `ariaLabel?` | `string` | — | 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 '기능 더 보기' |
|
|
16
|
+
| `disabled?` | `boolean` | `false` | 비활성 |
|
|
17
|
+
| `className?` | `string` | — | 버튼을 감싸는 요소의 클래스. 위치 조정(absolute 배치 등)용 |
|
|
18
|
+
| `style?` | `CSSProperties` | — | 버튼을 감싸는 요소의 스타일. 위치 조정용 |
|
|
19
|
+
|
|
20
|
+
#### Events
|
|
21
|
+
|
|
22
|
+
| Event | Type | Description |
|
|
23
|
+
|-------|------|-------------|
|
|
24
|
+
| `onItemClick` | `(value: string \| number) => void` | 메뉴 항목 선택 |
|
|
25
|
+
| `onOpenChange` | `(open: boolean) => void` | 열림/닫힘 변경 |
|
|
26
|
+
|
|
27
|
+
#### Methods (ref)
|
|
28
|
+
|
|
29
|
+
| Method | Type | Description |
|
|
30
|
+
|--------|------|-------------|
|
|
31
|
+
| `open` | `() => void` | 메뉴 열기 |
|
|
32
|
+
| `close` | `() => void` | 메뉴 닫기 |
|
|
33
|
+
|
|
34
|
+
## Types
|
|
35
|
+
|
|
36
|
+
### SMeatballButtonSize
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
export type SMeatballButtonSize = SGhostButtonSize;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### SMeatballButtonIntent
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
export type SMeatballButtonIntent = 'default' | 'inverse';
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### SMeatballButtonItem
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
/** 메뉴 항목 — SDropdownButton 과 같은 모양이다 */
|
|
52
|
+
export type SMeatballButtonItem = SDropdownButtonItem;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Dependencies
|
|
56
|
+
|
|
57
|
+
### Depends on
|
|
58
|
+
|
|
59
|
+
- [SGhostButton](../SGhostButton)
|
|
60
|
+
|
|
61
|
+
### Graph
|
|
62
|
+
|
|
63
|
+
```mermaid
|
|
64
|
+
graph TD;
|
|
65
|
+
SMeatballButton --> SGhostButton
|
|
66
|
+
style SMeatballButton fill:#f9f,stroke:#333,stroke-width:4px
|
|
67
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import { type SGhostButtonSize } from '../SGhostButton';
|
|
3
|
+
import type { SDropdownButtonItem } from '../SDropdownButton';
|
|
4
|
+
export type SMeatballButtonSize = SGhostButtonSize;
|
|
5
|
+
export type SMeatballButtonIntent = 'default' | 'inverse';
|
|
6
|
+
/** 메뉴 항목 — SDropdownButton 과 같은 모양이다 */
|
|
7
|
+
export type SMeatballButtonItem = SDropdownButtonItem;
|
|
8
|
+
export interface SMeatballButtonHandle {
|
|
9
|
+
/** 메뉴 열기 */
|
|
10
|
+
open: () => void;
|
|
11
|
+
/** 메뉴 닫기 */
|
|
12
|
+
close: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface SMeatballButtonProps {
|
|
15
|
+
/** 버튼 크기 */
|
|
16
|
+
size?: SMeatballButtonSize;
|
|
17
|
+
/** 색상 의도. 어두운 배경 위에서는 inverse */
|
|
18
|
+
intent?: SMeatballButtonIntent;
|
|
19
|
+
/** 메뉴 항목 목록 */
|
|
20
|
+
items?: SMeatballButtonItem[];
|
|
21
|
+
/** 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. */
|
|
22
|
+
tooltipText?: string;
|
|
23
|
+
/** 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 '기능 더 보기' */
|
|
24
|
+
ariaLabel?: string;
|
|
25
|
+
/** 비활성 */
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** 메뉴 항목 선택 */
|
|
28
|
+
onItemClick?: (value: string | number) => void;
|
|
29
|
+
/** 열림/닫힘 변경 */
|
|
30
|
+
onOpenChange?: (open: boolean) => void;
|
|
31
|
+
/** 버튼을 감싸는 요소의 클래스. 위치 조정(absolute 배치 등)용 */
|
|
32
|
+
className?: string;
|
|
33
|
+
/** 버튼을 감싸는 요소의 스타일. 위치 조정용 */
|
|
34
|
+
style?: CSSProperties;
|
|
35
|
+
}
|
|
36
|
+
export declare const SMeatballButton: import("react").ForwardRefExoticComponent<SMeatballButtonProps & import("react").RefAttributes<SMeatballButtonHandle>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SMeatballButton, type SMeatballButtonProps, type SMeatballButtonHandle, type SMeatballButtonItem, type SMeatballButtonSize, type SMeatballButtonIntent, } from './SMeatballButton';
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
|------|------|---------|-------------|
|
|
29
29
|
| `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
|
|
30
30
|
| `scrollEndSpacing?` | `boolean` | `false` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. **기본은 꺼져 있다.** 페이지 스크롤 자체가 예외이기 때문이다 — 대부분의 화면은 본문이 창을 꽉 채우고 스크롤은 각 영역 안에서 일어난다. 여백을 조건 없이 붙이면 내용이 화면에 거의 딱 맞는 페이지까지 그 여백 때문에 스크롤되게 만든다. 페이지가 실제로 스크롤되는 화면(`contentHeight="auto"` + 내용이 창보다 김)에서만 켠다. 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다. |
|
|
31
|
+
| `padding?` | `SPagePadding` | `'default'` | 본문 안쪽 여백. 기본은 `default` — `--cmp-pageBody-padding-default` 를 사방에 넣는다. `none` 은 필터 바처럼 **가장자리까지 차는 블록이 맨 위에 서는** 화면용이다. 패딩을 끄면 그 아래 블록이 `p-[var(--cmp-pageBody-padding-default)]` 로 같은 토큰의 여백을 직접 잡는다 — `p-sd-*` 로 적으면 토큰이 바뀌어도 따라가지 않는다. 사방 패딩만 끄고 `scrollEndSpacing` 은 그대로다. (`SPopup`·`SSectionHeaderCard` 의 `padding="none"` 과 같은 관용구) |
|
|
31
32
|
| `overlayScrollbar?` | `boolean` | `false` | true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
|
|
32
33
|
| `contentHeight?` | `SPageContentHeight` | `'auto'` | 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다. `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로 `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />` 구성이 성립한다. `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다. |
|
|
33
34
|
| `contentWidth?` | `SPageContentWidth` | `'full'` | 본문 가로 폭 모드. 기본은 `full` — 창이 넓어지면 본문도 같이 넓어진다(반응형). `fixed`·`fixedCenter` 는 본문을 **레이아웃 최소 폭일 때의 폭**으로 고정한다. 최소 폭 기준으로 그린 시안이 넓은 모니터에서 늘어나 성기어지는 것을 막는 모드다. 남는 폭은 `fixed` 면 오른쪽에, `fixedCenter` 면 좌우로 나뉘어 페이지 배경으로 남는다. 고정 폭은 GNB 폭·접힘을 반영해 저절로 따라오므로 앱이 숫자를 쓸 일은 없다. 창이 최소 폭보다 좁아지면 세 모드가 모두 같다 — 남는 폭이 없어 규칙이 꺼지고, 모자란 몫을 지금까지처럼 이 영역이 가로 스크롤로 삼킨다. 같은 열에 `SPageHeader` 가 있으면 헤더도 같은 폭·정렬을 따른다(제목과 본문의 좌우 끝이 맞는다). `SLayout` 밖에서는 기준이 될 최소 폭이 없으므로 무시된다. |
|
|
@@ -46,6 +47,12 @@ export type SPageHeaderVariant = (typeof PAGE_HEADER_VARIANTS)[number];
|
|
|
46
47
|
export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
### SPagePadding
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
export type SPagePadding = (typeof PAGE_PADDINGS)[number];
|
|
54
|
+
```
|
|
55
|
+
|
|
49
56
|
### SPageContentHeight
|
|
50
57
|
|
|
51
58
|
```ts
|
|
@@ -82,6 +89,18 @@ export const PAGE_HEADER_VARIANTS = ['plain', 'bar'] as const;
|
|
|
82
89
|
export const PAGE_BACKGROUNDS = ['frame', 'neutral', 'screen'] as const;
|
|
83
90
|
```
|
|
84
91
|
|
|
92
|
+
### PAGE_PADDINGS
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
/**
|
|
96
|
+
* 본문 안쪽 여백 모드.
|
|
97
|
+
* - default: SPage 가 --cmp-pageBody-padding-default 로 사방 패딩을 넣는다
|
|
98
|
+
* - none: 패딩을 끈다. 가장자리까지 차는 블록(필터 바 등)이 맨 위에 서고, 그 아래 블록이
|
|
99
|
+
* 같은 토큰으로 여백을 직접 잡는 화면용. SPopup·SSectionHeaderCard 의 padding="none" 과 같은 관용구.
|
|
100
|
+
*/
|
|
101
|
+
export const PAGE_PADDINGS = ['default', 'none'] as const;
|
|
102
|
+
```
|
|
103
|
+
|
|
85
104
|
### PAGE_CONTENT_HEIGHTS
|
|
86
105
|
|
|
87
106
|
```ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type HTMLAttributes } from 'react';
|
|
2
|
-
import type { SPageBackground, SPageContentHeight, SPageContentWidth } from './page.config';
|
|
2
|
+
import type { SPageBackground, SPageContentHeight, SPageContentWidth, SPagePadding } from './page.config';
|
|
3
3
|
export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
4
4
|
/**
|
|
5
5
|
* 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.
|
|
@@ -17,6 +17,15 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
17
17
|
* 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다.
|
|
18
18
|
*/
|
|
19
19
|
scrollEndSpacing?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 본문 안쪽 여백. 기본은 `default` — `--cmp-pageBody-padding-default` 를 사방에 넣는다.
|
|
22
|
+
*
|
|
23
|
+
* `none` 은 필터 바처럼 **가장자리까지 차는 블록이 맨 위에 서는** 화면용이다. 패딩을 끄면
|
|
24
|
+
* 그 아래 블록이 `p-[var(--cmp-pageBody-padding-default)]` 로 같은 토큰의 여백을 직접 잡는다 —
|
|
25
|
+
* `p-sd-*` 로 적으면 토큰이 바뀌어도 따라가지 않는다. 사방 패딩만 끄고 `scrollEndSpacing` 은
|
|
26
|
+
* 그대로다. (`SPopup`·`SSectionHeaderCard` 의 `padding="none"` 과 같은 관용구)
|
|
27
|
+
*/
|
|
28
|
+
padding?: SPagePadding;
|
|
20
29
|
/**
|
|
21
30
|
* true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다.
|
|
22
31
|
* 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다.
|
|
@@ -53,7 +62,7 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
53
62
|
* SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.
|
|
54
63
|
* 스크롤은 SLayout(overflow:hidden)이 잡아둔 경계 안에서 이 영역에만 생긴다.
|
|
55
64
|
* 창이 SLayout 의 최소 폭보다 좁을 때 생기는 가로 스크롤도 여기 걸린다(문서는 스크롤되지 않는다).
|
|
56
|
-
* 패딩은
|
|
65
|
+
* 패딩은 padding 으로, 배경은 background 로 정한다(둘 다 className 으로도 덮어쓸 수 있다).
|
|
57
66
|
*
|
|
58
67
|
* - header="fix": flex 자식으로 남은 가로 공간을 채운다.
|
|
59
68
|
* - header="full": SLayout 이 깐 grid 의 "page" 영역 = 상단바 아래·메뉴 오른쪽 자리를 차지한다.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { SPage, type SPageProps } from './SPage';
|
|
2
|
-
export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, PAGE_CONTENT_WIDTHS, type SPageContentWidth, PAGE_HEADER_VARIANTS, type SPageHeaderVariant, } from './page.config';
|
|
2
|
+
export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, PAGE_CONTENT_WIDTHS, type SPageContentWidth, PAGE_PADDINGS, type SPagePadding, PAGE_HEADER_VARIANTS, type SPageHeaderVariant, } from './page.config';
|
|
3
3
|
export { SPageHeader, type SPageHeaderProps } from './SPageHeader';
|
|
@@ -14,6 +14,14 @@ export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
|
|
|
14
14
|
*/
|
|
15
15
|
export declare const PAGE_CONTENT_HEIGHTS: readonly ["auto", "fill"];
|
|
16
16
|
export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
|
|
17
|
+
/**
|
|
18
|
+
* 본문 안쪽 여백 모드.
|
|
19
|
+
* - default: SPage 가 --cmp-pageBody-padding-default 로 사방 패딩을 넣는다
|
|
20
|
+
* - none: 패딩을 끈다. 가장자리까지 차는 블록(필터 바 등)이 맨 위에 서고, 그 아래 블록이
|
|
21
|
+
* 같은 토큰으로 여백을 직접 잡는 화면용. SPopup·SSectionHeaderCard 의 padding="none" 과 같은 관용구.
|
|
22
|
+
*/
|
|
23
|
+
export declare const PAGE_PADDINGS: readonly ["default", "none"];
|
|
24
|
+
export type SPagePadding = (typeof PAGE_PADDINGS)[number];
|
|
17
25
|
/**
|
|
18
26
|
* 본문 가로 폭 모드 — 창이 레이아웃 최소 폭보다 **넓을 때** 본문이 어떻게 설지.
|
|
19
27
|
* - full: 남는 폭을 본문이 다 쓴다 (반응형)
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
| `legendPosition?` | `SPieChartLegendPosition` | `'top'` | 범례 위치 |
|
|
17
17
|
| `showTooltip?` | `boolean` | `true` | 조각에 마우스를 올리면 값 상자를 띄운다 |
|
|
18
18
|
| `formatValue?` | `(value: number) => string` | — | 값 표시 형식 |
|
|
19
|
+
| `tooltipFooter?` | `(slice: SPieChartSlicePoint) => ReactNode` | — | 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락 (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다 |
|
|
19
20
|
| `className?` | `string` | — | 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 |
|
|
20
21
|
| `style?` | `CSSProperties` | — | |
|
|
21
22
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CSSProperties } from 'react';
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
2
|
/** 범례 위치. */
|
|
3
3
|
export type SPieChartLegendPosition = 'top' | 'bottom';
|
|
4
4
|
/**
|
|
@@ -48,6 +48,11 @@ export interface SPieChartProps {
|
|
|
48
48
|
formatValue?: (value: number) => string;
|
|
49
49
|
/** 조각을 눌렀을 때 */
|
|
50
50
|
onSliceClick?: (slice: SPieChartSlicePoint) => void;
|
|
51
|
+
/**
|
|
52
|
+
* 툴팁의 값 아래에 덧붙일 내용. 짚은 조각을 받아 그린다 — 몫·값만으로 모자란 맥락
|
|
53
|
+
* (전월 대비, 건수 등)을 적는다. 툴팁은 누를 수 없으므로 버튼·링크는 넣지 않는다
|
|
54
|
+
*/
|
|
55
|
+
tooltipFooter?: (slice: SPieChartSlicePoint) => ReactNode;
|
|
51
56
|
/** 폭은 기본 100% 다. 폭을 정하려면 여기에 준다 — 그림은 그 폭의 정사각형이 된다 */
|
|
52
57
|
className?: string;
|
|
53
58
|
style?: CSSProperties;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "페이지 레시피" 상단의 카드 그리드 — 레시피를 화면으로 먼저 보고 골라 들어가게 한다.
|
|
3
|
+
*
|
|
4
|
+
* 미리보기는 그림이 아니라 **레시피 파일 그 자체**를 축소해 렌더한 것이다. 그래서 레시피 코드가
|
|
5
|
+
* 바뀌면 카드도 함께 바뀌고, 따로 갱신할 자산이 없다. 규칙 설명은 이 아래에 AGENTS.md §4 가
|
|
6
|
+
* 그대로 렌더되므로 여기에는 쓰지 않는다.
|
|
7
|
+
*
|
|
8
|
+
* 레시피는 페이지 **안**의 골격이라 GNB·레이아웃은 그리지 않는다 — 셸 조합은 Layout Builder 의 몫이다.
|
|
9
|
+
*
|
|
10
|
+
* 새 레시피를 `src/recipes/` 에 만들면 여기에 한 줄을 더한다.
|
|
11
|
+
*/
|
|
12
|
+
import type { ReactNode } from 'react';
|
|
13
|
+
export default function RecipeGallery(): ReactNode;
|