@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
@@ -11,11 +11,44 @@
11
11
  height: 100%;
12
12
  background: transparent;
13
13
  box-shadow: none;
14
+ container-type: inline-size;
15
+ container-name: stn-table-container;
14
16
  }
15
17
 
16
18
  .stn-table__scroll {
17
19
  overflow-x: auto;
18
20
  position: relative;
21
+ /* STN 표준 슬림 스크롤 (thin 4px) 규격 연동 */
22
+ --stn-scroll-width: var(--stn-scroll-width-thin);
23
+ --stn-scroll-radius: var(--stn-scroll-radius-thin);
24
+ scrollbar-width: thin;
25
+ scrollbar-color: var(--stn-scroll-thumb) var(--stn-scroll-track);
26
+ }
27
+
28
+ .stn-table__scroll::-webkit-scrollbar {
29
+ width: var(--stn-scroll-width-thin);
30
+ height: var(--stn-scroll-width-thin);
31
+ background: var(--stn-scroll-track);
32
+ }
33
+
34
+ .stn-table__scroll::-webkit-scrollbar-track {
35
+ background: var(--stn-scroll-track);
36
+ border-radius: var(--stn-radius-circle);
37
+ }
38
+
39
+ .stn-table__scroll::-webkit-scrollbar-thumb {
40
+ background: var(--stn-scroll-thumb);
41
+ border-radius: var(--stn-scroll-radius-thin);
42
+ }
43
+
44
+ .stn-table__scroll::-webkit-scrollbar-thumb:hover {
45
+ background: var(--stn-scroll-thumb-hover);
46
+ }
47
+
48
+ .stn-table__scroll::-webkit-scrollbar-button {
49
+ display: none;
50
+ width: 0;
51
+ height: 0;
19
52
  }
20
53
 
21
54
  /* List view — StnTable `fill` · content_box 남은 높이에 스크롤 영역 채움 */
@@ -114,10 +147,66 @@ td.stn-table__col-check .stn-checkbox {
114
147
  align-items: center;
115
148
  justify-content: flex-end;
116
149
  flex-wrap: wrap;
117
- gap: var(--stn-spacing-table-footer-actions-gap);
118
- text-align: right;
119
150
  }
120
151
 
152
+ /* ─────────────────────────────────────────────────────────────
153
+ * 푸터 반응형 2줄 전환: <= 768px (Foundation sm breakpoint)
154
+ * 1행: [좌측 요약/페이지크기] + [우측 액션 버튼들]
155
+ * 2행: [중앙 페이지네이션 100% 가운데 정렬]
156
+ * ───────────────────────────────────────────────────────────── */
157
+ @container stn-table-container (max-width: 768px) {
158
+ .stn-table__footer {
159
+ display: flex;
160
+ flex-wrap: wrap;
161
+ align-items: center;
162
+ justify-content: space-between;
163
+ row-gap: var(--stn-spacing-table-footer-gap, var(--stn-space-12));
164
+ column-gap: var(--stn-spacing-table-footer-actions-gap, var(--stn-space-8));
165
+ }
166
+ .stn-table__footer-leading {
167
+ order: 1;
168
+ flex: 0 1 auto;
169
+ }
170
+ .stn-table__footer-right {
171
+ order: 2;
172
+ flex: 0 1 auto;
173
+ margin-left: auto;
174
+ }
175
+ .stn-table__footer-center {
176
+ order: 3;
177
+ width: 100%;
178
+ flex: 1 0 100%;
179
+ justify-content: center;
180
+ }
181
+ }
182
+
183
+ @media (max-width: 768px) {
184
+ .stn-table__footer {
185
+ display: flex;
186
+ flex-wrap: wrap;
187
+ align-items: center;
188
+ justify-content: space-between;
189
+ row-gap: var(--stn-spacing-table-footer-gap, var(--stn-space-12));
190
+ column-gap: var(--stn-spacing-table-footer-actions-gap, var(--stn-space-8));
191
+ }
192
+ .stn-table__footer-leading {
193
+ order: 1;
194
+ flex: 0 1 auto;
195
+ }
196
+ .stn-table__footer-right {
197
+ order: 2;
198
+ flex: 0 1 auto;
199
+ margin-left: auto;
200
+ }
201
+ .stn-table__footer-center {
202
+ order: 3;
203
+ width: 100%;
204
+ flex: 1 0 100%;
205
+ justify-content: center;
206
+ }
207
+ }
208
+
209
+
121
210
  /* rowspan · colspan · expand-row (중첩 Path 테이블) */
