@stn-uiux/pub-ui 0.1.58 → 0.1.60

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 (92) hide show
  1. package/dist/{chunk-7ASY5YJ6.js → chunk-2ZYBBVBT.js} +53 -28
  2. package/dist/chunk-2ZYBBVBT.js.map +1 -0
  3. package/dist/{chunk-EQVFEZEQ.js → chunk-3RYAWLME.js} +5 -5
  4. package/dist/chunk-3RYAWLME.js.map +1 -0
  5. package/dist/chunk-A5KLX6NX.js +1 -0
  6. package/dist/{chunk-UPXSNRIJ.js → chunk-AOS3IX4T.js} +2 -2
  7. package/dist/chunk-AOS3IX4T.js.map +1 -0
  8. package/dist/{chunk-XNGYRPZI.js → chunk-CHJATVOT.js} +4 -4
  9. package/dist/{chunk-XNGYRPZI.js.map → chunk-CHJATVOT.js.map} +1 -1
  10. package/dist/{chunk-DNMZJS65.js → chunk-IOBNIUK3.js} +2 -2
  11. package/dist/{chunk-DNMZJS65.js.map → chunk-IOBNIUK3.js.map} +1 -1
  12. package/dist/{chunk-TDLGKV4C.js → chunk-NHYZ7AWK.js} +2 -14
  13. package/dist/chunk-NHYZ7AWK.js.map +1 -0
  14. package/dist/{chunk-PVF77NHZ.js → chunk-Q4QXONXL.js} +4 -17
  15. package/dist/chunk-Q4QXONXL.js.map +1 -0
  16. package/dist/chunk-SQJPE6HH.js +12 -0
  17. package/dist/chunk-SQJPE6HH.js.map +1 -0
  18. package/dist/{chunk-J46EPVSY.js → chunk-XQ7UUG7Y.js} +2 -2
  19. package/dist/{chunk-EDXSK54U.js → chunk-YMWHZNBT.js} +2 -2
  20. package/dist/cli.js +10 -10
  21. package/dist/data/index.d.ts +1 -0
  22. package/dist/data/index.js +24 -20
  23. package/dist/data/stnBreadcrumb.js +3 -3
  24. package/dist/data/stnHeader.d.ts +2 -2
  25. package/dist/data/stnHeader.js +3 -3
  26. package/dist/data/stnLayout.d.ts +3 -3
  27. package/dist/data/stnLayout.js +1 -1
  28. package/dist/data/stnScroll.d.ts +1 -1
  29. package/dist/data/stnScroll.js +1 -1
  30. package/dist/data/stnSideNavItem.js +3 -3
  31. package/dist/data/stnStatus.d.ts +11 -0
  32. package/dist/data/stnStatus.js +7 -0
  33. package/dist/data/stnStatus.js.map +1 -0
  34. package/dist/data/stnSystemIcons.d.ts +1 -1
  35. package/dist/data/stnSystemIcons.js +2 -2
  36. package/dist/data/stnSystemIconsData.generated.js +1 -1
  37. package/dist/data/stnTable.d.ts +1 -1
  38. package/dist/data/stnTable.js +1 -1
  39. package/dist/data/stnTree.d.ts +1 -1
  40. package/dist/data/stnTree.js +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +24 -20
  43. package/package.json +1 -1
  44. package/styles/@assets/svg/system/line/chevron-left.svg +3 -0
  45. package/styles/components/stn-btn.css +9 -0
  46. package/styles/components/stn-dropdown.css +11 -4
  47. package/styles/components/stn-label-prefix.css +38 -0
  48. package/styles/components/stn-pagination.css +113 -5
  49. package/styles/components/stn-popup.css +1 -1
  50. package/styles/components/stn-scroll.css +51 -66
  51. package/styles/components/stn-segmented.css +3 -1
  52. package/styles/components/stn-status.css +851 -0
  53. package/styles/components/stn-table.css +106 -13
  54. package/styles/components/stn-text-field.css +30 -35
  55. package/styles/components/stn-widget.css +16 -8
  56. package/styles/layouts/stn-container.css +13 -9
  57. package/styles/layouts/stn-layer1-content.css +83 -1
  58. package/styles/patterns/stn-alert-center.css +29 -4
  59. package/styles/patterns/stn-header.css +7 -145
  60. package/styles/patterns/stn-section-side.css +50 -0
  61. package/styles/patterns/stn-tree.css +139 -82
  62. package/styles/style-pub.css +1 -1
  63. package/styles/tokens/stn-breakpoint.css +12 -0
  64. package/styles/tokens/stn-colors-semantic.css +5 -5
  65. package/styles/tokens/stn-radius-semantic.css +12 -1
  66. package/styles/tokens/stn-size-semantic.css +31 -4
  67. package/styles/tokens/stn-size.css +2 -0
  68. package/styles/tokens/stn-spacing-semantic.css +7 -3
  69. package/styles/tokens/stn-typography-semantic.css +10 -0
  70. package/dist/chunk-7ASY5YJ6.js.map +0 -1
  71. package/dist/chunk-EQVFEZEQ.js.map +0 -1
  72. package/dist/chunk-LHV26PEP.js +0 -1
  73. package/dist/chunk-PVF77NHZ.js.map +0 -1
  74. package/dist/chunk-TDLGKV4C.js.map +0 -1
  75. package/dist/chunk-UPXSNRIJ.js.map +0 -1
  76. package/styles/@assets/svg/system/3d/print.png +0 -0
  77. package/styles/@assets/svg/system/3d/print_1.png +0 -0
  78. package/styles/@assets/svg/system/3d/server1.png +0 -0
  79. package/styles/@assets/svg/system/3d/server1_1.png +0 -0
  80. package/styles/@assets/svg/system/3d/server2.png +0 -0
  81. package/styles/@assets/svg/system/3d/server2_1.png +0 -0
  82. package/styles/@assets/svg/system/3d/signal.png +0 -0
  83. package/styles/@assets/svg/system/3d/signal_1.png +0 -0
  84. package/styles/@assets/svg/system/3d/wifi.png +0 -0
  85. package/styles/@assets/svg/system/3d/wifi_1.png +0 -0
  86. package/styles/@assets/svg/system/ai_agent.png +0 -0
  87. package/styles/@assets/svg/system/line/input.svg +0 -3
  88. package/styles/@assets/svg/system/line/radio.svg +0 -3
  89. package/styles/components/stn-severity-badge.css +0 -227
  90. /package/dist/{chunk-LHV26PEP.js.map → chunk-A5KLX6NX.js.map} +0 -0
  91. /package/dist/{chunk-J46EPVSY.js.map → chunk-XQ7UUG7Y.js.map} +0 -0
  92. /package/dist/{chunk-EDXSK54U.js.map → chunk-YMWHZNBT.js.map} +0 -0
