@stn-uiux/pub-ui 0.1.63 → 0.1.65

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 (44) hide show
  1. package/dist/{chunk-Q4QXONXL.js → chunk-4QTBT6OB.js} +2 -33
  2. package/dist/chunk-4QTBT6OB.js.map +1 -0
  3. package/dist/chunk-AVICAV6Z.js +1 -0
  4. package/dist/{chunk-XQ7UUG7Y.js → chunk-BTVWG4GB.js} +2 -2
  5. package/dist/{chunk-3RYAWLME.js → chunk-ESH5VDHX.js} +2 -2
  6. package/dist/{chunk-NHYZ7AWK.js → chunk-JHXSF7FS.js} +2 -2
  7. package/dist/{chunk-NHYZ7AWK.js.map → chunk-JHXSF7FS.js.map} +1 -1
  8. package/dist/{chunk-YMWHZNBT.js → chunk-N4GLOJTF.js} +2 -2
  9. package/dist/chunk-VNQUWGQ7.js +81 -0
  10. package/dist/chunk-VNQUWGQ7.js.map +1 -0
  11. package/dist/cli.js +3 -3
  12. package/dist/data/index.d.ts +1 -0
  13. package/dist/data/index.js +18 -6
  14. package/dist/data/stnBreadcrumb.js +3 -3
  15. package/dist/data/stnHeader.js +3 -3
  16. package/dist/data/stnSideNavItem.js +3 -3
  17. package/dist/data/stnSystemIcons.js +2 -2
  18. package/dist/data/stnSystemIconsData.generated.js +1 -1
  19. package/dist/data/stnTextArea.d.ts +46 -0
  20. package/dist/data/stnTextArea.js +15 -0
  21. package/dist/data/stnTextArea.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +18 -6
  24. package/package.json +1 -1
  25. package/styles/@assets/svg/system/fill/alert1.svg +2 -2
  26. package/styles/components/stn-chip.css +6 -0
  27. package/styles/components/stn-dropdown.css +42 -97
  28. package/styles/components/stn-label-prefix.css +2 -9
  29. package/styles/components/stn-scroll.css +18 -9
  30. package/styles/components/stn-status.css +13 -11
  31. package/styles/components/stn-table.css +0 -29
  32. package/styles/components/stn-text-area.css +375 -0
  33. package/styles/components/stn-tooltip.css +11 -26
  34. package/styles/layouts/stn-layer1-content.css +25 -0
  35. package/styles/patterns/stn-alert-center.css +16 -9
  36. package/styles/patterns/stn-section-side.css +0 -7
  37. package/styles/style-pub.css +1 -0
  38. package/styles/tokens/stn-colors-semantic.css +53 -3
  39. package/dist/chunk-A5KLX6NX.js +0 -1
  40. package/dist/chunk-Q4QXONXL.js.map +0 -1
  41. /package/dist/{chunk-A5KLX6NX.js.map → chunk-AVICAV6Z.js.map} +0 -0
  42. /package/dist/{chunk-XQ7UUG7Y.js.map → chunk-BTVWG4GB.js.map} +0 -0
  43. /package/dist/{chunk-3RYAWLME.js.map → chunk-ESH5VDHX.js.map} +0 -0
  44. /package/dist/{chunk-YMWHZNBT.js.map → chunk-N4GLOJTF.js.map} +0 -0
