@stn-uiux/pub-ui 0.1.57 → 0.1.59

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 (130) hide show
  1. package/dist/{chunk-L7DYM4V7.js → chunk-2FHXIAM3.js} +10 -28
  2. package/dist/{chunk-L7DYM4V7.js.map → chunk-2FHXIAM3.js.map} +1 -1
  3. package/dist/chunk-2WKT7X65.js +407 -0
  4. package/dist/chunk-2WKT7X65.js.map +1 -0
  5. package/dist/{chunk-7ASY5YJ6.js → chunk-36BAGMYT.js} +3 -3
  6. package/dist/chunk-36BAGMYT.js.map +1 -0
  7. package/dist/{chunk-THCCTVUM.js → chunk-5F63CMM7.js} +11 -1
  8. package/dist/chunk-5F63CMM7.js.map +1 -0
  9. package/dist/{chunk-Q3W7QA7N.js → chunk-75GHU6VI.js} +24 -43
  10. package/dist/chunk-75GHU6VI.js.map +1 -0
  11. package/dist/chunk-A5KLX6NX.js +1 -0
  12. package/dist/{chunk-4C7ABT2K.js → chunk-AE4CKAEK.js} +3 -3
  13. package/dist/chunk-AE4CKAEK.js.map +1 -0
  14. package/dist/{chunk-UPXSNRIJ.js → chunk-AOS3IX4T.js} +2 -2
  15. package/dist/chunk-AOS3IX4T.js.map +1 -0
  16. package/dist/{chunk-XNGYRPZI.js → chunk-CHJATVOT.js} +4 -4
  17. package/dist/{chunk-XNGYRPZI.js.map → chunk-CHJATVOT.js.map} +1 -1
  18. package/dist/{chunk-XZ3JOUX2.js → chunk-EQTZA7I2.js} +2 -14
  19. package/dist/chunk-EQTZA7I2.js.map +1 -0
  20. package/dist/{chunk-P5V6SFR7.js → chunk-H4ZJQ5YW.js} +2 -2
  21. package/dist/{chunk-GR76L7M7.js → chunk-JPILTFLI.js} +5 -5
  22. package/dist/chunk-JPILTFLI.js.map +1 -0
  23. package/dist/{chunk-WRGBYWRV.js → chunk-LKVTW54X.js} +1 -1
  24. package/dist/chunk-LKVTW54X.js.map +1 -0
  25. package/dist/{chunk-OMCBVK57.js → chunk-SKZOEF3H.js} +2 -2
  26. package/dist/chunk-SQJPE6HH.js +12 -0
  27. package/dist/chunk-SQJPE6HH.js.map +1 -0
  28. package/dist/{chunk-V7HD6SBG.js → chunk-XEG4WDUD.js} +7 -18
  29. package/dist/chunk-XEG4WDUD.js.map +1 -0
  30. package/dist/chunk-XPARWRVD.js +9 -0
  31. package/dist/chunk-XPARWRVD.js.map +1 -0
  32. package/dist/{chunk-S4YA4H2S.js → chunk-YBNEQ5LB.js} +2 -2
  33. package/dist/cli.js +15 -15
  34. package/dist/data/index.d.ts +2 -1
  35. package/dist/data/index.js +31 -27
  36. package/dist/data/stnAlertCenter.d.ts +4 -3
  37. package/dist/data/stnAlertCenter.js +1 -1
  38. package/dist/data/stnBreadcrumb.js +3 -3
  39. package/dist/data/stnDatePicker.js +2 -2
  40. package/dist/data/stnDateRangeField.d.ts +1 -1
  41. package/dist/data/stnDateRangeField.js +1 -1
  42. package/dist/data/stnDropdown.d.ts +1 -1
  43. package/dist/data/stnDropdown.js +1 -1
  44. package/dist/data/stnHeader.d.ts +2 -2
  45. package/dist/data/stnHeader.js +3 -3
  46. package/dist/data/stnLayout.d.ts +1 -1
  47. package/dist/data/stnLayout.js +1 -1
  48. package/dist/data/stnPackageVersion.d.ts +2 -2
  49. package/dist/data/stnPackageVersion.js +1 -1
  50. package/dist/data/stnPopup.d.ts +19 -41
  51. package/dist/data/stnPopup.js +1 -1
  52. package/dist/data/stnScroll.d.ts +1 -1
  53. package/dist/data/stnScroll.js +1 -1
  54. package/dist/data/stnSearchRequirement.d.ts +4 -4
  55. package/dist/data/stnSearchRequirement.js +1 -1
  56. package/dist/data/stnSideNavItem.js +3 -3
  57. package/dist/data/stnSizeSemantic.js +1 -1
  58. package/dist/data/stnStatus.d.ts +11 -0
  59. package/dist/data/stnStatus.js +7 -0
  60. package/dist/data/stnStatus.js.map +1 -0
  61. package/dist/data/stnSystemIcons.d.ts +1 -1
  62. package/dist/data/stnSystemIcons.js +2 -2
  63. package/dist/data/stnSystemIconsData.generated.js +1 -1
  64. package/dist/data/stnTree.d.ts +1 -1
  65. package/dist/data/stnTree.js +1 -1
  66. package/dist/index.d.ts +2 -1
  67. package/dist/index.js +31 -27
  68. package/package.json +1 -1
  69. package/styles/@assets/svg/system/line/eye-off.svg +5 -0
  70. package/styles/components/stn-btn.css +10 -1
  71. package/styles/components/stn-date-picker.css +13 -5
  72. package/styles/components/stn-date-range-field.css +153 -16
  73. package/styles/components/stn-dropdown.css +161 -42
  74. package/styles/components/stn-label-prefix.css +356 -0
  75. package/styles/components/stn-pagination.css +113 -5
  76. package/styles/components/stn-popup.css +78 -132
  77. package/styles/components/stn-scroll.css +51 -66
  78. package/styles/components/stn-search-requirement.css +27 -20
  79. package/styles/components/stn-segmented.css +3 -1
  80. package/styles/components/stn-status.css +853 -0
  81. package/styles/components/stn-table.css +32 -5
  82. package/styles/components/stn-text-field.css +396 -374
  83. package/styles/components/stn-toast.css +17 -0
  84. package/styles/components/stn-toggle-button.css +37 -0
  85. package/styles/layouts/stn-container.css +9 -0
  86. package/styles/layouts/stn-layer1-content.css +105 -0
  87. package/styles/patterns/stn-alert-center.css +114 -4
  88. package/styles/patterns/stn-header.css +7 -145
  89. package/styles/patterns/stn-section-side.css +64 -0
  90. package/styles/patterns/stn-tree.css +193 -2
  91. package/styles/style-pub.css +2 -1
  92. package/styles/tokens/stn-breakpoint.css +12 -0
  93. package/styles/tokens/stn-colors-semantic.css +13 -7
  94. package/styles/tokens/stn-radius-semantic.css +4 -3
  95. package/styles/tokens/stn-size-semantic.css +19 -6
  96. package/styles/tokens/stn-size.css +2 -0
  97. package/styles/tokens/stn-spacing-semantic.css +12 -0
  98. package/styles/tokens/stn-typography.css +1 -0
  99. package/dist/chunk-4C7ABT2K.js.map +0 -1
  100. package/dist/chunk-7ASY5YJ6.js.map +0 -1
  101. package/dist/chunk-GR76L7M7.js.map +0 -1
  102. package/dist/chunk-LHV26PEP.js +0 -1
  103. package/dist/chunk-Q3W7QA7N.js.map +0 -1
  104. package/dist/chunk-QT4HHVZH.js +0 -9
  105. package/dist/chunk-QT4HHVZH.js.map +0 -1
  106. package/dist/chunk-THCCTVUM.js.map +0 -1
  107. package/dist/chunk-UPXSNRIJ.js.map +0 -1
  108. package/dist/chunk-V7HD6SBG.js.map +0 -1
  109. package/dist/chunk-WRGBYWRV.js.map +0 -1
  110. package/dist/chunk-XZ3JOUX2.js.map +0 -1
  111. package/dist/chunk-ZI6EF4XD.js +0 -209
  112. package/dist/chunk-ZI6EF4XD.js.map +0 -1
  113. package/styles/@assets/svg/system/3d/print.png +0 -0
  114. package/styles/@assets/svg/system/3d/print_1.png +0 -0
  115. package/styles/@assets/svg/system/3d/server1.png +0 -0
  116. package/styles/@assets/svg/system/3d/server1_1.png +0 -0
  117. package/styles/@assets/svg/system/3d/server2.png +0 -0
  118. package/styles/@assets/svg/system/3d/server2_1.png +0 -0
  119. package/styles/@assets/svg/system/3d/signal.png +0 -0
  120. package/styles/@assets/svg/system/3d/signal_1.png +0 -0
  121. package/styles/@assets/svg/system/3d/wifi.png +0 -0
  122. package/styles/@assets/svg/system/3d/wifi_1.png +0 -0
  123. package/styles/@assets/svg/system/ai_agent.png +0 -0
  124. package/styles/@assets/svg/system/line/input.svg +0 -3
  125. package/styles/@assets/svg/system/line/radio.svg +0 -3
  126. package/styles/components/stn-severity-badge.css +0 -227
  127. /package/dist/{chunk-LHV26PEP.js.map → chunk-A5KLX6NX.js.map} +0 -0
  128. /package/dist/{chunk-P5V6SFR7.js.map → chunk-H4ZJQ5YW.js.map} +0 -0
  129. /package/dist/{chunk-OMCBVK57.js.map → chunk-SKZOEF3H.js.map} +0 -0
  130. /package/dist/{chunk-S4YA4H2S.js.map → chunk-YBNEQ5LB.js.map} +0 -0
@@ -35,8 +35,11 @@
35
35
  min-height: 24px;
36
36
  width: 100%;
37
37
  border-radius: var(--stn-radius-4, 4px);
38
+ border: 1px solid transparent;
39
+ box-sizing: border-box;
38
40
  cursor: pointer;
39
41
  user-select: none;
42
+ transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
40
43
  }
41
44
 
