@stn-uiux/pub-ui 0.1.59 → 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 (44) hide show
  1. package/dist/{chunk-36BAGMYT.js → chunk-2ZYBBVBT.js} +53 -28
  2. package/dist/chunk-2ZYBBVBT.js.map +1 -0
  3. package/dist/{chunk-JPILTFLI.js → chunk-3RYAWLME.js} +2 -2
  4. package/dist/{chunk-DNMZJS65.js → chunk-IOBNIUK3.js} +2 -2
  5. package/dist/{chunk-DNMZJS65.js.map → chunk-IOBNIUK3.js.map} +1 -1
  6. package/dist/{chunk-EQTZA7I2.js → chunk-NHYZ7AWK.js} +2 -1
  7. package/dist/{chunk-EQTZA7I2.js.map → chunk-NHYZ7AWK.js.map} +1 -1
  8. package/dist/{chunk-XEG4WDUD.js → chunk-Q4QXONXL.js} +2 -2
  9. package/dist/{chunk-SKZOEF3H.js → chunk-XQ7UUG7Y.js} +2 -2
  10. package/dist/{chunk-H4ZJQ5YW.js → chunk-YMWHZNBT.js} +2 -2
  11. package/dist/cli.js +5 -5
  12. package/dist/data/index.js +7 -7
  13. package/dist/data/stnBreadcrumb.js +3 -3
  14. package/dist/data/stnHeader.js +3 -3
  15. package/dist/data/stnLayout.d.ts +3 -3
  16. package/dist/data/stnLayout.js +1 -1
  17. package/dist/data/stnSideNavItem.js +3 -3
  18. package/dist/data/stnSystemIcons.js +2 -2
  19. package/dist/data/stnSystemIconsData.generated.js +1 -1
  20. package/dist/data/stnTable.d.ts +1 -1
  21. package/dist/data/stnTable.js +1 -1
  22. package/dist/index.js +7 -7
  23. package/package.json +1 -1
  24. package/styles/@assets/svg/system/line/chevron-left.svg +3 -0
  25. package/styles/components/stn-label-prefix.css +1 -0
  26. package/styles/components/stn-popup.css +1 -1
  27. package/styles/components/stn-status.css +3 -5
  28. package/styles/components/stn-table.css +77 -11
  29. package/styles/components/stn-widget.css +16 -8
  30. package/styles/layouts/stn-container.css +6 -11
  31. package/styles/layouts/stn-layer1-content.css +63 -86
  32. package/styles/patterns/stn-section-side.css +16 -30
  33. package/styles/patterns/stn-tree.css +96 -73
  34. package/styles/tokens/stn-colors-semantic.css +2 -2
  35. package/styles/tokens/stn-radius-semantic.css +11 -0
  36. package/styles/tokens/stn-size-semantic.css +31 -4
  37. package/styles/tokens/stn-size.css +2 -0
  38. package/styles/tokens/stn-spacing-semantic.css +7 -3
  39. package/styles/tokens/stn-typography-semantic.css +10 -0
  40. package/dist/chunk-36BAGMYT.js.map +0 -1
  41. /package/dist/{chunk-JPILTFLI.js.map → chunk-3RYAWLME.js.map} +0 -0
  42. /package/dist/{chunk-XEG4WDUD.js.map → chunk-Q4QXONXL.js.map} +0 -0
  43. /package/dist/{chunk-SKZOEF3H.js.map → chunk-XQ7UUG7Y.js.map} +0 -0
  44. /package/dist/{chunk-H4ZJQ5YW.js.map → chunk-YMWHZNBT.js.map} +0 -0
@@ -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,
@@ -316,106 +324,75 @@
316
324
  }
317
325
 
318
326
  /* ==========================================================================
319
- 6. List View Layout (StnContainer + StnStack)
327
+ 6. List view — 모바일/태블릿 반응형 (스크롤 & LNB/테이블 높이)
320
328
  ========================================================================== */
