@stn-uiux/pub-ui 0.1.85 → 0.1.87

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 (58) hide show
  1. package/dist/{chunk-BYGKJSDN.js → chunk-6HRKKRTT.js} +18 -3
  2. package/dist/chunk-6HRKKRTT.js.map +1 -0
  3. package/dist/{chunk-YN774RCQ.js → chunk-6TQ4O7BK.js} +2 -2
  4. package/dist/chunk-7OZGRHFD.js +15 -0
  5. package/dist/chunk-7OZGRHFD.js.map +1 -0
  6. package/dist/{chunk-W7K3FSAX.js → chunk-F5WWHWEU.js} +9 -1
  7. package/dist/chunk-F5WWHWEU.js.map +1 -0
  8. package/dist/chunk-I2Y7E4TU.js +15 -0
  9. package/dist/chunk-I2Y7E4TU.js.map +1 -0
  10. package/dist/chunk-PXTPAYC3.js +1 -0
  11. package/dist/{chunk-SOEBXG3T.js → chunk-U66BCO23.js} +2 -2
  12. package/dist/chunk-ZGYPJEU3.js +9 -0
  13. package/dist/chunk-ZGYPJEU3.js.map +1 -0
  14. package/dist/cli.js +7 -7
  15. package/dist/data/index.d.ts +3 -1
  16. package/dist/data/index.js +61 -47
  17. package/dist/data/stnColorPalette.js +2 -2
  18. package/dist/data/stnFeedbackColors.d.ts +7 -0
  19. package/dist/data/stnFeedbackColors.js +1 -1
  20. package/dist/data/stnList.d.ts +19 -0
  21. package/dist/data/stnList.js +9 -0
  22. package/dist/data/stnList.js.map +1 -0
  23. package/dist/data/stnMenu.d.ts +22 -0
  24. package/dist/data/stnMenu.js +9 -0
  25. package/dist/data/stnMenu.js.map +1 -0
  26. package/dist/data/stnPackageVersion.d.ts +2 -2
  27. package/dist/data/stnPackageVersion.js +1 -1
  28. package/dist/data/stnSplitView.d.ts +3 -1
  29. package/dist/data/stnSplitView.js +3 -1
  30. package/dist/data/stnToast.js +2 -2
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.js +61 -47
  33. package/package.json +1 -1
  34. package/styles/components/stn-badge.css +17 -0
  35. package/styles/components/stn-breadcrumb.css +9 -0
  36. package/styles/components/stn-card.css +32 -0
  37. package/styles/components/stn-drawer.css +7 -0
  38. package/styles/components/stn-list.css +430 -0
  39. package/styles/components/stn-menu.css +467 -0
  40. package/styles/components/stn-popup.css +32 -0
  41. package/styles/components/stn-topology.css +93 -1
  42. package/styles/foundations/stn-typography.css +1 -0
  43. package/styles/layouts/stn-container.css +49 -5
  44. package/styles/layouts/stn-layer1-content.css +4 -1
  45. package/styles/patterns/stn-floating-toolbar.css +39 -0
  46. package/styles/patterns/stn-split-view.css +68 -0
  47. package/styles/style-pub.css +2 -0
  48. package/styles/tokens/stn-colors-semantic.css +36 -4
  49. package/styles/tokens/stn-size-semantic.css +22 -4
  50. package/styles/tokens/stn-size.css +1 -0
  51. package/dist/chunk-5QPBSOJ6.js +0 -9
  52. package/dist/chunk-5QPBSOJ6.js.map +0 -1
  53. package/dist/chunk-BYGKJSDN.js.map +0 -1
  54. package/dist/chunk-ERZPIKPF.js +0 -1
  55. package/dist/chunk-W7K3FSAX.js.map +0 -1
  56. /package/dist/{chunk-YN774RCQ.js.map → chunk-6TQ4O7BK.js.map} +0 -0
  57. /package/dist/{chunk-ERZPIKPF.js.map → chunk-PXTPAYC3.js.map} +0 -0
  58. /package/dist/{chunk-SOEBXG3T.js.map → chunk-U66BCO23.js.map} +0 -0
