@stn-uiux/pub-ui 0.1.81 → 0.1.84

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 (112) hide show
  1. package/dist/{chunk-6FEWLKVE.js → chunk-2TRZNWCA.js} +32 -2
  2. package/dist/chunk-2TRZNWCA.js.map +1 -0
  3. package/dist/{chunk-AJLP3Y53.js → chunk-2VSSPMZ3.js} +2 -2
  4. package/dist/{chunk-AJLP3Y53.js.map → chunk-2VSSPMZ3.js.map} +1 -1
  5. package/dist/{chunk-AOS3IX4T.js → chunk-65B7YUTE.js} +2 -1
  6. package/dist/{chunk-AOS3IX4T.js.map → chunk-65B7YUTE.js.map} +1 -1
  7. package/dist/chunk-APXT43OG.js +232 -0
  8. package/dist/chunk-APXT43OG.js.map +1 -0
  9. package/dist/chunk-C5WP6UQO.js +107 -0
  10. package/dist/chunk-C5WP6UQO.js.map +1 -0
  11. package/dist/chunk-ERZPIKPF.js +1 -0
  12. package/dist/chunk-FLKGJJD5.js +45 -0
  13. package/dist/chunk-FLKGJJD5.js.map +1 -0
  14. package/dist/{chunk-N46UQH6L.js → chunk-K6TWXWIO.js} +11 -2
  15. package/dist/chunk-K6TWXWIO.js.map +1 -0
  16. package/dist/chunk-N4PVFFKV.js +38 -0
  17. package/dist/chunk-N4PVFFKV.js.map +1 -0
  18. package/dist/chunk-NYZMUDVK.js +12 -0
  19. package/dist/chunk-NYZMUDVK.js.map +1 -0
  20. package/dist/chunk-P22H2BFQ.js +9 -0
  21. package/dist/chunk-P22H2BFQ.js.map +1 -0
  22. package/dist/chunk-QJN2Z6RG.js +160 -0
  23. package/dist/chunk-QJN2Z6RG.js.map +1 -0
  24. package/dist/chunk-W7K3FSAX.js +24 -0
  25. package/dist/chunk-W7K3FSAX.js.map +1 -0
  26. package/dist/cli.js +17 -17
  27. package/dist/components.d.ts +1 -1
  28. package/dist/components.js +1 -1
  29. package/dist/data/index.d.ts +8 -3
  30. package/dist/data/index.js +148 -94
  31. package/dist/data/stnCard.d.ts +1 -1
  32. package/dist/data/stnCard.js +1 -1
  33. package/dist/data/stnChart.d.ts +35 -1
  34. package/dist/data/stnChart.js +7 -3
  35. package/dist/data/stnDatePicker.d.ts +41 -10
  36. package/dist/data/stnDatePicker.js +9 -3
  37. package/dist/data/stnEmptyState.d.ts +35 -0
  38. package/dist/data/stnEmptyState.js +19 -0
  39. package/dist/data/stnEmptyState.js.map +1 -0
  40. package/dist/data/stnPackageVersion.d.ts +2 -2
  41. package/dist/data/stnPackageVersion.js +1 -1
  42. package/dist/data/stnPopover.d.ts +18 -0
  43. package/dist/data/stnPopover.js +9 -0
  44. package/dist/data/stnPopover.js.map +1 -0
  45. package/dist/data/stnSplitView.d.ts +16 -0
  46. package/dist/data/stnSplitView.js +11 -0
  47. package/dist/data/stnSplitView.js.map +1 -0
  48. package/dist/data/stnStepCards.d.ts +32 -0
  49. package/dist/data/stnStepCards.js +7 -0
  50. package/dist/data/stnStepCards.js.map +1 -0
  51. package/dist/data/stnStepper.d.ts +78 -0
  52. package/dist/data/stnStepper.js +7 -0
  53. package/dist/data/stnStepper.js.map +1 -0
  54. package/dist/data/stnTree.d.ts +3 -0
  55. package/dist/data/stnTree.js +1 -1
  56. package/dist/data/stnTypography.d.ts +17 -1
  57. package/dist/data/stnTypography.js +7 -1
  58. package/dist/index.d.ts +8 -3
  59. package/dist/index.js +149 -95
  60. package/package.json +1 -1
  61. package/styles/@assets/images/empty-state/forbidden.png +0 -0
  62. package/styles/@assets/images/empty-state/load-failed.png +0 -0
  63. package/styles/@assets/images/empty-state/maintenance.png +0 -0
  64. package/styles/@assets/images/empty-state/network.png +0 -0
  65. package/styles/@assets/images/empty-state/no-data.png +0 -0
  66. package/styles/@assets/images/empty-state/not-found.png +0 -0
  67. package/styles/@assets/images/empty-state/search-empty.png +0 -0
  68. package/styles/@assets/images/empty-state/server-error.png +0 -0
  69. package/styles/@assets/images/empty-state/timeout.png +0 -0
  70. package/styles/@assets/images/empty-state/unauthorized.png +0 -0
  71. package/styles/components/stn-bar-chart.css +394 -0
  72. package/styles/components/stn-card.css +49 -13
  73. package/styles/components/stn-chart-common.css +243 -0
  74. package/styles/components/stn-chart.css +20 -0
  75. package/styles/components/stn-checkbox.css +1 -1
  76. package/styles/components/stn-combo-chart.css +279 -0
  77. package/styles/components/stn-date-picker.css +251 -44
  78. package/styles/components/stn-drawer.css +2 -2
  79. package/styles/components/stn-empty-state.css +238 -0
  80. package/styles/components/stn-line-chart.css +125 -0
  81. package/styles/components/stn-pie-chart.css +112 -0
  82. package/styles/components/stn-popover.css +52 -0
  83. package/styles/components/stn-radio.css +1 -1
  84. package/styles/components/stn-slider.css +1 -1
  85. package/styles/components/stn-stepper.css +570 -0
  86. package/styles/components/stn-switch.css +1 -1
  87. package/styles/components/stn-table.css +30 -0
  88. package/styles/components/stn-tooltip.css +1 -1
  89. package/styles/components/stn-widget.css +3 -116
  90. package/styles/layouts/stn-container.css +8 -0
  91. package/styles/layouts/stn-layer0-bg.css +18 -17
  92. package/styles/patterns/stn-split-view.css +130 -0
  93. package/styles/patterns/stn-step-cards.css +60 -0
  94. package/styles/patterns/stn-tree.css +9 -0
  95. package/styles/patterns/stn-widget-patterns.css +294 -0
  96. package/styles/style-pub.css +7 -0
  97. package/styles/tokens/stn-colors-semantic.css +194 -0
  98. package/styles/tokens/stn-size-semantic.css +84 -0
  99. package/styles/tokens/stn-size.css +1 -0
  100. package/styles/tokens/stn-spacing-semantic.css +55 -0
  101. package/styles/tokens/stn-typography-semantic.css +3 -0
  102. package/styles/tokens/stn-typography.css +16 -0
  103. package/dist/chunk-6FEWLKVE.js.map +0 -1
  104. package/dist/chunk-DGZVOSEM.js +0 -7
  105. package/dist/chunk-DGZVOSEM.js.map +0 -1
  106. package/dist/chunk-N46UQH6L.js.map +0 -1
  107. package/dist/chunk-PSVPO4FH.js +0 -9
  108. package/dist/chunk-PSVPO4FH.js.map +0 -1
  109. package/dist/chunk-WKQLAHIG.js +0 -1
  110. package/dist/chunk-YBNEQ5LB.js +0 -75
  111. package/dist/chunk-YBNEQ5LB.js.map +0 -1
  112. /package/dist/{chunk-WKQLAHIG.js.map → chunk-ERZPIKPF.js.map} +0 -0