@@ -48,15 +48,11 @@
48
48
  .stn-header.gap-lg,
49
49
  .stn-header--gap-lg { column-gap: var(--stn-space-24, 24px); }
50
50
 
51
- /* Page Header 또는 Center가 없는 헤더 (Left 타이틀이 유연하게 확장되고 Right와 균형 유지) */
52
- .stn-header--page,
51
+ /* Center 슬롯이 없는 헤더 (Left 타이틀이 유연하게 확장되고 Right와 균형 유지) */
53
52
  .stn-header:not(:has(> .stn-header__center)) {
54
53
  grid-template-columns: minmax(0, 1fr) auto;
55
- padding-inline-start: var(--stn-spacing-header-padding-inline-start, var(--stn-space-8, 8px));
56
- padding-inline-end: var(--stn-spacing-header-padding-inline-end, var(--stn-space-24, 24px));
57
54
  }
58
55
 
59
- .stn-header--page .stn-header__left,
60
56
  .stn-header:not(:has(> .stn-header__center)) .stn-header__left {
61
57
  grid-column: 1;
62
58
  width: auto;
@@ -65,7 +61,6 @@
65
61
  flex: 1 1 auto;
66
62
  }
67
63
 
68
- .stn-header--page .stn-header__right,
69
64
  .stn-header:not(:has(> .stn-header__center)) .stn-header__right {
70
65
  grid-column: 2;
71
66
  width: auto;
@@ -125,10 +120,6 @@
125
120
  flex-shrink: 0;
126
121
  }
127
122
 
128
- .stn-header--page .stn-header__center {
129
- display: none;
130
- }
131
-
132
123
 
133
124
  .stn-header__page-title {
134
125
  margin: 0;
@@ -169,135 +160,7 @@
169
160
  flex: 0 1 auto;
170
161
  }
171
162
 
