@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,724 @@
1
+ import { useState } from "react";
2
+
3
+ import {
4
+ Cascader,
5
+ Checkbox,
6
+ CheckboxGroup,
7
+ DatePicker,
8
+ DateRangePicker,
9
+ Field,
10
+ Form,
11
+ FormErrors,
12
+ FormErrorsProvider,
13
+ FormField,
14
+ Input,
15
+ InputOTP,
16
+ InputOTPGroup,
17
+ InputOTPSlot,
18
+ PasswordInput,
19
+ Rating,
20
+ RadioGroup,
21
+ SearchInput,
22
+ Select,
23
+ Slider,
24
+ Switch,
25
+ TagInput,
26
+ Textarea,
27
+ TimePicker,
28
+ ToggleGroup,
29
+ ToggleGroupItem,
30
+ TreeSelect,
31
+ Upload,
32
+ type UploadFileItem,
33
+ } from "@godxjp/ui/data-entry";
34
+ import type { DateRange } from "react-day-picker";
35
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
36
+ import { Button, Heading, Text } from "@godxjp/ui/general";
37
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
38
+
39
+ /** No-op uploader: resolves immediately with a fake mediaId for preview purposes. */
40
+ async function noopUpload(_file: File, _item: UploadFileItem) {
41
+ return { mediaId: "preview-media-id" };
42
+ }
43
+
44
+ /** Expense category tree for the Cascader field. */
45
+ const EXPENSE_CATEGORIES = [
46
+ {
47
+ value: "operating",
48
+ label: "営業費用",
49
+ children: [
50
+ { value: "travel", label: "旅費交通費" },
51
+ { value: "communication", label: "通信費" },
52
+ { value: "supplies", label: "消耗品費" },
53
+ ],
54
+ },
55
+ {
56
+ value: "labor",
57
+ label: "人件費",
58
+ children: [
59
+ { value: "salary", label: "給与手当" },
60
+ { value: "bonus", label: "賞与" },
61
+ ],
62
+ },
63
+ ];
64
+
65
+ /** Account tree for the TreeSelect field. */
66
+ const ACCOUNT_TREE = [
67
+ {
68
+ value: "assets",
69
+ label: "資産",
70
+ children: [
71
+ { value: "cash", label: "現金" },
72
+ { value: "bank", label: "普通預金" },
73
+ { value: "ar", label: "売掛金" },
74
+ ],
75
+ },
76
+ {
77
+ value: "expenses",
78
+ label: "費用",
79
+ children: [
80
+ { value: "rent", label: "地代家賃" },
81
+ { value: "utilities", label: "水道光熱費" },
82
+ ],
83
+ },
84
+ ];
85
+
86
+ /**
87
+ * Form — the comprehensive catalogue. One page proving (1) EVERY data-entry field type wired in a
88
+ * FormField, (2) every Form LAYOUT (vertical / horizontal / inline / multi-column / responsive
89
+ * collapse), and (3) every Form STATE (pristine · filled · required-error · helper · disabled ·
90
+ * read-only · pending · success). Composed only from real @godxjp/ui primitives; all typography is
91
+ * the Text/Heading primitive (never a hand-rolled span). For the full controlled validation flow,
92
+ * see the example screens under Form → examples.
93
+ */
94
+ export default function Demo() {
95
+ // ── Field-catalogue state (each field independent) ─────────────────────────
96
+ const [text, setText] = useState("");
97
+ const [search, setSearch] = useState("");
98
+ const [memo, setMemo] = useState("");
99
+ const [account, setAccount] = useState("");
100
+ const [tree, setTree] = useState<string | undefined>();
101
+ const [category, setCategory] = useState<string[]>([]);
102
+ const [terms, setTerms] = useState(false);
103
+ const [channels, setChannels] = useState<string[]>(["email"]);
104
+ const [rounding, setRounding] = useState("round");
105
+ const [active, setActive] = useState(true);
106
+ const [taxRate, setTaxRate] = useState<number[]>([10]);
107
+ const [issueDate, setIssueDate] = useState<Date | undefined>(new Date(2026, 0, 15));
108
+ const [period, setPeriod] = useState<DateRange | undefined>();
109
+ const [closeTime, setCloseTime] = useState("17:30");
110
+ const [score, setScore] = useState(4);
111
+ const [tags, setTags] = useState<string[]>(["優先"]);
112
+ const [otp, setOtp] = useState("");
113
+ const [files, setFiles] = useState<UploadFileItem[]>([]);
114
+ const [period2, setPeriod2] = useState("monthly");
115
+
116
+ return (
117
+ <PageContainer
118
+ title="Form"
119
+ subtitle="全フィールド型 × 全レイアウト × 全状態 · 実画面のフォーム例 (real primitives only)"
120
+ >
121
+ <Flex direction="col" gap="lg">
122
+ {/* ════════════════════ 1. EVERY FIELD TYPE ════════════════════ */}
123
+ <Heading level={2}>1. 全フィールド型 · すべての入力コントロール</Heading>
124
+ <Text tone="muted" size="sm">
125
+ ライブラリが提供するデータ入力コンポーネントを 1 つずつ FormField
126
+ でラップ。ラベル・ヘルパー・必須マークを付与し、aria-* は自動配線される。
127
+ </Text>
128
+
129
+ <Card>
130
+ <CardHeader>
131
+ <CardTitle level={2}>
132
+ テキスト系 · Input / SearchInput / PasswordInput / Textarea
133
+ </CardTitle>
134
+ <CardDescription>
135
+ 文字列・検索・パスワード・複数行。type=email / inputMode=numeric も Input で表現する。
136
+ </CardDescription>
137
+ </CardHeader>
138
+ <CardContent>
139
+ <Form columns={2}>
140
+ <FormField id="f-text" label="件名" required helper="最大50文字">
141
+ <Input
142
+ id="f-text"
143
+ value={text}
144
+ onChange={(e) => setText(e.target.value)}
145
+ placeholder="2026年1月度 請求書"
146
+ />
147
+ </FormField>
148
+ <FormField id="f-email" label="メールアドレス" helper="連絡先として使用します">
149
+ <Input id="f-email" type="email" placeholder="taro@example.co.jp" />
150
+ </FormField>
151
+ <FormField id="f-search" label="取引先を検索">
152
+ <SearchInput
153
+ id="f-search"
154
+ value={search}
155
+ onValueChange={setSearch}
156
+ onSearch={() => {}}
157
+ placeholder="社名・コードで検索…"
158
+ />
159
+ </FormField>
160
+ <FormField id="f-pass" label="パスワード" required helper="8文字以上">
161
+ <PasswordInput id="f-pass" placeholder="••••••••" />
162
+ </FormField>
163
+ <FormField id="f-memo" label="摘要" helper="任意" colSpan={2}>
164
+ <Textarea
165
+ id="f-memo"
166
+ value={memo}
167
+ onChange={(e) => setMemo(e.target.value)}
168
+ placeholder="例: 4月分から取引開始"
169
+ />
170
+ </FormField>
171
+ </Form>
172
+ </CardContent>
173
+ </Card>
174
+
175
+ <Card>
176
+ <CardHeader>
177
+ <CardTitle level={2}>Responsive collapse contract · every breakpoint</CardTitle>
178
+ <CardDescription>
179
+ The horizontal form collapse union is rendered at false, sm, md, lg and xl; the
180
+ viewport matrix verifies each transition without consumer CSS.
181
+ </CardDescription>
182
+ </CardHeader>
183
+ <CardContent>
184
+ <Flex direction="col" gap="md">
185
+ {([false, "sm", "md", "lg", "xl"] as const).map((collapseBelow) => (
186
+ <Form
187
+ key={String(collapseBelow)}
188
+ layout="horizontal"
189
+ collapseBelow={collapseBelow}
190
+ labelWidth="8rem"
191
+ controlWidth="18rem"
192
+ labelAlign="end"
193
+ className="contract-collapse-form"
194
+ >
195
+ <FormField id={`collapse-${String(collapseBelow)}`} label={String(collapseBelow)}>
196
+ <Input defaultValue="Responsive value" />
197
+ </FormField>
198
+ </Form>
199
+ ))}
200
+ </Flex>
201
+ </CardContent>
202
+ </Card>
203
+
204
+ <Card>
205
+ <CardHeader>
206
+ <CardTitle level={2}>asChild · the router owns the form element</CardTitle>
207
+ <CardDescription>
208
+ Inertia&apos;s <code>&lt;Form action method&gt;</code> and TanStack Form render their
209
+ own <code>&lt;form&gt;</code>, and two form elements cannot nest. <code>asChild</code>
210
+ keeps the layout context and hands the element back, so a consumer keeps the
211
+ router&apos;s submission handling AND the label column instead of hand-rolling one.
212
+ </CardDescription>
213
+ </CardHeader>
214
+ <CardContent>
215
+ <Form
216
+ asChild
217
+ layout="horizontal"
218
+ labelWidth="8rem"
219
+ controlWidth="18rem"
220
+ labelAlign="end"
221
+ >
222
+ <form className="contract-aschild-form" onSubmit={(event) => event.preventDefault()}>
223
+ <FormField id="aschild-name" label="取引先名" required>
224
+ <Input id="aschild-name" defaultValue="株式会社ゴドー" />
225
+ </FormField>
226
+ <FormField id="aschild-code" label="コード" helper="ルータ側が form 要素を持つ">
227
+ <Input id="aschild-code" defaultValue="BTY-0012" />
228
+ </FormField>
229
+ </form>
230
+ </Form>
231
+ </CardContent>
232
+ </Card>
233
+
234
+ <Card>
235
+ <CardHeader>
236
+ <CardTitle level={2}>Density · compact / default / comfortable</CardTitle>
237
+ <CardDescription>
238
+ density はフォーム全体の縦方向リズムを変更する。入力サイズやラベル関係は変えない。
239
+ </CardDescription>
240
+ </CardHeader>
241
+ <CardContent>
242
+ <Flex direction="col" gap="lg">
243
+ {(["compact", "default", "comfortable"] as const).map((density) => (
244
+ <Form key={density} density={density} columns={2}>
245
+ <FormField id={`density-${density}-name`} label={`${density} · 氏名`}>
246
+ <Input id={`density-${density}-name`} defaultValue="山田 太郎" />
247
+ </FormField>
248
+ <FormField id={`density-${density}-email`} label="メール" helper="連絡先">
249
+ <Input id={`density-${density}-email`} defaultValue="taro@example.jp" />
250
+ </FormField>
251
+ </Form>
252
+ ))}
253
+ </Flex>
254
+ </CardContent>
255
+ </Card>
256
+
257
+ <Card>
258
+ <CardHeader>
259
+ <CardTitle level={2}>選択系 · Select / TreeSelect / Cascader</CardTitle>
260
+ <CardDescription>
261
+ 単一選択・階層ツリー選択・カスケード選択。いずれも options/treeData
262
+ でデータ駆動し、value/onValueChange で制御する。
263
+ </CardDescription>
264
+ </CardHeader>
265
+ <CardContent>
266
+ <Form columns={2}>
267
+ <FormField id="f-account" label="勘定科目" required>
268
+ <Select
269
+ id="f-account"
270
+ name="account"
271
+ value={account}
272
+ onValueChange={setAccount}
273
+ placeholder="選択してください"
274
+ options={[
275
+ { value: "cash", label: "現金" },
276
+ { value: "sales", label: "売上高" },
277
+ { value: "rent", label: "地代家賃" },
278
+ ]}
279
+ />
280
+ </FormField>
281
+ <FormField id="f-tree" label="計上先科目">
282
+ <TreeSelect
283
+ id="f-tree"
284
+ treeData={ACCOUNT_TREE}
285
+ value={tree}
286
+ onValueChange={(v) => setTree(v as string | undefined)}
287
+ placeholder="科目ツリーから選択…"
288
+ />
289
+ </FormField>
290
+ <FormField id="f-category" label="経費カテゴリ" colSpan={2}>
291
+ <Cascader
292
+ id="f-category"
293
+ options={EXPENSE_CATEGORIES}
294
+ value={category}
295
+ onValueChange={(v) => setCategory(v as string[])}
296
+ showSearch
297
+ placeholder="カテゴリを選択…"
298
+ />
299
+ </FormField>
300
+ </Form>
301
+ </CardContent>
302
+ </Card>
303
+
304
+ <Card>
305
+ <CardHeader>
306
+ <CardTitle level={2}>
307
+ 真偽・選択肢系 · Checkbox / CheckboxGroup / RadioGroup / Switch
308
+ </CardTitle>
309
+ <CardDescription>
310
+ 単一チェック・複数チェック・排他選択・トグル。Checkbox/Switch は Field
311
+ でラベルと横並びにする。
312
+ </CardDescription>
313
+ </CardHeader>
314
+ <CardContent>
315
+ <Flex direction="col" gap="md">
316
+ <Field
317
+ id="f-terms"
318
+ label="利用規約に同意する"
319
+ description="同意しないと送信できません"
320
+ >
321
+ <Checkbox id="f-terms" checked={terms} onCheckedChange={(c) => setTerms(!!c)} />
322
+ </Field>
323
+ <FormField id="f-channels" label="通知チャネル" helper="複数選択可">
324
+ <CheckboxGroup
325
+ value={channels}
326
+ onValueChange={setChannels}
327
+ options={[
328
+ { value: "email", label: "メール" },
329
+ { value: "slack", label: "Slack" },
330
+ { value: "sms", label: "SMS" },
331
+ ]}
332
+ />
333
+ </FormField>
334
+ <FormField id="f-rounding" label="端数処理">
335
+ <RadioGroup
336
+ value={rounding}
337
+ onValueChange={setRounding}
338
+ orientation="horizontal"
339
+ options={[
340
+ { value: "round", label: "四捨五入" },
341
+ { value: "floor", label: "切り捨て" },
342
+ { value: "ceil", label: "切り上げ" },
343
+ ]}
344
+ />
345
+ </FormField>
346
+ <Field
347
+ id="f-active"
348
+ label="取引を有効にする"
349
+ description="無効にすると新規取引を登録できません"
350
+ >
351
+ <Switch id="f-active" checked={active} onCheckedChange={setActive} />
352
+ </Field>
353
+ </Flex>
354
+ </CardContent>
355
+ </Card>
356
+
357
+ <Card>
358
+ <CardHeader>
359
+ <CardTitle level={2}>数値・範囲系 · Slider / Rating</CardTitle>
360
+ <CardDescription>
361
+ 連続値スライダーと星評価。value は配列/数値で制御する。
362
+ </CardDescription>
363
+ </CardHeader>
364
+ <CardContent>
365
+ <Flex direction="col" gap="md">
366
+ <FormField id="f-tax" label={`消費税率: ${taxRate[0]}%`} helper="0% / 8% / 10%">
367
+ <Slider
368
+ id="f-tax"
369
+ value={taxRate}
370
+ onValueChange={setTaxRate}
371
+ min={0}
372
+ max={10}
373
+ step={2}
374
+ name="tax_rate"
375
+ aria-label="消費税率"
376
+ />
377
+ </FormField>
378
+ <FormField id="f-score" label="取引先評価">
379
+ <Rating
380
+ name="vendor_score"
381
+ aria-label="取引先評価"
382
+ value={score}
383
+ onValueChange={setScore}
384
+ />
385
+ </FormField>
386
+ </Flex>
387
+ </CardContent>
388
+ </Card>
389
+
390
+ <Card>
391
+ <CardHeader>
392
+ <CardTitle level={2}>日時系 · DatePicker / DateRangePicker / TimePicker</CardTitle>
393
+ <CardDescription>
394
+ 単一日付・期間・時刻。ISO-8601 / IANA タイムゾーンに準拠し locale
395
+ 連動でフォーマットする。
396
+ </CardDescription>
397
+ </CardHeader>
398
+ <CardContent>
399
+ <Form columns={2}>
400
+ <FormField id="f-issue" label="発行日" required>
401
+ <DatePicker
402
+ id="f-issue"
403
+ name="issue_date"
404
+ value={issueDate}
405
+ onValueChange={setIssueDate}
406
+ />
407
+ </FormField>
408
+ <FormField id="f-time" label="締め時刻">
409
+ <TimePicker
410
+ id="f-time"
411
+ name="close_time"
412
+ value={closeTime}
413
+ onValueChange={setCloseTime}
414
+ minuteStep={15}
415
+ />
416
+ </FormField>
417
+ <FormField id="f-period" label="会計期間" colSpan={2}>
418
+ <DateRangePicker
419
+ id="f-period"
420
+ name="period"
421
+ value={period}
422
+ onValueChange={setPeriod}
423
+ />
424
+ </FormField>
425
+ </Form>
426
+ </CardContent>
427
+ </Card>
428
+
429
+ <Card>
430
+ <CardHeader>
431
+ <CardTitle level={2}>その他 · TagInput / ToggleGroup / InputOTP / Upload</CardTitle>
432
+ <CardDescription>
433
+ タグ入力・セグメント切替・ワンタイムコード・ファイル添付。すべて FormField
434
+ でラベル付けする。
435
+ </CardDescription>
436
+ </CardHeader>
437
+ <CardContent>
438
+ <Flex direction="col" gap="md">
439
+ <FormField id="f-tags" label="ラベル" helper="Enter またはカンマで追加">
440
+ <TagInput
441
+ value={tags}
442
+ onValueChange={setTags}
443
+ placeholder="ラベルを追加…"
444
+ name="labels"
445
+ />
446
+ </FormField>
447
+ <FormField id="f-period2" label="集計期間">
448
+ <ToggleGroup
449
+ type="single"
450
+ value={period2}
451
+ onValueChange={(v) => {
452
+ if (v) setPeriod2(v);
453
+ }}
454
+ >
455
+ <ToggleGroupItem value="daily">日次</ToggleGroupItem>
456
+ <ToggleGroupItem value="monthly">月次</ToggleGroupItem>
457
+ <ToggleGroupItem value="yearly">年次</ToggleGroupItem>
458
+ </ToggleGroup>
459
+ </FormField>
460
+ <FormField id="f-otp" label="認証コード" helper="メールに届いた6桁の数字">
461
+ <InputOTP id="f-otp" maxLength={6} value={otp} onChange={setOtp}>
462
+ <InputOTPGroup>
463
+ <InputOTPSlot index={0} />
464
+ <InputOTPSlot index={1} />
465
+ <InputOTPSlot index={2} />
466
+ <InputOTPSlot index={3} />
467
+ <InputOTPSlot index={4} />
468
+ <InputOTPSlot index={5} />
469
+ </InputOTPGroup>
470
+ </InputOTP>
471
+ </FormField>
472
+ <FormField id="f-files" label="添付ファイル" helper="PDF・Excel(最大5件)">
473
+ <Upload
474
+ variant="dropzone"
475
+ value={files}
476
+ onValueChange={setFiles}
477
+ accept=".pdf,.xlsx,.csv"
478
+ maxCount={5}
479
+ onUpload={noopUpload}
480
+ />
481
+ </FormField>
482
+ </Flex>
483
+ </CardContent>
484
+ </Card>
485
+
486
+ {/* ════════════════════ 2. EVERY LAYOUT ════════════════════ */}
487
+ <Heading level={2}>2. レイアウト · vertical / horizontal / inline / columns</Heading>
488
+
489
+ <Card>
490
+ <CardHeader>
491
+ <CardTitle level={2}>Vertical(デフォルト)</CardTitle>
492
+ <CardDescription>ラベルをコントロールの上に積む。狭いフォームの既定。</CardDescription>
493
+ </CardHeader>
494
+ <CardContent>
495
+ <Form>
496
+ <FormField id="l-v-name" label="氏名" required>
497
+ <Input id="l-v-name" placeholder="山田 太郎" />
498
+ </FormField>
499
+ <FormField id="l-v-email" label="メールアドレス" helper="連絡先として使用します">
500
+ <Input id="l-v-email" type="email" placeholder="taro@example.co.jp" />
501
+ </FormField>
502
+ </Form>
503
+ </CardContent>
504
+ </Card>
505
+
506
+ <Card>
507
+ <CardHeader>
508
+ <CardTitle level={2}>Horizontal(labelWidth 120 · md未満で縦に折り返し)</CardTitle>
509
+ <CardDescription>
510
+ ラベルを固定幅120pxの列に置き、コントロールと横並び。768px (md)
511
+ 未満で自動的に縦積みへ。
512
+ </CardDescription>
513
+ </CardHeader>
514
+ <CardContent>
515
+ <Form layout="horizontal" labelWidth={120}>
516
+ <FormField id="l-h-account" label="勘定科目" required>
517
+ <Select
518
+ id="l-h-account"
519
+ name="h_account"
520
+ placeholder="選択してください"
521
+ options={[
522
+ { value: "cash", label: "現金" },
523
+ { value: "sales", label: "売上高" },
524
+ ]}
525
+ />
526
+ </FormField>
527
+ <FormField id="l-h-amount" label="金額" helper="税込">
528
+ <Input id="l-h-amount" inputMode="numeric" placeholder="100000" />
529
+ </FormField>
530
+ {/* Per-field override: keep this one vertical even though the Form is horizontal. */}
531
+ <FormField id="l-h-memo" label="摘要(この行だけ vertical)" layout="vertical">
532
+ <Input id="l-h-memo" />
533
+ </FormField>
534
+ </Form>
535
+ </CardContent>
536
+ </Card>
537
+
538
+ <Card>
539
+ <CardHeader>
540
+ <CardTitle level={2}>
541
+ Inline · フィルターバー(layout=inline · Flex で横並び)
542
+ </CardTitle>
543
+ <CardDescription>
544
+ 一覧画面上部の絞り込みバー。layout=inline でラベルをコントロールの左に詰め、Flex
545
+ direction=row でフィールドを横一列に並べ、末尾に適用ボタンを置く。
546
+ </CardDescription>
547
+ </CardHeader>
548
+ <CardContent>
549
+ <Form layout="inline">
550
+ <Flex direction="row" gap="md" wrap align="end">
551
+ <FormField id="l-i-keyword" label="キーワード">
552
+ <SearchInput id="l-i-keyword" onSearch={() => {}} placeholder="取引先名…" />
553
+ </FormField>
554
+ <FormField id="l-i-status" label="ステータス">
555
+ <Select
556
+ id="l-i-status"
557
+ name="i_status"
558
+ placeholder="すべて"
559
+ options={[
560
+ { value: "draft", label: "下書き" },
561
+ { value: "paid", label: "入金済" },
562
+ ]}
563
+ />
564
+ </FormField>
565
+ <Button type="button">絞り込む</Button>
566
+ </Flex>
567
+ </Form>
568
+ </CardContent>
569
+ </Card>
570
+
571
+ <Card>
572
+ <CardHeader>
573
+ <CardTitle level={2}>Columns(columns=2 · 姓+名ペア · 住所は2列span)</CardTitle>
574
+ <CardDescription>
575
+ 複数列グリッド(ResponsiveGrid · 小画面では1列)。広いフィールドは colSpan
576
+ で列をまたぐ。
577
+ </CardDescription>
578
+ </CardHeader>
579
+ <CardContent>
580
+ <Form columns={2}>
581
+ <FormField id="l-c-last" label="姓" required>
582
+ <Input id="l-c-last" placeholder="山田" />
583
+ </FormField>
584
+ <FormField id="l-c-first" label="名" required>
585
+ <Input id="l-c-first" placeholder="太郎" />
586
+ </FormField>
587
+ <FormField id="l-c-address" label="住所" colSpan={2}>
588
+ <Input id="l-c-address" placeholder="東京都千代田区…" />
589
+ </FormField>
590
+ </Form>
591
+ </CardContent>
592
+ </Card>
593
+
594
+ <Card>
595
+ <CardHeader>
596
+ <CardTitle level={2}>Horizontal · 常時(collapseBelow=false)</CardTitle>
597
+ <CardDescription>
598
+ スマホでもラベル横並びを維持(多用しない)。labelAlign=start で左揃えに。
599
+ </CardDescription>
600
+ </CardHeader>
601
+ <CardContent>
602
+ <Form layout="horizontal" labelWidth="6rem" labelAlign="start" collapseBelow={false}>
603
+ <FormField id="l-a-code" label="コード">
604
+ <Input id="l-a-code" placeholder="BTY-0012" />
605
+ </FormField>
606
+ </Form>
607
+ </CardContent>
608
+ </Card>
609
+
610
+ {/* ════════════════════ 3. EVERY STATE ════════════════════ */}
611
+ <Heading level={2}>3. 状態 · pristine / filled / error / disabled / read-only</Heading>
612
+
613
+ <Card>
614
+ <CardHeader>
615
+ <CardTitle level={2}>必須エラー · ヘルパー · disabled · read-only</CardTitle>
616
+ <CardDescription>
617
+ required は赤いアスタリスク、error (role=alert) はヘルパーを上書きし aria-invalid
618
+ を立てる。 disabled は操作不可、read-only は値を表示するが編集不可。
619
+ </CardDescription>
620
+ </CardHeader>
621
+ <CardContent>
622
+ <Form>
623
+ <FormField id="s-name" label="取引先名" required error="取引先名は必須です">
624
+ <Input id="s-name" placeholder="株式会社…" />
625
+ </FormField>
626
+ <FormField id="s-email" label="メール" error="メールアドレスの形式が正しくありません">
627
+ <Input id="s-email" type="email" defaultValue="invalid@" />
628
+ </FormField>
629
+ <FormField id="s-filled" label="コード" helper="一意のコードを入力">
630
+ <Input id="s-filled" defaultValue="BTY-0012" />
631
+ </FormField>
632
+ <FormField id="s-disabled" label="登録番号(システム発番 · disabled)">
633
+ <Input id="s-disabled" disabled defaultValue="INV-2026-0001" />
634
+ </FormField>
635
+ <FormField id="s-readonly" label="作成日時(read-only)">
636
+ <Input id="s-readonly" readOnly defaultValue="2026-01-15 09:32" />
637
+ </FormField>
638
+ </Form>
639
+ </CardContent>
640
+ </Card>
641
+
642
+ <Card>
643
+ <CardHeader>
644
+ <CardTitle level={2}>
645
+ サーバーエラーバッグ · Form errors + FormField name + FormErrors
646
+ </CardTitle>
647
+ <CardDescription>
648
+ Form に errors(Inertia の form.errors)を渡すと、name
649
+ を持つフィールドは自分のメッセージをバッグから自動解決してキーを消費(claim)する。
650
+ FormErrors は残り —
651
+ 隠し・派生フィールド(action_mode、page…)に付いた、どのフィールドにも表示先が無いエラー
652
+ — だけを role=alert のバナーとして表示する。
653
+ </CardDescription>
654
+ </CardHeader>
655
+ <CardContent>
656
+ <Form
657
+ layout="horizontal"
658
+ labelWidth={140}
659
+ errors={{
660
+ customer_nm: "顧客名は必須です",
661
+ action_mode: "操作モードが不正です",
662
+ page: ["ページ番号が不正です", "ページ範囲を超えています"],
663
+ }}
664
+ >
665
+ <FormErrors />
666
+ {/* claimed: このフィールドが customer_nm のメッセージを表示するのでバナーには出ない */}
667
+ <FormField name="customer_nm" label="顧客名" required>
668
+ <Input placeholder="株式会社…" />
669
+ </FormField>
670
+ {/* エラーの無いキー: バッグに tel_no が無いのでこのフィールドは無風 */}
671
+ <FormField name="tel_no" label="電話番号" helper="ハイフンなし">
672
+ <Input inputMode="numeric" placeholder="0312345678" />
673
+ </FormField>
674
+ </Form>
675
+ </CardContent>
676
+ </Card>
677
+
678
+ <Card>
679
+ <CardHeader>
680
+ <CardTitle level={2}>兄弟 Form の共有バッグ · FormErrorsProvider</CardTitle>
681
+ <CardDescription>
682
+ 編集画面を複数の Card+Form セクションに分けても、サーバーのエラーバッグは 1 つ。 各
683
+ Form に errors を渡す代わりに領域を FormErrorsProvider で包むと、errors を持たない
684
+ Form は外側のレジストリに参加し、全セクションの claim が 1 つの FormErrors
685
+ から差し引かれる。
686
+ </CardDescription>
687
+ </CardHeader>
688
+ <CardContent>
689
+ <FormErrorsProvider
690
+ errors={{
691
+ customer_nm: "顧客名は必須です",
692
+ mail_subject: "件名は必須です",
693
+ source_slip_id: "元伝票が存在しません",
694
+ }}
695
+ >
696
+ <Flex direction="col" gap="md" align="stretch">
697
+ <FormErrors />
698
+ {/* セクション A: errors を渡さない Form — 外側のレジストリに参加する */}
699
+ <Form layout="horizontal" labelWidth={140}>
700
+ <FormField name="customer_nm" label="顧客名" required>
701
+ <Input placeholder="株式会社…" />
702
+ </FormField>
703
+ </Form>
704
+ {/* セクション B: 別の Form でも claim は同じレジストリへ */}
705
+ <Form layout="horizontal" labelWidth={140}>
706
+ <FormField name="mail_subject" label="件名">
707
+ <Input placeholder="ご請求書の送付" />
708
+ </FormField>
709
+ </Form>
710
+ {/* source_slip_id はどのフィールドも claim しないのでバナーに残る */}
711
+ </Flex>
712
+ </FormErrorsProvider>
713
+ </CardContent>
714
+ </Card>
715
+
716
+ <Flex justify="end">
717
+ <Text tone="muted" size="sm">
718
+ 送信・pending・成功を含む完全な検証フローは Form → examples を参照。
719
+ </Text>
720
+ </Flex>
721
+ </Flex>
722
+ </PageContainer>
723
+ );
724
+ }