@stn-uiux/pub-ui 0.1.86 → 0.1.88

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-6RJFVO4M.js +9 -0
  2. package/dist/chunk-6RJFVO4M.js.map +1 -0
  3. package/dist/chunk-7OZGRHFD.js +15 -0
  4. package/dist/chunk-7OZGRHFD.js.map +1 -0
  5. package/dist/chunk-I2Y7E4TU.js +15 -0
  6. package/dist/chunk-I2Y7E4TU.js.map +1 -0
  7. package/dist/chunk-PXTPAYC3.js +1 -0
  8. package/dist/{chunk-2VSSPMZ3.js → chunk-R7HPVMSM.js} +3 -1
  9. package/dist/{chunk-2VSSPMZ3.js.map → chunk-R7HPVMSM.js.map} +1 -1
  10. package/dist/cli.js +5 -5
  11. package/dist/data/index.d.ts +3 -1
  12. package/dist/data/index.js +58 -44
  13. package/dist/data/stnCard.d.ts +3 -1
  14. package/dist/data/stnCard.js +3 -1
  15. package/dist/data/stnList.d.ts +19 -0
  16. package/dist/data/stnList.js +9 -0
  17. package/dist/data/stnList.js.map +1 -0
  18. package/dist/data/stnMenu.d.ts +22 -0
  19. package/dist/data/stnMenu.js +9 -0
  20. package/dist/data/stnMenu.js.map +1 -0
  21. package/dist/data/stnPackageVersion.d.ts +2 -2
  22. package/dist/data/stnPackageVersion.js +1 -1
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.js +58 -44
  25. package/package.json +1 -1
  26. package/styles/components/stn-badge.css +0 -14
  27. package/styles/components/stn-card.css +8 -0
  28. package/styles/components/stn-drawer.css +7 -1
  29. package/styles/components/stn-list.css +430 -0
  30. package/styles/components/stn-menu.css +467 -0
  31. package/styles/components/stn-popover.css +9 -0
  32. package/styles/components/stn-table.css +0 -1
  33. package/styles/components/stn-topology.css +130 -56
  34. package/styles/layouts/stn-container.css +49 -5
  35. package/styles/layouts/stn-layer1-content.css +4 -1
  36. package/styles/patterns/stn-floating-toolbar.css +39 -0
  37. package/styles/style-pub.css +2 -0
  38. package/styles/tokens/stn-colors-semantic.css +31 -5
  39. package/styles/tokens/stn-size-semantic.css +22 -10
  40. package/styles/tokens/stn-size.css +1 -0
  41. package/dist/chunk-2PIUQUBN.js +0 -9
  42. package/dist/chunk-2PIUQUBN.js.map +0 -1
  43. package/dist/chunk-ERZPIKPF.js +0 -1
  44. /package/dist/{chunk-ERZPIKPF.js.map → chunk-PXTPAYC3.js.map} +0 -0
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  STN_UI_COMPONENTS,
4
4
  STN_UI_FOUNDATIONS
5
5
  } from "./chunk-K6TWXWIO.js";