172
- /* System Chip — Figma light 43378 · dark 74893 */
173
- .stn-system-chip {
174
- display: inline-flex;
175
- align-items: center;
176
- height: var(--stn-size-32);
177
- border: var(--stn-size-1) solid var(--stn-system-chip-border);
178
- border-radius: var(--stn-radius-8);
179
- background: var(--stn-system-chip-bg);
180
- box-shadow: var(--stn-system-chip-shadow);
181
- box-sizing: border-box;
182
- }
183
-
184
- .stn-system-chip.no-border,
185
- .stn-system-chip.stn-system-chip--no-border {
186
- border: none;
187
- background: transparent;
188
- box-shadow: none;
189
- }
190
-
191
- .stn-system-chip.no-border .stn-system-chip__item,
192
- .stn-system-chip.stn-system-chip--no-border .stn-system-chip__item {
193
- border-right: none;
194
- }
195
-
196
- .stn-system-chip__item {
197
- display: inline-flex;
198
- align-items: center;
199
- gap: var(--stn-space-8);
200
- min-width: var(--stn-size-48);
201
- padding: 0 var(--stn-space-12);
202
- height: 100%;
203
- box-sizing: border-box;
204
- border-right: var(--stn-size-1) solid var(--stn-system-chip-divider);
205
- }
206
-
207
- .stn-system-chip__item:last-child {
208
- border-right: none;
209
- }
210
-
211
- /* 텍스트 위치: 왼쪽 정렬 (점은 우측에 위치) */
212
- .stn-system-chip--text-left .stn-system-chip__dot {
213
- order: 2;
214
- }
215
-
216
- .stn-system-chip--text-left .stn-system-chip__label {
217
- order: 0;
218
- }
219
-
220
- .stn-system-chip--text-left .stn-system-chip__count {
221
- order: 1;
222
- text-align: left;
223
- }
224
-
225
- .stn-system-chip__dot {
226
- flex-shrink: 0;
227
- width: var(--stn-size-8);
228
- height: var(--stn-size-8);
229
- border-radius: 50%;
230
- background-color: var(--stn-system-chip-dot-color, var(--stn-system-chip-dot));
231
- }
232
-
233
- .stn-system-chip__dot--cr,
234
- .stn-system-chip__dot--critical,
235
- .stn-system-chip__dot--red,
236
- .stn-system-chip__dot--error {
237
- background-color: var(--stn-system-chip-dot-critical);
238
- }
239
-
240
- .stn-system-chip__dot--mj,
241
- .stn-system-chip__dot--major,
242
- .stn-system-chip__dot--orange {
243
- background-color: var(--stn-system-chip-dot-major);
244
- }
245
-
246
- .stn-system-chip__dot--mn,
247
- .stn-system-chip__dot--minor,
248
- .stn-system-chip__dot--yellow,
249
- .stn-system-chip__dot--warn {
250
- background-color: var(--stn-system-chip-dot-minor);
251
- }
252
-
253
- .stn-system-chip__dot--info,
254
- .stn-system-chip__dot--blue {
255
- background-color: var(--stn-system-chip-dot-info);
256
- }
257
-
258
- .stn-system-chip__dot--wr,
259
- .stn-system-chip__dot--warning,
260
- .stn-system-chip__dot--teal {
261
- background-color: var(--stn-system-chip-dot-warning);
262
- }
263
-
264
- .stn-system-chip__dot--success,
265
- .stn-system-chip__dot--green {
266
- background-color: var(--stn-system-chip-dot-success);
267
- }
268
-
269
- .stn-system-chip__dot--purple {
270
- background-color: var(--stn-system-chip-dot-secondary);
271
- }
272
-
273
- .stn-system-chip__dot--neutral,
274
- .stn-system-chip__dot--gray {
275
- background-color: var(--stn-system-chip-dot-neutral);
276
- }
277
-
278
- .stn-system-chip__count {
279
- flex: 1;
280
- min-width: 0;
281
- color: var(--stn-system-chip-count);
282
- font-size: var(--stn-text-title-small-size);
283
- font-weight: var(--stn-text-title-small-weight);
284
- line-height: 1;
285
- text-align: right;
286
- font-family: var(--stn-font-body);
287
- }
288
163
 
289
- .stn-system-chip__label {
290
- flex-shrink: 0;
291
- color: var(--stn-system-chip-count);
292
- font-size: var(--stn-text-body-small-size);
293
- font-weight: var(--stn-font-weight-medium);
294
- line-height: 1;
295
- white-space: nowrap;
296
- }
297
-
298
- .stn-system-chip--labeled .stn-system-chip__item {
299
- min-width: var(--stn-size-80);
300
- }
301
164
 
302
165
  /* Header toolbar — Figma map dark 74959 · 212175 · actions 40000040:75034 */
303
166
  .stn-header-toolbar {
@@ -424,13 +287,12 @@
424
287
  flex-shrink: 0;
425
288
  }
426
289
 
427
- /* Center(시계/타이틀)가 있는 경우 Left(Breadcrumb/칩 등)를 숨겨 중앙 및 우측 툴바 공간 확보 */
428
- .stn-header:has(> .stn-header__center) > .stn-header__left {
290
+ /* Center(시계/타이틀)가 있는 경우 Left(Breadcrumb/칩 등)를 숨겨 중앙 및 우측 툴바 공간 확보 (단, Page Header는 페이지 타이틀이 핵심이므로 제외) */
291
+ .stn-header:not(.stn-header--page):has(> .stn-header__center) > .stn-header__left {
429
292
  display: none;
430
293
  }
431
294
 
432
- /* Page Header 또는 Center가 없는 헤더: 모바일에서도 Left(제목) 유지 및 말줄임표(...) 우선 축약 */
433
- .stn-header--page,
295
+ /* Center가 없는 헤더: 모바일에서도 Left(제목) 유지 및 말줄임표(...) 우선 축약 */
434
296
  .stn-header:not(:has(> .stn-header__center)) {
435
297
  grid-template-columns: minmax(0, 1fr) auto;
436
298
  }
@@ -519,12 +381,12 @@
519
381
  flex-shrink: 0;
520
382
  }
521
383
 
