sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.40

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 (185) hide show
  1. package/AGENTS.md +642 -88
  2. package/README.md +111 -9
  3. package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
  4. package/dist/components/SAccountListBox/README.md +86 -0
  5. package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
  6. package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
  7. package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
  8. package/dist/components/SAccountListBox/index.d.ts +2 -0
  9. package/dist/components/SBadge/README.md +26 -0
  10. package/dist/components/SBadge/SBadge.d.ts +1 -1
  11. package/dist/components/SBarcodeInput/README.md +9 -1
  12. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
  13. package/dist/components/SButton/README.md +38 -0
  14. package/dist/components/SCalendar/README.md +13 -0
  15. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
  16. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
  17. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
  18. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
  19. package/dist/components/SCalendarBoard/README.md +137 -0
  20. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
  21. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
  22. package/dist/components/SCalendarBoard/index.d.ts +3 -0
  23. package/dist/components/SCalendarBoard/types.d.ts +31 -0
  24. package/dist/components/SCallout/README.md +16 -1
  25. package/dist/components/SCallout/SCallout.d.ts +9 -4
  26. package/dist/components/SCard/README.md +16 -0
  27. package/dist/components/SCard/SCard.d.ts +17 -2
  28. package/dist/components/SCheckbox/README.md +8 -0
  29. package/dist/components/SChipFilter/README.md +339 -14
  30. package/dist/components/SChipFilter/SChipFilter.d.ts +150 -60
  31. package/dist/components/SChipFilter/index.d.ts +1 -1
  32. package/dist/components/SChipInput/README.md +15 -1
  33. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  34. package/dist/components/SChipInput/index.d.ts +1 -1
  35. package/dist/components/SCircleProgress/README.md +8 -0
  36. package/dist/components/SConfirmModal/README.md +17 -1
  37. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  38. package/dist/components/SConfirmModal/index.d.ts +1 -1
  39. package/dist/components/SDatePicker/README.md +20 -2
  40. package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
  41. package/dist/components/SDateRangePicker/README.md +17 -2
  42. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  43. package/dist/components/SDivider/README.md +7 -0
  44. package/dist/components/SDivider/SDivider.d.ts +11 -0
  45. package/dist/components/SDraggableItem/README.md +37 -0
  46. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  47. package/dist/components/SDraggableItem/index.d.ts +1 -1
  48. package/dist/components/SDraggableList/README.md +30 -0
  49. package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
  50. package/dist/components/SDraggableList/index.d.ts +1 -1
  51. package/dist/components/SDrawer/README.md +8 -0
  52. package/dist/components/SDropdownButton/README.md +19 -0
  53. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  54. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  55. package/dist/components/SEditor/README.md +203 -0
  56. package/dist/components/SEditor/SEditor.d.ts +114 -0
  57. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  58. package/dist/components/SEditor/editor.config.d.ts +119 -0
  59. package/dist/components/SEditor/index.d.ts +8 -0
  60. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  61. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  62. package/dist/components/SExpansionItem/README.md +36 -0
  63. package/dist/components/SExpansionItem/index.d.ts +1 -1
  64. package/dist/components/SField/README.md +27 -3
  65. package/dist/components/SField/SField.d.ts +12 -6
  66. package/dist/components/SFilePicker/README.md +15 -1
  67. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  68. package/dist/components/SFooter/README.md +25 -0
  69. package/dist/components/SFooter/SFooter.d.ts +4 -3
  70. package/dist/components/SForm/README.md +11 -0
  71. package/dist/components/SGhostButton/README.md +22 -4
  72. package/dist/components/SGnb/README.md +51 -0
  73. package/dist/components/SGnb/SGnb.d.ts +50 -0
  74. package/dist/components/SGnb/gnb.config.d.ts +10 -3
  75. package/dist/components/SGnb/index.d.ts +1 -1
  76. package/dist/components/SGnbSystem/README.md +186 -0
  77. package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
  78. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
  79. package/dist/components/SGnbSystem/index.d.ts +2 -0
  80. package/dist/components/SGuide/README.md +15 -0
  81. package/dist/components/SIcon/README.md +10 -0
  82. package/dist/components/SIcon/SIcon.d.ts +1 -1
  83. package/dist/components/SIcon/icons.gen.d.ts +4 -0
  84. package/dist/components/SImage/README.md +14 -0
  85. package/dist/components/SInput/README.md +3 -1
  86. package/dist/components/SInput/SInput.d.ts +7 -1
  87. package/dist/components/SKeyValueTable/README.md +86 -0
  88. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
  89. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  90. package/dist/components/SLayout/README.md +21 -0
  91. package/dist/components/SLayout/SLayout.d.ts +4 -0
  92. package/dist/components/SLayout/index.d.ts +1 -1
  93. package/dist/components/SLinearProgress/README.md +15 -0
  94. package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
  95. package/dist/components/SLinearProgress/index.d.ts +1 -1
  96. package/dist/components/SList/README.md +5 -1
  97. package/dist/components/SList/SList.d.ts +0 -2
  98. package/dist/components/SListItem/README.md +41 -0
  99. package/dist/components/SListItem/index.d.ts +1 -1
  100. package/dist/components/SLoadingContainer/loading.d.ts +18 -2
  101. package/dist/components/SLoadingModal/README.md +9 -1
  102. package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
  103. package/dist/components/SLoadingModal/index.d.ts +1 -1
  104. package/dist/components/SNumberInput/README.md +9 -1
  105. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  106. package/dist/components/SPage/README.md +47 -4
  107. package/dist/components/SPage/SPage.d.ts +15 -10
  108. package/dist/components/SPage/SPageHeader.d.ts +18 -11
  109. package/dist/components/SPage/index.d.ts +1 -1
  110. package/dist/components/SPage/page-column.d.ts +25 -0
  111. package/dist/components/SPopover/README.md +15 -0
  112. package/dist/components/SPopup/README.md +19 -0
  113. package/dist/components/SPortal/README.md +18 -0
  114. package/dist/components/SRadio/README.md +20 -0
  115. package/dist/components/SRadioButton/README.md +18 -0
  116. package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
  117. package/dist/components/SRadioCard/README.md +78 -0
  118. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  119. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  120. package/dist/components/SRadioCard/index.d.ts +2 -0
  121. package/dist/components/SScrollArea/README.md +27 -0
  122. package/dist/components/SSearchInput/README.md +63 -0
  123. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  124. package/dist/components/SSearchInput/index.d.ts +1 -0
  125. package/dist/components/SSectionHeaderCard/README.md +37 -0
  126. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
  127. package/dist/components/SSelect/README.md +24 -6
  128. package/dist/components/SSelect/SSelect.d.ts +14 -2
  129. package/dist/components/SSplitter/README.md +15 -0
  130. package/dist/components/SStepper/README.md +26 -0
  131. package/dist/components/SSwitch/README.md +13 -0
  132. package/dist/components/SSystemActionButton/README.md +221 -0
  133. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -0
  134. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  135. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
  136. package/dist/components/STable/README.md +86 -1
  137. package/dist/components/STable/STable.d.ts +121 -11
  138. package/dist/components/STable/index.d.ts +1 -1
  139. package/dist/components/STabs/README.md +12 -1
  140. package/dist/components/STabs/STabs.d.ts +2 -4
  141. package/dist/components/STabs/index.d.ts +1 -1
  142. package/dist/components/STabs/tabs.config.d.ts +3 -4
  143. package/dist/components/STag/README.md +52 -0
  144. package/dist/components/STag/STag.d.ts +3 -1
  145. package/dist/components/STextLink/README.md +18 -0
  146. package/dist/components/STextLink/STextLink.d.ts +4 -0
  147. package/dist/components/STextarea/README.md +1 -1
  148. package/dist/components/STextarea/STextarea.d.ts +7 -1
  149. package/dist/components/STimePicker/README.md +15 -1
  150. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  151. package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
  152. package/dist/components/STimeRangePicker/README.md +27 -1
  153. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  154. package/dist/components/SToast/README.md +24 -0
  155. package/dist/components/SToggle/README.md +8 -0
  156. package/dist/components/SToggle/index.d.ts +1 -1
  157. package/dist/components/STooltip/README.md +24 -0
  158. package/dist/components/STree/README.md +41 -0
  159. package/dist/components/STree/STree.d.ts +8 -0
  160. package/dist/components/STree/index.d.ts +1 -1
  161. package/dist/docs/Gallery.d.ts +9 -0
  162. package/dist/docs/gallery-previews.d.ts +24 -0
  163. package/dist/index.cjs +10754 -5244
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/index.d.ts +8 -0
  166. package/dist/index.js +10718 -5244
  167. package/dist/index.js.map +1 -1
  168. package/dist/lib/doc-sections.d.ts +35 -0
  169. package/dist/lib/field-width.d.ts +31 -0
  170. package/dist/lib/floating-height.d.ts +15 -0
  171. package/dist/lib/story-docs.d.ts +19 -3
  172. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  173. package/dist/llms-full.txt +3263 -228
  174. package/dist/llms.txt +647 -90
  175. package/dist/playground/categories.d.ts +19 -0
  176. package/dist/styles.css +1725 -169
  177. package/dist/theme.css +216 -24
  178. package/eslint/index.mjs +14 -0
  179. package/eslint/lib/table-column.mjs +26 -0
  180. package/eslint/rules/divider-vertical-height.mjs +137 -0
  181. package/eslint/rules/field-width-grade.d.mts +41 -0
  182. package/eslint/rules/field-width-grade.mjs +311 -0
  183. package/eslint/rules/table-column-width.mjs +110 -0
  184. package/eslint/scale.gen.mjs +5 -2
  185. package/package.json +13 -1