@@ -419,122 +419,6 @@
419
419
  border-color: var(--stn-widget-hover-border);
420
420
  }
421
421
 
422
- /* Status List Component */
423
- .stn-widget__status-list {
424
- display: flex;
425
- flex-direction: column;
426
- gap: var(--stn-widget-status-list-gap);
427
- width: 100%;
428
- padding: 0;
429
- margin: 0;
430
- list-style: none;
431
- }
432
-
433
- .stn-widget__status-item {
434
- display: flex;
435
- align-items: center;
436
- justify-content: space-between;
437
- padding: var(--stn-widget-status-item-padding);
438
- border-radius: var(--stn-widget-status-item-radius);
439
- background: var(--stn-widget-footer-well-bg);
440
- border: var(--stn-widget-border-width, var(--stn-size-1, 1px)) solid var(--stn-widget-footer-well-border);
441
- transition: background-color 0.15s ease, border-color 0.15s ease;
442
- }
443
-
444
- .stn-widget.appearance-dashboard .stn-widget__status-item {
445
- background: var(--stn-widget-on-dark-surface);
446
- border-color: transparent;
447
- }
448
-
449
- .stn-widget__status-item:hover {
450
- background-color: color-mix(in srgb, var(--stn-primary) 6%, transparent);
451
- border-color: color-mix(in srgb, var(--stn-primary) 20%, transparent);
452
- }
453
-
454
- .stn-widget__status-label {
455
- display: inline-flex;
456
- align-items: center;
457
- gap: var(--stn-widget-status-label-gap);
458
- font-size: var(--stn-text-body-small-size);
459
- color: var(--stn-text-secondary);
460
- }
461
-
462
- .stn-widget.appearance-dashboard .stn-widget__status-label {
463
- color: var(--stn-widget-on-dark-label);
464
- }
465
-
466
- .stn-widget__status-dot {
467
- width: var(--stn-widget-dot-size, var(--stn-size-8, 8px));
468
- height: var(--stn-widget-dot-size, var(--stn-size-8, 8px));
469
- border-radius: var(--stn-radius-circle, 50%);
470
- flex-shrink: 0;
471
- }
472
-
473
- .stn-widget__status-dot--critical { background: var(--stn-widget-dot-critical); }
474
- .stn-widget__status-dot--major { background: var(--stn-widget-dot-major); }
475
- .stn-widget__status-dot--minor { background: var(--stn-widget-dot-minor); }
476
- .stn-widget__status-dot--info { background: var(--stn-widget-dot-info); }
477
- .stn-widget__status-dot--normal { background: var(--stn-widget-dot-normal); }
478
-
479
- .stn-widget__status-val {
480
- font-size: var(--stn-text-label-medium-size);
481
- font-weight: var(--stn-font-weight-bold, 700);
482
- color: var(--stn-widget-status-value);
483
- }
484
-
485
- .stn-widget.appearance-dashboard .stn-widget__status-val {
486
- color: var(--stn-static-white);
487
- }
488
-
489
- /* Stat Group & Card */
490
- .stn-widget__stat-group {
491
- display: grid;
492
- grid-template-columns: repeat(auto-fit, minmax(var(--stn-widget-stat-min-width, var(--stn-size-110, 110px)), 1fr));
493
- gap: var(--stn-widget-stat-group-gap);
494
- width: 100%;
495
- }
496
-
497
- .stn-widget__stat-card {
498
- display: flex;
499
- flex-direction: column;
500
- gap: var(--stn-widget-stat-card-gap);
501
- padding: var(--stn-widget-stat-card-padding);
502
- border-radius: var(--stn-widget-stat-card-radius);
503
- background: var(--stn-widget-footer-well-bg);
504
- border: var(--stn-widget-border-width, var(--stn-size-1, 1px)) solid var(--stn-border-subtle);
505
- transition: transform 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
506
- }
507
-
508
- .stn-widget.appearance-dashboard .stn-widget__stat-card {
509
- background: var(--stn-widget-on-dark-surface);
510
- border-color: var(--stn-widget-on-dark-stat-border);
511
- }
512
-
513
- .stn-widget__stat-card:hover {
514
- transform: translateY(-2px);
515
- border-color: var(--stn-widget-stat-hover-border);
516
- background-color: color-mix(in srgb, var(--stn-primary) 8%, transparent);
517
- }
518
-
519
- .stn-widget__stat-label {
520
- font-size: var(--stn-text-caption-medium-size);
521
- color: var(--stn-text-secondary);
522
- }
523
-
524
- .stn-widget.appearance-dashboard .stn-widget__stat-label {
525
- color: var(--stn-widget-on-dark-stat-label);
526
- }
527
-
528
- .stn-widget__stat-count {
529
- font-size: var(--stn-text-title-large-size);
530
- font-weight: var(--stn-font-weight-bold, 700);
531
- color: var(--stn-widget-status-value);
532
- }
533
-
534
- .stn-widget.appearance-dashboard .stn-widget__stat-count {
535
- color: var(--stn-static-white);
536
- }
537
-
538
422
  /* Widget Appearance {solid|line|transparent|translucent|overlay}
539
423
  NOTE: Do NOT force padding: 0 here so density variations (default 12px / compact 8px) work properly */