522
- .stn-header:has(> .stn-header__center) > .stn-header__left {
384
+ /* Center(시계/타이틀)가 있는 경우 Left(Breadcrumb/칩 등)를 숨겨 중앙 및 우측 툴바 공간 확보 (단, Page Header는 페이지 타이틀이 핵심이므로 제외) */
385
+ .stn-header:not(.stn-header--page):has(> .stn-header__center) > .stn-header__left {
523
386
  display: none !important;
524
387
  }
525
388
 
526
- /* Page Header 또는 Center가 없는 헤더: 모바일에서도 Left(제목) 유지 및 말줄임표(...) 우선 축약 */
527
- .stn-header--page,
389
+ /* Center가 없는 헤더: 모바일에서도 Left(제목) 유지 및 말줄임표(...) 우선 축약 */
528
390
  .stn-header:not(:has(> .stn-header__center)) {
529
391
  grid-template-columns: minmax(0, 1fr) auto !important;
530
392
  }
@@ -21,6 +21,13 @@
21
21
  overflow: hidden;
22
22
  }
23
23
 
24
+ /* fullWidth prop 또는 부모 LNB 컨테이너 안에서 가로 100% 확장 지원 */
25
+ .stn-section-side.is-full-width,
26
+ .stn-section-side--full,
27
+ .stn-page-scaffold__lnb > .stn-section-side {
28
+ width: 100%;
29
+ }
30
+
24
31
  /* list view — LNB 열(search+table) 높이에 맞춰 패널 세로 채움 · 하단 inset은 L1 .stn-container padding-bottom */
25
32
  .stn-section-side--fill {
26
33
  flex: 1 1 0%;
@@ -39,4 +46,47 @@
39
46
  max-height: 100%;
40
47
  overflow-x: hidden;
41
48
  overflow-y: scroll;
49
+ /* list/tree LNB 스크롤바: thin (4px) — table 스크롤 규격과 완전 일치 */
50
+ --stn-scroll-width: var(--stn-scroll-width-thin, 4px);
51
+ --stn-scroll-radius: var(--stn-scroll-radius-thin, 2px);
52
+ scrollbar-width: thin;
53
+ scrollbar-color: var(--stn-scroll-thumb) var(--stn-scroll-track);
54
+ }
55
+
56
+
57
+
58
+ /* 상단 고정 헤더 (제목, 탭, 검색바 등) */
59
+ .stn-section-side__header {
60
+ flex-shrink: 0;
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: var(--stn-space-8, 8px);
64
+ margin-bottom: var(--stn-space-8, 8px);
42
65
  }
66
+
67
+ /* 하단 고정 푸터 (옵션 스위치, 액션 등) */
68
+ .stn-section-side__footer {
69
+ flex-shrink: 0;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: space-between;
73
+ margin-top: var(--stn-space-8, 8px);
74
+ padding-top: var(--stn-space-8, 8px);
75
+ border-top: 1px solid var(--stn-border-subtle, rgba(255, 255, 255, 0.08));
76
+ }
77
+
78
+ /* ─────────────────────────────────────────────────────────────
79
+ * 접힌 상태 (레일 모드 — 너비 56px)
80
+ * ───────────────────────────────────────────────────────────── */
81
+ .stn-section-side.is-collapsed {
82
+ width: var(--stn-list-lnb-collapsed-width);
83
+ min-width: var(--stn-list-lnb-collapsed-width);
84
+ padding: var(--stn-space-8) var(--stn-space-4);
85
+ transition: width 0.2s ease;
86
+ }
87
+
88
+ .stn-section-side.is-collapsed .stn-section-side__header {
89
+ align-items: center;
90
+ margin-bottom: var(--stn-space-8);
91
+ }
92
+
@@ -13,13 +13,13 @@
13
13
  .stn-tree__heading {
14
14
  display: flex;
15
15
  align-items: center;
16
- min-height: 24px;
16
+ min-height: var(--stn-tree-row-height);
17
17
  margin: 0;
18
18
  padding: 0 var(--stn-spacing-tree-label-pad-inline);
19
19
  color: var(--stn-tree-heading);
20
- font-size: var(--stn-text-body-small-size);
21
- font-weight: var(--stn-font-weight-bold, 700);
22
- line-height: 1;
20
+ font-size: var(--stn-tree-heading-font-size);
21
+ font-weight: var(--stn-tree-heading-font-weight);
22
+ line-height: var(--stn-tree-heading-line-height);
23
23
  }
24
24
 
25
25
  .stn-tree__rows {
@@ -32,16 +32,21 @@
32
32
  .stn-tree__row {
33
33
  display: flex;
34
34
  align-items: center;
35
- min-height: 24px;
35
+ min-height: var(--stn-tree-row-height);
36
36
  width: 100%;
37
- border-radius: var(--stn-radius-4, 4px);
37
+ border-radius: var(--stn-radius-tree-row);
38
+ border: var(--stn-tree-border-width) solid transparent;
39
+ box-sizing: border-box;
38
40
  cursor: pointer;
39
41
  user-select: none;
42
+ transition: background-color var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out),
43
+ border-color var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out),
44
+ box-shadow var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
40
45
  }