@@ -27,14 +27,29 @@
27
27
  |-------|------|-------------|
28
28
  | `onClick` | `(e: MouseEvent<HTMLButtonElement>) => void` | 클릭 (sdClick) |
29
29
 
30
+ ## Types
31
+
32
+ ### SGhostButtonSize
33
+
34
+ ```ts
35
+ export type SGhostButtonSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg';
36
+ ```
37
+
38
+ ### SGhostButtonIntent
39
+
40
+ ```ts
41
+ export type SGhostButtonIntent = 'default' | 'danger' | 'action' | 'subAction' | 'inverse';
42
+ ```
43
+
30
44
  ## Dependencies
31
45
 
32
46
  ### Used by
33
47
 
34
48
  - [SBarcodeInput](../SBarcodeInput)
35
49
  - [SCalendar](../SCalendar)
50
+ - [SCalendarBoard](../SCalendarBoard)
36
51
  - [SChip](../SChip)
37
- - [SChipFilter](../SChipFilter)
52
+ - [SDatePicker](../SDatePicker)
38
53
  - [SDateRangePicker](../SDateRangePicker)
39
54
  - [SFilePicker](../SFilePicker)
40
55
  - [SGnb](../SGnb)
@@ -44,7 +59,8 @@
44
59
  - [SOverlayHeader](../SOverlayHeader)
45
60
  - [SPage](../SPage)
46
61
  - [SPopover](../SPopover)
47
- - [SSelect](../SSelect)
62
+ - [SSearchInput](../SSearchInput)
63
+ - [STable](../STable)
48
64
  - [STimePicker](../STimePicker)
49
65
  - [STimeRangePicker](../STimeRangePicker)
50
66
  - [SToast](../SToast)
@@ -64,8 +80,9 @@ graph TD;
64
80
  SGhostButton --> STag
65
81
  SBarcodeInput --> SGhostButton
66
82
  SCalendar --> SGhostButton
83
+ SCalendarBoard --> SGhostButton
67
84
  SChip --> SGhostButton
68
- SChipFilter --> SGhostButton
85
+ SDatePicker --> SGhostButton
69
86
  SDateRangePicker --> SGhostButton
70
87
  SFilePicker --> SGhostButton
71
88
  SGnb --> SGhostButton
@@ -75,7 +92,8 @@ graph TD;
75
92
  SOverlayHeader --> SGhostButton
76
93
  SPage --> SGhostButton
77
94
  SPopover --> SGhostButton
78
- SSelect --> SGhostButton
95
+ SSearchInput --> SGhostButton
96
+ STable --> SGhostButton
79
97
  STimePicker --> SGhostButton
80
98
  STimeRangePicker --> SGhostButton
81
99
  SToast --> SGhostButton
@@ -26,6 +26,7 @@
26
26
  | `resizable?` | `boolean` | `false` | 메뉴 폭을 드래그로 조절할 수 있게 한다. 레일 폭은 고정이고 **메뉴 컬럼만** 늘고 준다. 조절선은 GNB 컬럼의 오른쪽 경계 전체다 — fix 는 상단바 높이까지, full 은 상단바가 전폭이라 본문 높이까지. 접혀 있거나 깔 메뉴가 없으면(레일 리프가 활성) 조절선이 나오지 않는다. |
27
27
  | `menuWidth?` | `number` | — | 메뉴 폭(px). 주면 controlled — onMenuWidthChange 로 직접 갱신해야 움직인다 |
28
28
  | `defaultMenuWidth?` | `number` | — | 메뉴 초기 폭(px). uncontrolled |