@@ -0,0 +1,375 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * STN Pub TextArea (Figma Infomap multi-line input)
4
+ *
5
+ * StnTextField의 디자인 토큰과 스타일을 100% 계승하여 완벽한 시각적 일관성을 제공합니다.
6
+ *
7
+ * Variant: `.outlined` · `.filled` · `.standard` · `.transparent`
8
+ * Size: `.xs` · `.sm` · `.md` · `.lg` · `.xl`
9
+ * Width: `.w80` · `.w100` · `.w120` · `.w140` · `.w160` · `.w180` · `.w200` · `.full`
10
+ * Color: `.success` · `.error` · `.warning` · `.info`
11
+ * Resize: `.resize-none` · `.resize-vertical` · `.resize-horizontal` · `.resize-both`
12
+ * Wrap & Footer: `.stn-text-area-wrap` · `.stn-text-area__label` · `.stn-text-area__footer` · `.stn-text-area__helper` · `.stn-text-area__count`
13
+ */
14
+
15
+ .stn-text-area {
16
+ box-sizing: border-box;
17
+ display: inline-block;
18
+ margin: 0;
19
+ width: var(--stn-text-area-width, 100%);
20
+ min-width: var(--stn-text-area-min-width, 0);
21
+ max-width: 100%;
22
+ min-height: var(--stn-text-area-min-height, 80px);
23
+ padding: var(--stn-text-area-padding-y, var(--stn-space-8)) var(--stn-text-area-padding-x, var(--stn-space-10));
24
+ border: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-border);
25
+ border-radius: var(--stn-text-area-radius, var(--stn-radius-input-md));
26
+ background-color: var(--stn-input-bg);
27
+ color: var(--stn-input-fg);
28
+ font-family: var(--stn-font-body, inherit);
29
+ font-size: var(--stn-text-area-font-size, var(--stn-text-body-small-size));
30
+ font-weight: var(--stn-font-weight-medium);
31
+ line-height: var(--stn-text-area-line-height, var(--stn-line-height-px-22));
32
+ outline: none;
33
+ resize: vertical;
34
+ appearance: none;
35
+ -webkit-appearance: none;
36
+ transition: border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
37
+ }
38
+
39
+ .stn-text-area::placeholder {
40
+ color: var(--stn-input-placeholder);
41
+ font-weight: var(--stn-font-weight-medium);
42
+ }
43
+
44
+ .stn-text-area:focus:not([readonly]) {
45
+ border: var(--stn-input-focus);
46
+ background-color: var(--stn-input-focus-bg, var(--stn-input-bg));
47
+ color: var(--stn-input-focus-fg, var(--stn-input-fg));
48
+ }
49
+
50
+ .stn-text-area[readonly] {
51
+ cursor: default;
52
+ }
53
+
54
+ .stn-text-area[readonly]:focus-visible {
55
+ outline: var(--stn-focus-ring-width, var(--stn-size-2)) solid var(--stn-focus-ring);
56
+ outline-offset: var(--stn-focus-ring-offset, var(--stn-size-2));
57
+ }
58
+
59
+ .stn-text-area:disabled {
60
+ cursor: not-allowed;
61
+ opacity: var(--stn-input-disabled-opacity);
62
+ }
63
+
64
+ /* ── 1. Variants ── */
65
+ .stn-text-area.outlined {
66
+ border: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-border);
67
+ background-color: var(--stn-input-bg);
68
+ }
69
+
70
+ .stn-text-area.filled {
71
+ border: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-filled-border, transparent);
72
+ background-color: var(--stn-input-filled-bg, var(--stn-input-bg));
73
+ }
74
+
75
+ .stn-text-area.filled:focus:not([readonly]) {
76
+ border: var(--stn-input-focus);
77
+ background-color: var(--stn-input-filled-bg, var(--stn-input-bg));
78
+ color: var(--stn-input-focus-fg, var(--stn-input-fg));
79
+ }
80
+
81
+ .stn-text-area.standard {
82
+ border: none;
83
+ border-bottom: var(--stn-input-border-width, var(--stn-size-1)) solid var(--stn-input-border);
84
+ border-radius: var(--stn-radius-0);
85
+ background-color: transparent;
86
+ padding-inline: 0;
87
+ }
88
+
89
+ .stn-text-area.standard:focus:not([readonly]) {
90
+ border: none;
91
+ border-bottom: var(--stn-input-focus);
92
+ background-color: transparent;
93
+ color: var(--stn-input-focus-fg, var(--stn-input-fg));
94
+ }
95
+
96
+ .stn-text-area.transparent {
97
+ border: none;
98
+ background-color: transparent;
99
+ padding: 0;
100
+ }
101
+
102
+ .stn-text-area.transparent:focus:not([readonly]) {
103
+ border: none;
104
+ background-color: transparent;
105
+ }
106
+
107
+ /* ── 2. Invalid State ── */
108
+ .stn-text-area[aria-invalid='true'],
109
+ .stn-text-area.invalid {
110
+ border-color: var(--stn-feedback-error);
111
+ }
112
+
113
+ .stn-text-area.standard[aria-invalid='true'],
114
+ .stn-text-area.standard.invalid {
115
+ border-color: transparent;
116
+ border-bottom-color: var(--stn-feedback-error);
117
+ }
118
+
119
+ .stn-text-area.transparent[aria-invalid='true'],
120
+ .stn-text-area.transparent.invalid {
121
+ border-bottom: var(--stn-size-1, 1px) solid var(--stn-feedback-error);
122
+ }
123
+
124
+ .stn-text-area:is(.invalid, [aria-invalid='true']) {
125
+ --stn-input-focus: var(--stn-input-focus-width, var(--stn-size-1)) solid var(--stn-feedback-error);
126
+ --stn-input-focus-fg: var(--stn-feedback-error);
127
+ }
128
+
129
+ /* ── 3. Color Tokens ── */
130
+ .stn-text-area.success {
131
+ --stn-text-area-accent: var(--stn-feedback-success);
132
+ }
133
+
134
+ .stn-text-area.error {
135
+ --stn-text-area-accent: var(--stn-feedback-error);
136
+ }
137
+
138
+ .stn-text-area.warning {
139
+ --stn-text-area-accent: var(--stn-feedback-warning);
140
+ }
141
+
142
+ .stn-text-area.info {
143
+ --stn-text-area-accent: var(--stn-feedback-info);
144
+ }
145
+
146
+ .stn-text-area:is(.success, .error, .warning, .info) {
147
+ --stn-input-border: var(--stn-text-area-accent);
148
+ --stn-input-filled-border: var(--stn-text-area-accent);
149
+ --stn-input-focus: var(--stn-input-focus-width, var(--stn-size-1)) solid var(--stn-text-area-accent);
150
+ --stn-input-focus-fg: var(--stn-text-area-accent);
151
+ }
152
+
153
+ /* ── 4. Width Presets (GEMINI.md Rule 3) ── */
154
+ :is(.stn-text-area, .stn-text-area-wrap).w80 {
155
+ --stn-text-area-width: var(--stn-size-80, 80px);
156
+ width: var(--stn-size-80, 80px);
157
+ }
158
+
159
+ :is(.stn-text-area, .stn-text-area-wrap).w100 {
160
+ --stn-text-area-width: var(--stn-size-100, 100px);
161
+ width: var(--stn-size-100, 100px);
162
+ }
163
+
164
+ :is(.stn-text-area, .stn-text-area-wrap).w120 {
165
+ --stn-text-area-width: var(--stn-size-120, 120px);
166
+ width: var(--stn-size-120, 120px);
167
+ }
168
+
169
+ :is(.stn-text-area, .stn-text-area-wrap).w140 {
170
+ --stn-text-area-width: var(--stn-size-140, 140px);
171
+ width: var(--stn-size-140, 140px);
172
+ }
173
+
174
+ :is(.stn-text-area, .stn-text-area-wrap).w160 {
175
+ --stn-text-area-width: var(--stn-size-160, 160px);
176
+ width: var(--stn-size-160, 160px);
177
+ }
178
+
179
+ :is(.stn-text-area, .stn-text-area-wrap).w180 {
180
+ --stn-text-area-width: var(--stn-size-180, 180px);
181
+ width: var(--stn-size-180, 180px);
182
+ }
183
+
184
+ :is(.stn-text-area, .stn-text-area-wrap).w200 {
185
+ --stn-text-area-width: var(--stn-size-200, 200px);
186
+ width: var(--stn-size-200, 200px);
187
+ }
188
+
189
+ :is(.stn-text-area, .stn-text-area-wrap).full {
190
+ --stn-text-area-width: 100%;
191
+ width: 100%;
192
+ }
193
+
194
+ /* ── 5. Size Presets (GEMINI.md Rule 1) ── */
195
+ .stn-text-area.xs {
196
+ --stn-text-area-min-height: 56px;
197
+ --stn-text-area-padding-y: var(--stn-space-4);
198
+ --stn-text-area-padding-x: var(--stn-space-8);
199
+ --stn-text-area-radius: var(--stn-radius-input-sm, var(--stn-radius-4));
200
+ --stn-text-area-font-size: var(--stn-text-caption-medium-size);
201
+ --stn-text-area-line-height: var(--stn-line-height-px-18);
202
+ }
203
+
204
+ .stn-text-area.sm {
205
+ --stn-text-area-min-height: 64px;
206
+ --stn-text-area-padding-y: var(--stn-space-6);
207
+ --stn-text-area-padding-x: var(--stn-text-field-padding-x-sm, var(--stn-space-10));
208
+ --stn-text-area-radius: var(--stn-radius-input-sm, var(--stn-radius-4));
209
+ --stn-text-area-font-size: var(--stn-text-body-small-size);
210
+ --stn-text-area-line-height: var(--stn-line-height-px-20);
211
+ }
212
+
213
+ .stn-text-area.md {
214
+ --stn-text-area-min-height: 80px;
215
+ --stn-text-area-padding-y: var(--stn-space-8);
216
+ --stn-text-area-padding-x: var(--stn-text-field-padding-x-md, var(--stn-space-10));
217
+ --stn-text-area-radius: var(--stn-radius-input-md, var(--stn-radius-4));
218
+ --stn-text-area-font-size: var(--stn-text-body-small-size);
219
+ --stn-text-area-line-height: var(--stn-line-height-px-22);
220
+ }
221
+
222
+ .stn-text-area.lg {
223
+ --stn-text-area-min-height: 100px;
224
+ --stn-text-area-padding-y: var(--stn-space-10);
225
+ --stn-text-area-padding-x: var(--stn-text-field-padding-x-lg, var(--stn-space-12));
226
+ --stn-text-area-radius: var(--stn-radius-input-lg, var(--stn-radius-6));
227
+ --stn-text-area-font-size: var(--stn-text-body-medium-size);
228
+ --stn-text-area-line-height: var(--stn-line-height-px-24);
229
+ }
230
+
231
+ .stn-text-area.xl {
232
+ --stn-text-area-min-height: 120px;
233
+ --stn-text-area-padding-y: var(--stn-space-12);
234
+ --stn-text-area-padding-x: var(--stn-text-field-padding-x-xl, var(--stn-space-16));
235
+ --stn-text-area-radius: var(--stn-radius-input-xl, var(--stn-radius-16));
236
+ --stn-text-area-font-size: var(--stn-text-body-small-size);
237
+ --stn-text-area-line-height: var(--stn-line-height-px-24);
238
+ }
239
+
240
+ /* ── 6. Resize Options ── */
241
+ .stn-text-area.resize-none {
242
+ resize: none;
243
+ }
244
+
245
+ .stn-text-area.resize-vertical {
246
+ resize: vertical;
247
+ }
248
+
249
+ .stn-text-area.resize-horizontal {
250
+ resize: horizontal;
251
+ }
252
+
253
+ .stn-text-area.resize-both {
254
+ resize: both;
255
+ }
256
+
257
+ /* ── 7. Wrap & Label & Footer Layout ── */
258
+ .stn-text-area-wrap {
259
+ box-sizing: border-box;
260
+ display: inline-flex;
261
+ flex-direction: column;
262
+ align-items: stretch;
263
+ flex-shrink: 0;
264
+ width: var(--stn-text-area-width, 100%);
265
+ min-width: var(--stn-text-area-min-width, 0);
266
+ max-width: 100%;
267
+ vertical-align: top;
268
+ }
269
+
270
+ .stn-text-area-wrap .stn-text-area {
271
+ width: 100%;
272
+ min-width: 0;
273
+ max-width: 100%;
274
+ }
275
+
276
+ .stn-text-area__label {
277
+ box-sizing: border-box;
278
+ display: inline-flex;
279
+ align-items: center;
280
+ gap: var(--stn-space-4);
281
+ font-family: var(--stn-font-body, inherit);
282
+ font-size: var(--stn-text-body-small-size);
283
+ font-weight: var(--stn-font-weight-medium);
284
+ color: var(--stn-text-primary);
285
+ line-height: var(--stn-line-height-default);
286
+ white-space: nowrap;
287
+ user-select: none;
288
+ cursor: pointer;
289
+ flex-shrink: 0;
290
+ }
291
+
292
+ .stn-text-area__label-icon {
293
+ display: inline-flex;
294
+ align-items: center;
295
+ justify-content: center;
296
+ color: var(--stn-text-secondary);
297
+ }
298
+
299
+ .stn-text-area__required {
300
+ color: var(--stn-feedback-error);
301
+ font-weight: var(--stn-font-weight-bold);
302
+ line-height: var(--stn-line-height-tight);
303
+ }
304
+
305
+ /* Top Label (기본 Column 배치) */
306
+ .stn-text-area-wrap--col {
307
+ flex-direction: column;
308
+ gap: var(--stn-space-6);
309
+ }
310
+
311
+ .stn-text-area-wrap--col .stn-text-area-wrap__body {
312
+ display: inline-flex;
313
+ flex-direction: column;
314
+ width: 100%;
315
+ }
316
+
317
+ /* Left / Right Label (Row 배치: 여러 줄 입력이므로 align-items: flex-start) */
318
+ .stn-text-area-wrap--row {
319
+ flex-direction: row;
320
+ align-items: flex-start;
321
+ gap: var(--stn-space-12);
322
+ }
323
+
324
+ .stn-text-area-wrap--row .stn-text-area__label {
325
+ padding-top: var(--stn-space-8);
326
+ }
327
+
328
+ .stn-text-area-wrap--row .stn-text-area-wrap__body {
329
+ display: inline-flex;
330
+ flex-direction: column;
331
+ flex: 1 1 auto;
332
+ min-width: 0;
333
+ }
334
+
335
+ /* Footer: Helper Text (좌측) + Character Counter (우측) */
336
+ .stn-text-area__footer {
337
+ box-sizing: border-box;
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: space-between;
341
+ gap: var(--stn-space-8);
342
+ margin: var(--stn-space-4) 0 0;
343
+ padding: 0;
344
+ width: 100%;
345
+ }
346
+
347
+ .stn-text-area__helper {
348
+ box-sizing: border-box;
349
+ margin: 0;
350
+ padding: 0;
351
+ font-family: var(--stn-font-body, inherit);
352
+ font-size: var(--stn-text-caption-medium-size);
353
+ font-weight: var(--stn-font-weight-regular);
354
+ line-height: var(--stn-text-caption-medium-line-height);
355
+ color: var(--stn-text-secondary);
356
+ text-align: left;
357
+ word-break: break-word;
358
+ }
359
+
360
+ .stn-text-area__helper--error {
361
+ color: var(--stn-feedback-error);
362
+ }
363
+
364
+ .stn-text-area__count {
365
+ box-sizing: border-box;
366
+ margin: 0 0 0 auto;
367
+ padding: 0;
368
+ font-family: var(--stn-font-body, inherit);
369
+ font-size: var(--stn-text-caption-medium-size);
370
+ font-weight: var(--stn-font-weight-regular);
371
+ line-height: var(--stn-text-caption-medium-line-height);
372
+ color: var(--stn-text-secondary);
373
+ white-space: nowrap;
374
+ user-select: none;
375
+ }
@@ -18,28 +18,6 @@
18
18
  * - `.stn-tooltip.no-arrow`: 말풍선 꼬리 숨김