41
46
 
42
47
  .stn-tree__row:focus-visible {
43
- outline: 2px solid var(--stn-tree-focus);
44
- outline-offset: 1px;
48
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
49
+ outline-offset: var(--stn-tree-focus-ring-offset);
45
50
  }
46
51
 
47
52
  /* Interaction — selected 토큰 · hover/pressed는 selected의 약한/강한 면 */
@@ -60,17 +65,18 @@
60
65
  .stn-tree__row.is-selected.is-hover,
61
66
  .stn-tree__row.is-selected:active,
62
67
  .stn-tree__row.is-selected.is-pressed {
63
- background: var(--stn-tree-selected);
68
+ background: color-mix(in srgb, var(--stn-primary) 10%, transparent);
69
+ border-color: var(--stn-nav-menu-active-border);
64
70
  }
65
71
 
66
72
  .stn-tree__cell {
67
73
  box-sizing: border-box;
68
74
  display: inline-flex;
69
- flex: 0 0 24px;
75
+ flex: 0 0 var(--stn-tree-cell-size);
70
76
  align-items: center;
71
77
  justify-content: center;
72
- width: 24px;
73
- height: 24px;
78
+ width: var(--stn-tree-cell-size);
79
+ height: var(--stn-tree-cell-size);
74
80
  }
75
81
 
76
82
  .stn-tree__cell--blank {
@@ -79,19 +85,19 @@
79
85
  }
80
86
 
81
87
  .stn-tree__cell--icon {
82
- flex-basis: 24px;
88
+ flex-basis: var(--stn-tree-cell-size);
83
89
  }
84
90
 
85
91
  .stn-tree__guide {
86
92
  display: block;
87
- width: 24px;
88
- height: 24px;
93
+ width: var(--stn-tree-guide-size);
94
+ height: var(--stn-tree-guide-size);
89
95
  }
90
96
 
91
97
  .stn-tree__guide-glyph {
92
98
  display: block;
93
- width: 24px;
94
- height: 24px;
99
+ width: var(--stn-tree-guide-size);
100
+ height: var(--stn-tree-guide-size);
95
101
  background-color: var(--stn-tree-guide);
96
102
  mask-position: center;
97
103
  mask-size: contain;
@@ -103,8 +109,8 @@
103
109
 
104
110
  .stn-tree__chevron-glyph {
105
111
  display: block;
106
- width: 12px;
107
- height: 12px;
112
+ width: var(--stn-tree-chevron-size);
113
+ height: var(--stn-tree-chevron-size);
108
114
  background-color: var(--stn-tree-chevron);
109
115
  mask-position: center;
110
116
  mask-size: contain;
@@ -113,7 +119,7 @@
113
119
  -webkit-mask-size: contain;
114
120
  -webkit-mask-repeat: no-repeat;
115
121
  transform: rotate(180deg);
116
- transition: transform 0.15s ease;
122
+ transition: transform var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
117
123
  }
118
124
 
119
125
  .stn-tree__chevron-glyph.is-expanded {
@@ -129,22 +135,21 @@
129
135
  }
130
136
 
131
137
  .stn-tree__toggle:focus-visible {
132
- outline: 2px solid var(--stn-tree-focus);
133
- outline-offset: 1px;
134
- border-radius: 2px;
138
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
139
+ outline-offset: var(--stn-tree-focus-ring-offset);
140
+ border-radius: var(--stn-radius-tree-toggle-focus);
135
141
  }
136
142
 
137
143
  .stn-tree__chevron {
138
144
  display: block;
139
- width: 12px;
140
- height: 12px;
145
+ width: var(--stn-tree-chevron-size);
146
+ height: var(--stn-tree-chevron-size);
141
147
  }
142
148
 
143
149
  .stn-tree__icon-glyph {
144
150
  display: block;
145
- width: 16px;
146
- height: 16px;
147
- background-color: var(--stn-tree-icon-default);
151
+ width: var(--stn-tree-icon-size);
152
+ height: var(--stn-tree-icon-size);
148
153
  mask-position: center;
149
154
  mask-size: contain;
150
155
  mask-repeat: no-repeat;
@@ -171,8 +176,8 @@
171
176
  }
172
177
 
173
178
  .stn-tree__icon--server .stn-tree__icon-glyph {
174
- width: 16px;
175
- height: 16px;
179
+ width: var(--stn-tree-icon-size);
180
+ height: var(--stn-tree-icon-size);
176
181
  }
177
182
 
178
183
  /* fill/server_2 — 본색 SVG. 다크 invert 제외(stn-pub-icon--color) */
@@ -196,19 +201,20 @@
196
201
  }
197
202
 