540
424
  .stn-widget.solid,
@@ -702,3 +586,6 @@
702
586
  color: var(--stn-text-primary);
703
587
  }
704
588
 
589
+
590
+
591
+
@@ -9,6 +9,7 @@
9
9
  --stn-container-gutter-mobile: var(--stn-space-16, 16px);
10
10
  --stn-container-gutter-tablet: var(--stn-space-16, 16px);
11
11
  --stn-container-gutter-desktop: var(--stn-space-24, 24px);
12
+ --stn-container-gutter-none: var(--stn-space-0);
12
13
  }
13
14
 
14
15
  .stn-container {
@@ -41,6 +42,13 @@
41
42
  }
42
43
  }
43
44
 
45
+ /* 컨테이너 자신의 좌우 패딩만 끈다.
46
+ !important를 쓰지 않아, .stn-layer-1__body > .stn-container 의 16px은 그대로 남는다. */
47
+ .stn-container--disable-gutters {
48
+ padding-left: var(--stn-container-gutter-none);
49
+ padding-right: var(--stn-container-gutter-none);
50
+ }
51
+
44
52
  /* Fluid max-width. width 100%라서 캡에 닿기 전까지 화면과 같이 늘어난다.
45
53
  xs는 breakpoint가 없어서 444px. sm–xl은 STN breakpoint 폭. */
