@ncds/ui-admin 1.8.4 → 1.8.5

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 (177) hide show
  1. package/dist/cjs/assets/scripts/featuredIcon.js +87 -0
  2. package/dist/cjs/assets/scripts/notification/FloatingNotification.js +178 -0
  3. package/dist/cjs/assets/scripts/notification/FullWidthNotification.js +133 -0
  4. package/dist/cjs/assets/scripts/notification/MessageNotification.js +159 -0
  5. package/dist/cjs/assets/scripts/notification/Notification.js +120 -0
  6. package/dist/cjs/assets/scripts/notification/const/classNames.js +50 -0
  7. package/dist/cjs/assets/scripts/notification/const/icons.js +31 -0
  8. package/dist/cjs/assets/scripts/notification/const/index.js +87 -0
  9. package/dist/cjs/assets/scripts/notification/const/sizes.js +46 -0
  10. package/dist/cjs/assets/scripts/notification/const/types.js +14 -0
  11. package/dist/cjs/assets/scripts/notification/index.js +116 -0
  12. package/dist/cjs/assets/scripts/notification/positionSync.js +180 -0
  13. package/dist/cjs/assets/scripts/notification/utils.js +122 -0
  14. package/dist/cjs/assets/scripts/shared/ButtonCloseX.js +45 -0
  15. package/dist/cjs/assets/scripts/utils/sanitize.js +39 -0
  16. package/dist/cjs/src/components/data-display/data-grid/DataGrid.js +5 -1
  17. package/dist/cjs/src/components/data-display/table/Table.js +118 -96
  18. package/dist/cjs/src/components/data-display/table/useTableScrollbars.js +187 -0
  19. package/dist/cjs/src/components/forms-and-input/combo-box/ComboBox.js +11 -10
  20. package/dist/cjs/src/components/forms-and-input/image-file-input/ImageFileInput.js +5 -2
  21. package/dist/cjs/src/components/forms-and-input/select-box/SelectBox.js +67 -29
  22. package/dist/cjs/src/components/overlays/dropdown/Dropdown.js +47 -19
  23. package/dist/cjs/src/components/overlays/notification/CalloutNotification.js +25 -0
  24. package/dist/cjs/src/components/overlays/notification/FloatingNotification.js +86 -13
  25. package/dist/cjs/src/components/overlays/notification/Notification.js +7 -0
  26. package/dist/cjs/src/components/overlays/notification/host.js +12 -0
  27. package/dist/cjs/src/components/overlays/tooltip/Tooltip.js +57 -44
  28. package/dist/cjs/src/components/select-dropdown/SelectDropdown.js +2 -1
  29. package/dist/cjs/src/contexts/FloatingContext.js +11 -0
  30. package/dist/cjs/src/contexts/index.js +16 -0
  31. package/dist/cjs/src/hooks/index.js +11 -0
  32. package/dist/cjs/src/hooks/useFloatingPosition.js +78 -0
  33. package/dist/cjs/src/hooks/usePortalState.js +17 -0
  34. package/dist/cjs/src/utils/dropdown/maxSelection.js +35 -0
  35. package/dist/cjs/src/utils/dropdown/multiSelect.js +72 -15
  36. package/dist/esm/assets/scripts/featuredIcon.js +80 -0
  37. package/dist/esm/assets/scripts/notification/FloatingNotification.js +171 -0
  38. package/dist/esm/assets/scripts/notification/FullWidthNotification.js +126 -0
  39. package/dist/esm/assets/scripts/notification/MessageNotification.js +152 -0
  40. package/dist/esm/assets/scripts/notification/Notification.js +113 -0
  41. package/dist/esm/assets/scripts/notification/const/classNames.js +44 -0
  42. package/dist/esm/assets/scripts/notification/const/icons.js +25 -0
  43. package/dist/esm/assets/scripts/notification/const/index.js +4 -0
  44. package/dist/esm/assets/scripts/notification/const/sizes.js +40 -0
  45. package/dist/esm/assets/scripts/notification/const/types.js +8 -0
  46. package/dist/esm/assets/scripts/notification/index.js +10 -0
  47. package/dist/esm/assets/scripts/notification/positionSync.js +171 -0
  48. package/dist/esm/assets/scripts/notification/utils.js +109 -0
  49. package/dist/esm/assets/scripts/shared/ButtonCloseX.js +37 -0
  50. package/dist/esm/assets/scripts/utils/sanitize.js +31 -0
  51. package/dist/esm/src/components/data-display/data-grid/DataGrid.js +5 -1
  52. package/dist/esm/src/components/data-display/table/Table.js +118 -96
  53. package/dist/esm/src/components/data-display/table/useTableScrollbars.js +179 -0
  54. package/dist/esm/src/components/forms-and-input/combo-box/ComboBox.js +11 -10
  55. package/dist/esm/src/components/forms-and-input/image-file-input/ImageFileInput.js +5 -2
  56. package/dist/esm/src/components/forms-and-input/select-box/SelectBox.js +67 -29
  57. package/dist/esm/src/components/overlays/dropdown/Dropdown.js +47 -19
  58. package/dist/esm/src/components/overlays/notification/CalloutNotification.js +19 -0
  59. package/dist/esm/src/components/overlays/notification/FloatingNotification.js +86 -14
  60. package/dist/esm/src/components/overlays/notification/Notification.js +7 -0
  61. package/dist/esm/src/components/overlays/notification/host.js +9 -0
  62. package/dist/esm/src/components/overlays/tooltip/Tooltip.js +58 -45
  63. package/dist/esm/src/components/select-dropdown/SelectDropdown.js +2 -1
  64. package/dist/esm/src/contexts/FloatingContext.js +4 -0
  65. package/dist/esm/src/contexts/index.js +1 -0
  66. package/dist/esm/src/hooks/index.js +1 -0
  67. package/dist/esm/src/hooks/useFloatingPosition.js +71 -0
  68. package/dist/esm/src/hooks/usePortalState.js +10 -0
  69. package/dist/esm/src/utils/dropdown/maxSelection.js +27 -0
  70. package/dist/esm/src/utils/dropdown/multiSelect.js +70 -14
  71. package/dist/temp/assets/scripts/featuredIcon.d.ts +22 -0
  72. package/dist/temp/assets/scripts/featuredIcon.js +79 -0
  73. package/dist/temp/assets/scripts/notification/FloatingNotification.d.ts +24 -0
  74. package/dist/temp/assets/scripts/notification/FloatingNotification.js +156 -0
  75. package/dist/temp/assets/scripts/notification/FullWidthNotification.d.ts +21 -0
  76. package/dist/temp/assets/scripts/notification/FullWidthNotification.js +111 -0
  77. package/dist/temp/assets/scripts/notification/MessageNotification.d.ts +22 -0
  78. package/dist/temp/assets/scripts/notification/MessageNotification.js +140 -0
  79. package/dist/temp/assets/scripts/notification/Notification.d.ts +22 -0
  80. package/dist/temp/assets/scripts/notification/Notification.js +112 -0
  81. package/dist/temp/assets/scripts/notification/const/classNames.d.ts +43 -0
  82. package/dist/temp/assets/scripts/notification/const/classNames.js +44 -0
  83. package/dist/temp/assets/scripts/notification/const/icons.d.ts +25 -0
  84. package/dist/temp/assets/scripts/notification/const/icons.js +25 -0
  85. package/dist/temp/assets/scripts/notification/const/index.d.ts +5 -0
  86. package/dist/temp/assets/scripts/notification/const/index.js +4 -0
  87. package/dist/temp/assets/scripts/notification/const/sizes.d.ts +32 -0
  88. package/dist/temp/assets/scripts/notification/const/sizes.js +40 -0
  89. package/dist/temp/assets/scripts/notification/const/types.d.ts +19 -0
  90. package/dist/temp/assets/scripts/notification/const/types.js +8 -0
  91. package/dist/temp/assets/scripts/notification/index.d.ts +8 -0
  92. package/dist/temp/assets/scripts/notification/index.js +10 -0
  93. package/dist/temp/assets/scripts/notification/positionSync.d.ts +50 -0
  94. package/dist/temp/assets/scripts/notification/positionSync.js +170 -0
  95. package/dist/temp/assets/scripts/notification/utils.d.ts +8 -0
  96. package/dist/temp/assets/scripts/notification/utils.js +115 -0
  97. package/dist/temp/assets/scripts/shared/ButtonCloseX.d.ts +5 -0
  98. package/dist/temp/assets/scripts/shared/ButtonCloseX.js +33 -0
  99. package/dist/temp/assets/scripts/utils/sanitize.d.ts +22 -0
  100. package/dist/temp/assets/scripts/utils/sanitize.js +31 -0
  101. package/dist/temp/src/components/data-display/data-grid/DataGrid.js +1 -1
  102. package/dist/temp/src/components/data-display/data-grid/DataGrid.types.d.ts +7 -0
  103. package/dist/temp/src/components/data-display/table/Table.d.ts +4 -1
  104. package/dist/temp/src/components/data-display/table/Table.js +53 -68
  105. package/dist/temp/src/components/data-display/table/types.d.ts +18 -0
  106. package/dist/temp/src/components/data-display/table/useTableScrollbars.d.ts +25 -0
  107. package/dist/temp/src/components/data-display/table/useTableScrollbars.js +136 -0
  108. package/dist/temp/src/components/forms-and-input/combo-box/ComboBox.d.ts +8 -0
  109. package/dist/temp/src/components/forms-and-input/combo-box/ComboBox.js +7 -11
  110. package/dist/temp/src/components/forms-and-input/image-file-input/ImageFileInput.js +1 -1
  111. package/dist/temp/src/components/forms-and-input/select-box/SelectBox.d.ts +13 -0
  112. package/dist/temp/src/components/forms-and-input/select-box/SelectBox.js +30 -3
  113. package/dist/temp/src/components/overlays/dropdown/Dropdown.d.ts +5 -0
  114. package/dist/temp/src/components/overlays/dropdown/Dropdown.js +35 -11
  115. package/dist/temp/src/components/overlays/notification/CalloutNotification.d.ts +9 -0
  116. package/dist/temp/src/components/overlays/notification/CalloutNotification.js +6 -0
  117. package/dist/temp/src/components/overlays/notification/FloatingNotification.d.ts +15 -0
  118. package/dist/temp/src/components/overlays/notification/FloatingNotification.js +81 -13
  119. package/dist/temp/src/components/overlays/notification/Notification.d.ts +18 -3
  120. package/dist/temp/src/components/overlays/notification/Notification.js +4 -0
  121. package/dist/temp/src/components/overlays/notification/host.d.ts +9 -0
  122. package/dist/temp/src/components/overlays/notification/host.js +9 -0
  123. package/dist/temp/src/components/overlays/tooltip/Tooltip.d.ts +5 -1
  124. package/dist/temp/src/components/overlays/tooltip/Tooltip.js +25 -22
  125. package/dist/temp/src/components/select-dropdown/SelectDropdown.d.ts +6 -0
  126. package/dist/temp/src/components/select-dropdown/SelectDropdown.js +2 -2
  127. package/dist/temp/src/contexts/FloatingContext.d.ts +6 -0
  128. package/dist/temp/src/contexts/FloatingContext.js +4 -0
  129. package/dist/temp/src/contexts/index.d.ts +1 -0
  130. package/dist/temp/src/contexts/index.js +1 -0
  131. package/dist/temp/src/hooks/index.d.ts +1 -0
  132. package/dist/temp/src/hooks/index.js +1 -0
  133. package/dist/temp/src/hooks/useFloatingPosition.d.ts +19 -0
  134. package/dist/temp/src/hooks/useFloatingPosition.js +55 -0
  135. package/dist/temp/src/hooks/usePortalState.d.ts +6 -0
  136. package/dist/temp/src/hooks/usePortalState.js +7 -0
  137. package/dist/temp/src/utils/dropdown/maxSelection.d.ts +24 -0
  138. package/dist/temp/src/utils/dropdown/maxSelection.js +28 -0
  139. package/dist/temp/src/utils/dropdown/multiSelect.d.ts +42 -2
  140. package/dist/temp/src/utils/dropdown/multiSelect.js +66 -13
  141. package/dist/types/assets/scripts/featuredIcon.d.ts +22 -0
  142. package/dist/types/assets/scripts/notification/FloatingNotification.d.ts +24 -0
  143. package/dist/types/assets/scripts/notification/FullWidthNotification.d.ts +21 -0
  144. package/dist/types/assets/scripts/notification/MessageNotification.d.ts +22 -0
  145. package/dist/types/assets/scripts/notification/Notification.d.ts +22 -0
  146. package/dist/types/assets/scripts/notification/const/classNames.d.ts +43 -0
  147. package/dist/types/assets/scripts/notification/const/icons.d.ts +25 -0
  148. package/dist/types/assets/scripts/notification/const/index.d.ts +5 -0
  149. package/dist/types/assets/scripts/notification/const/sizes.d.ts +32 -0
  150. package/dist/types/assets/scripts/notification/const/types.d.ts +19 -0
  151. package/dist/types/assets/scripts/notification/index.d.ts +8 -0
  152. package/dist/types/assets/scripts/notification/positionSync.d.ts +50 -0
  153. package/dist/types/assets/scripts/notification/utils.d.ts +8 -0
  154. package/dist/types/assets/scripts/shared/ButtonCloseX.d.ts +5 -0
  155. package/dist/types/assets/scripts/utils/sanitize.d.ts +22 -0
  156. package/dist/types/src/components/data-display/data-grid/DataGrid.types.d.ts +7 -0
  157. package/dist/types/src/components/data-display/table/Table.d.ts +4 -1
  158. package/dist/types/src/components/data-display/table/types.d.ts +18 -0
  159. package/dist/types/src/components/data-display/table/useTableScrollbars.d.ts +25 -0
  160. package/dist/types/src/components/forms-and-input/combo-box/ComboBox.d.ts +8 -0
  161. package/dist/types/src/components/forms-and-input/select-box/SelectBox.d.ts +13 -0
  162. package/dist/types/src/components/overlays/dropdown/Dropdown.d.ts +5 -0
  163. package/dist/types/src/components/overlays/notification/CalloutNotification.d.ts +9 -0
  164. package/dist/types/src/components/overlays/notification/FloatingNotification.d.ts +15 -0
  165. package/dist/types/src/components/overlays/notification/Notification.d.ts +18 -3
  166. package/dist/types/src/components/overlays/notification/host.d.ts +9 -0
  167. package/dist/types/src/components/overlays/tooltip/Tooltip.d.ts +5 -1
  168. package/dist/types/src/components/select-dropdown/SelectDropdown.d.ts +6 -0
  169. package/dist/types/src/contexts/FloatingContext.d.ts +6 -0
  170. package/dist/types/src/contexts/index.d.ts +1 -0
  171. package/dist/types/src/hooks/index.d.ts +1 -0
  172. package/dist/types/src/hooks/useFloatingPosition.d.ts +19 -0
  173. package/dist/types/src/hooks/usePortalState.d.ts +6 -0
  174. package/dist/types/src/utils/dropdown/maxSelection.d.ts +24 -0
  175. package/dist/types/src/utils/dropdown/multiSelect.d.ts +42 -2
  176. package/dist/ui-admin/assets/styles/style.css +304 -64
  177. package/package.json +1 -1
