sellmate-design-system-react 9.0.0-beta.53 → 9.0.0-beta.55

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 (37) hide show
  1. package/AGENTS.md +126 -8
  2. package/dist/components/SChipFilter/README.md +34 -4
  3. package/dist/components/SChipFilter/SChipFilter.d.ts +25 -6
  4. package/dist/components/SChipFilter/index.d.ts +1 -1
  5. package/dist/components/SConfirmModal/README.md +2 -1
  6. package/dist/components/SConfirmModal/SConfirmModal.d.ts +31 -2
  7. package/dist/components/SGhostButton/SGhostButton.d.ts +4 -1
  8. package/dist/components/SGnb/README.md +40 -1
  9. package/dist/components/SGnb/SGnb.d.ts +36 -2
  10. package/dist/components/SGnb/gnb.config.d.ts +6 -0
  11. package/dist/components/SIcon/README.md +2 -0
  12. package/dist/components/SLauncherListBox/README.md +81 -0
  13. package/dist/components/SLauncherListBox/SLauncherListBox.d.ts +67 -0
  14. package/dist/components/SLauncherListBox/index.d.ts +2 -0
  15. package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +118 -0
  16. package/dist/components/SLoginCard/README.md +2 -0
  17. package/dist/components/SLogo/README.md +54 -0
  18. package/dist/components/SLogo/SLogo.d.ts +47 -0
  19. package/dist/components/SLogo/index.d.ts +2 -0
  20. package/dist/components/SLogo/logo.config.d.ts +14 -0
  21. package/dist/components/SLogo/sellmate-wordmark.d.ts +20 -0
  22. package/dist/components/SModal/README.md +15 -5
  23. package/dist/components/SModal/SModal.d.ts +1 -1
  24. package/dist/components/SPortal/README.md +2 -0
  25. package/dist/components/STag/README.md +2 -0
  26. package/dist/index.cjs +616 -82
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +606 -83
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/depth-filter.d.ts +27 -0
  32. package/dist/llms-full.txt +344 -19
  33. package/dist/llms.txt +128 -10
  34. package/dist/styles.css +82 -3
  35. package/dist/theme.css +18 -0
  36. package/package.json +1 -1
  37. package/dist/components/SLoginCard/sellmate-wordmark.d.ts +0 -14
@@ -44,6 +44,7 @@
44
44
  - [SGuide](../SGuide)
45
45
  - [SImage](../SImage)
46
46
  - [SKeyValueTable](../SKeyValueTable)
47
+ - [SLauncherListBox](../SLauncherListBox)
47
48
  - [SListItem](../SListItem)
48
49
  - [SLoadingModal](../SLoadingModal)
49
50
  - [SNumberInput](../SNumberInput)
@@ -90,6 +91,7 @@ graph TD;
90
91
  SGuide --> SIcon
91
92
  SImage --> SIcon
92
93
  SKeyValueTable --> SIcon
94
+ SLauncherListBox --> SIcon
93
95
  SListItem --> SIcon
94
96
  SLoadingModal --> SIcon
95
97
  SNumberInput --> SIcon