42
45
  .stn-tree__row:focus-visible {
@@ -60,7 +63,8 @@
60
63
  .stn-tree__row.is-selected.is-hover,
61
64
  .stn-tree__row.is-selected:active,
62
65
  .stn-tree__row.is-selected.is-pressed {
63
- background: var(--stn-tree-selected);
66
+ background: color-mix(in srgb, var(--stn-primary) 10%, transparent);
67
+ border-color: var(--stn-nav-menu-active-border);
64
68
  }
65
69
 
66
70
  .stn-tree__cell {
@@ -144,7 +148,6 @@
144
148
  display: block;
145
149
  width: 16px;
146
150
  height: 16px;
147
- background-color: var(--stn-tree-icon-default);
148
151
  mask-position: center;
149
152
  mask-size: contain;
150
153
  mask-repeat: no-repeat;
@@ -196,6 +199,7 @@
196
199
  }
197
200
 
198
201
  .stn-tree__label {
202
+ flex: 1 1 auto;
199
203
  min-width: 0;
200
204
  padding: 0 var(--stn-spacing-tree-label-pad-inline);
201
205
  overflow: hidden;
@@ -206,6 +210,11 @@
206
210
  line-height: 1;
207
211
  }
208
212
 
213
+ .stn-tree__row.is-bold .stn-tree__label,
214
+ .stn-tree__label.is-bold {
215
+ font-weight: var(--stn-font-weight-bold, 700);
216
+ }
217
+
209
218
  .stn-tree__row--root .stn-tree__label {
210
219
  color: var(--stn-tree-label-root);
211
220
  }
@@ -225,3 +234,185 @@
225
234
  .stn-tree__row--folder[data-depth='3'] .stn-tree__label {
226
235
  color: var(--stn-tree-label-folder-nested);
227
236
  }
237
+
238
+ /* 4depth+ folder — nested 토큰 그대로 유지 */
239
+ .stn-tree__row--folder[data-depth='4'] .stn-tree__icon--folder .stn-tree__icon-glyph {
240
+ background-color: var(--stn-tree-icon-folder-nested);
241
+ }
242
+
243
+ .stn-tree__row--folder[data-depth='5'] .stn-tree__icon--folder .stn-tree__icon-glyph {
244
+ background-color: var(--stn-tree-icon-folder-nested);
245
+ }
246
+
247
+ .stn-tree__row--folder[data-depth='4'] .stn-tree__label {
248
+ color: var(--stn-tree-label-folder-nested);
249
+ }
250
+
251
+ .stn-tree__row--folder[data-depth='5'] .stn-tree__label {
252
+ color: var(--stn-tree-label-folder-nested);
253
+ }
254
+
255
+ /* ── 가이드 라인 숨김 수식어 (.no-guides) ─────────────────────
256
+ * 인덴트 공간은 유지하고 연결선(connector · vertical) 글리프만 숨깁니다.
257
+ * 사용법: <StnTree guides={false} /> 또는 <StnTree className="no-guides" />
258
+ * ──────────────────────────────────────────────────────── */
259
+ .stn-tree.no-guides .stn-tree__guide-glyph,
260
+ .stn-tree.no-guides .stn-tree__cell--guide .stn-tree__guide-glyph {
261
+ display: none !important;
262
+ }
263
+
264
+ /* ── 너비 규격 수식어 (Tree 권장 표준 규격: w80~w240, full) ──
265
+ * STN 표준 규격: .w80, .w100, .w120, .w140, .w160, .w180, .w200, .w220, .w240, .full
266
+ * ──────────────────────────────────────────────────────── */
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); }
276
+ .stn-tree.full { width: 100%; }
277
+
278
+ /* ── 선택/호버 테두리 곡률 수식어 (Border Radius) ────────────
279
+ * radius prop → .radius-none, .radius-sm, .radius-md, .radius-full
280
+ * ──────────────────────────────────────────────────────── */
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); }
285
+
286
+ /* ── 가시성(눈) 토글 버튼 및 숨김 상태 ──────────────────────
287
+ * showVisibilityToggle={true} 일 때 행 우측 끝에 표시됩니다.
288
+ * ──────────────────────────────────────────────────────── */
289
+ .stn-tree__visibility-btn {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ margin-left: auto;
294
+ margin-right: var(--stn-space-4, 4px);
295
+ padding: 0;
296
+ width: 20px;
297
+ height: 20px;
298
+ border: none;
299
+ background: transparent;
300
+ cursor: pointer;
301
+ border-radius: var(--stn-radius-2, 2px);
302
+ opacity: 0.7;
303
+ transition: opacity 0.15s ease;
304
+ }
305
+
306
+ .stn-tree__visibility-btn:hover {
307
+ opacity: 1;
308
+ }
309
+
310
+ .stn-tree__visibility-btn:focus-visible {
311
+ outline: 2px solid var(--stn-tree-focus);
312
+ outline-offset: 1px;
313
+ }
314
+
315
+ .stn-tree__visibility-glyph {
316
+ display: block;
317
+ width: 14px;
318
+ height: 14px;
319
+ background-color: var(--stn-text-tertiary, #8b93a1);
320
+ mask-position: center;
321
+ mask-size: contain;
322
+ mask-repeat: no-repeat;
323
+ -webkit-mask-position: center;
324
+ -webkit-mask-size: contain;
325
+ -webkit-mask-repeat: no-repeat;
326
+ }
327
+
328
+ .stn-tree__visibility-glyph.is-off {
329
+ background-color: var(--stn-text-disabled, #a0aec0);
330
+ }
331
+
332
+ /* 숨김/미사용 처리된 노드 — 텍스트/아이콘 반투명(dimmed) */
333
+ .stn-tree__row.is-hidden-node .stn-tree__label,
334
+ .stn-tree__row.is-hidden-node .stn-tree__icon {
335
+ opacity: 0.38;
336
+ }
337
+
338
+ /* ── 카운트 표시 (Node Count) ──────────────────────────────
339
+ * count prop → 노드 우측에 표시되는 개수 숫자
340
+ * ──────────────────────────────────────────────────────── */
341
+ .stn-tree__count {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ 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));
350
+ margin-left: auto;
351
+ margin-right: var(--stn-space-6, 6px);
352
+ flex-shrink: 0;
353
+ }
354
+
355
+ .stn-tree__count + .stn-tree__visibility-btn {
356
+ margin-left: 0;
357
+ }
358
+
359
+ .stn-tree__icon--custom .stn-icon {
360
+ display: flex;
361
+ align-items: center;
362
+ justify-content: center;
363
+ }
364
+
365
+ /* ── 행 높이 크기 수식어 (Row Size) ─────────────────────────
366
+ * STN 표준 규격: .xs · .sm · .md · .lg · .xl
367
+ * (기본값: sm 24px)
368
+ *
369
+ * Guide cell: align-self:stretch + guide-glyph height:100% 로
370
+ * 행이 높아져도 vertical 연결선이 끊기지 않게 유지합니다.
371
+ * ──────────────────────────────────────────────────────── */
372
+
373
+ /* xs — 20px: 초밀집 사이드바 목록 */
374
+ .stn-tree.xs .stn-tree__row { min-height: 20px; }
375
+ .stn-tree.xs .stn-tree__cell { height: 20px; }
376
+
377
+ /* sm — 24px: 기본 콤팩트 */
378
+ .stn-tree.sm .stn-tree__row { min-height: 24px; }
379
+ .stn-tree.sm .stn-tree__cell { height: 24px; }
380
+
381
+ /* 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__cell--guide {
385
+ align-self: stretch;
386
+ height: auto;
387
+ }
388
+ .stn-tree.md .stn-tree__cell--guide .stn-tree__guide-glyph {
389
+ height: 100%;
390
+ mask-size: 100% 100%;
391
+ -webkit-mask-size: 100% 100%;
392
+ }
393
+
394
+ /* 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__cell--guide {
398
+ align-self: stretch;
399
+ height: auto;
400
+ }
401
+ .stn-tree.lg .stn-tree__cell--guide .stn-tree__guide-glyph {
402
+ height: 100%;
403
+ mask-size: 100% 100%;
404
+ -webkit-mask-size: 100% 100%;
405
+ }
406
+
407
+ /* 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__cell--guide {
411
+ align-self: stretch;
412
+ height: auto;
413
+ }
414
+ .stn-tree.xl .stn-tree__cell--guide .stn-tree__guide-glyph {
415
+ height: 100%;
416
+ mask-size: 100% 100%;
417
+ -webkit-mask-size: 100% 100%;
418
+ }
@@ -42,7 +42,6 @@
42
42
  @import './components/stn-chip.css';
43
43
  @import './components/stn-breadcrumb.css';
44
44
  @import './components/stn-badge.css';
45
- @import './components/stn-severity-badge.css';
46
45
  @import './components/stn-side-nav.css';
47
46
  @import './components/stn-header-title.css';
48
47
  @import './components/stn-popup.css';
@@ -57,6 +56,7 @@
57
56
  @import './components/stn-loading-skeleton.css';
58
57
  @import './components/stn-search-requirement.css';
59
58
  @import './components/stn-text-field.css';
59
+ @import './components/stn-label-prefix.css';
60
60
  @import './components/stn-segmented.css';
61
61
  @import './components/stn-toast.css';
62
62
  @import './components/stn-scroll.css';
@@ -68,6 +68,7 @@
68
68
  @import './components/stn-icon.css';
69
69
  @import './components/stn-card.css';
70
70
  @import './components/stn-topology.css';
71
+ @import './components/stn-status.css';
71
72
 
72
73
  /* --- 5. Patterns (Composite UI Recipes) --- */
73
74
  @import './patterns/stn-section-side.css';
@@ -15,4 +15,16 @@
15
15
  --stn-bp-md: 1024px;
16
16
  --stn-bp-lg: 1280px;
17
17
  --stn-bp-xl: 1440px;
18
+
19
+ /* Semantic Layout & Responsive Aliases */
20
+ --stn-layout-list-split-breakpoint: var(--stn-bp-md);
21
+ --stn-layout-list-tree-top-max-height: 240px;
22
+ --stn-table-footer-collapse-breakpoint: var(--stn-bp-sm);
23
+
24
+ /* Pagination — 좁은 화면 컴팩트 모드 (@media 480px 기준; CSS @media에서는 리터럴 사용) */
25
+ --stn-pagination-compact-breakpoint: 480px;
26
+ --stn-pagination-compact-size: var(--stn-size-28, 28px);
27
+ --stn-pagination-compact-padding: var(--stn-space-6, 6px);
28
+ --stn-pagination-compact-font-size: var(--stn-font-size-12, 12px);
29
+ --stn-pagination-compact-gap: var(--stn-space-4, 4px);
18
30
  }
@@ -66,6 +66,9 @@
66
66
  --stn-input-focus-bg: color-mix(in srgb, var(--stn-blue-250) 10%, transparent);
67
67
  --stn-input-focus-fg: var(--stn-blue-300);
68
68
  --stn-input-placeholder: var(--stn-gray-600);
69
+ --stn-label-prefix-label-bg: var(--stn-gray-800);
70
+ --stn-label-prefix-divider: var(--stn-gray-600);
71
+ --stn-label-prefix-label-color: var(--stn-gray-400);
69
72
  --stn-input-disabled-opacity: 0.55;