6
- import "./chunk-ERZPIKPF.js";
6
+ import "./chunk-PXTPAYC3.js";
7
7
  import {
8
8
  STN_TOGGLE_BUTTON_PLAYGROUND_DEFAULT,
9
9
  STN_TOGGLE_BUTTON_PLAYGROUND_INTRO,
@@ -34,6 +34,12 @@ import {
34
34
  typographyPrimitivesToJson,
35
35
  typographySemanticsToJson
36
36
  } from "./chunk-2TRZNWCA.js";
37
+ import {
38
+ STN_STEP_CARDS_INTRO
39
+ } from "./chunk-NYZMUDVK.js";
40
+ import {
41
+ STN_STEP_STATUS_SPEC
42
+ } from "./chunk-N4PVFFKV.js";
37
43
  import "./chunk-7ONB2WVN.js";
38
44
  import {
39
45
  STN_TEXT_AREA_HTML,
@@ -45,6 +51,15 @@ import {
45
51
  import {
46
52
  STN_TEXT_COLOR_ROWS
47
53
  } from "./chunk-4HUY6TN4.js";
54
+ import {
55
+ STN_SIZE_INTRO,
56
+ STN_SIZE_ROWS,
57
+ sizeTokensToJson
58
+ } from "./chunk-YI22T66L.js";
59
+ import {
60
+ STN_SIZE_SEMANTIC_INTRO,
61
+ STN_SIZE_SEMANTIC_ROWS
62
+ } from "./chunk-2FHXIAM3.js";
48
63
  import {
49
64
  STN_SLIDER_HTML,
50
65
  STN_SLIDER_INTRO,
@@ -74,11 +89,9 @@ import {
74
89
  STN_STATUS_DEMO_STEPS
75
90
  } from "./chunk-R6NCTORS.js";
76
91
  import {
77
- STN_STEP_CARDS_INTRO
78
- } from "./chunk-NYZMUDVK.js";
79
- import {
80
- STN_STEP_STATUS_SPEC
81
- } from "./chunk-N4PVFFKV.js";
92
+ STN_RADIUS_USECASE_INTRO,
93
+ STN_RADIUS_USECASE_ROWS
94
+ } from "./chunk-666SNAJT.js";
82
95
  import {
83
96
  STN_SECTION_SIDE_FIGMA,
84
97
  STN_SECTION_SIDE_INTRO,
@@ -98,14 +111,17 @@ import {
98
111
  STN_SIDE_NAV_SUB_ICON
99
112
  } from "./chunk-QIX7SYPC.js";
100
113
  import {
101
- STN_SIZE_INTRO,
102
- STN_SIZE_ROWS,
103
- sizeTokensToJson
104
- } from "./chunk-YI22T66L.js";
114
+ STN_PAGE_ENTER_MOTION_INTRO,
115
+ STN_PAGE_ENTER_MOTION_ROWS,
116
+ STN_PAGE_ENTER_MOTION_USAGE,
117
+ STN_PAGE_ENTER_MOTION_USAGE_HTML
118
+ } from "./chunk-R65PNEWS.js";
105
119
  import {
106
- STN_SIZE_SEMANTIC_INTRO,
107
- STN_SIZE_SEMANTIC_ROWS
108
- } from "./chunk-2FHXIAM3.js";
120
+ STN_PAGINATION_EXAMPLE,
121
+ STN_PAGINATION_FIGMA,
122
+ STN_PAGINATION_INTRO,
123
+ STN_PAGINATION_REACT
124
+ } from "./chunk-PE4ZB5QC.js";
109
125
  import {
110
126
  STN_POPOVER_INTRO,
111
127
  STN_POPOVER_USAGE
@@ -142,9 +158,9 @@ import {
142
158
  radiusSemanticToJson
143
159
  } from "./chunk-I7S5YLB3.js";
144
160
  import {
145
- STN_RADIUS_USECASE_INTRO,
146
- STN_RADIUS_USECASE_ROWS
147
- } from "./chunk-666SNAJT.js";
161
+ STN_LIST_INTRO,
162
+ STN_LIST_SIZES
163
+ } from "./chunk-I2Y7E4TU.js";
148
164
  import {
149
165
  STN_LIST_TABLE_FIGMA,
150
166
  STN_LIST_TABLE_FOOTER_MAX_ACTIONS,
@@ -161,6 +177,10 @@ import {
161
177
  import {
162
178
  STN_MAP_DASHBOARD_OPTION_ROWS
163
179
  } from "./chunk-3DAZMM4T.js";
180
+ import {
181
+ STN_MENU_INTRO,
182
+ STN_MENU_SIZES
183
+ } from "./chunk-7OZGRHFD.js";
164
184
  import {
165
185
  STN_MOTION_CONSTRAINT_ROWS,
166
186
  STN_MOTION_DELAY_ROWS,
@@ -175,19 +195,7 @@ import {
175
195
  import {
176
196
  STN_UI_VERSION,
177
197
  STN_UI_VERSION_LABEL
178
- } from "./chunk-2PIUQUBN.js";
179
- import {
180
- STN_PAGE_ENTER_MOTION_INTRO,
181
- STN_PAGE_ENTER_MOTION_ROWS,
182
- STN_PAGE_ENTER_MOTION_USAGE,
183
- STN_PAGE_ENTER_MOTION_USAGE_HTML
184
- } from "./chunk-R65PNEWS.js";
185
- import {
186
- STN_PAGINATION_EXAMPLE,
187
- STN_PAGINATION_FIGMA,
188
- STN_PAGINATION_INTRO,
189
- STN_PAGINATION_REACT
190
- } from "./chunk-PE4ZB5QC.js";
198
+ } from "./chunk-6RJFVO4M.js";
191
199
  import {
192
200
  STN_HEADER_TITLE_DEMO,
193
201
  STN_HEADER_TITLE_FIGMA,
@@ -266,12 +274,13 @@ import {
266
274
  getButtonStateCell
267
275
  } from "./chunk-ZVBPC3MI.js";
268
276
  import {
277
+ STN_CARD_FOOTER_ALIGNS,
269
278
  STN_CARD_INTRO,
270
279
  STN_CARD_PADDINGS,
271
280
  STN_CARD_RADII,
272
281
  STN_CARD_SEVERITIES,
273
282
  STN_CARD_VARIANTS
274
- } from "./chunk-2VSSPMZ3.js";
283
+ } from "./chunk-R7HPVMSM.js";
275
284
  import {
276
285
  STN_CHART_COLOR_DEFINITIONS,
277
286
  STN_CHART_INTRO,
@@ -334,6 +343,14 @@ import {
334
343
  STN_GRADE_SEMANTIC_ROWS,
335
344
  STN_GRADE_SOURCE
336
345
  } from "./chunk-E26XJXQY.js";
346
+ import {
347
+ STN_TEXT_FIELD_FIGMA,
348
+ STN_TEXT_FIELD_HTML,
349
+ STN_TEXT_FIELD_INTRO,
350
+ STN_TEXT_FIELD_SIZE_ROWS,
351
+ STN_TEXT_FIELD_STATES,
352
+ STN_TEXT_FIELD_USAGE
353
+ } from "./chunk-YJLOIDKY.js";
337
354
  import {
338
355
  STN_TOAST_DEMO_MSG,
339
356
  STN_TOAST_ICON_SLUG,
@@ -405,13 +422,12 @@ import {
405
422
  STN_TABLE_TH_LABEL_FIGMA
406
423
  } from "./chunk-IOBNIUK3.js";
407
424
  import {
408
- STN_TEXT_FIELD_FIGMA,
409
- STN_TEXT_FIELD_HTML,
410
- STN_TEXT_FIELD_INTRO,
411
- STN_TEXT_FIELD_SIZE_ROWS,
412
- STN_TEXT_FIELD_STATES,
413
- STN_TEXT_FIELD_USAGE
414
- } from "./chunk-YJLOIDKY.js";
425
+ STN_SCROLL_FIGMA,
426
+ STN_SCROLL_INTRO,
427
+ STN_SCROLL_SPEC,
428
+ STN_SCROLL_USAGE,
429
+ STN_SCROLL_USAGE_HTML
430
+ } from "./chunk-CHJATVOT.js";
415
431
  import {
416
432
  STN_SEARCH_REQUIREMENT_DEMO_FIELDS,
417
433
  STN_SEARCH_REQUIREMENT_FIGMA,
@@ -442,13 +458,6 @@ import {
442
458
  STN_POPUP_USAGE_HTML,
443
459
  resolveStnPopupSizeFromWidth
444
460
  } from "./chunk-G4SOYIHZ.js";
445
- import {
446
- STN_SCROLL_FIGMA,
447
- STN_SCROLL_INTRO,
448
- STN_SCROLL_SPEC,
449
- STN_SCROLL_USAGE,
450
- STN_SCROLL_USAGE_HTML
451
- } from "./chunk-CHJATVOT.js";
452
461
  import {
453
462
  STN_LOADING_SKELETON_COLORS,
454
463
  STN_LOADING_SKELETON_INTRO,
@@ -627,6 +636,7 @@ export {
627
636
  STN_BUTTON_STATE_STATES,
628
637
  STN_BUTTON_STATE_VARIANTS,
629
638
  STN_BUTTON_VARIANT_MAP,
639
+ STN_CARD_FOOTER_ALIGNS,
630
640
  STN_CARD_INTRO,
631
641
  STN_CARD_PADDINGS,
632
642
  STN_CARD_RADII,
@@ -776,6 +786,8 @@ export {
776
786
  STN_LAYOUT_SLOT_USAGE,
777
787
  STN_LAYOUT_WHEN_TO_USE,
778
788
  STN_LINE_HEIGHT_ROWS,
789
+ STN_LIST_INTRO,
790
+ STN_LIST_SIZES,
779
791
  STN_LIST_TABLE_FIGMA,
780
792
  STN_LIST_TABLE_FOOTER_MAX_ACTIONS,
781
793
  STN_LIST_TABLE_OPTION_ROWS,
@@ -791,6 +803,8 @@ export {
791
803
  STN_LOGIN_INTRO,
792
804
  STN_LOGIN_USAGE,
793
805
  STN_MAP_DASHBOARD_OPTION_ROWS,
806
+ STN_MENU_INTRO,
807
+ STN_MENU_SIZES,
794
808
  STN_MOTION_CONSTRAINT_ROWS,
795
809
  STN_MOTION_DELAY_ROWS,
796
810
  STN_MOTION_DISTANCE_ROWS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stn-uiux/pub-ui",
3
- "version": "0.1.86",
3
+ "version": "0.1.88",
4
4
  "description": "STN Pub design system — tokens, specs, and CSS for product HTML / React apps",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -312,17 +312,3 @@
312
312
  background-color: var(--stn-badge-solid-neutral);
313
313
  color: var(--stn-badge-solid-neutral-fg);
314
314
  }
315
-
316
- /* Inverted / Mono (다크: 흰색 배경 + 검은색 텍스트, 라이트: 검은색 배경 + 흰색 텍스트) */
317
- .stn-badge.inverted,
318
- .stn-badge--color-inverted {
319
- color: var(--stn-topology-badge-bg, var(--stn-neutral-90));
320
- background: var(--stn-opacity-white-10);
321
- }
322
- .stn-badge.solid.inverted,
323
- .stn-badge--solid.stn-badge--color-inverted {
324
- background-color: var(--stn-topology-badge-bg, var(--stn-neutral-90));
325
- color: var(--stn-topology-badge-text, var(--stn-static-white));
326
- border-color: var(--stn-topology-badge-border, var(--stn-elevation-surface-0));
327
- box-shadow: 0 0 8px color-mix(in srgb, var(--stn-topology-badge-bg, var(--stn-neutral-90)) 25%, transparent);
328
- }
@@ -210,4 +210,12 @@
210
210
  padding-top: var(--stn-space-12, 12px);
211
211
  border-top: var(--stn-size-1, 1px) solid var(--stn-card-border-color);
212
212
  margin-top: var(--stn-space-12, 12px);
213
+ box-sizing: border-box;
214
+ width: 100%;
213
215
  }
216
+
217
+ /* Card footer alignment modifiers (right · left · center · between) */
218
+ .stn-card__footer.align-right { justify-content: flex-end; }
219
+ .stn-card__footer.align-left { justify-content: flex-start; }
220
+ .stn-card__footer.align-center { justify-content: center; }
221
+ .stn-card__footer.align-between { justify-content: space-between; }
@@ -124,7 +124,7 @@
124
124
  .stn-drawer--md { --stn-drawer-active-width: var(--stn-drawer-width-md, 480px); --stn-drawer-active-height: var(--stn-drawer-height-md, 480px); }
125
125
  .stn-drawer--lg { --stn-drawer-active-width: var(--stn-drawer-width-lg, 640px); --stn-drawer-active-height: var(--stn-drawer-height-lg, 640px); }
126
126
  .stn-drawer--xl { --stn-drawer-active-width: var(--stn-drawer-width-xl, 800px); --stn-drawer-active-height: var(--stn-drawer-height-xl, 800px); }
127
- .stn-drawer--full { --stn-drawer-active-width: var(--stn-drawer-width-full, min(80vw, 1600px)); --stn-drawer-active-height: var(--stn-drawer-height-full, min(80vh, 900px)); }
127
+ .stn-drawer--full { --stn-drawer-active-width: var(--stn-drawer-width-full, min(96vw, 1920px)); --stn-drawer-active-height: var(--stn-drawer-height-full, min(96vh, 1080px)); }
128
128
 
129
129
  /* ── 6. Header, Body, Footer Subcomponents ── */
130
130
  .stn-drawer__head {
@@ -178,6 +178,12 @@
178
178
  .stn-drawer__body.gap-lg { gap: var(--stn-drawer-gap-lg); }
179
179
  .stn-drawer__body.gap-xl { gap: var(--stn-drawer-gap-xl); }
180
180
 
181
+ /* Drawer Body Surface Tone (.stn-drawer__body--subtle, .stn-drawer--subtle) */
182
+ .stn-drawer--subtle,
183
+ .stn-drawer__body--subtle {
184
+ background-color: var(--stn-drawer-bg-subtle, var(--stn-surface-subtle));
185
+ }
186
+
181
187
  .stn-drawer__footer {
182
188
  display: flex;
183
189
  align-items: center;
@@ -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
+ }