@godxjp/ui 6.0.0 → 6.0.1

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/dist/types-mvzYGrma.d.ts +37 -0
  182. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  183. package/package.json +233 -67
  184. package/src/app/__tests__/app-provider.test.tsx +0 -232
  185. package/src/app/__tests__/date-format-labels.test.ts +0 -36
  186. package/src/app/__tests__/date-formats.test.ts +0 -44
  187. package/src/app/__tests__/timezones.test.ts +0 -65
  188. package/src/app/app-provider.tsx +0 -227
  189. package/src/app/date-format-labels.ts +0 -21
  190. package/src/app/date-formats.ts +0 -30
  191. package/src/app/index.ts +0 -40
  192. package/src/app/locales.ts +0 -32
  193. package/src/app/request-headers.ts +0 -31
  194. package/src/app/storage.ts +0 -44
  195. package/src/app/time-format-labels.ts +0 -19
  196. package/src/app/time-formats.ts +0 -15
  197. package/src/app/timezones.ts +0 -208
  198. package/src/app/types.ts +0 -39
  199. package/src/app/use-formatting.ts +0 -47
  200. package/src/components/__tests__/accessibility-primitives.test.tsx +0 -65
  201. package/src/components/__tests__/docs-parity.test.ts +0 -41
  202. package/src/components/__tests__/shadcn-release-guardrails.test.ts +0 -71
  203. package/src/components/__tests__/theme-axes-integration.test.tsx +0 -242
  204. package/src/components/admin/index.ts +0 -76
  205. package/src/components/data-display/__tests__/card-table.test.tsx +0 -328
  206. package/src/components/data-display/__tests__/data-display.test.tsx +0 -73
  207. package/src/components/data-display/__tests__/data-table.test.tsx +0 -84
  208. package/src/components/data-display/__tests__/popover.test.tsx +0 -92
  209. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +0 -66
  210. package/src/components/data-display/badge.tsx +0 -27
  211. package/src/components/data-display/card.tsx +0 -194
  212. package/src/components/data-display/code-badge.tsx +0 -28
  213. package/src/components/data-display/collapsible.tsx +0 -5
  214. package/src/components/data-display/data-table.tsx +0 -476
  215. package/src/components/data-display/empty-state.tsx +0 -22
  216. package/src/components/data-display/index.ts +0 -41
  217. package/src/components/data-display/key-value-grid.tsx +0 -46
  218. package/src/components/data-display/popover.tsx +0 -62
  219. package/src/components/data-display/progress-meter.tsx +0 -20
  220. package/src/components/data-display/scan-panel.tsx +0 -16
  221. package/src/components/data-display/scroll-area.tsx +0 -42
  222. package/src/components/data-display/status-badge.tsx +0 -83
  223. package/src/components/data-display/table.tsx +0 -59
  224. package/src/components/data-display/timeline.tsx +0 -42
  225. package/src/components/data-display/tree-list.tsx +0 -42
  226. package/src/components/data-entry/__fixtures__/tree-options.ts +0 -80
  227. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +0 -417
  228. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +0 -40
  229. package/src/components/data-entry/__tests__/checkbox.test.tsx +0 -20
  230. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +0 -94
  231. package/src/components/data-entry/__tests__/form-field.test.tsx +0 -49
  232. package/src/components/data-entry/__tests__/input-textarea.test.tsx +0 -38
  233. package/src/components/data-entry/__tests__/label-select.test.tsx +0 -62
  234. package/src/components/data-entry/__tests__/pickers.test.tsx +0 -74
  235. package/src/components/data-entry/__tests__/radio.test.tsx +0 -46
  236. package/src/components/data-entry/__tests__/search-input.test.tsx +0 -32
  237. package/src/components/data-entry/__tests__/switch-field.test.tsx +0 -52
  238. package/src/components/data-entry/__tests__/upload.test.tsx +0 -125
  239. package/src/components/data-entry/autocomplete.tsx +0 -91
  240. package/src/components/data-entry/cascader.tsx +0 -305
  241. package/src/components/data-entry/checkbox-group.tsx +0 -90
  242. package/src/components/data-entry/checkbox.tsx +0 -30
  243. package/src/components/data-entry/choice-field.tsx +0 -27
  244. package/src/components/data-entry/choice-option.ts +0 -20
  245. package/src/components/data-entry/color-picker.tsx +0 -75
  246. package/src/components/data-entry/command.tsx +0 -56
  247. package/src/components/data-entry/country-select.tsx +0 -88
  248. package/src/components/data-entry/date-picker.tsx +0 -69
  249. package/src/components/data-entry/date-range-picker.tsx +0 -75
  250. package/src/components/data-entry/form-field.tsx +0 -59
  251. package/src/components/data-entry/index.ts +0 -62
  252. package/src/components/data-entry/label.tsx +0 -25
  253. package/src/components/data-entry/radio.tsx +0 -109
  254. package/src/components/data-entry/search-input.tsx +0 -103
  255. package/src/components/data-entry/select.tsx +0 -149
  256. package/src/components/data-entry/slider.tsx +0 -38
  257. package/src/components/data-entry/switch-field.tsx +0 -91
  258. package/src/components/data-entry/switch.tsx +0 -24
  259. package/src/components/data-entry/textarea.tsx +0 -12
  260. package/src/components/data-entry/time-picker.tsx +0 -214
  261. package/src/components/data-entry/transfer.tsx +0 -231
  262. package/src/components/data-entry/tree-select-strategy.ts +0 -6
  263. package/src/components/data-entry/tree-select.tsx +0 -279
  264. package/src/components/data-entry/tree-utils.ts +0 -221
  265. package/src/components/data-entry/upload-crop-dialog.tsx +0 -109
  266. package/src/components/data-entry/upload-types.ts +0 -86
  267. package/src/components/data-entry/upload.tsx +0 -498
  268. package/src/components/data-entry/use-upload-draft.ts +0 -93
  269. package/src/components/feedback/__tests__/alert.test.tsx +0 -127
  270. package/src/components/feedback/__tests__/dialog.test.tsx +0 -290
  271. package/src/components/feedback/__tests__/sheet.test.tsx +0 -94
  272. package/src/components/feedback/__tests__/skeleton.test.tsx +0 -25
  273. package/src/components/feedback/__tests__/toast.test.tsx +0 -52
  274. package/src/components/feedback/alert.tsx +0 -167
  275. package/src/components/feedback/dialog.tsx +0 -325
  276. package/src/components/feedback/index.ts +0 -53
  277. package/src/components/feedback/sheet.tsx +0 -130
  278. package/src/components/feedback/skeleton.tsx +0 -95
  279. package/src/components/feedback/sonner.tsx +0 -54
  280. package/src/components/feedback/toaster.tsx +0 -1
  281. package/src/components/feedback/use-toast.ts +0 -62
  282. package/src/components/general/__tests__/button.test.tsx +0 -71
  283. package/src/components/general/button.tsx +0 -61
  284. package/src/components/general/index.ts +0 -2
  285. package/src/components/layout/__tests__/page-container.test.tsx +0 -69
  286. package/src/components/layout/__tests__/page-inset.test.tsx +0 -14
  287. package/src/components/layout/__tests__/stack-inline.test.tsx +0 -39
  288. package/src/components/layout/app-shell.tsx +0 -42
  289. package/src/components/layout/breadcrumb.tsx +0 -35
  290. package/src/components/layout/index.ts +0 -31
  291. package/src/components/layout/inline.tsx +0 -13
  292. package/src/components/layout/menu.tsx +0 -34
  293. package/src/components/layout/mobile-frame.tsx +0 -57
  294. package/src/components/layout/page-container.tsx +0 -81
  295. package/src/components/layout/page-inset.tsx +0 -16
  296. package/src/components/layout/responsive-grid.tsx +0 -14
  297. package/src/components/layout/shell-app.tsx +0 -30
  298. package/src/components/layout/sidebar.tsx +0 -98
  299. package/src/components/layout/split-pane.tsx +0 -16
  300. package/src/components/layout/stack.tsx +0 -13
  301. package/src/components/layout/topbar.tsx +0 -108
  302. package/src/components/navigation/__tests__/app-pickers.test.tsx +0 -118
  303. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +0 -104
  304. package/src/components/navigation/__tests__/navigation.test.tsx +0 -61
  305. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +0 -76
  306. package/src/components/navigation/date-format-picker.tsx +0 -55
  307. package/src/components/navigation/dropdown-menu.tsx +0 -190
  308. package/src/components/navigation/filter-bar.tsx +0 -38
  309. package/src/components/navigation/index.ts +0 -28
  310. package/src/components/navigation/locale-picker.tsx +0 -49
  311. package/src/components/navigation/page-header.tsx +0 -50
  312. package/src/components/navigation/pagination-utils.ts +0 -35
  313. package/src/components/navigation/pagination.tsx +0 -168
  314. package/src/components/navigation/steps.tsx +0 -163
  315. package/src/components/navigation/tabs-items.tsx +0 -69
  316. package/src/components/navigation/time-format-picker.tsx +0 -55
  317. package/src/components/navigation/timezone-picker.tsx +0 -63
  318. package/src/components/query/__tests__/data-state.test.tsx +0 -214
  319. package/src/components/query/__tests__/infinite-prefetch.test.tsx +0 -105
  320. package/src/components/query/__tests__/query-helpers.test.tsx +0 -61
  321. package/src/components/query/data-state.tsx +0 -58
  322. package/src/components/query/index.ts +0 -10
  323. package/src/components/query/infinite-query-state.tsx +0 -99
  324. package/src/components/query/mutation-feedback.tsx +0 -31
  325. package/src/components/query/prefetch-link.tsx +0 -45
  326. package/src/components/query/query-refetch-button.tsx +0 -41
  327. package/src/components/ui/alert-dialog.tsx +0 -1
  328. package/src/components/ui/alert.tsx +0 -1
  329. package/src/components/ui/autocomplete.tsx +0 -1
  330. package/src/components/ui/badge.tsx +0 -1
  331. package/src/components/ui/button.tsx +0 -1
  332. package/src/components/ui/calendar.tsx +0 -1
  333. package/src/components/ui/card.tsx +0 -1
  334. package/src/components/ui/checkbox.tsx +0 -1
  335. package/src/components/ui/color-picker.tsx +0 -1
  336. package/src/components/ui/command.tsx +0 -1
  337. package/src/components/ui/date-picker.tsx +0 -1
  338. package/src/components/ui/date-range-picker.tsx +0 -1
  339. package/src/components/ui/dialog.tsx +0 -1
  340. package/src/components/ui/dropdown-menu.tsx +0 -1
  341. package/src/components/ui/index.tsx +0 -31
  342. package/src/components/ui/input.tsx +0 -1
  343. package/src/components/ui/label.tsx +0 -1
  344. package/src/components/ui/pagination.tsx +0 -1
  345. package/src/components/ui/popover.tsx +0 -1
  346. package/src/components/ui/radio.tsx +0 -1
  347. package/src/components/ui/scroll-area.tsx +0 -1
  348. package/src/components/ui/select.tsx +0 -1
  349. package/src/components/ui/sheet.tsx +0 -1
  350. package/src/components/ui/slider.tsx +0 -1
  351. package/src/components/ui/sonner.tsx +0 -1
  352. package/src/components/ui/switch.tsx +0 -1
  353. package/src/components/ui/table.tsx +0 -1
  354. package/src/components/ui/tabs-items.tsx +0 -1
  355. package/src/components/ui/tabs.tsx +0 -1
  356. package/src/components/ui/textarea.tsx +0 -1
  357. package/src/components/ui/time-picker.tsx +0 -1
  358. package/src/components/ui/upload.tsx +0 -1
  359. package/src/form/__tests__/use-zod-form.test.tsx +0 -97
  360. package/src/form/form-field-control.tsx +0 -44
  361. package/src/form/form-root.tsx +0 -29
  362. package/src/form/index.ts +0 -7
  363. package/src/form/use-zod-form.ts +0 -29
  364. package/src/i18n/__tests__/translate.test.ts +0 -23
  365. package/src/i18n/index.ts +0 -9
  366. package/src/i18n/messages/en.json +0 -171
  367. package/src/i18n/messages/ja.json +0 -171
  368. package/src/i18n/messages/vi.json +0 -171
  369. package/src/i18n/translate.ts +0 -74
  370. package/src/i18n/use-translation.ts +0 -53
  371. package/src/index.ts +0 -3
  372. package/src/lib/__tests__/control-styles.test.ts +0 -78
  373. package/src/lib/__tests__/datetime.test.ts +0 -77
  374. package/src/lib/__tests__/format-date.test.ts +0 -97
  375. package/src/lib/__tests__/format.test.ts +0 -62
  376. package/src/lib/__tests__/theme-tokens-audit.test.ts +0 -176
  377. package/src/lib/__tests__/theme-tokens-css.test.ts +0 -118
  378. package/src/lib/__tests__/token-governance.test.ts +0 -191
  379. package/src/lib/__tests__/variants.test.ts +0 -18
  380. package/src/lib/control-styles.ts +0 -33
  381. package/src/lib/datetime/detect.ts +0 -25
  382. package/src/lib/datetime/format-date.ts +0 -100
  383. package/src/lib/datetime/format.ts +0 -140
  384. package/src/lib/datetime/index.ts +0 -25
  385. package/src/lib/datetime/parse.ts +0 -51
  386. package/src/lib/datetime/sync.ts +0 -48
  387. package/src/lib/format.ts +0 -114
  388. package/src/lib/hooks.ts +0 -54
  389. package/src/lib/utils.ts +0 -6
  390. package/src/lib/variants.ts +0 -40
  391. package/src/props/components/app.prop.ts +0 -99
  392. package/src/props/components/data-display.prop.ts +0 -73
  393. package/src/props/components/data-entry.prop.ts +0 -334
  394. package/src/props/components/feedback.prop.ts +0 -80
  395. package/src/props/components/form.prop.ts +0 -46
  396. package/src/props/components/general.prop.ts +0 -18
  397. package/src/props/components/index.ts +0 -99
  398. package/src/props/components/layout.prop.ts +0 -130
  399. package/src/props/components/navigation.prop.ts +0 -88
  400. package/src/props/components/query.prop.ts +0 -94
  401. package/src/props/index.ts +0 -17
  402. package/src/props/vocabulary/data.prop.ts +0 -46
  403. package/src/props/vocabulary/index.ts +0 -73
  404. package/src/props/vocabulary/interaction.prop.ts +0 -42
  405. package/src/props/vocabulary/navigation.prop.ts +0 -19
  406. package/src/props/vocabulary/shared.prop.ts +0 -59
  407. package/src/test/__tests__/render-loop-guard.test.tsx +0 -38
  408. package/src/test/jest-dom.d.ts +0 -4
  409. package/src/test/render-loop-guard.tsx +0 -50
  410. package/src/test/render.tsx +0 -29
  411. package/src/test/theme-globals.test.ts +0 -77
  412. package/src/test/theme-globals.ts +0 -134
  413. package/src/test/theme-test-utils.tsx +0 -67
  414. /package/{src → dist}/styles/alert-layout.css +0 -0
  415. /package/{src → dist}/styles/badge-layout.css +0 -0
  416. /package/{src → dist}/styles/card-layout.css +0 -0
  417. /package/{src → dist}/styles/control.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,232 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