122
211
  .stn-table__grid th[rowspan],
123
212
  .stn-table__grid td[rowspan],
@@ -219,18 +308,17 @@ td.stn-table__col-check .stn-checkbox {
219
308
  position: sticky;
220
309
  top: 0;
221
310
  z-index: 10;
222
- background: transparent !important;
223
311
  }
224
312
 
225
313
  .stn-table thead th,
226
314
  .stn-table__thead th {
227
315
  position: relative;
228
316
  box-sizing: border-box;
229
- height: 36px;
230
- min-height: 36px;
231
- padding: 4px 8px;
232
- background: var(--stn-table-th-bg) !important;
233
- color: var(--stn-table-th-fg) !important;
317
+ height: var(--stn-table-th-height);
318
+ min-height: var(--stn-table-th-height);
319
+ padding: var(--stn-table-th-padding);
320
+ background: var(--stn-table-th-bg);
321
+ color: var(--stn-table-th-fg);
234
322
  font-family: var(--stn-font-body);
235
323
  font-size: var(--stn-text-body-small-size);
236
324
  font-weight: var(--stn-font-weight-regular);
@@ -240,12 +328,17 @@ td.stn-table__col-check .stn-checkbox {
240
328
  border: none;
241
329
  }
242
330
 
331
+ .stn-table thead th[rowspan],
332
+ .stn-table__thead th[rowspan] {
333
+ height: auto;
334
+ }
335
+
243
336
  .stn-table thead tr th:not(:last-of-type)::after,
244
337
  .stn-table__thead th:not(:last-of-type)::after {
245
338
  content: '';
246
339
  position: absolute;
247
- top: 8px;
248
- bottom: 8px;
340
+ top: var(--stn-table-th-divider-inset);
341
+ bottom: var(--stn-table-th-divider-inset);
249
342
  right: 0;
250
343
  border-right: 1px solid var(--stn-table-th-border);
251
344
  }
@@ -271,10 +364,10 @@ td.stn-table__col-check .stn-checkbox {
271
364
  .stn-table tbody td,
272
365
  .stn-table__tbody td {
273
366
  box-sizing: border-box;
274
- height: 36px;
275
- min-height: 36px;
367
+ height: var(--stn-table-row-height);
368
+ min-height: var(--stn-table-row-height);
276
369
  min-width: 0;
277
- padding: 4px 8px;
370
+ padding: var(--stn-table-cell-padding);
278
371
  border-bottom: 1px solid var(--stn-table-border);
279
372
  background: transparent;
280
373
  color: var(--stn-table-td-fg);
@@ -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;
@@ -331,18 +331,23 @@
331
331
  color: var(--stn-text-primary);
332
332
  }
333
333
 
334
+ .stn-widget .stn-widget__body {
335
+ scrollbar-width: thin;
336
+ scrollbar-color: var(--stn-scroll-thumb) transparent;
337
+ }
334
338
  .stn-widget .stn-widget__body::-webkit-scrollbar {
335
- width: var(--stn-widget-scrollbar-width, var(--stn-size-4, 4px));
339
+ width: var(--stn-scroll-width-thin);
340
+ height: var(--stn-scroll-width-thin);
336
341
  }
337
342
  .stn-widget .stn-widget__body::-webkit-scrollbar-track {
338
343
  background: transparent;
339
344
  }
340
345
  .stn-widget .stn-widget__body::-webkit-scrollbar-thumb {
341
- background: var(--stn-widget-scrollbar);
342
- border-radius: var(--stn-widget-scrollbar-radius, var(--stn-radius-4, 4px));
346
+ background: var(--stn-scroll-thumb);
347
+ border-radius: var(--stn-scroll-radius-thin);
343
348
  }
344
349
  .stn-widget .stn-widget__body::-webkit-scrollbar-thumb:hover {
345
- background: var(--stn-widget-scrollbar-hover);
350
+ background: var(--stn-scroll-thumb-hover);
346
351
  }
347
352
 
348
353
  /* dashboard_right widget panel */
@@ -359,6 +364,8 @@
359
364
  overflow-x: hidden;
360
365
  box-sizing: border-box;
361
366
  padding-right: var(--stn-widget-panel-padding-end, var(--stn-space-2, 2px));
367
+ scrollbar-width: thin;
368
+ scrollbar-color: var(--stn-scroll-thumb) transparent;
362
369
  }
363
370
 
364
371
  .dashboard_right > .stn-stack {
@@ -373,17 +380,18 @@
373
380
  }
374
381
 
375
382
  .dashboard_right::-webkit-scrollbar {
376
- width: var(--stn-widget-panel-scrollbar-width, var(--stn-size-6, 6px));
383
+ width: var(--stn-scroll-width-thin);
384
+ height: var(--stn-scroll-width-thin);
377
385
  }
378
386
  .dashboard_right::-webkit-scrollbar-track {
379
387
  background: transparent;
380
388
  }
381
389
  .dashboard_right::-webkit-scrollbar-thumb {
382
- background: var(--stn-widget-panel-scrollbar);
383
- border-radius: var(--stn-widget-scrollbar-radius, var(--stn-radius-4, 4px));
390
+ background: var(--stn-scroll-thumb);
391
+ border-radius: var(--stn-scroll-radius-thin);
384
392
  }
385
393
  .dashboard_right::-webkit-scrollbar-thumb:hover {
386
- background: var(--stn-widget-panel-scrollbar-hover);
394
+ background: var(--stn-scroll-thumb-hover);
387
395
  }
388
396
 
389
397
  /* Interactive Hover State */
@@ -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
 
@@ -18,23 +19,26 @@
18
19
  display: block;
19
20
  }