@@ -0,0 +1,81 @@
1
+ # SLauncherListBox
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SLauncherListBox
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `items?` | `SLauncherListBoxItem[]` | — | 목록에 세울 서비스. 비어 있으면 아무것도 렌더하지 않는다. **순서는 넘긴 대로가 아니라 카탈로그 순서다**(`LAUNCHER_SERVICES`) — 같은 런처가 앱마다 다른 순서로 뜨면 사용자가 매번 다시 찾는다. 같은 서비스를 두 번 넘기면 처음 것만 선다. |
12
+ | `ariaLabel?` | `string` | — | 목록(ul)의 접근성 레이블 |
13
+
14
+ #### Events
15
+
16
+ | Event | Type | Description |
17
+ |-------|------|-------------|
18
+ | `onSelect` | `(service: SLauncherService) => void` | 서비스를 고름. **가는 것은 이 콜백이 하지 않는다** — 줄이 링크라 브라우저가 `href` 를 새 탭으로 연다. 고른 것을 앱이 알아야 할 때만(기록·목록 닫기) 준다. 갈 수 없는 줄(주소가 없거나 카탈로그가 아직 출시 전으로 든 서비스)은 눌리지 않으므로 여기로 오지 않는다. |
19
+
20
+ ## Types
21
+
22
+ ### SLauncherListBoxItem
23
+
24
+ ```ts
25
+ /** 리스트박스의 한 줄 — 옮겨 갈 수 있는 서비스 하나 */
26
+ export interface SLauncherListBoxItem {
27
+ /**
28
+ * 어느 서비스인가. **로고·표기·이름·상태 태그는 이 키 하나로 정해진다** — 카탈로그
29
+ * (`LAUNCHER_SERVICE_CATALOG`)가 들고 있으므로 앱이 넘기지 않는다.
30
+ */
31
+ service: SLauncherService;
32
+ /**
33
+ * 새 탭에서 열 주소. **디자인 시스템은 주소를 들지 않는다** — 앱마다 QA·실서버가 달라
34
+ * 여기서 관리할 수 없다.
35
+ *
36
+ * **주소를 주는 것이 곧 "갈 수 있다"는 뜻이다.** 비우면 줄은 목록에 남되 눌리지 않고
37
+ * 물러난다 — 지금 보고 있는 서비스든, 이 앱이 계약하지 않은 서비스든 갈 곳이 없기는 같다.
38
+ * 못 가는 줄을 막는 별도의 prop 은 없다.
39
+ */
40
+ href?: string;
41
+ }
42
+ ```
43
+
44
+ ### SLauncherService
45
+
46
+ ```ts
47
+ export type SLauncherService = (typeof LAUNCHER_SERVICES)[number];
48
+ ```
49
+
50
+ ### LAUNCHER_SERVICES
51
+
52
+ ```ts
53
+ /**
54
+ * 런처에 설 수 있는 서비스 — **목록의 순서이기도 하다.**
55
+ * 앱이 넘긴 순서가 아니라 이 순서로 선다: 같은 런처가 앱마다 다른 순서로 뜨면 사용자가 매번 다시 찾는다.
56
+ */
57
+ export const LAUNCHER_SERVICES = ['sellmate', 'wms', 'account', 'crm'] as const;
58
+ ```
59
+
60
+ ## Dependencies
61
+
62
+ ### Used by
63
+
64
+ - [SGnb](../SGnb)
65
+
66
+ ### Depends on
67
+
68
+ - [SIcon](../SIcon)
69
+ - [SLogo](../SLogo)
70
+ - [STag](../STag)
71
+
72
+ ### Graph
73
+
74
+ ```mermaid
75
+ graph TD;
76
+ SLauncherListBox --> SIcon
77
+ SLauncherListBox --> SLogo
78
+ SLauncherListBox --> STag
79
+ SGnb --> SLauncherListBox
80
+ style SLauncherListBox fill:#f9f,stroke:#333,stroke-width:4px
81
+ ```
@@ -0,0 +1,67 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import { type SLauncherService } from './launcherListBox.config';
3
+ /** 리스트박스의 한 줄 — 옮겨 갈 수 있는 서비스 하나 */
4
+ export interface SLauncherListBoxItem {
5
+ /**
6
+ * 어느 서비스인가. **로고·표기·이름·상태 태그는 이 키 하나로 정해진다** — 카탈로그
7
+ * (`LAUNCHER_SERVICE_CATALOG`)가 들고 있으므로 앱이 넘기지 않는다.
8
+ */
9
+ service: SLauncherService;
10
+ /**
11
+ * 새 탭에서 열 주소. **디자인 시스템은 주소를 들지 않는다** — 앱마다 QA·실서버가 달라
12
+ * 여기서 관리할 수 없다.
13
+ *
14
+ * **주소를 주는 것이 곧 "갈 수 있다"는 뜻이다.** 비우면 줄은 목록에 남되 눌리지 않고
15
+ * 물러난다 — 지금 보고 있는 서비스든, 이 앱이 계약하지 않은 서비스든 갈 곳이 없기는 같다.
16
+ * 못 가는 줄을 막는 별도의 prop 은 없다.
17
+ */
18
+ href?: string;
19
+ }
20
+ export interface SLauncherListBoxProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> {
21
+ /**
22
+ * 목록에 세울 서비스. 비어 있으면 아무것도 렌더하지 않는다.
23
+ *
24
+ * **순서는 넘긴 대로가 아니라 카탈로그 순서다**(`LAUNCHER_SERVICES`) — 같은 런처가 앱마다
25
+ * 다른 순서로 뜨면 사용자가 매번 다시 찾는다. 같은 서비스를 두 번 넘기면 처음 것만 선다.
26
+ */
27
+ items?: SLauncherListBoxItem[];
28
+ /**
29
+ * 서비스를 고름. **가는 것은 이 콜백이 하지 않는다** — 줄이 링크라 브라우저가 `href` 를
30
+ * 새 탭으로 연다. 고른 것을 앱이 알아야 할 때만(기록·목록 닫기) 준다.
31
+ *
32
+ * 갈 수 없는 줄(주소가 없거나 카탈로그가 아직 출시 전으로 든 서비스)은 눌리지 않으므로
33
+ * 여기로 오지 않는다.
34
+ */
35
+ onSelect?: (service: SLauncherService) => void;
36
+ /** 목록(ul)의 접근성 레이블 */
37
+ ariaLabel?: string;
38
+ }
39
+ /**
40
+ * SLauncherListBox — GNB 의 앱런처 버튼을 눌렀을 때 뜨는 서비스 목록.
41
+ *
42
+ * 한 줄이 서비스 하나다: 위에 브랜드 로고(+ 상태 태그), 아래에 한글 이름.
43
+ *
44
+ * **앱이 넘기는 것은 서비스 키와 주소 둘뿐이다.** 로고·서비스 표기·이름·상태 태그는 카탈로그
45
+ * (`LAUNCHER_SERVICE_CATALOG`)가 서비스마다 한 모습으로 정해 두므로 앱이 넘기지 않는다 —
46
+ * 넘기게 하면 같은 서비스가 앱마다 다른 이름·색·문구로 선다.
47
+ *
48
+ * **주소는 카탈로그에 두지 않는다.** 앱마다 QA·실서버 주소가 달라 디자인 시스템이 관리할 수 없다.
49
+ * 앱이 `href` 로 넘기면 줄이 링크가 되어 **새 탭에서 열린다** — 가운데 클릭·⌘클릭도 그대로 듣는다.
50
+ * **주소를 주는 것이 곧 "갈 수 있다"는 뜻이다**: 주지 않은 줄은 눌리지 않는다(지금 보고 있는
51
+ * 서비스이거나 이 앱이 계약하지 않은 서비스). 줄을 막는 별도의 prop 은 없다.
52
+ *
53
+ * **줄에 얹으면 "여기서 나간다"는 것이 드러난다** — 배경이 옅은 파랑으로 물들고 이름이 한 단계
54
+ * 진해지며, 오른쪽 끝에 페이지 이동 아이콘이 떠오른다. 아이콘 자리는 늘 비워 두므로 얹었다 뗄 때
55
+ * 글자가 밀리지 않는다.
56
+ *
57
+ * 갈 수 없는 줄은 눌리지 않고 로고는 색이 빠지며 이름은 비활성 글자색이 된다. **목록에서 빼지
58
+ * 않는 것이 기본이다**: 그 서비스가 있다는 사실과 지금은 못 간다는 사실을 함께 알리는 것이 런처의
59
+ * 일이다. 출시 전인 서비스는 카탈로그가 `출시예정` 태그와 함께 막아 두므로 앱이 할 일이 없다.
60
+ *
61
+ * **이 컴포넌트는 패널만 그린다.** 런처 버튼에 붙여 띄우는 것은 `SGnb` 의 `launcher` 가 맡으므로
62
+ * (`launcher.items` 에 이 목록을 넘긴다), 앱이 직접 팝오버를 조립할 일은 없다.
63
+ *
64
+ * 토큰은 `--cmp-gnb-launcher-listBox-*`(패널) · `--cmp-gnb-launcher-button-*`(줄).
65
+ * **줄 높이는 상수가 아니라 여백에서 나온다** — 토큰이 바뀌면 따라 바뀐다.
66
+ */
67
+ export declare const SLauncherListBox: import("react").ForwardRefExoticComponent<SLauncherListBoxProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,2 @@
1
+ export { SLauncherListBox, type SLauncherListBoxProps, type SLauncherListBoxItem, } from './SLauncherListBox';
2
+ export { LAUNCHER_LIST_BOX_LAYOUT, LAUNCHER_LIST_BOX_LOGO_HEIGHT, LAUNCHER_LIST_BOX_LOGO_SERVICE_GAP, LAUNCHER_LIST_BOX_TRAILING_ICON, LAUNCHER_LIST_BOX_WIDTH, LAUNCHER_SERVICES, LAUNCHER_SERVICE_CATALOG, type SLauncherService, type SLauncherServiceEntry, } from './launcherListBox.config';
@@ -0,0 +1,118 @@
1
+ import type { SIconName } from '../SIcon';
2
+ import type { STagColor } from '../STag';
3
+ /**
4
+ * 패널 고정 폭(px, 시안 — 전용 토큰 없음).
5
+ * 담기는 것은 서비스 로고 한 줄이라 내용 폭을 따르면 로고 길이에 따라 패널이 출렁인다.
6
+ */
7
+ export declare const LAUNCHER_LIST_BOX_WIDTH = 320;
8
+ /**
9
+ * 로고 글리프 높이(px, 시안 — 전용 토큰 없음).
10
+ * 로고 줄 높이(20px = 위아래 여백 4 + 이 값)에서 여백을 뺀 나머지이고, 그 20px 이 태그(STag xs)
11
+ * 높이와 같아 로고와 태그가 한 줄에 나란히 선다.
12
+ */
13
+ export declare const LAUNCHER_LIST_BOX_LOGO_HEIGHT = 12;
14
+ /**
15
+ * 워드마크 ↔ 서비스 표기 간격(px, 시안 — 전용 토큰 없음).
16
+ * 토큰의 `logo.gap` 은 [워드마크+표기] 묶음과 태그 사이의 간격이라 여기 쓸 값이 아니다.
17
+ */
18
+ export declare const LAUNCHER_LIST_BOX_LOGO_SERVICE_GAP = 8;
19
+ /**
20
+ * hover 때 줄 오른쪽 끝에 나타나는 아이콘 — "여기서 다른 서비스로 옮겨 간다"는 표시.
21
+ * 크기·색은 토큰이 정하지만 **어떤 글리프인지는 토큰에 없어** 뜻이 가장 가까운 것을 골랐다.
22
+ * TODO(디자인): 시안의 글리프를 확인해 확정한다.
23
+ */
24
+ export declare const LAUNCHER_LIST_BOX_TRAILING_ICON: SIconName;
25
+ /**
26
+ * 런처에 설 수 있는 서비스 — **목록의 순서이기도 하다.**
27
+ * 앱이 넘긴 순서가 아니라 이 순서로 선다: 같은 런처가 앱마다 다른 순서로 뜨면 사용자가 매번 다시 찾는다.
28
+ */
29
+ export declare const LAUNCHER_SERVICES: readonly ["sellmate", "wms", "account", "crm"];
30
+ export type SLauncherService = (typeof LAUNCHER_SERVICES)[number];
31
+ /** 카탈로그 한 줄 — 그 서비스가 런처에서 갖는 고정된 모습 */
32
+ export interface SLauncherServiceEntry {
33
+ /**
34
+ * 워드마크 오른쪽에 잇는 서비스 표기(`WMS` · `Account` · `CRM`). 셀메이트 본체처럼 표기가
35
+ * 없는 서비스는 비운다 — 워드마크만 선다.
36
+ */
37
+ mark?: string;
38
+ /** 로고 아래 줄에 적히는 서비스 이름 */
39
+ name: string;
40
+ /**
41
+ * 상태 태그(`출시예정`·`NEW` 등). **앱이 붙이거나 지울 수 없다** — 같은 서비스가 앱마다
42
+ * 다른 문구를 달면 그 문구를 사용자가 믿을 수 없게 된다.
43
+ */
44
+ tag?: string;
45
+ /** 태그 색. 비우면 `'grey'` */
46
+ tagColor?: STagColor;
47
+ /** 태그 라벨 왼쪽 아이콘 */
48
+ tagIcon?: SIconName;
49
+ /** 아직 아무도 못 쓰는 서비스(출시 전). 계약 여부처럼 앱마다 갈리는 것은 여기 적지 않는다 */
50
+ disabled?: boolean;
51
+ }
52
+ /**
53
+ * 서비스 카탈로그 — **런처에 서는 각 서비스의 모습은 여기가 정한다.**
54
+ *
55
+ * 앱은 서비스 키와 갈 주소만 넘긴다. 표기·이름·태그를 앱이 넘기게 하면 같은 서비스가 앱마다 다른
56
+ * 이름으로 서고(`셀메이트 어카운트` / `Account` / `어카운트`), 한쪽을 고쳐도 나머지는 그대로 남는다.
57
+ *
58
+ * **주소는 여기 없다.** 앱마다 QA·실서버 주소가 다르므로 갈 곳은 앱이 `href` 로 넘긴다.
59
+ *
60
+ * 서비스가 늘거나 이름·상태가 바뀌면 이 표를 고치고 릴리스한다 — 소비 앱은 고칠 것이 없다.
61
+ */
62
+ export declare const LAUNCHER_SERVICE_CATALOG: Record<SLauncherService, SLauncherServiceEntry>;
63
+ /** 치수·색 — 전용 토큰이 없는 자리만 위 상수를 쓴다 */
64
+ export declare const LAUNCHER_LIST_BOX_LAYOUT: {
65
+ /** 패널 배경 */
66
+ readonly bg: string;
67
+ /** 패널 라운드 */
68
+ readonly radius: string;
69
+ /** 패널 상하좌우 여백 */
70
+ readonly padding: string;
71
+ /**
72
+ * 패널 그림자.
73
+ * 토큰(`component.gnb.launcher.listBox.shadow` = `{shadow.floating}`)은 값이 배열이라
74
+ * `--cmp-*` 로 나오지 않는다 — 생성기가 스칼라만 내보내기 때문이다. 그래서 그 별칭이
75
+ * 가리키는 스케일 토큰을 직접 쓴다(같은 값이다).
76
+ */
77
+ readonly shadow: "var(--shadow-floating)";
78
+ /** 줄 왼쪽 여백 */
79
+ readonly itemPaddingLeft: string;
80
+ /** 줄 오른쪽 여백 — 왼쪽보다 좁다(오른쪽 끝은 hover 아이콘 자리다) */
81
+ readonly itemPaddingRight: string;
82
+ /** 줄 상하 여백 */
83
+ readonly itemPaddingY: string;
84
+ /** 줄 안의 [로고·이름 묶음] ↔ [hover 아이콘] 간격 */
85
+ readonly itemGap: string;
86
+ /** 줄 라운드 */
87
+ readonly itemRadius: string;
88
+ /** 줄 배경 */
89
+ readonly itemBg: string;
90
+ /** 줄 hover 배경 */
91
+ readonly itemBgHover: string;
92
+ /** 서비스 이름 글자색 */
93
+ readonly nameColor: string;
94
+ /** 서비스 이름 hover 글자색 */
95
+ readonly nameColorHover: string;
96
+ /** 로고 줄의 위아래 여백 */
97
+ readonly logoPaddingY: string;
98
+ /** [워드마크 + 서비스 표기] ↔ 태그 간격 */
99
+ readonly logoTagGap: string;
100
+ /** 워드마크 ↔ 서비스 표기 간격 */
101
+ readonly logoServiceGap: "8px";
102
+ /** hover 아이콘 크기 */
103
+ readonly trailingIconSize: string;
104
+ /** hover 아이콘 색 */
105
+ readonly trailingIconColor: string;
106
+ /**
107
+ * 아직 못 쓰는 서비스의 이름 글자색.
108
+ * 런처 한 벌에 비활성 색이 없어(시안에 disabled 상태 토큰이 없다) 시맨틱 토큰을 쓴다.
109
+ */
110
+ readonly nameDisabledColor: string;
111
+ /**
112
+ * 아직 못 쓰는 서비스의 로고 색 — 워드마크와, 글자로 온 서비스 표기에 함께 건다.
113
+ * 둘 다 색만 갈아끼우면 되므로 그래픽 마크에 거는 필터(회색화)를 태우지 않는다 — 태우면
114
+ * 밝은 accentLight 가 워드마크보다 더 옅어져 둘이 따로 논다. 로고는 글자가 아니라 그림에
115
+ * 가까우므로 글자색(disabled-text)이 아니라 아이콘 비활성색을 쓴다.
116
+ */
117
+ readonly logoDisabledColor: string;
118
+ };
@@ -25,11 +25,13 @@
25
25
  ### Depends on