29
+ | `system?` | `ReactNode` | — | system 슬롯(`SGnbSystem`). 놓이는 자리와 형태는 `header` 가 정한다. - fix : GNB 맨 아래 세로 판. 펼치면 메뉴 컬럼 바닥에, 접히면 `foldedFooter` 아래 레일 바닥에 여백 없이 붙는다. useRail 에서 메뉴가 없는 레일 아이템이 활성이면 메뉴 컬럼째 사라지므로 이 슬롯도 함께 빠진다. - full: 전폭 상단바 오른쪽 끝에 가로 한 줄로 선다. 상단바는 접어도 남으므로 조각들도 늘 남는다. 색·형태는 GNB 가 내려주므로 SGnbSystem 에 다시 넘기지 않아도 된다. |
29
30
  | `ariaLabel?` | `string` | `'global navigation'` | 메뉴 landmark(nav) 의 접근성 레이블. 한 화면에 nav 가 여럿일 때 구분한다. |
30
31
 
31
32
  #### Events
@@ -38,8 +39,57 @@
38
39
  | `onLauncherClick` | `() => void` | 앱런처(그리드) 버튼 클릭. 미지정 시 런처 버튼을 렌더하지 않는다. 접힘 레일(fix)에는 폴드 버튼만 남으므로 표시되지 않는다. |
39
40
  | `onMenuWidthChange` | `(width: number) => void` | 메뉴 폭이 확정될 때(드래그를 놓거나 방향키 조작). 드래그하는 동안에는 오지 않는다 |
40
41
 
42
+ ## Types
43
+
44
+ ### SGnbType
45
+
46
+ ```ts
47
+ /** 메뉴 스타일: box = 라운드/좁은 들여쓰기, belt = 풀폭 행/넓은 들여쓰기 */
48
+ export type SGnbType = 'box' | 'belt';
49
+ ```
50
+
51
+ ### SGnbHeader
52
+
53
+ ```ts
54
+ /** 상단바 구조: fix = GNB 폭에 고정, full = 레이아웃 전폭 */
55
+ export type SGnbHeader = 'fix' | 'full';
56
+ ```
57
+
58
+ ### SGnbColor
59
+
60
+ ```ts
61
+ /** 색상(테마): light / dark */
62
+ export type SGnbColor = 'light' | 'dark';
63
+ ```
64
+
65
+ ### SGnbMenuItem
66
+
67
+ ```ts
68
+ /** GNB 메뉴 아이템 (재귀 트리). depth1 → depth2 → depth3. */
69
+ export interface SGnbMenuItem {
70
+ /** 표시 텍스트 */
71
+ label: string;
72
+ /** 고유 식별값 (선택 상태 비교 기준) */
73
+ value: string;
74
+ /** depth1 전용 아이콘명 */
75
+ icon?: SIconName;
76
+ /** 우측 Tag 뱃지 텍스트 */
77
+ tag?: string;
78
+ /** 뱃지 색. 미지정 시 blue. */
79
+ tagColor?: STagColor;
80
+ /** 비활성 여부 */
81
+ disabled?: boolean;
82
+ /** 하위 아이템 (있으면 펼침/접힘 대상) */
83
+ children?: SGnbMenuItem[];
84
+ }
85
+ ```
86
+
41
87
  ## Dependencies
42
88
 
89
+ ### Used by
90
+
91
+ - [SGnbSystem](../SGnbSystem)
92
+
43
93
  ### Depends on
44
94
 
45
95
  - [SGhostButton](../SGhostButton)
@@ -55,5 +105,6 @@ graph TD;
55
105
  SGnb --> SIcon
56
106
  SGnb --> SLayout
57
107
  SGnb --> STag
108
+ SGnbSystem --> SGnb
58
109
  style SGnb fill:#f9f,stroke:#333,stroke-width:4px
