@godxjp/ui 19.0.0 → 19.2.0

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 (445) hide show
  1. package/README.md +25 -128
  2. package/dist/app/app-provider.d.ts +1 -1
  3. package/dist/app/app-provider.js +3 -0
  4. package/dist/app/theme-axes.d.ts +4 -15
  5. package/dist/app/timezones.d.ts +1 -4
  6. package/dist/components/charts/area-chart.d.ts +2 -3
  7. package/dist/components/charts/bar-chart.d.ts +2 -3
  8. package/dist/components/charts/chart-frame.d.ts +7 -16
  9. package/dist/components/charts/chart-summary.d.ts +2 -2
  10. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  11. package/dist/components/charts/index.d.ts +1 -6
  12. package/dist/components/data-display/badge.d.ts +2 -12
  13. package/dist/components/data-display/card.d.ts +21 -41
  14. package/dist/components/data-display/carousel.d.ts +1 -2
  15. package/dist/components/data-display/code-block.d.ts +4 -0
  16. package/dist/components/data-display/code-block.js +24 -0
  17. package/dist/components/data-display/data-table.d.ts +15 -37
  18. package/dist/components/data-display/data-table.js +1 -3
  19. package/dist/components/data-display/descriptions.d.ts +2 -6
  20. package/dist/components/data-display/descriptions.js +0 -2
  21. package/dist/components/data-display/index.d.ts +4 -0
  22. package/dist/components/data-display/index.js +4 -0
  23. package/dist/components/data-display/list-row.d.ts +3 -22
  24. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  25. package/dist/components/data-display/progress.d.ts +1 -1
  26. package/dist/components/data-display/prose.d.ts +4 -0
  27. package/dist/components/data-display/prose.js +20 -0
  28. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  29. package/dist/components/data-display/table.d.ts +20 -80
  30. package/dist/components/data-display/table.js +0 -3
  31. package/dist/components/data-display/timeline.d.ts +3 -5
  32. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  33. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  34. package/dist/components/data-entry/calendar.d.ts +3 -2
  35. package/dist/components/data-entry/calendar.js +58 -3
  36. package/dist/components/data-entry/cascader.js +3 -1
  37. package/dist/components/data-entry/checkbox-group.js +12 -5
  38. package/dist/components/data-entry/checkbox.js +30 -21
  39. package/dist/components/data-entry/command-palette.d.ts +8 -22
  40. package/dist/components/data-entry/date-picker.d.ts +4 -5
  41. package/dist/components/data-entry/date-picker.js +12 -3
  42. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  43. package/dist/components/data-entry/date-range-picker.js +17 -6
  44. package/dist/components/data-entry/form-errors.d.ts +7 -18
  45. package/dist/components/data-entry/form-field.d.ts +1 -1
  46. package/dist/components/data-entry/form-field.js +15 -6
  47. package/dist/components/data-entry/form.d.ts +1 -9
  48. package/dist/components/data-entry/input.d.ts +16 -14
  49. package/dist/components/data-entry/input.js +13 -3
  50. package/dist/components/data-entry/month-picker.js +6 -4
  51. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  52. package/dist/components/data-entry/month-range-picker.js +11 -5
  53. package/dist/components/data-entry/number-input.d.ts +1 -5
  54. package/dist/components/data-entry/number-input.js +1 -0
  55. package/dist/components/data-entry/radio.js +19 -6
  56. package/dist/components/data-entry/search-select.d.ts +3 -5
  57. package/dist/components/data-entry/search-select.js +8 -2
  58. package/dist/components/data-entry/select.d.ts +15 -2
  59. package/dist/components/data-entry/select.js +57 -10
  60. package/dist/components/data-entry/switch.js +9 -2
  61. package/dist/components/data-entry/textarea.d.ts +10 -16
  62. package/dist/components/data-entry/textarea.js +8 -1
  63. package/dist/components/data-entry/time-picker.d.ts +3 -5
  64. package/dist/components/data-entry/tree-select.js +3 -1
  65. package/dist/components/data-entry/upload-types.d.ts +1 -5
  66. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  67. package/dist/components/feedback/dialog.d.ts +6 -15
  68. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  69. package/dist/components/feedback/sheet.d.ts +3 -10
  70. package/dist/components/feedback/sheet.js +1 -1
  71. package/dist/components/feedback/sonner.js +2 -3
  72. package/dist/components/general/activity.d.ts +4 -30
  73. package/dist/components/general/button.js +1 -10
  74. package/dist/components/general/logo.d.ts +6 -28
  75. package/dist/components/general/reveal.d.ts +3 -9
  76. package/dist/components/general/typography.d.ts +1 -3
  77. package/dist/components/layout/account-chip.d.ts +8 -0
  78. package/dist/components/layout/account-chip.js +45 -0
  79. package/dist/components/layout/auth-divider.d.ts +2 -9
  80. package/dist/components/layout/auth-shell.d.ts +1 -14
  81. package/dist/components/layout/breadcrumb.d.ts +1 -5
  82. package/dist/components/layout/centered-shell.d.ts +4 -18
  83. package/dist/components/layout/error-surface.d.ts +11 -28
  84. package/dist/components/layout/error-surface.js +4 -1
  85. package/dist/components/layout/index.d.ts +2 -0
  86. package/dist/components/layout/index.js +2 -0
  87. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  88. package/dist/components/layout/master-detail.d.ts +2 -18
  89. package/dist/components/layout/page-container.js +0 -1
  90. package/dist/components/layout/responsive-grid.d.ts +6 -1
  91. package/dist/components/layout/responsive-grid.js +9 -2
  92. package/dist/components/layout/service-role-panel.d.ts +7 -19
  93. package/dist/components/layout/sidebar.d.ts +5 -27
  94. package/dist/components/layout/sidebar.js +0 -1
  95. package/dist/components/layout/split-pane.d.ts +0 -7
  96. package/dist/components/layout/topbar.d.ts +1 -14
  97. package/dist/components/navigation/app-setting-picker.js +1 -3
  98. package/dist/components/navigation/filter-bar.d.ts +1 -6
  99. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  100. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  101. package/dist/components/navigation/tabs.js +4 -8
  102. package/dist/components/query/data-state.d.ts +2 -2
  103. package/dist/components/ui/credential-reveal.d.ts +1 -4
  104. package/dist/components/ui/hover-card.d.ts +1 -2
  105. package/dist/components/ui/separator.d.ts +2 -15
  106. package/dist/components/ui/toggle-group.d.ts +1 -5
  107. package/dist/components/ui/toggle.d.ts +6 -31
  108. package/dist/email/brand-mark.d.ts +6 -34
  109. package/dist/email/color.d.ts +7 -17
  110. package/dist/email/geometry.d.ts +4 -8
  111. package/dist/email/index.d.ts +4 -48
  112. package/dist/email/inline-style.d.ts +3 -9
  113. package/dist/email/urgency.d.ts +2 -7
  114. package/dist/form/form-context.d.ts +2 -5
  115. package/dist/form/form-root.d.ts +1 -2
  116. package/dist/i18n/messages/en.json +4 -0
  117. package/dist/i18n/messages/ja.json +4 -0
  118. package/dist/i18n/messages/vi.json +4 -0
  119. package/dist/inertia/index.d.ts +2 -10
  120. package/dist/lib/control-styles.d.ts +10 -21
  121. package/dist/lib/control-styles.js +4 -6
  122. package/dist/lib/datetime/format-date.d.ts +1 -4
  123. package/dist/lib/field-a11y.d.ts +31 -36
  124. package/dist/lib/field-a11y.js +16 -2
  125. package/dist/lib/format.d.ts +4 -8
  126. package/dist/lib/hooks.d.ts +6 -12
  127. package/dist/lib/permission-grid.d.ts +3 -18
  128. package/dist/lib/query-error.d.ts +3 -3
  129. package/dist/props/components/app.prop.d.ts +19 -27
  130. package/dist/props/components/charts.prop.d.ts +2 -3
  131. package/dist/props/components/data-display.prop.d.ts +48 -72
  132. package/dist/props/components/data-entry.prop.d.ts +41 -30
  133. package/dist/props/components/form.prop.d.ts +2 -6
  134. package/dist/props/components/general.prop.d.ts +11 -27
  135. package/dist/props/components/layout.prop.d.ts +89 -260
  136. package/dist/props/components/navigation.prop.d.ts +27 -42
  137. package/dist/props/registry.d.ts +31 -0
  138. package/dist/props/registry.js +33 -0
  139. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  140. package/dist/props/vocabulary/index.d.ts +1 -1
  141. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  142. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  143. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  144. package/dist/styles/alert-layout.css +1 -32
  145. package/dist/styles/badge-layout.css +4 -18
  146. package/dist/styles/base.css +14 -113
  147. package/dist/styles/card-layout.css +6 -128
  148. package/dist/styles/chart-layout.css +2 -17
  149. package/dist/styles/control.css +380 -458
  150. package/dist/styles/core.css +21 -0
  151. package/dist/styles/data-display-layout.css +175 -94
  152. package/dist/styles/data-entry-layout.css +0 -45
  153. package/dist/styles/density.css +1 -30
  154. package/dist/styles/dialog-layout.css +5 -69
  155. package/dist/styles/focus-ring.css +13 -87
  156. package/dist/styles/fonts.css +1 -31
  157. package/dist/styles/form-layout.css +7 -91
  158. package/dist/styles/index.css +2 -20
  159. package/dist/styles/layout.css +38 -456
  160. package/dist/styles/logo-layout.css +1 -35
  161. package/dist/styles/motion.css +3 -42
  162. package/dist/styles/navigation-layout.css +3 -50
  163. package/dist/styles/shell-layout.css +37 -403
  164. package/dist/styles/table-layout.css +16 -274
  165. package/dist/styles/text-layout.css +7 -21
  166. package/dist/styles/toggle.css +1 -23
  167. package/dist/theme/dxs.canonical.css +1 -55
  168. package/dist/theme/example.service.css +1 -26
  169. package/dist/theme/famgia.service.css +5 -15
  170. package/dist/tokens/axes.css +3 -40
  171. package/dist/tokens/base.css +1 -4
  172. package/dist/tokens/components/activity.css +6 -42
  173. package/dist/tokens/components/badge.css +4 -13
  174. package/dist/tokens/components/banner.css +4 -9
  175. package/dist/tokens/components/card.css +32 -88
  176. package/dist/tokens/components/chart.css +9 -26
  177. package/dist/tokens/components/control.css +37 -222
  178. package/dist/tokens/components/data-display.css +28 -79
  179. package/dist/tokens/components/data-entry.css +5 -19
  180. package/dist/tokens/components/descriptions.css +7 -27
  181. package/dist/tokens/components/email.css +38 -84
  182. package/dist/tokens/components/error-surface.css +2 -18
  183. package/dist/tokens/components/feedback.css +27 -124
  184. package/dist/tokens/components/form.css +13 -45
  185. package/dist/tokens/components/legal-document.css +16 -41
  186. package/dist/tokens/components/list-row.css +11 -36
  187. package/dist/tokens/components/logo.css +2 -57
  188. package/dist/tokens/components/navigation.css +16 -94
  189. package/dist/tokens/components/scroll-area.css +2 -18
  190. package/dist/tokens/components/separator.css +8 -30
  191. package/dist/tokens/components/sheet.css +3 -14
  192. package/dist/tokens/components/shell.css +53 -307
  193. package/dist/tokens/components/sidebar.css +5 -22
  194. package/dist/tokens/components/table.css +19 -140
  195. package/dist/tokens/components/toggle.css +3 -65
  196. package/dist/tokens/components/upload.css +7 -43
  197. package/dist/tokens/foundation.css +108 -383
  198. package/dist/tokens/semantic/layout.css +33 -207
  199. package/docs/CANONICAL-CONTRACTS.md +206 -0
  200. package/docs/COMPONENTS.md +157 -0
  201. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  202. package/docs/CONSUMER-RULES.md +14 -0
  203. package/docs/CUSTOMER-THEMING.md +162 -0
  204. package/docs/DATETIME.md +69 -0
  205. package/docs/DEVELOPMENT.md +173 -0
  206. package/docs/FORMS.md +143 -0
  207. package/docs/FRAME-A11Y-CI.md +267 -0
  208. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  209. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  210. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  211. package/docs/FRAME-COVERAGE.md +29 -0
  212. package/docs/PROPS-REGISTRY.md +61 -0
  213. package/docs/PROPS-VOCABULARY.md +100 -0
  214. package/docs/README.md +60 -0
  215. package/docs/REGISTRY.md +70 -0
  216. package/docs/SPACING.md +56 -0
  217. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  218. package/docs/TESTING.md +98 -0
  219. package/docs/TOKENS.md +347 -0
  220. package/docs/asset-modules.d.ts +46 -0
  221. package/docs/assets/cover-terrain.svg +6 -0
  222. package/docs/assets/portrait-amber.svg +5 -0
  223. package/docs/assets/portrait-clay.svg +5 -0
  224. package/docs/assets/portrait-indigo.svg +5 -0
  225. package/docs/assets/portrait-iris.svg +5 -0
  226. package/docs/assets/portrait-moss.svg +5 -0
  227. package/docs/assets/portrait-plum.svg +5 -0
  228. package/docs/assets/portrait-slate.svg +5 -0
  229. package/docs/charts/compact-bar-trend.tsx +328 -0
  230. package/docs/charts/size-tiers.tsx +192 -0
  231. package/docs/data-display/accordion.tsx +99 -0
  232. package/docs/data-display/avatar.tsx +355 -0
  233. package/docs/data-display/badge.tsx +247 -0
  234. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  235. package/docs/data-display/card/index.md +3 -0
  236. package/docs/data-display/card/index.tsx +285 -0
  237. package/docs/data-display/carousel.tsx +156 -0
  238. package/docs/data-display/charts.tsx +198 -0
  239. package/docs/data-display/code-block.tsx +90 -0
  240. package/docs/data-display/collapsible.tsx +162 -0
  241. package/docs/data-display/credential-reveal.tsx +145 -0
  242. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  243. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  244. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  245. package/docs/data-display/data-table/index.md +5 -0
  246. package/docs/data-display/data-table/index.tsx +295 -0
  247. package/docs/data-display/descriptions.tsx +143 -0
  248. package/docs/data-display/empty-state.tsx +164 -0
  249. package/docs/data-display/hover-card.tsx +181 -0
  250. package/docs/data-display/list-row.tsx +420 -0
  251. package/docs/data-display/permission-matrix.tsx +184 -0
  252. package/docs/data-display/popover-touch.tsx +27 -0
  253. package/docs/data-display/popover.tsx +245 -0
  254. package/docs/data-display/progress.tsx +84 -0
  255. package/docs/data-display/prose.tsx +105 -0
  256. package/docs/data-display/qr-code.tsx +68 -0
  257. package/docs/data-display/scroll-area.tsx +271 -0
  258. package/docs/data-display/service-launcher-card.tsx +145 -0
  259. package/docs/data-display/stat-card.tsx +99 -0
  260. package/docs/data-display/table.tsx +251 -0
  261. package/docs/data-display/timeline.tsx +112 -0
  262. package/docs/data-display/touch-actions.tsx +36 -0
  263. package/docs/data-display/tree-list.tsx +107 -0
  264. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  265. package/docs/data-entry/calendar.tsx +180 -0
  266. package/docs/data-entry/cascader.tsx +378 -0
  267. package/docs/data-entry/checkbox.tsx +256 -0
  268. package/docs/data-entry/color-picker.tsx +117 -0
  269. package/docs/data-entry/command-palette.tsx +179 -0
  270. package/docs/data-entry/command.tsx +262 -0
  271. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  272. package/docs/data-entry/date-picker.tsx +191 -0
  273. package/docs/data-entry/date-range-picker.tsx +149 -0
  274. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  275. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  276. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  277. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  278. package/docs/data-entry/form-field/index.md +8 -0
  279. package/docs/data-entry/form-field/index.tsx +326 -0
  280. package/docs/data-entry/form-inertia.tsx +80 -0
  281. package/docs/data-entry/form-root.tsx +102 -0
  282. package/docs/data-entry/form.tsx +724 -0
  283. package/docs/data-entry/input-otp.tsx +231 -0
  284. package/docs/data-entry/input.tsx +114 -0
  285. package/docs/data-entry/label.tsx +100 -0
  286. package/docs/data-entry/month-picker.tsx +101 -0
  287. package/docs/data-entry/month-range-picker.tsx +115 -0
  288. package/docs/data-entry/number-input.tsx +240 -0
  289. package/docs/data-entry/password-input.tsx +106 -0
  290. package/docs/data-entry/password-strength.tsx +97 -0
  291. package/docs/data-entry/radio-group.tsx +95 -0
  292. package/docs/data-entry/rating.tsx +87 -0
  293. package/docs/data-entry/search-input.tsx +120 -0
  294. package/docs/data-entry/select-async-contracts.tsx +108 -0
  295. package/docs/data-entry/select-matrix.tsx +204 -0
  296. package/docs/data-entry/select.tsx +369 -0
  297. package/docs/data-entry/slider.tsx +130 -0
  298. package/docs/data-entry/switch.tsx +67 -0
  299. package/docs/data-entry/tag-input.tsx +108 -0
  300. package/docs/data-entry/textarea.tsx +209 -0
  301. package/docs/data-entry/time-picker.tsx +99 -0
  302. package/docs/data-entry/toggle-count.tsx +293 -0
  303. package/docs/data-entry/toggle-group.tsx +225 -0
  304. package/docs/data-entry/toggle.tsx +127 -0
  305. package/docs/data-entry/transfer.tsx +97 -0
  306. package/docs/data-entry/tree-select.tsx +204 -0
  307. package/docs/data-entry/upload.tsx +184 -0
  308. package/docs/feedback/alert-dialog.tsx +270 -0
  309. package/docs/feedback/alert.tsx +248 -0
  310. package/docs/feedback/banner.tsx +183 -0
  311. package/docs/feedback/danger-confirm.tsx +88 -0
  312. package/docs/feedback/dialog-touch.tsx +24 -0
  313. package/docs/feedback/dialog.tsx +193 -0
  314. package/docs/feedback/sheet.tsx +410 -0
  315. package/docs/feedback/skeleton.tsx +111 -0
  316. package/docs/feedback/toast.tsx +135 -0
  317. package/docs/feedback/tooltip.tsx +171 -0
  318. package/docs/feedback/two-factor-setup.tsx +68 -0
  319. package/docs/foundation/_email-specimen.ts +274 -0
  320. package/docs/foundation/colors.tsx +202 -0
  321. package/docs/foundation/density.tsx +232 -0
  322. package/docs/foundation/email-tokens.tsx +306 -0
  323. package/docs/foundation/radius-shadow.tsx +152 -0
  324. package/docs/foundation/spacing.tsx +211 -0
  325. package/docs/foundation/typography.tsx +147 -0
  326. package/docs/general/activity.tsx +224 -0
  327. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  328. package/docs/general/button/examples/form-actions.tsx +85 -0
  329. package/docs/general/button/examples/toolbar.tsx +160 -0
  330. package/docs/general/button/index.md +12 -0
  331. package/docs/general/button/index.tsx +211 -0
  332. package/docs/general/logo.tsx +131 -0
  333. package/docs/general/reveal.tsx +41 -0
  334. package/docs/general/typography.tsx +152 -0
  335. package/docs/layout/account-chip.tsx +72 -0
  336. package/docs/layout/admin-collection.tsx +122 -0
  337. package/docs/layout/app-shell.tsx +374 -0
  338. package/docs/layout/aspect-ratio.tsx +119 -0
  339. package/docs/layout/auth-account-summary.tsx +103 -0
  340. package/docs/layout/auth-divider.tsx +28 -0
  341. package/docs/layout/auth-footer.tsx +37 -0
  342. package/docs/layout/auth-identity.tsx +36 -0
  343. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  344. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  345. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  346. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  347. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  348. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  349. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  350. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  351. package/docs/layout/auth-recovery/index.md +140 -0
  352. package/docs/layout/auth-recovery/index.tsx +96 -0
  353. package/docs/layout/auth-shell-context.tsx +103 -0
  354. package/docs/layout/auth-shell-device.tsx +112 -0
  355. package/docs/layout/auth-shell-registration.tsx +335 -0
  356. package/docs/layout/auth-shell-variants.tsx +139 -0
  357. package/docs/layout/auth-shell.tsx +59 -0
  358. package/docs/layout/auth-stack.tsx +40 -0
  359. package/docs/layout/centered-shell.tsx +102 -0
  360. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  361. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  362. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  363. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  364. package/docs/layout/error-surface/index.md +153 -0
  365. package/docs/layout/error-surface/index.tsx +239 -0
  366. package/docs/layout/flex.tsx +262 -0
  367. package/docs/layout/legal-document-shell/_data.ts +110 -0
  368. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  369. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  370. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  371. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  372. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  373. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  374. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  375. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  376. package/docs/layout/legal-document-shell/index.md +51 -0
  377. package/docs/layout/legal-document-shell/index.tsx +101 -0
  378. package/docs/layout/master-detail.tsx +387 -0
  379. package/docs/layout/org-switcher.tsx +131 -0
  380. package/docs/layout/page-container.tsx +946 -0
  381. package/docs/layout/resizable-panel.tsx +419 -0
  382. package/docs/layout/responsive-grid.tsx +235 -0
  383. package/docs/layout/separator.tsx +327 -0
  384. package/docs/layout/service-role-panel.tsx +144 -0
  385. package/docs/layout/sidebar.tsx +586 -0
  386. package/docs/layout/split-pane.tsx +451 -0
  387. package/docs/layout/topbar.tsx +347 -0
  388. package/docs/navigation/app-setting-picker.tsx +141 -0
  389. package/docs/navigation/breadcrumb.tsx +128 -0
  390. package/docs/navigation/context-menu.tsx +117 -0
  391. package/docs/navigation/dropdown-menu.tsx +213 -0
  392. package/docs/navigation/filter-bar.tsx +227 -0
  393. package/docs/navigation/menubar.tsx +141 -0
  394. package/docs/navigation/navigation-menu.tsx +165 -0
  395. package/docs/navigation/pagination.tsx +241 -0
  396. package/docs/navigation/steps.tsx +263 -0
  397. package/docs/navigation/tabs-rtl.tsx +28 -0
  398. package/docs/navigation/tabs.tsx +308 -0
  399. package/docs/navigation/toolbar.tsx +339 -0
  400. package/docs/providers/app-provider.tsx +191 -0
  401. package/docs/providers/format-date.tsx +230 -0
  402. package/docs/query/button-refetch.tsx +160 -0
  403. package/docs/query/data-state.tsx +192 -0
  404. package/docs/query/infinite-query-state.tsx +93 -0
  405. package/docs/query/mutation-feedback.tsx +70 -0
  406. package/docs/query/prefetch-link.tsx +262 -0
  407. package/docs/query/touch-actions.tsx +68 -0
  408. package/docs/showcase/acme-portal.tsx +441 -0
  409. package/docs/showcase/acme-website.tsx +455 -0
  410. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  411. package/docs/showcase/case2-employee-me.tsx +441 -0
  412. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  413. package/docs/showcase/case4-login.tsx +307 -0
  414. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  415. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  416. package/docs/showcase/futurelastic-web.tsx +390 -0
  417. package/docs/showcase/org-switcher.tsx +313 -0
  418. package/docs/showcase/permission-matrix.tsx +343 -0
  419. package/docs/showcase/public-landing.tsx +210 -0
  420. package/docs/showcase/settings-account-sections.tsx +559 -0
  421. package/docs/showcase/settings-security-mfa.tsx +145 -0
  422. package/docs/showcase/table-approval-queue.tsx +199 -0
  423. package/docs/showcase/table-bulk-actions.tsx +460 -0
  424. package/docs/showcase/table-compact-kintone.tsx +438 -0
  425. package/docs/showcase/table-conditional-format.tsx +367 -0
  426. package/docs/showcase/table-crud-list.tsx +544 -0
  427. package/docs/showcase/table-density.tsx +340 -0
  428. package/docs/showcase/table-expandable-rows.tsx +471 -0
  429. package/docs/showcase/table-filter-chips.tsx +461 -0
  430. package/docs/showcase/table-footer-totals.tsx +311 -0
  431. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  432. package/docs/showcase/table-master-detail.tsx +479 -0
  433. package/docs/showcase/table-pagination.tsx +320 -0
  434. package/docs/showcase/table-states.tsx +363 -0
  435. package/docs/showcase/table-sticky-columns.tsx +373 -0
  436. package/docs/showcase/table-tree-rows.tsx +444 -0
  437. package/docs/showcase/table-view-tabs.tsx +488 -0
  438. package/package.json +10 -11
  439. package/scripts/_agent-setup.mjs +16 -2
  440. package/scripts/audit-hook.mjs +3 -13
  441. package/scripts/init-agent-kit.mjs +1 -14
  442. package/scripts/postinstall.mjs +12 -12
  443. package/scripts/ui-audit.mjs +93 -31
  444. package/scripts/visual-audit-rules.mjs +51 -7
  445. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,441 @@