70
73
  --stn-input-filled-bg: var(--stn-gray-900);
71
74
  --stn-input-filled-border: transparent;
@@ -110,7 +113,7 @@
110
113
  --stn-tree-label-folder-nested: var(--stn-gray-200);
111
114
  --stn-tree-label-root: var(--stn-static-white);
112
115
  --stn-tree-label-server: var(--stn-gray-400);
113
- --stn-tree-selected: var(--stn-gray-700);
116
+ --stn-tree-selected: var(--stn-gray-800);
114
117
  --stn-tree-server-icon: var(--stn-gray-400);
115
118
  --stn-scroll-thumb: var(--stn-gray-250);
116
119
  --stn-section-side-bg: var(--stn-gray-900);
@@ -132,16 +135,16 @@
132
135
  --stn-table-pill-shadow: 1px 1px 4px color-mix(in srgb, var(--stn-static-black) 10%, transparent);
133
136
  --stn-table-row-hover: var(--stn-gray-900);
134
137
  --stn-table-td-fg: var(--stn-gray-50);
135
- --stn-table-th-bg: var(--stn-gray-750);
138
+ --stn-table-th-bg: var(--stn-opacity-white-5);
136
139
  --stn-table-th-fg: var(--stn-gray-350);
137
140
  --stn-table-th-radius: 8px;
138
- --stn-pagination-active-bg: color-mix(in srgb, var(--stn-static-white) 5%, transparent);
141
+ --stn-pagination-active-bg: var(--stn-opacity-white-10);
139
142
  --stn-pagination-active-color: var(--stn-gray-50);
140
143
  --stn-pagination-color: var(--stn-gray-50);
141
144
  --stn-pagination-font-size: var(--stn-font-size-13);
142
145
  --stn-pagination-font-weight: var(--stn-font-weight-regular, 400);
143
146
  --stn-search-requirement-bg: transparent;
144
- --stn-search-requirement-border: var(--stn-gray-700);
147
+ --stn-search-requirement-border: var(--stn-gray-750);
145
148
  --stn-search-requirement-export-bg: var(--stn-gray-800);
146
149
  --stn-search-requirement-label: var(--stn-gray-100);
147
150
  --stn-search-requirement-shadow: var(--stn-shadow-1);
@@ -632,6 +635,9 @@
632
635
  --stn-input-focus-bg: var(--stn-static-white);
633
636
  --stn-input-focus-fg: var(--stn-gray-600);
634
637
  --stn-input-placeholder: var(--stn-gray-400);
638
+ --stn-label-prefix-label-bg: var(--stn-gray-50);
639
+ --stn-label-prefix-divider: var(--stn-gray-200);
640
+ --stn-label-prefix-label-color: var(--stn-gray-500);
635
641
  --stn-input-disabled-opacity: 0.55;
636
642
  --stn-input-filled-bg: var(--stn-gray-50);
637
643
  --stn-input-filled-border: transparent;
@@ -698,11 +704,11 @@
698
704
  --stn-table-pill-shadow: 1px 1px 2px color-mix(in srgb, var(--stn-static-black) 10%, transparent);
699
705
  --stn-table-row-hover: var(--stn-gray-25);
700
706
  --stn-table-td-fg: var(--stn-gray-750);
701
- --stn-table-th-bg: var(--stn-gray-50);
707
+ --stn-table-th-bg: var(--stn-opacity-black-5);
702
708
  --stn-table-th-fg: var(--stn-gray-700);
703
709
  --stn-table-th-radius: 4px;
704
- --stn-pagination-active-bg: var(--stn-gray-50);
705
- --stn-pagination-active-color: var(--stn-gray-700);
710
+ --stn-pagination-active-bg: var(--stn-opacity-black-5);
711
+ --stn-pagination-active-color: var(--stn-gray-900);
706
712
  --stn-pagination-color: var(--stn-gray-700);
707
713
  --stn-pagination-font-size: var(--stn-font-size-14);
708
714
  --stn-pagination-font-weight: var(--stn-font-weight-medium, 500);
@@ -23,11 +23,11 @@
23
23
  --stn-radius-control: var(--stn-radius-8);
24
24
  --stn-radius-input-sm: var(--stn-radius-4);
25
25
  --stn-radius-input-md: var(--stn-radius-4);
26
- --stn-radius-input-lg: var(--stn-radius-6);
26
+ --stn-radius-input-lg: var(--stn-radius-8);
27
27
  --stn-radius-input-xl: var(--stn-radius-16);
28
28
  --stn-radius-dropdown-sm: var(--stn-radius-4);
29
29
  --stn-radius-dropdown-md: var(--stn-radius-4);
30
- --stn-radius-dropdown-lg: var(--stn-radius-6);
30
+ --stn-radius-dropdown-lg: var(--stn-radius-8);
31
31
  --stn-radius-dropdown-prominent: var(--stn-radius-8);
32
32
  --stn-radius-segmented: var(--stn-radius-circle);
33
33
  --stn-radius-segmented-item: var(--stn-radius-16);
@@ -46,7 +46,7 @@
46
46
  --stn-radius-chip-pill: var(--stn-radius-circle);
47
47
  --stn-radius-checkbox: var(--stn-radius-3);
48
48
  --stn-pagination-radius-active: var(--stn-radius-circle);
49
- --stn-pagination-radius-idle: var(--stn-radius-3);
49
+ --stn-pagination-radius-idle: var(--stn-radius-circle);
50
50
  --stn-switch-radius: var(--stn-radius-circle);
51
51
  --stn-progress-radius: var(--stn-radius-circle);
52
52
  --stn-progress-radius-square: var(--stn-radius-0);
@@ -67,4 +67,5 @@
67
67
  --stn-widget-stat-card-radius: var(--stn-radius-8);
68
68
  --stn-widget-appearance-radius: var(--stn-radius-8);
69
69
  --stn-widget-scrollbar-radius: var(--stn-radius-4);
70
+ --stn-search-requirement-radius: var(--stn-radius-8);
70
71
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  :root {
10
10
  --stn-btn-height-xl: var(--stn-size-56);
11
- --stn-btn-height-lg: var(--stn-size-44);
11
+ --stn-btn-height-lg: var(--stn-size-40);
12
12
  --stn-btn-height-md: var(--stn-size-32);
13
13
  --stn-btn-height-sm: var(--stn-size-24);
14
14
  --stn-btn-height-xs: var(--stn-size-16);
@@ -37,7 +37,22 @@
37
37
  --stn-dropdown-height-sm: var(--stn-size-24);
38
38
  --stn-dropdown-height-md: var(--stn-size-32);
39
39
  --stn-dropdown-height-lg: var(--stn-size-40);
40
- --stn-dropdown-height-prominent: var(--stn-size-52);
40
+ --stn-dropdown-height-xl: var(--stn-size-56);
41
+ --stn-date-range-field-height-sm: var(--stn-size-24);
42
+ --stn-date-range-field-height-md: var(--stn-size-32);
43
+ --stn-date-range-field-height-lg: var(--stn-size-40);
44
+ --stn-date-range-field-height-xl: var(--stn-size-56);
45
+ --stn-date-range-field-min-width-sm: var(--stn-size-280);
46
+ --stn-date-range-field-min-width-md: var(--stn-size-340);
47
+ --stn-date-range-field-min-width-lg: var(--stn-size-360);
48
+ --stn-date-range-field-min-width-xl: var(--stn-size-400);
49
+ --stn-date-range-field-icon-size-sm: var(--stn-size-14);
50
+ --stn-date-range-field-icon-size-md: var(--stn-size-16);
51
+ --stn-date-range-field-icon-size-lg: var(--stn-size-16);
52
+ --stn-date-range-field-icon-size-xl: var(--stn-size-20);
53
+ --stn-search-requirement-border-width: var(--stn-size-1);
54
+ --stn-search-requirement-divider-height: var(--stn-size-18);
55
+ --stn-search-requirement-divider-width: var(--stn-size-1);
41
56
  --stn-text-field-icon-box-size: var(--stn-size-28);
42
57
  --stn-icon-box-size: var(--stn-size-28);
43
58
  --stn-icon-box-size-xs: var(--stn-size-20);
@@ -45,8 +60,8 @@
45
60
  --stn-icon-box-size-md: var(--stn-size-28);
46
61
  --stn-icon-box-size-lg: var(--stn-size-36);
47
62
  --stn-icon-box-size-xl: var(--stn-size-44);
48
- --stn-pop-header-height: var(--stn-size-48);
49
- --stn-pop-footer-height: var(--stn-size-64);
63
+ --stn-pop-header-height: var(--stn-size-56);
64
+ --stn-pop-footer-height: var(--stn-size-56);
50
65
  --stn-segmented-item-height: var(--stn-size-32);
51
66
  --stn-segmented-item-height-sm: var(--stn-size-26);
52
67
  --stn-segmented-item-height-lg: var(--stn-size-40);
@@ -57,8 +72,6 @@
57
72
  --stn-pop-width-md: var(--stn-size-480);
58
73
  --stn-pop-width-lg: var(--stn-size-640);
59
74
  --stn-pop-width-xl: var(--stn-size-940);
60
- --stn-pop-width-xxl: var(--stn-size-1200);
61
- --stn-pop-width-2xl: var(--stn-size-1500);
62
75
  --stn-switch-track-w-sm: var(--stn-size-28);
63
76
  --stn-switch-track-w-md: var(--stn-size-36);
64
77
  --stn-switch-track-w-lg: var(--stn-size-44);
@@ -51,7 +51,9 @@
51
51
  --stn-size-260: 260px;
52
52
  --stn-size-280: 280px;
53
53
  --stn-size-320: 320px;
54
+ --stn-size-340: 340px;
54
55
  --stn-size-360: 360px;
56
+ --stn-size-400: 400px;
55
57
  --stn-size-480: 480px;
56
58
  --stn-size-500: 500px;
57
59
  --stn-size-640: 640px;
@@ -224,4 +224,16 @@
224
224
  --stn-widget-stat-card-padding: var(--stn-space-12);
225
225
  --stn-widget-head-bottom-compact: var(--stn-space-6);
226
226
  --stn-widget-panel-padding-end: var(--stn-space-2);
227
+ --stn-search-requirement-padding: var(--stn-space-16);
228
+ --stn-search-requirement-padding-y: var(--stn-space-16);
229
+ --stn-search-requirement-padding-x: var(--stn-space-16);
230
+ --stn-search-requirement-gap-row: var(--stn-space-20);
231
+ --stn-search-requirement-gap-col: var(--stn-space-16);
232
+ --stn-search-requirement-fields-gap: var(--stn-space-16);
233
+ --stn-search-requirement-field-gap: var(--stn-space-8);
234
+ --stn-search-requirement-compact-padding: var(--stn-space-12);
235
+ --stn-search-requirement-compact-padding-y: var(--stn-space-12);
236
+ --stn-search-requirement-compact-padding-x: var(--stn-space-12);
237
+ --stn-search-requirement-compact-gap: var(--stn-space-12);
238
+ --stn-search-requirement-divider-margin-x: var(--stn-space-4);
227
239
  }