26
26
 
27
27
  - [SButton](../SButton)
28
+ - [SLogo](../SLogo)
28
29
 
29
30
  ### Graph
30
31
 
31
32
  ```mermaid
32
33
  graph TD;
33
34
  SLoginCard --> SButton
35
+ SLoginCard --> SLogo
34
36
  style SLoginCard fill:#f9f,stroke:#333,stroke-width:4px
35
37
  ```
@@ -0,0 +1,54 @@
1
+ # SLogo
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SLogo
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `name?` | `SLogoName` | `'sellmate'` | 로고명 |
12
+ | `size?` | `number \| string` | `LOGO_DEFAULT_SIZE` | **높이**(px 또는 CSS 길이). 폭은 주지 않는다 — 워드마크 비율에서 저절로 나온다. `SIcon` 의 `size` 와 달리 정사각이 아니다(로고는 가로로 길다). |
13
+ | `color?` | `SColor` | — | 색. 팔레트 키(`grey_45`, `red_95` …) 또는 임의 CSS 색상. **로고 전체가 이 한 색이 된다.** 미지정 시 **브랜드 기본색**이다 — `SIcon` 과 달리 currentColor 를 상속하지 않는다. 로고가 주변 글자색을 따라 물들면 브랜드 색이 화면마다 달라지기 때문이다. 비활성처럼 물러나야 하는 자리에서만 색을 준다. |
14
+ | `label?` | `string` | — | 접근성 라벨. 없으면 `aria-hidden` 이다 — 로고 옆에 서비스 이름이 이미 적혀 있는 자리 (런처 목록의 한 줄 등)에서는 이름이 두 번 읽히지 않도록 그대로 둔다. 로고가 그 자리의 유일한 이름이면(로그인 화면·상단바) 브랜드명을 넘긴다. |
15
+ | `className?` | `string` | — | |
16
+ | `style?` | `CSSProperties` | — | |
17
+
18
+ ## Types
19
+
20
+ ### SLogoName
21
+
22
+ ```ts
23
+ export type SLogoName = (typeof LOGO_NAMES)[number];
24
+ ```
25
+
26
+ ### LOGO_NAMES
27
+
28
+ ```ts
29
+ /**
30
+ * SLogo 설정.
31
+ *
32
+ * 로고는 브랜드 자산이라 **색·비율이 토큰을 따르지 않는다** — 테마가 바뀌어도 로고는 그대로여야
33
+ * 하고, 워드마크의 비율은 자산 자체가 정한다. 그래서 이 파일의 값은 토큰 참조가 아니다.
34
+ */
35
+
36
+ /** 담고 있는 로고. 늘어나면 여기와 `logos.tsx` 의 맵에 함께 추가한다 */
37
+ export const LOGO_NAMES = ['sellmate'] as const;
38
+ ```
39
+
40
+ ## Dependencies
41
+
42
+ ### Used by
43
+
44
+ - [SLauncherListBox](../SLauncherListBox)
45
+ - [SLoginCard](../SLoginCard)
46
+
47
+ ### Graph
48
+
49
+ ```mermaid
50
+ graph TD;
51
+ SLauncherListBox --> SLogo
52
+ SLoginCard --> SLogo
53
+ style SLogo fill:#f9f,stroke:#333,stroke-width:4px
54
+ ```
@@ -0,0 +1,47 @@
1
+ import { type CSSProperties } from 'react';
2
+ import { type SColor } from '../../lib/color';
3
+ import { type SLogoName } from './logo.config';
4
+ export interface SLogoProps {
5
+ /** 로고명 */
6
+ name?: SLogoName;
7
+ /**
8
+ * **높이**(px 또는 CSS 길이). 폭은 주지 않는다 — 워드마크 비율에서 저절로 나온다.
9
+ * `SIcon` 의 `size` 와 달리 정사각이 아니다(로고는 가로로 길다).
10
+ */
11
+ size?: number | string;
12
+ /**
13
+ * 색. 팔레트 키(`grey_45`, `red_95` …) 또는 임의 CSS 색상. **로고 전체가 이 한 색이 된다.**
14
+ *
15
+ * 미지정 시 **브랜드 기본색**이다 — `SIcon` 과 달리 currentColor 를 상속하지 않는다.
16
+ * 로고가 주변 글자색을 따라 물들면 브랜드 색이 화면마다 달라지기 때문이다.
17
+ * 비활성처럼 물러나야 하는 자리에서만 색을 준다.
18
+ */
19
+ color?: SColor;
20
+ /**
21
+ * 접근성 라벨. 없으면 `aria-hidden` 이다 — 로고 옆에 서비스 이름이 이미 적혀 있는 자리
22
+ * (런처 목록의 한 줄 등)에서는 이름이 두 번 읽히지 않도록 그대로 둔다.
23
+ * 로고가 그 자리의 유일한 이름이면(로그인 화면·상단바) 브랜드명을 넘긴다.
24
+ */
25
+ label?: string;
26
+ className?: string;
27
+ style?: CSSProperties;
28
+ }
29
+ /**
30
+ * SLogo — 브랜드 로고를 아이콘처럼 쓰는 컴포넌트.
31
+ *
32
+ * `SIcon` 과 같은 손맛(`name` · `size` · `color`)이지만 두 가지가 다르다.
33
+ * - **`size` 는 높이다.** 로고는 가로로 긴 워드마크라 정사각으로 그리면 찌그러진다 — 폭은 비율에서 나온다.
34
+ * - **색을 주지 않으면 브랜드 기본색이다.** currentColor 를 상속하지 않는다(위 `color` 참고).
35
+ *
36
+ * **서비스 로고는 `sellmate` 하나뿐이다.** 서비스별 표기(WMS · Account · CRM …)는 이 워드마크
37
+ * 오른쪽에 소비 앱이 자기 텍스트나 자기 로고로 붙인다 — 서비스가 늘어날 때마다 디자인 시스템을
38
+ * 다시 배포하지 않으려는 것이다.
39
+ *
40
+ * ```tsx
41
+ * <SLogo /> // 브랜드색, 높이 24
42
+ * <SLogo size={12} /> // 런처 목록의 한 줄
43
+ * <SLogo size={12} color="grey_45" /> // 아직 못 쓰는 서비스
44
+ * <SLogo size={32} label="Sellmate" /> // 로고가 그 자리의 유일한 이름일 때
45
+ * ```
46
+ */
47
+ export declare const SLogo: import("react").ForwardRefExoticComponent<SLogoProps & import("react").RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,2 @@
1
+ export { SLogo, type SLogoProps } from './SLogo';
2
+ export { LOGO_DEFAULT_SIZE, LOGO_NAMES, type SLogoName } from './logo.config';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SLogo 설정.
3
+ *
4
+ * 로고는 브랜드 자산이라 **색·비율이 토큰을 따르지 않는다** — 테마가 바뀌어도 로고는 그대로여야
5
+ * 하고, 워드마크의 비율은 자산 자체가 정한다. 그래서 이 파일의 값은 토큰 참조가 아니다.
6
+ */
7
+ /** 담고 있는 로고. 늘어나면 여기와 `logos.tsx` 의 맵에 함께 추가한다 */
8
+ export declare const LOGO_NAMES: readonly ["sellmate"];
9
+ export type SLogoName = (typeof LOGO_NAMES)[number];
10
+ /**
11
+ * 기본 높이(px). `SIcon` 과 같은 값이라 나란히 쓸 때 손에 익은 크기가 같다.
12
+ * 폭은 주지 않는다 — 로고마다 다른 비율에서 저절로 나온다.
13
+ */
14
+ export declare const LOGO_DEFAULT_SIZE = 24;
@@ -0,0 +1,20 @@
1
+ import type { CSSProperties } from 'react';
2
+ /**
3
+ * Sellmate 브랜드 색. **브랜드 자산의 일부라 토큰을 거치지 않는다** — 대응하는 색 토큰이 없고
4
+ * (가장 가까운 `--color-primary-90` 도 `#002B5E` 로 다른 색이다), 있더라도 로고 색은 테마를
5
+ * 따라 바뀌면 안 되는 값이다. `scripts/check-hardcoded.mjs` 의 ALLOW 에 등록해 둔다.
6
+ */
7
+ export declare const SELLMATE_NAVY = "#00275F";
8
+ /**
9
+ * @internal
10
+ * Sellmate 워드마크 — `SLogo` 가 그리는 유일한 글리프. 밖으로 내보내지 않는다(앱은 SLogo 로 닿는다).
11
+ *
12
+ * **`fill` 을 갖지 않는다** — 색은 `SLogo` 가 감싸는 span 의 `color` 로 내려주고 여기서는
13
+ * `currentColor` 를 상속한다. 그래야 `SLogo` 의 `color` 하나로 워드마크 전체가 한 색이 된다.
14
+ * 브랜드 기본색은 `SELLMATE_NAVY` 로, 색을 주지 않았을 때 SLogo 가 그 값을 내려준다.
15
+ *
16
+ * 크기도 갖지 않는다 — 높이만 SLogo 가 주고 폭은 viewBox 비율(276:40)에서 나온다.
17
+ */
18
+ export declare function SellmateWordmark({ style }: {
19
+ style?: CSSProperties;
20
+ }): import("react").JSX.Element;
@@ -47,7 +47,7 @@ import { SModalOutlet } from 'sellmate-design-system-react';
47
47
 
