@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,262 @@
1
+ import { useEffect, useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import {
5
+ Command,
6
+ CommandEmpty,
7
+ CommandGroup,
8
+ CommandInput,
9
+ CommandItem,
10
+ CommandList,
11
+ } from "@godxjp/ui/data-entry";
12
+ import { Skeleton } from "@godxjp/ui/feedback";
13
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
14
+
15
+ /**
16
+ * Command — キーボードナビゲーション対応のコマンドパレット。
17
+ * 必ずツリー構造を守る: Command > CommandInput + CommandList > CommandGroup > CommandItem。
18
+ * CommandItem は必ず CommandList の内側に配置する。
19
+ * CommandEmpty は CommandList の内側に置くと自動で表示/非表示が切り替わる。
20
+ * Composed only from real @godxjp/ui components.
21
+ */
22
+
23
+ type Suggestion = { value: string; label: string };
24
+
25
+ const VENDOR_DIRECTORY: Suggestion[] = [
26
+ { value: "v-001", label: "株式会社山田商事" },
27
+ { value: "v-002", label: "山下電機株式会社" },
28
+ { value: "v-003", label: "やまと運輸サービス" },
29
+ { value: "v-004", label: "佐藤工業株式会社" },
30
+ { value: "v-005", label: "田中物産" },
31
+ ];
32
+
33
+ export default function Demo() {
34
+ // Card 1: grouped quick-select. Controlled `value` pre-highlights an item so the
35
+ // [aria-selected=true] accent is visible at rest, without keyboard interaction.
36
+ const [account, setAccount] = useState<string>("1020");
37
+
38
+ // Card 2: action palette — its own independent state (Rule #6).
39
+ const [action, setAction] = useState<string>("");
40
+
41
+ // Card 3: async server-side search. `shouldFilter={false}` + controlled input +
42
+ // an externally-fetched result list, staged mid-flight so the loading row renders.
43
+ const [query, setQuery] = useState<string>("やま");
44
+ const [loading, setLoading] = useState<boolean>(true);
45
+ const [results, setResults] = useState<Suggestion[]>([]);
46
+
47
+ useEffect(() => {
48
+ let active = true;
49
+ setLoading(true);
50
+ // Simulated server round-trip; the delay keeps the loading state observable at rest.
51
+ const timer = setTimeout(() => {
52
+ if (!active) return;
53
+ const q = query.trim();
54
+ setResults(q ? VENDOR_DIRECTORY.filter((v) => v.label.includes(q)) : []);
55
+ setLoading(false);
56
+ }, 1500);
57
+ return () => {
58
+ active = false;
59
+ clearTimeout(timer);
60
+ };
61
+ }, [query]);
62
+
63
+ return (
64
+ <PageContainer
65
+ title="Command"
66
+ subtitle="コマンドパレット / キーボードナビゲーション · cmdk ベース"
67
+ >
68
+ <Flex direction="col" gap="lg">
69
+ <Card>
70
+ <CardHeader>
71
+ <CardTitle level={2}>勘定科目クイック選択</CardTitle>
72
+ <CardDescription>
73
+ グループ化された科目リストをキーボードで素早く選択。 ハイライト中の科目を value
74
+ で制御(現在: {account || "未選択"})。
75
+ </CardDescription>
76
+ </CardHeader>
77
+ <CardContent>
78
+ <Command label="勘定科目クイック選択" loop value={account} onValueChange={setAccount}>
79
+ <CommandInput placeholder="科目名・コードで検索..." />
80
+ <CommandList>
81
+ <CommandEmpty>該当する科目がありません。</CommandEmpty>
82
+ <CommandGroup heading="資産">
83
+ <CommandItem value="1010" onSelect={setAccount}>
84
+ 1010 · 現金
85
+ </CommandItem>
86
+ <CommandItem value="1020" onSelect={setAccount}>
87
+ 1020 · 普通預金
88
+ </CommandItem>
89
+ <CommandItem value="1030" onSelect={setAccount}>
90
+ 1030 · 売掛金
91
+ </CommandItem>
92
+ <CommandItem value="1040" onSelect={setAccount}>
93
+ 1040 · 前払費用
94
+ </CommandItem>
95
+ </CommandGroup>
96
+ <CommandGroup heading="負債">
97
+ <CommandItem value="2010" onSelect={setAccount}>
98
+ 2010 · 買掛金
99
+ </CommandItem>
100
+ <CommandItem value="2020" onSelect={setAccount}>
101
+ 2020 · 未払費用
102
+ </CommandItem>
103
+ <CommandItem value="2030" onSelect={setAccount} disabled>
104
+ 2030 · 廃止済科目(選択不可)
105
+ </CommandItem>
106
+ </CommandGroup>
107
+ <CommandGroup heading="収益">
108
+ <CommandItem value="4010" onSelect={setAccount}>
109
+ 4010 · 売上高
110
+ </CommandItem>
111
+ <CommandItem value="4020" onSelect={setAccount}>
112
+ 4020 · 受取利息
113
+ </CommandItem>
114
+ </CommandGroup>
115
+ <CommandGroup heading="費用">
116
+ <CommandItem value="5010" onSelect={setAccount}>
117
+ 5010 · 売上原価
118
+ </CommandItem>
119
+ <CommandItem value="5020" onSelect={setAccount}>
120
+ 5020 · 給料手当
121
+ </CommandItem>
122
+ <CommandItem value="5030" onSelect={setAccount}>
123
+ 5030 · 旅費交通費
124
+ </CommandItem>
125
+ <CommandItem value="5040" onSelect={setAccount}>
126
+ 5040 · 通信費
127
+ </CommandItem>
128
+ </CommandGroup>
129
+ </CommandList>
130
+ </Command>
131
+ </CardContent>
132
+ </Card>
133
+
134
+ <Card>
135
+ <CardHeader>
136
+ <CardTitle level={2}>勤怠アクションパレット(Cmd+K 想定)</CardTitle>
137
+ <CardDescription>
138
+ ページ横断のクイックアクション。キーワードで絞り込み、Enter で実行。 実行:{" "}
139
+ {action || "なし"}
140
+ </CardDescription>
141
+ </CardHeader>
142
+ <CardContent>
143
+ <Command label="アクションパレット" loop vimBindings={false}>
144
+ <CommandInput placeholder="アクションを検索..." />
145
+ <CommandList>
146
+ <CommandEmpty>一致するアクションがありません。</CommandEmpty>
147
+ <CommandGroup heading="打刻">
148
+ <CommandItem
149
+ value="clock-in"
150
+ keywords={["出勤", "打刻", "開始"]}
151
+ onSelect={setAction}
152
+ >
153
+ 出勤打刻
154
+ </CommandItem>
155
+ <CommandItem
156
+ value="clock-out"
157
+ keywords={["退勤", "打刻", "終了"]}
158
+ onSelect={setAction}
159
+ >
160
+ 退勤打刻
161
+ </CommandItem>
162
+ <CommandItem value="break-start" keywords={["休憩", "開始"]} onSelect={setAction}>
163
+ 休憩開始
164
+ </CommandItem>
165
+ </CommandGroup>
166
+ <CommandGroup heading="申請">
167
+ <CommandItem
168
+ value="apply-leave"
169
+ keywords={["有給", "休暇", "申請"]}
170
+ onSelect={setAction}
171
+ >
172
+ 有給休暇申請
173
+ </CommandItem>
174
+ <CommandItem
175
+ value="apply-overtime"
176
+ keywords={["残業", "時間外", "申請"]}
177
+ onSelect={setAction}
178
+ >
179
+ 時間外勤務申請
180
+ </CommandItem>
181
+ <CommandItem
182
+ value="apply-remote"
183
+ keywords={["テレワーク", "在宅", "リモート", "申請"]}
184
+ onSelect={setAction}
185
+ >
186
+ テレワーク申請
187
+ </CommandItem>
188
+ </CommandGroup>
189
+ <CommandGroup heading="ナビゲーション">
190
+ <CommandItem
191
+ value="nav-dashboard"
192
+ keywords={["ダッシュボード", "トップ", "ホーム"]}
193
+ onSelect={setAction}
194
+ >
195
+ ダッシュボードへ移動
196
+ </CommandItem>
197
+ <CommandItem
198
+ value="nav-attendance"
199
+ keywords={["勤怠", "一覧", "確認"]}
200
+ onSelect={setAction}
201
+ >
202
+ 勤怠一覧へ移動
203
+ </CommandItem>
204
+ </CommandGroup>
205
+ </CommandList>
206
+ </Command>
207
+ </CardContent>
208
+ </Card>
209
+
210
+ <Card>
211
+ <CardHeader>
212
+ <CardTitle level={2}>取引先サーバー検索(非同期)</CardTitle>
213
+ <CardDescription>
214
+ shouldFilter={"{false}"} で内蔵フィルタを無効化し、入力値(value /
215
+ onValueChange)でサーバー検索した結果だけを表示。 取得中はローディング行、0 件は
216
+ CommandEmpty を表示。
217
+ </CardDescription>
218
+ </CardHeader>
219
+ <CardContent>
220
+ <Command label="取引先サーバー検索" loop shouldFilter={false}>
221
+ <CommandInput
222
+ placeholder="取引先名で検索..."
223
+ value={query}
224
+ onValueChange={setQuery}
225
+ />
226
+ <CommandList aria-busy={loading}>
227
+ {loading ? (
228
+ <Flex
229
+ direction="col"
230
+ gap="sm"
231
+ className="ui-command-group"
232
+ role="option"
233
+ aria-disabled="true"
234
+ aria-label="読み込み中"
235
+ aria-live="polite"
236
+ >
237
+ <Skeleton className="h-8 w-full" />
238
+ <Skeleton className="h-8 w-full" />
239
+ <Skeleton className="h-8 w-full" />
240
+ </Flex>
241
+ ) : (
242
+ <>
243
+ <CommandEmpty>該当する取引先が見つかりません。</CommandEmpty>
244
+ {results.length > 0 ? (
245
+ <CommandGroup heading="検索結果">
246
+ {results.map((v) => (
247
+ <CommandItem key={v.value} value={v.value} onSelect={() => undefined}>
248
+ {v.label}
249
+ </CommandItem>
250
+ ))}
251
+ </CommandGroup>
252
+ ) : null}
253
+ </>
254
+ )}
255
+ </CommandList>
256
+ </Command>
257
+ </CardContent>
258
+ </Card>
259
+ </Flex>
260
+ </PageContainer>
261
+ );
262
+ }
@@ -0,0 +1,170 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { FormField, Select } from "@godxjp/ui/data-entry";
5
+ import { Text } from "@godxjp/ui/general";
6
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
7
+ import type { SelectLoadParams, SelectLoadResult, SelectOption } from "@godxjp/ui/data-entry";
8
+
9
+ /**
10
+ * Country picker — a RECIPE, not a component. There is no CountrySelect in @godxjp/ui:
11
+ * a country picker is just a data-driven `Select`. The INTERNATIONAL-STANDARD way to build it:
12
+ * - values are ISO 3166-1 alpha-2 codes (you keep only the code array);
13
+ * - labels are derived at render time from CLDR via `Intl.DisplayNames(locale, {type:"region"})`,
14
+ * so they are correct AND localized — never hardcode country names per language;
15
+ * - do NOT use emoji regional-indicator flags (🇯🇵): they do not render on Windows / many Linux.
16
+ * If you want flags, ship an SVG set and draw it via `renderOption`.
17
+ * showSearch filters a short bundled list; loadOptions scales to a long remote list (server search +
18
+ * pagination), with selectedLabel covering a value whose option page hasn't loaded yet. name= submits
19
+ * the ISO code with the form. Real @godxjp/ui only.
20
+ */
21
+
22
+ // You bundle the ISO 3166-1 alpha-2 codes you support (there is no Intl enumerator for "all regions").
23
+ const COUNTRY_CODES = ["JP", "CN", "KR", "VN", "SG", "US", "GB", "DE", "FR", "AU"] as const;
24
+
25
+ const REGION_GROUP: Record<string, string> = {
26
+ JP: "アジア",
27
+ CN: "アジア",
28
+ KR: "アジア",
29
+ VN: "アジア",
30
+ SG: "アジア",
31
+ GB: "ヨーロッパ",
32
+ DE: "ヨーロッパ",
33
+ FR: "ヨーロッパ",
34
+ US: "その他",
35
+ AU: "その他",
36
+ };
37
+
38
+ // Localized display names come from CLDR. In a real app pass the active locale (e.g. from
39
+ // useAppContext().locale); here we render Japanese names to match the surrounding demo.
40
+ const regionNames = new Intl.DisplayNames(["ja"], { type: "region" });
41
+
42
+ const COUNTRIES: SelectOption[] = COUNTRY_CODES.map((code) => ({
43
+ value: code,
44
+ label: regionNames.of(code) ?? code,
45
+ group: REGION_GROUP[code],
46
+ }));
47
+
48
+ // A real picker over every country uses loadOptions: the server filters + paginates, the client
49
+ // never bundles the full list. We simulate latency so fetching/empty states are real, and filter
50
+ // the bundled set by localized name OR ISO code (server-side in production).
51
+ async function loadCountries({ query }: SelectLoadParams): Promise<SelectLoadResult> {
52
+ await new Promise((resolve) => setTimeout(resolve, 600));
53
+ const needle = query.trim().toLowerCase();
54
+ const options = needle
55
+ ? COUNTRIES.filter(
56
+ (c) => c.label.toLowerCase().includes(needle) || c.value.toLowerCase().includes(needle),
57
+ )
58
+ : COUNTRIES;
59
+ return { options, hasMore: false };
60
+ }
61
+
62
+ // renderOption draws an ISO-code chip + CLDR name. NOT an emoji flag (broken on Windows/Linux); a
63
+ // real product ships an SVG flag set and renders it here. Tokens only — no hex, no inline style.
64
+ function renderCountry(option: SelectOption) {
65
+ return (
66
+ <span className="flex items-center gap-2">
67
+ <Text size="xs" tone="muted" mono className="bg-muted rounded px-1.5 py-0.5">
68
+ {option.value}
69
+ </Text>
70
+ <Text truncate>{option.label}</Text>
71
+ </span>
72
+ );
73
+ }
74
+
75
+ export default function Demo() {
76
+ const [billing, setBilling] = useState("JP");
77
+ const [partner, setPartner] = useState("");
78
+ const [residence, setResidence] = useState("VN");
79
+
80
+ return (
81
+ <PageContainer
82
+ title="Country picker (recipe)"
83
+ subtitle="国選択は Select のレシピ · 専用コンポーネントは無い(値は ISO コード、名称は CLDR)"
84
+ >
85
+ <Flex direction="col" gap="lg">
86
+ <Card>
87
+ <CardHeader>
88
+ <CardTitle level={2}>請求先の国(必須・日本デフォルト・クリア不可)</CardTitle>
89
+ <CardDescription>
90
+ value は ISO 3166-1 alpha-2 コード、ラベルは
91
+ Intl.DisplayNames(CLDR)で生成する(国名を
92
+ ハードコードしない・絵文字フラグも使わない)。 showSearch で絞り込み、name
93
+ でフォーム送信。 必須項目なので clearable=false でクリア行を出さない。
94
+ </CardDescription>
95
+ </CardHeader>
96
+ <CardContent>
97
+ <FormField id="billing-country" label="請求先の国" required>
98
+ <Select
99
+ id="billing-country"
100
+ name="billingCountry"
101
+ value={billing}
102
+ onValueChange={setBilling}
103
+ showSearch
104
+ clearable={false}
105
+ searchPlaceholder="国名 / ISO コードで検索..."
106
+ emptyMessage="該当する国がありません"
107
+ options={COUNTRIES}
108
+ />
109
+ </FormField>
110
+ </CardContent>
111
+ </Card>
112
+
113
+ <Card>
114
+ <CardHeader>
115
+ <CardTitle level={2}>取引先の国(任意・クリア可)</CardTitle>
116
+ <CardDescription>
117
+ clearable(デフォルト true)で「指定なし」に戻せる。placeholder で空状態を案内する。
118
+ 任意項目なので未選択(プレースホルダー表示)を初期値にしている。
119
+ </CardDescription>
120
+ </CardHeader>
121
+ <CardContent>
122
+ <FormField id="partner-country" label="取引先の国">
123
+ <Select
124
+ id="partner-country"
125
+ name="partnerCountry"
126
+ value={partner}
127
+ onValueChange={setPartner}
128
+ showSearch
129
+ placeholder="国を選択..."
130
+ searchPlaceholder="国名 / ISO コードで検索..."
131
+ emptyMessage="該当する国がありません"
132
+ options={COUNTRIES}
133
+ />
134
+ </FormField>
135
+ </CardContent>
136
+ </Card>
137
+
138
+ <Card>
139
+ <CardHeader>
140
+ <CardTitle level={2}>居住国(loadOptions・遠隔リスト・SVG フラグ枠)</CardTitle>
141
+ <CardDescription>
142
+ 全世界の長いリストは options を同梱せず loadOptions でサーバー検索+ページングする。
143
+ 読み込み中は loadingMessage、0 件は emptyMessage を出す。selectedLabel は値の option
144
+ が まだ読み込まれていないときの表示名。renderOption で ISO
145
+ コードチップ+国名を描画(絵文字 フラグは使わず、実運用では SVG フラグを差し込む)。
146
+ </CardDescription>
147
+ </CardHeader>
148
+ <CardContent>
149
+ <FormField id="residence-country" label="居住国">
150
+ <Select
151
+ id="residence-country"
152
+ name="residenceCountry"
153
+ value={residence}
154
+ onValueChange={setResidence}
155
+ showSearch
156
+ loadOptions={loadCountries}
157
+ renderOption={renderCountry}
158
+ selectedLabel={regionNames.of(residence) ?? residence}
159
+ placeholder="国を選択..."
160
+ searchPlaceholder="国名 / ISO コードで検索..."
161
+ loadingMessage="国を読み込み中..."
162
+ emptyMessage="該当する国がありません"
163
+ />
164
+ </FormField>
165
+ </CardContent>
166
+ </Card>
167
+ </Flex>
168
+ </PageContainer>
169
+ );
170
+ }
@@ -0,0 +1,191 @@
1
+ import { useState } from "react";
2
+ import { ja } from "date-fns/locale";
3
+
4
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
5
+ import { DatePicker, FormField } from "@godxjp/ui/data-entry";
6
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
7
+
8
+ /**
9
+ * DatePicker — WAI-ARIA date combobox with a real typeable ISO-8601 input.
10
+ * Always give it a `name` for form submission. Use `fromDate`/`toDate` to
11
+ * constrain the selectable range. Never hand-roll a date input + calendar.
12
+ * Composed only from real @godxjp/ui components.
13
+ */
14
+ export default function Demo() {
15
+ const [issueDate, setIssueDate] = useState<Date | undefined>(new Date(2026, 0, 15));
16
+ const [dueDate, setDueDate] = useState<Date | undefined>(undefined);
17
+ const [closingDate, setClosingDate] = useState<Date | undefined>(undefined);
18
+ const [meetingDate, setMeetingDate] = useState<Date | undefined>(new Date(2026, 5, 25));
19
+ const [settlementDate, setSettlementDate] = useState<Date | undefined>(undefined);
20
+
21
+ return (
22
+ <PageContainer
23
+ title="DatePicker"
24
+ subtitle="日付入力 · ISO-8601 タイプ入力 + カレンダーポップオーバー"
25
+ >
26
+ <Flex direction="col" gap="lg">
27
+ <Card>
28
+ <CardHeader>
29
+ <CardTitle level={2}>基本 (controlled)</CardTitle>
30
+ <CardDescription>
31
+ value + onValueChange で制御。name= を指定すると ISO yyyy-MM-dd でフォーム送信される。
32
+ 入力欄に直接タイプでき、カレンダーと同期。フォーカスを外すと正規の ISO
33
+ 形式に整形され、 解釈できない入力は元の値へ復帰する。
34
+ </CardDescription>
35
+ </CardHeader>
36
+ <CardContent>
37
+ <FormField id="issue-date" label="発行日" required>
38
+ <DatePicker
39
+ id="issue-date"
40
+ name="issue_date"
41
+ value={issueDate}
42
+ onValueChange={setIssueDate}
43
+ />
44
+ </FormField>
45
+ </CardContent>
46
+ </Card>
47
+
48
+ <Card>
49
+ <CardHeader>
50
+ <CardTitle level={2}>fromDate で過去日を無効化</CardTitle>
51
+ <CardDescription>
52
+ 支払期限など、今日以降しか選べない場合に fromDate=&#123;new Date(2026, 0, 1)&#125;
53
+ で制限。
54
+ </CardDescription>
55
+ </CardHeader>
56
+ <CardContent>
57
+ <FormField id="due-date" label="支払期限">
58
+ <DatePicker
59
+ id="due-date"
60
+ name="due_date"
61
+ value={dueDate}
62
+ onValueChange={setDueDate}
63
+ fromDate={new Date(2026, 0, 1)}
64
+ />
65
+ </FormField>
66
+ </CardContent>
67
+ </Card>
68
+
69
+ <Card>
70
+ <CardHeader>
71
+ <CardTitle level={2}>fromDate + toDate で範囲を制限</CardTitle>
72
+ <CardDescription>決算締め日など、選択可能期間を会計年度内に絞る場合。</CardDescription>
73
+ </CardHeader>
74
+ <CardContent>
75
+ <FormField id="closing-date" label="締め日">
76
+ <DatePicker
77
+ id="closing-date"
78
+ name="closing_date"
79
+ value={closingDate}
80
+ onValueChange={setClosingDate}
81
+ fromDate={new Date(2026, 3, 1)}
82
+ toDate={new Date(2027, 2, 31)}
83
+ />
84
+ </FormField>
85
+ </CardContent>
86
+ </Card>
87
+
88
+ <Card>
89
+ <CardHeader>
90
+ <CardTitle level={2}>disabled 状態</CardTitle>
91
+ <CardDescription>確定済み伝票など編集不可フィールドに使用。</CardDescription>
92
+ </CardHeader>
93
+ <CardContent>
94
+ <FormField id="posted-date" label="転記日">
95
+ <DatePicker
96
+ id="posted-date"
97
+ name="posted_date"
98
+ value={new Date(2026, 2, 31)}
99
+ disabled
100
+ />
101
+ </FormField>
102
+ </CardContent>
103
+ </Card>
104
+
105
+ <Card>
106
+ <CardHeader>
107
+ <CardTitle level={2}>defaultValue (uncontrolled)</CardTitle>
108
+ <CardDescription>
109
+ value/onValueChange を渡さず defaultValue で初期値だけ与える非制御モード。状態は
110
+ コンポーネント内部で保持され、name= でそのままフォーム送信できる。
111
+ </CardDescription>
112
+ </CardHeader>
113
+ <CardContent>
114
+ <FormField id="entry-date" label="起票日">
115
+ <DatePicker id="entry-date" name="entry_date" defaultValue={new Date(2026, 0, 31)} />
116
+ </FormField>
117
+ </CardContent>
118
+ </Card>
119
+
120
+ <Card>
121
+ <CardHeader>
122
+ <CardTitle level={2}>locale で暦の言語を切替</CardTitle>
123
+ <CardDescription>
124
+ locale={"{ja}"} を渡すとカレンダーの曜日・月名が日本語表示になる。値は ISO-8601
125
+ のまま不変で、表示のみ各 locale に追従する。
126
+ </CardDescription>
127
+ </CardHeader>
128
+ <CardContent>
129
+ <FormField id="meeting-date" label="取締役会開催日">
130
+ <DatePicker
131
+ id="meeting-date"
132
+ name="meeting_date"
133
+ value={meetingDate}
134
+ onValueChange={setMeetingDate}
135
+ locale={ja}
136
+ />
137
+ </FormField>
138
+ </CardContent>
139
+ </Card>
140
+
141
+ <Card>
142
+ <CardHeader>
143
+ <CardTitle level={2}>error 状態 (aria-invalid)</CardTitle>
144
+ <CardDescription>
145
+ FormField の error= を指定すると aria-invalid と role=&quot;alert&quot;
146
+ のエラーメッセージが付与される。必須日付の未入力や範囲外選択の検証結果を提示する。
147
+ </CardDescription>
148
+ </CardHeader>
149
+ <CardContent>
150
+ <FormField
151
+ id="settlement-date"
152
+ label="決算日"
153
+ required
154
+ error="決算日は会計年度内の日付を入力してください。"
155
+ >
156
+ <DatePicker
157
+ id="settlement-date"
158
+ name="settlement_date"
159
+ value={settlementDate}
160
+ onValueChange={setSettlementDate}
161
+ fromDate={new Date(2026, 3, 1)}
162
+ toDate={new Date(2027, 2, 31)}
163
+ />
164
+ </FormField>
165
+ </CardContent>
166
+ </Card>
167
+
168
+ <Card>
169
+ <CardHeader>
170
+ <CardTitle level={2}>フッター操作 (showToday / showClose)</CardTitle>
171
+ <CardDescription>
172
+ showToday は今日を選択して閉じる。showClose は選択せずに閉じる。
173
+ </CardDescription>
174
+ </CardHeader>
175
+ <CardContent>
176
+ <FormField id="visit-date" label="来訪日">
177
+ <DatePicker
178
+ id="visit-date"
179
+ name="visit_date"
180
+ value={meetingDate}
181
+ onValueChange={setMeetingDate}
182
+ showToday
183
+ showClose
184
+ />
185
+ </FormField>
186
+ </CardContent>
187
+ </Card>
188
+ </Flex>
189
+ </PageContainer>
190
+ );
191
+ }