19
19
  */
20
20
 
21
- :root,
22
- [data-theme='dark'] {
23
- --stn-tooltip-bg-neutral: var(--stn-gray-700);
24
- --stn-tooltip-fg-neutral: var(--stn-static-white);
25
- --stn-tooltip-border-neutral: var(--stn-gray-600);
26
- --stn-tooltip-outlined-fg-neutral: var(--stn-gray-100);
27
- --stn-tooltip-shadow: var(--stn-shadow-3);
28
- --stn-tooltip-radius: var(--stn-radius-tooltip, var(--stn-radius-6));
29
- --stn-tooltip-border-width: var(--stn-size-1);
30
- --stn-tooltip-z-index: 1000;
31
- --stn-tooltip-blur: var(--stn-space-8);
32
- --stn-tooltip-outlined-bg: var(--stn-opacity-black-60);
33
- }
34
-
35
- [data-theme='light'] {
36
- --stn-tooltip-bg-neutral: var(--stn-gray-600);
37
- --stn-tooltip-fg-neutral: var(--stn-static-white);
38
- --stn-tooltip-border-neutral: var(--stn-gray-600);
39
- --stn-tooltip-outlined-fg-neutral: var(--stn-gray-600);
40
- --stn-tooltip-outlined-bg: var(--stn-opacity-white-60);
41
- }
42
-
43
21
  /* ==========================================================================
44
22
  1. Trigger Wrapper
45
23
  ========================================================================== */
