@stn-uiux/pub-ui 0.1.58 → 0.1.59

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 (81) hide show
  1. package/dist/{chunk-7ASY5YJ6.js → chunk-36BAGMYT.js} +3 -3
  2. package/dist/chunk-36BAGMYT.js.map +1 -0
  3. package/dist/chunk-A5KLX6NX.js +1 -0
  4. package/dist/{chunk-UPXSNRIJ.js → chunk-AOS3IX4T.js} +2 -2
  5. package/dist/chunk-AOS3IX4T.js.map +1 -0
  6. package/dist/{chunk-XNGYRPZI.js → chunk-CHJATVOT.js} +4 -4
  7. package/dist/{chunk-XNGYRPZI.js.map → chunk-CHJATVOT.js.map} +1 -1
  8. package/dist/{chunk-TDLGKV4C.js → chunk-EQTZA7I2.js} +1 -14
  9. package/dist/chunk-EQTZA7I2.js.map +1 -0
  10. package/dist/{chunk-EDXSK54U.js → chunk-H4ZJQ5YW.js} +2 -2
  11. package/dist/{chunk-EQVFEZEQ.js → chunk-JPILTFLI.js} +5 -5
  12. package/dist/chunk-JPILTFLI.js.map +1 -0
  13. package/dist/{chunk-J46EPVSY.js → chunk-SKZOEF3H.js} +2 -2
  14. package/dist/chunk-SQJPE6HH.js +12 -0
  15. package/dist/chunk-SQJPE6HH.js.map +1 -0
  16. package/dist/{chunk-PVF77NHZ.js → chunk-XEG4WDUD.js} +4 -17
  17. package/dist/chunk-XEG4WDUD.js.map +1 -0
  18. package/dist/cli.js +9 -9
  19. package/dist/data/index.d.ts +1 -0
  20. package/dist/data/index.js +23 -19
  21. package/dist/data/stnBreadcrumb.js +3 -3
  22. package/dist/data/stnHeader.d.ts +2 -2
  23. package/dist/data/stnHeader.js +3 -3
  24. package/dist/data/stnLayout.d.ts +1 -1
  25. package/dist/data/stnLayout.js +1 -1
  26. package/dist/data/stnScroll.d.ts +1 -1
  27. package/dist/data/stnScroll.js +1 -1
  28. package/dist/data/stnSideNavItem.js +3 -3
  29. package/dist/data/stnStatus.d.ts +11 -0
  30. package/dist/data/stnStatus.js +7 -0
  31. package/dist/data/stnStatus.js.map +1 -0
  32. package/dist/data/stnSystemIcons.d.ts +1 -1
  33. package/dist/data/stnSystemIcons.js +2 -2
  34. package/dist/data/stnSystemIconsData.generated.js +1 -1
  35. package/dist/data/stnTree.d.ts +1 -1
  36. package/dist/data/stnTree.js +1 -1
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.js +23 -19
  39. package/package.json +1 -1
  40. package/styles/components/stn-btn.css +9 -0
  41. package/styles/components/stn-dropdown.css +11 -4
  42. package/styles/components/stn-label-prefix.css +37 -0
  43. package/styles/components/stn-pagination.css +113 -5
  44. package/styles/components/stn-scroll.css +51 -66
  45. package/styles/components/stn-segmented.css +3 -1
  46. package/styles/components/stn-status.css +853 -0
  47. package/styles/components/stn-table.css +32 -5
  48. package/styles/components/stn-text-field.css +30 -35
  49. package/styles/layouts/stn-container.css +9 -0
  50. package/styles/layouts/stn-layer1-content.css +105 -0
  51. package/styles/patterns/stn-alert-center.css +29 -4
  52. package/styles/patterns/stn-header.css +7 -145
  53. package/styles/patterns/stn-section-side.css +64 -0
  54. package/styles/patterns/stn-tree.css +73 -39
  55. package/styles/style-pub.css +1 -1
  56. package/styles/tokens/stn-breakpoint.css +12 -0
  57. package/styles/tokens/stn-colors-semantic.css +6 -6
  58. package/styles/tokens/stn-radius-semantic.css +1 -1
  59. package/dist/chunk-7ASY5YJ6.js.map +0 -1
  60. package/dist/chunk-EQVFEZEQ.js.map +0 -1
  61. package/dist/chunk-LHV26PEP.js +0 -1
  62. package/dist/chunk-PVF77NHZ.js.map +0 -1
  63. package/dist/chunk-TDLGKV4C.js.map +0 -1
  64. package/dist/chunk-UPXSNRIJ.js.map +0 -1
  65. package/styles/@assets/svg/system/3d/print.png +0 -0
  66. package/styles/@assets/svg/system/3d/print_1.png +0 -0
  67. package/styles/@assets/svg/system/3d/server1.png +0 -0
  68. package/styles/@assets/svg/system/3d/server1_1.png +0 -0
  69. package/styles/@assets/svg/system/3d/server2.png +0 -0
  70. package/styles/@assets/svg/system/3d/server2_1.png +0 -0
  71. package/styles/@assets/svg/system/3d/signal.png +0 -0
  72. package/styles/@assets/svg/system/3d/signal_1.png +0 -0
  73. package/styles/@assets/svg/system/3d/wifi.png +0 -0
  74. package/styles/@assets/svg/system/3d/wifi_1.png +0 -0
  75. package/styles/@assets/svg/system/ai_agent.png +0 -0
  76. package/styles/@assets/svg/system/line/input.svg +0 -3
  77. package/styles/@assets/svg/system/line/radio.svg +0 -3
  78. package/styles/components/stn-severity-badge.css +0 -227
  79. /package/dist/{chunk-LHV26PEP.js.map → chunk-A5KLX6NX.js.map} +0 -0
  80. /package/dist/{chunk-EDXSK54U.js.map → chunk-H4ZJQ5YW.js.map} +0 -0
  81. /package/dist/{chunk-J46EPVSY.js.map → chunk-SKZOEF3H.js.map} +0 -0