@@ -113,8 +113,35 @@
113
113
  --font-size-display-md: 36px;
114
114
  --font-size-display-lg: 48px;
115
115
  --font-size-display-xl: 60px;
116
- /* z-index (고도몰 기준) */
116
+ /* z-index 위계 (고도몰 기준)
117
+ 사용자 인지 우선순위가 높을수록 큰 값. z-index를 직접 숫자로 박지 않고 모두 토큰을 경유한다.
118
+ 필요 시 새 레이어가 추가되면 충분한 간격을 두고 끼워 넣는다.
119
+
120
+ ── 컴포넌트 내부 stacking ────────────────────────────────
121
+ base (0) — 외부 라이브러리 reset 보정 (예: shopby span z-index: -1 override)
122
+ 1, 2, 5 — 컴포넌트 내부 stacking 단계. 의미가 컴포넌트마다 달라 수치 토큰 사용
123
+ sticky (10) — 컴포넌트 내 sticky/fixed (table fixed-header, image overlay)
124
+
125
+ ── 글로벌 오버레이 ───────────────────────────────────────
126
+ spinner (200) — 부분 로딩 표시
127
+ popover (500) — dropdown · select-dropdown 등 부유 popover
128
+ (Portal 미사용, 부모 stacking context 안에서 동작)
129
+ modal (1000) — 작업 차단 다이얼로그. backdrop이 stacking context를 만들고
130
+ 자식인 본체는 자연 stacking으로 따라가므로 단일 토큰으로 충분
131
+ tooltip (2000) — 정보 보조. tag 자체 tooltip도 동일 토큰 사용
132
+ (hover 시에만 노출되어 stacking 충돌 가능성이 낮음)
133
+ notification (2100) — 시스템 알림(toast)
134
+ */
135
+ --z-index-base: 0;
136
+ --z-index-1: 1;
137
+ --z-index-2: 2;
138
+ --z-index-5: 5;
139
+ --z-index-sticky: 10;
140
+ --z-index-spinner: 200;
141
+ --z-index-popover: 500;
142
+ --z-index-modal: 1000;
117
143
  --z-index-tooltip: 2000;