321
- .stn-list-page-container,
322
- .stn-list-view-layout__body {
323
- flex: 1 1 0%;
324
- min-height: 0;
325
- height: 100%;
326
- padding: var(--stn-space-16);
327
- box-sizing: border-box;
328
- overflow: hidden;
329
- container-type: inline-size;
330
- container-name: stn-list-container;
331
- }
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
+ }
332
335
 
333
- .stn-list-page-main,
334
- .stn-list-view__main {
335
- flex: 1 1 0%;
336
- min-height: 0;
337
- height: 100%;
338
- width: 100%;
339
- }
336
+ .stn-layer-1__body .stn-container > .stn-stack {
337
+ height: auto !important;
338
+ min-height: 100%;
339
+ }
340
340
 
341
- .stn-list-page-main > .stn-page-scaffold__lnb,
342
- .stn-list-view__main > .stn-page-scaffold__lnb {
343
- width: var(--stn-list-lnb-width);
344
- flex-shrink: 0;
345
- align-self: stretch;
346
- height: 100%;
347
- min-height: 0;
348
- display: flex;
349
- flex-direction: column;
350
- }
341
+ .stn-list-lnb {
342
+ width: 100% !important;
343
+ max-height: 40vh;
344
+ flex-shrink: 0;
345
+ }
351
346
 
352
- .stn-list-page-content-stack,
353
- .stn-list-view__content-stack {
354
- flex: 1 1 0%;
355
- min-width: 0;
356
- min-height: 0;
357
- height: 100%;
358
- display: flex;
359
- flex-direction: column;
360
- }
347
+ /* 모바일 접힘 시 아코디언 헤더만 표시 */
348
+ .stn-list-lnb.is-collapsed {
349
+ max-height: none;
350
+ width: 100% !important;
351
+ }
361
352
 
362
- .stn-list-page-content-stack > .search_area,
363
- .stn-list-view__content-stack > .search_area {
364
- flex-shrink: 0;
365
- width: 100%;
366
- }
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
+ }
367
358
 
368
- .stn-list-page-content-stack > .content_box,
369
- .stn-list-view__content-stack > .content_box {
370
- flex: 1 1 0%;
371
- min-height: 0;
372
- display: flex;
373
- flex-direction: column;
374
- overflow: hidden;
375
- }
359
+ .stn-list-lnb.is-collapsed .stn-section-side.is-collapsed .stn-scroll {
360
+ display: none !important;
361
+ }
376
362
 