46
54
  .stn-container--xs,
@@ -11,18 +11,7 @@
11
11
  1. L0 Background Image Tokens (CDN)
12
12
  ========================================================================== */
13
13
 
14
- /* 1-1. Default Theme — Light Mode */
15
- [data-mode='light'],
16
- [data-theme='default'][data-mode='light'] {
17
- --stn-l0-dashboard-bg: url('https://stn-design.vercel.app/images/layer0/dashboard-light.png');
18
- --stn-l0-list-bg: var(--stn-gradient-l0-background);
19
- --stn-l0-showroom-a-bg: url('https://stn-design.vercel.app/images/layer0/showroom-a-light.png');
20
- --stn-l0-showroom-b-bg: url('https://stn-design.vercel.app/images/layer0/showroom-b-light.png');
21
- --stn-l0-map-light-bg: url('https://stn-design.vercel.app/images/layer0/map-light.png');
22
- --stn-l0-login-bg: url('https://stn-design.vercel.app/images/layer0/login-light.png');
23
- }
24
-
25
- /* 1-2. Default Theme — Dark Mode */
14
+ /* 1-1. Default Theme — Dark Mode (Base / Default) */
26
15
  :root,
27
16
  [data-mode='dark'],
28
17
  [data-theme='default'][data-mode='dark'] {
@@ -34,18 +23,30 @@
34
23
  --stn-l0-login-bg: url('https://stn-design.vercel.app/images/layer0/login-dark.png');
35
24
  }
36
25
 
