@godxjp/ui 6.0.0 → 6.0.2

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 (434) hide show
  1. package/dist/app/index.d.ts +140 -0
  2. package/dist/app/index.js +38 -0
  3. package/dist/app.prop-IobwLwaM.d.ts +90 -0
  4. package/dist/checkbox-NkFkqsQ8.d.ts +13 -0
  5. package/dist/chunk-2XW7J3EI.js +226 -0
  6. package/dist/chunk-3F2AKYRD.js +416 -0
  7. package/dist/chunk-3KPEZ5CF.js +37 -0
  8. package/dist/chunk-3UGU5TYP.js +89 -0
  9. package/{src/props/registry.ts → dist/chunk-6RA3KSVK.js} +118 -133
  10. package/dist/chunk-7NZFVD24.js +122 -0
  11. package/dist/chunk-7PWBC4BY.js +25 -0
  12. package/dist/chunk-7S7MYFXE.js +61 -0
  13. package/dist/chunk-7WRZG2IG.js +71 -0
  14. package/dist/chunk-B775Y6BE.js +1 -0
  15. package/dist/chunk-BHV2FUOA.js +111 -0
  16. package/dist/chunk-BI3HERR7.js +70 -0
  17. package/dist/chunk-BPSKQUL2.js +68 -0
  18. package/dist/chunk-CDWPQ5RP.js +187 -0
  19. package/dist/chunk-CP2LET6N.js +244 -0
  20. package/dist/chunk-CQBADMFG.js +20 -0
  21. package/dist/chunk-CRERCLIZ.js +33 -0
  22. package/dist/chunk-DU6ZYZRP.js +238 -0
  23. package/dist/chunk-DY5C44UP.js +55 -0
  24. package/dist/chunk-E4HJNQ62.js +117 -0
  25. package/dist/chunk-E76QIYSY.js +93 -0
  26. package/dist/chunk-F7PG4OEV.js +37 -0
  27. package/dist/chunk-GDSVW62T.js +171 -0
  28. package/dist/chunk-H2FHJOLU.js +178 -0
  29. package/dist/chunk-HJEBRCXL.js +55 -0
  30. package/dist/chunk-ICM6XBST.js +16 -0
  31. package/{src/components/data-entry/calendar.tsx → dist/chunk-IK7I3ABN.js} +33 -35
  32. package/dist/chunk-L6J44O74.js +144 -0
  33. package/dist/chunk-LDSLS6HE.js +1 -0
  34. package/dist/chunk-LVNUHUEZ.js +191 -0
  35. package/dist/chunk-M64MVRLS.js +92 -0
  36. package/dist/chunk-NGQW3KEM.js +402 -0
  37. package/dist/chunk-NZ4FOC5N.js +559 -0
  38. package/dist/chunk-PIIRNAXA.js +26 -0
  39. package/dist/chunk-S66TJXJU.js +33 -0
  40. package/dist/chunk-SMLKNECP.js +133 -0
  41. package/dist/chunk-TAHBM3F2.js +66 -0
  42. package/dist/chunk-TO33OY4L.js +150 -0
  43. package/dist/chunk-TO7URV7U.js +51 -0
  44. package/dist/chunk-TOO5AEKL.js +81 -0
  45. package/dist/chunk-U3GHAOIJ.js +299 -0
  46. package/dist/chunk-U7N2A7A3.js +9 -0
  47. package/dist/chunk-UX634MYF.js +123 -0
  48. package/dist/chunk-V6UWJKZF.js +28 -0
  49. package/{src/components/data-entry/input.tsx → dist/chunk-VOHTRR5X.js} +18 -16
  50. package/dist/chunk-WRFKVUPW.js +332 -0
  51. package/dist/chunk-WXW43RK5.js +24 -0
  52. package/{src/components/navigation/tabs.tsx → dist/chunk-XG7XDYIM.js} +46 -53
  53. package/dist/chunk-YFCQKO3B.js +842 -0
  54. package/dist/chunk-ZDWXGWLY.js +73 -0
  55. package/dist/chunk-ZLK5SPT6.js +11 -0
  56. package/dist/chunk-ZS6DTAM2.js +31 -0
  57. package/dist/chunk-ZT5UEUBO.js +1 -0
  58. package/dist/components/admin/index.d.ts +80 -0
  59. package/dist/components/admin/index.js +38 -0
  60. package/dist/components/data-display/badge.d.ts +12 -0
  61. package/dist/components/data-display/badge.js +3 -0
  62. package/dist/components/data-display/card.d.ts +87 -0
  63. package/dist/components/data-display/card.js +2 -0
  64. package/dist/components/data-display/index.d.ts +72 -0
  65. package/dist/components/data-display/index.js +89 -0
  66. package/dist/components/data-display/popover.d.ts +13 -0
  67. package/dist/components/data-display/popover.js +2 -0
  68. package/dist/components/data-display/scroll-area.d.ts +7 -0
  69. package/dist/components/data-display/scroll-area.js +2 -0
  70. package/dist/components/data-display/table.d.ts +10 -0
  71. package/dist/components/data-display/table.js +3 -0
  72. package/dist/components/data-entry/autocomplete.d.ts +16 -0
  73. package/dist/components/data-entry/autocomplete.js +8 -0
  74. package/dist/components/data-entry/calendar.d.ts +16 -0
  75. package/dist/components/data-entry/calendar.js +4 -0
  76. package/dist/components/data-entry/cascader.d.ts +32 -0
  77. package/dist/components/data-entry/cascader.js +13 -0
  78. package/dist/components/data-entry/checkbox.d.ts +13 -0
  79. package/dist/components/data-entry/checkbox.js +4 -0
  80. package/dist/components/data-entry/color-picker.d.ts +16 -0
  81. package/dist/components/data-entry/color-picker.js +6 -0
  82. package/dist/components/data-entry/command.d.ts +69 -0
  83. package/dist/components/data-entry/command.js +3 -0
  84. package/dist/components/data-entry/date-picker.d.ts +16 -0
  85. package/dist/components/data-entry/date-picker.js +8 -0
  86. package/dist/components/data-entry/date-range-picker.d.ts +16 -0
  87. package/dist/components/data-entry/date-range-picker.js +8 -0
  88. package/dist/components/data-entry/index.d.ts +53 -0
  89. package/dist/components/data-entry/index.js +152 -0
  90. package/dist/components/data-entry/input.d.ts +6 -0
  91. package/dist/components/data-entry/input.js +2 -0
  92. package/dist/components/data-entry/label.d.ts +8 -0
  93. package/dist/components/data-entry/label.js +2 -0
  94. package/dist/components/data-entry/radio.d.ts +24 -0
  95. package/dist/components/data-entry/radio.js +4 -0
  96. package/dist/components/data-entry/select.d.ts +18 -0
  97. package/dist/components/data-entry/select.js +3 -0
  98. package/dist/components/data-entry/slider.d.ts +16 -0
  99. package/dist/components/data-entry/slider.js +2 -0
  100. package/dist/components/data-entry/switch.d.ts +17 -0
  101. package/dist/components/data-entry/switch.js +2 -0
  102. package/dist/components/data-entry/textarea.d.ts +6 -0
  103. package/dist/components/data-entry/textarea.js +3 -0
  104. package/dist/components/data-entry/time-picker.d.ts +16 -0
  105. package/dist/components/data-entry/time-picker.js +7 -0
  106. package/dist/components/data-entry/transfer.d.ts +17 -0
  107. package/dist/components/data-entry/transfer.js +11 -0
  108. package/dist/components/data-entry/tree-select.d.ts +26 -0
  109. package/dist/components/data-entry/tree-select.js +13 -0
  110. package/dist/components/data-entry/upload.d.ts +42 -0
  111. package/dist/components/data-entry/upload.js +11 -0
  112. package/dist/components/feedback/alert.d.ts +60 -0
  113. package/dist/components/feedback/alert.js +7 -0
  114. package/dist/components/feedback/dialog.d.ts +64 -0
  115. package/dist/components/feedback/dialog.js +7 -0
  116. package/dist/components/feedback/index.d.ts +16 -0
  117. package/dist/components/feedback/index.js +14 -0
  118. package/dist/components/feedback/sheet.d.ts +24 -0
  119. package/dist/components/feedback/sheet.js +2 -0
  120. package/dist/components/feedback/sonner.d.ts +6 -0
  121. package/dist/components/feedback/sonner.js +1 -0
  122. package/dist/components/general/button.d.ts +20 -0
  123. package/dist/components/general/button.js +2 -0
  124. package/dist/components/general/index.d.ts +6 -0
  125. package/dist/components/general/index.js +2 -0
  126. package/dist/components/layout/index.d.ts +71 -0
  127. package/dist/components/layout/index.js +5 -0
  128. package/dist/components/navigation/dropdown-menu.d.ts +28 -0
  129. package/dist/components/navigation/dropdown-menu.js +2 -0
  130. package/dist/components/navigation/index.d.ts +32 -0
  131. package/dist/components/navigation/index.js +12 -0
  132. package/dist/components/navigation/pagination.d.ts +11 -0
  133. package/dist/components/navigation/pagination.js +7 -0
  134. package/dist/components/navigation/steps.d.ts +12 -0
  135. package/dist/components/navigation/steps.js +3 -0
  136. package/dist/components/navigation/tabs-items.d.ts +12 -0
  137. package/dist/components/navigation/tabs-items.js +3 -0
  138. package/dist/components/navigation/tabs.d.ts +12 -0
  139. package/dist/components/navigation/tabs.js +2 -0
  140. package/dist/components/query/index.d.ts +43 -0
  141. package/dist/components/query/index.js +8 -0
  142. package/dist/components/ui/index.d.ts +57 -0
  143. package/dist/components/ui/index.js +37 -0
  144. package/{src/props/vocabulary/content.prop.ts → dist/content.prop-D1Dd3TAc.d.ts} +16 -20
  145. package/dist/data-display.prop-DNTAzmDy.d.ts +58 -0
  146. package/dist/data-entry.prop-BEGA1lTq.d.ts +323 -0
  147. package/dist/data-table-D1u_rKLK.d.ts +83 -0
  148. package/dist/data.prop-BVvfKC_g.d.ts +41 -0
  149. package/dist/feedback.prop-BmxUlpAW.d.ts +64 -0
  150. package/dist/filter-bar-B7OGFO9S.d.ts +10 -0
  151. package/dist/form/index.d.ts +21 -0
  152. package/dist/form/index.js +4 -0
  153. package/dist/form.prop-BHgpuFFm.d.ts +41 -0
  154. package/dist/format-date-ByyZoqI5.d.ts +51 -0
  155. package/dist/general.prop-D7brMPNL.d.ts +16 -0
  156. package/dist/i18n/index.d.ts +217 -0
  157. package/dist/i18n/index.js +2 -0
  158. package/dist/index.d.ts +53 -0
  159. package/dist/index.js +39 -0
  160. package/dist/inline-C5u6ptJV.d.ts +10 -0
  161. package/dist/interaction.prop-Cdn7wOtq.d.ts +25 -0
  162. package/{src/props/vocabulary/layout.prop.ts → dist/layout.prop-4TCNvyQZ.d.ts} +9 -14
  163. package/dist/layout.prop-C795F0qg.d.ts +112 -0
  164. package/dist/lib/datetime/index.d.ts +31 -0
  165. package/dist/lib/datetime/index.js +1 -0
  166. package/dist/lib/utils.d.ts +5 -0
  167. package/dist/lib/utils.js +1 -0
  168. package/dist/navigation.prop-DpZqcXey.d.ts +78 -0
  169. package/dist/navigation.prop-DxBiClEH.d.ts +20 -0
  170. package/dist/props/components/index.d.ts +27 -0
  171. package/dist/props/components/index.js +1 -0
  172. package/dist/props/index.d.ts +28 -0
  173. package/dist/props/index.js +3 -0
  174. package/dist/props/registry.d.ts +649 -0
  175. package/dist/props/registry.js +1 -0
  176. package/dist/props/vocabulary/index.d.ts +7 -0
  177. package/dist/props/vocabulary/index.js +1 -0
  178. package/dist/query.prop-hIPrk2zI.d.ts +71 -0
  179. package/dist/search-input-uP01rY1L.d.ts +22 -0
  180. package/dist/shared.prop-BNRJc9K0.d.ts +45 -0
  181. package/{src → dist}/styles/control.css +1 -1
  182. package/dist/types-mvzYGrma.d.ts +37 -0
  183. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  184. package/package.json +234 -68
  185. package/src/app/__tests__/app-provider.test.tsx +0 -232
  186. package/src/app/__tests__/date-format-labels.test.ts +0 -36
  187. package/src/app/__tests__/date-formats.test.ts +0 -44
  188. package/src/app/__tests__/timezones.test.ts +0 -65
  189. package/src/app/app-provider.tsx +0 -227
  190. package/src/app/date-format-labels.ts +0 -21
  191. package/src/app/date-formats.ts +0 -30
  192. package/src/app/index.ts +0 -40
  193. package/src/app/locales.ts +0 -32
  194. package/src/app/request-headers.ts +0 -31
  195. package/src/app/storage.ts +0 -44
  196. package/src/app/time-format-labels.ts +0 -19
  197. package/src/app/time-formats.ts +0 -15
  198. package/src/app/timezones.ts +0 -208
  199. package/src/app/types.ts +0 -39
  200. package/src/app/use-formatting.ts +0 -47
  201. package/src/components/__tests__/accessibility-primitives.test.tsx +0 -65
  202. package/src/components/__tests__/docs-parity.test.ts +0 -41
  203. package/src/components/__tests__/shadcn-release-guardrails.test.ts +0 -71
  204. package/src/components/__tests__/theme-axes-integration.test.tsx +0 -242
  205. package/src/components/admin/index.ts +0 -76
  206. package/src/components/data-display/__tests__/card-table.test.tsx +0 -328
  207. package/src/components/data-display/__tests__/data-display.test.tsx +0 -73
  208. package/src/components/data-display/__tests__/data-table.test.tsx +0 -84
  209. package/src/components/data-display/__tests__/popover.test.tsx +0 -92
  210. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +0 -66
  211. package/src/components/data-display/badge.tsx +0 -27
  212. package/src/components/data-display/card.tsx +0 -194
  213. package/src/components/data-display/code-badge.tsx +0 -28
  214. package/src/components/data-display/collapsible.tsx +0 -5
  215. package/src/components/data-display/data-table.tsx +0 -476
  216. package/src/components/data-display/empty-state.tsx +0 -22
  217. package/src/components/data-display/index.ts +0 -41
  218. package/src/components/data-display/key-value-grid.tsx +0 -46
  219. package/src/components/data-display/popover.tsx +0 -62
  220. package/src/components/data-display/progress-meter.tsx +0 -20
  221. package/src/components/data-display/scan-panel.tsx +0 -16
  222. package/src/components/data-display/scroll-area.tsx +0 -42
  223. package/src/components/data-display/status-badge.tsx +0 -83
  224. package/src/components/data-display/table.tsx +0 -59
  225. package/src/components/data-display/timeline.tsx +0 -42
  226. package/src/components/data-display/tree-list.tsx +0 -42
  227. package/src/components/data-entry/__fixtures__/tree-options.ts +0 -80
  228. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +0 -417
  229. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +0 -40
  230. package/src/components/data-entry/__tests__/checkbox.test.tsx +0 -20
  231. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +0 -94
  232. package/src/components/data-entry/__tests__/form-field.test.tsx +0 -49
  233. package/src/components/data-entry/__tests__/input-textarea.test.tsx +0 -38
  234. package/src/components/data-entry/__tests__/label-select.test.tsx +0 -62
  235. package/src/components/data-entry/__tests__/pickers.test.tsx +0 -74
  236. package/src/components/data-entry/__tests__/radio.test.tsx +0 -46
  237. package/src/components/data-entry/__tests__/search-input.test.tsx +0 -32
  238. package/src/components/data-entry/__tests__/switch-field.test.tsx +0 -52
  239. package/src/components/data-entry/__tests__/upload.test.tsx +0 -125
  240. package/src/components/data-entry/autocomplete.tsx +0 -91
  241. package/src/components/data-entry/cascader.tsx +0 -305
  242. package/src/components/data-entry/checkbox-group.tsx +0 -90
  243. package/src/components/data-entry/checkbox.tsx +0 -30
  244. package/src/components/data-entry/choice-field.tsx +0 -27
  245. package/src/components/data-entry/choice-option.ts +0 -20
  246. package/src/components/data-entry/color-picker.tsx +0 -75
  247. package/src/components/data-entry/command.tsx +0 -56
  248. package/src/components/data-entry/country-select.tsx +0 -88
  249. package/src/components/data-entry/date-picker.tsx +0 -69
  250. package/src/components/data-entry/date-range-picker.tsx +0 -75
  251. package/src/components/data-entry/form-field.tsx +0 -59
  252. package/src/components/data-entry/index.ts +0 -62
  253. package/src/components/data-entry/label.tsx +0 -25
  254. package/src/components/data-entry/radio.tsx +0 -109
  255. package/src/components/data-entry/search-input.tsx +0 -103
  256. package/src/components/data-entry/select.tsx +0 -149
  257. package/src/components/data-entry/slider.tsx +0 -38
  258. package/src/components/data-entry/switch-field.tsx +0 -91
  259. package/src/components/data-entry/switch.tsx +0 -24
  260. package/src/components/data-entry/textarea.tsx +0 -12
  261. package/src/components/data-entry/time-picker.tsx +0 -214
  262. package/src/components/data-entry/transfer.tsx +0 -231
  263. package/src/components/data-entry/tree-select-strategy.ts +0 -6
  264. package/src/components/data-entry/tree-select.tsx +0 -279
  265. package/src/components/data-entry/tree-utils.ts +0 -221
  266. package/src/components/data-entry/upload-crop-dialog.tsx +0 -109
  267. package/src/components/data-entry/upload-types.ts +0 -86
  268. package/src/components/data-entry/upload.tsx +0 -498
  269. package/src/components/data-entry/use-upload-draft.ts +0 -93
  270. package/src/components/feedback/__tests__/alert.test.tsx +0 -127
  271. package/src/components/feedback/__tests__/dialog.test.tsx +0 -290
  272. package/src/components/feedback/__tests__/sheet.test.tsx +0 -94
  273. package/src/components/feedback/__tests__/skeleton.test.tsx +0 -25
  274. package/src/components/feedback/__tests__/toast.test.tsx +0 -52
  275. package/src/components/feedback/alert.tsx +0 -167
  276. package/src/components/feedback/dialog.tsx +0 -325
  277. package/src/components/feedback/index.ts +0 -53
  278. package/src/components/feedback/sheet.tsx +0 -130
  279. package/src/components/feedback/skeleton.tsx +0 -95
  280. package/src/components/feedback/sonner.tsx +0 -54
  281. package/src/components/feedback/toaster.tsx +0 -1
  282. package/src/components/feedback/use-toast.ts +0 -62
  283. package/src/components/general/__tests__/button.test.tsx +0 -71
  284. package/src/components/general/button.tsx +0 -61
  285. package/src/components/general/index.ts +0 -2
  286. package/src/components/layout/__tests__/page-container.test.tsx +0 -69
  287. package/src/components/layout/__tests__/page-inset.test.tsx +0 -14
  288. package/src/components/layout/__tests__/stack-inline.test.tsx +0 -39
  289. package/src/components/layout/app-shell.tsx +0 -42
  290. package/src/components/layout/breadcrumb.tsx +0 -35
  291. package/src/components/layout/index.ts +0 -31
  292. package/src/components/layout/inline.tsx +0 -13
  293. package/src/components/layout/menu.tsx +0 -34
  294. package/src/components/layout/mobile-frame.tsx +0 -57
  295. package/src/components/layout/page-container.tsx +0 -81
  296. package/src/components/layout/page-inset.tsx +0 -16
  297. package/src/components/layout/responsive-grid.tsx +0 -14
  298. package/src/components/layout/shell-app.tsx +0 -30
  299. package/src/components/layout/sidebar.tsx +0 -98
  300. package/src/components/layout/split-pane.tsx +0 -16
  301. package/src/components/layout/stack.tsx +0 -13
  302. package/src/components/layout/topbar.tsx +0 -108
  303. package/src/components/navigation/__tests__/app-pickers.test.tsx +0 -118
  304. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +0 -104
  305. package/src/components/navigation/__tests__/navigation.test.tsx +0 -61
  306. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +0 -76
  307. package/src/components/navigation/date-format-picker.tsx +0 -55
  308. package/src/components/navigation/dropdown-menu.tsx +0 -190
  309. package/src/components/navigation/filter-bar.tsx +0 -38
  310. package/src/components/navigation/index.ts +0 -28
  311. package/src/components/navigation/locale-picker.tsx +0 -49
  312. package/src/components/navigation/page-header.tsx +0 -50
  313. package/src/components/navigation/pagination-utils.ts +0 -35
  314. package/src/components/navigation/pagination.tsx +0 -168
  315. package/src/components/navigation/steps.tsx +0 -163
  316. package/src/components/navigation/tabs-items.tsx +0 -69
  317. package/src/components/navigation/time-format-picker.tsx +0 -55
  318. package/src/components/navigation/timezone-picker.tsx +0 -63
  319. package/src/components/query/__tests__/data-state.test.tsx +0 -214
  320. package/src/components/query/__tests__/infinite-prefetch.test.tsx +0 -105
  321. package/src/components/query/__tests__/query-helpers.test.tsx +0 -61
  322. package/src/components/query/data-state.tsx +0 -58
  323. package/src/components/query/index.ts +0 -10
  324. package/src/components/query/infinite-query-state.tsx +0 -99
  325. package/src/components/query/mutation-feedback.tsx +0 -31
  326. package/src/components/query/prefetch-link.tsx +0 -45
  327. package/src/components/query/query-refetch-button.tsx +0 -41
  328. package/src/components/ui/alert-dialog.tsx +0 -1
  329. package/src/components/ui/alert.tsx +0 -1
  330. package/src/components/ui/autocomplete.tsx +0 -1
  331. package/src/components/ui/badge.tsx +0 -1
  332. package/src/components/ui/button.tsx +0 -1
  333. package/src/components/ui/calendar.tsx +0 -1
  334. package/src/components/ui/card.tsx +0 -1
  335. package/src/components/ui/checkbox.tsx +0 -1
  336. package/src/components/ui/color-picker.tsx +0 -1
  337. package/src/components/ui/command.tsx +0 -1
  338. package/src/components/ui/date-picker.tsx +0 -1
  339. package/src/components/ui/date-range-picker.tsx +0 -1
  340. package/src/components/ui/dialog.tsx +0 -1
  341. package/src/components/ui/dropdown-menu.tsx +0 -1
  342. package/src/components/ui/index.tsx +0 -31
  343. package/src/components/ui/input.tsx +0 -1
  344. package/src/components/ui/label.tsx +0 -1
  345. package/src/components/ui/pagination.tsx +0 -1
  346. package/src/components/ui/popover.tsx +0 -1
  347. package/src/components/ui/radio.tsx +0 -1
  348. package/src/components/ui/scroll-area.tsx +0 -1
  349. package/src/components/ui/select.tsx +0 -1
  350. package/src/components/ui/sheet.tsx +0 -1
  351. package/src/components/ui/slider.tsx +0 -1
  352. package/src/components/ui/sonner.tsx +0 -1
  353. package/src/components/ui/switch.tsx +0 -1
  354. package/src/components/ui/table.tsx +0 -1
  355. package/src/components/ui/tabs-items.tsx +0 -1
  356. package/src/components/ui/tabs.tsx +0 -1
  357. package/src/components/ui/textarea.tsx +0 -1
  358. package/src/components/ui/time-picker.tsx +0 -1
  359. package/src/components/ui/upload.tsx +0 -1
  360. package/src/form/__tests__/use-zod-form.test.tsx +0 -97
  361. package/src/form/form-field-control.tsx +0 -44
  362. package/src/form/form-root.tsx +0 -29
  363. package/src/form/index.ts +0 -7
  364. package/src/form/use-zod-form.ts +0 -29
  365. package/src/i18n/__tests__/translate.test.ts +0 -23
  366. package/src/i18n/index.ts +0 -9
  367. package/src/i18n/messages/en.json +0 -171
  368. package/src/i18n/messages/ja.json +0 -171
  369. package/src/i18n/messages/vi.json +0 -171
  370. package/src/i18n/translate.ts +0 -74
  371. package/src/i18n/use-translation.ts +0 -53
  372. package/src/index.ts +0 -3
  373. package/src/lib/__tests__/control-styles.test.ts +0 -78
  374. package/src/lib/__tests__/datetime.test.ts +0 -77
  375. package/src/lib/__tests__/format-date.test.ts +0 -97
  376. package/src/lib/__tests__/format.test.ts +0 -62
  377. package/src/lib/__tests__/theme-tokens-audit.test.ts +0 -176
  378. package/src/lib/__tests__/theme-tokens-css.test.ts +0 -118
  379. package/src/lib/__tests__/token-governance.test.ts +0 -191
  380. package/src/lib/__tests__/variants.test.ts +0 -18
  381. package/src/lib/control-styles.ts +0 -33
  382. package/src/lib/datetime/detect.ts +0 -25
  383. package/src/lib/datetime/format-date.ts +0 -100
  384. package/src/lib/datetime/format.ts +0 -140
  385. package/src/lib/datetime/index.ts +0 -25
  386. package/src/lib/datetime/parse.ts +0 -51
  387. package/src/lib/datetime/sync.ts +0 -48
  388. package/src/lib/format.ts +0 -114
  389. package/src/lib/hooks.ts +0 -54
  390. package/src/lib/utils.ts +0 -6
  391. package/src/lib/variants.ts +0 -40
  392. package/src/props/components/app.prop.ts +0 -99
  393. package/src/props/components/data-display.prop.ts +0 -73
  394. package/src/props/components/data-entry.prop.ts +0 -334
  395. package/src/props/components/feedback.prop.ts +0 -80
  396. package/src/props/components/form.prop.ts +0 -46
  397. package/src/props/components/general.prop.ts +0 -18
  398. package/src/props/components/index.ts +0 -99
  399. package/src/props/components/layout.prop.ts +0 -130
  400. package/src/props/components/navigation.prop.ts +0 -88
  401. package/src/props/components/query.prop.ts +0 -94
  402. package/src/props/index.ts +0 -17
  403. package/src/props/vocabulary/data.prop.ts +0 -46
  404. package/src/props/vocabulary/index.ts +0 -73
  405. package/src/props/vocabulary/interaction.prop.ts +0 -42
  406. package/src/props/vocabulary/navigation.prop.ts +0 -19
  407. package/src/props/vocabulary/shared.prop.ts +0 -59
  408. package/src/test/__tests__/render-loop-guard.test.tsx +0 -38
  409. package/src/test/jest-dom.d.ts +0 -4
  410. package/src/test/render-loop-guard.tsx +0 -50
  411. package/src/test/render.tsx +0 -29
  412. package/src/test/theme-globals.test.ts +0 -77
  413. package/src/test/theme-globals.ts +0 -134
  414. package/src/test/theme-test-utils.tsx +0 -67
  415. /package/{src → dist}/styles/alert-layout.css +0 -0
  416. /package/{src → dist}/styles/badge-layout.css +0 -0
  417. /package/{src → dist}/styles/card-layout.css +0 -0
  418. /package/{src → dist}/styles/data-display-layout.css +0 -0
  419. /package/{src → dist}/styles/density.css +0 -0
  420. /package/{src → dist}/styles/dialog-layout.css +0 -0
  421. /package/{src → dist}/styles/index.css +0 -0
  422. /package/{src → dist}/styles/layout.css +0 -0
  423. /package/{src → dist}/styles/shell-layout.css +0 -0
  424. /package/{src → dist}/styles/table-layout.css +0 -0
  425. /package/{src → dist}/theme/example.service.css +0 -0
  426. /package/{src → dist}/tokens/base.css +0 -0
  427. /package/{src → dist}/tokens/foundation.css +0 -0
  428. /package/{src → dist}/tokens/primitives/badge.css +0 -0
  429. /package/{src → dist}/tokens/primitives/card.css +0 -0
  430. /package/{src → dist}/tokens/primitives/control.css +0 -0
  431. /package/{src → dist}/tokens/primitives/feedback.css +0 -0
  432. /package/{src → dist}/tokens/primitives/layout.css +0 -0
  433. /package/{src → dist}/tokens/primitives/navigation.css +0 -0
  434. /package/{src → dist}/tokens/primitives/table.css +0 -0
