@godxjp/ui 19.1.0 → 19.3.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 (437) hide show
  1. package/README.md +25 -128
  2. package/dist/app/theme-axes.d.ts +4 -15
  3. package/dist/app/timezones.d.ts +1 -4
  4. package/dist/components/charts/area-chart.d.ts +2 -3
  5. package/dist/components/charts/bar-chart.d.ts +2 -3
  6. package/dist/components/charts/chart-frame.d.ts +7 -16
  7. package/dist/components/charts/chart-summary.d.ts +2 -2
  8. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  9. package/dist/components/charts/index.d.ts +1 -6
  10. package/dist/components/data-display/badge.d.ts +20 -14
  11. package/dist/components/data-display/badge.js +18 -4
  12. package/dist/components/data-display/card.d.ts +21 -41
  13. package/dist/components/data-display/carousel.d.ts +1 -2
  14. package/dist/components/data-display/code-block.d.ts +4 -0
  15. package/dist/components/data-display/code-block.js +24 -0
  16. package/dist/components/data-display/data-table.d.ts +15 -37
  17. package/dist/components/data-display/data-table.js +1 -3
  18. package/dist/components/data-display/descriptions.d.ts +2 -6
  19. package/dist/components/data-display/descriptions.js +0 -2
  20. package/dist/components/data-display/index.d.ts +4 -0
  21. package/dist/components/data-display/index.js +4 -0
  22. package/dist/components/data-display/list-row.d.ts +3 -22
  23. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  24. package/dist/components/data-display/progress.d.ts +1 -1
  25. package/dist/components/data-display/prose.d.ts +4 -0
  26. package/dist/components/data-display/prose.js +20 -0
  27. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  28. package/dist/components/data-display/table.d.ts +20 -80
  29. package/dist/components/data-display/table.js +0 -3
  30. package/dist/components/data-display/timeline.d.ts +3 -5
  31. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  32. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  33. package/dist/components/data-entry/calendar.d.ts +3 -2
  34. package/dist/components/data-entry/calendar.js +58 -3
  35. package/dist/components/data-entry/command-palette.d.ts +8 -22
  36. package/dist/components/data-entry/date-picker.d.ts +4 -5
  37. package/dist/components/data-entry/date-picker.js +6 -1
  38. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  39. package/dist/components/data-entry/date-range-picker.js +8 -3
  40. package/dist/components/data-entry/form-errors.d.ts +7 -18
  41. package/dist/components/data-entry/form-field.js +1 -5
  42. package/dist/components/data-entry/form.d.ts +1 -9
  43. package/dist/components/data-entry/input.d.ts +16 -14
  44. package/dist/components/data-entry/input.js +3 -0
  45. package/dist/components/data-entry/month-picker.js +2 -2
  46. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  47. package/dist/components/data-entry/month-range-picker.js +2 -2
  48. package/dist/components/data-entry/number-input.d.ts +1 -5
  49. package/dist/components/data-entry/number-input.js +1 -0
  50. package/dist/components/data-entry/radio.js +0 -1
  51. package/dist/components/data-entry/search-select.d.ts +2 -4
  52. package/dist/components/data-entry/select.d.ts +11 -6
  53. package/dist/components/data-entry/select.js +4 -2
  54. package/dist/components/data-entry/switch.js +0 -1
  55. package/dist/components/data-entry/textarea.d.ts +10 -16
  56. package/dist/components/data-entry/time-picker.d.ts +3 -5
  57. package/dist/components/data-entry/upload-types.d.ts +1 -5
  58. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  59. package/dist/components/feedback/dialog.d.ts +6 -15
  60. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  61. package/dist/components/feedback/sheet.d.ts +3 -10
  62. package/dist/components/feedback/sheet.js +1 -1
  63. package/dist/components/feedback/sonner.js +2 -3
  64. package/dist/components/general/activity.d.ts +4 -30
  65. package/dist/components/general/button.js +1 -10
  66. package/dist/components/general/logo.d.ts +6 -28
  67. package/dist/components/general/reveal.d.ts +3 -9
  68. package/dist/components/general/typography.d.ts +1 -3
  69. package/dist/components/layout/account-chip.d.ts +8 -0
  70. package/dist/components/layout/account-chip.js +45 -0
  71. package/dist/components/layout/auth-divider.d.ts +2 -9
  72. package/dist/components/layout/auth-shell.d.ts +1 -14
  73. package/dist/components/layout/breadcrumb.d.ts +1 -5
  74. package/dist/components/layout/centered-shell.d.ts +4 -18
  75. package/dist/components/layout/error-surface.d.ts +11 -28
  76. package/dist/components/layout/error-surface.js +4 -1
  77. package/dist/components/layout/index.d.ts +2 -0
  78. package/dist/components/layout/index.js +2 -0
  79. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  80. package/dist/components/layout/master-detail.d.ts +2 -18
  81. package/dist/components/layout/page-container.js +0 -1
  82. package/dist/components/layout/responsive-grid.d.ts +6 -1
  83. package/dist/components/layout/responsive-grid.js +9 -2
  84. package/dist/components/layout/service-role-panel.d.ts +7 -19
  85. package/dist/components/layout/sidebar.d.ts +5 -27
  86. package/dist/components/layout/sidebar.js +0 -1
  87. package/dist/components/layout/split-pane.d.ts +0 -7
  88. package/dist/components/layout/topbar.d.ts +1 -14
  89. package/dist/components/navigation/app-setting-picker.js +1 -3
  90. package/dist/components/navigation/filter-bar.d.ts +1 -6
  91. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  92. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  93. package/dist/components/navigation/tabs.js +4 -8
  94. package/dist/components/query/data-state.d.ts +2 -2
  95. package/dist/components/ui/credential-reveal.d.ts +1 -4
  96. package/dist/components/ui/hover-card.d.ts +1 -2
  97. package/dist/components/ui/separator.d.ts +2 -15
  98. package/dist/components/ui/toggle-group.d.ts +1 -5
  99. package/dist/components/ui/toggle.d.ts +6 -31
  100. package/dist/email/brand-mark.d.ts +6 -34
  101. package/dist/email/color.d.ts +7 -17
  102. package/dist/email/geometry.d.ts +4 -8
  103. package/dist/email/index.d.ts +4 -48
  104. package/dist/email/inline-style.d.ts +3 -9
  105. package/dist/email/urgency.d.ts +2 -7
  106. package/dist/form/form-context.d.ts +2 -5
  107. package/dist/form/form-root.d.ts +1 -2
  108. package/dist/i18n/messages/en.json +4 -0
  109. package/dist/i18n/messages/ja.json +4 -0
  110. package/dist/i18n/messages/vi.json +4 -0
  111. package/dist/inertia/index.d.ts +2 -10
  112. package/dist/lib/control-styles.d.ts +10 -21
  113. package/dist/lib/control-styles.js +4 -6
  114. package/dist/lib/datetime/format-date.d.ts +1 -4
  115. package/dist/lib/field-a11y.d.ts +11 -68
  116. package/dist/lib/field-a11y.js +0 -1
  117. package/dist/lib/format.d.ts +4 -8
  118. package/dist/lib/hooks.d.ts +6 -12
  119. package/dist/lib/permission-grid.d.ts +3 -18
  120. package/dist/lib/query-error.d.ts +3 -3
  121. package/dist/props/components/app.prop.d.ts +15 -38
  122. package/dist/props/components/charts.prop.d.ts +2 -3
  123. package/dist/props/components/data-display.prop.d.ts +55 -72
  124. package/dist/props/components/data-entry.prop.d.ts +35 -40
  125. package/dist/props/components/form.prop.d.ts +2 -6
  126. package/dist/props/components/general.prop.d.ts +11 -27
  127. package/dist/props/components/layout.prop.d.ts +89 -260
  128. package/dist/props/components/navigation.prop.d.ts +27 -42
  129. package/dist/props/registry.d.ts +36 -1
  130. package/dist/props/registry.js +45 -1
  131. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  132. package/dist/props/vocabulary/index.d.ts +1 -1
  133. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  134. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  135. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  136. package/dist/styles/alert-layout.css +1 -32
  137. package/dist/styles/badge-layout.css +19 -18
  138. package/dist/styles/base.css +14 -113
  139. package/dist/styles/card-layout.css +6 -128
  140. package/dist/styles/chart-layout.css +2 -17
  141. package/dist/styles/control.css +380 -458
  142. package/dist/styles/core.css +21 -0
  143. package/dist/styles/data-display-layout.css +175 -94
  144. package/dist/styles/data-entry-layout.css +0 -45
  145. package/dist/styles/density.css +1 -30
  146. package/dist/styles/dialog-layout.css +5 -69
  147. package/dist/styles/focus-ring.css +13 -87
  148. package/dist/styles/fonts.css +1 -31
  149. package/dist/styles/form-layout.css +7 -91
  150. package/dist/styles/index.css +2 -20
  151. package/dist/styles/layout.css +38 -456
  152. package/dist/styles/logo-layout.css +1 -35
  153. package/dist/styles/motion.css +3 -42
  154. package/dist/styles/navigation-layout.css +3 -50
  155. package/dist/styles/shell-layout.css +37 -403
  156. package/dist/styles/table-layout.css +16 -274
  157. package/dist/styles/text-layout.css +7 -21
  158. package/dist/styles/toggle.css +1 -23
  159. package/dist/theme/dxs.canonical.css +1 -55
  160. package/dist/theme/example.service.css +1 -26
  161. package/dist/theme/famgia.service.css +5 -15
  162. package/dist/tokens/axes.css +3 -40
  163. package/dist/tokens/base.css +1 -4
  164. package/dist/tokens/components/activity.css +6 -42
  165. package/dist/tokens/components/badge.css +12 -13
  166. package/dist/tokens/components/banner.css +4 -9
  167. package/dist/tokens/components/card.css +32 -88
  168. package/dist/tokens/components/chart.css +9 -26
  169. package/dist/tokens/components/control.css +37 -222
  170. package/dist/tokens/components/data-display.css +28 -79
  171. package/dist/tokens/components/data-entry.css +5 -19
  172. package/dist/tokens/components/descriptions.css +7 -27
  173. package/dist/tokens/components/email.css +38 -84
  174. package/dist/tokens/components/error-surface.css +2 -18
  175. package/dist/tokens/components/feedback.css +27 -124
  176. package/dist/tokens/components/form.css +13 -45
  177. package/dist/tokens/components/legal-document.css +16 -41
  178. package/dist/tokens/components/list-row.css +11 -36
  179. package/dist/tokens/components/logo.css +2 -57
  180. package/dist/tokens/components/navigation.css +16 -94
  181. package/dist/tokens/components/scroll-area.css +2 -18
  182. package/dist/tokens/components/separator.css +8 -30
  183. package/dist/tokens/components/sheet.css +3 -14
  184. package/dist/tokens/components/shell.css +53 -307
  185. package/dist/tokens/components/sidebar.css +5 -22
  186. package/dist/tokens/components/table.css +19 -140
  187. package/dist/tokens/components/toggle.css +3 -65
  188. package/dist/tokens/components/upload.css +7 -43
  189. package/dist/tokens/foundation.css +108 -383
  190. package/dist/tokens/semantic/layout.css +33 -207
  191. package/docs/CANONICAL-CONTRACTS.md +206 -0
  192. package/docs/COMPONENTS.md +157 -0
  193. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  194. package/docs/CONSUMER-RULES.md +14 -0
  195. package/docs/CUSTOMER-THEMING.md +162 -0
  196. package/docs/DATETIME.md +69 -0
  197. package/docs/DEVELOPMENT.md +173 -0
  198. package/docs/FORMS.md +143 -0
  199. package/docs/FRAME-A11Y-CI.md +267 -0
  200. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  201. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  202. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  203. package/docs/FRAME-COVERAGE.md +29 -0
  204. package/docs/PROPS-REGISTRY.md +61 -0
  205. package/docs/PROPS-VOCABULARY.md +100 -0
  206. package/docs/README.md +60 -0
  207. package/docs/REGISTRY.md +70 -0
  208. package/docs/SPACING.md +56 -0
  209. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  210. package/docs/TESTING.md +98 -0
  211. package/docs/TOKENS.md +347 -0
  212. package/docs/asset-modules.d.ts +46 -0
  213. package/docs/assets/cover-terrain.svg +6 -0
  214. package/docs/assets/portrait-amber.svg +5 -0
  215. package/docs/assets/portrait-clay.svg +5 -0
  216. package/docs/assets/portrait-indigo.svg +5 -0
  217. package/docs/assets/portrait-iris.svg +5 -0
  218. package/docs/assets/portrait-moss.svg +5 -0
  219. package/docs/assets/portrait-plum.svg +5 -0
  220. package/docs/assets/portrait-slate.svg +5 -0
  221. package/docs/charts/compact-bar-trend.tsx +328 -0
  222. package/docs/charts/size-tiers.tsx +192 -0
  223. package/docs/data-display/accordion.tsx +99 -0
  224. package/docs/data-display/avatar.tsx +355 -0
  225. package/docs/data-display/badge.tsx +283 -0
  226. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  227. package/docs/data-display/card/index.md +3 -0
  228. package/docs/data-display/card/index.tsx +285 -0
  229. package/docs/data-display/carousel.tsx +160 -0
  230. package/docs/data-display/charts.tsx +198 -0
  231. package/docs/data-display/code-block.tsx +90 -0
  232. package/docs/data-display/collapsible.tsx +162 -0
  233. package/docs/data-display/credential-reveal.tsx +145 -0
  234. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  235. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  236. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  237. package/docs/data-display/data-table/index.md +5 -0
  238. package/docs/data-display/data-table/index.tsx +295 -0
  239. package/docs/data-display/descriptions.tsx +143 -0
  240. package/docs/data-display/empty-state.tsx +164 -0
  241. package/docs/data-display/hover-card.tsx +181 -0
  242. package/docs/data-display/list-row.tsx +420 -0
  243. package/docs/data-display/permission-matrix.tsx +188 -0
  244. package/docs/data-display/popover-touch.tsx +27 -0
  245. package/docs/data-display/popover.tsx +246 -0
  246. package/docs/data-display/progress.tsx +84 -0
  247. package/docs/data-display/prose.tsx +105 -0
  248. package/docs/data-display/qr-code.tsx +68 -0
  249. package/docs/data-display/scroll-area.tsx +303 -0
  250. package/docs/data-display/service-launcher-card.tsx +145 -0
  251. package/docs/data-display/stat-card.tsx +99 -0
  252. package/docs/data-display/table.tsx +251 -0
  253. package/docs/data-display/timeline.tsx +112 -0
  254. package/docs/data-display/touch-actions.tsx +36 -0
  255. package/docs/data-display/tree-list.tsx +107 -0
  256. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  257. package/docs/data-entry/calendar.tsx +180 -0
  258. package/docs/data-entry/cascader.tsx +378 -0
  259. package/docs/data-entry/checkbox.tsx +256 -0
  260. package/docs/data-entry/color-picker.tsx +117 -0
  261. package/docs/data-entry/command-palette.tsx +179 -0
  262. package/docs/data-entry/command.tsx +262 -0
  263. package/docs/data-entry/country-picker-recipe.tsx +175 -0
  264. package/docs/data-entry/date-picker.tsx +191 -0
  265. package/docs/data-entry/date-range-picker.tsx +149 -0
  266. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  267. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  268. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  269. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  270. package/docs/data-entry/form-field/index.md +8 -0
  271. package/docs/data-entry/form-field/index.tsx +330 -0
  272. package/docs/data-entry/form-inertia.tsx +80 -0
  273. package/docs/data-entry/form-root.tsx +102 -0
  274. package/docs/data-entry/form.tsx +724 -0
  275. package/docs/data-entry/input-otp.tsx +231 -0
  276. package/docs/data-entry/input.tsx +114 -0
  277. package/docs/data-entry/label.tsx +100 -0
  278. package/docs/data-entry/month-picker.tsx +101 -0
  279. package/docs/data-entry/month-range-picker.tsx +115 -0
  280. package/docs/data-entry/number-input.tsx +240 -0
  281. package/docs/data-entry/password-input.tsx +102 -0
  282. package/docs/data-entry/password-strength.tsx +97 -0
  283. package/docs/data-entry/radio-group.tsx +95 -0
  284. package/docs/data-entry/rating.tsx +87 -0
  285. package/docs/data-entry/search-input.tsx +120 -0
  286. package/docs/data-entry/select-async-contracts.tsx +108 -0
  287. package/docs/data-entry/select-matrix.tsx +204 -0
  288. package/docs/data-entry/select.tsx +369 -0
  289. package/docs/data-entry/slider.tsx +130 -0
  290. package/docs/data-entry/switch.tsx +67 -0
  291. package/docs/data-entry/tag-input.tsx +108 -0
  292. package/docs/data-entry/textarea.tsx +209 -0
  293. package/docs/data-entry/time-picker.tsx +99 -0
  294. package/docs/data-entry/toggle-count.tsx +293 -0
  295. package/docs/data-entry/toggle-group.tsx +225 -0
  296. package/docs/data-entry/toggle.tsx +127 -0
  297. package/docs/data-entry/transfer.tsx +97 -0
  298. package/docs/data-entry/tree-select.tsx +204 -0
  299. package/docs/data-entry/upload.tsx +184 -0
  300. package/docs/feedback/alert-dialog.tsx +270 -0
  301. package/docs/feedback/alert.tsx +248 -0
  302. package/docs/feedback/banner.tsx +183 -0
  303. package/docs/feedback/danger-confirm.tsx +88 -0
  304. package/docs/feedback/dialog-touch.tsx +24 -0
  305. package/docs/feedback/dialog.tsx +193 -0
  306. package/docs/feedback/sheet.tsx +420 -0
  307. package/docs/feedback/skeleton.tsx +111 -0
  308. package/docs/feedback/toast.tsx +135 -0
  309. package/docs/feedback/tooltip.tsx +171 -0
  310. package/docs/feedback/two-factor-setup.tsx +68 -0
  311. package/docs/foundation/_email-specimen.ts +274 -0
  312. package/docs/foundation/colors.tsx +204 -0
  313. package/docs/foundation/density.tsx +232 -0
  314. package/docs/foundation/email-tokens.tsx +323 -0
  315. package/docs/foundation/radius-shadow.tsx +154 -0
  316. package/docs/foundation/spacing.tsx +211 -0
  317. package/docs/foundation/typography.tsx +147 -0
  318. package/docs/general/activity.tsx +224 -0
  319. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  320. package/docs/general/button/examples/form-actions.tsx +85 -0
  321. package/docs/general/button/examples/toolbar.tsx +160 -0
  322. package/docs/general/button/index.md +12 -0
  323. package/docs/general/button/index.tsx +211 -0
  324. package/docs/general/logo.tsx +131 -0
  325. package/docs/general/reveal.tsx +41 -0
  326. package/docs/general/typography.tsx +152 -0
  327. package/docs/layout/account-chip.tsx +72 -0
  328. package/docs/layout/admin-collection.tsx +122 -0
  329. package/docs/layout/app-shell.tsx +374 -0
  330. package/docs/layout/aspect-ratio.tsx +135 -0
  331. package/docs/layout/auth-account-summary.tsx +103 -0
  332. package/docs/layout/auth-divider.tsx +28 -0
  333. package/docs/layout/auth-footer.tsx +37 -0
  334. package/docs/layout/auth-identity.tsx +36 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  336. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  338. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  340. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  342. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  343. package/docs/layout/auth-recovery/index.md +140 -0
  344. package/docs/layout/auth-recovery/index.tsx +96 -0
  345. package/docs/layout/auth-shell-context.tsx +103 -0
  346. package/docs/layout/auth-shell-device.tsx +112 -0
  347. package/docs/layout/auth-shell-registration.tsx +335 -0
  348. package/docs/layout/auth-shell-variants.tsx +139 -0
  349. package/docs/layout/auth-shell.tsx +59 -0
  350. package/docs/layout/auth-stack.tsx +40 -0
  351. package/docs/layout/centered-shell.tsx +102 -0
  352. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  353. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  354. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  355. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  356. package/docs/layout/error-surface/index.md +153 -0
  357. package/docs/layout/error-surface/index.tsx +239 -0
  358. package/docs/layout/flex.tsx +266 -0
  359. package/docs/layout/legal-document-shell/_data.ts +110 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  361. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  363. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  365. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  367. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  368. package/docs/layout/legal-document-shell/index.md +51 -0
  369. package/docs/layout/legal-document-shell/index.tsx +101 -0
  370. package/docs/layout/master-detail.tsx +387 -0
  371. package/docs/layout/org-switcher.tsx +131 -0
  372. package/docs/layout/page-container.tsx +954 -0
  373. package/docs/layout/resizable-panel.tsx +419 -0
  374. package/docs/layout/responsive-grid.tsx +243 -0
  375. package/docs/layout/separator.tsx +327 -0
  376. package/docs/layout/service-role-panel.tsx +144 -0
  377. package/docs/layout/sidebar.tsx +609 -0
  378. package/docs/layout/split-pane.tsx +468 -0
  379. package/docs/layout/topbar.tsx +349 -0
  380. package/docs/navigation/app-setting-picker.tsx +142 -0
  381. package/docs/navigation/breadcrumb.tsx +135 -0
  382. package/docs/navigation/context-menu.tsx +123 -0
  383. package/docs/navigation/dropdown-menu.tsx +213 -0
  384. package/docs/navigation/filter-bar.tsx +227 -0
  385. package/docs/navigation/menubar.tsx +141 -0
  386. package/docs/navigation/navigation-menu.tsx +158 -0
  387. package/docs/navigation/pagination.tsx +241 -0
  388. package/docs/navigation/steps.tsx +265 -0
  389. package/docs/navigation/tabs-rtl.tsx +28 -0
  390. package/docs/navigation/tabs.tsx +314 -0
  391. package/docs/navigation/toolbar.tsx +339 -0
  392. package/docs/providers/app-provider.tsx +191 -0
  393. package/docs/providers/format-date.tsx +230 -0
  394. package/docs/query/button-refetch.tsx +160 -0
  395. package/docs/query/data-state.tsx +192 -0
  396. package/docs/query/infinite-query-state.tsx +93 -0
  397. package/docs/query/mutation-feedback.tsx +70 -0
  398. package/docs/query/prefetch-link.tsx +262 -0
  399. package/docs/query/touch-actions.tsx +68 -0
  400. package/docs/showcase/acme-portal.tsx +455 -0
  401. package/docs/showcase/acme-website.tsx +461 -0
  402. package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
  403. package/docs/showcase/case2-employee-me.tsx +444 -0
  404. package/docs/showcase/case3-approval-workflow.tsx +529 -0
  405. package/docs/showcase/case4-login.tsx +313 -0
  406. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  407. package/docs/showcase/case6-agency-handy.tsx +1113 -0
  408. package/docs/showcase/futurelastic-web.tsx +392 -0
  409. package/docs/showcase/org-switcher.tsx +313 -0
  410. package/docs/showcase/permission-matrix.tsx +346 -0
  411. package/docs/showcase/public-landing.tsx +210 -0
  412. package/docs/showcase/settings-account-sections.tsx +559 -0
  413. package/docs/showcase/settings-security-mfa.tsx +145 -0
  414. package/docs/showcase/table-approval-queue.tsx +199 -0
  415. package/docs/showcase/table-bulk-actions.tsx +460 -0
  416. package/docs/showcase/table-compact-kintone.tsx +438 -0
  417. package/docs/showcase/table-conditional-format.tsx +367 -0
  418. package/docs/showcase/table-crud-list.tsx +544 -0
  419. package/docs/showcase/table-density.tsx +347 -0
  420. package/docs/showcase/table-expandable-rows.tsx +480 -0
  421. package/docs/showcase/table-filter-chips.tsx +456 -0
  422. package/docs/showcase/table-footer-totals.tsx +314 -0
  423. package/docs/showcase/table-grouped-subtotals.tsx +391 -0
  424. package/docs/showcase/table-master-detail.tsx +484 -0
  425. package/docs/showcase/table-pagination.tsx +327 -0
  426. package/docs/showcase/table-states.tsx +366 -0
  427. package/docs/showcase/table-sticky-columns.tsx +376 -0
  428. package/docs/showcase/table-tree-rows.tsx +444 -0
  429. package/docs/showcase/table-view-tabs.tsx +488 -0
  430. package/package.json +9 -12
  431. package/scripts/_agent-setup.mjs +16 -2
  432. package/scripts/audit-hook.mjs +3 -13
  433. package/scripts/init-agent-kit.mjs +1 -14
  434. package/scripts/postinstall.mjs +12 -12
  435. package/scripts/ui-audit.mjs +93 -31
  436. package/scripts/visual-audit-rules.mjs +51 -7
  437. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,387 @@