37
- /* 1-3. Blue Theme — Light Mode */
38
- [data-theme='blue'][data-mode='light'] {
39
- --stn-l0-dashboard-bg: url('https://stn-design.vercel.app/images/layer0/infomap-light.png');
40
- --stn-l0-list-bg: url('https://stn-design.vercel.app/images/layer0/infomap-light-none.png');
26
+ /* 1-2. Default Theme — Light Mode */
27
+ [data-mode='light'],
28
+ [data-theme='default'][data-mode='light'] {
29
+ --stn-l0-dashboard-bg: url('https://stn-design.vercel.app/images/layer0/dashboard-light.png');
30
+ --stn-l0-list-bg: var(--stn-gradient-l0-background);
31
+ --stn-l0-showroom-a-bg: url('https://stn-design.vercel.app/images/layer0/showroom-a-light.png');
32
+ --stn-l0-showroom-b-bg: url('https://stn-design.vercel.app/images/layer0/showroom-b-light.png');
33
+ --stn-l0-map-light-bg: url('https://stn-design.vercel.app/images/layer0/map-light.png');
34
+ --stn-l0-login-bg: url('https://stn-design.vercel.app/images/layer0/login-light.png');
41
35
  }
42
36
 
43
- /* 1-4. Blue Theme — Dark Mode */
37
+ /* 1-3. Blue Theme — Dark Mode (Base) */
38
+ [data-theme='blue'],
44
39
  [data-theme='blue'][data-mode='dark'] {
45
40
  --stn-l0-dashboard-bg: url('https://stn-design.vercel.app/images/layer0/infomap-dark.png');
46
41
  --stn-l0-list-bg: url('https://stn-design.vercel.app/images/layer0/infomap-dark-none.png');
47
42
  }
48
43
 
44
+ /* 1-4. Blue Theme — Light Mode */
45
+ [data-theme='blue'][data-mode='light'] {
46
+ --stn-l0-dashboard-bg: url('https://stn-design.vercel.app/images/layer0/infomap-light.png');
47
+ --stn-l0-list-bg: url('https://stn-design.vercel.app/images/layer0/infomap-light-none.png');
48
+ }
49
+
49
50
 
50
51
  /* ==========================================================================
51
52
  2. Base Layer 0 Shell
@@ -0,0 +1,130 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * StnSplitView — Side + Stage layout shell (SSOT)
4
+ * Recipe: Card(padding=none) + Body flush + SplitView + FloatingToolbar on Stage
5
+ */
6
+
7
+ .stn-split-view {
8
+ box-sizing: border-box;
9
+ display: flex;
10
+ flex-direction: row;
11
+ align-items: stretch;
12
+ width: 100%;
13
+ min-width: 0;
14
+ min-height: 0;
15
+ }
16
+
17
+ .stn-split-view--fill {
18
+ flex: 1 1 0%;
19
+ height: 100%;
20
+ align-self: stretch;
21
+ }
22
+
23
+ /* ── Side ─────────────────────────────────────────── */
24
+ .stn-split-view__side {
25
+ box-sizing: border-box;
26
+ display: flex;
27
+ flex-direction: column;
28
+ flex: 0 0 auto;
29
+ width: var(--stn-split-view-side-width, var(--stn-split-view-side-width-md));
30
+ min-width: 0;
31
+ min-height: 0;
32
+ border-right: var(--stn-size-1, 1px) solid var(--stn-card-border-color, var(--stn-border-subtle));
33
+ background: transparent;
34
+ }
35
+
36
+ .stn-split-view__side--sm {
37
+ --stn-split-view-side-width: var(--stn-split-view-side-width-sm);
38
+ }
39
+
40
+ .stn-split-view__side--md {
41
+ --stn-split-view-side-width: var(--stn-split-view-side-width-md);
42
+ }
43
+
44
+ .stn-split-view__side--lg {
45
+ --stn-split-view-side-width: var(--stn-split-view-side-width-lg);
46
+ }
47
+
48
+ .stn-split-view__side--end {
49
+ border-right: none;
50
+ border-left: var(--stn-size-1, 1px) solid var(--stn-card-border-color, var(--stn-border-subtle));
51
+ order: 1;
52
+ }
53
+
54
+ .stn-split-view__side-header {
55
+ flex-shrink: 0;
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: var(--stn-space-8, 8px);
59
+ padding: var(--stn-space-12, 12px) var(--stn-space-16, 16px);
60
+ border-bottom: var(--stn-size-1, 1px) solid var(--stn-card-border-color, var(--stn-border-subtle));
61
+ }
62
+
63
+ .stn-split-view__side-body {
64
+ flex: 1 1 0%;
65
+ min-height: 0;
66
+ width: 100%;
67
+ }
68
+
69
+ .stn-split-view__side-body.stn-scroll {
70
+ padding: var(--stn-space-8, 8px) var(--stn-space-12, 12px);
71
+ }
72
+
73
+ /* ── Stage (floating toolbar / overlay positioning context) ── */
74
+ .stn-split-view__stage {
75
+ box-sizing: border-box;
76
+ position: relative;
77
+ display: flex;
78
+ flex-direction: column;
79
+ flex: 1 1 0%;
80
+ min-width: 0;
81
+ min-height: 0;
82
+ overflow: hidden;
83
+ }
84
+
85
+ /* Non-toolbar floating slots (legend, filters, callouts) */
86
+ .stn-split-view__overlay {
87
+ box-sizing: border-box;
88
+ position: absolute;
89
+ z-index: 10;
90
+ max-width: min(100%, var(--stn-split-view-overlay-max-width, var(--stn-size-320, 320px)));
91
+ pointer-events: auto;
92
+ }
93
+
94
+ .stn-split-view__overlay--top-left {
95
+ top: var(--stn-space-16, 16px);
96
+ left: var(--stn-space-16, 16px);
97
+ }
98
+
99
+ .stn-split-view__overlay--top-right {
100
+ top: var(--stn-space-16, 16px);
101
+ right: var(--stn-space-16, 16px);
102
+ }
103
+
104
+ .stn-split-view__overlay--bottom-left {
105
+ bottom: var(--stn-space-16, 16px);
106
+ left: var(--stn-space-16, 16px);
107
+ }
108
+
109
+ .stn-split-view__overlay--bottom-center {
110
+ bottom: var(--stn-space-16, 16px);
111
+ left: 50%;
112
+ transform: translateX(-50%);
113
+ }
114
+
115
+ .stn-split-view__overlay--bottom-right {
116
+ bottom: var(--stn-space-16, 16px);
117
+ right: var(--stn-space-16, 16px);
118
+ }
119
+
120
+ .stn-split-view__overlay--center-left {
121
+ top: 50%;
122
+ left: var(--stn-space-16, 16px);
123
+ transform: translateY(-50%);
124
+ }
125
+
126
+ .stn-split-view__overlay--center-right {
127
+ top: 50%;
128
+ right: var(--stn-space-16, 16px);
129
+ transform: translateY(-50%);
130
+ }
@@ -0,0 +1,60 @@
1
+ @charset "utf-8";
2
+ /**
3
+ * STN Pattern — Step cards (.stn-step-cards)
4
+ * 노드만 있는 가로 스텝퍼 아래, 단계마다 결과 카드를 같은 칸에 맞춘다.
5
+ */
6
+
7
+ .stn-step-cards {
8
+ --stn-step-cards-count: 1;
9
+
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--stn-space-16);
13
+ width: 100%;
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ .stn-step-cards__grid {
18
+ display: grid;
19
+ grid-template-columns: repeat(var(--stn-step-cards-count), minmax(0, 1fr));
20
+ align-items: stretch;
21
+ }
22
+
23
+ .stn-step-cards__cell {
24
+ min-width: 0;
25
+ display: flex;
26
+ padding-inline: var(--stn-space-8);
27
+ }
28
+
29
+ .stn-step-cards .stn-card.stn-step-cards__card {
30
+ gap: var(--stn-space-12);
31
+ }
32
+
33
+ .stn-step-cards .stn-card.stn-step-cards__card.is-current {
34
+ border-color: var(--stn-primary);
35
+ }
36
+
37
+ .stn-step-cards__heading {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: var(--stn-space-4);
41
+ min-width: 0;
42
+ }
43
+
44
+ .stn-step-cards__result {
45
+ display: flex;
46
+ align-items: baseline;
47
+ gap: var(--stn-space-6);
48
+ }
49
+
50
+ .stn-step-cards__action {
51
+ margin-top: auto;
52
+ }
53
+
54
+ .stn-step-cards .stn-step-cards__result-value.is-running {
55
+ color: var(--stn-primary);
56
+ }
57
+
58
+ .stn-step-cards .stn-step-cards__result-value.is-warning {
59
+ color: var(--stn-feedback-warning);
60
+ }
@@ -88,6 +88,15 @@
88
88
  flex-basis: var(--stn-tree-cell-size);
89
89
  }