48
48
  ## SModal.confirm
49
49
 
50
- 아이콘 + 제목 + 메시지 + 확인/취소 버튼. `type` 에 따라 아이콘·메인 버튼 색이 결정된다.
50
+ 아이콘 + 제목 + 메시지 + 확인 버튼. `type` 에 따라 아이콘·메인 버튼 색이 결정된다.
51
51
 
52
52
  ```tsx
53
53
  SModal.confirm({
@@ -55,13 +55,23 @@ SModal.confirm({
55
55
  modalTitle: '삭제하시겠습니까?',
56
56
  topMessage: ['이 작업은 되돌릴 수 없습니다.'],
57
57
  mainButtonLabel: '삭제',
58
- subButtonLabel: '취소',
58
+ }).onOk(() => deleteItem());
59
+ ```
60
+
61
+ **`subButtonLabel` 은 기본이 비어 있고, 그대로 두는 것이 기본이다.** `onCancel` 이 닫는 것 말고 따로 할 일이 있을 때만 준다 — 눌러도 창만 닫힌다면 X 버튼이 이미 하는 일이라(백드롭·ESC 도 열려 있다) 같은 버튼을 하나 더 세우지 않는다. 되묻는 모달도 예외가 아니다. 서브 버튼이 설 자리는 확인과 대등한 두 번째 선택지일 때이고, 그때 글자는 `취소`·`닫기` 가 아니라 그 버튼이 하는 일의 이름이 된다.
62
+
63
+ ```tsx
64
+ SModal.confirm({
65
+ type: 'negative',
66
+ modalTitle: '재고가 모자란 주문이 있습니다',
67
+ mainButtonLabel: '자동 취소',
68
+ subButtonLabel: '수동 처리',
59
69
  })
60
- .onOk(() => deleteItem())
61
- .onCancel(() => {});
70
+ .onOk(() => cancelShortOrders())
71
+ .onCancel(() => openManualFlow());
62
72
  ```