20
21
 
21
- .stn-container--gutters,
22
- .stn-container:not(.stn-container--disable-gutters) {
22
+ .stn-container,
23
+ .stn-container--gutters {
23
24
  padding-left: var(--stn-container-gutter-mobile);
24
25
  padding-right: var(--stn-container-gutter-mobile);
25
26
  }
26
27
 
27
28
  @media (min-width: 768px) {
28
- .stn-container--gutters,
29
- .stn-container:not(.stn-container--disable-gutters) {
30
- padding-left: var(--stn-container-gutter-desktop);
31
- padding-right: var(--stn-container-gutter-desktop);
29
+ .stn-container,
30
+ .stn-container--gutters {
31
+ padding-left: var(--stn-container-gutter-tablet);
32
+ padding-right: var(--stn-container-gutter-tablet);
32
33
  }
33
34
  }
34
35
 
35
- .stn-container--disable-gutters {
36
- padding-left: var(--stn-space-0, 0px) !important;
37
- padding-right: var(--stn-space-0, 0px) !important;
36
+ @media (min-width: 1024px) {
37
+ .stn-container,
38
+ .stn-container--gutters {
39
+ padding-left: var(--stn-container-gutter-desktop);
40
+ padding-right: var(--stn-container-gutter-desktop);
41
+ }
38
42
  }
39
43
 
40
44
  /* Fluid max-width. width 100%라서 캡에 닿기 전까지 화면과 같이 늘어난다.
@@ -177,6 +177,8 @@
177
177
  display: flex;
178
178
  flex-direction: column;
179
179
  box-sizing: border-box;
180
+ padding: var(--stn-space-16);
181
+ overflow: hidden;
180
182
  }
181
183
 
182
184
  .stn-layer-1__body > .stn-container.is-scrollable {
@@ -194,6 +196,13 @@
194
196
  height: 100%;
195
197
  }
196
198
 
199
+ /* 스크롤 가능한 컨테이너 내부의 Grid/Stack은 고정 100%에 갇히지 않고 내용물 전체를 감싸도록 확장 */
200
+ .stn-layer-1__body .stn-container.is-scrollable > .stn-grid,
201
+ .stn-layer-1__body .stn-container.is-scrollable > .stn-stack {
202
+ height: auto;
203
+ flex: 0 0 auto;
204
+ }
205
+
197
206
  /* 스크롤+패딩 영역. `.stn-dashboard-scroll-wrap` 은 하위 호환 alias */
198
207
  .stn-scroll-region,
199
208
  .stn-dashboard-scroll-wrap {
@@ -202,7 +211,6 @@
202
211
  overflow-y: auto;
203
212
  overflow-x: hidden;
204
213
  box-sizing: border-box;
205
- padding: var(--stn-spacing-stack-12, var(--stn-space-12, 12px));
206
214
  }
207
215
 
208
216
  .stn-scroll-region > .stn-grid,
@@ -314,3 +322,77 @@
314
322
  min-height: 0;
315
323
  flex: 1 1 0%;
316
324
  }
325
+
326
+ /* ==========================================================================
327
+ 6. List view — 모바일/태블릿 반응형 (스크롤 & LNB/테이블 높이)
328
+ ========================================================================== */
329
+ @media (max-width: 1279px) {
330
+ /* 태블릿/모바일(column)에서는 본문 컨테이너가 스크롤되어 LNB -> 검색바 -> 테이블 순으로 전체 탐색 가능 */
331
+ .stn-layer-1__body > .stn-container {
332
+ overflow-y: auto !important;
333
+ overflow-x: hidden;
334
+ }
335
+
336
+ .stn-layer-1__body .stn-container > .stn-stack {
337
+ height: auto !important;
338
+ min-height: 100%;
339
+ }
340
+
341
+ .stn-list-lnb {
342
+ width: 100% !important;
343
+ max-height: 40vh;
344
+ flex-shrink: 0;
345
+ }
346
+
347
+ /* 모바일 접힘 시 아코디언 헤더만 표시 */
348
+ .stn-list-lnb.is-collapsed {
349
+ max-height: none;
350
+ width: 100% !important;
351
+ }
352
+
353
+ .stn-list-lnb.is-collapsed .stn-section-side.is-collapsed {
354
+ width: 100% !important;
355
+ min-width: 0 !important;
356
+ padding: var(--stn-space-8) var(--stn-space-12);
357
+ }
358
+
359
+ .stn-list-lnb.is-collapsed .stn-section-side.is-collapsed .stn-scroll {
360
+ display: none !important;
361
+ }
362
+
363
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-title {
364
+ display: flex !important;
365
+ }
366
+
367
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-row {
368
+ justify-content: space-between !important;
369
+ }
370
+
371
+ /* 테이블 영역 모바일 최소 높이 보장 */
372
+ .stn-layer-1__body .stn-container > .stn-stack > .stn-stack {
373
+ height: auto !important;
374
+ min-height: var(--stn-layout-list-mobile-table-min-height);
375
+ }
376
+ }
377
+
378
+ /* 데스크톱(lg ≥ 1280px): 기본 264px 고정, 접힘 시 56px 레일 */
379
+ @media (min-width: 1280px) {
380
+ .stn-list-lnb {
381
+ width: var(--stn-list-lnb-width);
382
+ height: 100%;
383
+ flex-shrink: 0;
384
+ transition: width 0.2s ease;
385
+ }
386
+
387
+ .stn-list-lnb.is-collapsed {
388
+ width: var(--stn-list-lnb-collapsed-width);
389
+ }
390
+
391
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-title {
392
+ display: none !important;
393
+ }
394
+
395
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-row {
396
+ justify-content: center !important;
397
+ }
398
+ }
@@ -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);