90
90
 
91
+ .stn-tree__cell--checkbox {
92
+ flex-basis: var(--stn-tree-cell-size);
93
+ cursor: default;
94
+ }
95
+
96
+ .stn-tree__cell--checkbox .stn-checkbox {
97
+ margin: 0;
98
+ }
99
+
91
100
  .stn-tree__guide {
92
101
  display: block;
93
102
  width: var(--stn-tree-guide-size);
@@ -0,0 +1,294 @@
1
+ @charset "utf-8";
2
+
3
+ /**
4
+ * STN Design System — Widget Content Patterns
5
+ * Reusable data visualization and status blocks designed to live inside StnWidget (or any container):
6
+ * 1. Status Pattern: Status List & Status Item with Grade Dots (.stn-status-*)
7
+ * 2. Metric Pattern: Stat Group & Stat Card (.stn-stat-*)
8
+ * 3. Ranking Pattern: Grade Row List & Grade Row (.stn-grade-row*)
9
+ *
10
+ * 100% Unified Single Canonical Class Names.
11
+ */
12
+
13
+ /* ==========================================================================
14
+ 1. Status Pattern (Status List & Item)
15
+ Canonical BEM: .stn-status-item*
16
+ Legacy Aliases: .stn-widget__status-* (100% Backward Compatibility)
17
+ ========================================================================== */
18
+ .stn-status-list,
19
+ .stn-widget__status-list {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: var(--stn-widget-status-list-gap);
23
+ width: 100%;
24
+ padding: 0;
25
+ margin: 0;
26
+ list-style: none;
27
+ }
28
+
29
+ .stn-status-item,
30
+ .stn-widget__status-item {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: space-between;
34
+ padding: var(--stn-widget-status-item-padding);
35
+ border-radius: var(--stn-widget-status-item-radius);
36
+ background: var(--stn-widget-footer-well-bg);
37
+ border: var(--stn-widget-border-width, var(--stn-size-1)) solid var(--stn-widget-footer-well-border);
38
+ transition: background-color 0.15s ease, border-color 0.15s ease;
39
+ }
40
+
41
+ .stn-widget.appearance-dashboard .stn-status-item,
42
+ .stn-widget.appearance-dashboard .stn-widget__status-item {
43
+ background: var(--stn-widget-on-dark-surface);
44
+ border-color: transparent;
45
+ }
46
+
47
+ .stn-status-item:hover,
48
+ .stn-widget__status-item:hover {
49
+ background-color: color-mix(in srgb, var(--stn-primary) 6%, transparent);
50
+ border-color: color-mix(in srgb, var(--stn-primary) 20%, transparent);
51
+ }
52
+
53
+ .stn-status-item__label,
54
+ .stn-status-label,
55
+ .stn-widget__status-label {
56
+ display: inline-flex;
57
+ align-items: center;
58
+ gap: var(--stn-widget-status-label-gap);
59
+ font-size: var(--stn-text-body-small-size);
60
+ color: var(--stn-text-secondary);
61
+ }
62
+
63
+ .stn-widget.appearance-dashboard .stn-status-item__label,
64
+ .stn-widget.appearance-dashboard .stn-status-label,
65
+ .stn-widget.appearance-dashboard .stn-widget__status-label {
66
+ color: var(--stn-widget-on-dark-label);
67
+ }
68
+
69
+ .stn-status-item__dot,
70
+ .stn-widget__status-dot {
71
+ width: var(--stn-widget-dot-size, var(--stn-size-8));
72
+ height: var(--stn-widget-dot-size, var(--stn-size-8));
73
+ border-radius: var(--stn-radius-circle, 50%);
74
+ flex-shrink: 0;
75
+ }
76
+
77
+ .stn-status-item__dot--critical,
78
+ .stn-widget__status-dot--critical { background: var(--stn-widget-dot-critical); }
79
+ .stn-status-item__dot--major,
80
+ .stn-widget__status-dot--major { background: var(--stn-widget-dot-major); }
81
+ .stn-status-item__dot--minor,
82
+ .stn-widget__status-dot--minor { background: var(--stn-widget-dot-minor); }
83
+ .stn-status-item__dot--info,
84
+ .stn-widget__status-dot--info { background: var(--stn-widget-dot-info); }
85
+ .stn-status-item__dot--normal,
86
+ .stn-widget__status-dot--normal { background: var(--stn-widget-dot-normal); }
87
+
88
+ .stn-status-item__val,
89
+ .stn-status-val,
90
+ .stn-widget__status-val {
91
+ font-size: var(--stn-text-label-medium-size);
92
+ font-weight: var(--stn-font-weight-bold, 700);
93
+ color: var(--stn-widget-status-value);
94
+ }
95
+
96
+ .stn-widget.appearance-dashboard .stn-status-item__val,
97
+ .stn-widget.appearance-dashboard .stn-status-val,
98
+ .stn-widget.appearance-dashboard .stn-widget__status-val {
99
+ color: var(--stn-static-white);
100
+ }
101
+
102
+ /* ==========================================================================
103
+ 2. Metric Pattern (Stat Group & Stat Card)
104
+ Canonical BEM: .stn-stat-*
105
+ Legacy Aliases: .stn-widget__stat-* (100% Backward Compatibility)
106
+ ========================================================================== */
107
+ .stn-stat-group,
108
+ .stn-widget__stat-group {
109
+ display: grid;
110
+ grid-template-columns: repeat(auto-fit, minmax(var(--stn-widget-stat-min-width, var(--stn-size-110)), 1fr));
111
+ gap: var(--stn-widget-stat-group-gap);
112
+ width: 100%;
113
+ }
114
+
115
+ .stn-stat-card,
116
+ .stn-widget__stat-card {
117
+ display: flex;
118
+ flex-direction: column;
119
+ gap: var(--stn-widget-stat-card-gap);
120
+ padding: var(--stn-widget-stat-card-padding);
121
+ border-radius: var(--stn-widget-stat-card-radius);
122
+ background: var(--stn-widget-footer-well-bg);
123
+ border: var(--stn-widget-border-width, var(--stn-size-1)) solid var(--stn-border-subtle);
124
+ transition: transform 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
125
+ }
126
+
127
+ .stn-widget.appearance-dashboard .stn-stat-card,
128
+ .stn-widget.appearance-dashboard .stn-widget__stat-card {
129
+ background: var(--stn-widget-on-dark-surface);
130
+ border-color: var(--stn-widget-on-dark-stat-border);
131
+ }
132
+
133
+ .stn-stat-card:hover,
134
+ .stn-widget__stat-card:hover {
135
+ transform: translateY(calc(-1 * var(--stn-size-2)));
136
+ border-color: var(--stn-widget-stat-hover-border);
137
+ background-color: color-mix(in srgb, var(--stn-primary) 8%, transparent);
138
+ }
139
+
140
+ .stn-stat-card__label,
141
+ .stn-stat-label,
142
+ .stn-widget__stat-label {
143
+ font-size: var(--stn-text-caption-medium-size);
144
+ color: var(--stn-text-secondary);
145
+ }
146
+
147
+ .stn-widget.appearance-dashboard .stn-stat-card__label,
148
+ .stn-widget.appearance-dashboard .stn-stat-label,
149
+ .stn-widget.appearance-dashboard .stn-widget__stat-label {
150
+ color: var(--stn-widget-on-dark-stat-label);
151
+ }
152
+
153
+ .stn-stat-card__count,
154
+ .stn-stat-count,
155
+ .stn-widget__stat-count {
156
+ font-size: var(--stn-text-title-large-size);
157
+ font-weight: var(--stn-font-weight-bold, 700);
158
+ color: var(--stn-widget-status-value);
159
+ }
160
+
161
+ .stn-widget.appearance-dashboard .stn-stat-card__count,
162
+ .stn-widget.appearance-dashboard .stn-stat-count,
163
+ .stn-widget.appearance-dashboard .stn-widget__stat-count {
164
+ color: var(--stn-static-white);
165
+ }
166
+
167
+ /* ==========================================================================
168
+ 3. Ranking Pattern (Grade Row List & Grade Row — 장애 등급별 진행바 현황)
169
+ Canonical BEM: .stn-grade-row*
170
+ Legacy Aliases: .stn-widget__grade-row* (100% Backward Compatibility)
171
+ ========================================================================== */
172
+ .stn-grade-row-list,
173
+ .stn-widget__grade-row-list {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: var(--stn-widget-grade-row-list-gap);
177
+ width: 100%;
178
+ }
179
+
180
+ .stn-grade-row-list--grid,
181
+ .stn-widget__grade-row-list--grid {
182
+ display: grid;
183
+ grid-template-columns: repeat(auto-fit, minmax(var(--stn-widget-grade-row-grid-item-min-width), 1fr));
184
+ gap: var(--stn-widget-grade-row-grid-gap-y) var(--stn-widget-grade-row-grid-gap-x);
185
+ }
186
+
187
+ .stn-grade-row,
188
+ .stn-widget__grade-row {
189
+ display: flex;
190
+ align-items: center;
191
+ justify-content: space-between;
192
+ gap: var(--stn-widget-grade-row-gap);
193
+ width: 100%;
194
+ padding: var(--stn-widget-grade-row-padding-y) 0;
195
+ }
196
+
197
+ .stn-grade-row__left,
198
+ .stn-widget__grade-row-left {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: var(--stn-widget-grade-row-gap);
202
+ flex: 1;
203
+ min-width: 0;
204
+ }
205
+
206
+ .stn-grade-row__label,
207
+ .stn-widget__grade-row-label {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ gap: var(--stn-widget-grade-row-label-gap);
211
+ font-family: var(--stn-font-body);
212
+ font-size: var(--stn-font-size-13);
213
+ font-weight: var(--stn-font-weight-medium);
214
+ color: var(--stn-text-primary);
215
+ min-width: var(--stn-widget-grade-row-label-min-width);
216
+ flex-shrink: 0;
217
+ }
218
+
219
+ .stn-grade-row__icon,
220
+ .stn-widget__grade-row-icon {
221
+ width: var(--stn-widget-grade-row-icon-size);
222
+ height: var(--stn-widget-grade-row-icon-size);
223
+ flex-shrink: 0;
224
+ }
225
+
226
+ .stn-grade-row__track,
227
+ .stn-widget__grade-row-track {
228
+ flex: 1;
229
+ height: var(--stn-widget-grade-row-track-height);
230
+ background: var(--stn-widget-grade-row-track-bg);
231
+ border-radius: var(--stn-radius-2);
232
+ overflow: hidden;
233
+ min-width: var(--stn-widget-grade-row-track-min-width);
234
+ }
235
+
236
+ .stn-grade-row__fill,
237
+ .stn-widget__grade-row-fill {
238
+ display: block;
239
+ height: 100%;
240
+ border-radius: var(--stn-radius-2);
241
+ transition: width 0.3s ease;
242
+ }
243
+
244
+ .stn-grade-row--critical .stn-grade-row__fill,
245
+ .stn-widget__grade-row--critical .stn-widget__grade-row-fill {
246
+ background-color: var(--stn-grade-critical);
247
+ }
248
+
249
+ .stn-grade-row--major .stn-grade-row__fill,
250
+ .stn-widget__grade-row--major .stn-widget__grade-row-fill {
251
+ background-color: var(--stn-grade-major);
252
+ }
253
+
254
+ .stn-grade-row--minor .stn-grade-row__fill,
255
+ .stn-widget__grade-row--minor .stn-widget__grade-row-fill {
256
+ background-color: var(--stn-grade-minor);
257
+ }
258
+
259
+ .stn-grade-row--default .stn-grade-row__fill,
260
+ .stn-grade-row--warning .stn-grade-row__fill,
261
+ .stn-widget__grade-row--default .stn-widget__grade-row-fill,
262
+ .stn-widget__grade-row--warning .stn-widget__grade-row-fill {
263
+ background-color: var(--stn-grade-warning);
264
+ }
265
+
266
+ .stn-grade-row__right,
267
+ .stn-widget__grade-row-right {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: var(--stn-widget-grade-row-right-gap);
271
+ flex-shrink: 0;
272
+ }
273
+
274
+ .stn-grade-row__value,
275
+ .stn-widget__grade-row-value {
276
+ font-family: var(--stn-font-body);
277
+ font-size: var(--stn-font-size-13);
278
+ font-weight: var(--stn-font-weight-bold);
279
+ color: var(--stn-text-primary);
280
+ font-variant-numeric: tabular-nums;
281
+ min-width: var(--stn-widget-grade-row-val-min-width);
282
+ text-align: right;
283
+ }
284
+
285
+ .stn-grade-row__percent,
286
+ .stn-widget__grade-row-percent {
287
+ font-family: var(--stn-font-body);
288
+ font-size: var(--stn-font-size-12);
289
+ font-weight: var(--stn-font-weight-regular);
290
+ color: var(--stn-text-secondary);
291
+ font-variant-numeric: tabular-nums;
292
+ min-width: var(--stn-widget-grade-row-pct-min-width);
293
+ text-align: right;
294
+ }