1
+ import { useState } from "react";
2
+
3
+ import {
4
+ Cascader,
5
+ DatePicker,
6
+ DateRangePicker,
7
+ Field,
8
+ Form,
9
+ FormField,
10
+ Input,
11
+ Select,
12
+ Slider,
13
+ Switch,
14
+ TagInput,
15
+ Textarea,
16
+ } from "@godxjp/ui/data-entry";
17
+ import type { DateRange } from "react-day-picker";
18
+ import {
19
+ Card,
20
+ CardContent,
21
+ CardDescription,
22
+ CardHeader,
23
+ CardTitle,
24
+ Avatar,
25
+ AvatarFallback,
26
+ } from "@godxjp/ui/data-display";
27
+ import { Alert, AlertDescription, AlertTitle } from "@godxjp/ui/feedback";
28
+ import { Button } from "@godxjp/ui/general";
29
+ import {
30
+ AppShell,
31
+ Flex,
32
+ PageContainer,
33
+ ResponsiveGrid,
34
+ Sidebar,
35
+ type SidebarSectionProp,
36
+ Topbar,
37
+ } from "@godxjp/ui/layout";
38
+ import { BookOpen, FileText, LayoutDashboard, ReceiptText, Users } from "lucide-react";
39
+
40
+ const sections: SidebarSectionProp[] = [
41
+ {
42
+ label: "会計",
43
+ items: [
44
+ { id: "dashboard", label: "ダッシュボード", icon: LayoutDashboard },
45
+ { id: "journal", label: "仕訳", icon: FileText },
46
+ { id: "invoices", label: "請求書", icon: ReceiptText },
47
+ { id: "partners", label: "取引先", icon: BookOpen },
48
+ ],
49
+ },
50
+ { label: "管理", items: [{ id: "users", label: "ユーザー", icon: Users }] },
51
+ ];
52
+
53
+ const EXPENSE_CATEGORIES = [
54
+ {
55
+ value: "operating",
56
+ label: "営業費用",
57
+ children: [
58
+ { value: "travel", label: "旅費交通費" },
59
+ { value: "supplies", label: "消耗品費" },
60
+ ],
61
+ },
62
+ {
63
+ value: "labor",
64
+ label: "人件費",
65
+ children: [
66
+ { value: "salary", label: "給与手当" },
67
+ { value: "bonus", label: "賞与" },
68
+ ],
69
+ },
70
+ ];
71
+
72
+ /** The form's controlled value shape. */
73
+ interface InvoiceForm {
74
+ partner: string;
75
+ code: string;
76
+ account: string;
77
+ category: string[];
78
+ issueDate: Date | undefined;
79
+ period: DateRange | undefined;
80
+ amount: string;
81
+ taxRate: number[];
82
+ labels: string[];
83
+ memo: string;
84
+ draft: boolean;
85
+ }
86
+
87
+ const EMPTY: InvoiceForm = {
88
+ partner: "",
89
+ code: "",
90
+ account: "",
91
+ category: [],
92
+ issueDate: undefined,
93
+ period: undefined,
94
+ amount: "",
95
+ taxRate: [10],
96
+ labels: [],
97
+ memo: "",
98
+ draft: false,
99
+ };
100
+
101
+ type Errors = Partial<Record<keyof InvoiceForm, string>>;
102
+
103
+ /** Required-field validation — returns a message per empty required field. */
104
+ function validate(v: InvoiceForm): Errors {
105
+ const e: Errors = {};
106
+ if (!v.partner.trim()) e.partner = "取引先名は必須です";
107
+ if (!v.code.trim()) e.code = "取引先コードは必須です";
108
+ if (!v.account) e.account = "勘定科目を選択してください";
109
+ if (!v.issueDate) e.issueDate = "発行日を選択してください";
110
+ if (!v.amount.trim()) e.amount = "金額を入力してください";
111
+ else if (!/^\d+$/.test(v.amount)) e.amount = "金額は半角数字で入力してください";
112
+ return e;
113
+ }
114
+
115
+ /**
116
+ * Invoice form — a complete, realistic multi-section form with the full controlled validation flow.
117
+ * Sections are Card blocks; the action bar (Cancel + Submit, primary rightmost — rule 41) lives in
118
+ * the PageContainer footer. Submitting with empty required fields renders an inline error under each
119
+ * field AND a summary Alert; fixing a field clears its error live; a valid submit shows a pending
120
+ * spinner (button disabled) then a success Alert. Composed only from real @godxjp/ui primitives.
121
+ */
122
+ export default function Demo() {
123
+ const [v, setV] = useState<InvoiceForm>(EMPTY);
124
+ const [errors, setErrors] = useState<Errors>({});
125
+ const [status, setStatus] = useState<"idle" | "pending" | "success">("idle");
126
+
127
+ // Update one field and clear its error live (validation-on-fix).
128
+ function update<K extends keyof InvoiceForm>(key: K, value: InvoiceForm[K]) {
129
+ setV((s) => ({ ...s, [key]: value }));
130
+ setErrors((e) => (e[key] ? { ...e, [key]: undefined } : e));
131
+ if (status === "success") setStatus("idle");
132
+ }
133
+
134
+ function handleSubmit(event: React.FormEvent) {
135
+ event.preventDefault();
136
+ const next = validate(v);
137
+ setErrors(next);
138
+ if (Object.keys(next).length > 0) {
139
+ setStatus("idle");
140
+ return;
141
+ }
142
+ // Valid: simulate an async submit — spinner + disabled button, then success.
143
+ setStatus("pending");
144
+ window.setTimeout(() => setStatus("success"), 1200);
145
+ }
146
+
147
+ function handleReset() {
148
+ setV(EMPTY);
149
+ setErrors({});
150
+ setStatus("idle");
151
+ }
152
+
153
+ const errorCount = Object.values(errors).filter(Boolean).length;
154
+ const pending = status === "pending";
155
+
156
+ return (
157
+ <AppShell
158
+ sidebar={
159
+ <Sidebar
160
+ activeId="invoices"
161
+ sections={sections}
162
+ onSelect={() => {}}
163
+ product={{ name: "CoreBooks", role: "管理コンソール", color: "hsl(var(--primary))" }}
164
+ />
165
+ }
166
+ topbar={
167
+ <Topbar
168
+ start={
169
+ <Avatar className="rounded-md">
170
+ <AvatarFallback className="bg-primary text-primary-foreground font-bold">
171
+ C
172
+ </AvatarFallback>
173
+ </Avatar>
174
+ }
175
+ />
176
+ }
177
+ >
178
+ <PageContainer
179
+ title="請求書を作成"
180
+ breadcrumb={[{ label: "請求書", to: "#" }, { label: "新規" }]}
181
+ footer={
182
+ <Flex direction="row" wrap gap="sm" justify="end">
183
+ <Button variant="outline" type="button" onClick={handleReset} disabled={pending}>
184
+ キャンセル
185
+ </Button>
186
+ <Button type="submit" form="invoice-form" loading={pending} loadingText="送信中…">
187
+ 作成
188
+ </Button>
189
+ </Flex>
190
+ }
191
+ >
192
+ <Form id="invoice-form" onSubmit={handleSubmit}>
193
+ <Flex direction="col" gap="lg" className="max-w-3xl">
194
+ {/* Summary feedback — success after a valid submit, or an error summary on failure. */}
195
+ {status === "success" ? (
196
+ <Alert tone="success">
197
+ <AlertTitle>請求書を作成しました</AlertTitle>
198
+ <AlertDescription>
199
+ {v.partner} 宛の請求書({v.code})を保存しました。
200
+ </AlertDescription>
201
+ </Alert>
202
+ ) : errorCount > 0 ? (
203
+ <Alert tone="destructive">
204
+ <AlertTitle>入力内容を確認してください</AlertTitle>
205
+ <AlertDescription>
206
+ {errorCount} 件の必須項目が未入力です。各項目のエラーメッセージをご確認ください。
207
+ </AlertDescription>
208
+ </Alert>
209
+ ) : null}
210
+
211
+ {/* ── Section: 取引先 ── */}
212
+ <Card>
213
+ <CardHeader>
214
+ <CardTitle level={2}>取引先</CardTitle>
215
+ <CardDescription>請求先の取引先名とコードを入力します。</CardDescription>
216
+ </CardHeader>
217
+ <CardContent>
218
+ <ResponsiveGrid columns={2}>
219
+ <FormField
220
+ id="iv-partner"
221
+ label="取引先名"
222
+ required
223
+ helper="最大50文字"
224
+ error={errors.partner}
225
+ >
226
+ <Input
227
+ id="iv-partner"
228
+ value={v.partner}
229
+ onChange={(e) => update("partner", e.target.value)}
230
+ placeholder="株式会社ベトヤ"
231
+ disabled={pending}
232
+ />
233
+ </FormField>
234
+ <FormField
235
+ id="iv-code"
236
+ label="取引先コード"
237
+ required
238
+ helper="一意のコード"
239
+ error={errors.code}
240
+ >
241
+ <Input
242
+ id="iv-code"
243
+ value={v.code}
244
+ onChange={(e) => update("code", e.target.value)}
245
+ placeholder="BTY-0012"
246
+ disabled={pending}
247
+ />
248
+ </FormField>
249
+ </ResponsiveGrid>
250
+ </CardContent>
251
+ </Card>
252
+
253
+ {/* ── Section: 仕訳 ── */}
254
+ <Card>
255
+ <CardHeader>
256
+ <CardTitle level={2}>仕訳</CardTitle>
257
+ <CardDescription>
258
+ 勘定科目・経費カテゴリ・金額・税率・日付を入力します。
259
+ </CardDescription>
260
+ </CardHeader>
261
+ <CardContent>
262
+ <ResponsiveGrid columns={2}>
263
+ <FormField id="iv-account" label="勘定科目" required error={errors.account}>
264
+ <Select
265
+ id="iv-account"
266
+ name="account"
267
+ value={v.account}
268
+ onValueChange={(val: string) => update("account", val)}
269
+ placeholder="選択してください"
270
+ disabled={pending}
271
+ options={[
272
+ { value: "sales", label: "売上高" },
273
+ { value: "rent", label: "地代家賃" },
274
+ { value: "supplies", label: "消耗品費" },
275
+ ]}
276
+ />
277
+ </FormField>
278
+ <FormField id="iv-category" label="経費カテゴリ">
279
+ <Cascader
280
+ id="iv-category"
281
+ options={EXPENSE_CATEGORIES}
282
+ value={v.category}
283
+ onValueChange={(val) => update("category", val as string[])}
284
+ placeholder="カテゴリを選択…"
285
+ disabled={pending}
286
+ />
287
+ </FormField>
288
+ <FormField id="iv-issue" label="発行日" required error={errors.issueDate}>
289
+ <DatePicker
290
+ id="iv-issue"
291
+ name="issue_date"
292
+ value={v.issueDate}
293
+ onValueChange={(d) => update("issueDate", d)}
294
+ />
295
+ </FormField>
296
+ <FormField id="iv-period" label="対象期間">
297
+ <DateRangePicker
298
+ id="iv-period"
299
+ name="period"
300
+ value={v.period}
301
+ onValueChange={(r) => update("period", r)}
302
+ />
303
+ </FormField>
304
+ <FormField
305
+ id="iv-amount"
306
+ label="金額"
307
+ required
308
+ helper="税抜・半角数字"
309
+ error={errors.amount}
310
+ >
311
+ <Input
312
+ id="iv-amount"
313
+ inputMode="numeric"
314
+ value={v.amount}
315
+ onChange={(e) => update("amount", e.target.value)}
316
+ placeholder="100000"
317
+ disabled={pending}
318
+ />
319
+ </FormField>
320
+ <FormField
321
+ id="iv-tax"
322
+ label={`消費税率: ${v.taxRate[0]}%`}
323
+ helper="0% / 8% / 10%"
324
+ >
325
+ <Slider
326
+ id="iv-tax"
327
+ value={v.taxRate}
328
+ onValueChange={(val) => update("taxRate", val)}
329
+ min={0}
330
+ max={10}
331
+ step={2}
332
+ name="tax_rate"
333
+ aria-label="消費税率"
334
+ />
335
+ </FormField>
336
+ </ResponsiveGrid>
337
+ </CardContent>
338
+ </Card>
339
+
340
+ {/* ── Section: 補足 ── */}
341
+ <Card>
342
+ <CardHeader>
343
+ <CardTitle level={2}>補足</CardTitle>
344
+ <CardDescription>ラベル・摘要と下書き保存の設定。</CardDescription>
345
+ </CardHeader>
346
+ <CardContent>
347
+ <ResponsiveGrid columns={2}>
348
+ <FormField id="iv-labels" label="ラベル" helper="Enter またはカンマで追加">
349
+ <TagInput
350
+ value={v.labels}
351
+ onValueChange={(val) => update("labels", val)}
352
+ placeholder="ラベルを追加…"
353
+ name="labels"
354
+ />
355
+ </FormField>
356
+ <FormField id="iv-memo" label="摘要" helper="任意" colSpan={2}>
357
+ <Textarea
358
+ id="iv-memo"
359
+ value={v.memo}
360
+ onChange={(e) => update("memo", e.target.value)}
361
+ placeholder="例: 4月分から取引開始"
362
+ disabled={pending}
363
+ />
364
+ </FormField>
365
+ <div style={{ gridColumn: "1 / -1" }}>
366
+ <Field
367
+ id="iv-draft"
368
+ label="下書きとして保存する"
369
+ description="送信せず下書きに保存します"
370
+ >
371
+ <Switch
372
+ id="iv-draft"
373
+ checked={v.draft}
374
+ onCheckedChange={(c) => update("draft", c)}
375
+ disabled={pending}
376
+ />
377
+ </Field>
378
+ </div>
379
+ </ResponsiveGrid>
380
+ </CardContent>
381
+ </Card>
382
+ </Flex>
383
+ </Form>
384
+ </PageContainer>
385
+ </AppShell>
386
+ );
387
+ }
@@ -0,0 +1,240 @@
1
+ import { useState } from "react";
2
+
3
+ import {
4
+ Cascader,
5
+ CheckboxGroup,
6
+ ColorPicker,
7
+ DatePicker,
8
+ DateRangePicker,
9
+ Form,
10
+ FormField,
11
+ Input,
12
+ MonthPicker,
13
+ RadioGroup,
14
+ SearchInput,
15
+ Select,
16
+ TimePicker,
17
+ TreeSelect,
18
+ } from "@godxjp/ui/data-entry";
19
+ import { Button } from "@godxjp/ui/general";
20
+ import { Alert, AlertDescription, AlertTitle } from "@godxjp/ui/feedback";
21
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
22
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
23
+
24
+ /**
25
+ * FormField × custom controls — the accessible-name/description/error contract.
26
+ *
27
+ * Every control below is wrapped in a FormField that provides the visible label, helper and error.
28
+ * FormField injects `aria-labelledby` / `aria-describedby` / `aria-errormessage` / `aria-invalid` /
29
+ * `aria-required` onto the control, which FORWARDS them to its real semantic focus target — the
30
+ * combobox trigger, the typeable input, or (for groups/ranges) the `role=group`/`role=radiogroup`
31
+ * container. Open a screen reader or run axe on this frame: the visible label names the actual
32
+ * control, not a wrapper div. Composed only from real @godxjp/ui components.
33
+ */
34
+
35
+ const REGIONS = [
36
+ {
37
+ value: "jp",
38
+ label: "日本",
39
+ children: [
40
+ { value: "kanto", label: "関東", children: [{ value: "tokyo", label: "東京都" }] },
41
+ { value: "kansai", label: "関西", children: [{ value: "osaka", label: "大阪府" }] },
42
+ ],
43
+ },
44
+ ];
45
+
46
+ const CATEGORIES = [
47
+ {
48
+ value: "acct",
49
+ label: "会計",
50
+ children: [
51
+ { value: "sales", label: "売上高" },
52
+ { value: "rent", label: "地代家賃" },
53
+ ],
54
+ },
55
+ ];
56
+
57
+ const CURRENCIES = [
58
+ { value: "jpy", label: "日本円 (JPY)" },
59
+ { value: "usd", label: "米ドル (USD)" },
60
+ { value: "vnd", label: "ベトナムドン (VND)" },
61
+ ];
62
+
63
+ export default function Demo() {
64
+ // Async / server validation + recovery: submit runs a fake server check, sets an error on the
65
+ // "code" field and focuses it; entering a valid code and resubmitting clears the error.
66
+ const [code, setCode] = useState("");
67
+ const [codeError, setCodeError] = useState<string | undefined>();
68
+ const [status, setStatus] = useState<"idle" | "checking" | "ok">("idle");
69
+
70
+ const submit = async (event: React.FormEvent) => {
71
+ event.preventDefault();
72
+ setStatus("checking");
73
+ // Simulate a server round-trip (a real app would call its API here).
74
+ await new Promise((resolve) => setTimeout(resolve, 400));
75
+ if (code.trim().length < 4) {
76
+ setCodeError("コードは4文字以上で、サーバー上で一意である必要があります");
77
+ setStatus("idle");
78
+ // Submit focus: move focus to the first invalid control by its FormField id.
79
+ document.getElementById("ac-code")?.focus();
80
+ return;
81
+ }
82
+ setCodeError(undefined);
83
+ setStatus("ok");
84
+ };
85
+
86
+ return (
87
+ <PageContainer
88
+ title="FormField × カスタムコントロール"
89
+ subtitle="ラベル・ヘルプ・エラーの ARIA 契約:フォーカス先の実コントロールに転送"
90
+ >
91
+ <Flex direction="col" gap="lg" className="max-w-2xl">
92
+ <Card>
93
+ <CardHeader>
94
+ <CardTitle level={2}>ポップアップ系コントロール(combobox 契約)</CardTitle>
95
+ <CardDescription>
96
+ Select(showSearch 含む)/ Cascader / TreeSelect / 各ピッカーはトリガー(combobox)に
97
+ aria-labelledby・aria-describedby・aria-expanded・aria-controls を転送します。
98
+ </CardDescription>
99
+ </CardHeader>
100
+ <CardContent>
101
+ <Flex direction="col" gap="md">
102
+ <FormField id="ac-account" label="勘定科目" required helper="仕訳で使用する科目">
103
+ <Select
104
+ id="ac-account"
105
+ name="account"
106
+ showSearch
107
+ options={[
108
+ { value: "sales", label: "売上高" },
109
+ { value: "rent", label: "地代家賃" },
110
+ { value: "misc", label: "雑費" },
111
+ ]}
112
+ onValueChange={() => {}}
113
+ />
114
+ </FormField>
115
+ <FormField id="ac-currency" label="通貨" helper="ISO 4217">
116
+ <Select
117
+ id="ac-currency"
118
+ name="currency"
119
+ options={CURRENCIES}
120
+ onValueChange={() => {}}
121
+ />
122
+ </FormField>
123
+ <FormField id="ac-region" label="地域" helper="都道府県まで選択">
124
+ <Cascader id="ac-region" options={REGIONS} onValueChange={() => {}} />
125
+ </FormField>
126
+ <FormField id="ac-category" label="カテゴリ" helper="ツリーから選択">
127
+ <TreeSelect id="ac-category" treeData={CATEGORIES} onValueChange={() => {}} />
128
+ </FormField>
129
+ <FormField id="ac-date" label="取引日" helper="yyyy-MM-dd">
130
+ <DatePicker id="ac-date" name="date" />
131
+ </FormField>
132
+ <FormField id="ac-month" label="対象月" helper="yyyy/MM">
133
+ <MonthPicker id="ac-month" name="month" />
134
+ </FormField>
135
+ <FormField id="ac-time" label="締め時刻" helper="24時間表記">
136
+ <TimePicker id="ac-time" name="time" />
137
+ </FormField>
138
+ <FormField id="ac-period" label="対象期間" helper="開始日と終了日">
139
+ <DateRangePicker id="ac-period" name="period" />
140
+ </FormField>
141
+ <FormField id="ac-color" label="タグ色" helper="16進カラー">
142
+ <ColorPicker id="ac-color" onValueChange={() => {}} />
143
+ </FormField>
144
+ <FormField id="ac-search" label="取引先検索" helper="名称の一部で検索">
145
+ <SearchInput id="ac-search" />
146
+ </FormField>
147
+ </Flex>
148
+ </CardContent>
149
+ </Card>
150
+
151
+ <Card>
152
+ <CardHeader>
153
+ <CardTitle level={2}>グループ系コントロール(group / radiogroup 契約)</CardTitle>
154
+ <CardDescription>
155
+ RadioGroup は role=radiogroup で完全な検証 ARIA を、CheckboxGroup は role=group で
156
+ ラベルと説明(エラーは説明に統合)を公開します。
157
+ </CardDescription>
158
+ </CardHeader>
159
+ <CardContent>
160
+ <Flex direction="col" gap="md">
161
+ <FormField
162
+ id="ac-method"
163
+ label="支払方法"
164
+ required
165
+ error="支払方法を選択してください"
166
+ >
167
+ <RadioGroup
168
+ id="ac-method"
169
+ options={[
170
+ { value: "bank", label: "銀行振込" },
171
+ { value: "card", label: "クレジットカード" },
172
+ { value: "cash", label: "現金" },
173
+ ]}
174
+ onValueChange={() => {}}
175
+ />
176
+ </FormField>
177
+ <FormField id="ac-tags" label="タグ" helper="複数選択できます">
178
+ <CheckboxGroup
179
+ id="ac-tags"
180
+ orientation="horizontal"
181
+ options={[
182
+ { value: "urgent", label: "至急" },
183
+ { value: "review", label: "要確認" },
184
+ { value: "archived", label: "アーカイブ" },
185
+ ]}
186
+ onValueChange={() => {}}
187
+ />
188
+ </FormField>
189
+ </Flex>
190
+ </CardContent>
191
+ </Card>
192
+
193
+ <Card>
194
+ <CardHeader>
195
+ <CardTitle level={2}>エラーのタイミング・非同期検証・回復</CardTitle>
196
+ <CardDescription>
197
+ エラーは送信後にのみ表示(role=alert
198
+ で即時アナウンス)。修正して再送信するとエラーが解除され、 helper
199
+ に戻ります。送信時は最初の不正なコントロールへフォーカスします。
200
+ </CardDescription>
201
+ </CardHeader>
202
+ <CardContent>
203
+ <Form onSubmit={submit} layout="vertical">
204
+ <Flex direction="col" gap="md">
205
+ <FormField
206
+ id="ac-code"
207
+ label="取引先コード"
208
+ required
209
+ helper="4文字以上・サーバー上で一意"
210
+ error={codeError}
211
+ >
212
+ <Input
213
+ id="ac-code"
214
+ name="code"
215
+ value={code}
216
+ onChange={(event) => {
217
+ setCode(event.target.value);
218
+ if (codeError) setCodeError(undefined);
219
+ }}
220
+ />
221
+ </FormField>
222
+ {status === "ok" ? (
223
+ <Alert tone="success">
224
+ <AlertTitle>検証に成功しました</AlertTitle>
225
+ <AlertDescription>コードは利用可能です。</AlertDescription>
226
+ </Alert>
227
+ ) : null}
228
+ <Flex direction="row" justify="end">
229
+ <Button type="submit" loading={status === "checking"}>
230
+ 検証して送信
231
+ </Button>
232
+ </Flex>
233
+ </Flex>
234
+ </Form>
235
+ </CardContent>
236
+ </Card>
237
+ </Flex>
238
+ </PageContainer>
239
+ );
240
+ }