@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,417 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import * as React from "react";
3
- import { renderWithUi, screen, userEvent, waitFor } from "@/test/render";
4
- import { Cascader } from "../cascader";
5
- import { TreeSelect } from "../tree-select";
6
- import { Transfer } from "../transfer";
7
- import { REGION_OPTIONS, ORG_TREE, TRANSFER_MOCK } from "../__fixtures__/tree-options";
8
- import {
9
- collectAllPaths,
10
- collectLeafPaths,
11
- filterTreeOptions,
12
- formatPathLabels,
13
- getNodeByPath,
14
- normalizeTreeOptions,
15
- pathKey,
16
- } from "../tree-utils";
17
-
18
- describe("tree-utils", () => {
19
- const options = normalizeTreeOptions(REGION_OPTIONS);
20
-
21
- it("resolves path labels", () => {
22
- const path = ["vn", "hcm", "q1"];
23
- expect(formatPathLabels(getNodeByPath(options, path))).toBe(
24
- "Việt Nam / TP. Hồ Chí Minh / Quận 1",
25
- );
26
- });
27
-
28
- it("collects leaf paths", () => {
29
- const paths = collectAllPaths(options);
30
- expect(paths.some((p) => pathKey(p.path) === pathKey(["jp", "tokyo", "shibuya"]))).toBe(true);
31
- });
32
-
33
- it("collects nested leaf path labels from tree root", () => {
34
- const paths = collectLeafPaths(options);
35
- const shinjuku = paths.find((p) => pathKey(p.path) === pathKey(["jp", "tokyo", "shinjuku"]));
36
- expect(shinjuku?.labels.join(" / ")).toBe("日本 / 東京都 / 新宿区");
37
- });
38
-
39
- it("collects nested node labels from tree root", () => {
40
- const paths = collectAllPaths(options);
41
- const tokyo = paths.find((p) => pathKey(p.path) === pathKey(["jp", "tokyo"]));
42
- expect(tokyo?.labels.join(" / ")).toBe("日本 / 東京都");
43
- });
44
-
45
- it("filters leaf paths by label (case-insensitive)", () => {
46
- const matches = filterTreeOptions(options, "QUẬN 1");
47
- expect(matches).toHaveLength(1);
48
- expect(matches[0]?.labels.join(" / ")).toBe("Việt Nam / TP. Hồ Chí Minh / Quận 1");
49
- });
50
-
51
- it("returns empty array for blank search query", () => {
52
- expect(filterTreeOptions(options, " ")).toEqual([]);
53
- });
54
-
55
- it("matches any segment in the path chain", () => {
56
- const matches = filterTreeOptions(options, "東京都");
57
- expect(matches.some((m) => pathKey(m.path) === pathKey(["jp", "tokyo", "shinjuku"]))).toBe(
58
- true,
59
- );
60
- expect(matches.some((m) => pathKey(m.path) === pathKey(["jp", "tokyo", "shibuya"]))).toBe(true);
61
- });
62
- });
63
-
64
- describe("Cascader", () => {
65
- it("renders trigger with placeholder", () => {
66
- renderWithUi(<Cascader options={REGION_OPTIONS} />);
67
- expect(screen.getByRole("combobox")).toBeInTheDocument();
68
- expect(screen.getByText("Chọn…")).toBeInTheDocument();
69
- });
70
-
71
- it("selects a leaf path", async () => {
72
- const user = userEvent.setup();
73
- const onChange = vi.fn();
74
-
75
- renderWithUi(<Cascader options={REGION_OPTIONS} onChange={onChange} />);
76
- await user.click(screen.getByRole("combobox"));
77
-
78
- await user.click(screen.getByRole("button", { name: /việt nam/i }));
79
- await user.click(screen.getByRole("button", { name: /tp\. hồ chí minh/i }));
80
- await user.click(screen.getByRole("button", { name: /quận 1/i }));
81
-
82
- expect(onChange).toHaveBeenCalledWith(["vn", "hcm", "q1"], expect.any(Array));
83
- });
84
-
85
- it("shows cascade columns when showSearch is on and query is empty", async () => {
86
- const user = userEvent.setup();
87
-
88
- renderWithUi(
89
- <Cascader options={REGION_OPTIONS} showSearch defaultValue={["jp", "tokyo", "shinjuku"]} />,
90
- );
91
- await user.click(screen.getByRole("combobox"));
92
-
93
- expect(screen.getByRole("button", { name: /việt nam/i })).toBeInTheDocument();
94
- expect(screen.getByRole("button", { name: /^日本$/i })).toBeInTheDocument();
95
- expect(screen.queryByRole("option")).not.toBeInTheDocument();
96
- });
97
-
98
- it("filters leaf paths when searching", async () => {
99
- const user = userEvent.setup();
100
-
101
- renderWithUi(<Cascader options={REGION_OPTIONS} showSearch />);
102
- await user.click(screen.getByRole("combobox"));
103
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "新宿");
104
-
105
- expect(await screen.findByRole("button", { name: /新宿区/i })).toBeInTheDocument();
106
- expect(screen.queryByRole("button", { name: /^việt nam$/i })).not.toBeInTheDocument();
107
- });
108
-
109
- it("selects a path from search results", async () => {
110
- const user = userEvent.setup();
111
- const onChange = vi.fn();
112
-
113
- renderWithUi(<Cascader options={REGION_OPTIONS} showSearch onChange={onChange} />);
114
- await user.click(screen.getByRole("combobox"));
115
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "quận 3");
116
-
117
- await user.click(await screen.findByRole("button", { name: /quận 3/i }));
118
-
119
- expect(onChange).toHaveBeenCalledWith(["vn", "hcm", "q3"], expect.any(Array));
120
- });
121
-
122
- it("shows default value label on trigger", () => {
123
- renderWithUi(
124
- <Cascader options={REGION_OPTIONS} showSearch defaultValue={["jp", "tokyo", "shinjuku"]} />,
125
- );
126
-
127
- expect(screen.getByRole("combobox")).toHaveTextContent("日本 / 東京都 / 新宿区");
128
- });
129
-
130
- it("clears search when popover closes", async () => {
131
- const user = userEvent.setup();
132
-
133
- renderWithUi(<Cascader options={REGION_OPTIONS} showSearch />);
134
- await user.click(screen.getByRole("combobox"));
135
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "新宿");
136
- expect(await screen.findByRole("button", { name: /新宿区/i })).toBeInTheDocument();
137
-
138
- await user.keyboard("{Escape}");
139
- await user.click(screen.getByRole("combobox"));
140
-
141
- expect(screen.getByPlaceholderText(/tìm kiếm/i)).toHaveValue("");
142
- expect(screen.getByRole("button", { name: /việt nam/i })).toBeInTheDocument();
143
- });
144
-
145
- it("expands cascade columns when clicking a parent node", async () => {
146
- const user = userEvent.setup();
147
-
148
- renderWithUi(<Cascader options={REGION_OPTIONS} />);
149
- await user.click(screen.getByRole("combobox"));
150
- await user.click(screen.getByRole("button", { name: /việt nam/i }));
151
-
152
- expect(screen.getByRole("button", { name: /tp\. hồ chí minh/i })).toBeInTheDocument();
153
- expect(screen.getByRole("button", { name: /hà nội/i })).toBeInTheDocument();
154
- });
155
-
156
- it("commits intermediate path when changeOnSelect is enabled", async () => {
157
- const user = userEvent.setup();
158
- const onChange = vi.fn();
159
-
160
- renderWithUi(<Cascader options={REGION_OPTIONS} changeOnSelect onChange={onChange} />);
161
- await user.click(screen.getByRole("combobox"));
162
- await user.click(screen.getByRole("button", { name: /việt nam/i }));
163
-
164
- expect(onChange).toHaveBeenCalledWith(["vn"], expect.any(Array));
165
- });
166
-
167
- it("clears selected value via clear icon", async () => {
168
- const user = userEvent.setup();
169
- const onChange = vi.fn();
170
-
171
- renderWithUi(
172
- <Cascader options={REGION_OPTIONS} defaultValue={["vn", "hcm", "q1"]} onChange={onChange} />,
173
- );
174
-
175
- const combobox = screen.getByRole("combobox");
176
- const clearIcon = combobox.querySelector("svg.lucide-x");
177
- expect(clearIcon).toBeTruthy();
178
- await user.click(clearIcon!);
179
-
180
- expect(onChange).toHaveBeenCalledWith([], expect.any(Array));
181
- expect(combobox).toHaveTextContent("Chọn…");
182
- });
183
-
184
- it("shows empty state when search has no matches", async () => {
185
- const user = userEvent.setup();
186
-
187
- renderWithUi(<Cascader options={REGION_OPTIONS} showSearch />);
188
- await user.click(screen.getByRole("combobox"));
189
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "xyz-no-match");
190
-
191
- expect(await screen.findByText(/không có kết quả/i)).toBeInTheDocument();
192
- });
193
-
194
- it("does not open when disabled", async () => {
195
- const user = userEvent.setup();
196
-
197
- renderWithUi(<Cascader options={REGION_OPTIONS} disabled defaultValue={["vn", "hcm", "q1"]} />);
198
- await user.click(screen.getByRole("combobox"));
199
-
200
- expect(screen.queryByRole("button", { name: /việt nam/i })).not.toBeInTheDocument();
201
- });
202
-
203
- it("supports multiple selection without closing panel", async () => {
204
- const user = userEvent.setup();
205
- const onChange = vi.fn();
206
-
207
- renderWithUi(<Cascader options={REGION_OPTIONS} multiple showSearch onChange={onChange} />);
208
- await user.click(screen.getByRole("combobox"));
209
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "quận 1");
210
- await user.click(await screen.findByRole("button", { name: /quận 1/i }));
211
-
212
- expect(onChange).toHaveBeenCalledWith([["vn", "hcm", "q1"]], expect.any(Array));
213
- expect(screen.getAllByRole("combobox")[0]).toHaveTextContent(
214
- "Việt Nam / TP. Hồ Chí Minh / Quận 1",
215
- );
216
-
217
- const search = screen.getByPlaceholderText(/tìm kiếm/i);
218
- await user.clear(search);
219
- await user.type(search, "quận 3");
220
- await user.click(await screen.findByRole("button", { name: /quận 3/i }));
221
-
222
- expect(onChange).toHaveBeenLastCalledWith(
223
- expect.arrayContaining([
224
- ["vn", "hcm", "q1"],
225
- ["vn", "hcm", "q3"],
226
- ]),
227
- expect.any(Array),
228
- );
229
- });
230
-
231
- it("reflects controlled single value on trigger", () => {
232
- renderWithUi(
233
- <Cascader options={REGION_OPTIONS} value={["jp", "tokyo", "shibuya"]} onChange={vi.fn()} />,
234
- );
235
- expect(screen.getByRole("combobox")).toHaveTextContent("日本 / 東京都 / 渋谷区");
236
- });
237
- });
238
-
239
- describe("TreeSelect", () => {
240
- it("renders tree trigger", () => {
241
- renderWithUi(<TreeSelect treeData={ORG_TREE} />);
242
- expect(screen.getByRole("combobox")).toBeInTheDocument();
243
- expect(screen.getByText("Chọn…")).toBeInTheDocument();
244
- });
245
-
246
- it("selects a leaf in single mode and closes panel", async () => {
247
- const user = userEvent.setup();
248
- const onChange = vi.fn();
249
-
250
- renderWithUi(<TreeSelect treeData={ORG_TREE} treeDefaultExpandAll onChange={onChange} />);
251
- await user.click(screen.getByRole("combobox"));
252
- await user.click(screen.getByRole("button", { name: /kho osaka/i }));
253
-
254
- expect(onChange).toHaveBeenCalledWith("warehouse-osaka");
255
- expect(screen.queryByRole("button", { name: /kho osaka/i })).not.toBeInTheDocument();
256
- });
257
-
258
- it("filters visible nodes when showSearch is enabled", async () => {
259
- const user = userEvent.setup();
260
-
261
- renderWithUi(<TreeSelect treeData={ORG_TREE} showSearch treeDefaultExpandAll />);
262
- await user.click(screen.getByRole("combobox"));
263
- await user.type(screen.getByPlaceholderText(/tìm kiếm/i), "media");
264
-
265
- expect(screen.getByRole("button", { name: /^media$/i })).toBeInTheDocument();
266
- expect(screen.queryByRole("button", { name: /kho osaka/i })).not.toBeInTheDocument();
267
- });
268
-
269
- it("expands and collapses branch nodes", async () => {
270
- const user = userEvent.setup();
271
-
272
- renderWithUi(<TreeSelect treeData={ORG_TREE} />);
273
- await user.click(screen.getByRole("combobox"));
274
-
275
- expect(screen.queryByRole("button", { name: /^logistics$/i })).not.toBeInTheDocument();
276
- await user.click(screen.getAllByRole("button", { name: /mở rộng/i })[0]);
277
- expect(screen.getByRole("button", { name: /^logistics$/i })).toBeInTheDocument();
278
- await user.click(screen.getAllByRole("button", { name: /thu gọn/i })[0]);
279
- expect(screen.queryByRole("button", { name: /^logistics$/i })).not.toBeInTheDocument();
280
- });
281
-
282
- it("selects a node in checkable mode", async () => {
283
- const user = userEvent.setup();
284
- const onChange = vi.fn();
285
-
286
- function Demo() {
287
- const [value, setValue] = React.useState<string[]>([]);
288
- return (
289
- <TreeSelect
290
- treeData={ORG_TREE}
291
- treeCheckable
292
- treeDefaultExpandAll
293
- value={value}
294
- onChange={(v) => {
295
- setValue(Array.isArray(v) ? v : v ? [v] : []);
296
- onChange(v);
297
- }}
298
- />
299
- );
300
- }
301
-
302
- renderWithUi(<Demo />);
303
- await user.click(screen.getByRole("combobox"));
304
- await user.click(screen.getByRole("checkbox", { name: /kho osaka/i }));
305
-
306
- expect(onChange).toHaveBeenCalledWith(expect.arrayContaining(["warehouse-osaka"]));
307
- });
308
-
309
- it("clears selection via clear icon", async () => {
310
- const user = userEvent.setup();
311
- const onChange = vi.fn();
312
-
313
- renderWithUi(
314
- <TreeSelect
315
- treeData={ORG_TREE}
316
- treeDefaultExpandAll
317
- defaultValue="warehouse-osaka"
318
- onChange={onChange}
319
- />,
320
- );
321
-
322
- const combobox = screen.getByRole("combobox");
323
- const clearIcon = combobox.querySelector("svg.lucide-x");
324
- expect(clearIcon).toBeTruthy();
325
- await user.click(clearIcon!);
326
-
327
- expect(onChange).toHaveBeenCalledWith(undefined);
328
- expect(combobox).toHaveTextContent("Chọn…");
329
- });
330
- });
331
-
332
- describe("Transfer", () => {
333
- it("moves items to target", async () => {
334
- const user = userEvent.setup();
335
- const onChange = vi.fn();
336
-
337
- function Demo() {
338
- const [targetKeys, setTargetKeys] = React.useState<string[]>([]);
339
- return (
340
- <Transfer
341
- dataSource={TRANSFER_MOCK}
342
- targetKeys={targetKeys}
343
- onChange={(next, direction, moveKeys) => {
344
- setTargetKeys(next);
345
- onChange(next, direction, moveKeys);
346
- }}
347
- showSearch
348
- />
349
- );
350
- }
351
-
352
- renderWithUi(<Demo />);
353
- await user.click(screen.getByText("NV-001"));
354
- await user.click(screen.getByRole("button", { name: /chuyển sang đích/i }));
355
-
356
- expect(onChange).toHaveBeenCalledWith(["user-1"], "right", ["user-1"]);
357
- });
358
-
359
- it("filters source list via search", async () => {
360
- const user = userEvent.setup();
361
-
362
- renderWithUi(
363
- <Transfer dataSource={TRANSFER_MOCK} targetKeys={[]} onChange={vi.fn()} showSearch />,
364
- );
365
- const searchInputs = screen.getAllByRole("searchbox");
366
- await user.type(searchInputs[0], "NV-012");
367
-
368
- await waitFor(() => {
369
- expect(screen.getByText("NV-012")).toBeInTheDocument();
370
- expect(screen.queryByText("NV-001")).not.toBeInTheDocument();
371
- });
372
- });
373
-
374
- it("moves items back to source", async () => {
375
- const user = userEvent.setup();
376
- const onChange = vi.fn();
377
-
378
- function Demo() {
379
- const [targetKeys, setTargetKeys] = React.useState<string[]>(["user-1"]);
380
- return (
381
- <Transfer
382
- dataSource={TRANSFER_MOCK}
383
- targetKeys={targetKeys}
384
- onChange={(next, direction, moveKeys) => {
385
- setTargetKeys(next);
386
- onChange(next, direction, moveKeys);
387
- }}
388
- />
389
- );
390
- }
391
-
392
- renderWithUi(<Demo />);
393
- await user.click(screen.getByText("NV-001"));
394
- await user.click(screen.getByRole("button", { name: /chuyển về nguồn/i }));
395
-
396
- expect(onChange).toHaveBeenCalledWith([], "left", ["user-1"]);
397
- });
398
-
399
- it("selects all enabled items in a panel", async () => {
400
- const user = userEvent.setup();
401
- const onChange = vi.fn();
402
-
403
- renderWithUi(
404
- <Transfer dataSource={TRANSFER_MOCK} targetKeys={[]} onChange={onChange} showSearch />,
405
- );
406
-
407
- const selectAll = screen.getAllByRole("checkbox", { name: /select all source/i })[0];
408
- await user.click(selectAll);
409
- await user.click(screen.getByRole("button", { name: /chuyển sang đích/i }));
410
-
411
- expect(onChange).toHaveBeenCalledWith(
412
- expect.arrayContaining(TRANSFER_MOCK.map((item) => item.key)),
413
- "right",
414
- expect.any(Array),
415
- );
416
- });
417
- });
@@ -1,40 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { renderWithUi, screen, userEvent } from "@/test/render";
3
- import { Checkbox } from "../checkbox";
4
-
5
- const exportDocs = [
6
- { label: "Commercial invoice", value: "invoice" },
7
- { label: "Packing list", value: "packing" },
8
- { label: "MSDS (pin lithium)", value: "msds" },
9
- ];
10
-
11
- describe("Checkbox.Group", () => {
12
- it("renders group from options with default selection", () => {
13
- renderWithUi(
14
- <Checkbox.Group options={exportDocs} defaultValue={["invoice"]} aria-label="Export docs" />,
15
- );
16
- expect(screen.getByRole("group")).toBeInTheDocument();
17
- expect(screen.getByRole("checkbox", { name: /Commercial invoice/ })).toBeChecked();
18
- expect(screen.getByRole("checkbox", { name: /Packing list/ })).not.toBeChecked();
19
- });
20
-
21
- it("toggles values and calls onChange with array", async () => {
22
- const user = userEvent.setup();
23
- const onChange = vi.fn();
24
- renderWithUi(
25
- <Checkbox.Group options={exportDocs} defaultValue={["invoice"]} onChange={onChange} />,
26
- );
27
-
28
- await user.click(screen.getByRole("checkbox", { name: /Packing list/ }));
29
- expect(onChange).toHaveBeenLastCalledWith(["invoice", "packing"]);
30
-
31
- await user.click(screen.getByRole("checkbox", { name: /Commercial invoice/ }));
32
- expect(onChange).toHaveBeenLastCalledWith(["packing"]);
33
- });
34
- });
35
-
36
- describe("Checkbox namespace", () => {
37
- it("exposes Group on Checkbox.Group", () => {
38
- expect(Checkbox.Group).toBeDefined();
39
- });
40
- });
@@ -1,20 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi, screen } from "@/test/render";
3
- import { Checkbox } from "../checkbox";
4
-
5
- describe("Checkbox", () => {
6
- it("renders checkbox role", () => {
7
- renderWithUi(<Checkbox aria-label="accept" />);
8
- expect(screen.getByRole("checkbox")).toHaveAttribute("data-slot", "checkbox");
9
- });
10
-
11
- it("can be checked", async () => {
12
- const { userEvent } = await import("@/test/render");
13
- const user = userEvent.setup();
14
- renderWithUi(<Checkbox aria-label="accept" />);
15
- const box = screen.getByRole("checkbox");
16
- expect(box).not.toBeChecked();
17
- await user.click(box);
18
- expect(box).toBeChecked();
19
- });
20
- });
@@ -1,94 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { renderWithUi, screen, userEvent, waitFor } from "@/test/render";
3
- import { Calendar } from "../calendar";
4
- import { DatePicker } from "../date-picker";
5
- import { DateRangePicker } from "../date-range-picker";
6
- import { Autocomplete } from "../autocomplete";
7
- import { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from "../command";
8
-
9
- describe("Calendar", () => {
10
- it("renders month grid", () => {
11
- renderWithUi(<Calendar mode="single" />);
12
- expect(screen.getByRole("grid")).toBeInTheDocument();
13
- });
14
- });
15
-
16
- describe("DatePicker", () => {
17
- it("shows placeholder and opens calendar popover", async () => {
18
- const user = userEvent.setup();
19
- renderWithUi(<DatePicker placeholder="Chọn ngày ETD" />);
20
- const trigger = screen.getByRole("button", { name: /chọn ngày etd/i });
21
- expect(trigger).toBeInTheDocument();
22
- await user.click(trigger);
23
- await waitFor(() => {
24
- expect(screen.getByRole("grid")).toBeInTheDocument();
25
- });
26
- });
27
-
28
- it("calls onChange when a day is selected", async () => {
29
- const user = userEvent.setup();
30
- const onChange = vi.fn();
31
- renderWithUi(<DatePicker value={new Date(2026, 4, 1)} onChange={onChange} />);
32
- await user.click(screen.getByRole("button"));
33
- const dayButtons = screen.getAllByRole("gridcell").filter((cell) => cell.textContent === "15");
34
- const dayButton = dayButtons[0]?.querySelector("button");
35
- expect(dayButton).toBeTruthy();
36
- if (dayButton) await user.click(dayButton);
37
- expect(onChange).toHaveBeenCalled();
38
- });
39
- });
40
-
41
- describe("DateRangePicker", () => {
42
- it("renders trigger with formatted range", () => {
43
- renderWithUi(
44
- <DateRangePicker
45
- value={{ from: new Date(2026, 4, 1), to: new Date(2026, 4, 10) }}
46
- onChange={() => undefined}
47
- />,
48
- );
49
- expect(screen.getByRole("button")).toHaveTextContent("01/05/2026");
50
- expect(screen.getByRole("button")).toHaveTextContent("10/05/2026");
51
- });
52
- });
53
-
54
- describe("Autocomplete", () => {
55
- const options = [
56
- { value: "osaka", label: "Osaka Hub" },
57
- { value: "tokyo", label: "Tokyo Hub" },
58
- ];
59
-
60
- it("opens list and selects option", async () => {
61
- const user = userEvent.setup();
62
- const onValueChange = vi.fn();
63
- renderWithUi(
64
- <Autocomplete
65
- options={options}
66
- value="osaka"
67
- onValueChange={onValueChange}
68
- placeholder="Chọn hub"
69
- />,
70
- );
71
- await user.click(screen.getByRole("combobox"));
72
- await user.click(screen.getByRole("option", { name: "Tokyo Hub" }));
73
- expect(onValueChange).toHaveBeenCalledWith("tokyo");
74
- });
75
- });
76
-
77
- describe("Command", () => {
78
- it("filters items by search input", async () => {
79
- const user = userEvent.setup();
80
- renderWithUi(
81
- <Command>
82
- <CommandInput placeholder="Tìm HAWB" />
83
- <CommandList>
84
- <CommandEmpty>Không có kết quả</CommandEmpty>
85
- <CommandItem value="GX-001">GX-001</CommandItem>
86
- <CommandItem value="GX-002">GX-002</CommandItem>
87
- </CommandList>
88
- </Command>,
89
- );
90
- await user.type(screen.getByPlaceholderText("Tìm HAWB"), "002");
91
- expect(screen.getByText("GX-002")).toBeInTheDocument();
92
- expect(screen.queryByText("GX-001")).not.toBeInTheDocument();
93
- });
94
- });
@@ -1,49 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi, screen } from "@/test/render";
3
- import { FormField } from "../form-field";
4
- import { Input } from "../input";
5
-
6
- describe("FormField", () => {
7
- it("links label to input via htmlFor/id", () => {
8
- renderWithUi(
9
- <FormField id="email" label="Email">
10
- <Input id="email" />
11
- </FormField>,
12
- );
13
- expect(screen.getByLabelText("Email")).toHaveAttribute("id", "email");
14
- });
15
-
16
- it("shows required asterisk when required", () => {
17
- renderWithUi(
18
- <FormField id="name" label="Name" required>
19
- <Input id="name" />
20
- </FormField>,
21
- );
22
- expect(screen.getByText("*")).toHaveAttribute("aria-hidden", "true");
23
- expect(screen.getByRole("textbox")).toHaveAttribute("aria-required", "true");
24
- });
25
-
26
- it("shows helper text and wires aria-describedby", () => {
27
- renderWithUi(
28
- <FormField id="x" label="Field" helper="Hint text">
29
- <Input id="x" />
30
- </FormField>,
31
- );
32
- const input = screen.getByRole("textbox");
33
- expect(screen.getByText("Hint text")).toHaveAttribute("id", "x-helper");
34
- expect(input).toHaveAttribute("aria-describedby", "x-helper");
35
- });
36
-
37
- it("shows error instead of helper and sets aria-invalid", () => {
38
- renderWithUi(
39
- <FormField id="x" label="Field" helper="Hint" error="Required">
40
- <Input id="x" />
41
- </FormField>,
42
- );
43
- const input = screen.getByRole("textbox");
44
- expect(screen.getByRole("alert")).toHaveTextContent("Required");
45
- expect(screen.queryByText("Hint")).not.toBeInTheDocument();
46
- expect(input).toHaveAttribute("aria-invalid", "true");
47
- expect(input).toHaveAttribute("aria-describedby", "x-error");
48
- });
49
- });
@@ -1,38 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { renderWithUi, screen, userEvent } from "@/test/render";
3
- import { Input } from "../input";
4
- import { Textarea } from "../textarea";
5
-
6
- describe("Input", () => {
7
- it("accepts typed value", async () => {
8
- const user = userEvent.setup();
9
- const onChange = vi.fn();
10
- renderWithUi(<Input aria-label="test" onChange={onChange} />);
11
- await user.type(screen.getByRole("textbox"), "abc");
12
- expect(onChange).toHaveBeenCalled();
13
- });
14
-
15
- it("applies ui-control class", () => {
16
- renderWithUi(<Input aria-label="test" />);
17
- expect(screen.getByRole("textbox")).toHaveClass("ui-control");
18
- });
19
-
20
- it("exposes shadcn data-slot and invalid state classes", () => {
21
- renderWithUi(<Input aria-label="test" aria-invalid />);
22
- const input = screen.getByRole("textbox");
23
- expect(input).toHaveAttribute("data-slot", "input");
24
- expect(input).toHaveClass("aria-invalid:border-destructive");
25
- });
26
- });
27
-
28
- describe("Textarea", () => {
29
- it("renders multiline control", () => {
30
- renderWithUi(<Textarea aria-label="notes" />);
31
- expect(screen.getByRole("textbox")).toBeInTheDocument();
32
- });
33
-
34
- it("applies ui-control-multiline class", () => {
35
- renderWithUi(<Textarea aria-label="notes" />);
36
- expect(screen.getByRole("textbox")).toHaveClass("ui-control-multiline");
37
- });
38
- });