59
110
  ```
@@ -1,5 +1,45 @@
1
1
  import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import type { SGnbSystemPlacement } from '../SGnbSystem/gnbSystem.config';
2
3
  import { type SGnbType, type SGnbHeader, type SGnbColor, type SGnbMenuItem } from './gnb.config';
4
+ /**
5
+ * SGnb 가 `system` 슬롯에 내려주는 값. 슬롯에 놓인 SGnbSystem 이 이걸 읽어
6
+ * 색과 형태(가로/세로 · 펼침/접힘)를 GNB 에 맞춘다 — 앱이 같은 값을 두 번 넘기지 않게 한다.
7
+ *
8
+ * 슬롯이 어디에 놓이는지는 header 가 정한다.
9
+ * - fix : 메뉴 컬럼 바닥 · 접힘 레일 바닥 → `placement: 'panel'` (세로 판)
10
+ * - full: 전폭 상단바 오른쪽 끝 → `placement: 'top'` (판 없이 가로 한 줄)
11
+ *
12
+ * `folded` 는 GNB 의 접힘 상태가 아니라 **그 자리가 접힌 레일인지**다. panel 은 두 곳에 놓이고
13
+ * (메뉴 컬럼 바닥 · 접힘 레일 바닥) 각 자리가 자기 형태를 못 박으므로, 접는 동안 아직 미끄러져
14
+ * 나가는 중인 메뉴 컬럼의 패널이 min 형태로 튀지 않는다.
15
+ *
16
+ * 그래서 fix 로 접혀 있는 동안 슬롯 내용은 **두 자리에 함께 마운트된다** — 미끄러져 나간 메뉴
17
+ * 컬럼(잔상)과 레일 바닥(실물). `active` 가 그 둘을 가른다.
18
+ */
19
+ export interface SGnbSystemContextValue {
20
+ /** GNB 색 */
21
+ color: SGnbColor;
22
+ /** 이 자리가 접힌(48px) 레일인지. `placement: 'top'` 에서는 뜻이 없다 */
23
+ folded: boolean;
24
+ /** 이 자리가 세로 판인지 전폭 상단바인지 */
25
+ placement: SGnbSystemPlacement;
26
+ /**
27
+ * 이 자리가 지금 화면에 살아 있는 자리인가. 접힌 GNB 의 메뉴 컬럼처럼 밖으로 미끄러져 나가
28
+ * 잔상으로만 남는 자리는 `false` 다.
29
+ *
30
+ * 잔상에서도 계정 리스트박스 같은 **떠 있는 층은 함께 숨지 않는다** — SPortal 로 문서 최상단에
31
+ * 그려져 컬럼의 `visibility: hidden` 이 닿지 않기 때문이다. 그래서 잔상이 된 자리는 열어 둔
32
+ * 것을 스스로 닫아야 하고, 그 신호가 이 값이다.
33
+ */
34
+ active: boolean;
35
+ /**
36
+ * 이 자리가 메뉴 기본 폭(GNB_MENU_WIDTH)보다 좁은가 — `resizable` 로 줄인 메뉴 컬럼이 그렇다.
37
+ * 좁아진 판에서는 알림 개수를 적을 가로가 모자라 개수 대신 점 배지가 붙는다.
38
+ * 없으면 좁지 않은 것으로 본다(접힘 레일·상단바는 자기 규칙을 따르므로 이 값과 무관하다).
39
+ */
40
+ narrow?: boolean;
41
+ }
42
+ export declare const SGnbSystemContext: import("react").Context<SGnbSystemContextValue | null>;
3
43
  export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {
4
44
  /** 메뉴 스타일: box(라운드) / belt(풀폭 행). 미지정 시 SLayout 의 type 을 따른다. */
5
45
  type?: SGnbType;
@@ -80,6 +120,15 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
80
120
  defaultMenuWidth?: number;
81
121
  /** 메뉴 폭이 확정될 때(드래그를 놓거나 방향키 조작). 드래그하는 동안에는 오지 않는다 */
82
122
  onMenuWidthChange?: (width: number) => void;
123
+ /**
124
+ * system 슬롯(`SGnbSystem`). 놓이는 자리와 형태는 `header` 가 정한다.
125
+ * - fix : GNB 맨 아래 세로 판. 펼치면 메뉴 컬럼 바닥에, 접히면 `foldedFooter` 아래 레일 바닥에
126
+ * 여백 없이 붙는다. useRail 에서 메뉴가 없는 레일 아이템이 활성이면 메뉴 컬럼째 사라지므로
127
+ * 이 슬롯도 함께 빠진다.
128
+ * - full: 전폭 상단바 오른쪽 끝에 가로 한 줄로 선다. 상단바는 접어도 남으므로 조각들도 늘 남는다.
129
+ * 색·형태는 GNB 가 내려주므로 SGnbSystem 에 다시 넘기지 않아도 된다.
130
+ */
131
+ system?: ReactNode;
83
132
  /** 메뉴 landmark(nav) 의 접근성 레이블. 한 화면에 nav 가 여럿일 때 구분한다. */
84
133
  ariaLabel?: string;
85
134
  }
@@ -91,6 +140,7 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
91
140
  * header 가 배치와 접힘 형태를 정한다:
92
141
  * - fix: 상단바가 GNB 컬럼(메뉴 폭) 안에 있다. 접으면 48px 세로 레일로 좁혀지고 상단바에는 폴드 버튼만 남는다.
93
142
  * - full: 상단바가 레이아웃 전폭을 가로지르고 그 아래 [메뉴 | 페이지]. 접으면 메뉴만 사라진다.
143
+ * system 조각들도 메뉴 바닥이 아니라 이 상단바 오른쪽 끝으로 올라온다.
94
144
  *
95
145
  * useRail 이면 items 의 첫 depth 가 좌측 레일(아이콘+라벨 68px)로 서고, 선택된 레일 아이템의
96
146
  * children 이 메뉴 패널의 depth1 이 된다 — 트리는 그대로 두고 어디부터 그릴지만 바뀐다.
@@ -48,6 +48,8 @@ export declare const GNB_MENU: Record<SGnbType, {
48
48
  depth1FontWeight: number;
49
49
  itemFontSize: number;
50
50
  itemLineHeight: number;
51
+ itemFontWeight: number;
52
+ itemFontWeightSelected: number;
51
53
  }>;
52
54
  /**
53
55
  * 색상(color 축). light → --cmp-gnb-light-* 색, dark → --cmp-gnb-dark-* 색
@@ -114,13 +116,13 @@ export declare const GNB_EXPAND_MS = 200;
114
116
  * 메뉴 고정 폭. 두 header 모두 메뉴는 이 폭으로 좌측에 붙는다(토큰 없음 → 상수).
115
117
  * header="full" 에서 SLayout 이 "메뉴 오른쪽 = 페이지" 영역을 잡을 때도 이 값을 쓴다.
116
118
  */
117
- export declare const GNB_MENU_WIDTH = 240;
119
+ export declare const GNB_MENU_WIDTH = 214;
118
120
  /**
119
121
  * resizable 일 때 메뉴 폭이 움직일 수 있는 범위(px). 레일 폭은 고정이고 메뉴 컬럼만 늘고 준다.
120
- * 디자인이 아직 확정한 값이 아니라 임시다 — 확정되면 토큰으로 내려온다.
122
+ * 기본 폭(GNB_MENU_WIDTH)이 이 범위 안에 있다. 대응 토큰이 없어 상수로 둔다.
121
123
  */
122
124
  export declare const GNB_MENU_MIN_WIDTH = 200;
123
- export declare const GNB_MENU_MAX_WIDTH = 300;
125
+ export declare const GNB_MENU_MAX_WIDTH = 240;
124
126
  /** 메뉴 폭 조절에서 방향키 한 번에 움직이는 양(px). Shift 를 함께 누르면 large. */
125
127
  export declare const GNB_MENU_RESIZE_KEY_STEP: {
126
128
  normal: number;
@@ -160,3 +162,8 @@ export declare function findGnbRailValue(items: SGnbMenuItem[], value: string):
160
162
  export declare function findGnbSiblingValues(items: SGnbMenuItem[], value: string): string[];
161
163
  /** value 로 선택된 아이템의 조상 value 목록(자기 자신 제외)을 반환 → 자동 펼침용 */
162
164
  export declare function findGnbAncestors(items: SGnbMenuItem[], value: string): string[];
165
+ /**
166
+ * value 를 가진 아이템 아래의 **하위 가지**(children 을 가진 자손) value 목록을 반환.
167
+ * 부모를 펼칠 때 그 아래 가지도 전부 함께 펼치는 용도 — 리프는 펼침 대상이 아니라 제외한다.
168
+ */
169
+ export declare function findGnbDescendantBranchValues(items: SGnbMenuItem[], value: string): string[];
@@ -1,2 +1,2 @@
1
- export { SGnb, type SGnbProps } from './SGnb';
1
+ export { SGnb, SGnbSystemContext, type SGnbProps, type SGnbSystemContextValue } from './SGnb';
2
2
  export { GNB_HEADER, GNB_MENU, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, findGnbAncestors, findGnbRailValue, type SGnbType, type SGnbHeader, type SGnbColor, type SGnbMenuItem, } from './gnb.config';
@@ -0,0 +1,186 @@
1
+ # SGnbSystem
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SGnbSystem
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `color?` | `SGnbSystemColor` | — | 색상(패널 표면). light = 흰 면, dark = 오션블루 면. 미지정 시 자기를 담은 SGnb 의 color 를 따른다(단독으로 쓰면 `'light'`). |
12
+ | `folded?` | `boolean` | — | 접힌(min) 형태 — 48px 레일 폭에 맞춰 알림·계정 아이콘만 남는다. 미지정 시 자기를 담은 SGnb 의 접힘 상태를 따른다. 상단바 자리에서는 뜻이 없다. |
13
+ | `actions?` | `SGnbSystemAction[]` | — | 행 목록. 각 원소는 `SSystemActionButton` 의 props 다(`color` 제외 · 계정 행은 `account` 로 따로 준다). 판에서는 맨 위에 쌓이고, 상단바에서는 맨 왼쪽에 선다. 옆(아래)에 다른 조각이 있으면 그 사이에 구분선이 그어진다. 접히면 자리가 없어 렌더되지 않는다. |
14
+ | `domain?` | `string` | — | 도메인 태그 텍스트. 접히면 자리가 없어 렌더되지 않는다 |
15
+ | `alert?` | `SGnbSystemAlert` | — | 알림 버튼. 없으면 렌더하지 않는다. 판에서는 설정과 나란히 서면 남는 폭을 먹고 혼자면 폭을 다 먹는다. 상단바에서는 자리가 넉넉하지 않아 라벨 없이 아이콘+개수만 선다. |
16
+ | `setting?` | `SGnbSystemSetting` | — | 설정 버튼. 없으면 렌더하지 않는다. 판에서는 알림과 나란히 서면 제 폭만 갖고 혼자면 폭을 다 먹고, 상단바에서는 라벨 없이 아이콘만 선다. 접히면 자리가 없어 렌더되지 않는다 — 접힌 상태에서도 닿아야 하면 SGnb 의 `foldedFooter` 에 둔다. |
17
+ | `account?` | `SGnbSystemAccount` | — | 계정 행. 없으면 렌더하지 않는다 |
18
+
19
+ ## Types
20
+
21
+ ### SGnbSystemColor
22
+
23
+ ```ts
24
+ export type SGnbSystemColor = (typeof GNB_SYSTEM_COLORS)[number];
25
+ ```
26
+
27
+ ### SGnbSystemAction
28
+
29
+ ```ts
30
+ /**
31
+ * 패널 상단에 쌓이는 행 하나. `SSystemActionButton` 의 props 를 그대로 받는다 —
32
+ * 단 `color` 는 패널이 정하므로 받지 않고, 목록 key 로 쓸 `value` 만 더한다.
33
+ *
34
+ * `type: 'account'` 는 받지 않는다. 계정 행은 이 패널에 **하나뿐**이고 서는 자리도 맨 아래로
35
+ * 정해져 있어(§3-5-8) `account` prop 이 따로 있다 — 여기로도 받으면 계정 행이 둘인 패널이
36
+ * 만들어지고, 그중 하나는 자리가 틀린다.
37
+ */
38
+ export type SGnbSystemAction = DistributiveOmit<
39
+ Exclude<SSystemActionButtonProps, { type: 'account' }>,
40
+ 'color'
41
+ > & {
42
+ /** 목록 key. 없으면 순서를 key 로 쓴다 */
43
+ value?: string;
44
+ };
45
+ ```
46
+
47
+ ### SGnbSystemAlert
48
+
49
+ ```ts
50
+ /** 알림 버튼 */
51
+ export interface SGnbSystemAlert {
52
+ /** 라벨 텍스트. 기본 `'알림'` */
53
+ label?: string;
54
+ /**
55
+ * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수가 붙는다.
56
+ * 개수를 적을 가로가 모자란 자리(접힌 레일 · 기본 폭보다 좁게 줄인 판)에서는 점 배지로 바뀐다.
57
+ * 표기는 컴포넌트가 맡는다 — 세 자리마다 콤마를 넣어 그리므로 앱이 포맷한 문자열을 넘기지 않는다.
58
+ */
59
+ count?: number;
60
+ /** 클릭 */
61
+ onClick?: () => void;
62
+ /**
63
+ * 알림 버튼에 붙는 안내 툴팁의 문구(한 줄이 한 항목). 주면 뜬다 — **문구만 앱이 정하고**
64
+ * 색·방향·여닫힘은 컴포넌트가 쥔다: 색은 판이 light 면 기본, 그 밖(dark·상단바)이면 강조색이고
65
+ * 방향은 자리가 정한다(판·접힌 레일이면 오른쪽, 상단바면 아래).
66
+ *
67
+ * 스스로 사라지지 않는다 — **알림 버튼을 누르거나, 버튼에 얹었다 커서를 뺄 때** 닫히고,
68
+ * 같은 값을 계속 넘기는 동안에는 다시 뜨지 않는다.
69
+ *
70
+ * **다시 띄우려면 비웠다가 다시 넘긴다**(`undefined` → 문구). 문구가 같아도 상관없다 —
71
+ * 컴포넌트는 닫았다는 사실만 기억하고 문구 내용은 기억하지 않으므로, 새 알림마다 같은 안내를
72
+ * 다시 띄우는 화면도 막히지 않는다.
73
+ */
74
+ tooltip?: string[];
75
+ /**
76
+ * 알림을 누르면 뜨는 목록의 **내용**. 주면 컴포넌트가 알림 버튼에 붙여 띄운다 —
77
+ * 목록에 무엇을 쌓을지는 서비스마다 다르지만 **뜨는 자리는 늘 같아야 하므로**, 방향·앵커·
78
+ * 여닫힘(바깥 클릭·ESC 포함)과 배경·라운드·그림자는 컴포넌트가 쥐고 앱은 안에 담을 것만 준다.
79
+ * 방향은 자리가 정한다 — 판·접힌 레일이면 버튼 오른쪽, 상단바면 아래.
80
+ */
81
+ listBox?: ReactNode;
82
+ /**
83
+ * 알림 목록이 열리고 닫힐 때. 여닫는 것은 알림 버튼이 스스로 하므로 **그 사실을 알아야 할
84
+ * 때만** 준다(연 김에 읽음 처리하거나, 열려 있는 동안 다른 층을 접어 두는 화면).
85
+ *
86
+ * 앱이 누르지 않은 닫힘도 온다: GNB 를 접거나 펴면 알림 버튼이 다른 자리로 옮겨 서므로
87
+ * 목록이 닫히고 `false` 가 온다(계정 행과 같다).
88
+ */
89
+ onOpenChange?: (open: boolean) => void;
90
+ /**
91
+ * 안내 툴팁이 닫힐 때. 받아서 `tooltip` 을 비워 두는 것이 기본 사용법이다 — 그러면 앱이
92
+ * 다음에 넘기는 문구가 곧 다음 안내가 된다.
93
+ *
94
+ * 컴포넌트가 아는 "다시 뜨지 않는다" 는 **이 자리가 서 있는 동안**뿐이라(새로고침하거나
95
+ * GNB 를 접어 알림이 다른 자리로 옮겨 서면 새로 마운트된다), 그 사용자에게 두 번 다시 보이지
96
+ * 않아야 하면 앱이 이 신호를 저장해 두고 `tooltip` 을 그만 넘긴다.
97
+ */
98
+ onTooltipDismiss?: () => void;
99
+ }
100
+ ```
101
+
102
+ ### SGnbSystemSetting
103
+
104
+ ```ts
105
+ /** 설정 버튼 */
106
+ export interface SGnbSystemSetting {
107
+ /** 라벨 텍스트. 기본 `'설정'` */
108
+ label?: string;
109
+ /** 클릭 */
110
+ onClick?: () => void;
111
+ }
112
+ ```
113
+
114
+ ### SGnbSystemAccount
115
+
116
+ ```ts
117
+ /** 계정 행 */
118
+ export interface SGnbSystemAccount {
119
+ /** 계정 이름 */
120
+ label?: string;
121
+ /** 클릭. 패널은 어차피 열리므로, 여는 것 말고 따로 할 일이 있을 때만 준다 */
122
+ onClick?: () => void;
123
+ /**
124
+ * 계정 리스트박스가 열리고 닫힐 때. 여닫는 것은 계정 행이 스스로 하므로 **그 사실을 알아야 할
125
+ * 때만** 준다 — 열려 있는 동안 다른 층을 접어 두거나, 연 것을 기록하는 화면이 그렇다.
126
+ *
127
+ * 앱이 누르지 않은 닫힘도 온다: `header="fix"` 에서 GNB 를 접거나 펴면 계정 행이 다른 자리로
128
+ * 옮겨 서므로 패널이 닫히고 `false` 가 온다.
129
+ */
130
+ onOpenChange?: (open: boolean) => void;
131
+ /**
132
+ * 누르면 뜨는 계정 리스트박스(`SAccountListBox`) 내용. **필수다** — 계정 행은 늘 이 패널의
133
+ * 트리거이고, 눌러도 아무것도 뜨지 않는 계정 행은 없다.
134
+ * 뜨는 방향은 패널이 놓인 자리가 정하므로 앱이 넘기지 않는다.
135
+ */
136
+ listBox: SAccountListBoxContent;
137
+ }
138
+ ```
139
+
140
+ ### GNB_SYSTEM_COLORS
141
+
142
+ ```ts
143
+ /**
144
+ * SGnbSystem 설정.
145
+ *
146
+ * 토큰은 GNB system 패널 한 벌(`--cmp-gnb-system-*`)이다.
147
+ * 패널(배경·경계·구분선·간격) → --cmp-gnb-system-panel-*
148
+ * 도메인 태그 → --cmp-gnb-system-domainTag-*
149
+ * 행 공통(높이·라운드·아이콘 프레임) → --cmp-gnb-system-item-* (SSystemActionButton 과 공유)
150
+ * 알림 버튼 → --cmp-gnb-system-alertButton-*
151
+ * 설정 버튼 → --cmp-gnb-system-setting-*
152
+ * 펼침·접힘 패널 여백 → --cmp-gnb-system-project-padding · --cmp-gnb-system-min-padding
153
+ *
154
+ * 타이포그래피는 CSS 변수가 아니라 `.typo-*` 프리셋으로 나온다.
155
+ * domainTag.typography → typo-body-sm-medium (12/500/20)
156
+ * item.label.typography → typo-body-sm-semibold (12/600/20)
157
+ * alertButton.count → typo-body-md-bold (13/700/22)
158
+ */
159
+
160
+ /** 색상(표면). light = 흰 면, dark = 오션블루 면. GNB 의 color 를 그대로 따라간다 */
161
+ export const GNB_SYSTEM_COLORS = ['light', 'dark'] as const;
162
+ ```
163
+
164
+ ## Dependencies
165
+
166
+ ### Depends on
167
+
168
+ - [SAccountListBox](../SAccountListBox)
169
+ - [SGnb](../SGnb)
170
+ - [SIcon](../SIcon)
171
+ - [SPortal](../SPortal)
172
+ - [SSystemActionButton](../SSystemActionButton)
173
+ - [STooltip](../STooltip)
174
+
175
+ ### Graph
176
+
177
+ ```mermaid
178
+ graph TD;
179
+ SGnbSystem --> SAccountListBox
180
+ SGnbSystem --> SGnb
181
+ SGnbSystem --> SIcon
182
+ SGnbSystem --> SPortal
183
+ SGnbSystem --> SSystemActionButton
184
+ SGnbSystem --> STooltip
185
+ style SGnbSystem fill:#f9f,stroke:#333,stroke-width:4px
186
+ ```
@@ -0,0 +1,179 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type SAccountListBoxContent } from '../SAccountListBox';
3
+ import { type SSystemActionButtonProps } from '../SSystemActionButton';
4
+ import { type SGnbSystemColor } from './gnbSystem.config';
5
+ /** 유니온을 유지한 채 키를 걷어낸다 — 그냥 Omit 하면 판별 유니온이 한 덩어리로 뭉개진다. */
6
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
7
+ /**
8
+ * 패널 상단에 쌓이는 행 하나. `SSystemActionButton` 의 props 를 그대로 받는다 —
9
+ * 단 `color` 는 패널이 정하므로 받지 않고, 목록 key 로 쓸 `value` 만 더한다.
10
+ *
11
+ * `type: 'account'` 는 받지 않는다. 계정 행은 이 패널에 **하나뿐**이고 서는 자리도 맨 아래로
12
+ * 정해져 있어(§3-5-8) `account` prop 이 따로 있다 — 여기로도 받으면 계정 행이 둘인 패널이
13
+ * 만들어지고, 그중 하나는 자리가 틀린다.
14
+ */
15
+ export type SGnbSystemAction = DistributiveOmit<Exclude<SSystemActionButtonProps, {
16
+ type: 'account';
17
+ }>, 'color'> & {
18
+ /** 목록 key. 없으면 순서를 key 로 쓴다 */
19
+ value?: string;
20
+ };
21
+ /** 알림 버튼 */
22
+ export interface SGnbSystemAlert {
23
+ /** 라벨 텍스트. 기본 `'알림'` */
24
+ label?: string;
25
+ /**
26
+ * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수가 붙는다.
27
+ * 개수를 적을 가로가 모자란 자리(접힌 레일 · 기본 폭보다 좁게 줄인 판)에서는 점 배지로 바뀐다.
28
+ * 표기는 컴포넌트가 맡는다 — 세 자리마다 콤마를 넣어 그리므로 앱이 포맷한 문자열을 넘기지 않는다.
29
+ */
30
+ count?: number;
31
+ /** 클릭 */
32
+ onClick?: () => void;
33
+ /**
34
+ * 알림 버튼에 붙는 안내 툴팁의 문구(한 줄이 한 항목). 주면 뜬다 — **문구만 앱이 정하고**
35
+ * 색·방향·여닫힘은 컴포넌트가 쥔다: 색은 판이 light 면 기본, 그 밖(dark·상단바)이면 강조색이고
36
+ * 방향은 자리가 정한다(판·접힌 레일이면 오른쪽, 상단바면 아래).
37
+ *
38
+ * 스스로 사라지지 않는다 — **알림 버튼을 누르거나, 버튼에 얹었다 커서를 뺄 때** 닫히고,
39
+ * 같은 값을 계속 넘기는 동안에는 다시 뜨지 않는다.
40
+ *
41
+ * **다시 띄우려면 비웠다가 다시 넘긴다**(`undefined` → 문구). 문구가 같아도 상관없다 —
42
+ * 컴포넌트는 닫았다는 사실만 기억하고 문구 내용은 기억하지 않으므로, 새 알림마다 같은 안내를
43
+ * 다시 띄우는 화면도 막히지 않는다.
44
+ */
45
+ tooltip?: string[];
46
+ /**
47
+ * 알림을 누르면 뜨는 목록의 **내용**. 주면 컴포넌트가 알림 버튼에 붙여 띄운다 —
48
+ * 목록에 무엇을 쌓을지는 서비스마다 다르지만 **뜨는 자리는 늘 같아야 하므로**, 방향·앵커·
49
+ * 여닫힘(바깥 클릭·ESC 포함)과 배경·라운드·그림자는 컴포넌트가 쥐고 앱은 안에 담을 것만 준다.
50
+ * 방향은 자리가 정한다 — 판·접힌 레일이면 버튼 오른쪽, 상단바면 아래.
51
+ */
52
+ listBox?: ReactNode;
53
+ /**
54
+ * 알림 목록이 열리고 닫힐 때. 여닫는 것은 알림 버튼이 스스로 하므로 **그 사실을 알아야 할
55
+ * 때만** 준다(연 김에 읽음 처리하거나, 열려 있는 동안 다른 층을 접어 두는 화면).
56
+ *
57
+ * 앱이 누르지 않은 닫힘도 온다: GNB 를 접거나 펴면 알림 버튼이 다른 자리로 옮겨 서므로
58
+ * 목록이 닫히고 `false` 가 온다(계정 행과 같다).
59
+ */
60
+ onOpenChange?: (open: boolean) => void;
61
+ /**
62
+ * 안내 툴팁이 닫힐 때. 받아서 `tooltip` 을 비워 두는 것이 기본 사용법이다 — 그러면 앱이
63
+ * 다음에 넘기는 문구가 곧 다음 안내가 된다.
64
+ *
65
+ * 컴포넌트가 아는 "다시 뜨지 않는다" 는 **이 자리가 서 있는 동안**뿐이라(새로고침하거나
66
+ * GNB 를 접어 알림이 다른 자리로 옮겨 서면 새로 마운트된다), 그 사용자에게 두 번 다시 보이지
67
+ * 않아야 하면 앱이 이 신호를 저장해 두고 `tooltip` 을 그만 넘긴다.
68
+ */
69
+ onTooltipDismiss?: () => void;
70
+ }
71
+ /** 설정 버튼 */
72
+ export interface SGnbSystemSetting {
73
+ /** 라벨 텍스트. 기본 `'설정'` */
74
+ label?: string;
75
+ /** 클릭 */
76
+ onClick?: () => void;
77
+ }
78
+ /** 계정 행 */
79
+ export interface SGnbSystemAccount {
80
+ /** 계정 이름 */
81
+ label?: string;
82
+ /** 클릭. 패널은 어차피 열리므로, 여는 것 말고 따로 할 일이 있을 때만 준다 */
83
+ onClick?: () => void;
84
+ /**
85
+ * 계정 리스트박스가 열리고 닫힐 때. 여닫는 것은 계정 행이 스스로 하므로 **그 사실을 알아야 할
86
+ * 때만** 준다 — 열려 있는 동안 다른 층을 접어 두거나, 연 것을 기록하는 화면이 그렇다.
87
+ *
88
+ * 앱이 누르지 않은 닫힘도 온다: `header="fix"` 에서 GNB 를 접거나 펴면 계정 행이 다른 자리로
89
+ * 옮겨 서므로 패널이 닫히고 `false` 가 온다.
90
+ */
91
+ onOpenChange?: (open: boolean) => void;
92
+ /**
93
+ * 누르면 뜨는 계정 리스트박스(`SAccountListBox`) 내용. **필수다** — 계정 행은 늘 이 패널의
94
+ * 트리거이고, 눌러도 아무것도 뜨지 않는 계정 행은 없다.
95
+ * 뜨는 방향은 패널이 놓인 자리가 정하므로 앱이 넘기지 않는다.
96
+ */
97
+ listBox: SAccountListBoxContent;
98
+ }
99
+ export interface SGnbSystemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {
100
+ /**
101
+ * 색상(패널 표면). light = 흰 면, dark = 오션블루 면.
102
+ * 미지정 시 자기를 담은 SGnb 의 color 를 따른다(단독으로 쓰면 `'light'`).
103
+ */
104
+ color?: SGnbSystemColor;
105
+ /**
106
+ * 접힌(min) 형태 — 48px 레일 폭에 맞춰 알림·계정 아이콘만 남는다.
107
+ * 미지정 시 자기를 담은 SGnb 의 접힘 상태를 따른다. 상단바 자리에서는 뜻이 없다.
108
+ */
109
+ folded?: boolean;
110
+ /**
111
+ * 행 목록. 각 원소는 `SSystemActionButton` 의 props 다(`color` 제외 · 계정 행은 `account` 로
112
+ * 따로 준다). 판에서는 맨 위에 쌓이고,
113
+ * 상단바에서는 맨 왼쪽에 선다. 옆(아래)에 다른 조각이 있으면 그 사이에 구분선이 그어진다.
114
+ * 접히면 자리가 없어 렌더되지 않는다.
115
+ */
116
+ actions?: SGnbSystemAction[];
117
+ /** 도메인 태그 텍스트. 접히면 자리가 없어 렌더되지 않는다 */
118
+ domain?: string;
119
+ /**
120
+ * 알림 버튼. 없으면 렌더하지 않는다. 판에서는 설정과 나란히 서면 남는 폭을 먹고 혼자면 폭을 다 먹는다.
121
+ * 상단바에서는 자리가 넉넉하지 않아 라벨 없이 아이콘+개수만 선다.
122
+ */
123
+ alert?: SGnbSystemAlert;
124
+ /**
125
+ * 설정 버튼. 없으면 렌더하지 않는다. 판에서는 알림과 나란히 서면 제 폭만 갖고 혼자면 폭을 다 먹고,
126
+ * 상단바에서는 라벨 없이 아이콘만 선다.
127
+ * 접히면 자리가 없어 렌더되지 않는다 — 접힌 상태에서도 닿아야 하면 SGnb 의 `foldedFooter` 에 둔다.
128
+ */
129
+ setting?: SGnbSystemSetting;
130
+ /** 계정 행. 없으면 렌더하지 않는다 */
131
+ account?: SGnbSystemAccount;
132
+ }
133
+ /**
134
+ * SGnbSystem — GNB 의 system 조각들(액션 · 도메인 · 알림 · 설정 · 계정).
135
+ *
136
+ * 어디에 놓이느냐로 두 형태가 있고, 그 자리는 담은 SGnb 의 `header` 가 정해 내려준다(앱이 고르지 않는다).
137
+ * - `panel` (header="fix") — GNB 바닥에 깔리는 세로 판. 위에서부터 [행 목록(`actions`)] · 구분선 ·
138
+ * [도메인 태그] · [알림 | 설정] · [계정] 을 쌓는다.
139
+ * - `top` (header="full") — 레이아웃 전폭 상단바의 오른쪽 끝에 서는 가로 한 줄.
140
+ * [행 목록] | [알림] | [설정] | [도메인 계정] 순으로 서고 조각 사이에 세로 구분선이 놓인다
141
+ * (도메인·계정은 한 덩어리라 그 사이만 선 없이 붙는다).
142
+ *
143
+ * 각 조각은 해당 prop 을 줄 때만 나타나므로, 서비스마다 필요한 만큼만 켜서 쓴다 — 계정만, 알림만,
144
+ * 설정만, 알림+계정 … 어떤 부분집합이어도 그 조합만으로 판이 성립하도록 다음을 지킨다.
145
+ *
146
+ * - **구분선은 양쪽에 내용이 있을 때만** 긋는다. `actions` 만 주면 뜻 없는 선이 남지 않는다.
147
+ * - **판에서 알림·설정은 혼자 서면 폭을 다 먹는다.** 둘이 나란히 서면 알림이 남는 폭을, 설정이 제 폭을
148
+ * 갖고 사이에 세로선이 놓인다. 어느 쪽이 빠져도 왼쪽 끝은 위아래 행과 맞는다.
149
+ * - **켜진 조각이 하나도 없으면 아무것도 렌더하지 않는다** — 빈 판은 GNB 바닥에 정체 모를 경계선만 남긴다.
150
+ *
151
+ * 판에서 알림·설정·계정은 늘 함께 붙어 다니는 한 덩어리라 사이를 띄우지 않고, 그 위 조각들만 간격을 갖는다.
152
+ * 상단바에서는 자리가 가로로 넉넉하지 않아 알림·설정이 라벨을 벗고 아이콘(+개수)만 남는다.
153
+ *
154
+ * `folded` 면 48px 레일 폭에 맞춘 min 형태가 된다 — **알림·계정 아이콘만** 남고 라벨·태그·행 목록·설정은
155
+ * 빠진다(시안). 알림 개수는 적을 자리가 없어 점 배지로 바뀐다. 둘 다 없는 조합(설정만 쓰는 앱 등)이면
156
+ * 접힌 패널은 렌더되지 않으므로, 접힌 상태에서도 닿아야 하는 것은 SGnb 의 `foldedTop`·`foldedFooter` 에 둔다.
157
+ * 상단바는 접어도 남으므로 `top` 에는 접힘 형태가 없다.
158
+ *
159
+ * `alert.count` 가 1 이상이면 벨이 울리는 아이콘(`bellRinging`)과 강조색으로 바뀐다 — light 는 파랑,
160
+ * 어두운 면은 노랑(토큰이 정한다). 0 이거나 없으면 조용한 벨(`bell`)에 기본 색이다.
161
+ *
162
+ * 안내 툴팁(`alert.tooltip`)은 문구를 받은 동안 떠 있다가 알림을 누르거나 커서를 빼면 닫힌다.
163
+ * 다시 띄우는 신호는 문구가 **없음 → 있음** 으로 바뀌는 것이라, 같은 문구도 비웠다 다시 넘기면
164
+ * 새 안내로 뜬다.
165
+ *
166
+ * 판이 **메뉴 기본 폭보다 좁으면**(GNB 의 `resizable` 로 줄인 컬럼) 알림 개수를 적을 가로가
167
+ * 모자라 접힘과 같은 점 배지로 바뀐다 — 숫자가 설정 버튼을 밀어내거나 잘리는 대신, 알림이
168
+ * 있다는 사실만 남긴다. 좁은지는 담은 SGnb 가 내려주므로 앱이 고르는 prop 이 없다.
169
+ *
170
+ * 색은 놓인 면을 따른다: 판 위는 `light`/`dark`(오션블루 판), 판 없이 상단바 면에 바로 얹는 `top` 의
171
+ * dark 는 한 단계 어두운 `darker`(네이비) 색표다 — GNB_SYSTEM_TOP_COLOR_CONFIG 가 그 대응을 쥔다.
172
+ *
173
+ * **놓이는 자리(`placement`)는 prop 이 아니다** — 자기를 담은 SGnb 가 `header` 로 정해 내려준다.
174
+ * 앱이 고르면 세로 판 자리에 가로 한 줄이 서는 조합이 만들어지고, 그것을 고를 이유가 있는 화면은 없다.
175
+ * `color`·`folded` 도 슬롯 안에서는 GNB 가 내려주므로 다시 넘기지 않는다.
176
+ * 판은 폭이 늘 부모를 가득 채우고, 상단바 줄은 내용 폭만 갖는다.
177
+ */
178
+ export declare const SGnbSystem: import("react").ForwardRefExoticComponent<SGnbSystemProps & import("react").RefAttributes<HTMLDivElement>>;
179
+ export {};