@@ -1,127 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { renderWithUi, screen, userEvent } from "@/test/render";
3
- import { Button } from "../../general/button";
4
- import { Alert, AlertActions, AlertContent, AlertDescription, AlertTitle } from "../alert";
5
-
6
- describe("Alert", () => {
7
- it("renders with role=alert and variant styling", () => {
8
- renderWithUi(
9
- <Alert variant="warning">
10
- <AlertContent>
11
- <AlertTitle>Pin lithium</AlertTitle>
12
- <AlertDescription>MSDS bắt buộc trước khi xuất kho.</AlertDescription>
13
- </AlertContent>
14
- </Alert>,
15
- );
16
- const alert = screen.getByRole("alert");
17
- expect(alert).toHaveAttribute("data-variant", "warning");
18
- expect(screen.getByText("Pin lithium")).toBeInTheDocument();
19
- expect(screen.getByText(/MSDS/)).toBeInTheDocument();
20
- });
21
-
22
- it("renders destructive variant for API errors", () => {
23
- renderWithUi(
24
- <Alert variant="destructive">
25
- <AlertContent>
26
- <AlertTitle>Không tải được</AlertTitle>
27
- <AlertDescription>503 Service Unavailable</AlertDescription>
28
- </AlertContent>
29
- </Alert>,
30
- );
31
- expect(screen.getByRole("alert")).toHaveAttribute("data-variant", "destructive");
32
- expect(screen.getByText("Không tải được")).toHaveAttribute("data-slot", "alert-title");
33
- });
34
-
35
- it("renders actions slot", async () => {
36
- const user = userEvent.setup();
37
- const onAction = vi.fn();
38
- renderWithUi(
39
- <Alert variant="default">
40
- <AlertContent>
41
- <AlertTitle>Bảo trì</AlertTitle>
42
- <AlertDescription>Pub/Sub emulator restart lúc 02:00 JST.</AlertDescription>
43
- </AlertContent>
44
- <AlertActions>
45
- <Button size="sm" onClick={onAction}>
46
- Xem lịch
47
- </Button>
48
- </AlertActions>
49
- </Alert>,
50
- );
51
- await user.click(screen.getByRole("button", { name: "Xem lịch" }));
52
- expect(onAction).toHaveBeenCalledOnce();
53
- });
54
-
55
- it("calls onDismiss when dismiss control clicked", async () => {
56
- const user = userEvent.setup();
57
- const onDismiss = vi.fn();
58
- renderWithUi(
59
- <Alert variant="success" onDismiss={onDismiss}>
60
- <AlertContent>
61
- <AlertTitle>Đã lưu template Zalo</AlertTitle>
62
- <AlertDescription>Thay đổi có hiệu lực ngay.</AlertDescription>
63
- </AlertContent>
64
- </Alert>,
65
- );
66
- await user.click(screen.getByRole("button", { name: "Dismiss" }));
67
- expect(onDismiss).toHaveBeenCalledOnce();
68
- });
69
-
70
- it("hides icon when icon={false}", () => {
71
- const { container } = renderWithUi(
72
- <Alert variant="warning" icon={false}>
73
- <AlertContent>
74
- <AlertTitle>No icon</AlertTitle>
75
- </AlertContent>
76
- </Alert>,
77
- );
78
- expect(container.querySelector("svg")).toBeNull();
79
- });
80
-
81
- it("renders success variant styling", () => {
82
- renderWithUi(
83
- <Alert variant="success">
84
- <AlertContent>
85
- <AlertTitle>Template saved</AlertTitle>
86
- <AlertDescription>Zalo OA preview ready.</AlertDescription>
87
- </AlertContent>
88
- </Alert>,
89
- );
90
- expect(screen.getByRole("alert")).toHaveAttribute("data-variant", "success");
91
- });
92
-
93
- it("renders default variant without destructive classes", () => {
94
- renderWithUi(
95
- <Alert variant="default">
96
- <AlertContent>
97
- <AlertTitle>Maintenance</AlertTitle>
98
- </AlertContent>
99
- </Alert>,
100
- );
101
- const alert = screen.getByRole("alert");
102
- expect(alert).toHaveAttribute("data-variant", "default");
103
- });
104
- });
105
-
106
- describe("Alert.QueryError", () => {
107
- it("shows message and retry", async () => {
108
- const user = userEvent.setup();
109
- const onRetry = vi.fn();
110
- renderWithUi(<Alert.QueryError error={new Error("boom")} onRetry={onRetry} />);
111
- expect(screen.getByRole("alert")).toBeInTheDocument();
112
- expect(screen.getByText(/boom/)).toBeInTheDocument();
113
- await user.click(screen.getByRole("button", { name: /thử lại/i }));
114
- expect(onRetry).toHaveBeenCalledOnce();
115
- });
116
-
117
- it("omits retry button when onRetry is omitted", () => {
118
- renderWithUi(<Alert.QueryError error="Validation failed: declared_value must be > 0" />);
119
- expect(screen.getByRole("alert")).toBeInTheDocument();
120
- expect(screen.queryByRole("button", { name: /thử lại/i })).not.toBeInTheDocument();
121
- });
122
-
123
- it("uses destructive Alert styling", () => {
124
- renderWithUi(<Alert.QueryError error={new Error("503")} onRetry={() => undefined} />);
125
- expect(screen.getByRole("alert")).toHaveAttribute("data-variant", "destructive");
126
- });
127
- });
@@ -1,290 +0,0 @@
1
- import * as React from "react";
2
- import { describe, expect, it, vi } from "vitest";
3
- import { renderWithUi, screen, userEvent, waitFor } from "@/test/render";
4
- import {
5
- Dialog,
6
- DialogAction,
7
- DialogCancel,
8
- DialogConfirm,
9
- DialogContent,
10
- DialogDescription,
11
- DialogFooter,
12
- DialogHeader,
13
- DialogTitle,
14
- DialogTrigger,
15
- } from "../dialog";
16
- import { Button } from "../../general/button";
17
-
18
- function PhraseResetHarness() {
19
- const [open, setOpen] = React.useState(true);
20
- return (
21
- <>
22
- <button type="button" onClick={() => setOpen(true)}>
23
- Reopen
24
- </button>
25
- <DialogConfirm
26
- open={open}
27
- onOpenChange={setOpen}
28
- title="Purge?"
29
- confirmPhrase="DELETE"
30
- confirmLabel="Purge"
31
- onConfirm={() => undefined}
32
- />
33
- </>
34
- );
35
- }
36
-
37
- describe("Dialog form mode", () => {
38
- it("opens on trigger click and closes via escape", async () => {
39
- const user = userEvent.setup();
40
- renderWithUi(
41
- <Dialog>
42
- <DialogTrigger asChild>
43
- <Button type="button">Mở</Button>
44
- </DialogTrigger>
45
- <DialogContent>
46
- <DialogHeader>
47
- <DialogTitle>Xác nhận manifest</DialogTitle>
48
- <DialogDescription>Chốt 12 kiện Osaka?</DialogDescription>
49
- </DialogHeader>
50
- <DialogFooter>
51
- <Button type="button" variant="ghost">
52
- Hủy
53
- </Button>
54
- </DialogFooter>
55
- </DialogContent>
56
- </Dialog>,
57
- );
58
-
59
- expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
60
- await user.click(screen.getByRole("button", { name: "Mở" }));
61
- expect(screen.getByRole("dialog")).toHaveAttribute("data-slot", "dialog-content");
62
- expect(screen.getByText("Chốt 12 kiện Osaka?")).toBeInTheDocument();
63
- await user.keyboard("{Escape}");
64
- expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
65
- });
66
-
67
- it("calls onOpenChange when controlled", async () => {
68
- const user = userEvent.setup();
69
- const onOpenChange = vi.fn();
70
- renderWithUi(
71
- <Dialog open onOpenChange={onOpenChange}>
72
- <DialogContent>
73
- <DialogTitle>Controlled</DialogTitle>
74
- </DialogContent>
75
- </Dialog>,
76
- );
77
- await user.keyboard("{Escape}");
78
- expect(onOpenChange).toHaveBeenCalledWith(false);
79
- });
80
- });
81
-
82
- describe("Dialog confirm mode (compound)", () => {
83
- it("uses alertdialog role and has no close icon", () => {
84
- renderWithUi(
85
- <Dialog mode="confirm" open onOpenChange={() => undefined}>
86
- <DialogContent>
87
- <DialogHeader>
88
- <DialogTitle>Proceed?</DialogTitle>
89
- <DialogDescription>This cannot be undone.</DialogDescription>
90
- </DialogHeader>
91
- </DialogContent>
92
- </Dialog>,
93
- );
94
- expect(screen.getByRole("alertdialog")).toHaveAttribute("data-slot", "dialog-content");
95
- expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
96
- expect(screen.queryByRole("button", { name: /close/i })).not.toBeInTheDocument();
97
- });
98
-
99
- it("calls onOpenChange(false) when cancel clicked", async () => {
100
- const user = userEvent.setup();
101
- const onOpenChange = vi.fn();
102
- renderWithUi(
103
- <Dialog mode="confirm" open onOpenChange={onOpenChange}>
104
- <DialogContent>
105
- <DialogHeader>
106
- <DialogTitle>Proceed?</DialogTitle>
107
- </DialogHeader>
108
- <DialogFooter>
109
- <DialogCancel asChild>
110
- <Button variant="ghost">Cancel</Button>
111
- </DialogCancel>
112
- </DialogFooter>
113
- </DialogContent>
114
- </Dialog>,
115
- );
116
- await user.click(screen.getByRole("button", { name: "Cancel" }));
117
- expect(onOpenChange).toHaveBeenCalledWith(false);
118
- });
119
-
120
- it("renders DialogAction", () => {
121
- renderWithUi(
122
- <Dialog mode="confirm" open onOpenChange={() => undefined}>
123
- <DialogContent>
124
- <DialogHeader>
125
- <DialogTitle>Seal manifest</DialogTitle>
126
- </DialogHeader>
127
- <DialogFooter>
128
- <DialogAction asChild>
129
- <Button>Seal</Button>
130
- </DialogAction>
131
- </DialogFooter>
132
- </DialogContent>
133
- </Dialog>,
134
- );
135
- expect(screen.getByRole("button", { name: "Seal" })).toBeInTheDocument();
136
- });
137
- });
138
-
139
- describe("Dialog.Confirm preset", () => {
140
- it("renders alertdialog with title and description", () => {
141
- renderWithUi(
142
- <DialogConfirm
143
- open
144
- onOpenChange={() => undefined}
145
- title="Chốt manifest?"
146
- description="47 kiện sẽ bị khóa."
147
- onConfirm={() => undefined}
148
- />,
149
- );
150
-
151
- expect(screen.getByRole("alertdialog")).toBeInTheDocument();
152
- expect(screen.getByText("Chốt manifest?")).toBeInTheDocument();
153
- expect(screen.getByText("47 kiện sẽ bị khóa.")).toBeInTheDocument();
154
- });
155
-
156
- it("calls onConfirm and closes when confirmed", async () => {
157
- const user = userEvent.setup();
158
- const onOpenChange = vi.fn();
159
- const onConfirm = vi.fn();
160
- renderWithUi(
161
- <DialogConfirm
162
- open
163
- onOpenChange={onOpenChange}
164
- title="Confirm?"
165
- description="Sure?"
166
- onConfirm={onConfirm}
167
- />,
168
- );
169
-
170
- await user.click(screen.getByRole("button", { name: "Tiếp tục" }));
171
- await waitFor(() => {
172
- expect(onConfirm).toHaveBeenCalledOnce();
173
- });
174
- expect(onOpenChange).toHaveBeenCalledWith(false);
175
- });
176
-
177
- it("closes on cancel without calling onConfirm", async () => {
178
- const user = userEvent.setup();
179
- const onOpenChange = vi.fn();
180
- const onConfirm = vi.fn();
181
- renderWithUi(
182
- <DialogConfirm open onOpenChange={onOpenChange} title="Confirm?" onConfirm={onConfirm} />,
183
- );
184
-
185
- await user.click(screen.getByRole("button", { name: "Hủy" }));
186
- expect(onOpenChange).toHaveBeenCalledWith(false);
187
- expect(onConfirm).not.toHaveBeenCalled();
188
- });
189
-
190
- it("disables both buttons when pending", () => {
191
- renderWithUi(
192
- <DialogConfirm
193
- open
194
- onOpenChange={() => undefined}
195
- title="Wait"
196
- pending
197
- onConfirm={() => undefined}
198
- />,
199
- );
200
- expect(screen.getByRole("button", { name: "Đang xử lý…" })).toBeDisabled();
201
- expect(screen.getByRole("button", { name: "Hủy" })).toBeDisabled();
202
- });
203
-
204
- it("keeps dialog open when keepOpenOnConfirm is true", async () => {
205
- const user = userEvent.setup();
206
- const onOpenChange = vi.fn();
207
- renderWithUi(
208
- <DialogConfirm
209
- open
210
- onOpenChange={onOpenChange}
211
- title="Next step"
212
- keepOpenOnConfirm
213
- onConfirm={() => undefined}
214
- />,
215
- );
216
-
217
- await user.click(screen.getByRole("button", { name: "Tiếp tục" }));
218
- expect(onOpenChange).not.toHaveBeenCalledWith(false);
219
- });
220
-
221
- describe("confirmPhrase", () => {
222
- it("shows type-to-confirm field and defaults confirm label to delete", () => {
223
- renderWithUi(
224
- <DialogConfirm
225
- open
226
- onOpenChange={() => undefined}
227
- title="Purge?"
228
- confirmPhrase="DELETE"
229
- onConfirm={() => undefined}
230
- />,
231
- );
232
-
233
- expect(screen.getByPlaceholderText("DELETE")).toBeInTheDocument();
234
- expect(screen.getByRole("button", { name: "Xóa" })).toBeDisabled();
235
- });
236
-
237
- it("enables confirm only when phrase matches exactly", async () => {
238
- const user = userEvent.setup();
239
- renderWithUi(
240
- <DialogConfirm
241
- open
242
- onOpenChange={() => undefined}
243
- title="Purge?"
244
- confirmPhrase="DELETE"
245
- confirmLabel="Purge"
246
- onConfirm={() => undefined}
247
- />,
248
- );
249
-
250
- const confirmBtn = screen.getByRole("button", { name: "Purge" });
251
- const input = screen.getByPlaceholderText("DELETE");
252
- expect(confirmBtn).toBeDisabled();
253
-
254
- await user.type(input, "DELET");
255
- expect(confirmBtn).toBeDisabled();
256
-
257
- await user.type(input, "E");
258
- expect(confirmBtn).toBeEnabled();
259
- });
260
-
261
- it("clears typed phrase when dialog closes and reopens", async () => {
262
- const user = userEvent.setup();
263
- renderWithUi(<PhraseResetHarness />);
264
-
265
- await user.type(screen.getByPlaceholderText("DELETE"), "DELETE");
266
- await user.click(screen.getByRole("button", { name: "Hủy" }));
267
-
268
- await user.click(screen.getByRole("button", { name: "Reopen" }));
269
- expect(screen.getByPlaceholderText("DELETE")).toHaveValue("");
270
- expect(screen.getByRole("button", { name: "Purge" })).toBeDisabled();
271
- });
272
- });
273
- });
274
-
275
- describe("Dialog namespace", () => {
276
- it("exposes Confirm preset on Dialog.Confirm", () => {
277
- expect(Dialog.Confirm).toBe(DialogConfirm);
278
- });
279
-
280
- it("supports shadcn showCloseButton naming", () => {
281
- renderWithUi(
282
- <Dialog open onOpenChange={() => undefined}>
283
- <DialogContent showCloseButton={false}>
284
- <DialogTitle>No close</DialogTitle>
285
- </DialogContent>
286
- </Dialog>,
287
- );
288
- expect(screen.queryByRole("button", { name: /close/i })).not.toBeInTheDocument();
289
- });
290
- });
@@ -1,94 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi, screen, userEvent } from "@/test/render";
3
- import { Button } from "../../general/button";
4
- import {
5
- Sheet,
6
- SheetContent,
7
- SheetDescription,
8
- SheetFooter,
9
- SheetHeader,
10
- SheetTitle,
11
- SheetTrigger,
12
- } from "../sheet";
13
-
14
- describe("Sheet", () => {
15
- it("opens side panel from trigger", async () => {
16
- const user = userEvent.setup();
17
- renderWithUi(
18
- <Sheet>
19
- <SheetTrigger asChild>
20
- <Button type="button">Bộ lọc</Button>
21
- </SheetTrigger>
22
- <SheetContent>
23
- <SheetHeader>
24
- <SheetTitle>Lọc khách CRM</SheetTitle>
25
- </SheetHeader>
26
- </SheetContent>
27
- </Sheet>,
28
- );
29
- await user.click(screen.getByRole("button", { name: "Bộ lọc" }));
30
- expect(screen.getByRole("dialog", { name: "Lọc khách CRM" })).toHaveAttribute(
31
- "data-slot",
32
- "sheet-content",
33
- );
34
- });
35
-
36
- it("renders description inside panel", async () => {
37
- const user = userEvent.setup();
38
- renderWithUi(
39
- <Sheet>
40
- <SheetTrigger asChild>
41
- <Button type="button">Chi tiết</Button>
42
- </SheetTrigger>
43
- <SheetContent>
44
- <SheetHeader>
45
- <SheetTitle>Đơn hàng #1024</SheetTitle>
46
- <SheetDescription>Xem thông tin vận chuyển</SheetDescription>
47
- </SheetHeader>
48
- </SheetContent>
49
- </Sheet>,
50
- );
51
- await user.click(screen.getByRole("button", { name: "Chi tiết" }));
52
- expect(screen.getByText("Xem thông tin vận chuyển")).toBeInTheDocument();
53
- });
54
-
55
- it("closes when pressing Escape", async () => {
56
- const user = userEvent.setup();
57
- renderWithUi(
58
- <Sheet>
59
- <SheetTrigger asChild>
60
- <Button type="button">Bộ lọc</Button>
61
- </SheetTrigger>
62
- <SheetContent>
63
- <SheetHeader>
64
- <SheetTitle>Lọc khách CRM</SheetTitle>
65
- </SheetHeader>
66
- </SheetContent>
67
- </Sheet>,
68
- );
69
- await user.click(screen.getByRole("button", { name: "Bộ lọc" }));
70
- expect(screen.getByRole("dialog", { name: "Lọc khách CRM" })).toBeInTheDocument();
71
- await user.keyboard("{Escape}");
72
- expect(screen.queryByRole("dialog", { name: "Lọc khách CRM" })).not.toBeInTheDocument();
73
- });
74
-
75
- it("exposes footer slot and optional close button", async () => {
76
- const user = userEvent.setup();
77
- renderWithUi(
78
- <Sheet>
79
- <SheetTrigger asChild>
80
- <Button type="button">Footer</Button>
81
- </SheetTrigger>
82
- <SheetContent showCloseButton={false}>
83
- <SheetHeader>
84
- <SheetTitle>Panel</SheetTitle>
85
- </SheetHeader>
86
- <SheetFooter>Actions</SheetFooter>
87
- </SheetContent>
88
- </Sheet>,
89
- );
90
- await user.click(screen.getByRole("button", { name: "Footer" }));
91
- expect(screen.getByText("Actions")).toHaveAttribute("data-slot", "sheet-footer");
92
- expect(screen.queryByRole("button", { name: /close/i })).not.toBeInTheDocument();
93
- });
94
- });
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi } from "@/test/render";
3
- import { SkeletonCard, SkeletonDetail, SkeletonRows, SkeletonTable } from "../skeleton";
4
-
5
- describe("Skeleton", () => {
6
- it("SkeletonRows marks busy state", () => {
7
- const { container } = renderWithUi(<SkeletonRows rows={2} columns={3} />);
8
- expect(container.querySelector("[aria-busy='true']")).toBeInTheDocument();
9
- });
10
-
11
- it("SkeletonTable renders header and body placeholders", () => {
12
- const { container } = renderWithUi(<SkeletonTable rows={3} columns={4} />);
13
- expect(container.querySelector(".ui-skeleton-table")).toBeInTheDocument();
14
- });
15
-
16
- it("SkeletonDetail renders title blocks", () => {
17
- const { container } = renderWithUi(<SkeletonDetail />);
18
- expect(container.querySelectorAll(".ui-skeleton-block").length).toBeGreaterThan(0);
19
- });
20
-
21
- it("SkeletonCard renders stat tile shape", () => {
22
- const { container } = renderWithUi(<SkeletonCard />);
23
- expect(container.querySelector(".ui-skeleton-card")).toBeInTheDocument();
24
- });
25
- });
@@ -1,52 +0,0 @@
1
- import * as React from "react";
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
3
- import { renderWithUi, screen } from "@/test/render";
4
- import { Toaster } from "../sonner";
5
- import { toast, useToast } from "../use-toast";
6
-
7
- const sonnerMock = vi.hoisted(() => {
8
- const fn = vi.fn();
9
- return Object.assign(fn, {
10
- success: vi.fn(),
11
- error: vi.fn(),
12
- dismiss: vi.fn(),
13
- });
14
- });
15
-
16
- vi.mock("sonner", () => ({
17
- toast: sonnerMock,
18
- Toaster: ({ className, ...props }: { className?: string; children?: React.ReactNode }) => (
19
- <div data-testid="sonner-mock" className={className} {...props} />
20
- ),
21
- }));
22
-
23
- describe("Toaster", () => {
24
- it("renders Sonner container", () => {
25
- renderWithUi(<Toaster />);
26
- expect(screen.getByTestId("sonner-mock")).toBeInTheDocument();
27
- });
28
- });
29
-
30
- describe("toast adapter", () => {
31
- beforeEach(() => {
32
- sonnerMock.mockClear();
33
- sonnerMock.success.mockClear();
34
- sonnerMock.error.mockClear();
35
- });
36
-
37
- it("maps legacy success variant to sonner.success", () => {
38
- toast({ title: "Đã lưu manifest", variant: "success" });
39
- expect(sonnerMock.success).toHaveBeenCalledWith("Đã lưu manifest", expect.any(Object));
40
- });
41
-
42
- it("maps legacy destructive variant to sonner.error", () => {
43
- toast({ title: "Lỗi xuất kho", variant: "destructive" });
44
- expect(sonnerMock.error).toHaveBeenCalledWith("Lỗi xuất kho", expect.any(Object));
45
- });
46
-
47
- it("useToast exposes legacy toast helper", () => {
48
- const { toast: legacy } = useToast();
49
- legacy({ title: "Ping", variant: "default" });
50
- expect(sonnerMock).toHaveBeenCalledWith("Ping", expect.any(Object));
51
- });
52
- });