1
+ /**
2
+ * Showcase · ACME customer portal — a TOKEN-ONLY re-theme of @godxjp/ui.
3
+ *
4
+ * Proves the brief: can the ACME design system (gold #DFA930 · navy #0C1A31 ·
5
+ * red #CD3913 · Source Sans 3 · 14px radius · navy-tinted shadows) be produced by
6
+ * CONFIGURING TOKENS ALONE — no component edits, no new components? Every block below
7
+ * is a real @godxjp/ui primitive; the ONLY ACME-specific code is the scoped token
8
+ * block in `THEME` (anchor + semantic tokens under `[data-tenant="acme"]`).
9
+ *
10
+ * page chrome ........ AppShell + Sidebar + Topbar
11
+ * header + CTA ....... PageContainer (extra) + Button (default = gold primary)
12
+ * KPI row ............ ResponsiveGrid + StatCard
13
+ * "Cần xử lý" ........ Card + rows + Badge(tone) + Button
14
+ * journey ............ Card + Progress / Steps
15
+ * orders ............. Card + Table + Badge(tone) (the centerpiece)
16
+ *
17
+ * Token map (ACME → godxjp anchor/semantic, HSL components):
18
+ * gold → --primary/--ring/--warning · navy → --foreground/--secondary · red → --destructive
19
+ * #1F9D55 → --success · #2563C9 → --info · Source Sans 3 → --font-family-sans
20
+ * 14px → --radius (+ exact 4/6/10/14/20/28 steps) · navy → --shadow-color · 16px → --font-size-base
21
+ */
22
+ import * as React from "react";
23
+ import {
24
+ Bell,
25
+ Boxes,
26
+ CheckCircle2,
27
+ CreditCard,
28
+ FileText,
29
+ Headphones,
30
+ LayoutDashboard,
31
+ type LucideIcon,
32
+ Package,
33
+ Plane,
34
+ Plus,
35
+ Search,
36
+ Ship,
37
+ Warehouse,
38
+ Wallet,
39
+ AlertTriangle,
40
+ ReceiptText,
41
+ } from "lucide-react";
42
+
43
+ import { Button, Text } from "@godxjp/ui/general";
44
+ import {
45
+ Avatar,
46
+ AvatarFallback,
47
+ Badge,
48
+ type BadgeProps,
49
+ Card,
50
+ CardContent,
51
+ CardHeader,
52
+ CardTitle,
53
+ Progress,
54
+ StatCard,
55
+ Table,
56
+ TableBody,
57
+ TableCell,
58
+ TableHead,
59
+ TableHeader,
60
+ TableRow,
61
+ } from "@godxjp/ui/data-display";
62
+ import { SearchInput } from "@godxjp/ui/data-entry";
63
+ import {
64
+ AppShell,
65
+ Flex,
66
+ PageContainer,
67
+ ResponsiveGrid,
68
+ Sidebar,
69
+ type SidebarSectionProp,
70
+ } from "@godxjp/ui/layout";
71
+
72
+ type BadgeTone = NonNullable<BadgeProps["tone"]>;
73
+
74
+ // ── The ENTIRE ACME customisation: a SCOPED token block. No component touched. ───────────
75
+ // The whole brand lives under `[data-tenant="acme"]` — true multi-tenant theming. This works
76
+ // because the library declares its colour/radius utilities with `@theme inline`, so `bg-primary`
77
+ // etc. inline `hsl(var(--primary))` and re-resolve a scoped --primary at the element (a plain
78
+ // @theme froze them at :root). Colours, the focus ring (--focus-ring-color/-width), the brand glow
79
+ // (--shadow-glow), gradients (--gradient-hero/-glow), the card lift (--card-shadow) and the modal
80
+ // scrim (--overlay-background) are ALL configured here as tokens — nothing else.
81
+ // Scoped note: radius derives through intermediate tokens (--card-radius/--control-radius/
82
+ // --radius-*) that compute at their declaring element, so a scoped re-theme re-declares them here
83
+ // (a :root single-brand theme needs only --radius). See docs/CUSTOMER-THEMING.md.
84
+ const THEME = `
85
+ @import url('https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,400;0,500;0,600;0,700;0,900&display=swap');
86
+ [data-tenant="acme"] {
87
+ /* Brand / action */
88
+ --primary: 41 73% 53%; /* gold #DFA930 */
89
+ --primary-foreground: 217 61% 12%; /* navy text on gold */
90
+ --ring: 41 73% 53%; /* gold focus ring */
91
+ --accent: 42 81% 96%; /* gold-50 hover tint */
92
+ --accent-foreground: 41 72% 44%; /* gold-700 */
93
+ /* Surfaces / text */
94
+ --background: 0 0% 100%;
95
+ --foreground: 217 61% 12%; /* navy */
96
+ --card: 0 0% 100%;
97
+ --card-foreground: 217 61% 12%;
98
+ --popover: 0 0% 100%;
99
+ --popover-foreground: 217 61% 12%;
100
+ --secondary: 217 61% 12%; /* navy button */
101
+ --secondary-foreground: 0 0% 100%;
102
+ --muted: 216 33% 97%; /* neutral-50 */
103
+ --muted-foreground: 216 16% 40%; /* neutral-600, darkened to clear WCAG AA 4.5:1 on cards */
104
+ --border: 217 24% 89%; /* neutral-200 */
105
+ --input: 216 20% 57%; /* neutral-500 · a CONTROL boundary, not chrome. neutral-300
106
+ was 1.65:1 on the white card and failed WCAG SC 1.4.11.
107
+ 3.38:1 on card, 3.14:1 on --muted. --border stays neutral-200. */
108
+ /* Fixed status signalling (ACME semantic palette) */
109
+ --success: 152 78% 26%; --success-foreground: 0 0% 100%; /* darker green: AA for delta text + white-on-fill */
110
+ --warning: 41 73% 53%; --warning-foreground: 217 61% 12%; /* = brand gold */
111
+ --destructive: 12 83% 44%; --destructive-foreground: 0 0% 100%;
112
+ --info: 217 69% 47%; --info-foreground: 0 0% 100%;
113
+ /* Shape - base radius + exact ACME steps; re-declare the intermediates so the scope re-resolves */
114
+ --radius: 0.875rem; /* 14px card */
115
+ --radius-xs: 4px; --radius-sm: 6px; --radius-md: 10px;
116
+ --radius-lg: 14px; --radius-xl: 20px; --radius-2xl: 28px;
117
+ --card-radius: var(--radius); --control-radius: var(--radius);
118
+ /* Elevation - navy-tinted ramp + a soft navy card lift + a gold CTA glow */
119
+ --shadow-color: 12 26 49;
120
+ --card-shadow: 0 1px 2px rgb(12 26 49 / 0.06), 0 10px 28px -14px rgb(12 26 49 / 0.22);
121
+ --shadow-glow: 0 6px 18px hsl(41 73% 53% / 0.34);
122
+ /* Focus ring → brand gold (also covered by --ring, set explicitly for clarity) */
123
+ --focus-ring-color: 41 73% 53%;
124
+ /* Gradients - a faint gold hero wash (keeps navy text readable) + an ambient corner glow */
125
+ --gradient-hero: linear-gradient(180deg, hsl(42 81% 96%), transparent);
126
+ --gradient-glow: radial-gradient(50% 60% at 92% -8%, hsl(41 73% 53% / 0.10), transparent 70%);
127
+ /* Modal scrim → navy */
128
+ --overlay-background: rgb(12 26 49 / 0.55);
129
+ /* Type */
130
+ --font-size-base: 1rem; /* 16px ACME body */
131
+ --font-family-sans: "Source Sans 3", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
132
+ "Helvetica Neue", Arial, system-ui, sans-serif;
133
+ }
134
+
135
+ /* Dark NAVY sidebar chrome - the ACME signature (gold-on-navy). Done by SCOPING the colour
136
+ * ROLES to the .app-sidebar region: the Sidebar's own CSS reads --card / --foreground /
137
+ * --muted-foreground / --accent / --border, so re-pointing them here turns the whole nav dark with
138
+ * NO component change. The active row uses the new --sidebar-item-active-* knobs for a gold tint. */
139
+ [data-tenant="acme"] .app-sidebar {
140
+ --card: 217 61% 12%; /* navy #0C1A31 surface */
141
+ --foreground: 0 0% 100%; /* white logo + active text base */
142
+ --muted-foreground: 217 40% 74%; /* navy-200 inactive nav text */
143
+ --accent: 217 45% 18%; /* hover row */
144
+ --border: 217 38% 22%; /* subtle navy dividers */
145
+ --sidebar-item-active-background: hsl(41 73% 53% / 0.16); /* gold tint on the selected row */
146
+ --sidebar-item-active-foreground: hsl(41 73% 53%); /* gold active label */
147
+ }
148
+ `;
149
+
150
+ // ── Mock data ─────────────────────────────────────────────────────────────────────────────
151
+ const KPIS: Array<{
152
+ label: string;
153
+ value: string;
154
+ delta: string;
155
+ inverse?: boolean;
156
+ icon: LucideIcon;
157
+ }> = [
158
+ { label: "Đơn đang xử lý", value: "12", delta: "+3 hôm nay", icon: Package },
159
+ { label: "Đang vận chuyển", value: "8", delta: "Nhật → Việt Nam", icon: Ship },
160
+ { label: "Đã giao tháng này", value: "47", delta: "+9 vs tháng trước", icon: CheckCircle2 },
161
+ { label: "Công nợ", value: "¥18,400", delta: "1 hoá đơn quá hạn", inverse: true, icon: Wallet },
162
+ ];
163
+
164
+ const QUEUE: Array<{
165
+ icon: LucideIcon;
166
+ tone: BadgeTone;
167
+ title: string;
168
+ meta: string;
169
+ action: string;
170
+ }> = [
171
+ {
172
+ icon: ReceiptText,
173
+ tone: "warning",
174
+ title: "Báo giá BG-2041 chờ bạn duyệt",
175
+ meta: "ZOZOTOWN · 3 sản phẩm · 24.800¥ · hết hạn sau 6 giờ",
176
+ action: "Xem báo giá",
177
+ },
178
+ {
179
+ icon: AlertTriangle,
180
+ tone: "destructive",
181
+ title: "Hoá đơn INV-2080 quá hạn 4 ngày",
182
+ meta: "9.800¥ · vui lòng thanh toán để tiếp tục gom đơn",
183
+ action: "Thanh toán",
184
+ },
185
+ {
186
+ icon: Plane,
187
+ tone: "info",
188
+ title: "Kiện PKG-000038 sẵn sàng xuất kho",
189
+ meta: "8 sản phẩm · 2,8kg · Saitama → Hà Nội",
190
+ action: "Theo dõi",
191
+ },
192
+ ];
193
+
194
+ const JOURNEY: Array<{ stage: string; pct: number; tone: "success" | "warning" }> = [
195
+ { stage: "Mua hộ tại Nhật", pct: 100, tone: "success" },
196
+ { stage: "Về kho Saitama", pct: 100, tone: "success" },
197
+ { stage: "Vận chuyển quốc tế", pct: 64, tone: "warning" },
198
+ { stage: "Giao tận nơi (VN)", pct: 0, tone: "warning" },
199
+ ];
200
+
201
+ const ORDERS: Array<{
202
+ id: string;
203
+ product: string;
204
+ source: string;
205
+ status: string;
206
+ tone: BadgeTone;
207
+ total: string;
208
+ }> = [
209
+ {
210
+ id: "TXM-100241",
211
+ product: "Áo khoác UNIQLO ×2",
212
+ source: "Nhật",
213
+ status: "Đang giao",
214
+ tone: "info",
215
+ total: "¥12,800",
216
+ },
217
+ {
218
+ id: "TXM-100240",
219
+ product: "Mỹ phẩm Shiseido",
220
+ source: "Nhật",
221
+ status: "Tại kho VN",
222
+ tone: "success",
223
+ total: "¥8,400",
224
+ },
225
+ {
226
+ id: "TXM-100239",
227
+ product: "Giày Nike Air",
228
+ source: "Hàn",
229
+ status: "Chờ thanh toán",
230
+ tone: "warning",
231
+ total: "₩96,000",
232
+ },
233
+ {
234
+ id: "TXM-100238",
235
+ product: "Đồng hồ Casio",
236
+ source: "Nhật",
237
+ status: "Mua hộ",
238
+ tone: "muted",
239
+ total: "¥6,200",
240
+ },
241
+ {
242
+ id: "TXM-100237",
243
+ product: "Sữa Meiji ×6",
244
+ source: "Nhật",
245
+ status: "Đã giao",
246
+ tone: "success",
247
+ total: "¥9,900",
248
+ },
249
+ ];
250
+
251
+ const NAV_SECTIONS: SidebarSectionProp[] = [
252
+ {
253
+ label: "Mua hộ",
254
+ items: [
255
+ { id: "dashboard", label: "Tổng quan", icon: LayoutDashboard },
256
+ { id: "orders", label: "Đơn mua hộ", icon: Boxes, badge: 12 },
257
+ { id: "tracking", label: "Tra cứu vận đơn", icon: Search },
258
+ { id: "warehouse", label: "Kho của tôi", icon: Warehouse, badge: 8 },
259
+ ],
260
+ },
261
+ {
262
+ label: "Tài khoản",
263
+ items: [
264
+ { id: "billing", label: "Thanh toán", icon: CreditCard, badge: 1 },
265
+ { id: "invoices", label: "Hoá đơn", icon: FileText },
266
+ { id: "support", label: "Hỗ trợ", icon: Headphones },
267
+ ],
268
+ },
269
+ ];
270
+
271
+ export default function AcmePortalShowcase() {
272
+ const [activeNav, setActiveNav] = React.useState("dashboard");
273
+
274
+ const sidebar = (
275
+ <Sidebar
276
+ activeId={activeNav}
277
+ onSelect={setActiveNav}
278
+ sections={NAV_SECTIONS}
279
+ product={{ name: "ACME", role: "Cổng khách hàng" }}
280
+ />
281
+ );
282
+
283
+ return (
284
+ <div data-tenant="acme">
285
+ {/* The one and only ACME-specific code: a scoped token block. */}
286
+ <style>{THEME}</style>
287
+ <AppShell
288
+ sidebar={sidebar}
289
+ topbarLeft={<Text as="strong">Cổng khách hàng</Text>}
290
+ topbarRight={
291
+ <Flex direction="row" gap="sm" align="center">
292
+ <SearchInput
293
+ defaultValue=""
294
+ placeholder="Tìm mã đơn, sản phẩm…"
295
+ aria-label="Tìm kiếm"
296
+ className="w-64"
297
+ />
298
+ <Button variant="outline" size="icon" aria-label="Thông báo">
299
+ <Bell aria-hidden="true" />
300
+ </Button>
301
+ <Avatar>
302
+ <AvatarFallback>NA</AvatarFallback>
303
+ </Avatar>
304
+ <Text size="xs" tone="muted" tabular>
305
+ Nguyễn An · VIP
306
+ </Text>
307
+ </Flex>
308
+ }
309
+ >
310
+ <PageContainer
311
+ title="Xin chào, An"
312
+ subtitle="Mua hộ &amp; vận chuyển quốc tế · Nhật / Hàn → Việt Nam"
313
+ extra={
314
+ <Flex direction="row" gap="sm">
315
+ <Button variant="outline" size="sm">
316
+ <Search aria-hidden="true" />
317
+ Tra cứu đơn
318
+ </Button>
319
+ <Button size="sm">
320
+ <Plus aria-hidden="true" />
321
+ Tạo đơn mua hộ
322
+ </Button>
323
+ </Flex>
324
+ }
325
+ >
326
+ <Flex direction="col" gap="lg">
327
+ {/* KPI row */}
328
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
329
+ {KPIS.map((k) => (
330
+ <StatCard
331
+ key={k.label}
332
+ icon={k.icon}
333
+ label={k.label}
334
+ value={k.value}
335
+ delta={k.delta}
336
+ inverse={k.inverse}
337
+ />
338
+ ))}
339
+ </ResponsiveGrid>
340
+
341
+ {/* Queue + Journey */}
342
+ <ResponsiveGrid columns={{ sm: 1, md: 1, lg: 2 }}>
343
+ <Card className="self-start">
344
+ <CardHeader className="flex flex-row items-center justify-between">
345
+ <CardTitle level={2}>Cần bạn xử lý</CardTitle>
346
+ <Text size="xs" tone="muted">
347
+ {QUEUE.length} việc
348
+ </Text>
349
+ </CardHeader>
350
+ <CardContent flush>
351
+ <ul className="divide-border divide-y">
352
+ {QUEUE.map((q) => (
353
+ <li key={q.title} className="flex items-center gap-3 px-4 py-3">
354
+ <Badge tone={q.tone} variant="outline" icon={q.icon} aria-label={q.title} />
355
+ <div className="min-w-0 flex-1">
356
+ <Text as="div" size="sm" weight="medium" truncate>
357
+ {q.title}
358
+ </Text>
359
+ <Text as="div" size="xs" tone="muted" truncate>
360
+ {q.meta}
361
+ </Text>
362
+ </div>
363
+ <Button variant="outline" size="sm">
364
+ {q.action}
365
+ </Button>
366
+ </li>
367
+ ))}
368
+ </ul>
369
+ </CardContent>
370
+ </Card>
371
+
372
+ <Card className="self-start">
373
+ <CardHeader className="flex flex-row items-center justify-between">
374
+ <CardTitle level={2}>Hành trình đơn TXM-100241</CardTitle>
375
+ <Badge tone="info" variant="outline">
376
+ <Plane aria-hidden="true" /> Đang vận chuyển
377
+ </Badge>
378
+ </CardHeader>
379
+ <CardContent>
380
+ <Flex direction="col" gap="md">
381
+ {JOURNEY.map((j) => (
382
+ <Progress
383
+ key={j.stage}
384
+ value={j.pct}
385
+ label={`${j.stage} · ${j.pct}%`}
386
+ tone={j.tone}
387
+ />
388
+ ))}
389
+ </Flex>
390
+ </CardContent>
391
+ </Card>
392
+ </ResponsiveGrid>
393
+
394
+ {/* Orders table — the centerpiece */}
395
+ <Card>
396
+ <CardHeader className="flex flex-row items-center justify-between">
397
+ <CardTitle level={2}>Đơn mua hộ gần đây</CardTitle>
398
+ <Button variant="ghost" size="sm">
399
+ <Wallet aria-hidden="true" />
400
+ Xem tất cả
401
+ </Button>
402
+ </CardHeader>
403
+ <CardContent flush>
404
+ <Table>
405
+ <TableHeader>
406
+ <TableRow>
407
+ <TableHead>Mã đơn</TableHead>
408
+ <TableHead>Sản phẩm</TableHead>
409
+ <TableHead>Nguồn</TableHead>
410
+ <TableHead>Trạng thái</TableHead>
411
+ <TableHead className="text-end">Giá trị</TableHead>
412
+ </TableRow>
413
+ </TableHeader>
414
+ <TableBody>
415
+ {ORDERS.map((o) => (
416
+ <TableRow key={o.id}>
417
+ <TableCell>
418
+ <Text mono size="xs">
419
+ {o.id}
420
+ </Text>
421
+ </TableCell>
422
+ <TableCell>{o.product}</TableCell>
423
+ <TableCell>{o.source}</TableCell>
424
+ <TableCell>
425
+ <Badge tone={o.tone} variant="outline">
426
+ {o.status}
427
+ </Badge>
428
+ </TableCell>
429
+ <TableCell className="text-end tabular-nums">{o.total}</TableCell>
430
+ </TableRow>
431
+ ))}
432
+ </TableBody>
433
+ </Table>
434
+ </CardContent>
435
+ </Card>
436
+ </Flex>
437
+ </PageContainer>
438
+ </AppShell>
439
+ </div>
440
+ );
441
+ }