144
+ --z-index-notification: 2100;
118
145
  }
119
146
 
120
147
  :root {
@@ -504,7 +531,7 @@ button {
504
531
  flex: none;
505
532
  }
506
533
  .ncua-btn span {
507
- z-index: 0;
534
+ z-index: var(--z-index-base);
508
535
  }
509
536
 
510
537
  [class*=ncua-btn--text] {
@@ -908,7 +935,7 @@ button {
908
935
  position: absolute;
909
936
  top: 0;
910
937
  left: 0;
911
- z-index: 1;
938
+ z-index: var(--z-index-1);
912
939
  -webkit-appearance: none;
913
940
  -moz-appearance: none;
914
941
  appearance: none;
@@ -950,7 +977,7 @@ button {
950
977
  left: 50%;
951
978
  transform: translate(-50%, -50%);
952
979
  content: "";
953
- z-index: 5;
980
+ z-index: var(--z-index-5);
954
981
  width: 12px;
955
982
  height: 12px;
956
983
  background-repeat: no-repeat;
@@ -1291,6 +1318,12 @@ button {
1291
1318
  left: auto;
1292
1319
  right: 0;
1293
1320
  }
1321
+ .ncua-dropdown__menu--portal {
1322
+ position: fixed;
1323
+ top: auto;
1324
+ left: auto;
1325
+ right: auto;
1326
+ }
1294
1327
  .ncua-dropdown__header {
1295
1328
  padding: 8px 16px;
1296
1329
  border-bottom: 1px solid var(--gray-100);
@@ -1594,7 +1627,7 @@ button {
1594
1627
  .ncua-input:focus-within :where(.ncua-input__field) {
1595
1628
  border-color: var(--gray-400);
1596
1629
  box-shadow: var(--shadow-xs-focused-3px-gray-100);
1597
- z-index: 1;
1630
+ z-index: var(--z-index-1);
1598
1631
  }
1599
1632
  .ncua-input input,
1600
1633
  .ncua-input textarea {
@@ -1976,7 +2009,7 @@ button {
1976
2009
  display: flex;
1977
2010
  align-items: center;
1978
2011
  justify-content: center;
1979
- z-index: 1000;
2012
+ z-index: var(--z-index-modal);
1980
2013
  }
1981
2014
 
1982
2015
  .ncua-modal {
@@ -2183,6 +2216,90 @@ button {
2183
2216
  }
2184
2217
  }
2185
2218
 
2219
+ /* ------------------------------------------------------------------
2220
+ * Floating Notification Host
2221
+ *
2222
+ * NCDS DES-SPEC-027 §5.1 — Toast Alert 레이아웃 토큰
2223
+ * · 위치: 우측 상단
2224
+ * · 상단 여백: PageTitle 하단 경계로부터 16px
2225
+ * · 우측 여백: 브라우저 우측에서 40px
2226
+ *
2227
+ * NCDS DES-SPEC-027 §5.4 — 다중 토스트 스택 토큰
2228
+ * · 최신 토스트가 시각적 상단에 노출 (LIFO, 스펙 표 §5.4 "최신 상단" 준수).
2229
+ * · 이전 토스트들은 그 아래로 12px씩 겹쳐 쌓인다 (godomall5 wrapper 와 동일한 값).
2230
+ * · 겹침 너비는 --ncua-floating-notification-stack-overlap 변수로 오버라이드 가능.
2231
+ * · spec 본문이 다른 값을 명시할 경우 변수 기본값만 조정하면 모든 consumer 가 일괄 반영됨.
2232
+ *
2233
+ * Vanilla(CDN) 사용자는 NcuaNotification.show()가 이 호스트를 자동 생성하고
2234
+ * positionSync 모듈이 --ncua-page-title-bottom 변수를 실시간 갱신한다.
2235
+ * React 사용자는 <div className="ncua-floating-notification-host" /> 안에
2236
+ * <Notification type="floating" />을 portal/render하면 동일 정책이 적용된다.
2237
+ *
2238
+ * A11y trade-off (column-reverse + DOM append):
2239
+ * · vanilla show() 와 React createPortal 모두 호스트에 append 하므로 DOM 순서 = 발생 순서 (오래된 것 먼저).
2240
+ * · column-reverse 로 시각 순서를 뒤집어 최신이 상단에 오게 한다 — 그러나 Tab 순서·스크린리더 sequential
2241
+ * navigation 은 여전히 DOM 순서를 따르므로 시각적으로 "위에서 아래" 가 아닌 "아래에서 위" 로 진행된다.
2242
+ * · aria-live(role=alert/status)는 새 토스트가 DOM 에 추가되는 시점에 즉시 발화하므로 이 trade-off 와 무관.
2243
+ * · 키보드 사용자가 다중 토스트를 순회하는 경우는 드물고, 토스트는 close 버튼/autoClose 로 dismiss 되는
2244
+ * 설계이므로 현재는 이 비대칭을 수용한다. 필요해지면 prepend 기반 중앙 toast manager 로 리팩토링.
2245
+ * ------------------------------------------------------------------ */
2246
+ .ncua-floating-notification-host {
2247
+ /*
2248
+ * 호스트 좌표는 CSS 변수로 노출되어 있어 consumer가 스코프별로 오버라이드할 수 있다.
2249
+ *
2250
+ * --ncua-floating-notification-top (기본: PageTitle.bottom + 16px)
2251
+ * --ncua-floating-notification-right (기본: 40px)
2252
+ * --ncua-floating-notification-z-index (기본: var(--z-index-notification) = 2100)
2253
+ * --ncua-floating-notification-stack-overlap (기본: 12px — LIFO 스택의 겹침 너비)
2254
+ *
2255
+ * 사용 예 (모달 위로 띄우거나 우측 패널 회피, 겹침 강화):
2256
+ * .my-modal-overlay .ncua-floating-notification-host {
2257
+ * --ncua-floating-notification-z-index: 100000;
2258
+ * --ncua-floating-notification-right: 80px;
2259
+ * --ncua-floating-notification-stack-overlap: 20px;
2260
+ * }
2261
+ */
2262
+ position: fixed;
2263
+ top: var(--ncua-floating-notification-top, calc(var(--ncua-page-title-bottom, 0px) + 16px));
2264
+ right: var(--ncua-floating-notification-right, 40px);
2265
+ z-index: var(--ncua-floating-notification-z-index, var(--z-index-notification));
2266
+ display: flex;
2267
+ /* §5.4 — LIFO 스택을 위해 column-reverse.
2268
+ * show()/portal 은 항상 append 하므로 DOM 마지막 = 최신 = 시각적 최상단.
2269
+ * Paint stacking 도 자연스럽게 DOM 후순위가 위에 그려져 최신이 이전을 덮는다. */
2270
+ flex-direction: column-reverse;
2271
+ align-items: flex-end;
2272
+ /* host 자체는 hit-test를 막지 않음 (자식만 클릭 가능). */
2273
+ pointer-events: none;
2274
+ }
2275
+ .ncua-floating-notification-host > .ncua-floating-notification {
2276
+ pointer-events: auto;
2277
+ }
2278
+ .ncua-floating-notification-host {
2279
+ /* §5.4 — 최상단(=DOM 마지막)을 제외한 모든 토스트의 top 을 overlap 만큼 끌어올려
2280
+ * 바로 위에 그려질 다음(=DOM 후순위) 토스트가 겹쳐 덮도록 한다.
2281
+ * 마지막 DOM 자식은 컨테이너 top 과 flush 되어야 하므로 margin-top 미적용. */
2282
+ }
2283
+ .ncua-floating-notification-host > .ncua-floating-notification:not(:last-child) {
2284
+ margin-top: calc(-1 * var(--ncua-floating-notification-stack-overlap, 12px));
2285
+ }
2286
+ .ncua-floating-notification-host {
2287
+ /* 모바일에서는 좌우 가장자리에 붙도록 (스펙 §5.1 모바일 동작은 미정 — 합리적 fallback).
2288
+ * 모바일 기본값도 변수로 재정의하므로 consumer가 데스크탑 오버라이드 후에도 모바일은 자동으로 적용된다. */
2289
+ }
2290
+ @media (max-width: 768px) {
2291
+ .ncua-floating-notification-host {
2292
+ --ncua-floating-notification-right: 16px;
2293
+ left: 16px;
2294
+ align-items: stretch;
2295
+ }
2296
+ }
2297
+
2298
+ /* ------------------------------------------------------------------
2299
+ * Floating Notification (개별 카드)
2300
+ * §5.2.1 Toast Alert Floating 시각 토큰을 따른다.
2301
+ * 위치/스택 책임은 .ncua-floating-notification-host에 위임.
2302
+ * ------------------------------------------------------------------ */
2186
2303
  .ncua-floating-notification {
2187
2304
  position: relative;
2188
2305
  width: 100%;
@@ -2698,6 +2815,44 @@ button {
2698
2815
  font-weight: var(--font-weights-commerce-sans-1);
2699
2816
  }
2700
2817
 
2818
+ .ncua-callout-notification {
2819
+ display: flex;
2820
+ align-items: center;
2821
+ width: 100%;
2822
+ border: 1px solid;
2823
+ border-radius: var(--border-radius-sm);
2824
+ padding: var(--spacing-s) var(--spacing-lg);
2825
+ gap: var(--spacing-s);
2826
+ font-size: var(--font-size-md);
2827
+ line-height: var(--line-heights-md);
2828
+ font-weight: var(--font-weights-commerce-sans-0);
2829
+ }
2830
+ .ncua-callout-notification--info {
2831
+ background-color: var(--blue-50);
2832
+ border-color: var(--blue-200);
2833
+ color: var(--blue-600);
2834
+ }
2835
+ .ncua-callout-notification--neutral {
2836
+ background-color: var(--gray-50);
2837
+ border-color: var(--gray-200);
2838
+ color: var(--gray-600);
2839
+ }
2840
+ .ncua-callout-notification--error {
2841
+ background-color: var(--primary-red-50);
2842
+ border-color: var(--primary-red-200);
2843
+ color: var(--primary-red-600);
2844
+ }
2845
+ .ncua-callout-notification--warning {
2846
+ background-color: var(--orange-50);
2847
+ border-color: var(--orange-200);
2848
+ color: var(--orange-600);
2849
+ }
2850
+ .ncua-callout-notification--success {
2851
+ background-color: var(--green-50);
2852
+ border-color: var(--green-200);
2853
+ color: var(--green-600);
2854
+ }
2855
+
2701
2856
  .ncua-radio-input {
2702
2857
  position: relative;
2703
2858
  flex: none;
@@ -2712,7 +2867,7 @@ button {
2712
2867
  position: absolute;
2713
2868
  top: 0;
2714
2869
  left: 0;
2715
- z-index: 1;
2870
+ z-index: var(--z-index-1);
2716
2871
  -webkit-appearance: none;
2717
2872
  -moz-appearance: none;
2718
2873
  appearance: none;
@@ -2866,7 +3021,7 @@ button {
2866
3021
  }
2867
3022
  .ncua-tag__tooltip {
2868
3023
  position: absolute;
2869
- z-index: 1000;
3024
+ z-index: var(--z-index-tooltip);
2870
3025
  pointer-events: none;
2871
3026
  }
2872
3027
  .ncua-tag__tooltip--top-left {
@@ -2926,6 +3081,8 @@ button {
2926
3081
  flex-direction: column;
2927
3082
  gap: 4px;
2928
3083
  max-width: 320px;
3084
+ overflow-wrap: anywhere;
3085
+ font-family: var(--font-families-commerce-sans);
2929
3086
  font-size: var(--font-size-xxs);
2930
3087
  box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5), 0 12px 16px -4px rgba(16, 24, 40, 0.08), 0 4px 6px -2px rgba(16, 24, 40, 0.03);
2931
3088
  }
@@ -2935,16 +3092,23 @@ button {
2935
3092
  content: "";
2936
3093
  }
2937
3094
  .ncua-tooltip__content {
2938
- line-height: 14px;
2939
- width: max-content;
3095
+ line-height: var(--line-heights-xxs);
3096
+ width: fit-content;
2940
3097
  max-width: 296px;
2941
- font-weight: 100;
3098
+ min-width: 0;
3099
+ font-weight: var(--font-weights-commerce-sans-0);
2942
3100
  word-break: keep-all;
3101
+ overflow-wrap: anywhere;
3102
+ word-wrap: anywhere;
3103
+ }
3104
+ .ncua-tooltip__title {
3105
+ min-width: 0;
3106
+ line-height: var(--line-heights-xxs);
2943
3107
  }
2944
3108
  .ncua-tooltip__close-button {
2945
3109
  position: absolute;
2946
- top: 4px;
2947
- right: 8px;
3110
+ top: 2px;
3111
+ right: 2px;
2948
3112
  background: none;
2949
3113
  border: none;
2950
3114
  cursor: pointer;
@@ -2987,7 +3151,7 @@ button {
2987
3151
  border-left-color: transparent;
2988
3152
  }
2989
3153
  .ncua-tooltip__bg--black .ncua-tooltip__title {
2990
- font-weight: 500;
3154
+ font-weight: var(--font-weights-commerce-sans-2);
2991
3155
  color: var(--base-white);
2992
3156
  }
2993
3157
  .ncua-tooltip__bg--black .ncua-tooltip__content {
@@ -3015,11 +3179,11 @@ button {
3015
3179
  border-left-color: transparent;
3016
3180
  }
3017
3181
  .ncua-tooltip__bg--white .ncua-tooltip__title {
3018
- font-weight: 500;
3182
+ font-weight: var(--font-weights-commerce-sans-2);
3019
3183
  color: var(--gray-500);
3020
3184
  }
3021
3185
  .ncua-tooltip__bg--white .ncua-tooltip__content {
3022
- color: var(--gray-400);
3186
+ color: var(--gray-500);
3023
3187
  }
3024
3188
  .ncua-tooltip__bg--top {
3025
3189
  top: auto;
@@ -3172,11 +3336,8 @@ button {
3172
3336
  padding: 12px;
3173
3337
  }
3174
3338
  .ncua-tooltip__bg:has(.ncua-tooltip__close-button) {
3175
- padding-right: 35px;
3176
- }
3177
- .ncua-tooltip--long .ncua-tooltip__bg {
3178
- padding: 12px;
3179
- padding-right: 36px;
3339
+ padding: 8px 12px;
3340
+ padding-right: 28px;
3180
3341
  }
3181
3342
  .ncua-tooltip--short .ncua-tooltip__bg {
3182
3343
  white-space: normal;
@@ -3336,7 +3497,7 @@ button {
3336
3497
  .ncua-select-dropdown {
3337
3498
  position: absolute;
3338
3499
  left: 0;
3339
- z-index: 1;
3500
+ z-index: var(--z-index-popover);
3340
3501
  overflow: hidden;
3341
3502
  min-width: 100%;
3342
3503
  width: max-content;
@@ -3355,6 +3516,20 @@ button {
3355
3516
  left: initial;
3356
3517
  right: 0;
3357
3518
  }
3519
+ .ncua-select-dropdown--portal {
3520
+ position: fixed;
3521
+ left: auto;
3522
+ right: auto;
3523
+ min-width: 0;
3524
+ }
3525
+ .ncua-select-dropdown--portal.ncua-select-dropdown--up, .ncua-select-dropdown--portal.ncua-select-dropdown--down {
3526
+ top: auto;
3527
+ bottom: auto;
3528
+ }
3529
+ .ncua-select-dropdown--portal.ncua-select-dropdown--align-right {
3530
+ left: auto;
3531
+ right: auto;
3532
+ }
3358
3533
  .ncua-select-dropdown__content {
3359
3534
  padding: 8px 6px;
3360
3535
  }
@@ -3862,7 +4037,7 @@ button {
3862
4037
  background-color: var(--base-white);
3863
4038
  color: var(--gray-600);
3864
4039
  box-shadow: var(--shadow-sm);
3865
- z-index: 1;
4040
+ z-index: var(--z-index-1);
3866
4041
  }
3867
4042
  .ncua-switch__option--inactive {
3868
4043
  background-color: var(--gray-100);
@@ -4083,7 +4258,7 @@ button {
4083
4258
  width: 100vw;
4084
4259
  height: 100vh;
4085
4260
  background-color: rgba(0, 0, 0, 0.5);
4086
- z-index: 200;
4261
+ z-index: var(--z-index-spinner);
4087
4262
  }
4088
4263
 
4089
4264
  :root {
@@ -5557,7 +5732,7 @@ button {
5557
5732
  top: 50%;
5558
5733
  left: 50%;
5559
5734
  transform: translate(-50%, -50%);
5560
- z-index: 10;
5735
+ z-index: var(--z-index-sticky);
5561
5736
  }
5562
5737
  .ncua-image-file-input__empty-slot-wrapper .ncua-tooltip svg {
5563
5738
  opacity: 0;
@@ -5618,7 +5793,7 @@ button {
5618
5793
  transform: translate(-50%, -50%);
5619
5794
  opacity: 0;
5620
5795
  transition: opacity 0.2s ease;
5621
- z-index: 1;
5796
+ z-index: var(--z-index-1);
5622
5797
  padding: 0;
5623
5798
  min-width: auto;
5624
5799
  background: transparent;
@@ -5711,7 +5886,69 @@ button {
5711
5886
  width: 100%;
5712
5887
  }
5713
5888
 
5889
+ .ncua-table__h-scroll-container {
5890
+ position: relative;
5891
+ width: 100%;
5892
+ overflow-x: auto;
5893
+ scrollbar-width: none;
5894
+ }
5895
+ .ncua-table__h-scroll-container::-webkit-scrollbar {
5896
+ display: none;
5897
+ }
5898
+
5899
+ .ncua-table:hover .ncua-table__h-scrollbar,
5900
+ .ncua-table__h-scroll-container[data-dragging] .ncua-table__h-scrollbar {
5901
+ opacity: 1;
5902
+ }
5903
+
5904
+ .ncua-table__h-scrollbar {
5905
+ position: absolute;
5906
+ left: var(--spacing-s);
5907
+ right: var(--spacing-s);
5908
+ bottom: var(--spacing-xs);
5909
+ height: 6px;
5910
+ opacity: 0;
5911
+ transition: opacity 0.2s ease;
5912
+ pointer-events: none;
5913
+ border-radius: var(--border-radius-md);
5914
+ }
5915
+
5916
+ .ncua-table__h-scrollbar-thumb {
5917
+ position: absolute;
5918
+ top: 0;
5919
+ bottom: 0;
5920
+ left: 0;
5921
+ width: 40px;
5922
+ background: var(--gray-100);
5923
+ border-radius: var(--border-radius-md);
5924
+ cursor: pointer;
5925
+ pointer-events: auto;
5926
+ }
5927
+ .ncua-table__h-scrollbar-thumb:hover {
5928
+ background: var(--gray-200);
5929
+ }
5930
+ .ncua-table__h-scrollbar-thumb:active {
5931
+ background: var(--gray-300);
5932
+ cursor: grabbing;
5933
+ }
5934
+
5935
+ .ncua-table__h-scroll-inner {
5936
+ display: block;
5937
+ width: max-content;
5938
+ min-width: max(100%, var(--ncua-table-min-width, var(--ncua-table-default-min-width)));
5939
+ }
5940
+ .ncua-table__h-scroll-inner .ncua-table-wrapper,
5941
+ .ncua-table__h-scroll-inner .ncua-table {
5942
+ width: max-content;
5943
+ min-width: 100%;
5944
+ }
5945
+ .ncua-table__h-scroll-inner .ncua-table__table {
5946
+ width: auto;
5947
+ min-width: 100%;
5948
+ }
5949
+
5714
5950
  .ncua-table {
5951
+ position: relative;
5715
5952
  display: flex;
5716
5953
  flex-direction: column;
5717
5954
  align-items: stretch;
@@ -5725,9 +5962,6 @@ button {
5725
5962
  .ncua-table__scroll-area {
5726
5963
  position: relative;
5727
5964
  }
5728
- .ncua-table__scroll-area:hover .ncua-table__scrollbar, .ncua-table__scroll-area[data-dragging] .ncua-table__scrollbar {
5729
- opacity: 1;
5730
- }
5731
5965
  .ncua-table__scroll-container {
5732
5966
  width: 100%;
5733
5967
  overflow-y: auto;
@@ -5736,6 +5970,9 @@ button {
5736
5970
  .ncua-table__scroll-container::-webkit-scrollbar {
5737
5971
  display: none;
5738
5972
  }
5973
+ .ncua-table:has(.ncua-table__scroll-area:hover) .ncua-table__scrollbar, .ncua-table:has(.ncua-table__scroll-area[data-dragging]) .ncua-table__scrollbar {
5974
+ opacity: 1;
5975
+ }
5739
5976
  .ncua-table__scrollbar {
5740
5977
  position: absolute;
5741
5978
  top: 2px;
@@ -5745,7 +5982,7 @@ button {
5745
5982
  opacity: 0;
5746
5983
  transition: opacity 0.2s ease;
5747
5984
  pointer-events: none;
5748
- border-radius: 8px;
5985
+ border-radius: var(--border-radius-md);
5749
5986
  }
5750
5987
  .ncua-table__scrollbar-thumb {
5751
5988
  position: absolute;
@@ -5754,7 +5991,7 @@ button {
5754
5991
  right: 0;
5755
5992
  height: 40px;
5756
5993
  background: var(--gray-100);
5757
- border-radius: 8px;
5994
+ border-radius: var(--border-radius-md);
5758
5995
  cursor: pointer;
5759
5996
  pointer-events: auto;
5760
5997
  }
@@ -5779,15 +6016,15 @@ button {
5779
6016
  }
5780
6017
  .ncua-table__header tr {
5781
6018
  border-bottom: none;
5782
- height: 40px;
6019
+ height: var(--ncua-table-header-height);
5783
6020
  }
5784
6021
  .ncua-table__header-cell {
5785
- padding: 0 16px;
5786
- min-height: 40px;
5787
- height: 40px;
6022
+ padding: 0 var(--spacing-m);
6023
+ min-height: var(--ncua-table-header-height);
6024
+ height: var(--ncua-table-header-height);
5788
6025
  background: var(--gray-100);
5789
6026
  font-size: var(--font-size-xs);
5790
- font-weight: var(--font-weights-commerce-sans-5);
6027
+ font-weight: var(--font-weights-commerce-sans-1);
5791
6028
  line-height: var(--line-heights-xs);
5792
6029
  color: var(--gray-500);
5793
6030
  text-align: center;
@@ -5808,7 +6045,7 @@ button {
5808
6045
  display: inline-flex;
5809
6046
  align-items: center;
5810
6047
  justify-content: center;
5811
- gap: 4px;
6048
+ gap: var(--spacing-xs);
5812
6049
  width: 100%;
5813
6050
  }
5814
6051
  .ncua-table__header-cell-text {
@@ -5911,9 +6148,9 @@ button {
5911
6148
  background: transparent;
5912
6149
  }
5913
6150
  .ncua-table__cell {
5914
- padding: 10px 8px;
6151
+ padding: 10px var(--spacing-s);
5915
6152
  font-size: var(--font-size-xs);
5916
- font-weight: var(--font-weights-commerce-sans-4);
6153
+ font-weight: var(--font-weights-commerce-sans-0);
5917
6154
  line-height: var(--line-heights-xs);
5918
6155
  color: var(--gray-700);
5919
6156
  text-align: center;
@@ -5934,13 +6171,13 @@ button {
5934
6171
  border-right: 1px solid var(--gray-100);
5935
6172
  }
5936
6173
  .ncua-table__checkbox-cell--header, .ncua-table__radio-cell--header {
5937
- padding: 0 16px;
6174
+ padding: 0 var(--spacing-m);
5938
6175
  background: var(--gray-100);
5939
6176
  border-right-color: var(--gray-200);
5940
6177
  border-bottom: 1px solid var(--gray-200);
5941
6178
  }
5942
6179
  .ncua-table__checkbox-cell--body, .ncua-table__radio-cell--body {
5943
- padding: 12px 16px;
6180
+ padding: 12px var(--spacing-m);
5944
6181
  height: 48px;
5945
6182
  }
5946
6183
  .ncua-table__footer {
@@ -5950,8 +6187,8 @@ button {
5950
6187
  background: var(--gray-50);
5951
6188
  border-top: 1px solid var(--gray-200);
5952
6189
  box-shadow: var(--shadow-xs);
5953
- padding: 8px 24px;
5954
- gap: 8px;
6190
+ padding: var(--spacing-s) var(--spacing-l);
6191
+ gap: var(--spacing-s);
5955
6192
  border-radius: 0 0 var(--border-radius-md) var(--border-radius-md);
5956
6193
  }
5957
6194
  .ncua-table__footer-row {
@@ -5967,11 +6204,11 @@ button {
5967
6204
  align-items: center;
5968
6205
  width: 100%;
5969
6206
  padding: 12px 0;
5970
- gap: 16px;
6207
+ gap: var(--spacing-m);
5971
6208
  }
5972
6209
  .ncua-table__empty {
5973
6210
  text-align: center;
5974
- padding: 40px 16px;
6211
+ padding: var(--spacing-xxl) var(--spacing-m);
5975
6212
  color: var(--gray-500);
5976
6213
  font-size: var(--font-size-xs);
5977
6214
  line-height: var(--line-heights-xs);
@@ -5985,7 +6222,7 @@ button {
5985
6222
  }
5986
6223
  .ncua-table--selectable {
5987
6224
  background: var(--gray-50);
5988
- padding-bottom: 8px;
6225
+ padding-bottom: var(--spacing-s);
5989
6226
  }
5990
6227
  .ncua-table--selectable .ncua-table__table {
5991
6228
  background: var(--base-white);
@@ -6020,17 +6257,17 @@ button {
6020
6257
  position: sticky;
6021
6258
  top: 0;
6022
6259
  z-index: 10;
6023
- padding: 0 16px;
6024
- height: 40px;
6260
+ padding: 0 var(--spacing-m);
6261
+ height: var(--ncua-table-header-height);
6025
6262
  }
6026
6263
  .ncua-table--fixed-header .ncua-table__scrollbar {
6027
- top: calc(40px + 8px);
6028
- right: 4px;
6029
- bottom: 8px;
6264
+ top: calc(var(--ncua-table-header-height) + var(--spacing-s));
6265
+ right: var(--spacing-xs);
6266
+ bottom: var(--spacing-s);
6030
6267
  }
6031
6268
  .ncua-table--horizontal .ncua-table__header-cell {
6032
- height: 40px;
6033
- min-height: 40px;
6269
+ height: var(--ncua-table-header-height);
6270
+ min-height: var(--ncua-table-header-height);
6034
6271
  }
6035
6272
  .ncua-table--vertical {
6036
6273
  overflow: visible;
@@ -6071,9 +6308,9 @@ button {
6071
6308
  width: 240px;
6072
6309
  min-width: 240px;
6073
6310
  max-width: 240px;
6074
- padding: 10px 16px;
6311
+ padding: 10px var(--spacing-m);
6075
6312
  font-size: var(--font-size-sm);
6076
- font-weight: var(--font-weights-commerce-sans-5);
6313
+ font-weight: var(--font-weights-commerce-sans-1);
6077
6314
  line-height: var(--line-heights-sm);
6078
6315
  color: var(--gray-700);
6079
6316
  text-align: left;
@@ -6082,18 +6319,18 @@ button {
6082
6319
  }
6083
6320
  .ncua-table--vertical .ncua-table__body > .ncua-table__row td:last-child,
6084
6321
  .ncua-table--vertical .ncua-table__body > .ncua-table__row th:last-child {
6085
- padding: 10px 16px;
6322
+ padding: 10px var(--spacing-m);
6086
6323
  text-align: left;
6087
- font-weight: var(--font-weights-commerce-sans-4);
6324
+ font-weight: var(--font-weights-commerce-sans-0);
6088
6325
  }
6089
6326
  .ncua-table--vertical .ncua-table .ncua-table__body > .ncua-table__row td:first-child,
6090
6327
  .ncua-table--vertical .ncua-table .ncua-table__body > .ncua-table__row th:first-child {
6091
6328
  width: auto;
6092
6329
  min-width: 0;
6093
6330
  max-width: none;
6094
- padding: 10px 8px;
6331
+ padding: 10px var(--spacing-s);
6095
6332
  font-size: var(--font-size-xs);
6096
- font-weight: var(--font-weights-commerce-sans-4);
6333
+ font-weight: var(--font-weights-commerce-sans-0);
6097
6334
  line-height: var(--line-heights-xs);
6098
6335
  text-align: center;
6099
6336
  background: var(--base-white);
@@ -6101,14 +6338,14 @@ button {
6101
6338
  }
6102
6339
  .ncua-table--vertical .ncua-table .ncua-table__body > .ncua-table__row td:last-child,
6103
6340
  .ncua-table--vertical .ncua-table .ncua-table__body > .ncua-table__row th:last-child {
6104
- padding: 10px 8px;
6341
+ padding: 10px var(--spacing-s);
6105
6342
  text-align: center;
6106
- font-weight: var(--font-weights-commerce-sans-4);
6343
+ font-weight: var(--font-weights-commerce-sans-0);
6107
6344
  }
6108
6345
  .ncua-table--vertical .ncua-table__required {
6109
6346
  color: var(--primary-red-500, #ec1d31);
6110
6347
  font-size: var(--font-size-sm);
6111
- font-weight: var(--font-weights-commerce-sans-5);
6348
+ font-weight: var(--font-weights-commerce-sans-1);
6112
6349
  margin-right: 2px;
6113
6350
  }
6114
6351
 
@@ -6153,7 +6390,7 @@ button {
6153
6390
  padding: var(--spacing-s) 24px;
6154
6391
  background-color: var(--gray-50);
6155
6392
  position: relative;
6156
- z-index: 2;
6393
+ z-index: var(--z-index-2);
6157
6394
  }
6158
6395
  .ncua-data-grid__action-bar:empty {
6159
6396
  padding: var(--spacing-xs) 0;
@@ -6182,9 +6419,12 @@ button {
6182
6419
  .ncua-data-grid__table {
6183
6420
  width: 100%;
6184
6421
  position: relative;
6185
- z-index: 1;
6422
+ z-index: var(--z-index-1);
6186
6423
  overflow: hidden;
6187
6424
  }
6425
+ .ncua-data-grid__table:has(.ncua-table__h-scroll-container) {
6426
+ overflow: visible;
6427
+ }
6188
6428
  .ncua-data-grid__table:first-child {
6189
6429
  border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
6190
6430
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncds/ui-admin",
3
- "version": "1.8.4",
3
+ "version": "1.8.5",
4
4
  "description": "nhn-commerce의 어드민 디자인 시스템입니다.",
5
5
  "scripts": {
6
6
  "barrel": "node barrel.js",