198
203
  .stn-tree__label {
204
+ flex: 1 1 auto;
199
205
  min-width: 0;
200
206
  padding: 0 var(--stn-spacing-tree-label-pad-inline);
201
207
  overflow: hidden;
202
208
  text-overflow: ellipsis;
203
209
  white-space: nowrap;
204
- font-size: var(--stn-text-body-medium-size);
205
- font-weight: var(--stn-font-weight-regular);
206
- line-height: 1;
210
+ font-size: var(--stn-tree-label-font-size);
211
+ font-weight: var(--stn-tree-label-font-weight);
212
+ line-height: var(--stn-tree-label-line-height);
207
213
  }
208
214
 
209
215
  .stn-tree__row.is-bold .stn-tree__label,
210
216
  .stn-tree__label.is-bold {
211
- font-weight: var(--stn-font-weight-bold, 700);
217
+ font-weight: var(--stn-tree-label-font-weight-bold);
212
218
  }
213
219
 
214
220
  .stn-tree__row--root .stn-tree__label {
@@ -248,36 +254,36 @@
248
254
  color: var(--stn-tree-label-folder-nested);
249
255
  }
250
256
 
251
- /* ── 가이드 라인 숨김 수식어 (--no-guides) ──────────────────
257
+ /* ── 가이드 라인 숨김 수식어 (.no-guides) ─────────────────────
252
258
  * 인덴트 공간은 유지하고 연결선(connector · vertical) 글리프만 숨깁니다.
253
- * 사용법: <StnTree guides={false} /> 또는 <StnTree className="stn-tree--no-guides" />
259
+ * 사용법: <StnTree guides={false} /> 또는 <StnTree className="no-guides" />
254
260
  * ──────────────────────────────────────────────────────── */
255
- .stn-tree--no-guides .stn-tree__guide-glyph,
256
- .stn-tree--no-guides .stn-tree__cell--guide .stn-tree__guide-glyph {
261
+ .stn-tree.no-guides .stn-tree__guide-glyph,
262
+ .stn-tree.no-guides .stn-tree__cell--guide .stn-tree__guide-glyph {
257
263
  display: none !important;
258
264
  }
259
265
 
260
- /* ── 너비 규격 수식어 (Tree 권장 표준 규격: w160~w240, full) ──
261
- * width prop → .stn-tree--{w160|w180|w200|w220|w240|full}
266
+ /* ── 너비 규격 수식어 (Tree 권장 표준 규격: w80~w240, full) ──
267
+ * STN 표준 규격: .w80, .w100, .w120, .w140, .w160, .w180, .w200, .w220, .w240, .full
262
268
  * ──────────────────────────────────────────────────────── */
263
- .stn-tree--w80 { width: var(--stn-size-80, 80px); }
264
- .stn-tree--w100 { width: var(--stn-size-100, 100px); }
265
- .stn-tree--w120 { width: var(--stn-size-120, 120px); }
266
- .stn-tree--w140 { width: var(--stn-size-140, 140px); }
267
- .stn-tree--w160 { width: var(--stn-size-160, 160px); }
268
- .stn-tree--w180 { width: var(--stn-size-180, 180px); }
269
- .stn-tree--w200 { width: var(--stn-size-200, 200px); }
270
- .stn-tree--w220 { width: var(--stn-size-220, 220px); }
271
- .stn-tree--w240 { width: var(--stn-size-240, 240px); }
272
- .stn-tree--full { width: 100%; }
269
+ .stn-tree.w80 { width: var(--stn-size-80); }
270
+ .stn-tree.w100 { width: var(--stn-size-100); }
271
+ .stn-tree.w120 { width: var(--stn-size-120); }
272
+ .stn-tree.w140 { width: var(--stn-size-140); }
273
+ .stn-tree.w160 { width: var(--stn-size-160); }
274
+ .stn-tree.w180 { width: var(--stn-size-180); }
275
+ .stn-tree.w200 { width: var(--stn-size-200); }
276
+ .stn-tree.w220 { width: var(--stn-size-220); }
277
+ .stn-tree.w240 { width: var(--stn-size-240); }
278
+ .stn-tree.full { width: 100%; }
273
279
 
274
280
  /* ── 선택/호버 테두리 곡률 수식어 (Border Radius) ────────────
275
- * radius prop → .stn-tree--radius-{none|sm|md|full}
281
+ * radius prop → .radius-none, .radius-sm, .radius-md, .radius-full
276
282
  * ──────────────────────────────────────────────────────── */
277
- .stn-tree--radius-none .stn-tree__row { border-radius: var(--stn-radius-0, 0px); }
278
- .stn-tree--radius-sm .stn-tree__row { border-radius: var(--stn-radius-4, 4px); }
279
- .stn-tree--radius-md .stn-tree__row { border-radius: var(--stn-radius-8, 8px); }
280
- .stn-tree--radius-full .stn-tree__row { border-radius: var(--stn-radius-circle, 9999px); }
283
+ .stn-tree.radius-none .stn-tree__row { border-radius: var(--stn-radius-tree-row-none); }
284
+ .stn-tree.radius-sm .stn-tree__row { border-radius: var(--stn-radius-tree-row-sm); }
285
+ .stn-tree.radius-md .stn-tree__row { border-radius: var(--stn-radius-tree-row-md); }
286
+ .stn-tree.radius-full .stn-tree__row { border-radius: var(--stn-radius-tree-row-full); }
281
287
 
282
288
  /* ── 가시성(눈) 토글 버튼 및 숨김 상태 ──────────────────────
283
289
  * showVisibilityToggle={true} 일 때 행 우측 끝에 표시됩니다.
@@ -287,16 +293,16 @@
287
293
  align-items: center;
288
294
  justify-content: center;
289
295
  margin-left: auto;
290
- margin-right: var(--stn-space-4, 4px);
296
+ margin-right: var(--stn-tree-visibility-btn-margin-inline-end);
291
297
  padding: 0;
292
- width: 20px;
293
- height: 20px;
298
+ width: var(--stn-tree-visibility-btn-size);
299
+ height: var(--stn-tree-visibility-btn-size);
294
300
  border: none;
295
301
  background: transparent;
296
302
  cursor: pointer;
297
- border-radius: var(--stn-radius-2, 2px);
303
+ border-radius: var(--stn-radius-tree-visibility-btn);
298
304
  opacity: 0.7;
299
- transition: opacity 0.15s ease;
305
+ transition: opacity var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
300
306
  }
301
307
 
302
308
  .stn-tree__visibility-btn:hover {
@@ -304,15 +310,15 @@
304
310
  }
305
311
 
306
312
  .stn-tree__visibility-btn:focus-visible {
307
- outline: 2px solid var(--stn-tree-focus);
308
- outline-offset: 1px;
313
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
314
+ outline-offset: var(--stn-tree-focus-ring-offset);
309
315
  }
310
316
 
311
317
  .stn-tree__visibility-glyph {
312
318
  display: block;
313
- width: 14px;
314
- height: 14px;
315
- background-color: var(--stn-text-tertiary, #8b93a1);
319
+ width: var(--stn-tree-visibility-icon-size);
320
+ height: var(--stn-tree-visibility-icon-size);
321
+ background-color: var(--stn-text-tertiary);
316
322
  mask-position: center;
317
323
  mask-size: contain;
318
324
  mask-repeat: no-repeat;
@@ -322,7 +328,7 @@
322
328
  }
323
329
 
324
330
  .stn-tree__visibility-glyph.is-off {
325
- background-color: var(--stn-text-disabled, #a0aec0);
331
+ background-color: var(--stn-text-disabled);
326
332
  }
327
333
 
328
334
  /* 숨김/미사용 처리된 노드 — 텍스트/아이콘 반투명(dimmed) */
@@ -331,54 +337,105 @@
331
337
  opacity: 0.38;
332
338
  }