377
- /* ─────────────────────────────────────────────────────────────
378
- * 반응형: 사이드 네비 펼침/접힘 또는 뷰포트 축소로 너비 협소 시 (<= 1024px)
379
- * Tree(LNB Aside)를 좌측에서 상단(Top) 전체 너비로 전환
380
- * 부모 컨테이너 선택자로 상세도를 확보하여 !important 없이 깔끔하게 재정의
381
- * ───────────────────────────────────────────────────────────── */
382
- @container stn-list-container (max-width: 1024px) {
383
- .stn-list-page-container .stn-list-page-main,
384
- .stn-list-view-layout__body .stn-list-view__main {
385
- flex-direction: column;
386
- gap: var(--stn-spacing-list-lnb-gap, var(--stn-space-16));
387
- overflow: hidden;
363
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-title {
364
+ display: flex !important;
388
365
  }
389
366
 
390
- .stn-list-page-container .stn-list-page-main > .stn-page-scaffold__lnb,
391
- .stn-list-view-layout__body .stn-list-view__main > .stn-page-scaffold__lnb {
392
- width: 100%;
393
- max-width: 100%;
394
- height: auto;
395
- max-height: var(--stn-layout-list-tree-top-max-height);
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%;
396
383
  flex-shrink: 0;
397
- align-self: stretch;
398
- overflow: hidden;
384
+ transition: width 0.2s ease;
399
385
  }
400
386
 
401
- .stn-list-page-container .stn-page-scaffold__lnb .stn-section-side,
402
- .stn-list-view-layout__body .stn-page-scaffold__lnb .stn-section-side {
403
- height: auto;
404
- max-height: var(--stn-layout-list-tree-top-max-height);
387
+ .stn-list-lnb.is-collapsed {
388
+ width: var(--stn-list-lnb-collapsed-width);
405
389
  }
406
390
 
407
- .stn-list-page-container .stn-page-scaffold__lnb .stn-section-side__body,
408
- .stn-list-view-layout__body .stn-page-scaffold__lnb .stn-section-side__body {
409
- flex: 1 1 auto;
410
- min-height: 0;
411
- overflow-y: auto;
391
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-title {
392
+ display: none !important;
412
393
  }
413
394
 
414
- .stn-list-page-container .stn-list-page-content-stack,
415
- .stn-list-view-layout__body .stn-list-view__content-stack {
416
- flex: 1 1 0%;
417
- min-height: 0;
418
- width: 100%;
395
+ .stn-list-lnb.is-collapsed .stn-list-lnb__header-row {
396
+ justify-content: center !important;
419
397
  }
420
398
  }
421
-
@@ -53,36 +53,6 @@
53
53
  scrollbar-color: var(--stn-scroll-thumb) var(--stn-scroll-track);
54
54
  }
55
55
 
56
- .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar,
57
- .stn-section-side > .stn-scroll::-webkit-scrollbar {
58
- width: var(--stn-scroll-width-thin, 4px);
59
- height: var(--stn-scroll-width-thin, 4px);
60
- background: var(--stn-scroll-track);
61
- }
62
-
63
- .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-track,
64
- .stn-section-side > .stn-scroll::-webkit-scrollbar-track {
65
- background: var(--stn-scroll-track);
66
- }
67
-
68
- .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-thumb,
69
- .stn-section-side > .stn-scroll::-webkit-scrollbar-thumb {
70
- background: var(--stn-scroll-thumb);
71
- border-radius: var(--stn-scroll-radius-thin, 2px);
72
- }
73
-
74
- .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-thumb:hover,
75
- .stn-section-side > .stn-scroll::-webkit-scrollbar-thumb:hover {
76
- background: var(--stn-scroll-thumb-hover);
77
- }
78
-
79
- /* OS 기본 화살표 버튼(arrow) 완전 숨김 */
80
- .stn-section-side > .stn-section-side__body.stn-scroll::-webkit-scrollbar-button,
81
- .stn-section-side > .stn-scroll::-webkit-scrollbar-button {
82
- display: none !important;
83
- width: 0 !important;
84
- height: 0 !important;
85
- }
86
56
 
87
57
 
88
58
  /* 상단 고정 헤더 (제목, 탭, 검색바 등) */
@@ -104,3 +74,19 @@
104
74
  padding-top: var(--stn-space-8, 8px);
105
75
  border-top: 1px solid var(--stn-border-subtle, rgba(255, 255, 255, 0.08));
106
76
  }
77
+
78
+ /* ─────────────────────────────────────────────────────────────
79
+ * 접힌 상태 (레일 모드 — 너비 56px)
80
+ * ───────────────────────────────────────────────────────────── */
81
+ .stn-section-side.is-collapsed {
82
+ width: var(--stn-list-lnb-collapsed-width);
83
+ min-width: var(--stn-list-lnb-collapsed-width);
84
+ padding: var(--stn-space-8) var(--stn-space-4);
85
+ transition: width 0.2s ease;
86
+ }
87
+
88
+ .stn-section-side.is-collapsed .stn-section-side__header {
89
+ align-items: center;
90
+ margin-bottom: var(--stn-space-8);
91
+ }
92
+
@@ -13,13 +13,13 @@
13
13
  .stn-tree__heading {
14
14
  display: flex;
15
15
  align-items: center;
16
- min-height: 24px;
16
+ min-height: var(--stn-tree-row-height);
17
17
  margin: 0;
18
18
  padding: 0 var(--stn-spacing-tree-label-pad-inline);
19
19
  color: var(--stn-tree-heading);
20
- font-size: var(--stn-text-body-small-size);
21
- font-weight: var(--stn-font-weight-bold, 700);
22
- line-height: 1;
20
+ font-size: var(--stn-tree-heading-font-size);
21
+ font-weight: var(--stn-tree-heading-font-weight);
22
+ line-height: var(--stn-tree-heading-line-height);
23
23
  }
24
24
 
25
25
  .stn-tree__rows {
@@ -32,19 +32,21 @@
32
32
  .stn-tree__row {
33
33
  display: flex;
34
34
  align-items: center;
35
- min-height: 24px;
35
+ min-height: var(--stn-tree-row-height);
36
36
  width: 100%;
37
- border-radius: var(--stn-radius-4, 4px);
38
- border: 1px solid transparent;
37
+ border-radius: var(--stn-radius-tree-row);
38
+ border: var(--stn-tree-border-width) solid transparent;
39
39
  box-sizing: border-box;
40
40
  cursor: pointer;
41
41
  user-select: none;
42
- transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
42
+ transition: background-color var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out),
43
+ border-color var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out),
44
+ box-shadow var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
43
45
  }
44
46
 
45
47
  .stn-tree__row:focus-visible {
46
- outline: 2px solid var(--stn-tree-focus);
47
- outline-offset: 1px;
48
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
49
+ outline-offset: var(--stn-tree-focus-ring-offset);
48
50
  }
49
51
 
50
52
  /* Interaction — selected 토큰 · hover/pressed는 selected의 약한/강한 면 */
@@ -70,11 +72,11 @@
70
72
  .stn-tree__cell {
71
73
  box-sizing: border-box;
72
74
  display: inline-flex;
73
- flex: 0 0 24px;
75
+ flex: 0 0 var(--stn-tree-cell-size);
74
76
  align-items: center;
75
77
  justify-content: center;
76
- width: 24px;
77
- height: 24px;
78
+ width: var(--stn-tree-cell-size);
79
+ height: var(--stn-tree-cell-size);
78
80
  }
79
81
 
80
82
  .stn-tree__cell--blank {
@@ -83,19 +85,19 @@
83
85
  }
84
86
 
85
87
  .stn-tree__cell--icon {
86
- flex-basis: 24px;
88
+ flex-basis: var(--stn-tree-cell-size);
87
89
  }
88
90
 
89
91
  .stn-tree__guide {
90
92
  display: block;
91
- width: 24px;
92
- height: 24px;
93
+ width: var(--stn-tree-guide-size);
94
+ height: var(--stn-tree-guide-size);
93
95
  }
94
96
 
95
97
  .stn-tree__guide-glyph {
96
98
  display: block;
97
- width: 24px;
98
- height: 24px;
99
+ width: var(--stn-tree-guide-size);
100
+ height: var(--stn-tree-guide-size);
99
101
  background-color: var(--stn-tree-guide);
100
102
  mask-position: center;
101
103
  mask-size: contain;
@@ -107,8 +109,8 @@
107
109
 
108
110
  .stn-tree__chevron-glyph {
109
111
  display: block;
110
- width: 12px;
111
- height: 12px;
112
+ width: var(--stn-tree-chevron-size);
113
+ height: var(--stn-tree-chevron-size);
112
114
  background-color: var(--stn-tree-chevron);
113
115
  mask-position: center;
114
116
  mask-size: contain;
@@ -117,7 +119,7 @@
117
119
  -webkit-mask-size: contain;
118
120
  -webkit-mask-repeat: no-repeat;
119
121
  transform: rotate(180deg);
120
- transition: transform 0.15s ease;
122
+ transition: transform var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
121
123
  }
122
124
 
123
125
  .stn-tree__chevron-glyph.is-expanded {
@@ -133,21 +135,21 @@
133
135
  }
134
136
 
135
137
  .stn-tree__toggle:focus-visible {
136
- outline: 2px solid var(--stn-tree-focus);
137
- outline-offset: 1px;
138
- border-radius: 2px;
138
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
139
+ outline-offset: var(--stn-tree-focus-ring-offset);
140
+ border-radius: var(--stn-radius-tree-toggle-focus);
139
141
  }
140
142
 
141
143
  .stn-tree__chevron {
142
144
  display: block;
143
- width: 12px;
144
- height: 12px;
145
+ width: var(--stn-tree-chevron-size);
146
+ height: var(--stn-tree-chevron-size);
145
147
  }
146
148
 
147
149
  .stn-tree__icon-glyph {
148
150
  display: block;
149
- width: 16px;
150
- height: 16px;
151
+ width: var(--stn-tree-icon-size);
152
+ height: var(--stn-tree-icon-size);
151
153
  mask-position: center;
152
154
  mask-size: contain;
153
155
  mask-repeat: no-repeat;
@@ -174,8 +176,8 @@
174
176
  }
175
177
 
176
178
  .stn-tree__icon--server .stn-tree__icon-glyph {
177
- width: 16px;
178
- height: 16px;
179
+ width: var(--stn-tree-icon-size);
180
+ height: var(--stn-tree-icon-size);
179
181
  }
180
182
 
181
183
  /* fill/server_2 — 본색 SVG. 다크 invert 제외(stn-pub-icon--color) */
@@ -205,14 +207,14 @@
205
207
  overflow: hidden;
206
208
  text-overflow: ellipsis;
207
209
  white-space: nowrap;
208
- font-size: var(--stn-text-body-medium-size);
209
- font-weight: var(--stn-font-weight-regular);
210
- line-height: 1;
210
+ font-size: var(--stn-tree-label-font-size);
211
+ font-weight: var(--stn-tree-label-font-weight);
212
+ line-height: var(--stn-tree-label-line-height);
211
213
  }
212
214
 
213
215
  .stn-tree__row.is-bold .stn-tree__label,
214
216
  .stn-tree__label.is-bold {
215
- font-weight: var(--stn-font-weight-bold, 700);
217
+ font-weight: var(--stn-tree-label-font-weight-bold);
216
218
  }
217
219
 
218
220
  .stn-tree__row--root .stn-tree__label {
@@ -264,24 +266,24 @@
264
266
  /* ── 너비 규격 수식어 (Tree 권장 표준 규격: w80~w240, full) ──
265
267
  * STN 표준 규격: .w80, .w100, .w120, .w140, .w160, .w180, .w200, .w220, .w240, .full
266
268
  * ──────────────────────────────────────────────────────── */
267
- .stn-tree.w80 { width: var(--stn-size-80, 80px); }
268
- .stn-tree.w100 { width: var(--stn-size-100, 100px); }
269
- .stn-tree.w120 { width: var(--stn-size-120, 120px); }
270
- .stn-tree.w140 { width: var(--stn-size-140, 140px); }
271
- .stn-tree.w160 { width: var(--stn-size-160, 160px); }
272
- .stn-tree.w180 { width: var(--stn-size-180, 180px); }
273
- .stn-tree.w200 { width: var(--stn-size-200, 200px); }
274
- .stn-tree.w220 { width: var(--stn-size-220, 220px); }
275
- .stn-tree.w240 { width: var(--stn-size-240, 240px); }
269
+ .stn-tree.w80 { width: var(--stn-size-80); }
270
+ .stn-tree.w100 { width: var(--stn-size-100); }
271
+ .stn-tree.w120 { width: var(--stn-size-120); }
272
+ .stn-tree.w140 { width: var(--stn-size-140); }
273
+ .stn-tree.w160 { width: var(--stn-size-160); }
274
+ .stn-tree.w180 { width: var(--stn-size-180); }
275
+ .stn-tree.w200 { width: var(--stn-size-200); }
276
+ .stn-tree.w220 { width: var(--stn-size-220); }
277
+ .stn-tree.w240 { width: var(--stn-size-240); }
276
278
  .stn-tree.full { width: 100%; }
277
279
 
278
280
  /* ── 선택/호버 테두리 곡률 수식어 (Border Radius) ────────────
279
281
  * radius prop → .radius-none, .radius-sm, .radius-md, .radius-full
280
282
  * ──────────────────────────────────────────────────────── */
281
- .stn-tree.radius-none .stn-tree__row { border-radius: var(--stn-radius-0, 0px); }
282
- .stn-tree.radius-sm .stn-tree__row { border-radius: var(--stn-radius-4, 4px); }
283
- .stn-tree.radius-md .stn-tree__row { border-radius: var(--stn-radius-8, 8px); }
284
- .stn-tree.radius-full .stn-tree__row { border-radius: var(--stn-radius-circle, 9999px); }
283
+ .stn-tree.radius-none .stn-tree__row { border-radius: var(--stn-radius-tree-row-none); }
284
+ .stn-tree.radius-sm .stn-tree__row { border-radius: var(--stn-radius-tree-row-sm); }
285
+ .stn-tree.radius-md .stn-tree__row { border-radius: var(--stn-radius-tree-row-md); }
286
+ .stn-tree.radius-full .stn-tree__row { border-radius: var(--stn-radius-tree-row-full); }
285
287
 
286
288
  /* ── 가시성(눈) 토글 버튼 및 숨김 상태 ──────────────────────
287
289
  * showVisibilityToggle={true} 일 때 행 우측 끝에 표시됩니다.
@@ -291,16 +293,16 @@
291
293
  align-items: center;
292
294
  justify-content: center;
293
295
  margin-left: auto;
294
- margin-right: var(--stn-space-4, 4px);
296
+ margin-right: var(--stn-tree-visibility-btn-margin-inline-end);
295
297
  padding: 0;
296
- width: 20px;
297
- height: 20px;
298
+ width: var(--stn-tree-visibility-btn-size);
299
+ height: var(--stn-tree-visibility-btn-size);
298
300
  border: none;
299
301
  background: transparent;
300
302
  cursor: pointer;
301
- border-radius: var(--stn-radius-2, 2px);
303
+ border-radius: var(--stn-radius-tree-visibility-btn);
302
304
  opacity: 0.7;
303
- transition: opacity 0.15s ease;
305
+ transition: opacity var(--stn-motion-duration-fast) var(--stn-motion-ease-ease-out);
304
306
  }
305
307
 
306
308
  .stn-tree__visibility-btn:hover {
@@ -308,15 +310,15 @@
308
310
  }
309
311
 
310
312
  .stn-tree__visibility-btn:focus-visible {
311
- outline: 2px solid var(--stn-tree-focus);
312
- outline-offset: 1px;
313
+ outline: var(--stn-tree-focus-ring-width) solid var(--stn-tree-focus);
314
+ outline-offset: var(--stn-tree-focus-ring-offset);
313
315
  }
314
316
 
315
317
  .stn-tree__visibility-glyph {
316
318
  display: block;
317
- width: 14px;
318
- height: 14px;
319
- background-color: var(--stn-text-tertiary, #8b93a1);
319
+ width: var(--stn-tree-visibility-icon-size);
320
+ height: var(--stn-tree-visibility-icon-size);
321
+ background-color: var(--stn-text-tertiary);
320
322
  mask-position: center;
321
323
  mask-size: contain;
322
324
  mask-repeat: no-repeat;
@@ -326,7 +328,7 @@
326
328
  }
327
329
 
328
330
  .stn-tree__visibility-glyph.is-off {
329
- background-color: var(--stn-text-disabled, #a0aec0);
331
+ background-color: var(--stn-text-disabled);
330
332
  }
331
333
 
332
334
  /* 숨김/미사용 처리된 노드 — 텍스트/아이콘 반투명(dimmed) */
@@ -343,12 +345,12 @@
343
345
  align-items: center;
344
346
  justify-content: center;
345
347
  font-family: var(--stn-font-number, var(--stn-font-body));
346
- font-size: var(--stn-font-size-11, 11px);
347
- font-weight: var(--stn-font-weight-medium, 500);
348
- line-height: 1;
349
- color: var(--stn-text-tertiary, var(--stn-gray-400));
348
+ font-size: var(--stn-tree-count-font-size);
349
+ font-weight: var(--stn-tree-count-font-weight);
350
+ line-height: var(--stn-tree-count-line-height);
351
+ color: var(--stn-text-tertiary);
350
352
  margin-left: auto;
351
- margin-right: var(--stn-space-6, 6px);
353
+ margin-right: var(--stn-tree-count-margin-inline-end);
352
354
  flex-shrink: 0;
353
355
  }
354
356
 
@@ -371,16 +373,16 @@
371
373
  * ──────────────────────────────────────────────────────── */
372
374
 
373
375
  /* xs — 20px: 초밀집 사이드바 목록 */
374
- .stn-tree.xs .stn-tree__row { min-height: 20px; }
375
- .stn-tree.xs .stn-tree__cell { height: 20px; }
376
+ .stn-tree.xs .stn-tree__row { min-height: var(--stn-tree-row-height-xs); }
377
+ .stn-tree.xs .stn-tree__cell { height: var(--stn-tree-row-height-xs); }
376
378
 
377
379
  /* sm — 24px: 기본 콤팩트 */
378
- .stn-tree.sm .stn-tree__row { min-height: 24px; }
379
- .stn-tree.sm .stn-tree__cell { height: 24px; }
380
+ .stn-tree.sm .stn-tree__row { min-height: var(--stn-tree-row-height-sm); }
381
+ .stn-tree.sm .stn-tree__cell { height: var(--stn-tree-row-height-sm); }
380
382
 
381
383
  /* md — 32px: comfortable */
382
- .stn-tree.md .stn-tree__row { min-height: 32px; }
383
- .stn-tree.md .stn-tree__cell { height: 32px; }
384
+ .stn-tree.md .stn-tree__row { min-height: var(--stn-tree-row-height-md); }
385
+ .stn-tree.md .stn-tree__cell { height: var(--stn-tree-row-height-md); }
384
386
  .stn-tree.md .stn-tree__cell--guide {
385
387
  align-self: stretch;
386
388
  height: auto;
@@ -392,8 +394,8 @@
392
394
  }
393
395
 
394
396
  /* lg — 40px: spacious */
395
- .stn-tree.lg .stn-tree__row { min-height: 40px; }
396
- .stn-tree.lg .stn-tree__cell { height: 40px; }
397
+ .stn-tree.lg .stn-tree__row { min-height: var(--stn-tree-row-height-lg); }
398
+ .stn-tree.lg .stn-tree__cell { height: var(--stn-tree-row-height-lg); }
397
399
  .stn-tree.lg .stn-tree__cell--guide {
398
400
  align-self: stretch;
399
401
  height: auto;
@@ -405,8 +407,8 @@
405
407
  }
406
408
 
407
409
  /* xl — 48px: extra spacious */
408
- .stn-tree.xl .stn-tree__row { min-height: 48px; }
409
- .stn-tree.xl .stn-tree__cell { height: 48px; }
410
+ .stn-tree.xl .stn-tree__row { min-height: var(--stn-tree-row-height-xl); }
411
+ .stn-tree.xl .stn-tree__cell { height: var(--stn-tree-row-height-xl); }
410
412
  .stn-tree.xl .stn-tree__cell--guide {
411
413
  align-self: stretch;
412
414
  height: auto;
@@ -416,3 +418,24 @@
416
418
  mask-size: 100% 100%;
417
419
  -webkit-mask-size: 100% 100%;
418
420
  }
421
+
422
+ /* ── 접힌 레일 모드 (.is-collapsed) ─────────────────────────
423
+ * collapsed prop → LNB 축소 레일 모드 시 아이콘만 세로 중앙 정렬
424
+ * ──────────────────────────────────────────────────────── */
425
+ .stn-tree.is-collapsed .stn-tree__heading,
426
+ .stn-tree.is-collapsed .stn-tree__cell:not(.stn-tree__cell--icon),
427
+ .stn-tree.is-collapsed .stn-tree__label,
428
+ .stn-tree.is-collapsed .stn-tree__count,
429
+ .stn-tree.is-collapsed .stn-tree__visibility-btn {
430
+ display: none;
431
+ }
432
+
433
+ .stn-tree.is-collapsed .stn-tree__row {
434
+ justify-content: center;
435
+ padding: var(--stn-tree-collapsed-row-padding-block) 0;
436
+ min-height: var(--stn-tree-collapsed-row-height);
437
+ }
438
+
439
+ .stn-tree.is-collapsed .stn-tree__cell--icon {
440
+ margin: 0 auto;
441
+ }
@@ -135,7 +135,7 @@
135
135
  --stn-table-pill-shadow: 1px 1px 4px color-mix(in srgb, var(--stn-static-black) 10%, transparent);
136
136
  --stn-table-row-hover: var(--stn-gray-900);
137
137
  --stn-table-td-fg: var(--stn-gray-50);
138
- --stn-table-th-bg: var(--stn-opacity-white-5);
138
+ --stn-table-th-bg: var(--stn-gray-800);
139
139
  --stn-table-th-fg: var(--stn-gray-350);
140
140
  --stn-table-th-radius: 8px;
141
141
  --stn-pagination-active-bg: var(--stn-opacity-white-10);
@@ -704,7 +704,7 @@
704
704
  --stn-table-pill-shadow: 1px 1px 2px color-mix(in srgb, var(--stn-static-black) 10%, transparent);
705
705
  --stn-table-row-hover: var(--stn-gray-25);
706
706
  --stn-table-td-fg: var(--stn-gray-750);
707
- --stn-table-th-bg: var(--stn-opacity-black-5);
707
+ --stn-table-th-bg: var(--stn-gray-50);
708
708
  --stn-table-th-fg: var(--stn-gray-700);
709
709
  --stn-table-th-radius: 4px;
710
710
  --stn-pagination-active-bg: var(--stn-opacity-black-5);
@@ -57,6 +57,10 @@
57
57
  --stn-side-nav-mobile-trigger-radius: var(--stn-radius-8);
58
58
  --stn-side-nav-drawer-close-radius: var(--stn-radius-6);
59
59
  --stn-side-nav-scroll-radius: var(--stn-radius-2);
60
+ --stn-scroll-radius: var(--stn-radius-4);
61
+ --stn-scroll-radius-thin: var(--stn-radius-2);
62
+ --stn-scroll-radius-default: var(--stn-radius-4);
63
+ --stn-scroll-radius-thick: var(--stn-radius-6);
60
64
  --stn-radius-badge: var(--stn-radius-8);
61
65
  --stn-skeleton-radius-sm: var(--stn-radius-4);
62
66
  --stn-skeleton-radius-md: var(--stn-radius-8);
@@ -68,4 +72,11 @@
68
72
  --stn-widget-appearance-radius: var(--stn-radius-8);
69
73
  --stn-widget-scrollbar-radius: var(--stn-radius-4);
70
74
  --stn-search-requirement-radius: var(--stn-radius-8);
75
+ --stn-radius-tree-row: var(--stn-radius-4);
76
+ --stn-radius-tree-row-none: var(--stn-radius-0);
77
+ --stn-radius-tree-row-sm: var(--stn-radius-4);
78
+ --stn-radius-tree-row-md: var(--stn-radius-8);
79
+ --stn-radius-tree-row-full: var(--stn-radius-circle);
80
+ --stn-radius-tree-toggle-focus: var(--stn-radius-2);
81
+ --stn-radius-tree-visibility-btn: var(--stn-radius-2);
71
82
  }