2
- import { renderHook, act } from "@testing-library/react";
3
- import * as React from "react";
4
- import { AppProvider, useAppContext } from "../app-provider";
5
- import { getAppRequestHeaders, resetAppRequestHeaders } from "../request-headers";
6
- import { resetI18nLocale } from "../../i18n/translate";
7
- import { readStoredPreferences, writeStoredPreferences } from "../storage";
8
-
9
- const STORAGE_KEY = "godxjp.app.test";
10
-
11
- function wrapper(props: React.PropsWithChildren<{ persist?: boolean }>) {
12
- return (
13
- <AppProvider
14
- storageKey={STORAGE_KEY}
15
- persist={props.persist ?? false}
16
- defaultLocale="vi"
17
- fallbackLocale="en"
18
- defaultTimezone="Asia/Tokyo"
19
- >
20
- {props.children}
21
- </AppProvider>
22
- );
23
- }
24
-
25
- describe("AppProvider", () => {
26
- beforeEach(() => {
27
- resetAppRequestHeaders();
28
- resetI18nLocale();
29
- localStorage.removeItem(STORAGE_KEY);
30
- });
31
-
32
- afterEach(() => {
33
- localStorage.removeItem(STORAGE_KEY);
34
- });
35
-
36
- it("initializes locale and timezone and syncs request headers", () => {
37
- const { result } = renderHook(() => useAppContext(), {
38
- wrapper: ({ children }) => wrapper({ children }),
39
- });
40
-
41
- expect(result.current.locale).toBe("vi");
42
- expect(result.current.timezone).toBe("Asia/Tokyo");
43
- expect(getAppRequestHeaders()).toEqual({
44
- "x-locale": "vi",
45
- "x-timezone": "Asia/Tokyo",
46
- "x-time-format": "24h",
47
- "x-date-format": "dmy",
48
- });
49
- });
50
-
51
- it("updates headers when locale and timezone change", () => {
52
- const { result } = renderHook(() => useAppContext(), {
53
- wrapper: ({ children }) => wrapper({ children }),
54
- });
55
-
56
- act(() => {
57
- result.current.setLocale("ja");
58
- result.current.setTimezone("Asia/Ho_Chi_Minh");
59
- result.current.setTimeFormat("12h");
60
- result.current.setDateFormat("iso");
61
- });
62
-
63
- expect(result.current.requestHeaders).toEqual({
64
- "x-locale": "ja",
65
- "x-timezone": "Asia/Ho_Chi_Minh",
66
- "x-time-format": "12h",
67
- "x-date-format": "iso",
68
- });
69
- expect(getAppRequestHeaders()["x-locale"]).toBe("ja");
70
- });
71
-
72
- it("persists preferences to localStorage", () => {
73
- const { result } = renderHook(() => useAppContext(), {
74
- wrapper: ({ children }) => wrapper({ children, persist: true }),
75
- });
76
-
77
- act(() => {
78
- result.current.setLocale("en");
79
- result.current.setTimezone("UTC");
80
- result.current.setTimeFormat("12h");
81
- result.current.setDateFormat("mdy");
82
- });
83
-
84
- expect(readStoredPreferences(STORAGE_KEY)).toEqual({
85
- locale: "en",
86
- timezone: "UTC",
87
- timeFormat: "12h",
88
- dateFormat: "mdy",
89
- });
90
- });
91
-
92
- it("restores persisted preferences on mount", () => {
93
- writeStoredPreferences(STORAGE_KEY, {
94
- locale: "ja",
95
- timezone: "Asia/Singapore",
96
- timeFormat: "12h",
97
- dateFormat: "iso",
98
- });
99
-
100
- const { result } = renderHook(() => useAppContext(), {
101
- wrapper: ({ children }) => wrapper({ children, persist: true }),
102
- });
103
-
104
- expect(result.current.locale).toBe("ja");
105
- expect(result.current.timezone).toBe("Asia/Singapore");
106
- expect(result.current.timeFormat).toBe("12h");
107
- expect(result.current.dateFormat).toBe("iso");
108
- });
109
-
110
- it("calls onLocaleChange and onTimezoneChange", () => {
111
- const onLocaleChange = vi.fn();
112
- const onTimezoneChange = vi.fn();
113
-
114
- const { result } = renderHook(() => useAppContext(), {
115
- wrapper: ({ children }) => (
116
- <AppProvider
117
- storageKey={STORAGE_KEY}
118
- persist={false}
119
- onLocaleChange={onLocaleChange}
120
- onTimezoneChange={onTimezoneChange}
121
- >
122
- {children}
123
- </AppProvider>
124
- ),
125
- });
126
-
127
- act(() => {
128
- result.current.setLocale("en");
129
- result.current.setTimezone("UTC");
130
- });
131
-
132
- expect(onLocaleChange).toHaveBeenCalledWith("en");
133
- expect(onTimezoneChange).toHaveBeenCalledWith("UTC");
134
- });
135
-
136
- it("derives default time format from locale when defaultTimeFormat is locale", () => {
137
- const { result: enResult } = renderHook(() => useAppContext(), {
138
- wrapper: ({ children }) => (
139
- <AppProvider storageKey={STORAGE_KEY} persist={false} defaultLocale="en">
140
- {children}
141
- </AppProvider>
142
- ),
143
- });
144
- expect(enResult.current.timeFormat).toBe("12h");
145
-
146
- const { result: viResult } = renderHook(() => useAppContext(), {
147
- wrapper: ({ children }) => (
148
- <AppProvider storageKey={STORAGE_KEY} persist={false} defaultLocale="vi">
149
- {children}
150
- </AppProvider>
151
- ),
152
- });
153
- expect(viResult.current.timeFormat).toBe("24h");
154
- });
155
-
156
- it("derives default date format from locale when defaultDateFormat is locale", () => {
157
- const { result: enResult } = renderHook(() => useAppContext(), {
158
- wrapper: ({ children }) => (
159
- <AppProvider storageKey={STORAGE_KEY} persist={false} defaultLocale="en">
160
- {children}
161
- </AppProvider>
162
- ),
163
- });
164
- expect(enResult.current.dateFormat).toBe("mdy");
165
-
166
- const { result: viResult } = renderHook(() => useAppContext(), {
167
- wrapper: ({ children }) => (
168
- <AppProvider storageKey={STORAGE_KEY} persist={false} defaultLocale="vi">
169
- {children}
170
- </AppProvider>
171
- ),
172
- });
173
- expect(viResult.current.dateFormat).toBe("dmy");
174
-
175
- const { result: jaResult } = renderHook(() => useAppContext(), {
176
- wrapper: ({ children }) => (
177
- <AppProvider storageKey={STORAGE_KEY} persist={false} defaultLocale="ja">
178
- {children}
179
- </AppProvider>
180
- ),
181
- });
182
- expect(jaResult.current.dateFormat).toBe("iso");
183
- });
184
-
185
- it("throws outside AppProvider", () => {
186
- expect(() => renderHook(() => useAppContext())).toThrow(/AppProvider/);
187
- });
188
-
189
- it("exposes timezoneOptions on context when configured", () => {
190
- const zones = ["Asia/Tokyo", "Asia/Ho_Chi_Minh"] as const;
191
- const { result } = renderHook(() => useAppContext(), {
192
- wrapper: ({ children }) => (
193
- <AppProvider storageKey={STORAGE_KEY} persist={false} timezoneOptions={zones}>
194
- {children}
195
- </AppProvider>
196
- ),
197
- });
198
- expect(result.current.timezoneOptions).toEqual(zones);
199
- });
200
-
201
- it("timezoneOptions undefined means full IANA list in picker", () => {
202
- const { result } = renderHook(() => useAppContext(), {
203
- wrapper: ({ children }) => (
204
- <AppProvider storageKey={STORAGE_KEY} persist={false}>
205
- {children}
206
- </AppProvider>
207
- ),
208
- });
209
- expect(result.current.timezoneOptions).toBeUndefined();
210
- });
211
-
212
- it("calls onDateFormatChange when date format updates", () => {
213
- const onDateFormatChange = vi.fn();
214
- const { result } = renderHook(() => useAppContext(), {
215
- wrapper: ({ children }) => (
216
- <AppProvider
217
- storageKey={STORAGE_KEY}
218
- persist={false}
219
- onDateFormatChange={onDateFormatChange}
220
- >
221
- {children}
222
- </AppProvider>
223
- ),
224
- });
225
-
226
- act(() => {
227
- result.current.setDateFormat("iso");
228
- });
229
-
230
- expect(onDateFormatChange).toHaveBeenCalledWith("iso");
231
- });
232
- });
@@ -1,36 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- APP_DATE_FORMAT_OPTIONS,
4
- getDateFormatLabel,
5
- resolveDefaultDateFormat,
6
- } from "../date-format-labels";
7
-
8
- describe("date-format-labels", () => {
9
- describe("resolveDefaultDateFormat", () => {
10
- it.each([
11
- ["vi", "dmy"],
12
- ["ja", "iso"],
13
- ["en", "mdy"],
14
- ] as const)("locale %s → %s", (locale, expected) => {
15
- expect(resolveDefaultDateFormat(locale)).toBe(expected);
16
- });
17
- });
18
-
19
- describe("getDateFormatLabel", () => {
20
- it("returns Vietnamese label for dmy", () => {
21
- expect(getDateFormatLabel("dmy", "vi", "en")).toMatch(/Ngày|Tháng|Năm/);
22
- });
23
-
24
- it("returns Japanese ISO label", () => {
25
- expect(getDateFormatLabel("iso", "ja", "en")).toMatch(/YYYY-MM-DD/);
26
- });
27
-
28
- it("returns English label when locale is en", () => {
29
- expect(getDateFormatLabel("mdy", "en", "vi")).toMatch(/Month|Day|Year/i);
30
- });
31
- });
32
-
33
- it("exports option list for pickers", () => {
34
- expect(APP_DATE_FORMAT_OPTIONS.map((o) => o.value)).toEqual(["iso", "dmy", "mdy"]);
35
- });
36
- });
@@ -1,44 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- APP_DATE_FORMATS,
4
- getDatePattern,
5
- getDateTimePattern,
6
- isAppDateFormat,
7
- } from "../date-formats";
8
-
9
- describe("date-formats", () => {
10
- describe("getDatePattern", () => {
11
- it.each([
12
- ["iso", "yyyy-MM-dd"],
13
- ["dmy", "dd/MM/yyyy"],
14
- ["mdy", "MM/dd/yyyy"],
15
- ] as const)("maps %s → %s", (format, pattern) => {
16
- expect(getDatePattern(format)).toBe(pattern);
17
- });
18
- });
19
-
20
- describe("getDateTimePattern", () => {
21
- it("combines date pattern + 24h time", () => {
22
- expect(getDateTimePattern("24h", "iso")).toBe("yyyy-MM-dd HH:mm");
23
- expect(getDateTimePattern("24h", "dmy")).toBe("dd/MM/yyyy HH:mm");
24
- });
25
-
26
- it("combines date pattern + 12h time", () => {
27
- expect(getDateTimePattern("12h", "mdy")).toBe("MM/dd/yyyy h:mm a");
28
- });
29
- });
30
-
31
- describe("isAppDateFormat", () => {
32
- it("accepts known presets", () => {
33
- for (const format of APP_DATE_FORMATS) {
34
- expect(isAppDateFormat(format)).toBe(true);
35
- }
36
- });
37
-
38
- it("rejects unknown values", () => {
39
- expect(isAppDateFormat("ymd")).toBe(false);
40
- expect(isAppDateFormat(null)).toBe(false);
41
- expect(isAppDateFormat("")).toBe(false);
42
- });
43
- });
44
- });
@@ -1,65 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- APP_TIMEZONE_PRESET,
4
- formatTimezoneDisplayLabel,
5
- getAllIanaTimezones,
6
- getTimezoneLabel,
7
- getTimezoneOffsetLabel,
8
- isValidIanaTimezone,
9
- resolveTimezonePickerOptions,
10
- } from "../timezones";
11
-
12
- describe("timezones", () => {
13
- it("exposes full IANA list by default", () => {
14
- const all = getAllIanaTimezones();
15
- expect(all.length).toBeGreaterThan(100);
16
- expect(all).toContain("Asia/Ho_Chi_Minh");
17
- expect(all).toContain("Asia/Tokyo");
18
- expect(all).toContain("Europe/Paris");
19
- });
20
-
21
- it("preset covers cross-border hubs", () => {
22
- expect(APP_TIMEZONE_PRESET).toContain("Asia/Ho_Chi_Minh");
23
- expect(APP_TIMEZONE_PRESET).toContain("Australia/Sydney");
24
- expect(APP_TIMEZONE_PRESET.length).toBeGreaterThanOrEqual(40);
25
- });
26
-
27
- it("resolveTimezonePickerOptions uses full list when unconfigured", () => {
28
- const options = resolveTimezonePickerOptions(undefined, "Asia/Tokyo");
29
- expect(options.length).toBeGreaterThan(100);
30
- expect(options).toContain("Asia/Tokyo");
31
- });
32
-
33
- it("resolveTimezonePickerOptions respects AppProvider config", () => {
34
- const configured = ["Asia/Tokyo", "Asia/Ho_Chi_Minh"] as const;
35
- const options = resolveTimezonePickerOptions(configured, "Asia/Tokyo");
36
- expect(options).toEqual(["Asia/Tokyo", "Asia/Ho_Chi_Minh"]);
37
- });
38
-
39
- it("prepends current timezone when missing from configured list", () => {
40
- const options = resolveTimezonePickerOptions(["Asia/Tokyo"], "Europe/Paris");
41
- expect(options[0]).toBe("Europe/Paris");
42
- expect(options).toContain("Asia/Tokyo");
43
- });
44
-
45
- it("uses i18n label for curated zones", () => {
46
- expect(getTimezoneLabel("Asia/Ho_Chi_Minh", "vi", "en")).toBe("Việt Nam (HCM)");
47
- expect(getTimezoneLabel("Asia/Tokyo", "ja", "en")).toMatch(/日本|Tokyo/);
48
- });
49
-
50
- it("falls back to city + UTC offset for zones without i18n", () => {
51
- const label = getTimezoneLabel("Europe/Paris", "en", "en");
52
- expect(label).toMatch(/Paris/);
53
- expect(label).toMatch(/GMT|UTC|[+-]\d/);
54
- });
55
-
56
- it("formats offset via Intl", () => {
57
- expect(getTimezoneOffsetLabel("Asia/Ho_Chi_Minh", "en")).toMatch(/GMT|UTC|[+-]\d/);
58
- expect(formatTimezoneDisplayLabel("Asia/Ho_Chi_Minh", "en")).toMatch(/Ho Chi Minh/);
59
- });
60
-
61
- it("validates IANA ids against full list", () => {
62
- expect(isValidIanaTimezone("Asia/Jakarta")).toBe(true);
63
- expect(isValidIanaTimezone("Not/A/Zone")).toBe(false);
64
- });
65
- });
@@ -1,227 +0,0 @@
1
- import * as React from "react";
2
- import { resolveDefaultDateFormat } from "./date-format-labels";
3
- import { getDateFnsLocale, getDayPickerLocale } from "./locales";
4
- import { syncAppRequestHeaders } from "./request-headers";
5
- import { syncI18nLocale } from "../i18n/translate";
6
- import { syncDatetimeContext } from "../lib/datetime";
7
- import { DEFAULT_STORAGE_KEY, readStoredPreferences, writeStoredPreferences } from "./storage";
8
- import { resolveDefaultTimeFormat } from "./time-format-labels";
9
- import { resolveDefaultTimezone } from "./timezones";
10
- import {
11
- APP_REQUEST_HEADER_DATE_FORMAT,
12
- APP_REQUEST_HEADER_LOCALE,
13
- APP_REQUEST_HEADER_TIME_FORMAT,
14
- APP_REQUEST_HEADER_TIMEZONE,
15
- type AppDateFormat,
16
- type AppLocale,
17
- type AppRequestHeaders,
18
- type AppTimeFormat,
19
- type AppTimezone,
20
- } from "./types";
21
- import type { AppContextValue, AppProviderProp } from "../props/components/app.prop";
22
-
23
- export type { AppProviderProp, AppContextValue } from "../props/components/app.prop";
24
-
25
- const AppContext = React.createContext<AppContextValue | null>(null);
26
-
27
- function resolveInitialTimeFormat(
28
- stored: AppTimeFormat | undefined,
29
- defaultTimeFormat: AppTimeFormat | "locale",
30
- locale: AppLocale,
31
- ): AppTimeFormat {
32
- if (stored) return stored;
33
- if (defaultTimeFormat === "locale") return resolveDefaultTimeFormat(locale);
34
- return defaultTimeFormat;
35
- }
36
-
37
- function resolveInitialDateFormat(
38
- stored: AppDateFormat | undefined,
39
- defaultDateFormat: AppDateFormat | "locale",
40
- locale: AppLocale,
41
- ): AppDateFormat {
42
- if (stored) return stored;
43
- if (defaultDateFormat === "locale") return resolveDefaultDateFormat(locale);
44
- return defaultDateFormat;
45
- }
46
-
47
- function buildRequestHeaders(
48
- locale: AppLocale,
49
- timezone: AppTimezone,
50
- timeFormat: AppTimeFormat,
51
- dateFormat: AppDateFormat,
52
- ): AppRequestHeaders {
53
- return {
54
- [APP_REQUEST_HEADER_LOCALE]: locale,
55
- [APP_REQUEST_HEADER_TIMEZONE]: timezone,
56
- [APP_REQUEST_HEADER_TIME_FORMAT]: timeFormat,
57
- [APP_REQUEST_HEADER_DATE_FORMAT]: dateFormat,
58
- };
59
- }
60
-
61
- export function AppProvider({
62
- children,
63
- defaultLocale = "vi",
64
- fallbackLocale = "en",
65
- defaultTimezone = "browser",
66
- systemTimezone,
67
- defaultTimeFormat = "locale",
68
- defaultDateFormat = "locale",
69
- timezoneOptions,
70
- storageKey = DEFAULT_STORAGE_KEY,
71
- persist = true,
72
- onLocaleChange,
73
- onTimezoneChange,
74
- onTimeFormatChange,
75
- onDateFormatChange,
76
- }: AppProviderProp) {
77
- const stored = React.useMemo(
78
- () => (persist ? readStoredPreferences(storageKey) : {}),
79
- [persist, storageKey],
80
- );
81
-
82
- const initialLocale = stored.locale ?? defaultLocale;
83
-
84
- const [locale, setLocaleState] = React.useState<AppLocale>(initialLocale);
85
- const [timezone, setTimezoneState] = React.useState<AppTimezone>(
86
- stored.timezone ?? resolveDefaultTimezone(defaultTimezone, systemTimezone),
87
- );
88
- const [timeFormat, setTimeFormatState] = React.useState<AppTimeFormat>(() =>
89
- resolveInitialTimeFormat(stored.timeFormat, defaultTimeFormat, initialLocale),
90
- );
91
- const [dateFormat, setDateFormatState] = React.useState<AppDateFormat>(() =>
92
- resolveInitialDateFormat(stored.dateFormat, defaultDateFormat, initialLocale),
93
- );
94
-
95
- const prefsRef = React.useRef({ locale, timezone, timeFormat, dateFormat });
96
-
97
- React.useEffect(() => {
98
- prefsRef.current = { locale, timezone, timeFormat, dateFormat };
99
- }, [locale, timezone, timeFormat, dateFormat]);
100
-
101
- const setLocale = React.useCallback(
102
- (next: AppLocale) => {
103
- prefsRef.current = { ...prefsRef.current, locale: next };
104
- setLocaleState(next);
105
- onLocaleChange?.(next);
106
- if (persist) writeStoredPreferences(storageKey, prefsRef.current);
107
- },
108
- [onLocaleChange, persist, storageKey],
109
- );
110
-
111
- const setTimezone = React.useCallback(
112
- (next: AppTimezone) => {
113
- prefsRef.current = { ...prefsRef.current, timezone: next };
114
- setTimezoneState(next);
115
- onTimezoneChange?.(next);
116
- if (persist) writeStoredPreferences(storageKey, prefsRef.current);
117
- },
118
- [onTimezoneChange, persist, storageKey],
119
- );
120
-
121
- const setTimeFormat = React.useCallback(
122
- (next: AppTimeFormat) => {
123
- prefsRef.current = { ...prefsRef.current, timeFormat: next };
124
- setTimeFormatState(next);
125
- onTimeFormatChange?.(next);
126
- if (persist) writeStoredPreferences(storageKey, prefsRef.current);
127
- },
128
- [onTimeFormatChange, persist, storageKey],
129
- );
130
-
131
- const setDateFormat = React.useCallback(
132
- (next: AppDateFormat) => {
133
- prefsRef.current = { ...prefsRef.current, dateFormat: next };
134
- setDateFormatState(next);
135
- onDateFormatChange?.(next);
136
- if (persist) writeStoredPreferences(storageKey, prefsRef.current);
137
- },
138
- [onDateFormatChange, persist, storageKey],
139
- );
140
-
141
- const requestHeaders = React.useMemo(
142
- () => buildRequestHeaders(locale, timezone, timeFormat, dateFormat),
143
- [locale, timezone, timeFormat, dateFormat],
144
- );
145
-
146
- React.useEffect(() => {
147
- syncAppRequestHeaders(requestHeaders);
148
- syncI18nLocale(locale, fallbackLocale);
149
- syncDatetimeContext({
150
- locale,
151
- timezone,
152
- timeFormat,
153
- dateFormat,
154
- dateFnsLocale: getDateFnsLocale(locale),
155
- });
156
- }, [requestHeaders, locale, fallbackLocale, timezone, timeFormat, dateFormat]);
157
-
158
- const value = React.useMemo<AppContextValue>(
159
- () => ({
160
- locale,
161
- fallbackLocale,
162
- timezone,
163
- timeFormat,
164
- dateFormat,
165
- dateFnsLocale: getDateFnsLocale(locale),
166
- dayPickerLocale: getDayPickerLocale(locale),
167
- requestHeaders,
168
- timezoneOptions,
169
- setLocale,
170
- setTimezone,
171
- setTimeFormat,
172
- setDateFormat,
173
- }),
174
- [
175
- locale,
176
- fallbackLocale,
177
- timezone,
178
- timeFormat,
179
- dateFormat,
180
- requestHeaders,
181
- timezoneOptions,
182
- setLocale,
183
- setTimezone,
184
- setTimeFormat,
185
- setDateFormat,
186
- ],
187
- );
188
-
189
- return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
190
- }
191
-
192
- export function useAppContext(): AppContextValue {
193
- const ctx = React.useContext(AppContext);
194
- if (!ctx) {
195
- throw new Error("useAppContext must be used within <AppProvider>");
196
- }
197
- return ctx;
198
- }
199
-
200
- /** Returns null outside AppProvider — used by pickers for optional context. */
201
- export function useOptionalAppContext(): AppContextValue | null {
202
- return React.useContext(AppContext);
203
- }
204
-
205
- /** Shorthand for `{ locale, setLocale }`. */
206
- export function useAppLocale() {
207
- const { locale, fallbackLocale, setLocale, dateFnsLocale, dayPickerLocale } = useAppContext();
208
- return { locale, fallbackLocale, setLocale, dateFnsLocale, dayPickerLocale };
209
- }
210
-
211
- /** Shorthand for `{ timezone, setTimezone }`. */
212
- export function useAppTimezone() {
213
- const { timezone, setTimezone } = useAppContext();
214
- return { timezone, setTimezone };
215
- }
216
-
217
- /** Shorthand for `{ timeFormat, setTimeFormat }`. */
218
- export function useAppTimeFormat() {
219
- const { timeFormat, setTimeFormat } = useAppContext();
220
- return { timeFormat, setTimeFormat };
221
- }
222
-
223
- /** Shorthand for `{ dateFormat, setDateFormat }`. */
224
- export function useAppDateFormat() {
225
- const { dateFormat, setDateFormat } = useAppContext();
226
- return { dateFormat, setDateFormat };
227
- }
@@ -1,21 +0,0 @@
1
- import { APP_DATE_FORMATS } from "./date-formats";
2
- import type { AppLocale } from "./types";
3
- import type { AppDateFormat } from "./date-formats";
4
- import { translate } from "../i18n/translate";
5
-
6
- export const APP_DATE_FORMAT_OPTIONS = APP_DATE_FORMATS.map((value) => ({ value }));
7
-
8
- export function getDateFormatLabel(
9
- dateFormat: AppDateFormat,
10
- locale: AppLocale,
11
- fallbackLocale: AppLocale = "en",
12
- ): string {
13
- return translate(locale, fallbackLocale, `dateFormat.${dateFormat}`);
14
- }
15
-
16
- /** Suggested default per locale — vi → dmy, ja → iso, en → mdy. */
17
- export function resolveDefaultDateFormat(locale: AppLocale): AppDateFormat {
18
- if (locale === "en") return "mdy";
19
- if (locale === "ja") return "iso";
20
- return "dmy";
21
- }
@@ -1,30 +0,0 @@
1
- /** Date-only display preset — sent as `x-date-format` to backend. */
2
- import { getTimePattern, type AppTimeFormat } from "./time-formats";
3
-
4
- export type AppDateFormat = "iso" | "dmy" | "mdy";
5
-
6
- export const APP_DATE_FORMATS = ["iso", "dmy", "mdy"] as const satisfies readonly AppDateFormat[];
7
-
8
- export const APP_REQUEST_HEADER_DATE_FORMAT = "x-date-format" as const;
9
-
10
- /** date-fns pattern for date-only display. */
11
- export function getDatePattern(dateFormat: AppDateFormat): string {
12
- switch (dateFormat) {
13
- case "dmy":
14
- return "dd/MM/yyyy";
15
- case "mdy":
16
- return "MM/dd/yyyy";
17
- case "iso":
18
- default:
19
- return "yyyy-MM-dd";
20
- }
21
- }
22
-
23
- /** date-fns pattern for date + time (table cells). */
24
- export function getDateTimePattern(timeFormat: AppTimeFormat, dateFormat: AppDateFormat): string {
25
- return `${getDatePattern(dateFormat)} ${getTimePattern(timeFormat)}`;
26
- }
27
-
28
- export function isAppDateFormat(value: string | null | undefined): value is AppDateFormat {
29
- return value === "iso" || value === "dmy" || value === "mdy";
30
- }
package/src/app/index.ts DELETED
@@ -1,40 +0,0 @@
1
- export * from "./types";
2
- export * from "./locales";
3
- export * from "./timezones";
4
- export * from "./time-formats";
5
- export * from "./date-formats";
6
- export * from "./time-format-labels";
7
- export * from "./date-format-labels";
8
- export * from "./storage";
9
- export * from "./request-headers";
10
- export {
11
- AppProvider,
12
- useAppContext,
13
- useOptionalAppContext,
14
- useAppLocale,
15
- useAppTimezone,
16
- useAppTimeFormat,
17
- useAppDateFormat,
18
- } from "./app-provider";
19
- export { useFormatting, useDateTime } from "./use-formatting";
20
- export {
21
- syncDatetimeContext,
22
- getDatetimeContext,
23
- formatDate,
24
- isFormatDateValue,
25
- detectFormatDateKind,
26
- formatAppDate,
27
- formatAppDateTime,
28
- formatAppTime,
29
- formatAppDateLong,
30
- formatAppRelative,
31
- formatCalendarDate,
32
- formatTimeOfDay,
33
- parseDateInput,
34
- normalizeHhmm,
35
- isValidHhmm,
36
- type FormatDateOptions,
37
- type FormatDateKind,
38
- type FormatDatetimeOptions,
39
- } from "../lib/datetime";
40
- export { useTranslation, usePickerLocales } from "../i18n/use-translation";