333
339
 
340
+ /* ── 카운트 표시 (Node Count) ──────────────────────────────
341
+ * count prop → 노드 우측에 표시되는 개수 숫자
342
+ * ──────────────────────────────────────────────────────── */
343
+ .stn-tree__count {
344
+ display: inline-flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ font-family: var(--stn-font-number, var(--stn-font-body));
348
+ font-size: var(--stn-tree-count-font-size);
349
+ font-weight: var(--stn-tree-count-font-weight);
350
+ line-height: var(--stn-tree-count-line-height);
351
+ color: var(--stn-text-tertiary);
352
+ margin-left: auto;
353
+ margin-right: var(--stn-tree-count-margin-inline-end);
354
+ flex-shrink: 0;
355
+ }
356
+
357
+ .stn-tree__count + .stn-tree__visibility-btn {
358
+ margin-left: 0;
359
+ }
360
+
361
+ .stn-tree__icon--custom .stn-icon {
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ }
334
366
 
335
367
  /* ── 행 높이 크기 수식어 (Row Size) ─────────────────────────
336
- * size prop → .stn-tree--{xs|md|lg|xl} 수식어로 자동 적용.
337
- * 기본값: sm (24px) — 수식어 없음.
368
+ * STN 표준 규격: .xs · .sm · .md · .lg · .xl
369
+ * (기본값: sm 24px)
338
370
  *
339
371
  * Guide cell: align-self:stretch + guide-glyph height:100% 로
340
372
  * 행이 높아져도 vertical 연결선이 끊기지 않게 유지합니다.
341
373
  * ──────────────────────────────────────────────────────── */
342
374
 
343
375
  /* xs — 20px: 초밀집 사이드바 목록 */
344
- .stn-tree--xs .stn-tree__row { min-height: 20px; }
345
- .stn-tree--xs .stn-tree__cell { height: 20px; }
376
+ .stn-tree.xs .stn-tree__row { min-height: var(--stn-tree-row-height-xs); }
377
+ .stn-tree.xs .stn-tree__cell { height: var(--stn-tree-row-height-xs); }
378
+
379
+ /* sm — 24px: 기본 콤팩트 */
380
+ .stn-tree.sm .stn-tree__row { min-height: var(--stn-tree-row-height-sm); }
381
+ .stn-tree.sm .stn-tree__cell { height: var(--stn-tree-row-height-sm); }
346
382
 
