@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
@@ -114,10 +114,40 @@ td.stn-table__col-check .stn-checkbox {
114
114
  align-items: center;
115
115
  justify-content: flex-end;
116
116
  flex-wrap: wrap;
117
- gap: var(--stn-spacing-table-footer-actions-gap);
118
- text-align: right;
119
117
  }
120
118
 
119
+ /* ─────────────────────────────────────────────────────────────
120
+ * 푸터 반응형 2줄 전환: <= 768px (Foundation sm breakpoint)
121
+ * 1행: [좌측 요약/페이지크기] + [우측 액션 버튼들]
122
+ * 2행: [중앙 페이지네이션 100% 가운데 정렬]
123
+ * ───────────────────────────────────────────────────────────── */
124
+ @container stn-table-container (max-width: 768px) {
125
+ .stn-table__footer {
126
+ display: flex;
127
+ flex-wrap: wrap;
128
+ align-items: center;
129
+ justify-content: space-between;
130
+ row-gap: var(--stn-spacing-table-footer-gap, var(--stn-space-12));
131
+ column-gap: var(--stn-spacing-table-footer-actions-gap, var(--stn-space-8));
132
+ }
133
+ .stn-table__footer-leading {
134
+ order: 1;
135
+ flex: 0 1 auto;
136
+ }
137
+ .stn-table__footer-right {
138
+ order: 2;
139
+ flex: 0 1 auto;
140
+ margin-left: auto;
141
+ }
142
+ .stn-table__footer-center {
143
+ order: 3;
144
+ width: 100%;
145
+ flex: 1 0 100%;
146
+ justify-content: center;
147
+ }
148
+ }
149
+
150
+
121
151
  /* rowspan · colspan · expand-row (중첩 Path 테이블) */
122
152
  .stn-table__grid th[rowspan],
123
153
  .stn-table__grid td[rowspan],
@@ -216,9 +246,6 @@ td.stn-table__col-check .stn-checkbox {
216
246
 
217
247
  .stn-table thead,
218
248
  .stn-table__thead {
219
- position: sticky;
220
- top: 0;
221
- z-index: 10;
222
249
  background: transparent !important;
223
250
  }
224
251
 
@@ -57,92 +57,92 @@
57
57
  opacity: var(--stn-input-disabled-opacity);
58
58
  }
59
59
 
60
- .stn-text-field:is(.outlined, .stn-text-field--outlined) {
60
+ .stn-text-field.outlined {
61
61
  border: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-border);
62
62
  background-color: var(--stn-input-bg);
63
63
  }
64
64
 
65
- .stn-text-field:is(.filled, .stn-text-field--filled) {
65
+ .stn-text-field.filled {
66
66
  border: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-filled-border, transparent);
67
67
  background-color: var(--stn-input-filled-bg, var(--stn-input-bg));
68
68
  }
69
69
 