@@ -74,6 +74,7 @@
74
74
  --stn-line-height-px-41: 41px;
75
75
  --stn-line-height-px-44: 44px;
76
76
  --stn-line-height-px-50: 50px;
77
+ --stn-line-height-px-54: 54px;
77
78
  --stn-line-height-px-60: 60px;
78
79
  --stn-line-height-px-65: 65px;
79
80
  --stn-line-height-px-98: 98px;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnSearchRequirement.ts"],"sourcesContent":["/**\n * Infomap 검색조건 패턴 — Figma 40000042:186893\n * @see StnSearchRequirementBar · `.search_area` (Pub HTML)\n */\n\nexport const STN_SEARCH_REQUIREMENT_FIGMA = '40000042:186893'\n\nexport const STN_SEARCH_REQUIREMENT_NAME = 'Search requirement bar'\n\n/** 한글 UI 라벨 (Infomap 제품) */\nexport const STN_SEARCH_REQUIREMENT_KO_NAME = '검색조건'\n\nexport const STN_SEARCH_REQUIREMENT_INTRO =\n '목록 · 상세 조회 화면 상단에서 조건 필터링과 검색을 실행하는 검색바 패턴입니다. 텍스트 입력, 드롭다운, 날짜 선택과 엑셀 다운로드 버튼을 자유롭게 조합할 수 있습니다.'\n\nexport const STN_SEARCH_REQUIREMENT_SPEC = [\n { property: 'Shell padding (Default)', value: '8px 16px', note: 'Figma py/px 표준' },\n { property: 'Shell padding (Compact)', value: '6px 12px', note: '밀집형 바 (`density=\"compact\"`), gap 12px' },\n { property: 'Shell radius', value: '8px', note: 'rounded card' },\n {\n property: 'Shell border',\n value: 'Light gray-75 · Dark gray-700',\n note: '`--stn-search-requirement-border`',\n },\n {\n property: 'Shell bg',\n value: 'transparent',\n note: '`--stn-search-requirement-bg` · Figma list — no fill',\n },\n {\n property: 'Shell shadow',\n value: 'Light gray-75 · Dark black/35%',\n note: '`--stn-search-requirement-shadow`',\n },\n { property: 'Main gap', value: '20px 16px', note: 'row-gap 20px, col-gap 16px' },\n { property: 'Fields gap', value: '16px (Compact 12px)', note: 'field items inline gap' },\n { property: 'Group divider', value: '1px × 18px', note: '`StnSearchRequirementBar.Divider` (수직 구분선)' },\n { property: 'Label–control gap', value: '8px', note: 'inline gap between label and control' },\n {\n property: 'Label',\n value: 'Light gray-850 · Dark gray-100',\n note: '`--stn-search-requirement-label` · 14px semibold',\n },\n { property: 'Controls', value: '32px (M)', note: 'TextField · Dropdown · DateRangeField' },\n { property: 'Search btn', value: 'StnButton primary M · 32px', note: 'search icon + label' },\n {\n property: 'Export',\n value: 'StnButton ghost · line/file-analytics',\n note: 'root 직속 · `margin-left: auto` 우측 정렬 · 트레이 없음',\n },\n] as const\n\nexport const STN_SEARCH_REQUIREMENT_DEMO_FIELDS = {\n reportTypeText: { label: '보고서 종류', value: '전체' },\n reportTypeSelect: { label: '보고서 종류', value: '' },\n periodType: { label: '기간 유형', value: '' },\n period: {\n label: '기간',\n start: '2024-02-07 09:22:34',\n end: '2024-03-07 09:22:34',\n },\n} as const\n\nexport const STN_SEARCH_REQUIREMENT_USAGE = `import {\n StnDateRangePickerField,\n StnDropdown,\n StnSearchRequirementBar,\n StnTextField,\n} from '@stn-uiux/pub-ui-react'\n\nconst options = [{ value: '', label: '전체' }]\n\n<StnSearchRequirementBar>\n <StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.Field label=\"보고서 종류\">\n <StnTextField size=\"M\" defaultValue=\"전체\" width={140} aria-label=\"Report type\" />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label=\"보고서 종류\">\n <StnDropdown size=\"md\" width={130} options={options} defaultValue=\"\" aria-label=\"Report type\" />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label=\"기간 유형\">\n <StnDropdown size=\"md\" width={130} options={options} defaultValue=\"\" aria-label=\"Period type\" />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label=\"기간\">\n <StnDateRangePickerField size=\"M\" showTime defaultValue={{ start: null, end: null }} aria-label=\"Period\" />\n </StnSearchRequirementBar.Field>\n </StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.SearchButton onClick={() => {}}>검색</StnSearchRequirementBar.SearchButton>\n <StnSearchRequirementBar.Export onClick={() => {}} />\n</StnSearchRequirementBar>`\n\nexport const STN_SEARCH_REQUIREMENT_USAGE_HTML = `<!-- Pub .search_area — 검색조건 -->\n<section class=\"search_area stn-search-requirement\">\n <div class=\"stn-search-requirement__fields\">\n <div class=\"stn-search-requirement__field\">\n <label class=\"stn-search-requirement__label\">보고서 종류</label>\n <input type=\"text\" class=\"stn-text-field md\" value=\"전체\" />\n </div>\n <div class=\"stn-search-requirement__field\">\n <label class=\"stn-search-requirement__label\">기간 유형</label>\n <div class=\"stn-dropdown md\"></div>\n </div>\n <div class=\"stn-search-requirement__field\">\n <label class=\"stn-search-requirement__label\">기간</label>\n <button type=\"button\" class=\"stn-date-range-field\"></button>\n </div>\n </div>\n <button type=\"button\" class=\"stn-btn contained md\">검색</button>\n <button type=\"button\" class=\"stn-btn ghost md icon\" aria-label=\"Excel보내기\">\n <!-- StnIcon line/file-analytics -->\n </button>\n</section>`\n"],"mappings":";AAKO,IAAM,+BAA+B;AAErC,IAAM,8BAA8B;AAGpC,IAAM,iCAAiC;AAEvC,IAAM,+BACX;AAEK,IAAM,8BAA8B;AAAA,EACzC,EAAE,UAAU,2BAA2B,OAAO,YAAY,MAAM,2BAAiB;AAAA,EACjF,EAAE,UAAU,2BAA2B,OAAO,YAAY,MAAM,4DAAwC;AAAA,EACxG,EAAE,UAAU,gBAAgB,OAAO,OAAO,MAAM,eAAe;AAAA,EAC/D;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,EAAE,UAAU,YAAY,OAAO,aAAa,MAAM,6BAA6B;AAAA,EAC/E,EAAE,UAAU,cAAc,OAAO,uBAAuB,MAAM,yBAAyB;AAAA,EACvF,EAAE,UAAU,iBAAiB,OAAO,iBAAc,MAAM,sEAA6C;AAAA,EACrG,EAAE,UAAU,0BAAqB,OAAO,OAAO,MAAM,uCAAuC;AAAA,EAC5F;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,EAAE,UAAU,YAAY,OAAO,YAAY,MAAM,8CAAwC;AAAA,EACzF,EAAE,UAAU,cAAc,OAAO,iCAA8B,MAAM,sBAAsB;AAAA,EAC3F;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAEO,IAAM,qCAAqC;AAAA,EAChD,gBAAgB,EAAE,OAAO,mCAAU,OAAO,eAAK;AAAA,EAC/C,kBAAkB,EAAE,OAAO,mCAAU,OAAO,GAAG;AAAA,EAC/C,YAAY,EAAE,OAAO,6BAAS,OAAO,GAAG;AAAA,EACxC,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACF;AAEO,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BrC,IAAM,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnLayout.ts"],"sourcesContent":["/**\n * Pub page layout — `.stn-wrap` · `.stn-container` · `.stn-content-area` · 대시보드 region\n * @see layout.css · StnLayerShell (@stn-uiux/pub-ui-react)\n */\n\nexport const STN_LAYOUT_INTRO = ''\n\n/** 라이브 예제 탭 — shell 종류 + 대표 화면 레시피 */\nexport const STN_LAYOUT_PLAYGROUND_TABS: readonly {\n id: 'list' | 'dashboard' | 'alert-center'\n label: string\n screen: string\n shellProps: string\n assemble: string\n}[] = [\n {\n id: 'list',\n label: '리스트·상세',\n screen: 'interface_list.html · syslog_status.html',\n shellProps: \"contentModifiers={['has_lnb', 'has_sch']}\",\n assemble: 'ListPageScaffold shell=\"layer\" — gnb · header · lnb · search · table',\n },\n {\n id: 'dashboard',\n label: '맵·대시보드',\n screen: 'basic/map.html · dashboard_map …',\n shellProps: \"bodyWrapper='none'\",\n assemble: 'DashboardPageScaffold · MapPlaceholder + dashboard_right',\n },\n {\n id: 'alert-center',\n label: '알림센터',\n screen: 'basic/alert_center.html',\n shellProps: \"bodyWrapper='none' · network_topology_header · GNB 알림패널\",\n assemble: 'AlertCenterPageScaffold (맵 placeholder + 우측 4위젯)',\n },\n]\n\nexport const STN_LAYOUT_LIST_VIEW_INTRO =\n 'List view는 배경 · Side Navigation·페이지 헤더 · 트리 LNB · 검색 · 표로 구성됩니다. `ListPageScaffold`에 gnb · header · lnb · search · children(표) 슬롯만 넘기면 됩니다. Playground에서 옵션을 고른 뒤 생성된 React/HTML 코드를 복사하세요.'\n\n/** 라이브러리 내부 조립 참고 — 제품 화면은 `STN_LAYOUT_LIST_VIEW_USAGE`(`ListPageScaffold`)만 사용 */\nexport const STN_LAYOUT_LIST_VIEW_BARE_USAGE = `import {\n StnLayerShell,\n StnListViewLayout,\n StnSideNavigation,\n StnHeader,\n StnSearchRequirementBar,\n StnSectionSide,\n StnTable,\n} from '@stn-uiux/pub-ui-react'\n\n/** StnLayerShell 안 — L1 listview 그리드만 (이중 L0/L2 없음) */\nexport function InterfaceListPage() {\n return (\n <StnLayerShell\n gnb={<StnSideNavigation collapsed />}\n header={<StnHeader variant=\"page\" />}\n contentModifiers={['has_lnb', 'has_sch']}\n lnbSide=\"left\"\n >\n <StnListViewLayout\n bare\n sidebar={<StnSectionSide>{/* StnTree */}</StnSectionSide>}\n search={\n <StnSearchRequirementBar>{/* Fields · SearchButton */}</StnSearchRequirementBar>\n }\n >\n <StnTable summary=\"목록\" />\n </StnListViewLayout>\n </StnLayerShell>\n )\n}`\n\n/** List view 문서 탭 */\nexport type StnLayoutListLayerTabId = 'live' | 'l0' | 'l1' | 'l2'\n\nexport const STN_LAYOUT_LIST_LAYER_TABS: {\n id: StnLayoutListLayerTabId\n label: string\n}[] = [\n { id: 'live', label: '전체' },\n { id: 'l0', label: 'L0 Background' },\n { id: 'l1', label: 'L1 Main UI' },\n { id: 'l2', label: 'L2 Modal' },\n]\n\nexport const STN_LAYOUT_LIST_VIEW_USAGE = `import {\n ListPageScaffold,\n StnHeader,\n StnSideNavigation,\n StnSearchRequirementBar,\n StnTable,\n StnPagination,\n StnButton,\n} from '@stn-uiux/pub-ui-react'\n\nexport function InterfaceListPage() {\n return (\n <ListPageScaffold\n shell=\"layer\"\n lnbSide=\"left\"\n gnb={<StnSideNavigation />}\n header={<StnHeader variant=\"page\" />}\n contentModifiers={['has_lnb', 'has_sch']}\n search={\n <StnSearchRequirementBar>{/* Fields · SearchButton */}</StnSearchRequirementBar>\n }\n >\n <StnTable\n summary=\"총 128개 (1 to 20)\"\n footerCenter={<StnPagination page={1} count={8} />}\n footerRight={\n <>\n <StnButton size=\"M\">등록</StnButton>\n <StnButton size=\"M\" variant=\"ghost\">수정</StnButton>\n </>\n }\n >\n <StnTable.Grid>{/* … */}</StnTable.Grid>\n </StnTable>\n </ListPageScaffold>\n )\n}`\n\nexport const STN_LAYOUT_MAP_DASHBOARD_INTRO =\n '대시보드는 L0 배경 · L1(header 크롬 + content 본문 단 하나) · L2 모달입니다. 본문은 `layer1` 슬롯이 아니라 `left`/`right`/`children`으로 조립합니다. `DashboardPageScaffold` (type=\"map\" | \"topology\" | \"widget-grid\").'\n\n/** Map / Dashboard 문서 탭 — List view와 동일 층 모델 */\nexport type StnLayoutMapLayerTabId = StnLayoutListLayerTabId\n\nexport const STN_LAYOUT_MAP_LAYER_TABS: {\n id: StnLayoutMapLayerTabId\n label: string\n}[] = [\n { id: 'live', label: '전체' },\n { id: 'l0', label: 'L0 Background' },\n { id: 'l1', label: 'L1 Main UI' },\n { id: 'l2', label: 'L2 Modal' },\n]\n\nexport const STN_LAYOUT_MAP_DASHBOARD_USAGE = `import { DashboardPageScaffold, StnLayer0Background, StnSideNavigation, StnHeader } from '@stn-uiux/pub-ui-react'\n\nexport function TopologyMapPage() {\n return (\n <DashboardPageScaffold\n type=\"map\"\n shell=\"layer\"\n gnbSide=\"left\"\n layer0={<StnLayer0Background variant=\"map-light\" />}\n gnb={<StnSideNavigation collapsed />}\n header={<StnHeader variant=\"dashboard\" />}\n />\n )\n}`\n\nexport const STN_LAYOUT_MAP_DASHBOARD_HEADER_USAGE = `import {\n DashboardPageScaffold,\n StnHeader,\n StnSideNavigation,\n} from '@stn-uiux/pub-ui-react'\n\nexport function TopologyMapPage() {\n return (\n <DashboardPageScaffold\n type=\"topology\"\n shell=\"layer\"\n gnb={<StnSideNavigation collapsed />}\n header={<StnHeader variant=\"widget\" />}\n mapMessage=\"토폴로지 맵\"\n />\n )\n}`\n\n/** 경우의 수 — 무엇을 쓸지 */\nexport const STN_LAYOUT_WHEN_TO_USE: readonly {\n situation: string\n use: string\n export: string\n}[] = [\n {\n situation: '표준 3단계 층위 기반 페이지 구성',\n use: 'StnLayerShell — L0 Background · L1 Main UI · L2 Modal',\n export: 'StnLayerShell · lnbSide left|right',\n },\n {\n situation: '구역 라벨만 빠르게 (lnb, search, 맵 빈칸)',\n use: 'Shell + StnPageScaffold.Region / MapPlaceholder',\n export: 'StnPageScaffold.*',\n },\n {\n situation: '대표 HTML 한 장을 1단계로 (interface_list, alert_center)',\n use: '화면별 레시피 (내부에서 Shell 이미 포함)',\n export: 'ListPageScaffold · DashboardPageScaffold · AlertCenterPageScaffold',\n },\n {\n situation: 'L3 팝업 본문 자리만 표시',\n use: 'StnLayer + StnPageScaffold.Layer',\n export: 'StnPageScaffold.Layer',\n },\n {\n situation: '위젯·테이블 본문이 API 로딩 중',\n use: 'Components — Loading skeleton (Layout 아님)',\n export: 'StnLoadingSkeleton',\n },\n]\n\nexport type StnLayoutScreenKind =\n | 'list'\n | 'dashboard-map'\n | 'alert-center'\n | 'converged-dashboard'\n | 'popup-overlay'\n | 'widget-board'\n | 'standard'\n\n/** @deprecated StnLayoutScreenKind */\nexport type StnPageScaffoldKind = StnLayoutScreenKind\n\nexport const STN_LAYOUT_SCREEN_RECIPES: readonly {\n id: StnLayoutScreenKind\n label: string\n pubExamples: string\n reactRecipe: string\n layoutTab: 'list' | 'dashboard'\n note: string\n}[] = [\n {\n id: 'list',\n label: '리스트·상세',\n pubExamples: 'interface_list.html · syslog_status.html',\n reactRecipe: 'ListPageScaffold',\n layoutTab: 'list',\n note: 'L0 wrap · L1 .stn-container · L2 GNB',\n },\n {\n id: 'dashboard-map',\n label: '맵·대시보드',\n pubExamples: 'basic/map.html · dashboard_map …',\n reactRecipe: 'DashboardPageScaffold',\n layoutTab: 'dashboard',\n note: 'map(z50) · dashboard_left / dashboard_right',\n },\n {\n id: 'alert-center',\n label: '알림센터',\n pubExamples: 'basic/alert_center.html',\n reactRecipe: 'AlertCenterPageScaffold',\n layoutTab: 'dashboard',\n note: 'GNB 알림 · 맵 placeholder · 우측 4위젯',\n },\n {\n id: 'converged-dashboard',\n label: '융합망 대시',\n pubExamples: 'converged/dashboard_map.html',\n reactRecipe: 'DashboardPageScaffold (converged_header)',\n layoutTab: 'dashboard',\n note: 'wrap-converged',\n },\n {\n id: 'popup-overlay',\n label: '팝·딤',\n pubExamples: 'regist_pop.html · widget_dim.html',\n reactRecipe: 'StnPageScaffold.Layer + StnPopup',\n layoutTab: 'list',\n note: 'L3/L4',\n },\n {\n id: 'widget-board',\n label: '위젯보드',\n pubExamples: 'widgetboard/widget*.html',\n reactRecipe: 'StnWidget shell=board',\n layoutTab: 'dashboard',\n note: 'board-item',\n },\n {\n id: 'standard',\n label: '일반 콘텐츠',\n pubExamples: 'CCTV · node tools …',\n reactRecipe: 'StnLayerShell + Region',\n layoutTab: 'list',\n note: 'head_area · stn-content-area',\n },\n]\n\n/** @deprecated STN_LAYOUT_SCREEN_RECIPES */\nexport const STN_PAGE_SCAFFOLD_KINDS = STN_LAYOUT_SCREEN_RECIPES\n\nexport const STN_LAYOUT_SLOT_USAGE = `import { StnPageScaffold, StnLayer, StnPopup } from '@stn-uiux/pub-ui-react'\n\n/** Shell children 안 — 구역 라벨 */\n<StnLayerShell gnb={<StnSideNavigation />} contentModifiers={['has_lnb', 'has_sch']} header={…}>\n <StnPageScaffold.Region label=\"lnb_box\" hint=\"LNB 트리\" />\n <StnPageScaffold.Region label=\"search_area\" />\n</StnLayerShell>\n\n/** 맵 빈 칸 */\n<StnPageScaffold.MapPlaceholder message=\"맵은 추후 연동\" />\n\n/** 맵 빈 본문 — L0만 보이는 캔버스 (위젯·placeholder 없음) */\n<DashboardPageScaffold bodyEmpty shell=\"layer\" gnb={gnb} layer0={layer0} />\n\n/** L3 팝업 슬롯 */\n<StnLayer level={3} surface=\"transparent\">\n <StnPageScaffold.Layer level={3} label=\"팝업 본문\">\n <StnPopup open>…</StnPopup>\n </StnPageScaffold.Layer>\n</StnLayer>`\n\nexport const STN_LAYOUT_ALERT_CENTER_USAGE = `import { AlertCenterPageScaffold } from '@stn-uiux/pub-ui-react'\n\n<AlertCenterPageScaffold mapMessage=\"맵은 추후 연동\" showFaultPanelPlaceholder />`\n\n/** @deprecated */\nexport const STN_PAGE_SCAFFOLD_COMPOUND_USAGE = STN_LAYOUT_SLOT_USAGE\n\n/** @deprecated */\nexport const STN_ALERT_CENTER_PAGE_SCAFFOLD_USAGE = STN_LAYOUT_ALERT_CENTER_USAGE\n\n/** @deprecated */\nexport const STN_PAGE_SCAFFOLD_INTRO = STN_LAYOUT_INTRO\n\nexport const STN_LAYOUT_RECIPES: readonly {\n id: 'list' | 'dashboard'\n label: string\n screen: string\n shellProps: string\n childrenHint: string\n}[] = [\n {\n id: 'list',\n label: '리스트·상세',\n screen: 'interface_list, syslog_status …',\n shellProps: 'contentModifiers={[\\'has_lnb\\', \\'has_sch\\']} · header=<StnLayoutHeader>',\n childrenHint: 'lnb_box · search_area · stn-table (+ StnTable, StnButton)',\n },\n {\n id: 'dashboard',\n label: '맵·대시보드',\n screen: 'basic/map.html, dashboard_map …',\n shellProps: 'bodyWrapper=\"none\" · chrome=\"network_topology_header\"',\n childrenHint: '.dashboard · .dashboard_left · StnLayoutRegion(region=\"map\")',\n },\n]\n\n/** Pub `.stn-content-area` modifier */\nexport type StnContentAreaModifier =\n | 'has_lnb'\n | 'has_lnb2'\n | 'has_lnb_right'\n | 'has_lnb_right2'\n | 'has_sch'\n | 'has_sch_row2'\n | 'flexible'\n\n/** LNB·트리 열 위치 — `has_lnb*` modifier 와 조합 */\nexport type StnLnbSide = 'left' | 'right'\n\n\n\n/** 대시보드·맵 화면 내 고정 슬롯 */\nexport type StnLayoutRegion =\n | 'top_right'\n | 'dashboard'\n | 'dashboard_left'\n | 'dashboard_right'\n | 'dashboard_body'\n | 'wrap_topology'\n | 'map'\n | 'dash_canvas'\n\nexport const STN_LAYOUT_PAGE_TREE = `.stn-wrap (legacy v1: #wrap)\n├── .stn-side-nav (absolute overlay · StnSideNavigation)\n└── .stn-layer-1 (L1 · 네비 제외 영역)\n ├── .stn-layer-1__header (Header)\n └── .stn-content-area / .stn-stack\n └── .stn-stack …` as const\n\nexport const STN_LAYOUT_LAYER_PAGE_TREE = `.stn-wrap (Root Shell · data-stn-layer-mode=\"v2\")\n├── StnLayer.Background (L0 · layer0-bg)\n├── .stn-side-nav / StnSideNavigation (absolute overlay · wrap 직속)\n├── [data-stn-layer-role=\"utility\"] (toast · audio)\n└── StnLayer.Content (.stn-layer-1) (L1 — 하나)\n ├── .stn-layer-1__header\n └── .stn-content-area / .stn-stack\n └── lnb_box | content_box | .stn-stack` as const\n\nexport const STN_LAYOUT_CONTENT_ROWS: {\n modifier: StnContentAreaModifier\n pubClass: string\n label: string\n note: string\n}[] = [\n {\n modifier: 'has_lnb',\n pubClass: '.stn-content-area.has_lnb',\n label: 'LNB 1열',\n note: 'padding-left: 268px · head_area 동기화',\n },\n {\n modifier: 'has_lnb2',\n pubClass: '.stn-content-area.has_lnb2',\n label: 'LNB 2열 (좌)',\n note: 'padding-left: 536px',\n },\n {\n modifier: 'has_lnb_right',\n pubClass: '.stn-content-area.has_lnb_right',\n label: 'LNB 1열 (우)',\n note: 'padding-right: 268px · lnb_box_right',\n },\n {\n modifier: 'has_lnb_right2',\n pubClass: '.stn-content-area.has_lnb_right2',\n label: 'LNB 2열 (우)',\n note: 'padding-right: 536px',\n },\n {\n modifier: 'has_sch',\n pubClass: '.stn-content-area.has_sch',\n label: '검색 영역',\n note: 'flex column · search_area + content_box',\n },\n {\n modifier: 'has_sch_row2',\n pubClass: '.stn-content-area.has_sch_row2',\n label: '검색 2줄',\n note: 'padding-top: 94px',\n },\n {\n modifier: 'flexible',\n pubClass: '.stn-content-area.flexible',\n label: '가변 높이 테이블',\n note: 'stn-table flex fill',\n },\n]\n\n\nexport const STN_LAYOUT_REGION_ROWS: {\n region: StnLayoutRegion\n pubClass: string\n label: string\n note: string\n}[] = [\n { region: 'top_right', pubClass: '.dash-top-right-widget', label: '우상단 위젯', note: '시스템 감시·테마·시계' },\n { region: 'dashboard', pubClass: '.dashboard', label: '대시보드 루트', note: '맵·위젯 본문' },\n { region: 'dashboard_left', pubClass: '.dashboard_left', label: '좌측 열', note: '토폴로지·맵' },\n { region: 'dashboard_right', pubClass: '.dashboard_right', label: '우측 열', note: '장애·위젯 패널' },\n { region: 'dashboard_body', pubClass: '.dashboard_body', label: '융합망 본문', note: 'converged 레이아웃' },\n { region: 'wrap_topology', pubClass: '.wrap_topology', label: '토폴로지 래퍼', note: 'stn-elev-map' },\n { region: 'map', pubClass: '.map', label: '맵 영역', note: '' },\n { region: 'dash_canvas', pubClass: '.stn-widget.shell-canvas', label: '캔버스', note: '토폴로지/맵 위젯 (variant=\"canvas\")' },\n]\n\nconst CONTENT_CLASS: Record<StnContentAreaModifier, string> = {\n has_lnb: 'has_lnb',\n has_lnb2: 'has_lnb2',\n has_lnb_right: 'has_lnb_right',\n has_lnb_right2: 'has_lnb_right2',\n has_sch: 'has_sch',\n has_sch_row2: 'has_sch_row2',\n flexible: 'flexible',\n}\n\nconst REGION_CLASS: Record<StnLayoutRegion, string> = {\n top_right: 'dash-top-right-widget',\n dashboard: 'dashboard',\n dashboard_left: 'dashboard_left',\n dashboard_right: 'dashboard_right',\n dashboard_body: 'dashboard_body',\n wrap_topology: 'wrap_topology',\n map: 'map',\n dash_canvas: 'stn-widget shell-canvas',\n}\n\nfunction normalizeList<T>(value?: T | T[]): T[] {\n if (value == null) return []\n return Array.isArray(value) ? value : [value]\n}\n\nexport function pubContentAreaClasses(\n modifiers?: StnContentAreaModifier | StnContentAreaModifier[],\n): string[] {\n return normalizeList(modifiers).map((m) => CONTENT_CLASS[m])\n}\n\nexport function pubLayoutRegionClass(region: StnLayoutRegion): string {\n return REGION_CLASS[region]\n}\n\n/** `lnbSide` — `has_lnb` / `has_lnb2` 를 좌·우 modifier 로 치환 */\nexport function applyLnbSideToModifiers(\n modifiers?: StnContentAreaModifier | StnContentAreaModifier[],\n lnbSide: StnLnbSide = 'left',\n): StnContentAreaModifier[] {\n const list = normalizeList(modifiers)\n if (lnbSide === 'left') return list\n return list.map((m) => {\n if (m === 'has_lnb') return 'has_lnb_right'\n if (m === 'has_lnb2') return 'has_lnb_right2'\n return m\n })\n}\n\nexport const STN_LAYER_SHELL_USAGE = `import { StnSideNavigation, StnLayerShell } from '@stn-uiux/pub-ui-react'\n\n/** StnLayer role 페이지 셸 — 컨테이너(.stn-container)를 StnLayer.Content 가 겸함 */\nexport function ListPage({ gnb, title, children }) {\n return (\n <StnLayerShell\n gnb={gnb}\n lnbSide=\"left\"\n contentModifiers={['has_lnb', 'has_sch']}\n header={\n <StnLayoutHeader>\n <h3 className=\"title\">{title}</h3>\n </StnLayoutHeader>\n }\n >\n <aside className=\"lnb_box\">…트리·LNB…</aside>\n <div className=\"content_box\">{children}</div>\n </StnLayerShell>\n )\n}\n\n/** 데이터 구조(트리)를 오른쪽에 */\n<StnLayerShell lnbSide=\"right\" contentModifiers={['has_lnb', 'has_sch']} …>\n <div className=\"content_box\">…</div>\n <aside className=\"lnb_box_right\">…</aside>\n</StnLayerShell>`\n\nexport const STN_LAYOUT_SHELL_USAGE = `import '@stn-uiux/pub-ui/styles.css'\n\nimport { StnSideNavigation, StnHeader, StnLayerShell, StnStack } from '@stn-uiux/pub-ui-react'\n\n/** interface_list 골격 */\nexport function InterfaceListPage({ gnb, title, children }) {\n return (\n <StnLayerShell\n gnb={gnb}\n header={\n <StnHeader variant=\"page\">\n <StnHeader.Left>\n <h3 className=\"title\">{title}</h3>\n </StnHeader.Left>\n </StnHeader>\n }\n >\n {children}\n </StnLayerShell>\n )\n}\n\n/** 대시보드 골격 */\nexport function MapDashboardPage({ gnb, header, children }) {\n return (\n <StnLayerShell gnb={gnb} header={header}>\n <StnStack direction=\"column\">\n {children}\n </StnStack>\n </StnLayerShell>\n )\n}`\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnHeader.ts"],"sourcesContent":["/**\n * Infomap header pattern — Figma 43377 · 43521 · 211938\n * @see StnHeader · patterns/stn-header.css\n */\n\nimport { systemIconSrc } from './stnSystemIcons'\n\nexport type StnHeaderVariant = 'dashboard' | 'widget' | 'page'\nexport type StnHeaderPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type StnHeaderGap = 'none' | 'sm' | 'md' | 'lg'\n\nexport const STN_HEADER_INTRO =\n '페이지 최상단에 배치되어 시스템 상태, 타이틀, 실시간 시계, 툴바 액션, 브레드크럼을 표출하는 상단 헤더 패턴입니다. 좌측(Left) · 중앙(Center) · 우측(Right) 3개 슬롯을 유연하게 조립하여 구성할 수 있으며, Center 슬롯 유무에 따라 반응형 그리드 레이아웃이 자동으로 최적화됩니다. 폭이 줄면 Right만 먼저 축약(≤1280 툴바 아이콘화)되고, Center StnHeaderTitle은 md(32px)에서 sm(≤1280), compact(≤720)으로 점진 축소됩니다.'\n\nexport const STN_HEADER_VARIANT_ROWS = [\n {\n variant: 'dashboard',\n layout: 'Left(1fr · hug) · Center(auto) · Right(1fr · hug)',\n example: 'Alert status + Header title + System chips',\n },\n {\n variant: 'widget',\n layout: 'Left(1fr · hug) · Center(auto clock) · Right(1fr · hug)',\n example: 'Breadcrumb + Clock + Action buttons',\n },\n {\n variant: 'page',\n layout: 'Left title · Right',\n example: 'Page title + Breadcrumb',\n },\n] as const\n\nexport const STN_HEADER_USAGE = `import {\n StnSystemChip,\n StnHeader,\n StnBreadcrumb,\n StnButton,\n StnHeaderTitle,\n StnHeaderToolbar,\n StnIcon,\n} from '@stn-uiux/pub-ui-react'\n\n<StnHeader>\n <StnHeader.Left>\n <StnSystemChip items={[{ id: 'c', tone: 'critical', count: 0 }, ...]} />\n </StnHeader.Left>\n <StnHeader.Center>\n <StnHeaderTitle>통합 관제 솔루션</StnHeaderTitle>\n </StnHeader.Center>\n <StnHeader.Right>\n <StnHeaderToolbar>\n <StnButton size=\"M\" variant=\"ghost\" icon={<StnIcon name=\"fill/system_status_on\" size={16} className=\"stn-icon--color\" />}>\n 시스템 감시\n </StnButton>\n <StnButton size=\"M\" variant=\"ghost\" icon={<StnIcon name=\"line/sun-high\" size={16} />}>\n 라이트모드\n </StnButton>\n </StnHeaderToolbar>\n </StnHeader.Right>\n</StnHeader>`\n\nexport const STN_HEADER_USAGE_HTML = `<!-- Left · Center · Right 슬롯 조립 -->\n<header class=\"stn-header\">\n <div class=\"stn-header__left\">\n <!-- StnSystemChip / .stn-system-chip -->\n </div>\n <div class=\"stn-header__center\">\n <div class=\"stn-header-title\">\n <span class=\"stn-header-title__text\">통합 관제 솔루션</span>\n </div>\n </div>\n <div class=\"stn-header__right\">\n <div class=\"stn-header-toolbar\">\n <!-- system monitor · theme buttons -->\n </div>\n </div>\n</header>`\n\nexport const STN_SYSTEM_CHIP_DEMO = [\n { id: 'critical', tone: 'critical' as const, count: 0 },\n { id: 'major', tone: 'major' as const, count: 12 },\n { id: 'minor', tone: 'minor' as const, count: 2 },\n { id: 'info', tone: 'info' as const, count: 3 },\n]\n\nexport const STN_HEADER_PAGE_TITLE_DEMO = '장애코드 관리'\n\n/** Figma map toolbar 40000040:75034 — leading icon + label */\nexport const STN_HEADER_TOOLBAR_DEMO_ACTIONS = [\n {\n id: 'reset',\n label: '기본값으로 초기화',\n iconSrc: systemIconSrc('line/refresh'),\n tertiaryStyle: 'outline' as const,\n },\n {\n id: 'edit',\n label: '편집',\n iconSrc: systemIconSrc('line/pencil-minus'),\n tertiaryStyle: 'ghost' as const,\n },\n {\n id: 'prev-day',\n label: '전일 현황',\n iconSrc: systemIconSrc('line/report'),\n tertiaryStyle: 'ghost' as const,\n },\n] as const\n"],"mappings":";;;;;AAWO,IAAM,mBACX;AAEK,IAAM,0BAA0B;AAAA,EACrC;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEO,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BzB,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB9B,IAAM,uBAAuB;AAAA,EAClC,EAAE,IAAI,YAAY,MAAM,YAAqB,OAAO,EAAE;AAAA,EACtD,EAAE,IAAI,SAAS,MAAM,SAAkB,OAAO,GAAG;AAAA,EACjD,EAAE,IAAI,SAAS,MAAM,SAAkB,OAAO,EAAE;AAAA,EAChD,EAAE,IAAI,QAAQ,MAAM,QAAiB,OAAO,EAAE;AAChD;AAEO,IAAM,6BAA6B;AAGnC,IAAM,kCAAkC;AAAA,EAC7C;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,SAAS,cAAc,cAAc;AAAA,IACrC,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,SAAS,cAAc,mBAAmB;AAAA,IAC1C,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,SAAS,cAAc,aAAa;AAAA,IACpC,eAAe;AAAA,EACjB;AACF;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-LHV26PEP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnPopup.ts"],"sourcesContent":["/**\n * Pub HTML Popup (.stn-pop) — StnPopup shell · sizes · pattern\n */\n\nexport const STN_POPUP_INTRO =\n '사용자의 주의를 환기시키거나 추가 입력을 받는 팝업/모달 패턴입니다. React에서는 `<StnPopup>` 컴포넌트 하나만 사용하면 내부에서 배경 딤(Overlay)과 레이어 층을 자동으로 내장 처리해 줍니다.'\n\nexport const STN_POPUP_STACK_HTML = `<div class=\"stn-pop-stack\">\n <div\n class=\"stn-layer stn-elev-3 stn-elev--shell stn-elev--dim stn-pop-stack__dim\"\n data-stn-layer=\"3\"\n data-stn-layer-role=\"dim\"\n data-stn-layer-surface=\"dim\"\n >\n <button type=\"button\" class=\"stn-layer__dim-hit\" aria-label=\"닫기\"></button>\n </div>\n <div\n class=\"stn-layer stn-elev-4 stn-elev--shell stn-pop-stack__modal\"\n data-stn-layer=\"4\"\n data-stn-layer-role=\"modal\"\n data-stn-layer-surface=\"transparent\"\n >\n <!-- .stn-pop — 패널 셸 -->\n </div>\n</div>`\n\nexport const STN_POPUP_USAGE_HTML = `${STN_POPUP_STACK_HTML.replace(' <!-- .stn-pop — 패널 셸 -->', `<div class=\"stn-pop stn-pop--md stn-pop--open\">\n <div class=\"stn-pop__cont\">\n <div class=\"stn-pop__panel\">\n <div class=\"stn-pop__head\">\n <h4>제목</h4>\n </div>\n <button type=\"button\" class=\"stn-pop__close\" aria-label=\"닫기\"></button>\n <div class=\"stn-pop__body\"><!-- 본문 --></div>\n <div class=\"stn-pop__actions\"><!-- StnButton primary · secondary --></div>\n </div>\n </div>\n </div>`)}`\n\nexport const STN_POPUP_USAGE = `import { StnButton, StnPopup } from '@stn-uiux/pub-ui-react'\nimport { useState } from 'react'\n\nconst [open, setOpen] = useState(false)\n\n<StnButton size=\"M\" variant=\"contained\" onClick={() => setOpen(true)}>열기</StnButton>\n<StnPopup\n open={open}\n onClose={() => setOpen(false)}\n size=\"md\"\n title=\"제목\"\n actions={\n <StnButton size=\"S\" variant=\"contained\" onClick={() => setOpen(false)}>\n 확인\n </StnButton>\n }\n>\n 본문\n</StnPopup>`\n\nexport const STN_POPUP_RESPONSIVE_NOTE =\n '가로: `width: min(var(--stn-pop-active-width), calc(100vw - var(--stn-pop-gutter) * 2))` · `--full`: `calc(100vw - gutter×2)`. 세로: `.pop_con` overflow + `--stn-pop-max-height`.'\n\nexport const STN_POPUP_SHELL_PARTIAL =\n '01 PC_HTML_Revision/html/_partials/popup-shell.partial.html'\n\nexport const STN_POPUP_SYNC_CSS = [\n 'packages/stn-pub-ui/css/stn-pub-popup.css',\n '01 PC_HTML_Revision/resource/css/stn-pub-popup.css',\n 'style-pub.css · style.css → @import stn-popup.css',\n] as const\n\nexport const STN_POPUP_SIZES = [\n {\n id: 'xs',\n label: 'Extra Small',\n className: 'stn-pop--xs',\n width: '400px',\n token: '--stn-pop-width-xs',\n usage: '단순 확인 · 삭제/경고 확인 얼럿 · 상태 변경',\n },\n {\n id: 'sm',\n label: 'Small',\n className: 'stn-pop--sm',\n width: '520px',\n token: '--stn-pop-width-sm',\n usage: '1~2개 입력 숏 폼 · 단축 검색 · 명칭 변경',\n },\n {\n id: 'md',\n label: 'Medium',\n className: 'stn-pop--md',\n width: '680px',\n token: '--stn-pop-width-md',\n usage: '단일 입력 폼 · 사용자 설정 · 저장 확인 (권장 기본)',\n },\n {\n id: 'lg',\n label: 'Large',\n className: 'stn-pop--lg',\n width: '920px',\n token: '--stn-pop-width-lg',\n usage: '복합 필터 · 2열 폼 · 짧은 테이블 목록',\n },\n {\n id: 'xl',\n label: 'XL',\n className: 'stn-pop--xl',\n width: '1200px',\n token: '--stn-pop-width-xl',\n usage: '대형 데이터 테이블 · 다열 프로비저닝 폼 · 대형 상세',\n },\n {\n id: 'xxl',\n label: 'XXL',\n className: 'stn-pop--xxl',\n width: '1440px',\n token: '--stn-pop-width-xxl',\n usage: '대시보드 축약 뷰 · 대형 모니터링/관제 팝업',\n },\n {\n id: '2xl',\n label: '2XL',\n className: 'stn-pop--2xl',\n width: '1600px',\n token: '--stn-pop-width-2xl',\n usage: '실시간 관제 상세 · 대규모 토폴로지 매핑 팝업',\n },\n {\n id: 'full',\n label: 'Full bleed',\n className: 'stn-pop--full',\n width: 'calc(100vw − 40px)',\n token: '(viewport − gutter)',\n usage: '배치 장비·전체 화면 테이블 (1780px 등 → full 권장)',\n },\n] as const\n\nexport type StnPopupSizeId = (typeof STN_POPUP_SIZES)[number]['id']\n\n/** 레거시 `content.css` 고정 px → 권장 modifier (마이그레이션 참고) */\nexport function resolveStnPopupSizeFromWidth(px: number): StnPopupSizeId {\n if (px <= 360) return 'sm'\n if (px <= 480) return 'md'\n if (px <= 640) return 'lg'\n if (px <= 934) return 'xl'\n if (px <= 1200) return 'xxl'\n if (px <= 1500) return '2xl'\n return 'full'\n}\n\nexport const STN_POPUP_LEGACY_WIDTH_SAMPLES = [\n { popClass: 'batch_equip_pop', widthPx: 1780, suggested: 'full' as const },\n { popClass: 'template_history_pop', widthPx: 1565, suggested: '2xl' as const },\n { popClass: 'real_time_view_pop', widthPx: 1500, suggested: '2xl' as const },\n { popClass: 'select_equip_pop', widthPx: 1412, suggested: '2xl' as const },\n { popClass: 'equip_regist_pop', widthPx: 1070, suggested: 'xxl' as const },\n { popClass: 'fail_measure_pop', widthPx: 1100, suggested: 'xxl' as const },\n] as const\n\nexport const STN_POPUP_PARTS = [\n { part: 'Stack', selector: '.stn-pop-stack', note: 'Dim + Modal 래퍼 · StnLayer.Modal (L2)' },\n { part: 'Dim', selector: '.stn-layer-dim · .stn-elev--dim', note: 'L2 내장 scrim · blur · dim-hit 클릭 닫기' },\n { part: 'Modal host', selector: '.stn-pop', note: 'L2 모달 도화지 · 중앙 정렬' },\n { part: 'Width host', selector: '.stn-pop__cont', note: 'size modifier · responsive min()' },\n {\n part: 'Panel',\n selector: '.stn-pop__panel',\n note: 'gray.850 · gray.700 border · radius 10 · shadow · overflow',\n },\n {\n part: 'Header',\n selector: '.stn-pop__head',\n note: '48px · h4 18 SemiBold · theme title token',\n },\n {\n part: 'Close',\n selector: '.stn-pop__close',\n note: 'StnButton icon=\"line/x\" size=xsmall (16) · top 10 / right 8',\n },\n { part: 'Body', selector: '.stn-pop__body', note: 'padding 0 8px · overflow auto · 화면별 슬롯' },\n {\n part: 'Actions',\n selector: '.stn-pop__actions',\n note: '64px · center · gap 8 · StnButton primary→secondary',\n },\n] as const\n\nexport const STN_POPUP_TOKEN_ROWS = [\n { token: '--stn-pop-gutter', resolvesTo: '20px', usage: '좌우·portal padding' },\n { token: '--stn-pop-width-xs', resolvesTo: '400px', usage: '.stn-pop--xs · 단순 확인/얼럿' },\n { token: '--stn-pop-width-sm', resolvesTo: '520px', usage: '.stn-pop--sm · 1~2개 입력 폼' },\n { token: '--stn-pop-width-md', resolvesTo: '680px', usage: '.stn-pop--md · 기본 표준' },\n { token: '--stn-pop-width-lg', resolvesTo: '920px', usage: '.stn-pop--lg · 2열 폼/상세' },\n { token: '--stn-pop-width-xl', resolvesTo: '1200px', usage: '.stn-pop--xl · 대형 테이블/그리드' },\n { token: '--stn-pop-width-xxl', resolvesTo: '1440px', usage: '.stn-pop--xxl · 대시보드/관제' },\n { token: '--stn-pop-width-2xl', resolvesTo: '1600px', usage: '.stn-pop--2xl · 초대형 토폴로지' },\n { token: '.stn-pop--full', resolvesTo: '100vw − gutter×2', usage: 'full-bleed · alias --full-bleed' },\n { token: '--stn-pop-max-height', resolvesTo: 'min(85dvh, …)', usage: '.stn-pop 본문 스크롤' },\n { token: '--stn-pop-header-height', resolvesTo: '48px', usage: '.stn-pop__head min-height' },\n { token: '--stn-pop-footer-height', resolvesTo: '64px', usage: '.stn-pop__actions' },\n { token: '--stn-pop-close-size', resolvesTo: 'icon-size.xsmall (16px)', usage: '.stn-pop__close hit' },\n { token: '--stn-pop-close-icon', resolvesTo: 'icon-size.xsmall (16px)', usage: '.stn-pop__close glyph' },\n { token: '--stn-pop-surface', resolvesTo: 'gray.850 (dark) · white (light)', usage: '.stn-pop__panel background' },\n { token: '--stn-pop-border', resolvesTo: 'gray.700 (dark) · gray.100 (light)', usage: '.stn-pop__panel border' },\n { token: '--stn-pop-title', resolvesTo: 'static.white (dark) · gray.650 (light)', usage: '.stn-pop__head h4' },\n { token: '--stn-pop-shadow', resolvesTo: '0 0 10px black (dark) · 0 4px 10px / 25% (light)', usage: '팝업 패널' },\n { token: '--stn-radius-pop-wrap', resolvesTo: 'radius.10', usage: '.stn-pop__panel border-radius' },\n {\n token: '--stn-dim-bg',\n resolvesTo: 'Dark gray-950/50 · Light gray-900/20',\n usage: 'StnLayer.Dim scrim',\n },\n {\n token: '--stn-dim-blur',\n resolvesTo: 'Dark 4px · Light 2px',\n usage: 'backdrop-filter on scrim',\n },\n] as const\n\nexport const STN_POPUP_INVENTORY_ROWS = [\n {\n pattern: 'Popup panel shell',\n pubClass: '.stn-pop .stn-pop__panel',\n size: 'radius 10 · 934 xl',\n status: 'implemented' as const,\n },\n {\n pattern: 'Size SM–Full',\n pubClass: '.stn-pop--sm … --full',\n size: 'responsive min(토큰, 100vw−40px)',\n status: 'implemented' as const,\n },\n {\n pattern: '화면별 width',\n pubClass: '.equip_regist_pop .stn-pop__cont 등',\n size: 'content.css override → xxl/2xl/full로 이전 권장',\n status: 'partial' as const,\n },\n {\n pattern: 'MUI Dialog (migrated)',\n pubClass: '.stn-pop',\n size: 'sm–full',\n status: 'implemented' as const,\n },\n] as const\n"],"mappings":"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","names":[]}