@@ -0,0 +1,430 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * StnList — STN 디자인 시스템 표준 목록(List) 컴포넌트 CSS (SSOT)
4
+ *
5
+ * 4대 표준 규격:
6
+ * 1. Size 규격: xs (28px) · sm (36px) · md (44px 표준 기본값) · lg (52px) · xl (60px)
7
+ * 2. Width 규격: w80 · w100 · w120 · w140 · w160 · w180 · w200 · full
8
+ * 3. Semantic Token 100% 강제 (var(--stn-*))
9
+ * 4. Compound Component 완벽 지원 (.stn-list, .stn-list-item, .stn-list-item-button 등)
10
+ */
11
+
12
+ /* ==========================================================================
13
+ 1. StnList 루트 컨테이너
14
+ ========================================================================== */
15
+ .stn-list {
16
+ box-sizing: border-box;
17
+ margin: 0;
18
+ padding: var(--stn-space-4) 0;
19
+ list-style: none;
20
+ display: flex;
21
+ flex-direction: column;
22
+ position: relative;
23
+ background: transparent;
24
+ color: var(--stn-text-primary);
25
+
26
+ /* 기본 md 규격 */
27
+ --stn-list-item-min-height: var(--stn-list-item-height-md);
28
+ --stn-list-item-padding-y: var(--stn-space-8);
29
+ --stn-list-item-padding-x: var(--stn-space-12);
30
+ --stn-list-item-font-size: var(--stn-text-body-medium-size);
31
+ --stn-list-item-secondary-font-size: var(--stn-text-caption-medium-size);
32
+ --stn-list-item-line-height: var(--stn-text-body-medium-line-height);
33
+ --stn-list-item-icon-size: var(--stn-size-18);
34
+ --stn-list-item-gap: var(--stn-space-8);
35
+ }
36
+
37
+ /* 4대 표준 Size 규격 (스케일별 높이/패딩/폰트) */
38
+ .stn-list--xs,
39
+ .stn-list-item--xs,
40
+ .stn-list-item-button--xs {
41
+ --stn-list-item-min-height: var(--stn-list-item-height-xs);
42
+ --stn-list-item-padding-y: var(--stn-space-4);
43
+ --stn-list-item-padding-x: var(--stn-space-8);
44
+ --stn-list-item-font-size: var(--stn-text-caption-small-size);
45
+ --stn-list-item-secondary-font-size: var(--stn-text-label-xsmall-size);
46
+ --stn-list-item-line-height: var(--stn-text-caption-small-line-height);
47
+ --stn-list-item-icon-size: var(--stn-size-14);
48
+ --stn-list-item-gap: var(--stn-space-6);
49
+ }
50
+
51
+ .stn-list--sm,
52
+ .stn-list-item--sm,
53
+ .stn-list-item-button--sm {
54
+ --stn-list-item-min-height: var(--stn-list-item-height-sm);
55
+ --stn-list-item-padding-y: var(--stn-space-6);
56
+ --stn-list-item-padding-x: var(--stn-space-10);
57
+ --stn-list-item-font-size: var(--stn-text-caption-medium-size);
58
+ --stn-list-item-secondary-font-size: var(--stn-text-caption-small-size);
59
+ --stn-list-item-line-height: var(--stn-text-caption-medium-line-height);
60
+ --stn-list-item-icon-size: var(--stn-size-16);
61
+ --stn-list-item-gap: var(--stn-space-8);
62
+ }
63
+
64
+ .stn-list--md,
65
+ .stn-list-item--md,
66
+ .stn-list-item-button--md {
67
+ --stn-list-item-min-height: var(--stn-list-item-height-md);
68
+ --stn-list-item-padding-y: var(--stn-space-8);
69
+ --stn-list-item-padding-x: var(--stn-space-12);
70
+ --stn-list-item-font-size: var(--stn-text-body-medium-size);
71
+ --stn-list-item-secondary-font-size: var(--stn-text-caption-medium-size);
72
+ --stn-list-item-line-height: var(--stn-text-body-medium-line-height);
73
+ --stn-list-item-icon-size: var(--stn-size-18);
74
+ --stn-list-item-gap: var(--stn-space-8);
75
+ }
76
+
77
+ .stn-list--lg,
78
+ .stn-list-item--lg,
79
+ .stn-list-item-button--lg {
80
+ --stn-list-item-min-height: var(--stn-list-item-height-lg);
81
+ --stn-list-item-padding-y: var(--stn-space-12);
82
+ --stn-list-item-padding-x: var(--stn-space-14);
83
+ --stn-list-item-font-size: var(--stn-text-body-large-size);
84
+ --stn-list-item-secondary-font-size: var(--stn-text-body-small-size);
85
+ --stn-list-item-line-height: var(--stn-text-body-large-line-height);
86
+ --stn-list-item-icon-size: var(--stn-size-20);
87
+ --stn-list-item-gap: var(--stn-space-10);
88
+ }
89
+
90
+ .stn-list--xl,
91
+ .stn-list-item--xl,
92
+ .stn-list-item-button--xl {
93
+ --stn-list-item-min-height: var(--stn-list-item-height-xl);
94
+ --stn-list-item-padding-y: var(--stn-space-16);
95
+ --stn-list-item-padding-x: var(--stn-space-16);
96
+ --stn-list-item-font-size: var(--stn-text-title-medium-size);
97
+ --stn-list-item-secondary-font-size: var(--stn-text-body-medium-size);
98
+ --stn-list-item-line-height: var(--stn-text-title-medium-line-height);
99
+ --stn-list-item-icon-size: var(--stn-size-24);
100
+ --stn-list-item-gap: var(--stn-space-12);
101
+ }
102
+
103
+ /* 패딩 규격 프리셋 (Padding Presets — pure CSS Custom Property SSOT) */
104
+ .stn-list--pad-none,
105
+ .stn-list-item--pad-none {
106
+ --stn-list-item-padding-y: 0;
107
+ --stn-list-item-padding-x: 0;
108
+ --stn-list-item-min-height: auto;
109
+ }
110
+
111
+ .stn-list--pad-xs,
112
+ .stn-list-item--pad-xs {
113
+ --stn-list-item-padding-y: var(--stn-space-4);
114
+ --stn-list-item-padding-x: var(--stn-space-8);
115
+ }
116
+
117
+ .stn-list--pad-sm,
118
+ .stn-list-item--pad-sm {
119
+ --stn-list-item-padding-y: var(--stn-space-6);
120
+ --stn-list-item-padding-x: var(--stn-space-10);
121
+ }
122
+
123
+ .stn-list--pad-md,
124
+ .stn-list-item--pad-md {
125
+ --stn-list-item-padding-y: var(--stn-space-8);
126
+ --stn-list-item-padding-x: var(--stn-space-12);
127
+ }
128
+
129
+ .stn-list--pad-lg,
130
+ .stn-list-item--pad-lg {
131
+ --stn-list-item-padding-y: var(--stn-space-12);
132
+ --stn-list-item-padding-x: var(--stn-space-14);
133
+ }
134
+
135
+ .stn-list--pad-xl,
136
+ .stn-list-item--pad-xl {
137
+ --stn-list-item-padding-y: var(--stn-space-16);
138
+ --stn-list-item-padding-x: var(--stn-space-16);
139
+ }
140
+
141
+ .stn-list--disable-padding {
142
+ padding-top: 0;
143
+ padding-bottom: 0;
144
+ }
145
+
146
+ /* 외형 변형 (Variants) */
147
+ .stn-list--card {
148
+ background: var(--stn-elevation-surface-0);
149
+ border: var(--stn-size-1) solid var(--stn-border-subtle);
150
+ border-radius: var(--stn-radius-md);
151
+ box-shadow: var(--stn-shadow-sm);
152
+ padding: var(--stn-space-6);
153
+ }
154
+
155
+ .stn-list--bordered {
156
+ border: var(--stn-size-1) solid var(--stn-border-subtle);
157
+ border-radius: var(--stn-radius-sm);
158
+ }
159
+
160
+ /* 스크롤 가능 (Scrollable) */
161
+ .stn-list--scrollable {
162
+ overflow-y: auto;
163
+ overflow-x: hidden;
164
+ }
165
+
166
+ /* 4대 표준 너비 규격 (Width Presets — STN 4대 표준 규격: .w80 ~ .w200, .full) */
167
+ .stn-list.w80 { width: var(--stn-size-80); }
168
+ .stn-list.w100 { width: var(--stn-size-100); }
169
+ .stn-list.w120 { width: var(--stn-size-120); }
170
+ .stn-list.w140 { width: var(--stn-size-140); }
171
+ .stn-list.w160 { width: var(--stn-size-160); }
172
+ .stn-list.w180 { width: var(--stn-size-180); }
173
+ .stn-list.w200 { width: var(--stn-size-200); }
174
+ .stn-list.full { width: 100%; }
175
+
176
+ /* 들여쓰기 깊이 (Indent Depth for Nested Lists) */
177
+ .stn-list--indent-1 { padding-left: var(--stn-space-24); }
178
+ .stn-list--indent-2 { padding-left: var(--stn-space-36); }
179
+ .stn-list--indent-3 { padding-left: var(--stn-space-48); }
180
+
181
+
182
+ /* ==========================================================================
183
+ 2. StnList.Subheader (섹션/카테고리 헤더)
184
+ ========================================================================== */
185
+ .stn-list-subheader {
186
+ box-sizing: border-box;
187
+ display: flex;
188
+ align-items: center;
189
+ padding: var(--stn-space-6) var(--stn-space-12);
190
+ font-family: var(--stn-font-body);
191
+ font-size: var(--stn-text-caption-medium-size);
192
+ font-weight: var(--stn-font-weight-semibold);
193
+ color: var(--stn-text-tertiary);
194
+ line-height: var(--stn-text-caption-medium-line-height, 1.4);
195
+ letter-spacing: 0.02em;
196
+ user-select: none;
197
+ list-style: none;
198
+ }
199
+
200
+ .stn-list-subheader--sticky {
201
+ position: sticky;
202
+ top: 0;
203
+ z-index: 2;
204
+ background: var(--stn-elevation-surface-0);
205
+ backdrop-filter: blur(var(--stn-space-8));
206
+ -webkit-backdrop-filter: blur(var(--stn-space-8));
207
+ }
208
+
209
+
210
+ /* ==========================================================================
211
+ 3. StnList.Item (<li> 행 래퍼)
212
+ ========================================================================== */
213
+ .stn-list-item {
214
+ box-sizing: border-box;
215
+ display: flex;
216
+ align-items: center;
217
+ position: relative;
218
+ width: 100%;
219
+ min-height: var(--stn-list-item-min-height, var(--stn-size-40));
220
+ padding: var(--stn-list-item-padding-y, var(--stn-space-8)) var(--stn-list-item-padding-x, var(--stn-space-12));
221
+ gap: var(--stn-list-item-gap, var(--stn-space-8));
222
+ color: var(--stn-text-primary);
223
+ text-align: left;
224
+ }
225
+
226
+ .stn-list-item--disable-padding,
227
+ .stn-list-item.stn-list-item--disable-padding,
228
+ .stn-list-item:has(> .stn-list-item-button) {
229
+ padding: 0;
230
+ }
231
+
232
+ .stn-list-item--divider {
233
+ border-bottom: var(--stn-size-1) solid var(--stn-border-subtle);
234
+ }
235
+
236
+ .stn-list-item--divider:last-child {
237
+ border-bottom: none;
238
+ }
239
+
240
+
241
+ /* ==========================================================================
242
+ 4. StnList.Button (인터랙션 버튼 / 링크)
243
+ ========================================================================== */
244
+ .stn-list-item-button {
245
+ box-sizing: border-box;
246
+ display: flex;
247
+ align-items: center;
248
+ width: 100%;
249
+ min-height: var(--stn-list-item-min-height, var(--stn-size-40));
250
+ padding: var(--stn-list-item-padding-y, var(--stn-space-8)) var(--stn-list-item-padding-x, var(--stn-space-12));
251
+ gap: var(--stn-list-item-gap, var(--stn-space-8));
252
+ border: none;
253
+ background: transparent;
254
+ color: var(--stn-text-primary);
255
+ border-radius: var(--stn-radius-sm);
256
+ cursor: pointer;
257
+ text-align: left;
258
+ text-decoration: none;
259
+ position: relative;
260
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
261
+ user-select: none;
262
+ -webkit-appearance: none;
263
+ }
264
+
265
+ /* 호버 상태 */
266
+ .stn-list-item-button:hover:not(.is-disabled) {
267
+ background: color-mix(in srgb, var(--stn-primary) 10%, var(--stn-dropdown-menu-hover-bg));
268
+ }
269
+
270
+ /* 포커스 링 (접근성) */
271
+ .stn-list-item-button:focus-visible {
272
+ background: color-mix(in srgb, var(--stn-primary) 10%, var(--stn-dropdown-menu-hover-bg));
273
+ outline: var(--stn-size-2) solid var(--stn-focus-ring);
274
+ outline-offset: calc(-1 * var(--stn-size-2));
275
+ }
276
+
277
+ /* 선택(Active/Selected) 상태 */
278
+ .stn-list-item-button.is-selected {
279
+ background: color-mix(in srgb, var(--stn-primary) 14%, transparent);
280
+ color: var(--stn-primary);
281
+ font-weight: var(--stn-font-weight-semibold);
282
+ }
283
+
284
+ .stn-list-item-button.is-selected::before {
285
+ content: '';
286
+ position: absolute;
287
+ left: 0;
288
+ top: 15%;
289
+ bottom: 15%;
290
+ width: var(--stn-size-3);
291
+ background: var(--stn-primary);
292
+ border-radius: var(--stn-radius-xs);
293
+ }
294
+
295
+ /* 비활성화 상태 */
296
+ .stn-list-item-button.is-disabled,
297
+ .stn-list-item-button[disabled] {
298
+ opacity: 0.45;
299
+ cursor: not-allowed;
300
+ pointer-events: none;
301
+ }
302
+
303
+
304
+ /* ==========================================================================
305
+ 5. StnList.Icon & Avatar (좌측 시각 슬롯)
306
+ ========================================================================== */
307
+ .stn-list-item-icon {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ flex-shrink: 0;
312
+ width: var(--stn-list-item-icon-size, var(--stn-size-18));
313
+ height: var(--stn-list-item-icon-size, var(--stn-size-18));
314
+ min-width: var(--stn-list-item-icon-size, var(--stn-size-18));
315
+ color: var(--stn-text-secondary);
316
+ font-size: var(--stn-list-item-icon-size, var(--stn-size-18));
317
+ line-height: 1;
318
+ transition: color 0.15s ease;
319
+ }
320
+
321
+ .stn-list-item-icon .stn-icon,
322
+ .stn-list-item-icon img,
323
+ .stn-list-item-icon svg {
324
+ width: var(--stn-list-item-icon-size, var(--stn-size-18));
325
+ height: var(--stn-list-item-icon-size, var(--stn-size-18));
326
+ }
327
+
328
+ .stn-list-item-button.is-selected .stn-list-item-icon {
329
+ color: var(--stn-primary);
330
+ }
331
+
332
+ .stn-list-item-avatar {
333
+ display: inline-flex;
334
+ align-items: center;
335
+ justify-content: center;
336
+ flex-shrink: 0;
337
+ margin-right: var(--stn-space-12);
338
+ }
339
+
340
+
341
+ /* ==========================================================================
342
+ 6. StnList.Text (본문 텍스트 슬롯 — Primary + Secondary)
343
+ ========================================================================== */
344
+ .stn-list-item-text {
345
+ flex: 1;
346
+ min-width: 0;
347
+ display: flex;
348
+ flex-direction: column;
349
+ justify-content: center;
350
+ text-align: left;
351
+ }
352
+
353
+ .stn-list-item-text__primary {
354
+ display: block;
355
+ font-family: var(--stn-font-body);
356
+ font-size: var(--stn-list-item-font-size, var(--stn-text-body-medium-size));
357
+ font-weight: var(--stn-font-weight-medium);
358
+ line-height: var(--stn-list-item-line-height, var(--stn-line-height-default));
359
+ color: var(--stn-text-primary);
360
+ overflow: hidden;
361
+ text-overflow: ellipsis;
362
+ white-space: nowrap;
363
+ }
364
+
365
+ .stn-list-item-button.is-selected .stn-list-item-text__primary {
366
+ color: var(--stn-primary);
367
+ font-weight: var(--stn-font-weight-semibold);
368
+ }
369
+
370
+ .stn-list-item-text__secondary {
371
+ display: block;
372
+ font-family: var(--stn-font-body);
373
+ font-size: var(--stn-list-item-secondary-font-size, var(--stn-text-caption-medium-size));
374
+ font-weight: var(--stn-font-weight-regular);
375
+ line-height: var(--stn-text-caption-medium-line-height, var(--stn-line-height-reading-3));
376
+ color: var(--stn-text-tertiary);
377
+ margin-top: var(--stn-space-2);
378
+ overflow: hidden;
379
+ text-overflow: ellipsis;
380
+ white-space: nowrap;
381
+ }
382
+
383
+ /* 텍스트 색상 수식어 (Semantic Color Modifier) */
384
+ .stn-list-item-text--color-primary .stn-list-item-text__primary {
385
+ color: var(--stn-text-primary);
386
+ }
387
+ .stn-list-item-text--color-secondary .stn-list-item-text__primary {
388
+ color: var(--stn-text-secondary);
389
+ }
390
+ .stn-list-item-text--color-tertiary .stn-list-item-text__primary {
391
+ color: var(--stn-text-tertiary);
392
+ }
393
+
394
+ /* 아이콘 없는 항목 정렬 정합성 (Inset Indentation) */
395
+ .stn-list-item-text--inset {
396
+ padding-left: calc(var(--stn-list-item-icon-size, var(--stn-size-18)) + var(--stn-list-item-gap, var(--stn-space-8)));
397
+ }
398
+
399
+
400
+ /* ==========================================================================
401
+ 7. StnList.Action (우측 도킹 다중 액션 슬롯)
402
+ ========================================================================== */
403
+ .stn-list-item-action {
404
+ display: inline-flex;
405
+ align-items: center;
406
+ gap: var(--stn-space-4);
407
+ margin-left: auto;
408
+ flex-shrink: 0;
409
+ }
410
+
411
+
412
+ /* ==========================================================================
413
+ 8. StnList.Collapse (중첩 접힘/펼침 트랜지션)
414
+ ========================================================================== */
415
+ .stn-list-collapse {
416
+ overflow: hidden;
417
+ transition: max-height 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;
418
+ width: 100%;
419
+ list-style: none;
420
+ }
421
+
422
+ .stn-list-collapse.is-closed {
423
+ max-height: 0;
424
+ opacity: 0;
425
+ pointer-events: none;
426
+ }
427
+
428
+ .stn-list-collapse.is-open {
429
+ opacity: 1;
430
+ }