@@ -0,0 +1,853 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * STN Design System — Status Component (.stn-status)
4
+ *
5
+ * 상태 표출 및 제어 통합 컴포넌트:
6
+ * 1. Dot & DotGroup: 상태 점 인디케이터 (.stn-status-dot) 및 헤더 상태 요약 바 (.stn-status-dot-group)
7
+ * 2. Switch: 감시/미감시 인라인 토글 (.stn-status-switch) — 방패 아이콘 + 상태 텍스트 + 발광 노브 (표준 min-width 프리셋)
8
+ * 3. Flow: 워크플로우 진행 단계 파이프라인 (.stn-status-flow) — 다각형 배지 + 연결선
9
+ * 4. Severity: 알람 위험도 뱃지 및 필터 (.stn-status-severity) — critical · major · minor · warning
10
+ *
11
+ * 다크 모드 & 라이트 모드 완전 대응
12
+ */
13
+
14
+ /* ==========================================================================
15
+ 1. Status Dot (.stn-status-dot)
16
+ ========================================================================== */
17
+ .stn-status-dot {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: var(--stn-space-6, 6px);
21
+ font-family: var(--stn-font-body);
22
+ font-size: var(--stn-font-size-13, 13px);
23
+ font-weight: var(--stn-font-weight-medium, 500);
24
+ line-height: 1;
25
+ color: var(--stn-text-primary);
26
+ user-select: none;
27
+ vertical-align: middle;
28
+ }
29
+
30
+ /* Dot 위치 (Dot Position) */
31
+ .stn-status-dot.dot-right {
32
+ flex-direction: row-reverse;
33
+ }
34
+ .stn-status-dot.dot-none .stn-status-dot__point {
35
+ display: none !important;
36
+ }
37
+
38
+ /* Size 스케일 — STN 표준 규격: xs · sm · md(기본) · lg · xl */
39
+ /* xs — 18px */
40
+ .stn-status-dot.xs {
41
+ font-size: var(--stn-font-size-11, 11px);
42
+ gap: var(--stn-space-4, 4px);
43
+ }
44
+ .stn-status-dot.xs .stn-status-dot__point {
45
+ width: var(--stn-size-6, 6px);
46
+ height: var(--stn-size-6, 6px);
47
+ }
48
+ .stn-status-dot.xs.bordered {
49
+ height: var(--stn-size-18, 18px);
50
+ padding: 0 var(--stn-space-6, 6px);
51
+ }
52
+ .stn-status-dot.xs .stn-status-dot__count {
53
+ font-size: var(--stn-font-size-10, 10px);
54
+ }
55
+
56
+ /* sm — 20px */
57
+ .stn-status-dot.sm {
58
+ font-size: var(--stn-font-size-12, 12px);
59
+ gap: var(--stn-space-4, 4px);
60
+ }
61
+ .stn-status-dot.sm .stn-status-dot__point {
62
+ width: var(--stn-size-7, 7px);
63
+ height: var(--stn-size-7, 7px);
64
+ }
65
+ .stn-status-dot.sm.bordered {
66
+ height: var(--stn-size-20, 20px);
67
+ padding: 0 var(--stn-space-6, 6px);
68
+ }
69
+ .stn-status-dot.sm .stn-status-dot__count {
70
+ font-size: var(--stn-font-size-11, 11px);
71
+ }
72
+
73
+ /* md — 24px (기본) */
74
+ .stn-status-dot.md {
75
+ font-size: var(--stn-font-size-13, 13px);
76
+ gap: var(--stn-space-6, 6px);
77
+ }
78
+ .stn-status-dot.md .stn-status-dot__point {
79
+ width: var(--stn-size-8, 8px);
80
+ height: var(--stn-size-8, 8px);
81
+ }
82
+ .stn-status-dot.md.bordered {
83
+ height: var(--stn-size-24, 24px);
84
+ padding: 0 var(--stn-space-8, 8px);
85
+ }
86
+ .stn-status-dot.md .stn-status-dot__count {
87
+ font-size: var(--stn-font-size-12, 12px);
88
+ }
89
+
90
+ /* lg — 28px */
91
+ .stn-status-dot.lg {
92
+ font-size: var(--stn-font-size-14, 14px);
93
+ gap: var(--stn-space-8, 8px);
94
+ }
95
+ .stn-status-dot.lg .stn-status-dot__point {
96
+ width: var(--stn-size-9, 9px);
97
+ height: var(--stn-size-9, 9px);
98
+ }
99
+ .stn-status-dot.lg.bordered {
100
+ height: var(--stn-size-28, 28px);
101
+ padding: 0 var(--stn-space-10, 10px);
102
+ }
103
+ .stn-status-dot.lg .stn-status-dot__count {
104
+ font-size: var(--stn-font-size-13, 13px);
105
+ }
106
+
107
+ /* xl — 32px */
108
+ .stn-status-dot.xl {
109
+ font-size: var(--stn-font-size-15, 15px);
110
+ gap: var(--stn-space-8, 8px);
111
+ }
112
+ .stn-status-dot.xl .stn-status-dot__point {
113
+ width: var(--stn-size-10, 10px);
114
+ height: var(--stn-size-10, 10px);
115
+ }
116
+ .stn-status-dot.xl.bordered {
117
+ height: var(--stn-size-32, 32px);
118
+ padding: 0 var(--stn-space-12, 12px);
119
+ }
120
+ .stn-status-dot.xl .stn-status-dot__count {
121
+ font-size: var(--stn-font-size-14, 14px);
122
+ }
123
+
124
+ /* 여백(Gap) 조절 */
125
+ .stn-status-dot.gap-none { gap: 0; }
126
+ .stn-status-dot.gap-xs { gap: var(--stn-space-2, 2px); }
127
+ .stn-status-dot.gap-sm { gap: var(--stn-space-4, 4px); }
128
+ .stn-status-dot.gap-md { gap: var(--stn-space-6, 6px); }
129
+ .stn-status-dot.gap-lg { gap: var(--stn-space-10, 10px); }
130
+
131
+ /* 단독 테두리 캡슐 모드 (Bordered Dot) */
132
+ .stn-status-dot.bordered {
133
+ height: var(--stn-size-24, 24px);
134
+ padding: 0 var(--stn-space-8, 8px);
135
+ border-radius: var(--stn-radius-chip-pill, 9999px);
136
+ border: 1px solid var(--stn-status-dot-bordered-border);
137
+ background-color: var(--stn-layer-bg-card);
138
+ box-sizing: border-box;
139
+ }
140
+
141
+ .stn-status-dot__point {
142
+ display: inline-block;
143
+ width: var(--stn-size-8, 8px);
144
+ height: var(--stn-size-8, 8px);
145
+ border-radius: var(--stn-radius-circle, 50%);
146
+ flex-shrink: 0;
147
+ background-color: var(--stn-text-secondary);
148
+ transition: background-color 0.2s ease, box-shadow 0.2s ease;
149
+ }
150
+
151
+ /* 수치 및 카운트 */
152
+ .stn-status-dot__count {
153
+ display: inline-flex;
154
+ align-items: center;
155
+ font-family: var(--stn-font-number, var(--stn-font-body));
156
+ font-size: var(--stn-font-size-12, 12px);
157
+ font-weight: var(--stn-font-weight-bold, 700);
158
+ line-height: 1;
159
+ color: var(--stn-text-primary);
160
+ margin-left: var(--stn-space-2, 2px);
161
+ }
162
+
163
+ /* 상태별 스타일 (다크 기본) */
164
+ .stn-status-dot.up .stn-status-dot__point {
165
+ background-color: var(--stn-primary);
166
+ box-shadow: 0 0 6px color-mix(in srgb, var(--stn-primary) 80%, transparent);
167
+ }
168
+
169
+ .stn-status-dot.down .stn-status-dot__point {
170
+ background-color: var(--stn-gray-550);
171
+ }
172
+
173
+ .stn-status-dot.critical .stn-status-dot__point {
174
+ background-color: var(--stn-grade-critical);
175
+ box-shadow: 0 0 6px var(--stn-grade-critical);
176
+ }
177
+
178
+ .stn-status-dot.major .stn-status-dot__point {
179
+ background-color: var(--stn-grade-major);
180
+ box-shadow: 0 0 6px var(--stn-grade-major);
181
+ }
182
+
183
+ .stn-status-dot.minor .stn-status-dot__point {
184
+ background-color: var(--stn-grade-minor);
185
+ box-shadow: 0 0 6px var(--stn-grade-minor);
186
+ }
187
+
188
+ .stn-status-dot.warning .stn-status-dot__point {
189
+ background-color: var(--stn-grade-warning);
190
+ box-shadow: 0 0 6px var(--stn-grade-warning);
191
+ }
192
+
193
+ .stn-status-dot.success .stn-status-dot__point {
194
+ background-color: var(--stn-feedback-success);
195
+ box-shadow: 0 0 6px var(--stn-feedback-success);
196
+ }
197
+
198
+ .stn-status-dot.info .stn-status-dot__point {
199
+ background-color: var(--stn-feedback-info);
200
+ box-shadow: 0 0 6px var(--stn-feedback-info);
201
+ }
202
+
203
+ .stn-status-dot.secondary .stn-status-dot__point {
204
+ background-color: var(--stn-purple-400);
205
+ box-shadow: 0 0 6px var(--stn-purple-400);
206
+ }
207
+
208
+ .stn-status-dot.neutral .stn-status-dot__point {
209
+ background-color: var(--stn-gray-400);
210
+ }
211
+
212
+ .stn-status-dot.primary .stn-status-dot__point {
213
+ background-color: var(--stn-primary);
214
+ box-shadow: 0 0 6px var(--stn-primary);
215
+ }
216
+
217
+ .stn-status-dot.error .stn-status-dot__point {
218
+ background-color: var(--stn-feedback-error);
219
+ box-shadow: 0 0 6px var(--stn-feedback-error);
220
+ }
221
+
222
+ /* 펄스 애니메이션 */
223
+ .stn-status-dot.pulse .stn-status-dot__point {
224
+ animation: stn-status-pulse 1.8s infinite;
225
+ }
226
+
227
+ @keyframes stn-status-pulse {
228
+ 0% { transform: scale(0.95); opacity: 0.8; }
229
+ 50% { transform: scale(1.15); opacity: 1; }
230
+ 100% { transform: scale(0.95); opacity: 0.8; }
231
+ }
232
+
233
+ /* Dot — 라이트 모드 보정 (토큰이 자동 전환되지 않는 box-shadow 강도 조정) */
234
+ [data-theme='light'] .stn-status-dot.up .stn-status-dot__point {
235
+ background-color: var(--stn-primary);
236
+ box-shadow: 0 0 5px color-mix(in srgb, var(--stn-primary) 50%, transparent);
237
+ }
238
+
239
+ [data-theme='light'] .stn-status-dot.down .stn-status-dot__point {
240
+ background-color: var(--stn-gray-400);
241
+ }
242
+
243
+ /* ==========================================================================
244
+ 1-2. Status Dot Group (.stn-status-dot-group)
245
+ 헤더 및 대시보드 상태 요약 바 (구 System Chip 기능 완전 통합)
246
+ ========================================================================== */
247
+ .stn-status-dot-group {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ box-sizing: border-box;
251
+ vertical-align: middle;
252
+ }
253
+
254
+ .stn-status-dot-group.bordered {
255
+ height: var(--stn-size-26, 26px);
256
+ border-radius: var(--stn-radius-chip-pill, 9999px);
257
+ border: 1px solid var(--stn-status-dot-bordered-border);
258
+ background-color: var(--stn-layer-bg-card);
259
+ box-shadow: none;
260
+ overflow: hidden;
261
+ }
262
+
263
+ .stn-status-dot-group__item {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ gap: var(--stn-space-6, 6px);
267
+ padding: 0 var(--stn-space-10, 10px);
268
+ height: 100%;
269
+ box-sizing: border-box;
270
+ font-family: var(--stn-font-body);
271
+ font-size: var(--stn-font-size-12, 12px);
272
+ font-weight: var(--stn-font-weight-medium, 500);
273
+ color: var(--stn-text-primary);
274
+ user-select: none;
275
+ border-right: 1px solid var(--stn-status-dot-bordered-border);
276
+ transition: opacity 0.2s ease, background-color 0.15s ease;
277
+ }
278
+
279
+ .stn-status-dot-group__item:last-child {
280
+ border-right: none;
281
+ }
282
+
283
+ .stn-status-dot-group.no-border .stn-status-dot-group__item {
284
+ border-right: none;
285
+ padding: 0 var(--stn-space-6, 6px);
286
+ }
287
+
288
+
289
+ /* ==========================================================================
290
+ 2. Status Switch (.stn-status-switch)
291
+ ========================================================================== */
292
+ .stn-status-switch {
293
+ --_switch-bg: var(--stn-status-switch-bg);
294
+ --_switch-border: var(--stn-status-switch-border);
295
+ --_switch-color: var(--stn-status-switch-color);
296
+ --_badge-bg: var(--stn-status-switch-badge-bg);
297
+ --_badge-color: var(--stn-status-switch-badge-color);
298
+ --_thumb-bg: var(--stn-status-switch-thumb-bg);
299
+ --_thumb-shadow: none;
300
+
301
+ display: inline-flex;
302
+ align-items: center;
303
+ justify-content: space-between;
304
+ gap: var(--stn-space-4, 4px);
305
+ height: var(--stn-size-24, 24px);
306
+ min-width: var(--stn-size-80, 80px);
307
+ box-sizing: border-box;
308
+ padding: 0 var(--stn-space-6, 6px);
309
+ border-radius: var(--stn-radius-chip-pill, 9999px);
310
+ border: 1px solid var(--_switch-border);
311
+ background-color: var(--_switch-bg);
312
+ color: var(--_switch-color);
313
+ font-family: var(--stn-font-body);
314
+ font-size: var(--stn-font-size-12, 12px);
315
+ font-weight: var(--stn-font-weight-medium, 500);
316
+ cursor: pointer;
317
+ user-select: none;
318
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
319
+ }
320
+
321
+ .stn-status-switch:hover {
322
+ filter: brightness(1.08);
323
+ }
324
+
325
+ /* Checked (감시 On - 다크) */
326
+ .stn-status-switch.is-checked {
327
+ --_switch-border: var(--stn-status-switch-checked-border);
328
+ --_switch-bg: var(--stn-status-switch-checked-bg);
329
+ --_switch-color: var(--stn-status-switch-checked-color);
330
+ --_badge-bg: var(--stn-status-switch-checked-badge-bg);
331
+ --_badge-color: var(--stn-status-switch-checked-badge-color);
332
+ --_thumb-bg: var(--stn-status-switch-checked-thumb-bg);
333
+ --_thumb-shadow: var(--stn-status-switch-checked-thumb-shadow);
334
+ }
335
+
336
+ /* Switch — 라이트 모드 (토큰이 data-theme='light'에서 자동 전환됨) */
337
+ [data-theme='light'] .stn-status-switch:hover {
338
+ filter: brightness(0.97);
339
+ }
340
+
341
+ .stn-status-switch__badge {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ width: var(--stn-size-12, 12px);
346
+ height: var(--stn-size-12, 12px);
347
+ border-radius: var(--stn-radius-circle, 50%);
348
+ background: var(--_badge-bg);
349
+ color: var(--_badge-color);
350
+ flex-shrink: 0;
351
+ transition: all 0.25s ease;
352
+ }
353
+
354
+ .stn-status-switch__badge .stn-icon {
355
+ width: var(--stn-size-8, 8px);
356
+ height: var(--stn-size-8, 8px);
357
+ }
358
+
359
+ .stn-status-switch__label {
360
+ flex: 1 1 auto;
361
+ text-align: center;
362
+ padding: 0 var(--stn-space-2, 2px);
363
+ line-height: 1;
364
+ white-space: nowrap;
365
+ }
366
+
367
+ .stn-status-switch__thumb {
368
+ width: var(--stn-size-8, 8px);
369
+ height: var(--stn-size-8, 8px);
370
+ border-radius: var(--stn-radius-circle, 50%);
371
+ background-color: var(--_thumb-bg);
372
+ box-shadow: var(--_thumb-shadow);
373
+ flex-shrink: 0;
374
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
375
+ }
376
+
377
+ /* ==========================================================================
378
+ Width Presets (.w80 ~ .w200 / .full)
379
+ 스위치는 min-width 기반으로 작동하여 짧은 텍스트는 고정 너비를 유지하고
380
+ 긴 텍스트는 자연스럽게 늘어남(Hug)을 지원합니다.
381
+ ========================================================================== */
382
+ .stn-status-switch.w80 {
383
+ min-width: var(--stn-size-80, 80px);
384
+ }
385
+ .stn-status-switch.w100 {
386
+ min-width: var(--stn-size-100, 100px);
387
+ }
388
+ .stn-status-switch.w120 {
389
+ min-width: var(--stn-size-120, 120px);
390
+ }
391
+ .stn-status-switch.w140 {
392
+ min-width: var(--stn-size-140, 140px);
393
+ }
394
+ .stn-status-switch.w160 {
395
+ min-width: var(--stn-size-160, 160px);
396
+ }
397
+ .stn-status-switch.w180 {
398
+ min-width: var(--stn-size-180, 180px);
399
+ }
400
+ .stn-status-switch.w200 {
401
+ min-width: var(--stn-size-200, 200px);
402
+ }
403
+ .stn-status-switch.full {
404
+ width: 100%;
405
+ min-width: 100%;
406
+ }
407
+
408
+
409
+ /* ==========================================================================
410
+ 3. Status Flow (.stn-status-flow)
411
+ ========================================================================== */
412
+ .stn-status-flow {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ gap: var(--stn-space-8, 8px);
416
+ white-space: nowrap;
417
+ }
418
+
419
+ .stn-status-flow__step {
420
+ display: inline-flex;
421
+ align-items: center;
422
+ gap: var(--stn-space-6, 6px);
423
+ height: var(--stn-size-26, 26px);
424
+ padding: 0 var(--stn-space-10, 10px) 0 var(--stn-space-4, 4px);
425
+ border-radius: var(--stn-radius-6, 6px);
426
+ background-color: var(--stn-status-flow-step-bg);
427
+ border: 1px solid var(--stn-status-flow-step-border);
428
+ color: var(--stn-status-flow-step-color);
429
+ font-family: var(--stn-font-body);
430
+ font-size: var(--stn-font-size-12, 12px);
431
+ font-weight: var(--stn-font-weight-medium, 500);
432
+ transition: all 0.2s ease;
433
+ }
434
+
435
+ .stn-status-flow__badge {
436
+ display: inline-flex;
437
+ align-items: center;
438
+ justify-content: center;
439
+ width: var(--stn-size-18, 18px);
440
+ height: var(--stn-size-18, 18px);
441
+ border-radius: var(--stn-radius-4, 4px);
442
+ color: var(--stn-static-white);
443
+ font-size: var(--stn-font-size-11, 11px);
444
+ flex-shrink: 0;
445
+ }
446
+
447
+ /* 테두리 있는 거(Bordered, 기본) vs 테두리 없는 거(No-border / Flat) */
448
+ .stn-status-flow.no-border .stn-status-flow__step {
449
+ background-color: transparent;
450
+ border-color: transparent;
451
+ padding: 0 var(--stn-space-4, 4px);
452
+ }
453
+
454
+ .stn-status-flow.no-border .stn-status-flow__step.is-current {
455
+ box-shadow: none;
456
+ font-weight: var(--stn-font-weight-bold, 700);
457
+ }
458
+
459
+ /* Size 스케일 — STN 표준 규격: xs · sm · md(기본) · lg · xl */
460
+ /* xs — 20px */
461
+ .stn-status-flow.xs .stn-status-flow__step {
462
+ height: var(--stn-size-20, 20px);
463
+ font-size: var(--stn-font-size-11, 11px);
464
+ padding: 0 var(--stn-space-6, 6px) 0 var(--stn-space-2, 2px);
465
+ gap: var(--stn-space-4, 4px);
466
+ }
467
+ .stn-status-flow.xs .stn-status-flow__badge {
468
+ width: var(--stn-size-14, 14px);
469
+ height: var(--stn-size-14, 14px);
470
+ font-size: var(--stn-font-size-9, 9px);
471
+ border-radius: var(--stn-radius-2, 2px);
472
+ }
473
+ .stn-status-flow.xs .stn-status-flow__badge .stn-icon {
474
+ width: var(--stn-size-9, 9px);
475
+ height: var(--stn-size-9, 9px);
476
+ }
477
+
478
+ /* sm — 22px */
479
+ .stn-status-flow.sm .stn-status-flow__step {
480
+ height: var(--stn-size-22, 22px);
481
+ font-size: var(--stn-font-size-11, 11px);
482
+ padding: 0 var(--stn-space-8, 8px) 0 var(--stn-space-3, 3px);
483
+ gap: var(--stn-space-5, 5px);
484
+ }
485
+ .stn-status-flow.sm .stn-status-flow__badge {
486
+ width: var(--stn-size-16, 16px);
487
+ height: var(--stn-size-16, 16px);
488
+ font-size: var(--stn-font-size-10, 10px);
489
+ border-radius: var(--stn-radius-3, 3px);
490
+ }
491
+ .stn-status-flow.sm .stn-status-flow__badge .stn-icon {
492
+ width: var(--stn-size-10, 10px);
493
+ height: var(--stn-size-10, 10px);
494
+ }
495
+
496
+ /* md — 26px (기본) */
497
+ .stn-status-flow.md .stn-status-flow__step {
498
+ height: var(--stn-size-26, 26px);
499
+ font-size: var(--stn-font-size-12, 12px);
500
+ padding: 0 var(--stn-space-10, 10px) 0 var(--stn-space-4, 4px);
501
+ gap: var(--stn-space-6, 6px);
502
+ }
503
+ .stn-status-flow.md .stn-status-flow__badge {
504
+ width: var(--stn-size-18, 18px);
505
+ height: var(--stn-size-18, 18px);
506
+ font-size: var(--stn-font-size-11, 11px);
507
+ border-radius: var(--stn-radius-4, 4px);
508
+ }
509
+
510
+ /* lg — 32px */
511
+ .stn-status-flow.lg .stn-status-flow__step {
512
+ height: var(--stn-size-32, 32px);
513
+ font-size: var(--stn-font-size-13, 13px);
514
+ padding: 0 var(--stn-space-12, 12px) 0 var(--stn-space-5, 5px);
515
+ gap: var(--stn-space-8, 8px);
516
+ }
517
+ .stn-status-flow.lg .stn-status-flow__badge {
518
+ width: var(--stn-size-22, 22px);
519
+ height: var(--stn-size-22, 22px);
520
+ font-size: var(--stn-font-size-12, 12px);
521
+ border-radius: var(--stn-radius-4, 4px);
522
+ }
523
+ .stn-status-flow.lg .stn-status-flow__badge .stn-icon {
524
+ width: var(--stn-size-13, 13px);
525
+ height: var(--stn-size-13, 13px);
526
+ }
527
+
528
+ /* xl — 38px */
529
+ .stn-status-flow.xl .stn-status-flow__step {
530
+ height: var(--stn-size-38, 38px);
531
+ font-size: var(--stn-font-size-14, 14px);
532
+ padding: 0 var(--stn-space-14, 14px) 0 var(--stn-space-6, 6px);
533
+ gap: var(--stn-space-10, 10px);
534
+ }
535
+ .stn-status-flow.xl .stn-status-flow__badge {
536
+ width: var(--stn-size-26, 26px);
537
+ height: var(--stn-size-26, 26px);
538
+ font-size: var(--stn-font-size-13, 13px);
539
+ border-radius: var(--stn-radius-6, 6px);
540
+ }
541
+ .stn-status-flow.xl .stn-status-flow__badge .stn-icon {
542
+ width: var(--stn-size-15, 15px);
543
+ height: var(--stn-size-15, 15px);
544
+ }
545
+
546
+ /* Flow 단계별 배지 색상 */
547
+ .stn-status-flow__badge--critical { background-color: var(--stn-grade-critical); }
548
+ .stn-status-flow__badge--warning { background-color: var(--stn-grade-warning); }
549
+ .stn-status-flow__badge--major { background-color: var(--stn-grade-major); }
550
+ .stn-status-flow__badge--minor { background-color: var(--stn-grade-minor); color: var(--stn-gray-950); }
551
+ .stn-status-flow__badge--primary { background-color: var(--stn-primary); }
552
+ .stn-status-flow__badge--secondary { background-color: var(--stn-purple-400); }
553
+ .stn-status-flow__badge--success { background-color: var(--stn-feedback-success); }
554
+ .stn-status-flow__badge--error { background-color: var(--stn-feedback-error); }
555
+ .stn-status-flow__badge--info { background-color: var(--stn-feedback-info); }
556
+ .stn-status-flow__badge--neutral { background-color: var(--stn-gray-500); }
557
+
558
+ .stn-status-flow__connector {
559
+ display: inline-flex;
560
+ align-items: center;
561
+ color: var(--stn-status-flow-connector-color);
562
+ opacity: var(--stn-status-flow-connector-opacity);
563
+ font-size: var(--stn-font-size-12, 12px);
564
+ user-select: none;
565
+ }
566
+
567
+ .stn-status-flow__step.is-current {
568
+ border-color: var(--stn-primary);
569
+ box-shadow: var(--stn-status-flow-current-shadow);
570
+ }
571
+
572
+ .stn-status-flow__step.is-dimmed {
573
+ opacity: 0.45;
574
+ }
575
+
576
+ /* ==========================================================================
577
+ 4. Status Severity (.stn-status-severity)
578
+ 알람 위험도 뱃지 및 필터 (StnStatus.Severity)
579
+ 위험도: critical · major · minor · warning
580
+ 크기: sm (18px) · md (20px, 기본) · lg (24px)
581
+ 변형: contained (기본 채움형) · outlined (외곽선형) · none (아이콘+텍스트만) · filter (필터 버튼) · glow (발광 효과)
582
+ 모양: 기본 (4px 반경) · round / rounded-full (알약/원형 9999px) · icon-only (아이콘 전용)
583
+ ========================================================================== */
584
+
585
+ .stn-status-severity-filter-group {
586
+ display: inline-flex;
587
+ align-items: center;
588
+ gap: var(--stn-space-8, 8px);
589
+ flex-wrap: wrap;
590
+ }
591
+
592
+ .stn-status-severity {
593
+ box-sizing: border-box;
594
+ display: inline-flex;
595
+ align-items: center;
596
+ justify-content: center;
597
+ gap: var(--stn-space-2, 2px);
598
+ border-radius: var(--stn-radius-4, 4px);
599
+ font-family: var(--stn-font-body, Pretendard, sans-serif);
600
+ line-height: 1.2;
601
+ user-select: none;
602
+ vertical-align: middle;
603
+ white-space: nowrap;
604
+ transition: opacity 0.15s ease, filter 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
605
+ }
606
+
607
+ /* Shape: round / rounded-full (9999px 알약형) */
608
+ .stn-status-severity.round,
609
+ .stn-status-severity.rounded-full {
610
+ border-radius: var(--stn-radius-circle, 9999px);
611
+ }
612
+
613
+ /* 4-1. 기본 뱃지 모드 (Badge - Display: sm / md / lg) */
614
+ .stn-status-severity.badge,
615
+ .stn-status-severity:not(.filter) {
616
+ height: var(--stn-severity-badge-height-md, var(--stn-severity-badge-height, var(--stn-size-20, 20px)));
617
+ padding: var(--stn-severity-badge-padding-md, var(--stn-severity-badge-padding, var(--stn-space-2, 2px) var(--stn-space-8, 8px)));
618
+ font-size: var(--stn-font-size-11, 11px);
619
+ font-weight: var(--stn-font-weight-bold, 700);
620
+ letter-spacing: -0.1px;
621
+ }
622
+
623
+ .stn-status-severity.badge .stn-status-severity__icon,
624
+ .stn-status-severity:not(.filter) .stn-status-severity__icon {
625
+ width: var(--stn-severity-badge-icon-size-md, var(--stn-severity-badge-icon-size, var(--stn-size-14, 14px)));
626
+ height: var(--stn-severity-badge-icon-size-md, var(--stn-severity-badge-icon-size, var(--stn-size-14, 14px)));
627
+ }
628
+
629
+ /* Sizes: sm (18px) */
630
+ .stn-status-severity.sm {
631
+ height: var(--stn-severity-badge-height-sm, var(--stn-size-18, 18px));
632
+ padding: var(--stn-severity-badge-padding-sm, var(--stn-space-2, 2px) var(--stn-space-6, 6px));
633
+ font-size: var(--stn-font-size-10, 10px);
634
+ gap: var(--stn-space-2, 2px);
635
+ }
636
+
637
+ .stn-status-severity.sm .stn-status-severity__icon {
638
+ width: var(--stn-severity-badge-icon-size-sm, var(--stn-size-12, 12px));
639
+ height: var(--stn-severity-badge-icon-size-sm, var(--stn-size-12, 12px));
640
+ }
641
+
642
+ /* Sizes: md (20px - 기본) */
643
+ .stn-status-severity.md {
644
+ height: var(--stn-severity-badge-height-md, var(--stn-size-20, 20px));
645
+ padding: var(--stn-severity-badge-padding-md, var(--stn-space-2, 2px) var(--stn-space-8, 8px));
646
+ font-size: var(--stn-font-size-11, 11px);
647
+ gap: var(--stn-space-2, 2px);
648
+ }
649
+
650
+ .stn-status-severity.md .stn-status-severity__icon {
651
+ width: var(--stn-severity-badge-icon-size-md, var(--stn-size-14, 14px));
652
+ height: var(--stn-severity-badge-icon-size-md, var(--stn-size-14, 14px));
653
+ }
654
+
655
+ /* Sizes: lg (24px) */
656
+ .stn-status-severity.lg {
657
+ height: var(--stn-severity-badge-height-lg, var(--stn-size-24, 24px));
658
+ padding: var(--stn-severity-badge-padding-lg, var(--stn-space-4, 4px) var(--stn-space-10, 10px));
659
+ font-size: var(--stn-font-size-12, 12px);
660
+ gap: var(--stn-space-4, 4px);
661
+ }
662
+
663
+ .stn-status-severity.lg .stn-status-severity__icon {
664
+ width: var(--stn-severity-badge-icon-size-lg, var(--stn-size-16, 16px));
665
+ height: var(--stn-severity-badge-icon-size-lg, var(--stn-size-16, 16px));
666
+ }
667
+
668
+ /* 4-2. 아이콘 전용 모드 (Icon-Only - 정사각 4px / 원형 9999px) */
669
+ .stn-status-severity.icon-only {
670
+ width: var(--stn-severity-badge-height-md, var(--stn-size-20, 20px));
671
+ height: var(--stn-severity-badge-height-md, var(--stn-size-20, 20px));
672
+ padding: 0;
673
+ gap: 0;
674
+ flex-shrink: 0;
675
+ }
676
+
677
+ .stn-status-severity.icon-only.sm {
678
+ width: var(--stn-severity-badge-height-sm, var(--stn-size-18, 18px));
679
+ height: var(--stn-severity-badge-height-sm, var(--stn-size-18, 18px));
680
+ padding: 0;
681
+ }
682
+
683
+ .stn-status-severity.icon-only.md {
684
+ width: var(--stn-severity-badge-height-md, var(--stn-size-20, 20px));
685
+ height: var(--stn-severity-badge-height-md, var(--stn-size-20, 20px));
686
+ padding: 0;
687
+ }
688
+
689
+ .stn-status-severity.icon-only.lg {
690
+ width: var(--stn-severity-badge-height-lg, var(--stn-size-24, 24px));
691
+ height: var(--stn-severity-badge-height-lg, var(--stn-size-24, 24px));
692
+ padding: 0;
693
+ }
694
+
695
+ .stn-status-severity.icon-only .stn-status-severity__label {
696
+ display: none;
697
+ }
698
+
699
+ /* 4-3. 필터 모드 (Filter Toggle - 52px x 26px) */
700
+ .stn-status-severity.filter {
701
+ width: var(--stn-severity-filter-width, var(--stn-size-52, 52px));
702
+ height: var(--stn-severity-filter-height, var(--stn-size-26, 26px));
703
+ padding: var(--stn-space-4, 4px);
704
+ font-size: var(--stn-font-size-14, 14px);
705
+ font-weight: var(--stn-font-weight-bold, 700);
706
+ cursor: pointer;
707
+ background: transparent;
708
+ }
709
+
710
+ .stn-status-severity.filter .stn-status-severity__icon {
711
+ width: var(--stn-severity-icon-size, var(--stn-size-16, 16px));
712
+ height: var(--stn-severity-icon-size, var(--stn-size-16, 16px));
713
+ }
714
+
715
+ .stn-status-severity.filter:hover {
716
+ filter: brightness(1.15);
717
+ }
718
+
719
+ .stn-status-severity.filter:active {
720
+ filter: brightness(0.92);
721
+ }
722
+
723
+ /* 필터 비활성 상태 */
724
+ .stn-status-severity.filter.is-inactive,
725
+ .stn-status-severity.filter:not(.is-active) {
726
+ opacity: 0.35;
727
+ filter: grayscale(0.5);
728
+ box-shadow: none !important;
729
+ }
730
+
731
+ .stn-status-severity.filter.is-inactive:hover,
732
+ .stn-status-severity.filter:not(.is-active):hover {
733
+ opacity: 0.65;
734
+ filter: grayscale(0.2);
735
+ }
736
+
737
+ /* 아이콘 래퍼 */
738
+ .stn-status-severity__icon {
739
+ display: inline-flex;
740
+ align-items: center;
741
+ justify-content: center;
742
+ flex-shrink: 0;
743
+ }
744
+
745
+ .stn-status-severity__icon img,
746
+ .stn-status-severity__icon svg {
747
+ display: block;
748
+ width: 100%;
749
+ height: 100%;
750
+ }
751
+
752
+ .stn-status-severity__label {
753
+ display: inline-block;
754
+ line-height: 1;
755
+ }
756
+
757
+ /* 4-4. 심각도 등급 및 Variant 스타일 (contained, outlined, none) */
758
+
759
+ /* Contained (기본 채움형 — .contained 또는 기본 badge) */
760
+ .stn-status-severity.critical,
761
+ .stn-status-severity.contained.critical {
762
+ --stn-badge-glow-color: var(--stn-severity-glow);
763
+ background: var(--stn-severity-critical-bg);
764
+ border: 1px solid var(--stn-severity-critical-border);
765
+ color: var(--stn-severity-fg);
766
+ }
767
+
768
+ .stn-status-severity.major,
769
+ .stn-status-severity.contained.major {
770
+ --stn-badge-glow-color: var(--stn-severity-glow-major);
771
+ background: var(--stn-severity-major-bg);
772
+ border: 1px solid var(--stn-severity-major-border);
773
+ color: var(--stn-severity-fg);
774
+ }
775
+
776
+ .stn-status-severity.minor,
777
+ .stn-status-severity.contained.minor {
778
+ --stn-badge-glow-color: var(--stn-severity-glow-minor);
779
+ background: var(--stn-severity-minor-bg);
780
+ border: 1px solid var(--stn-severity-minor-border);
781
+ color: var(--stn-severity-fg);
782
+ }
783
+
784
+ .stn-status-severity.warning,
785
+ .stn-status-severity.contained.warning {
786
+ --stn-badge-glow-color: var(--stn-severity-glow-warning);
787
+ background: var(--stn-severity-warning-bg);
788
+ border: 1px solid var(--stn-severity-warning-border);
789
+ color: var(--stn-severity-fg);
790
+ }
791
+
792
+ /* Outlined (외곽선형 — 배경 없이 투명 외곽선과 텍스트로만 표시) */
793
+ .stn-status-severity.outlined {
794
+ background: transparent;
795
+ }
796
+
797
+ .stn-status-severity.outlined.critical {
798
+ --stn-badge-glow-color: var(--stn-severity-glow);
799
+ background: transparent;
800
+ border: 1px solid var(--stn-severity-critical-border);
801
+ color: var(--stn-grade-critical);
802
+ }
803
+
804
+ .stn-status-severity.outlined.major {
805
+ --stn-badge-glow-color: var(--stn-severity-glow-major);
806
+ background: transparent;
807
+ border: 1px solid var(--stn-severity-major-border);
808
+ color: var(--stn-grade-major);
809
+ }
810
+
811
+ .stn-status-severity.outlined.minor {
812
+ --stn-badge-glow-color: var(--stn-severity-glow-minor);
813
+ background: transparent;
814
+ border: 1px solid var(--stn-severity-minor-border);
815
+ color: var(--stn-grade-minor);
816
+ }
817
+
818
+ .stn-status-severity.outlined.warning {
819
+ --stn-badge-glow-color: var(--stn-severity-glow-warning);
820
+ background: transparent;
821
+ border: 1px solid var(--stn-severity-warning-border);
822
+ color: var(--stn-grade-warning);
823
+ }
824
+
825
+ /* None (배경 및 테두리 없음 — 아이콘과 글자만 표시) */
826
+ .stn-status-severity.none {
827
+ background: transparent !important;
828
+ border: none !important;
829
+ padding-left: 0;
830
+ padding-right: 0;
831
+ box-shadow: none !important;
832
+ }
833
+
834
+ .stn-status-severity.none.critical {
835
+ color: var(--stn-grade-critical);
836
+ }
837
+
838
+ .stn-status-severity.none.major {
839
+ color: var(--stn-grade-major);
840
+ }
841
+
842
+ .stn-status-severity.none.minor {
843
+ color: var(--stn-grade-minor);
844
+ }
845
+
846
+ .stn-status-severity.none.warning {
847
+ color: var(--stn-grade-warning);
848
+ }
849
+
850
+ /* 4-5. Glow 발광 변형 (.glow) */
851
+ .stn-status-severity.glow {
852
+ box-shadow: 0 0 var(--stn-space-8) var(--stn-badge-glow-color);
853
+ }