347
383
  /* md — 32px: comfortable */
348
- .stn-tree--md .stn-tree__row { min-height: 32px; }
349
- .stn-tree--md .stn-tree__cell { height: 32px; }
350
- .stn-tree--md .stn-tree__cell--guide {
384
+ .stn-tree.md .stn-tree__row { min-height: var(--stn-tree-row-height-md); }
385
+ .stn-tree.md .stn-tree__cell { height: var(--stn-tree-row-height-md); }
386
+ .stn-tree.md .stn-tree__cell--guide {
351
387
  align-self: stretch;
352
388
  height: auto;
353
389
  }
354
- .stn-tree--md .stn-tree__cell--guide .stn-tree__guide-glyph {
390
+ .stn-tree.md .stn-tree__cell--guide .stn-tree__guide-glyph {
355
391
  height: 100%;
356
392
  mask-size: 100% 100%;
357
393
  -webkit-mask-size: 100% 100%;
358
394
  }
359
395
 
360
396
  /* lg — 40px: spacious */
361
- .stn-tree--lg .stn-tree__row { min-height: 40px; }
362
- .stn-tree--lg .stn-tree__cell { height: 40px; }
363
- .stn-tree--lg .stn-tree__cell--guide {
397
+ .stn-tree.lg .stn-tree__row { min-height: var(--stn-tree-row-height-lg); }
398
+ .stn-tree.lg .stn-tree__cell { height: var(--stn-tree-row-height-lg); }
399
+ .stn-tree.lg .stn-tree__cell--guide {
364
400
  align-self: stretch;
365
401
  height: auto;
366
402
  }
367
- .stn-tree--lg .stn-tree__cell--guide .stn-tree__guide-glyph {
403
+ .stn-tree.lg .stn-tree__cell--guide .stn-tree__guide-glyph {
368
404
  height: 100%;
369
405
  mask-size: 100% 100%;
370
406
  -webkit-mask-size: 100% 100%;
371
407
  }
372
408
 
373
409
  /* xl — 48px: extra spacious */
374
- .stn-tree--xl .stn-tree__row { min-height: 48px; }
375
- .stn-tree--xl .stn-tree__cell { height: 48px; }
376
- .stn-tree--xl .stn-tree__cell--guide {
410
+ .stn-tree.xl .stn-tree__row { min-height: var(--stn-tree-row-height-xl); }
411
+ .stn-tree.xl .stn-tree__cell { height: var(--stn-tree-row-height-xl); }
412
+ .stn-tree.xl .stn-tree__cell--guide {
377
413
  align-self: stretch;
378
414
  height: auto;
379
415
  }
380
- .stn-tree--xl .stn-tree__cell--guide .stn-tree__guide-glyph {
416
+ .stn-tree.xl .stn-tree__cell--guide .stn-tree__guide-glyph {
381
417
  height: 100%;
382
418
  mask-size: 100% 100%;
383
419
  -webkit-mask-size: 100% 100%;
384
420
  }
421
+
422
+ /* ── 접힌 레일 모드 (.is-collapsed) ─────────────────────────
423
+ * collapsed prop → LNB 축소 레일 모드 시 아이콘만 세로 중앙 정렬
424
+ * ──────────────────────────────────────────────────────── */
425
+ .stn-tree.is-collapsed .stn-tree__heading,
426
+ .stn-tree.is-collapsed .stn-tree__cell:not(.stn-tree__cell--icon),
427
+ .stn-tree.is-collapsed .stn-tree__label,
428
+ .stn-tree.is-collapsed .stn-tree__count,
429
+ .stn-tree.is-collapsed .stn-tree__visibility-btn {
430
+ display: none;
431
+ }
432
+
433
+ .stn-tree.is-collapsed .stn-tree__row {
434
+ justify-content: center;
435
+ padding: var(--stn-tree-collapsed-row-padding-block) 0;
436
+ min-height: var(--stn-tree-collapsed-row-height);
437
+ }
438
+
439
+ .stn-tree.is-collapsed .stn-tree__cell--icon {
440
+ margin: 0 auto;
441
+ }
@@ -42,7 +42,6 @@
42
42
  @import './components/stn-chip.css';
43
43
  @import './components/stn-breadcrumb.css';
44
44
  @import './components/stn-badge.css';
45
- @import './components/stn-severity-badge.css';
46
45
  @import './components/stn-side-nav.css';
47
46
  @import './components/stn-header-title.css';
48
47
  @import './components/stn-popup.css';
@@ -69,6 +68,7 @@
69
68
  @import './components/stn-icon.css';
70
69
  @import './components/stn-card.css';
71
70
  @import './components/stn-topology.css';
71
+ @import './components/stn-status.css';
72
72
 
73
73
  /* --- 5. Patterns (Composite UI Recipes) --- */
74
74
  @import './patterns/stn-section-side.css';