@stn-uiux/pub-ui 0.1.69 → 0.1.70

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.
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-7ONB2WVN.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-O77GW7PM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/cli.js CHANGED
@@ -1,3 +1,6 @@
1
+ import {
2
+ STN_TEXT_FIELD_USAGE
3
+ } from "./chunk-NB4NJQYE.js";
1
4
  import {
2
5
  STN_TOAST_REACT_USAGE
3
6
  } from "./chunk-SOEBXG3T.js";
@@ -11,9 +14,6 @@ import {
11
14
  import {
12
15
  STN_TABLE_REACT_EXAMPLE
13
16
  } from "./chunk-IOBNIUK3.js";
14
- import {
15
- STN_TEXT_FIELD_USAGE
16
- } from "./chunk-NB4NJQYE.js";
17
17
  import {
18
18
  STN_SIDE_NAVIGATION_USAGE,
19
19
  STN_SIDE_NAV_ITEM_USAGE
@@ -64,4 +64,6 @@ export { STN_FONT_FAMILY_ROWS, STN_FONT_SIZE_ROWS, STN_FONT_WEIGHT_ROWS, STN_LIN
64
64
  export { STN_CARD_INTRO, STN_CARD_PADDINGS, STN_CARD_RADII, STN_CARD_VARIANTS, StnCardPadding, StnCardRadius, StnCardVariant } from './stnCard.js';
65
65
  export { STN_ALERT_CENTER_DASHBOARD_USAGE, STN_ALERT_CENTER_DASHBOARD_WIDGETS, STN_WIDGET_APPEARANCE_ROWS, STN_WIDGET_CHART_SLOT_HTML, STN_WIDGET_CHART_SLOT_REACT, STN_WIDGET_DISABILITY_STATUS_DEMO, STN_WIDGET_FIGMA, STN_WIDGET_FIGMA_DARK, STN_WIDGET_FIGMA_DARK_URL, STN_WIDGET_FIGMA_SHELL_HTML, STN_WIDGET_FIGMA_SHELL_REACT, STN_WIDGET_FIGMA_URL, STN_WIDGET_GRADE_ROW_DEMO, STN_WIDGET_HEADER_HTML, STN_WIDGET_HEADER_REACT, STN_WIDGET_INTRO, STN_WIDGET_KINDS, STN_WIDGET_SHELL_ROWS, STN_WIDGET_TOP5_BARS_DEMO, STN_WIDGET_TRAFFIC_BARS_DEMO, STN_WIDGET_USAGE, STN_WIDGET_USAGE_HTML, StnWidgetAppearance, StnWidgetAppearanceLegacy, StnWidgetAppearanceShell, StnWidgetAssetId, StnWidgetBackgroundMode, StnWidgetContentFamily, StnWidgetGradeRowGrade, StnWidgetKind, StnWidgetKindBodySlot, StnWidgetKindPreview, StnWidgetShell, buildStnWidgetKindUsage, getStnWidgetKind, isStnWidgetKindSlug, normalizeStnWidgetAppearance, resolveStnWidgetBackground, resolveStnWidgetKindAppearance, resolveStnWidgetKindBodySlot, stnWidgetSampleUrl } from './stnWidget.js';
66
66
  export { STN_STATUS_DEMO_STEPS, StnStatusDotState, StnStatusFlowStep, StnStatusFlowStepColor } from './stnStatus.js';
67
+ export { StnTabIconPosition, StnTabIconSize, StnTabItem, StnTabPanelPadding, StnTabScrollButtons, StnTabsSize, StnTabsVariant } from './stnTabs.js';
67
68
  export { SYSTEM_ICON_DATA_URLS } from './stnSystemIconsData.generated.js';
69
+ import 'react';
@@ -1,4 +1,4 @@
1
- import "../chunk-AVICAV6Z.js";
1
+ import "../chunk-O77GW7PM.js";
2
2
  import {
3
3
  STN_TOGGLE_BUTTON_PLAYGROUND_DEFAULT,
4
4
  STN_TOGGLE_BUTTON_PLAYGROUND_INTRO,
@@ -32,6 +32,7 @@ import {
32
32
  import {
33
33
  STN_STATUS_DEMO_STEPS
34
34
  } from "../chunk-SQJPE6HH.js";
35
+ import "../chunk-7ONB2WVN.js";
35
36
  import {
36
37
  STN_TEXT_AREA_HTML,
37
38
  STN_TEXT_AREA_INTRO,
@@ -290,6 +291,14 @@ import {
290
291
  STN_GRADE_SEMANTIC_ROWS,
291
292
  STN_GRADE_SOURCE
292
293
  } from "../chunk-E26XJXQY.js";
294
+ import {
295
+ STN_TEXT_FIELD_FIGMA,
296
+ STN_TEXT_FIELD_HTML,
297
+ STN_TEXT_FIELD_INTRO,
298
+ STN_TEXT_FIELD_SIZE_ROWS,
299
+ STN_TEXT_FIELD_STATES,
300
+ STN_TEXT_FIELD_USAGE
301
+ } from "../chunk-NB4NJQYE.js";
293
302
  import {
294
303
  STN_TOAST_DEMO_MSG,
295
304
  STN_TOAST_ICON_SLUG,
@@ -360,14 +369,6 @@ import {
360
369
  STN_TABLE_TH_CHECK_FIGMA,
361
370
  STN_TABLE_TH_LABEL_FIGMA
362
371
  } from "../chunk-IOBNIUK3.js";
363
- import {
364
- STN_TEXT_FIELD_FIGMA,
365
- STN_TEXT_FIELD_HTML,
366
- STN_TEXT_FIELD_INTRO,
367
- STN_TEXT_FIELD_SIZE_ROWS,
368
- STN_TEXT_FIELD_STATES,
369
- STN_TEXT_FIELD_USAGE
370
- } from "../chunk-NB4NJQYE.js";
371
372
  import {
372
373
  STN_SIDE_NAVIGATION_INTRO,
373
374
  STN_SIDE_NAVIGATION_USAGE,
@@ -0,0 +1,26 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ /**
4
+ * STN Tabs Data and Type Definitions
5
+ */
6
+
7
+ type StnTabsSize = 'sm' | 'md' | 'lg';
8
+ type StnTabsVariant = 'line';
9
+ type StnTabScrollButtons = 'auto' | boolean;
10
+ type StnTabIconPosition = 'start' | 'end' | 'top' | 'bottom';
11
+ type StnTabIconSize = number | 'sm' | 'md' | 'lg';
12
+ interface StnTabItem {
13
+ value: string | number;
14
+ label?: ReactNode;
15
+ icon?: ReactNode;
16
+ iconPosition?: StnTabIconPosition;
17
+ iconSize?: StnTabIconSize;
18
+ badge?: ReactNode;
19
+ count?: number | string;
20
+ disabled?: boolean;
21
+ wrapped?: boolean;
22
+ tooltip?: ReactNode;
23
+ }
24
+ type StnTabPanelPadding = 'none' | 'sm' | 'md' | 'lg';
25
+
26
+ export type { StnTabIconPosition, StnTabIconSize, StnTabItem, StnTabPanelPadding, StnTabScrollButtons, StnTabsSize, StnTabsVariant };
@@ -0,0 +1,2 @@
1
+ import "../chunk-7ONB2WVN.js";
2
+ //# sourceMappingURL=stnTabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.d.ts CHANGED
@@ -64,5 +64,7 @@ export { STN_FONT_FAMILY_ROWS, STN_FONT_SIZE_ROWS, STN_FONT_WEIGHT_ROWS, STN_LIN
64
64
  export { STN_CARD_INTRO, STN_CARD_PADDINGS, STN_CARD_RADII, STN_CARD_VARIANTS, StnCardPadding, StnCardRadius, StnCardVariant } from './data/stnCard.js';
65
65
  export { STN_ALERT_CENTER_DASHBOARD_USAGE, STN_ALERT_CENTER_DASHBOARD_WIDGETS, STN_WIDGET_APPEARANCE_ROWS, STN_WIDGET_CHART_SLOT_HTML, STN_WIDGET_CHART_SLOT_REACT, STN_WIDGET_DISABILITY_STATUS_DEMO, STN_WIDGET_FIGMA, STN_WIDGET_FIGMA_DARK, STN_WIDGET_FIGMA_DARK_URL, STN_WIDGET_FIGMA_SHELL_HTML, STN_WIDGET_FIGMA_SHELL_REACT, STN_WIDGET_FIGMA_URL, STN_WIDGET_GRADE_ROW_DEMO, STN_WIDGET_HEADER_HTML, STN_WIDGET_HEADER_REACT, STN_WIDGET_INTRO, STN_WIDGET_KINDS, STN_WIDGET_SHELL_ROWS, STN_WIDGET_TOP5_BARS_DEMO, STN_WIDGET_TRAFFIC_BARS_DEMO, STN_WIDGET_USAGE, STN_WIDGET_USAGE_HTML, StnWidgetAppearance, StnWidgetAppearanceLegacy, StnWidgetAppearanceShell, StnWidgetAssetId, StnWidgetBackgroundMode, StnWidgetContentFamily, StnWidgetGradeRowGrade, StnWidgetKind, StnWidgetKindBodySlot, StnWidgetKindPreview, StnWidgetShell, buildStnWidgetKindUsage, getStnWidgetKind, isStnWidgetKindSlug, normalizeStnWidgetAppearance, resolveStnWidgetBackground, resolveStnWidgetKindAppearance, resolveStnWidgetKindBodySlot, stnWidgetSampleUrl } from './data/stnWidget.js';
66
66
  export { STN_STATUS_DEMO_STEPS, StnStatusDotState, StnStatusFlowStep, StnStatusFlowStepColor } from './data/stnStatus.js';
67
+ export { StnTabIconPosition, StnTabIconSize, StnTabItem, StnTabPanelPadding, StnTabScrollButtons, StnTabsSize, StnTabsVariant } from './data/stnTabs.js';
67
68
  export { STN_UI_CATALOG, STN_UI_COMPONENTS, STN_UI_FOUNDATIONS, StnUiComponentId, StnUiEntry, StnUiFoundationId } from './components.js';
68
69
  export { SYSTEM_ICON_DATA_URLS } from './data/stnSystemIconsData.generated.js';
70
+ import 'react';
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  STN_UI_COMPONENTS,
4
4
  STN_UI_FOUNDATIONS
5
5
  } from "./chunk-N46UQH6L.js";
6
- import "./chunk-AVICAV6Z.js";
6
+ import "./chunk-O77GW7PM.js";
7
7
  import {
8
8
  STN_TOGGLE_BUTTON_PLAYGROUND_DEFAULT,
9
9
  STN_TOGGLE_BUTTON_PLAYGROUND_INTRO,
@@ -37,6 +37,7 @@ import {
37
37
  import {
38
38
  STN_STATUS_DEMO_STEPS
39
39
  } from "./chunk-SQJPE6HH.js";
40
+ import "./chunk-7ONB2WVN.js";
40
41
  import {
41
42
  STN_TEXT_AREA_HTML,
42
43
  STN_TEXT_AREA_INTRO,
@@ -295,6 +296,14 @@ import {
295
296
  STN_GRADE_SEMANTIC_ROWS,
296
297
  STN_GRADE_SOURCE
297
298
  } from "./chunk-E26XJXQY.js";
299
+ import {
300
+ STN_TEXT_FIELD_FIGMA,
301
+ STN_TEXT_FIELD_HTML,
302
+ STN_TEXT_FIELD_INTRO,
303
+ STN_TEXT_FIELD_SIZE_ROWS,
304
+ STN_TEXT_FIELD_STATES,
305
+ STN_TEXT_FIELD_USAGE
306
+ } from "./chunk-NB4NJQYE.js";
298
307
  import {
299
308
  STN_TOAST_DEMO_MSG,
300
309
  STN_TOAST_ICON_SLUG,
@@ -365,14 +374,6 @@ import {
365
374
  STN_TABLE_TH_CHECK_FIGMA,
366
375
  STN_TABLE_TH_LABEL_FIGMA
367
376
  } from "./chunk-IOBNIUK3.js";
368
- import {
369
- STN_TEXT_FIELD_FIGMA,
370
- STN_TEXT_FIELD_HTML,
371
- STN_TEXT_FIELD_INTRO,
372
- STN_TEXT_FIELD_SIZE_ROWS,
373
- STN_TEXT_FIELD_STATES,
374
- STN_TEXT_FIELD_USAGE
375
- } from "./chunk-NB4NJQYE.js";
376
377
  import {
377
378
  STN_SIDE_NAVIGATION_INTRO,
378
379
  STN_SIDE_NAVIGATION_USAGE,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stn-uiux/pub-ui",
3
- "version": "0.1.69",
3
+ "version": "0.1.70",
4
4
  "description": "STN Pub design system — tokens, specs, and CSS for product HTML / React apps",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -0,0 +1,412 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * StnTabs — 탭 내비게이션 (Tabs, Tab, TabPanel)
4
+ *
5
+ * Classes:
6
+ * - Container: `.stn-tabs`
7
+ * - Scroll area: `.stn-tabs__scroller`
8
+ * - Tab List: `.stn-tabs__list`
9
+ * - Tab item: `.stn-tab`
10
+ * - Floating indicator: `.stn-tabs__indicator`
11
+ * - Scroll buttons: `.stn-tabs__scroll-button`
12
+ * - Panel: `.stn-tab-panel`
13
+ *
14
+ * Variants:
15
+ * - `line` (기본): 하단 2px 밑줄 인디케이터가 부드럽게 이동
16
+ *
17
+ * Sizes:
18
+ * - `sm`: height 32px, font 12px
19
+ * - `md` (기본): height 38px, font 13px
20
+ * - `lg`: height 44px, font 14px
21
+ */
22
+
23
+ /* ==========================================================================
24
+ 1. StnTabs Container
25
+ ========================================================================== */
26
+ .stn-tabs {
27
+ position: relative;
28
+ display: flex;
29
+ align-items: center;
30
+ width: 100%;
31
+ box-sizing: border-box;
32
+ user-select: none;
33
+ background-color: transparent;
34
+ border-bottom: 1px solid var(--stn-border-subtle);
35
+ transition: background-color 0.2s ease, border-color 0.2s ease;
36
+ }
37
+
38
+ .stn-tabs.line {
39
+ border-bottom: 1px solid var(--stn-border-subtle);
40
+ }
41
+
42
+ /* Full Width (stretch tabs) */
43
+ .stn-tabs.full .stn-tabs__list {
44
+ width: 100%;
45
+ }
46
+ .stn-tabs.full .stn-tab {
47
+ flex: 1 1 0%;
48
+ text-align: center;
49
+ justify-content: center;
50
+ }
51
+
52
+ /* Centered Tabs */
53
+ .stn-tabs.centered .stn-tabs__list {
54
+ justify-content: center;
55
+ }
56
+
57
+ /* ==========================================================================
58
+ 2. Scroller & Tab List
59
+ ========================================================================== */
60
+ .stn-tabs__scroller {
61
+ position: relative;
62
+ display: flex;
63
+ flex: 1 1 auto;
64
+ white-space: nowrap;
65
+ overflow-x: auto;
66
+ overflow-y: hidden;
67
+ -webkit-overflow-scrolling: touch; /* iOS Safari 관성 스크롤 */
68
+ touch-action: pan-x; /* 모바일 가로 제스처 최적화 */
69
+ overscroll-behavior-x: contain;
70
+ scrollbar-width: none; /* Hide scrollbar Firefox */
71
+ -ms-overflow-style: none; /* IE/Edge */
72
+ }
73
+
74
+ .stn-tabs__scroller::-webkit-scrollbar {
75
+ display: none; /* Hide scrollbar Chrome/Safari */
76
+ }
77
+
78
+ .stn-tabs__list {
79
+ position: relative;
80
+ display: flex;
81
+ flex-direction: row;
82
+ align-items: center;
83
+ list-style: none;
84
+ margin: 0;
85
+ padding: 0;
86
+ min-width: fit-content;
87
+ }
88
+
89
+ /* ==========================================================================
90
+ 3. Tab Item (.stn-tab)
91
+ ========================================================================== */
92
+ .stn-tab {
93
+ position: relative;
94
+ z-index: 1;
95
+ display: inline-flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ gap: var(--stn-space-6, 6px);
99
+ box-sizing: border-box;
100
+ background: transparent;
101
+ border: none;
102
+ cursor: pointer;
103
+ color: var(--stn-text-tertiary);
104
+ font-family: var(--stn-font-body, Pretendard, sans-serif);
105
+ font-weight: var(--stn-font-weight-medium, 500);
106
+ line-height: 1;
107
+ text-decoration: none;
108
+ white-space: nowrap;
109
+ outline: none;
110
+ -webkit-tap-highlight-color: transparent;
111
+ transition:
112
+ color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
113
+ background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
114
+ border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
115
+ }
116
+
117
+ /* Size: sm */
118
+ .stn-tabs.sm .stn-tab {
119
+ height: var(--stn-size-32, 32px);
120
+ padding: 0 var(--stn-space-12, 12px);
121
+ font-size: var(--stn-font-size-12, 12px);
122
+ border-radius: var(--stn-radius-sm, 6px);
123
+ }
124
+
125
+ /* Size: md (기본) */
126
+ .stn-tabs.md .stn-tab,
127
+ .stn-tabs:not(.sm):not(.lg) .stn-tab {
128
+ height: var(--stn-size-38, 38px);
129
+ padding: 0 var(--stn-space-16, 16px);
130
+ font-size: var(--stn-font-size-13, 13px);
131
+ border-radius: var(--stn-radius-md, 8px);
132
+ }
133
+
134
+ /* Size: lg */
135
+ .stn-tabs.lg .stn-tab {
136
+ height: var(--stn-size-44, 44px);
137
+ padding: 0 var(--stn-space-20, 20px);
138
+ font-size: var(--stn-font-size-14, 14px);
139
+ border-radius: var(--stn-radius-md, 8px);
140
+ }
141
+
142
+ /* Wrapped Labels (긴 텍스트 2줄 자동 줄바꿈) */
143
+ .stn-tab.is-wrapped {
144
+ white-space: normal;
145
+ line-height: var(--stn-line-height-tight, 1.35);
146
+ text-align: center;
147
+ max-width: 260px;
148
+ min-height: var(--stn-size-48, 48px);
149
+ height: auto;
150
+ padding-top: var(--stn-space-6, 6px);
151
+ padding-bottom: var(--stn-space-6, 6px);
152
+ }
153
+
154
+ .stn-tab.is-wrapped .stn-tab__label {
155
+ display: -webkit-box;
156
+ -webkit-line-clamp: 2;
157
+ -webkit-box-orient: vertical;
158
+ overflow: hidden;
159
+ text-overflow: ellipsis;
160
+ word-break: keep-all;
161
+ }
162
+
163
+ /* Hover State */
164
+ .stn-tab:hover:not(.is-disabled) {
165
+ color: var(--stn-text-primary);
166
+ }
167
+
168
+ /* Focus Visible */
169
+ .stn-tab:focus-visible {
170
+ outline: var(--stn-focus-ring-width, var(--stn-size-2, 2px)) solid var(--stn-focus-ring);
171
+ outline-offset: -2px;
172
+ }
173
+
174
+ /* Active / Selected State */
175
+ .stn-tab.is-active {
176
+ color: var(--stn-primary, var(--stn-blue-400));
177
+ font-weight: var(--stn-font-weight-semibold, 600);
178
+ }
179
+
180
+ /* Disabled State */
181
+ .stn-tab.is-disabled {
182
+ cursor: not-allowed;
183
+ opacity: var(--stn-disabled-opacity, 0.45);
184
+ pointer-events: none;
185
+ }
186
+
187
+
188
+ /* Icon in Tab */
189
+ .stn-tab__icon {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ line-height: 1;
194
+ flex-shrink: 0;
195
+ transition: transform 0.2s ease, color 0.2s ease;
196
+ }
197
+
198
+ .stn-tab__icon > svg,
199
+ .stn-tab__icon > img,
200
+ .stn-tab__icon > .stn-icon {
201
+ width: 100%;
202
+ height: 100%;
203
+ object-fit: contain;
204
+ }
205
+
206
+ /* Icon Sizes */
207
+ .stn-tab__icon.icon-sm {
208
+ width: var(--stn-size-14, 14px);
209
+ height: var(--stn-size-14, 14px);
210
+ }
211
+
212
+ .stn-tab__icon.icon-md {
213
+ width: var(--stn-size-18, 18px);
214
+ height: var(--stn-size-18, 18px);
215
+ }
216
+
217
+ .stn-tab__icon.icon-lg {
218
+ width: var(--stn-size-22, 22px);
219
+ height: var(--stn-size-22, 22px);
220
+ }
221
+
222
+ /* Icon Positions: start (기본), end, top, bottom */
223
+ .stn-tab.icon-top {
224
+ flex-direction: column;
225
+ justify-content: center;
226
+ gap: var(--stn-space-4, 4px);
227
+ min-height: var(--stn-size-48, 48px);
228
+ height: auto;
229
+ padding-top: var(--stn-space-8, 8px);
230
+ padding-bottom: var(--stn-space-8, 8px);
231
+ }
232
+
233
+ .stn-tab.icon-bottom {
234
+ flex-direction: column-reverse;
235
+ justify-content: center;
236
+ gap: var(--stn-space-4, 4px);
237
+ min-height: var(--stn-size-48, 48px);
238
+ height: auto;
239
+ padding-top: var(--stn-space-8, 8px);
240
+ padding-bottom: var(--stn-space-8, 8px);
241
+ }
242
+
243
+ .stn-tab.icon-end {
244
+ flex-direction: row-reverse;
245
+ }
246
+
247
+ /* Icon-only Tab (정방형 비율 & 툴팁 호환) */
248
+ .stn-tab.icon-only {
249
+ padding: 0;
250
+ aspect-ratio: 1 / 1;
251
+ }
252
+
253
+ .stn-tabs.sm .stn-tab.icon-only {
254
+ width: var(--stn-size-32, 32px);
255
+ min-width: var(--stn-size-32, 32px);
256
+ }
257
+
258
+ .stn-tabs.md .stn-tab.icon-only,
259
+ .stn-tabs:not(.sm):not(.lg) .stn-tab.icon-only {
260
+ width: var(--stn-size-38, 38px);
261
+ min-width: var(--stn-size-38, 38px);
262
+ }
263
+
264
+ .stn-tabs.lg .stn-tab.icon-only {
265
+ width: var(--stn-size-44, 44px);
266
+ min-width: var(--stn-size-44, 44px);
267
+ }
268
+
269
+ /* Badge / Count in Tab — StnChip 'sm' 표준 규격 1:1 연동 */
270
+ .stn-tab__badge {
271
+ display: inline-flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ min-width: var(--stn-chip-height-sm, 20px);
275
+ height: var(--stn-chip-height-sm, 20px);
276
+ padding: 0 var(--stn-chip-padding-x-sm, 6px);
277
+ border-radius: var(--stn-radius-chip-pill, 9999px);
278
+ font-size: var(--stn-chip-font-size-sm, 11px);
279
+ font-family: var(--stn-font-number, Pretendard, sans-serif);
280
+ font-weight: var(--stn-font-weight-bold, 700);
281
+ line-height: 1;
282
+ background-color: var(--stn-tab-badge-bg);
283
+ color: var(--stn-tab-badge-fg);
284
+ transition: background-color 0.2s ease, color 0.2s ease;
285
+ }
286
+
287
+ .stn-tab.is-active .stn-tab__badge {
288
+ background-color: color-mix(in srgb, var(--stn-primary) 18%, transparent);
289
+ color: var(--stn-primary);
290
+ }
291
+
292
+ .stn-tab__extra {
293
+ display: inline-flex;
294
+ align-items: center;
295
+ line-height: 1;
296
+ }
297
+
298
+ /* ==========================================================================
299
+ 4. Floating Animated Indicator (.stn-tabs__indicator)
300
+ ========================================================================== */
301
+ .stn-tabs__indicator {
302
+ position: absolute;
303
+ pointer-events: none;
304
+ z-index: 0;
305
+ bottom: 0;
306
+ height: 2px;
307
+ background-color: var(--stn-primary);
308
+ border-radius: var(--stn-radius-pill, 2px);
309
+ transition:
310
+ left 0.28s cubic-bezier(0.2, 0.9, 0.3, 1),
311
+ width 0.28s cubic-bezier(0.2, 0.9, 0.3, 1),
312
+ transform 0.28s cubic-bezier(0.2, 0.9, 0.3, 1),
313
+ opacity 0.2s ease;
314
+ }
315
+
316
+ /* ==========================================================================
317
+ 5. Scroll Buttons (.stn-tabs__scroll-button)
318
+ ========================================================================== */
319
+ .stn-tabs__scroll-button {
320
+ display: inline-flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ width: var(--stn-size-32, 32px);
324
+ height: 100%;
325
+ min-height: var(--stn-size-32, 32px);
326
+ background: transparent;
327
+ border: none;
328
+ color: var(--stn-text-secondary);
329
+ cursor: pointer;
330
+ padding: 0;
331
+ flex-shrink: 0;
332
+ outline: none;
333
+ z-index: 2;
334
+ transition: color 0.15s ease, opacity 0.15s ease, background-color 0.15s ease;
335
+ border-radius: var(--stn-radius-sm, 6px);
336
+ }
337
+
338
+ .stn-tabs__scroll-button:hover:not(:disabled) {
339
+ color: var(--stn-text-primary);
340
+ background-color: color-mix(in srgb, var(--stn-text-primary) 8%, transparent);
341
+ }
342
+
343
+ .stn-tabs__scroll-button:disabled {
344
+ opacity: 0.25;
345
+ cursor: not-allowed;
346
+ }
347
+
348
+ .stn-tabs__scroll-button.start {
349
+ margin-right: var(--stn-space-2, 2px);
350
+ }
351
+
352
+ .stn-tabs__scroll-button.end {
353
+ margin-left: var(--stn-space-2, 2px);
354
+ }
355
+
356
+ /* Fade Edges when scrollable */
357
+ .stn-tabs.is-scrollable.has-scroll-start .stn-tabs__scroller {
358
+ mask-image: linear-gradient(to right, transparent, black 28px, black 100%);
359
+ -webkit-mask-image: linear-gradient(to right, transparent, black 28px, black 100%);
360
+ }
361
+
362
+ .stn-tabs.is-scrollable.has-scroll-end .stn-tabs__scroller {
363
+ mask-image: linear-gradient(to left, transparent, black 28px, black 100%);
364
+ -webkit-mask-image: linear-gradient(to left, transparent, black 28px, black 100%);
365
+ }
366
+
367
+ .stn-tabs.is-scrollable.has-scroll-start.has-scroll-end .stn-tabs__scroller {
368
+ mask-image: linear-gradient(to right, transparent, black 28px, black calc(100% - 28px), transparent 100%);
369
+ -webkit-mask-image: linear-gradient(to right, transparent, black 28px, black calc(100% - 28px), transparent 100%);
370
+ }
371
+
372
+ /* ==========================================================================
373
+ 6. Tab Panel (.stn-tab-panel)
374
+ ========================================================================== */
375
+ .stn-tab-panel {
376
+ box-sizing: border-box;
377
+ width: 100%;
378
+ outline: none;
379
+ animation: stn-tab-panel-fade-in 0.2s cubic-bezier(0.2, 0, 0, 1);
380
+ }
381
+
382
+ .stn-tab-panel[hidden] {
383
+ display: none !important;
384
+ }
385
+
386
+ /* Padding Presets */
387
+ .stn-tab-panel.padding-none {
388
+ padding: 0;
389
+ }
390
+
391
+ .stn-tab-panel.padding-sm {
392
+ padding: var(--stn-space-8, 8px);
393
+ }
394
+
395
+ .stn-tab-panel.padding-md {
396
+ padding: var(--stn-space-16, 16px);
397
+ }
398
+
399
+ .stn-tab-panel.padding-lg {
400
+ padding: var(--stn-space-24, 24px);
401
+ }
402
+
403
+ @keyframes stn-tab-panel-fade-in {
404
+ from {
405
+ opacity: 0;
406
+ transform: translateY(3px);
407
+ }
408
+ to {
409
+ opacity: 1;
410
+ transform: translateY(0);
411
+ }
412
+ }
@@ -70,6 +70,7 @@
70
70
  @import './components/stn-card.css';
71
71
  @import './components/stn-topology.css';
72
72
  @import './components/stn-status.css';
73
+ @import './components/stn-tabs.css';
73
74
 
74
75
  /* --- 5. Patterns (Composite UI Recipes) --- */
75
76
  @import './patterns/stn-section-side.css';
@@ -349,6 +349,8 @@
349
349
  --stn-side-nav-gradient-icon-glow: var(--stn-cobalt-75);
350
350
  --stn-on-color: var(--stn-static-white);
351
351
  --stn-shade: var(--stn-gray-950);
352
+ --stn-tab-badge-bg: var(--stn-gray-700);
353
+ --stn-tab-badge-fg: var(--stn-text-tertiary);
352
354
  --stn-badge-subtle-bg: var(--stn-opacity-white-10);
353
355
  --stn-badge-error: var(--stn-red-350);
354
356
  --stn-badge-primary: var(--stn-blue-400);
@@ -946,6 +948,8 @@
946
948
  --stn-side-nav-gradient-icon-glow: var(--stn-cobalt-75);
947
949
  --stn-on-color: var(--stn-static-white);
948
950
  --stn-shade: var(--stn-gray-950);
951
+ --stn-tab-badge-bg: var(--stn-gray-100);
952
+ --stn-tab-badge-fg: var(--stn-text-secondary);
949
953
  --stn-badge-subtle-bg: var(--stn-opacity-black-5);
950
954
  --stn-badge-error: var(--stn-red-500);
951
955
  --stn-badge-primary: var(--stn-blue-500);
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-AVICAV6Z.js.map