70
- .stn-text-field:is(.filled, .stn-text-field--filled):focus:not([readonly]) {
70
+ .stn-text-field.filled:focus:not([readonly]) {
71
71
  border: var(--stn-input-focus);
72
72
  background-color: var(--stn-input-filled-bg, var(--stn-input-bg));
73
73
  color: var(--stn-input-focus-fg, var(--stn-input-fg));
74
74
  }
75
75
 
76
- .stn-text-field:is(.standard, .stn-text-field--standard) {
76
+ .stn-text-field.standard {
77
77
  border: none;
78
78
  border-bottom: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-border);
79
79
  border-radius: var(--stn-radius-0);
80
80
  background-color: transparent;
81
81
  }
82
82
 
83
- .stn-text-field:is(.standard, .stn-text-field--standard):focus:not([readonly]) {
83
+ .stn-text-field.standard:focus:not([readonly]) {
84
84
  border: none;
85
85
  border-bottom: var(--stn-input-focus);
86
86
  background-color: transparent;
87
87
  color: var(--stn-input-focus-fg, var(--stn-input-fg));
88
88
  }
89
89
 
90
- .stn-text-field:is(.transparent, .stn-text-field--transparent) {
90
+ .stn-text-field.transparent {
91
91
  border: none;
92
92
  background-color: transparent;
93
93
  }
94
94
 
95
- .stn-text-field:is(.transparent, .stn-text-field--transparent):focus:not([readonly]) {
95
+ .stn-text-field.transparent:focus:not([readonly]) {
96
96
  border: none;
97
97
  background-color: transparent;
98
98
  }
99
99
 
100
- .stn-text-field.stn-text-field--with-icon:is(.transparent, .stn-text-field--transparent):focus-within:not(:has(.stn-text-field__control[readonly])) {
100
+ .stn-text-field.with-icon.transparent:focus-within:not(:has(.stn-text-field__control[readonly])) {
101
101
  border: none;
102
102
  background-color: transparent;
103
103
  }
104
104
 
105
- .stn-text-field:is(.transparent, .stn-text-field--transparent)[aria-invalid='true'],
106
- .stn-text-field:is(.transparent, .stn-text-field--transparent).stn-text-field--invalid {
105
+ .stn-text-field.transparent[aria-invalid='true'],
106
+ .stn-text-field.transparent.invalid {
107
107
  border-bottom: var(--stn-size-1, 1px) solid var(--stn-feedback-error);
108
108
  }
109
109
 
110
110
  .stn-text-field[aria-invalid='true'],
111
- .stn-text-field.stn-text-field--invalid {
111
+ .stn-text-field.invalid {
112
112
  border-color: var(--stn-feedback-error);
113
113
  }
114
114
 
115
- .stn-text-field:is(.standard, .stn-text-field--standard)[aria-invalid='true'],
116
- .stn-text-field:is(.standard, .stn-text-field--standard).stn-text-field--invalid {
115
+ .stn-text-field.standard[aria-invalid='true'],
116
+ .stn-text-field.standard.invalid {
117
117
  border-color: transparent;
118
118
  border-bottom-color: var(--stn-feedback-error);
119
119
  }
120
120
 
121
- /* ?붴€?Color (button-like feedback tokens) ?붴€?*/
122
- .stn-text-field:is(.success, .stn-text-field--success) {
121
+ /* Color (button-like feedback tokens) */
122
+ .stn-text-field.success {
123
123
  --stn-text-field-accent: var(--stn-feedback-success);
124
124
  }
125
125
 
126
- .stn-text-field:is(.error, .stn-text-field--error) {
126
+ .stn-text-field.error {
127
127
  --stn-text-field-accent: var(--stn-feedback-error);
128
128
  }
129
129
 
130
- .stn-text-field:is(.warning, .stn-text-field--warning) {
130
+ .stn-text-field.warning {
131
131
  --stn-text-field-accent: var(--stn-feedback-warning);
132
132
  }
133
133
 
134
- .stn-text-field:is(.info, .stn-text-field--info) {
134
+ .stn-text-field.info {
135
135
  --stn-text-field-accent: var(--stn-feedback-info);
136
136
  }
137
137
 
138
- .stn-text-field:is(.success, .error, .warning, .info, .stn-text-field--success, .stn-text-field--error, .stn-text-field--warning, .stn-text-field--info) {
138
+ .stn-text-field:is(.success, .error, .warning, .info) {
139
139
  --stn-input-border: var(--stn-text-field-accent);
140
140
  --stn-input-filled-border: var(--stn-text-field-accent);
141
141
  --stn-input-focus: var(--stn-input-focus-width, var(--stn-size-1)) solid var(--stn-text-field-accent);
142
142
  --stn-input-focus-fg: var(--stn-text-field-accent);
143
143
  }
144
144
 
145
- .stn-text-field:is(.stn-text-field--invalid, [aria-invalid='true']) {
145
+ .stn-text-field:is(.invalid, [aria-invalid='true']) {
146
146
  --stn-input-focus: var(--stn-input-focus-width, var(--stn-size-1)) solid var(--stn-feedback-error);
147
147
  --stn-input-focus-fg: var(--stn-feedback-error);
148
148
  }
@@ -215,43 +215,43 @@
215
215
  --stn-text-field-line-height: var(--stn-line-height-px-30);
216
216
  }
217
217
 
218
- /* —— Icon slots (.stn-text-field--with-icon / __icon-left · __icon-right) —— */
219
- .stn-text-field.stn-text-field--with-icon {
218
+ /* —— Icon slots (.with-icon / __icon-left · __icon-right) —— */
219
+ .stn-text-field.with-icon {
220
220
  display: inline-flex;
221
221
  align-items: center;
222
222
  gap: var(--stn-text-field-icon-gap, var(--stn-space-16));
223
223
  padding-inline: var(--stn-text-field-padding-x, var(--stn-text-field-padding-x-md));
224
224
  }
225
225
 
226
- .stn-text-field.stn-text-field--with-icon:focus-within:not(:has(.stn-text-field__control[readonly])) {
226
+ .stn-text-field.with-icon:focus-within:not(:has(.stn-text-field__control[readonly])) {
227
227
  border: var(--stn-input-focus);
228
228
  background-color: var(--stn-input-focus-bg, var(--stn-input-bg));
229
229
  color: var(--stn-input-focus-fg, var(--stn-input-fg));
230
230
  }
231
231
 
232
- .stn-text-field.stn-text-field--with-icon:is(.filled, .stn-text-field--filled):focus-within:not(:has(.stn-text-field__control[readonly])) {
232
+ .stn-text-field.with-icon.filled:focus-within:not(:has(.stn-text-field__control[readonly])) {
233
233
  border: var(--stn-input-focus);
234
234
  background-color: var(--stn-input-filled-bg, var(--stn-input-bg));
235
235
  }
236
236
 
237
- .stn-text-field.stn-text-field--with-icon:is(.standard, .stn-text-field--standard):focus-within:not(:has(.stn-text-field__control[readonly])) {
237
+ .stn-text-field.with-icon.standard:focus-within:not(:has(.stn-text-field__control[readonly])) {
238
238
  border: none;
239
239
  border-bottom: var(--stn-input-focus);
240
240
  background-color: transparent;
241
241
  }
242
242
 
243
- .stn-text-field.stn-text-field--with-icon:has(.stn-text-field__control[readonly]:focus-visible) {
243
+ .stn-text-field.with-icon:has(.stn-text-field__control[readonly]:focus-visible) {
244
244
  outline: var(--stn-focus-ring-width, var(--stn-size-2)) solid var(--stn-focus-ring);
245
245
  outline-offset: var(--stn-focus-ring-offset, var(--stn-size-2));
246
246
  }
247
247
 
248
- .stn-text-field.stn-text-field--with-icon.stn-text-field--invalid,
249
- .stn-text-field.stn-text-field--with-icon:has([aria-invalid='true']) {
248
+ .stn-text-field.with-icon.invalid,
249
+ .stn-text-field.with-icon:has([aria-invalid='true']) {
250
250
  border-color: var(--stn-feedback-error);
251
251
  }
252
252
 
253
- .stn-text-field.stn-text-field--with-icon:is(.standard, .stn-text-field--standard).stn-text-field--invalid,
254
- .stn-text-field.stn-text-field--with-icon:is(.standard, .stn-text-field--standard):has([aria-invalid='true']) {
253
+ .stn-text-field.with-icon.standard.invalid,
254
+ .stn-text-field.with-icon.standard:has([aria-invalid='true']) {
255
255
  border-color: transparent;
256
256
  border-bottom-color: var(--stn-feedback-error);
257
257
  }
@@ -316,11 +316,6 @@
316
316
  max-width: 100%;
317
317
  }
318
318
 
319
- .stn-text-field-wrap.stn-text-field--full,
320
- .stn-text-field-wrap.w100p {
321
- --stn-text-field-width: 100%;
322
- width: 100%;
323
- }
324
319
 
325
320
  .stn-text-field__helper {
326
321
  box-sizing: border-box;
@@ -7,6 +7,7 @@
7
7
  :root {
8
8
  --stn-container-xs: 444px;
9
9
  --stn-container-gutter-mobile: var(--stn-space-16, 16px);
10
+ --stn-container-gutter-tablet: var(--stn-space-16, 16px);
10
11
  --stn-container-gutter-desktop: var(--stn-space-24, 24px);
11
12
  }
12
13
 
@@ -25,6 +26,14 @@
25
26
  }
26
27
 
27
28
  @media (min-width: 768px) {
29
+ .stn-container--gutters,
30
+ .stn-container:not(.stn-container--disable-gutters) {
31
+ padding-left: var(--stn-container-gutter-tablet);
32
+ padding-right: var(--stn-container-gutter-tablet);
33
+ }
34
+ }
35
+
36
+ @media (min-width: 1024px) {
28
37
  .stn-container--gutters,
29
38
  .stn-container:not(.stn-container--disable-gutters) {
30
39
  padding-left: var(--stn-container-gutter-desktop);
@@ -314,3 +314,108 @@
314
314
  min-height: 0;
315
315
  flex: 1 1 0%;
316
316
  }
317
+
318
+ /* ==========================================================================
319
+ 6. List View Layout (StnContainer + StnStack)
320
+ ========================================================================== */
321
+ .stn-list-page-container,
322
+ .stn-list-view-layout__body {
323
+ flex: 1 1 0%;
324
+ min-height: 0;
325
+ height: 100%;
326
+ padding: var(--stn-space-16);
327
+ box-sizing: border-box;
328
+ overflow: hidden;
329
+ container-type: inline-size;
330
+ container-name: stn-list-container;
331
+ }
332
+
333
+ .stn-list-page-main,
334
+ .stn-list-view__main {
335
+ flex: 1 1 0%;
336
+ min-height: 0;
337
+ height: 100%;
338
+ width: 100%;
339
+ }
340
+
341
+ .stn-list-page-main > .stn-page-scaffold__lnb,
342
+ .stn-list-view__main > .stn-page-scaffold__lnb {
343
+ width: var(--stn-list-lnb-width);
344
+ flex-shrink: 0;
345
+ align-self: stretch;
346
+ height: 100%;
347
+ min-height: 0;
348
+ display: flex;
349
+ flex-direction: column;
350
+ }
351
+
352
+ .stn-list-page-content-stack,
353
+ .stn-list-view__content-stack {
354
+ flex: 1 1 0%;
355
+ min-width: 0;
356
+ min-height: 0;
357
+ height: 100%;
358
+ display: flex;
359
+ flex-direction: column;
360
+ }
361
+
362
+ .stn-list-page-content-stack > .search_area,
363
+ .stn-list-view__content-stack > .search_area {
364
+ flex-shrink: 0;
365
+ width: 100%;
366
+ }
367
+
368
+ .stn-list-page-content-stack > .content_box,
369
+ .stn-list-view__content-stack > .content_box {
370
+ flex: 1 1 0%;
371
+ min-height: 0;
372
+ display: flex;
373
+ flex-direction: column;
374
+ overflow: hidden;
375
+ }
376
+
377
+ /* ─────────────────────────────────────────────────────────────
378
+ * 반응형: 사이드 네비 펼침/접힘 또는 뷰포트 축소로 너비 협소 시 (<= 1024px)
379
+ * Tree(LNB Aside)를 좌측에서 상단(Top) 전체 너비로 전환
380
+ * 부모 컨테이너 선택자로 상세도를 확보하여 !important 없이 깔끔하게 재정의
381
+ * ───────────────────────────────────────────────────────────── */
382
+ @container stn-list-container (max-width: 1024px) {
383
+ .stn-list-page-container .stn-list-page-main,
384
+ .stn-list-view-layout__body .stn-list-view__main {
385
+ flex-direction: column;
386
+ gap: var(--stn-spacing-list-lnb-gap, var(--stn-space-16));
387
+ overflow: hidden;
388
+ }
389
+
390
+ .stn-list-page-container .stn-list-page-main > .stn-page-scaffold__lnb,
391
+ .stn-list-view-layout__body .stn-list-view__main > .stn-page-scaffold__lnb {
392
+ width: 100%;
393
+ max-width: 100%;
394
+ height: auto;
395
+ max-height: var(--stn-layout-list-tree-top-max-height);
396
+ flex-shrink: 0;
397
+ align-self: stretch;
398
+ overflow: hidden;
399
+ }
400
+
401
+ .stn-list-page-container .stn-page-scaffold__lnb .stn-section-side,
402
+ .stn-list-view-layout__body .stn-page-scaffold__lnb .stn-section-side {
403
+ height: auto;
404
+ max-height: var(--stn-layout-list-tree-top-max-height);
405
+ }
406
+
407
+ .stn-list-page-container .stn-page-scaffold__lnb .stn-section-side__body,
408
+ .stn-list-view-layout__body .stn-page-scaffold__lnb .stn-section-side__body {
409
+ flex: 1 1 auto;
410
+ min-height: 0;
411
+ overflow-y: auto;
412
+ }
413
+
414
+ .stn-list-page-container .stn-list-page-content-stack,
415
+ .stn-list-view-layout__body .stn-list-view__content-stack {
416
+ flex: 1 1 0%;
417
+ min-height: 0;
418
+ width: 100%;
419
+ }
420
+ }
421
+
@@ -270,8 +270,23 @@
270
270
  min-width: 0;
271
271
  }
272
272
 
273
+ /* 카드 헤더 라인 (등급 칩 + 타이틀) */
274
+ .stn-alert-card__header-line {
275
+ display: flex;
276
+ align-items: center;
277
+ width: 100%;
278
+ min-width: 0;
279
+ flex-wrap: nowrap;
280
+ }
281
+
282
+ .stn-alert-card__header-line > :first-child {
283
+ flex-shrink: 0;
284
+ }
285
+
273
286
  /* 장애 카드 타이틀 */
274
287
  .stn-alert-card__title {
288
+ flex: 1;
289
+ min-width: 0;
275
290
  font-size: var(--stn-font-size-15);
276
291
  font-weight: var(--stn-font-weight-bold);
277
292
  color: var(--stn-text-primary);
@@ -286,17 +301,27 @@
286
301
  }
287
302
 
288
303
  /* 작업 탭 — primary 색상 */
289
- .stn-alert-card__type-label--work {
290
- color: var(--stn-text-primary);
304
+ .stn-alert-card__type-label.work {
305
+ color: var(--stn-primary);
291
306
  }
292
307
 
293
308
  /* 공사 탭 — secondary(보라) 색상 */
294
- .stn-alert-card__type-label--deploy {
295
- color: var(--stn-text-primary);
309
+ .stn-alert-card__type-label.deploy {
310
+ color: var(--stn-secondary);
311
+ }
312
+
313
+ /* 카드 설명 라인 (설명 + 시간 칩) */
314
+ .stn-alert-card__desc-line {
315
+ display: flex;
316
+ align-items: center;
317
+ width: 100%;
318
+ min-width: 0;
296
319
  }
297
320
 
298
321
  /* 설명 텍스트 */
299
322
  .stn-alert-card__desc {
323
+ flex: 1;
324
+ min-width: 0;
300
325
  font-size: var(--stn-font-size-13);
301
326
  color: var(--stn-text-secondary);
302
327
  line-height: var(--stn-line-height-reading);
@@ -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,61 @@
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
+ .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar,
57
+ .stn-section-side > .stn-scroll::-webkit-scrollbar {
58
+ width: var(--stn-scroll-width-thin, 4px);
59
+ height: var(--stn-scroll-width-thin, 4px);
60
+ background: var(--stn-scroll-track);
61
+ }
62
+
63
+ .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-track,
64
+ .stn-section-side > .stn-scroll::-webkit-scrollbar-track {
65
+ background: var(--stn-scroll-track);
66
+ }
67
+
68
+ .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-thumb,
69
+ .stn-section-side > .stn-scroll::-webkit-scrollbar-thumb {
70
+ background: var(--stn-scroll-thumb);
71
+ border-radius: var(--stn-scroll-radius-thin, 2px);
72
+ }
73
+
74
+ .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-thumb:hover,
75
+ .stn-section-side > .stn-scroll::-webkit-scrollbar-thumb:hover {
76
+ background: var(--stn-scroll-thumb-hover);
77
+ }
78
+
79
+ /* OS 기본 화살표 버튼(arrow) 완전 숨김 */
80
+ .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-button,
81
+ .stn-section-side > .stn-scroll::-webkit-scrollbar-button {
82
+ display: none !important;
83
+ width: 0 !important;
84
+ height: 0 !important;
85
+ }
86
+
87
+
88
+ /* 상단 고정 헤더 (제목, 탭, 검색바 등) */
89
+ .stn-section-side__header {
90
+ flex-shrink: 0;
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: var(--stn-space-8, 8px);
94
+ margin-bottom: var(--stn-space-8, 8px);
95
+ }
96
+
97
+ /* 하단 고정 푸터 (옵션 스위치, 액션 등) */
98
+ .stn-section-side__footer {
99
+ flex-shrink: 0;
100
+ display: flex;
101
+ align-items: center;
102
+ justify-content: space-between;
103
+ margin-top: var(--stn-space-8, 8px);
104
+ padding-top: var(--stn-space-8, 8px);
105
+ border-top: 1px solid var(--stn-border-subtle, rgba(255, 255, 255, 0.08));
42
106
  }