@@ -1,9 +0,0 @@
1
- // src/data/stnPackageVersion.ts
2
- var STN_UI_VERSION = "0.1.57";
3
- var STN_UI_VERSION_LABEL = "v0.1.57";
4
-
5
- export {
6
- STN_UI_VERSION,
7
- STN_UI_VERSION_LABEL
8
- };
9
- //# sourceMappingURL=chunk-QT4HHVZH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnPackageVersion.ts"],"sourcesContent":["/** Package version constants */\nexport const STN_UI_VERSION = '0.1.57'\nexport const STN_UI_VERSION_LABEL = 'v0.1.57'\n"],"mappings":";AACO,IAAM,iBAAiB;AACvB,IAAM,uBAAuB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/stnDateRangeField.ts"],"sourcesContent":["/**\n * Pub datetime range field — Infomap `input` (Figma 40000042:186907)\n * @see common.css `.date_box` · Ant Design RangePicker\n */\n\nexport type StnDateRangeFieldSize = 'sm' | 'md' | 'lg' | 'S' | 'M' | 'L'\n\nexport const STN_DATE_RANGE_FIELD_FIGMA = '40000042:186907'\n\n/** DS·Figma 영문명 — Date range field (datetime 포함 시 DateTime range field) */\nexport const STN_DATE_RANGE_FIELD_NAME = 'Date range field'\n\nexport const STN_DATE_RANGE_FIELD_INTRO =\n '검색·로그 필터용 **기간 선택**입니다. 트리거는 `StnDateRangeField` · 팝업 달력은 `StnDateRangePicker` / 통합 `StnDateRangePickerField`. Pub HTML `.date_box` · `ant-picker-dropdown` · `--calendar-*` 토큰.'\n\nexport const STN_DATE_RANGE_FIELD_DEMO = {\n start: '2024-02-07 09:22:34',\n end: '2024-03-07 09:22:34',\n} as const\n\nexport const STN_DATE_RANGE_FIELD_SIZE_ROWS: readonly {\n size: StnDateRangeFieldSize\n height: string\n radius: string\n fontSize: string\n paddingX: string\n iconSize: string\n pubClass: string\n usedIn: string\n}[] = [\n {\n size: 'sm',\n height: '24px',\n radius: '4px',\n fontSize: '13px',\n paddingX: '10px',\n iconSize: '14px',\n pubClass: 'stn-date-range-field sm',\n usedIn: '좁은 검색줄',\n },\n {\n size: 'md',\n height: '32px',\n radius: '4px',\n fontSize: '13px',\n paddingX: '12px',\n iconSize: '16px',\n pubClass: 'stn-date-range-field md',\n usedIn: '검색영역 기간 (Figma)',\n },\n {\n size: 'lg',\n height: '40px',\n radius: '6px',\n fontSize: '14px',\n paddingX: '12px',\n iconSize: '16px',\n pubClass: 'stn-date-range-field lg',\n usedIn: '강조 검색',\n },\n] as const\n\nexport const STN_DATE_RANGE_FIELD_USAGE = `import { StnDateRangeField } from '@stn-uiux/pub-ui-react'\n\n<StnDateRangeField\n size=\"md\"\n start={new Date('2024-02-07T09:22:34')}\n end={new Date('2024-03-07T09:22:34')}\n onClick={() => openRangePicker()}\n aria-label=\"Search period\"\n/>`\n\nexport const STN_DATE_RANGE_FIELD_HTML = `<button\n type=\"button\"\n class=\"stn-date-range-field md\"\n aria-label=\"Search period\"\n>\n <span class=\"stn-date-range-field__inner\">\n <span class=\"stn-date-range-field__text\">\n <span class=\"stn-date-range-field__value\">2024-02-07 09:22:34</span>\n <span class=\"stn-date-range-field__sep\" aria-hidden=\"true\">~</span>\n <span class=\"stn-date-range-field__value\">2024-03-07 09:22:34</span>\n </span>\n <span class=\"stn-date-range-field__icon\" aria-hidden=\"true\"></span>\n </span>\n</button>`\n\nexport function formatStnDateRangeFieldValue(date: Date): string {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n const h = String(date.getHours()).padStart(2, '0')\n const min = String(date.getMinutes()).padStart(2, '0')\n const s = String(date.getSeconds()).padStart(2, '0')\n return `${y}-${m}-${d} ${h}:${min}:${s}`\n}\n\nexport function parseStnDateRangeFieldValue(value: string): Date | null {\n const trimmed = value.trim()\n if (!trimmed) return null\n const normalized = trimmed.replace(' ', 'T')\n const parsed = new Date(normalized)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n"],"mappings":";AAOO,IAAM,6BAA6B;AAGnC,IAAM,4BAA4B;AAElC,IAAM,6BACX;AAEK,IAAM,4BAA4B;AAAA,EACvC,OAAO;AAAA,EACP,KAAK;AACP;AAEO,IAAM,iCASP;AAAA,EACJ;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnC,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelC,SAAS,6BAA6B,MAAoB;AAC/D,QAAM,IAAI,KAAK,YAAY;AAC3B,QAAM,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,QAAM,IAAI,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,QAAM,MAAM,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACxC;AAEO,SAAS,4BAA4B,OAA4B;AACtE,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ,QAAQ,KAAK,GAAG;AAC3C,QAAM,SAAS,IAAI,KAAK,UAAU;AAClC,SAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO;AACjD;","names":[]}