@@ -57,12 +35,19 @@
57
35
  .stn-tooltip {
58
36
  --stn-tooltip-bg: var(--stn-tooltip-bg-neutral);
59
37
  --stn-tooltip-fg: var(--stn-tooltip-fg-neutral);
38
+ --stn-tooltip-shadow: var(--stn-shadow-tooltip, var(--stn-shadow-3));
39
+ --stn-tooltip-radius: var(--stn-radius-tooltip, var(--stn-radius-6));
40
+ --stn-tooltip-border-width: var(--stn-size-1);
41
+ --stn-tooltip-z-index: 1000;
42
+ --stn-tooltip-blur: var(--stn-space-8);
43
+ --stn-tooltip-offset: var(--stn-space-8);
60
44
  --stn-tooltip-font-size: var(--stn-text-caption-medium-size);
61
45
  --stn-tooltip-pad-y: var(--stn-space-4);
62
46
  --stn-tooltip-pad-x: var(--stn-space-8);
63
47
  --stn-tooltip-min-height: var(--stn-size-24);
64
48
  --stn-tooltip-arrow-size: var(--stn-size-6);
65
49
  --stn-tooltip-gap: var(--stn-space-4);
50
+ --stn-tooltip-offset: var(--stn-space-8);
66
51
 
67
52
  position: absolute;
68
53
  z-index: var(--stn-tooltip-z-index);
@@ -137,7 +122,7 @@
137
122
  /* Top (기본): 요소 위쪽, 아래쪽을 가리키는 꼬리 */
138
123
  .stn-tooltip.top,
139
124
  .stn-tooltip:not(.bottom):not(.left):not(.right) {
140
- bottom: calc(100% + var(--stn-space-6));
125
+ bottom: calc(100% + var(--stn-tooltip-offset, var(--stn-space-8)));
141
126
  left: 50%;
142
127
  transform: translateX(-50%) translateY(var(--stn-space-4));
143
128
  }
@@ -160,7 +145,7 @@
160
145
 
161
146
  /* Bottom: 요소 아래쪽, 위쪽을 가리키는 꼬리 */
162
147
  .stn-tooltip.bottom {
163
- top: calc(100% + var(--stn-space-6));
148
+ top: calc(100% + var(--stn-tooltip-offset, var(--stn-space-8)));
164
149
  left: 50%;
165
150
  transform: translateX(-50%) translateY(calc(-1 * var(--stn-space-4)));
166
151
  }
@@ -178,7 +163,7 @@
178
163
 
179
164
  /* Left: 요소 왼쪽, 오른쪽을 가리키는 꼬리 */
180
165
  .stn-tooltip.left {
181
- right: calc(100% + var(--stn-space-6));
166
+ right: calc(100% + var(--stn-tooltip-offset, var(--stn-space-8)));
182
167
  top: 50%;
183
168
  transform: translateY(-50%) translateX(var(--stn-space-4));
184
169
  }
@@ -196,7 +181,7 @@
196
181
 
197
182
  /* Right: 요소 오른쪽, 왼쪽을 가리키는 꼬리 */
198
183
  .stn-tooltip.right {
199
- left: calc(100% + var(--stn-space-6));
184
+ left: calc(100% + var(--stn-tooltip-offset, var(--stn-space-8)));
200
185
  top: 50%;
201
186
  transform: translateY(-50%) translateX(calc(-1 * var(--stn-space-4)));
202
187
  }
@@ -318,6 +318,20 @@
318
318
  /* ==========================================================================
319
319
  6. List view — 모바일/태블릿 반응형 (스크롤 & LNB/테이블 높이)
320
320
  ========================================================================== */
321
+ /* LNB 헤더 행 & 타이틀 기본 공통 규격 (펼침/접힘 모두 space-between 기본 적용) */
322
+ .stn-list-lnb__header-row {
323
+ display: flex;
324
+ align-items: center;
325
+ justify-content: space-between;
326
+ width: 100%;
327
+ }
328
+
329
+ .stn-list-lnb__header-title {
330
+ display: flex;
331
+ align-items: center;
332
+ gap: var(--stn-space-8);
333
+ }
334
+
321
335
  @media (max-width: 1279px) {
322
336
  /* 태블릿/모바일(column)에서는 본문 컨테이너가 스크롤되어 LNB -> 검색바 -> 테이블 순으로 전체 탐색 가능 */
323
337
  .stn-layer-1__body > .stn-container {
@@ -336,6 +350,17 @@
336
350
  flex-shrink: 0;
337
351
  }
338
352
 
353
+ /* 모바일(1280px 미만) 토글 버튼: 세로 아코디언 방향(위/아래)에 맞춰 90도 회전 */
354
+ .stn-list-lnb .stn-list-lnb__toggle-btn {
355
+ transform: rotate(90deg);
356
+ transition: transform 0.2s ease;
357
+ }
358
+
359
+ /* 모바일 펼침/접힘 모두 타이틀(좌측 끝)과 토글 버튼(우측 끝) 정렬 유지 */
360
+ .stn-list-lnb .stn-list-lnb__header-row {
361
+ justify-content: space-between !important;
362
+ }
363
+
339
364
  /* 모바일 접힘 시 아코디언 헤더만 표시 */
340
365
  .stn-list-lnb.is-collapsed {
341
366
  max-height: none;
@@ -32,9 +32,6 @@
32
32
  --stn-alert-center-tab-pill-bg: var(--stn-gray-100);
33
33
  --stn-alert-center-tab-active-bg: var(--stn-static-white);
34
34
 
35
- /* Scrollbar */
36
- --stn-alert-center-scrollbar-thumb: var(--stn-border-subtle);
37
- --stn-alert-center-scrollbar-width: var(--stn-size-6);
38
35
 
39
36
  /* List height */
40
37
  --stn-alert-center-list-height: 300px;
@@ -193,21 +190,31 @@
193
190
  padding: var(--stn-space-4) var(--stn-space-8) var(--stn-space-8);
194
191
  min-height: var(--stn-alert-center-list-height);
195
192
  max-height: var(--stn-alert-center-list-height);
193
+ }
194
+
195
+ /* StnScroll 미사용 순수 HTML용 fallback 스크롤 스타일 */
196
+ .stn-alert-center__list-wrap:not(.stn-scroll) {
196
197
  overflow-x: hidden;
197
198
  overflow-y: auto;
199
+ scrollbar-width: thin;
200
+ scrollbar-color: var(--stn-scroll-thumb) transparent;
198
201
  }
199
202
 
200
- .stn-alert-center__list-wrap::-webkit-scrollbar {
201
- width: var(--stn-alert-center-scrollbar-width);
203
+ .stn-alert-center__list-wrap:not(.stn-scroll)::-webkit-scrollbar {
204
+ width: var(--stn-scroll-width-thin, 4px);
202
205
  }
203
206
 
204
- .stn-alert-center__list-wrap::-webkit-scrollbar-track {
207
+ .stn-alert-center__list-wrap:not(.stn-scroll)::-webkit-scrollbar-track {
205
208
  background: transparent;
206
209
  }
207
210
 
208
- .stn-alert-center__list-wrap::-webkit-scrollbar-thumb {
209
- background: var(--stn-alert-center-scrollbar-thumb);
210
- border-radius: var(--stn-radius-chip-pill);
211
+ .stn-alert-center__list-wrap:not(.stn-scroll)::-webkit-scrollbar-thumb {
212
+ background: var(--stn-scroll-thumb);
213
+ border-radius: var(--stn-scroll-radius-thin, 2px);
214
+ }
215
+
216
+ .stn-alert-center__list-wrap:not(.stn-scroll)::-webkit-scrollbar-thumb:hover {
217
+ background: var(--stn-scroll-thumb-hover);
211
218
  }
212
219
 
213
220
  .stn-alert-center__list {
@@ -44,13 +44,6 @@
44
44
  min-height: 0;
45
45
  width: 100%;
46
46
  max-height: 100%;
47
- overflow-x: hidden;
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
47
  }
55
48
 
56
49
 
@@ -56,6 +56,7 @@
56
56
  @import './components/stn-loading-skeleton.css';
57
57
  @import './components/stn-search-requirement.css';
58
58
  @import './components/stn-text-field.css';
59
+ @import './components/stn-text-area.css';
59
60
  @import './components/stn-label-prefix.css';
60
61
  @import './components/stn-segmented.css';
61
62
  @import './components/stn-toast.css';
@@ -67,6 +67,11 @@
67
67
  --stn-input-focus-fg: var(--stn-blue-300);
68
68
  --stn-input-placeholder: var(--stn-gray-600);
69
69
  --stn-label-prefix-label-bg: var(--stn-gray-800);
70
+ --stn-tooltip-bg-neutral: var(--stn-gray-700);
71
+ --stn-tooltip-fg-neutral: var(--stn-static-white);
72
+ --stn-tooltip-border-neutral: var(--stn-gray-600);
73
+ --stn-tooltip-outlined-fg-neutral: var(--stn-gray-100);
74
+ --stn-tooltip-outlined-bg: var(--stn-opacity-black-60);
70
75
  --stn-label-prefix-divider: var(--stn-gray-600);
71
76
  --stn-label-prefix-label-color: var(--stn-gray-400);
72
77
  --stn-input-disabled-opacity: 0.55;
@@ -115,7 +120,7 @@
115
120
  --stn-tree-label-server: var(--stn-gray-400);
116
121
  --stn-tree-selected: var(--stn-gray-800);
117
122
  --stn-tree-server-icon: var(--stn-gray-400);
118
- --stn-scroll-thumb: var(--stn-gray-250);
123
+ --stn-scroll-thumb: var(--stn-gray-650);
119
124
  --stn-section-side-bg: var(--stn-gray-900);
120
125
  --stn-section-side-border: var(--stn-gray-800);
121
126
  --stn-section-side-radius: 10px;
@@ -286,6 +291,8 @@
286
291
  --stn-pop-shadow: 0 0 10px color-mix(in srgb, var(--stn-static-black) 100%, transparent);
287
292
  --stn-dropdown-menu-bg: var(--stn-gray-850);
288
293
  --stn-dropdown-menu-hover-bg: var(--stn-gray-800);
294
+ --stn-dropdown-menu-selected-bg: var(--stn-gray-800);
295
+ --stn-dropdown-menu-border: var(--stn-gray-700);
289
296
  --stn-dropdown-menu-blur: 4px;
290
297
  --stn-dropdown-menu-z: 150;
291
298
  --stn-icon-btn-fg: var(--stn-gray-50);
@@ -574,6 +581,24 @@
574
581
  --stn-event-banner-wr-shadow: 0 12px 36px var(--stn-opacity-black-85), inset 0 0 12px color-mix(in srgb, var(--stn-teal-400) 12%, transparent);
575
582
  --stn-event-banner-wr-blink-rest: 0 8px 32px var(--stn-opacity-black-70), inset 0 0 12px color-mix(in srgb, var(--stn-teal-400) 12%, transparent);
576
583
  --stn-event-banner-wr-blink-peak: 0 8px 32px var(--stn-opacity-black-70), inset 0 0 42px color-mix(in srgb, var(--stn-teal-400) 65%, transparent);
584
+ --stn-status-switch-bg: var(--stn-gray-900);
585
+ --stn-status-switch-border: var(--stn-gray-700);
586
+ --stn-status-switch-color: var(--stn-gray-400);
587
+ --stn-status-switch-badge-bg: var(--stn-gray-800);
588
+ --stn-status-switch-badge-color: var(--stn-gray-400);
589
+ --stn-status-switch-thumb-bg: var(--stn-gray-600);
590
+ --stn-status-switch-checked-border: var(--stn-blue-400);
591
+ --stn-status-switch-checked-bg: color-mix(in srgb, var(--stn-blue-500) 18%, var(--stn-gray-950));
592
+ --stn-status-switch-checked-color: var(--stn-blue-200);
593
+ --stn-status-switch-checked-badge-bg: var(--stn-blue-400);
594
+ --stn-status-switch-checked-badge-color: var(--stn-static-white);
595
+ --stn-status-switch-checked-thumb-bg: var(--stn-blue-300);
596
+ --stn-status-switch-checked-thumb-shadow: 0 0 6px var(--stn-blue-400);
597
+ --stn-status-flow-step-bg: var(--stn-gray-850);
598
+ --stn-status-flow-step-border: var(--stn-gray-700);
599
+ --stn-status-flow-step-color: var(--stn-gray-200);
600
+ --stn-status-flow-connector-color: var(--stn-gray-600);
601
+ --stn-status-flow-connector-opacity: 0.6;
577
602
  }
578
603
 
579
604
  [data-theme='light'] {
@@ -638,6 +663,11 @@
638
663
  --stn-label-prefix-label-bg: var(--stn-gray-50);
639
664
  --stn-label-prefix-divider: var(--stn-gray-200);
640
665
  --stn-label-prefix-label-color: var(--stn-gray-500);
666
+ --stn-tooltip-bg-neutral: var(--stn-gray-600);
667
+ --stn-tooltip-fg-neutral: var(--stn-static-white);
668
+ --stn-tooltip-border-neutral: var(--stn-gray-600);
669
+ --stn-tooltip-outlined-fg-neutral: var(--stn-gray-600);
670
+ --stn-tooltip-outlined-bg: var(--stn-opacity-white-60);
641
671
  --stn-input-disabled-opacity: 0.55;
642
672
  --stn-input-filled-bg: var(--stn-gray-50);
643
673
  --stn-input-filled-border: transparent;
@@ -684,7 +714,7 @@
684
714
  --stn-tree-label-server: var(--stn-gray-600);
685
715
  --stn-tree-selected: var(--stn-gray-100);
686
716
  --stn-tree-server-icon: var(--stn-gray-400);
687
- --stn-scroll-thumb: var(--stn-gray-350);
717
+ --stn-scroll-thumb: var(--stn-gray-200);
688
718
  --stn-section-side-bg: var(--stn-static-white);
689
719
  --stn-section-side-border: var(--stn-gray-25);
690
720
  --stn-section-side-radius: 8px;
@@ -855,6 +885,8 @@
855
885
  --stn-pop-shadow: 0 0 12px color-mix(in srgb, var(--stn-static-black) 12%, transparent);
856
886
  --stn-dropdown-menu-bg: var(--stn-static-white);
857
887
  --stn-dropdown-menu-hover-bg: var(--stn-gray-100);
888
+ --stn-dropdown-menu-selected-bg: var(--stn-gray-100);
889
+ --stn-dropdown-menu-border: var(--stn-gray-200);
858
890
  --stn-dropdown-menu-blur: 4px;
859
891
  --stn-dropdown-menu-z: 150;
860
892
  --stn-icon-btn-fg: var(--stn-gray-800);
@@ -933,7 +965,7 @@
933
965
  --stn-badge-solid-warning: var(--stn-teal-500);
934
966
  --stn-badge-solid-neutral: var(--stn-gray-300);
935
967
  --stn-badge-solid-neutral-fg: var(--stn-static-white);
936
- --stn-scroll-thumb-hover: var(--stn-gray-450);
968
+ --stn-scroll-thumb-hover: var(--stn-gray-300);
937
969
  --stn-scroll-track: var(--stn-opacity-black-5);
938
970
  --stn-scroll-thumb-primary: var(--stn-primary);
939
971
  --stn-scroll-thumb-primary-hover: var(--stn-blue-300);
@@ -1145,4 +1177,22 @@
1145
1177
  --stn-event-banner-wr-shadow: 0 12px 32px color-mix(in srgb, var(--stn-static-black) 14%, transparent), inset 0 0 16px color-mix(in srgb, var(--stn-teal-450) 12%, transparent);
1146
1178
  --stn-event-banner-wr-blink-rest: 0 8px 32px color-mix(in srgb, var(--stn-static-black) 14%, transparent), inset 0 0 16px color-mix(in srgb, var(--stn-teal-450) 12%, transparent);
1147
1179
  --stn-event-banner-wr-blink-peak: 0 8px 32px color-mix(in srgb, var(--stn-static-black) 14%, transparent), inset 0 0 42px color-mix(in srgb, var(--stn-teal-450) 65%, transparent);
1180
+ --stn-status-switch-bg: var(--stn-gray-100);
1181
+ --stn-status-switch-border: var(--stn-gray-300);
1182
+ --stn-status-switch-color: var(--stn-gray-600);
1183
+ --stn-status-switch-badge-bg: var(--stn-gray-200);
1184
+ --stn-status-switch-badge-color: var(--stn-gray-600);
1185
+ --stn-status-switch-thumb-bg: var(--stn-gray-400);
1186
+ --stn-status-switch-checked-border: var(--stn-blue-500);
1187
+ --stn-status-switch-checked-bg: color-mix(in srgb, var(--stn-blue-500) 10%, var(--stn-static-white));
1188
+ --stn-status-switch-checked-color: var(--stn-blue-600);
1189
+ --stn-status-switch-checked-badge-bg: var(--stn-blue-500);
1190
+ --stn-status-switch-checked-badge-color: var(--stn-static-white);
1191
+ --stn-status-switch-checked-thumb-bg: var(--stn-blue-500);
1192
+ --stn-status-switch-checked-thumb-shadow: 0 0 4px color-mix(in srgb, var(--stn-blue-500) 50%, transparent);
1193
+ --stn-status-flow-step-bg: var(--stn-gray-100);
1194
+ --stn-status-flow-step-border: var(--stn-gray-300);
1195
+ --stn-status-flow-step-color: var(--stn-gray-800);
1196
+ --stn-status-flow-connector-color: var(--stn-gray-400);
1197
+ --stn-status-flow-connector-opacity: 0.7;
1148
1198
  }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-A5KLX6NX.js.map