63
73
 
64
- **옵션 (`SConfirmOptions`)** — 선언형 `SConfirmModalProps` 에서 제어 흐름 props(`open`/`onOpenChange`/`onOk`/`onCancel`/`onClose`)를 제외한 전부. 주요 키: `type`, `modalTitle`, `topMessage`/`bottomMessage`, `mainButtonLabel`/`mainButtonOutline`, `subButtonLabel`, `tagSlot`/`optionSlot`/`contentSlot`, `persistent`.
74
+ **옵션 (`SConfirmOptions`)** — 선언형 `SConfirmModalProps` 에서 제어 흐름 props(`open`/`onOpenChange`/`onOk`/`onCancel`/`onClose`)를 제외한 전부. 주요 키: `type`, `modalTitle`, `topMessage`/`bottomMessage`, `mainButtonLabel`/`mainButtonOutline`/`mainButtonDisabled`, `subButtonLabel`, `tagSlot`/`optionSlot`/`contentSlot`, `persistent`.
65
75
 
66
76
  ---
67
77
 
@@ -82,7 +82,7 @@ export interface SModalRef {
82
82
  *
83
83
  * @example
84
84
  * // 확인/취소
85
- * SModal.confirm({ type: 'negative', modalTitle: '삭제하시겠습니까?', mainButtonLabel: '삭제', subButtonLabel: '취소' })
85
+ * SModal.confirm({ type: 'negative', modalTitle: '삭제하시겠습니까?', mainButtonLabel: '삭제' })
86
86
  * .onOk(() => deleteItem())
87
87
  * .onCancel(() => {});
88
88
  *
@@ -54,6 +54,7 @@ export type SPortalAlign = 'start' | 'center' | 'end';
54
54
 
55
55
  - [SAccountListBox](../SAccountListBox)
56
56
  - [SChipInput](../SChipInput)
57
+ - [SGnb](../SGnb)
57
58
  - [SGnbSystem](../SGnbSystem)
58
59
  - [SSelect](../SSelect)
59
60
 
@@ -63,6 +64,7 @@ export type SPortalAlign = 'start' | 'center' | 'end';
63
64
  graph TD;
64
65
  SAccountListBox --> SPortal
65
66
  SChipInput --> SPortal
67
+ SGnb --> SPortal
66
68
  SGnbSystem --> SPortal
67
69
  SSelect --> SPortal
68
70
  style SPortal fill:#f9f,stroke:#333,stroke-width:4px
@@ -72,6 +72,7 @@ export const TAG_COLORS = [
72
72
  - [SConfirmModal](../SConfirmModal)
73
73
  - [SGhostButton](../SGhostButton)
74
74
  - [SGnb](../SGnb)
75
+ - [SLauncherListBox](../SLauncherListBox)
75
76
  - [SRadioCard](../SRadioCard)
76
77
  - [SSystemActionButton](../SSystemActionButton)
77
78
  - [STabs](../STabs)
@@ -90,6 +91,7 @@ graph TD;
90
91
  SConfirmModal --> STag
91
92
  SGhostButton --> STag
92
93
  SGnb --> STag
94
+ SLauncherListBox --> STag
93
95
  SRadioCard --> STag
94
96
  SSystemActionButton --> STag
95
97
  STabs --> STag