@godxjp/ui 19.1.0 → 19.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/README.md +25 -128
  2. package/dist/app/theme-axes.d.ts +4 -15
  3. package/dist/app/timezones.d.ts +1 -4
  4. package/dist/components/charts/area-chart.d.ts +2 -3
  5. package/dist/components/charts/bar-chart.d.ts +2 -3
  6. package/dist/components/charts/chart-frame.d.ts +7 -16
  7. package/dist/components/charts/chart-summary.d.ts +2 -2
  8. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  9. package/dist/components/charts/index.d.ts +1 -6
  10. package/dist/components/data-display/badge.d.ts +20 -14
  11. package/dist/components/data-display/badge.js +18 -4
  12. package/dist/components/data-display/card.d.ts +21 -41
  13. package/dist/components/data-display/carousel.d.ts +1 -2
  14. package/dist/components/data-display/code-block.d.ts +4 -0
  15. package/dist/components/data-display/code-block.js +24 -0
  16. package/dist/components/data-display/data-table.d.ts +15 -37
  17. package/dist/components/data-display/data-table.js +1 -3
  18. package/dist/components/data-display/descriptions.d.ts +2 -6
  19. package/dist/components/data-display/descriptions.js +0 -2
  20. package/dist/components/data-display/index.d.ts +4 -0
  21. package/dist/components/data-display/index.js +4 -0
  22. package/dist/components/data-display/list-row.d.ts +3 -22
  23. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  24. package/dist/components/data-display/progress.d.ts +1 -1
  25. package/dist/components/data-display/prose.d.ts +4 -0
  26. package/dist/components/data-display/prose.js +20 -0
  27. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  28. package/dist/components/data-display/table.d.ts +20 -80
  29. package/dist/components/data-display/table.js +0 -3
  30. package/dist/components/data-display/timeline.d.ts +3 -5
  31. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  32. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  33. package/dist/components/data-entry/calendar.d.ts +3 -2
  34. package/dist/components/data-entry/calendar.js +58 -3
  35. package/dist/components/data-entry/command-palette.d.ts +8 -22
  36. package/dist/components/data-entry/date-picker.d.ts +4 -5
  37. package/dist/components/data-entry/date-picker.js +6 -1
  38. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  39. package/dist/components/data-entry/date-range-picker.js +8 -3
  40. package/dist/components/data-entry/form-errors.d.ts +7 -18
  41. package/dist/components/data-entry/form-field.js +1 -5
  42. package/dist/components/data-entry/form.d.ts +1 -9
  43. package/dist/components/data-entry/input.d.ts +16 -14
  44. package/dist/components/data-entry/input.js +3 -0
  45. package/dist/components/data-entry/month-picker.js +2 -2
  46. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  47. package/dist/components/data-entry/month-range-picker.js +2 -2
  48. package/dist/components/data-entry/number-input.d.ts +1 -5
  49. package/dist/components/data-entry/number-input.js +1 -0
  50. package/dist/components/data-entry/radio.js +0 -1
  51. package/dist/components/data-entry/search-select.d.ts +2 -4
  52. package/dist/components/data-entry/select.d.ts +11 -6
  53. package/dist/components/data-entry/select.js +4 -2
  54. package/dist/components/data-entry/switch.js +0 -1
  55. package/dist/components/data-entry/textarea.d.ts +10 -16
  56. package/dist/components/data-entry/time-picker.d.ts +3 -5
  57. package/dist/components/data-entry/upload-types.d.ts +1 -5
  58. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  59. package/dist/components/feedback/dialog.d.ts +6 -15
  60. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  61. package/dist/components/feedback/sheet.d.ts +3 -10
  62. package/dist/components/feedback/sheet.js +1 -1
  63. package/dist/components/feedback/sonner.js +2 -3
  64. package/dist/components/general/activity.d.ts +4 -30
  65. package/dist/components/general/button.js +1 -10
  66. package/dist/components/general/logo.d.ts +6 -28
  67. package/dist/components/general/reveal.d.ts +3 -9
  68. package/dist/components/general/typography.d.ts +1 -3
  69. package/dist/components/layout/account-chip.d.ts +8 -0
  70. package/dist/components/layout/account-chip.js +45 -0
  71. package/dist/components/layout/auth-divider.d.ts +2 -9
  72. package/dist/components/layout/auth-shell.d.ts +1 -14
  73. package/dist/components/layout/breadcrumb.d.ts +1 -5
  74. package/dist/components/layout/centered-shell.d.ts +4 -18
  75. package/dist/components/layout/error-surface.d.ts +11 -28
  76. package/dist/components/layout/error-surface.js +4 -1
  77. package/dist/components/layout/index.d.ts +2 -0
  78. package/dist/components/layout/index.js +2 -0
  79. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  80. package/dist/components/layout/master-detail.d.ts +2 -18
  81. package/dist/components/layout/page-container.js +0 -1
  82. package/dist/components/layout/responsive-grid.d.ts +6 -1
  83. package/dist/components/layout/responsive-grid.js +9 -2
  84. package/dist/components/layout/service-role-panel.d.ts +7 -19
  85. package/dist/components/layout/sidebar.d.ts +5 -27
  86. package/dist/components/layout/sidebar.js +0 -1
  87. package/dist/components/layout/split-pane.d.ts +0 -7
  88. package/dist/components/layout/topbar.d.ts +1 -14
  89. package/dist/components/navigation/app-setting-picker.js +1 -3
  90. package/dist/components/navigation/filter-bar.d.ts +1 -6
  91. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  92. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  93. package/dist/components/navigation/tabs.js +4 -8
  94. package/dist/components/query/data-state.d.ts +2 -2
  95. package/dist/components/ui/credential-reveal.d.ts +1 -4
  96. package/dist/components/ui/hover-card.d.ts +1 -2
  97. package/dist/components/ui/separator.d.ts +2 -15
  98. package/dist/components/ui/toggle-group.d.ts +1 -5
  99. package/dist/components/ui/toggle.d.ts +6 -31
  100. package/dist/email/brand-mark.d.ts +6 -34
  101. package/dist/email/color.d.ts +7 -17
  102. package/dist/email/geometry.d.ts +4 -8
  103. package/dist/email/index.d.ts +4 -48
  104. package/dist/email/inline-style.d.ts +3 -9
  105. package/dist/email/urgency.d.ts +2 -7
  106. package/dist/form/form-context.d.ts +2 -5
  107. package/dist/form/form-root.d.ts +1 -2
  108. package/dist/i18n/messages/en.json +4 -0
  109. package/dist/i18n/messages/ja.json +4 -0
  110. package/dist/i18n/messages/vi.json +4 -0
  111. package/dist/inertia/index.d.ts +2 -10
  112. package/dist/lib/control-styles.d.ts +10 -21
  113. package/dist/lib/control-styles.js +4 -6
  114. package/dist/lib/datetime/format-date.d.ts +1 -4
  115. package/dist/lib/field-a11y.d.ts +11 -68
  116. package/dist/lib/field-a11y.js +0 -1
  117. package/dist/lib/format.d.ts +4 -8
  118. package/dist/lib/hooks.d.ts +6 -12
  119. package/dist/lib/permission-grid.d.ts +3 -18
  120. package/dist/lib/query-error.d.ts +3 -3
  121. package/dist/props/components/app.prop.d.ts +15 -38
  122. package/dist/props/components/charts.prop.d.ts +2 -3
  123. package/dist/props/components/data-display.prop.d.ts +55 -72
  124. package/dist/props/components/data-entry.prop.d.ts +35 -40
  125. package/dist/props/components/form.prop.d.ts +2 -6
  126. package/dist/props/components/general.prop.d.ts +11 -27
  127. package/dist/props/components/layout.prop.d.ts +89 -260
  128. package/dist/props/components/navigation.prop.d.ts +27 -42
  129. package/dist/props/registry.d.ts +36 -1
  130. package/dist/props/registry.js +45 -1
  131. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  132. package/dist/props/vocabulary/index.d.ts +1 -1
  133. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  134. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  135. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  136. package/dist/styles/alert-layout.css +1 -32
  137. package/dist/styles/badge-layout.css +19 -18
  138. package/dist/styles/base.css +14 -113
  139. package/dist/styles/card-layout.css +6 -128
  140. package/dist/styles/chart-layout.css +2 -17
  141. package/dist/styles/control.css +380 -458
  142. package/dist/styles/core.css +21 -0
  143. package/dist/styles/data-display-layout.css +175 -94
  144. package/dist/styles/data-entry-layout.css +0 -45
  145. package/dist/styles/density.css +1 -30
  146. package/dist/styles/dialog-layout.css +5 -69
  147. package/dist/styles/focus-ring.css +13 -87
  148. package/dist/styles/fonts.css +1 -31
  149. package/dist/styles/form-layout.css +7 -91
  150. package/dist/styles/index.css +2 -20
  151. package/dist/styles/layout.css +38 -456
  152. package/dist/styles/logo-layout.css +1 -35
  153. package/dist/styles/motion.css +3 -42
  154. package/dist/styles/navigation-layout.css +3 -50
  155. package/dist/styles/shell-layout.css +37 -403
  156. package/dist/styles/table-layout.css +16 -274
  157. package/dist/styles/text-layout.css +7 -21
  158. package/dist/styles/toggle.css +1 -23
  159. package/dist/theme/dxs.canonical.css +1 -55
  160. package/dist/theme/example.service.css +1 -26
  161. package/dist/theme/famgia.service.css +5 -15
  162. package/dist/tokens/axes.css +3 -40
  163. package/dist/tokens/base.css +1 -4
  164. package/dist/tokens/components/activity.css +6 -42
  165. package/dist/tokens/components/badge.css +12 -13
  166. package/dist/tokens/components/banner.css +4 -9
  167. package/dist/tokens/components/card.css +32 -88
  168. package/dist/tokens/components/chart.css +9 -26
  169. package/dist/tokens/components/control.css +37 -222
  170. package/dist/tokens/components/data-display.css +28 -79
  171. package/dist/tokens/components/data-entry.css +5 -19
  172. package/dist/tokens/components/descriptions.css +7 -27
  173. package/dist/tokens/components/email.css +38 -84
  174. package/dist/tokens/components/error-surface.css +2 -18
  175. package/dist/tokens/components/feedback.css +27 -124
  176. package/dist/tokens/components/form.css +13 -45
  177. package/dist/tokens/components/legal-document.css +16 -41
  178. package/dist/tokens/components/list-row.css +11 -36
  179. package/dist/tokens/components/logo.css +2 -57
  180. package/dist/tokens/components/navigation.css +16 -94
  181. package/dist/tokens/components/scroll-area.css +2 -18
  182. package/dist/tokens/components/separator.css +8 -30
  183. package/dist/tokens/components/sheet.css +3 -14
  184. package/dist/tokens/components/shell.css +53 -307
  185. package/dist/tokens/components/sidebar.css +5 -22
  186. package/dist/tokens/components/table.css +19 -140
  187. package/dist/tokens/components/toggle.css +3 -65
  188. package/dist/tokens/components/upload.css +7 -43
  189. package/dist/tokens/foundation.css +108 -383
  190. package/dist/tokens/semantic/layout.css +33 -207
  191. package/docs/CANONICAL-CONTRACTS.md +206 -0
  192. package/docs/COMPONENTS.md +157 -0
  193. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  194. package/docs/CONSUMER-RULES.md +14 -0
  195. package/docs/CUSTOMER-THEMING.md +162 -0
  196. package/docs/DATETIME.md +69 -0
  197. package/docs/DEVELOPMENT.md +173 -0
  198. package/docs/FORMS.md +143 -0
  199. package/docs/FRAME-A11Y-CI.md +267 -0
  200. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  201. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  202. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  203. package/docs/FRAME-COVERAGE.md +29 -0
  204. package/docs/PROPS-REGISTRY.md +61 -0
  205. package/docs/PROPS-VOCABULARY.md +100 -0
  206. package/docs/README.md +60 -0
  207. package/docs/REGISTRY.md +70 -0
  208. package/docs/SPACING.md +56 -0
  209. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  210. package/docs/TESTING.md +98 -0
  211. package/docs/TOKENS.md +347 -0
  212. package/docs/asset-modules.d.ts +46 -0
  213. package/docs/assets/cover-terrain.svg +6 -0
  214. package/docs/assets/portrait-amber.svg +5 -0
  215. package/docs/assets/portrait-clay.svg +5 -0
  216. package/docs/assets/portrait-indigo.svg +5 -0
  217. package/docs/assets/portrait-iris.svg +5 -0
  218. package/docs/assets/portrait-moss.svg +5 -0
  219. package/docs/assets/portrait-plum.svg +5 -0
  220. package/docs/assets/portrait-slate.svg +5 -0
  221. package/docs/charts/compact-bar-trend.tsx +328 -0
  222. package/docs/charts/size-tiers.tsx +192 -0
  223. package/docs/data-display/accordion.tsx +99 -0
  224. package/docs/data-display/avatar.tsx +355 -0
  225. package/docs/data-display/badge.tsx +283 -0
  226. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  227. package/docs/data-display/card/index.md +3 -0
  228. package/docs/data-display/card/index.tsx +285 -0
  229. package/docs/data-display/carousel.tsx +160 -0
  230. package/docs/data-display/charts.tsx +198 -0
  231. package/docs/data-display/code-block.tsx +90 -0
  232. package/docs/data-display/collapsible.tsx +162 -0
  233. package/docs/data-display/credential-reveal.tsx +145 -0
  234. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  235. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  236. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  237. package/docs/data-display/data-table/index.md +5 -0
  238. package/docs/data-display/data-table/index.tsx +295 -0
  239. package/docs/data-display/descriptions.tsx +143 -0
  240. package/docs/data-display/empty-state.tsx +164 -0
  241. package/docs/data-display/hover-card.tsx +181 -0
  242. package/docs/data-display/list-row.tsx +420 -0
  243. package/docs/data-display/permission-matrix.tsx +188 -0
  244. package/docs/data-display/popover-touch.tsx +27 -0
  245. package/docs/data-display/popover.tsx +246 -0
  246. package/docs/data-display/progress.tsx +84 -0
  247. package/docs/data-display/prose.tsx +105 -0
  248. package/docs/data-display/qr-code.tsx +68 -0
  249. package/docs/data-display/scroll-area.tsx +303 -0
  250. package/docs/data-display/service-launcher-card.tsx +145 -0
  251. package/docs/data-display/stat-card.tsx +99 -0
  252. package/docs/data-display/table.tsx +251 -0
  253. package/docs/data-display/timeline.tsx +112 -0
  254. package/docs/data-display/touch-actions.tsx +36 -0
  255. package/docs/data-display/tree-list.tsx +107 -0
  256. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  257. package/docs/data-entry/calendar.tsx +180 -0
  258. package/docs/data-entry/cascader.tsx +378 -0
  259. package/docs/data-entry/checkbox.tsx +256 -0
  260. package/docs/data-entry/color-picker.tsx +117 -0
  261. package/docs/data-entry/command-palette.tsx +179 -0
  262. package/docs/data-entry/command.tsx +262 -0
  263. package/docs/data-entry/country-picker-recipe.tsx +175 -0
  264. package/docs/data-entry/date-picker.tsx +191 -0
  265. package/docs/data-entry/date-range-picker.tsx +149 -0
  266. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  267. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  268. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  269. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  270. package/docs/data-entry/form-field/index.md +8 -0
  271. package/docs/data-entry/form-field/index.tsx +330 -0
  272. package/docs/data-entry/form-inertia.tsx +80 -0
  273. package/docs/data-entry/form-root.tsx +102 -0
  274. package/docs/data-entry/form.tsx +724 -0
  275. package/docs/data-entry/input-otp.tsx +231 -0
  276. package/docs/data-entry/input.tsx +114 -0
  277. package/docs/data-entry/label.tsx +100 -0
  278. package/docs/data-entry/month-picker.tsx +101 -0
  279. package/docs/data-entry/month-range-picker.tsx +115 -0
  280. package/docs/data-entry/number-input.tsx +240 -0
  281. package/docs/data-entry/password-input.tsx +102 -0
  282. package/docs/data-entry/password-strength.tsx +97 -0
  283. package/docs/data-entry/radio-group.tsx +95 -0
  284. package/docs/data-entry/rating.tsx +87 -0
  285. package/docs/data-entry/search-input.tsx +120 -0
  286. package/docs/data-entry/select-async-contracts.tsx +108 -0
  287. package/docs/data-entry/select-matrix.tsx +204 -0
  288. package/docs/data-entry/select.tsx +369 -0
  289. package/docs/data-entry/slider.tsx +130 -0
  290. package/docs/data-entry/switch.tsx +67 -0
  291. package/docs/data-entry/tag-input.tsx +108 -0
  292. package/docs/data-entry/textarea.tsx +209 -0
  293. package/docs/data-entry/time-picker.tsx +99 -0
  294. package/docs/data-entry/toggle-count.tsx +293 -0
  295. package/docs/data-entry/toggle-group.tsx +225 -0
  296. package/docs/data-entry/toggle.tsx +127 -0
  297. package/docs/data-entry/transfer.tsx +97 -0
  298. package/docs/data-entry/tree-select.tsx +204 -0
  299. package/docs/data-entry/upload.tsx +184 -0
  300. package/docs/feedback/alert-dialog.tsx +270 -0
  301. package/docs/feedback/alert.tsx +248 -0
  302. package/docs/feedback/banner.tsx +183 -0
  303. package/docs/feedback/danger-confirm.tsx +88 -0
  304. package/docs/feedback/dialog-touch.tsx +24 -0
  305. package/docs/feedback/dialog.tsx +193 -0
  306. package/docs/feedback/sheet.tsx +420 -0
  307. package/docs/feedback/skeleton.tsx +111 -0
  308. package/docs/feedback/toast.tsx +135 -0
  309. package/docs/feedback/tooltip.tsx +171 -0
  310. package/docs/feedback/two-factor-setup.tsx +68 -0
  311. package/docs/foundation/_email-specimen.ts +274 -0
  312. package/docs/foundation/colors.tsx +204 -0
  313. package/docs/foundation/density.tsx +232 -0
  314. package/docs/foundation/email-tokens.tsx +323 -0
  315. package/docs/foundation/radius-shadow.tsx +154 -0
  316. package/docs/foundation/spacing.tsx +211 -0
  317. package/docs/foundation/typography.tsx +147 -0
  318. package/docs/general/activity.tsx +224 -0
  319. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  320. package/docs/general/button/examples/form-actions.tsx +85 -0
  321. package/docs/general/button/examples/toolbar.tsx +160 -0
  322. package/docs/general/button/index.md +12 -0
  323. package/docs/general/button/index.tsx +211 -0
  324. package/docs/general/logo.tsx +131 -0
  325. package/docs/general/reveal.tsx +41 -0
  326. package/docs/general/typography.tsx +152 -0
  327. package/docs/layout/account-chip.tsx +72 -0
  328. package/docs/layout/admin-collection.tsx +122 -0
  329. package/docs/layout/app-shell.tsx +374 -0
  330. package/docs/layout/aspect-ratio.tsx +135 -0
  331. package/docs/layout/auth-account-summary.tsx +103 -0
  332. package/docs/layout/auth-divider.tsx +28 -0
  333. package/docs/layout/auth-footer.tsx +37 -0
  334. package/docs/layout/auth-identity.tsx +36 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  336. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  338. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  340. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  342. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  343. package/docs/layout/auth-recovery/index.md +140 -0
  344. package/docs/layout/auth-recovery/index.tsx +96 -0
  345. package/docs/layout/auth-shell-context.tsx +103 -0
  346. package/docs/layout/auth-shell-device.tsx +112 -0
  347. package/docs/layout/auth-shell-registration.tsx +335 -0
  348. package/docs/layout/auth-shell-variants.tsx +139 -0
  349. package/docs/layout/auth-shell.tsx +59 -0
  350. package/docs/layout/auth-stack.tsx +40 -0
  351. package/docs/layout/centered-shell.tsx +102 -0
  352. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  353. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  354. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  355. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  356. package/docs/layout/error-surface/index.md +153 -0
  357. package/docs/layout/error-surface/index.tsx +239 -0
  358. package/docs/layout/flex.tsx +266 -0
  359. package/docs/layout/legal-document-shell/_data.ts +110 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  361. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  363. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  365. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  367. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  368. package/docs/layout/legal-document-shell/index.md +51 -0
  369. package/docs/layout/legal-document-shell/index.tsx +101 -0
  370. package/docs/layout/master-detail.tsx +387 -0
  371. package/docs/layout/org-switcher.tsx +131 -0
  372. package/docs/layout/page-container.tsx +954 -0
  373. package/docs/layout/resizable-panel.tsx +419 -0
  374. package/docs/layout/responsive-grid.tsx +243 -0
  375. package/docs/layout/separator.tsx +327 -0
  376. package/docs/layout/service-role-panel.tsx +144 -0
  377. package/docs/layout/sidebar.tsx +609 -0
  378. package/docs/layout/split-pane.tsx +468 -0
  379. package/docs/layout/topbar.tsx +349 -0
  380. package/docs/navigation/app-setting-picker.tsx +142 -0
  381. package/docs/navigation/breadcrumb.tsx +135 -0
  382. package/docs/navigation/context-menu.tsx +123 -0
  383. package/docs/navigation/dropdown-menu.tsx +213 -0
  384. package/docs/navigation/filter-bar.tsx +227 -0
  385. package/docs/navigation/menubar.tsx +141 -0
  386. package/docs/navigation/navigation-menu.tsx +158 -0
  387. package/docs/navigation/pagination.tsx +241 -0
  388. package/docs/navigation/steps.tsx +265 -0
  389. package/docs/navigation/tabs-rtl.tsx +28 -0
  390. package/docs/navigation/tabs.tsx +314 -0
  391. package/docs/navigation/toolbar.tsx +339 -0
  392. package/docs/providers/app-provider.tsx +191 -0
  393. package/docs/providers/format-date.tsx +230 -0
  394. package/docs/query/button-refetch.tsx +160 -0
  395. package/docs/query/data-state.tsx +192 -0
  396. package/docs/query/infinite-query-state.tsx +93 -0
  397. package/docs/query/mutation-feedback.tsx +70 -0
  398. package/docs/query/prefetch-link.tsx +262 -0
  399. package/docs/query/touch-actions.tsx +68 -0
  400. package/docs/showcase/acme-portal.tsx +455 -0
  401. package/docs/showcase/acme-website.tsx +461 -0
  402. package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
  403. package/docs/showcase/case2-employee-me.tsx +444 -0
  404. package/docs/showcase/case3-approval-workflow.tsx +529 -0
  405. package/docs/showcase/case4-login.tsx +313 -0
  406. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  407. package/docs/showcase/case6-agency-handy.tsx +1113 -0
  408. package/docs/showcase/futurelastic-web.tsx +392 -0
  409. package/docs/showcase/org-switcher.tsx +313 -0
  410. package/docs/showcase/permission-matrix.tsx +346 -0
  411. package/docs/showcase/public-landing.tsx +210 -0
  412. package/docs/showcase/settings-account-sections.tsx +559 -0
  413. package/docs/showcase/settings-security-mfa.tsx +145 -0
  414. package/docs/showcase/table-approval-queue.tsx +199 -0
  415. package/docs/showcase/table-bulk-actions.tsx +460 -0
  416. package/docs/showcase/table-compact-kintone.tsx +438 -0
  417. package/docs/showcase/table-conditional-format.tsx +367 -0
  418. package/docs/showcase/table-crud-list.tsx +544 -0
  419. package/docs/showcase/table-density.tsx +347 -0
  420. package/docs/showcase/table-expandable-rows.tsx +480 -0
  421. package/docs/showcase/table-filter-chips.tsx +456 -0
  422. package/docs/showcase/table-footer-totals.tsx +314 -0
  423. package/docs/showcase/table-grouped-subtotals.tsx +391 -0
  424. package/docs/showcase/table-master-detail.tsx +484 -0
  425. package/docs/showcase/table-pagination.tsx +327 -0
  426. package/docs/showcase/table-states.tsx +366 -0
  427. package/docs/showcase/table-sticky-columns.tsx +376 -0
  428. package/docs/showcase/table-tree-rows.tsx +444 -0
  429. package/docs/showcase/table-view-tabs.tsx +488 -0
  430. package/package.json +9 -12
  431. package/scripts/_agent-setup.mjs +16 -2
  432. package/scripts/audit-hook.mjs +3 -13
  433. package/scripts/init-agent-kit.mjs +1 -14
  434. package/scripts/postinstall.mjs +12 -12
  435. package/scripts/ui-audit.mjs +93 -31
  436. package/scripts/visual-audit-rules.mjs +51 -7
  437. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,103 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { AuthAccountSummary, AuthStack, PageContainer } from "@godxjp/ui/layout";
3
+
4
+ /**
5
+ * AuthAccountSummary — compact signed-in identity row for hosted auth and device authorization.
6
+ *
7
+ * The row owns three things: the avatar (image, caller fallback, or the default person glyph),
8
+ * the account address, and exactly one ghost action. Everything else is consumer data.
9
+ *
10
+ * The address CLIPS with an ellipsis, so it declares its own line box rather than inheriting one
11
+ * (gh#254): a tight inherited line-height makes the clip box shorter than the font's ascent plus
12
+ * descent and shears Vietnamese tone marks and Latin descenders off, while the DOM text stays
13
+ * correct. The Vietnamese row below is the regression case for that.
14
+ */
15
+ export default function Demo() {
16
+ return (
17
+ <PageContainer
18
+ title="AuthAccountSummary"
19
+ subtitle="サインイン中のアカウント行(アバター・アドレス・単一アクション)"
20
+ >
21
+ <Card>
22
+ <CardHeader>
23
+ <CardTitle level={2}>アバターの3系統</CardTitle>
24
+ <CardDescription>
25
+ 画像、呼び出し側のフォールバック文字、既定の人物グリフ。いずれも装飾扱いで、読み上げ対象は
26
+ アドレスとアクションのみです。
27
+ </CardDescription>
28
+ </CardHeader>
29
+ <CardContent>
30
+ <AuthStack>
31
+ <AuthAccountSummary
32
+ email="hanako.yamada@example.co.jp"
33
+ avatarSrc="https://i.pravatar.cc/64?img=47"
34
+ actionLabel="アカウントを切り替える"
35
+ onAction={() => {}}
36
+ />
37
+ <AuthAccountSummary
38
+ email="taro.suzuki@example.co.jp"
39
+ avatarFallback="鈴"
40
+ actionLabel="アカウントを切り替える"
41
+ onAction={() => {}}
42
+ />
43
+ <AuthAccountSummary
44
+ email="operations@example.co.jp"
45
+ actionLabel="アカウントを切り替える"
46
+ onAction={() => {}}
47
+ />
48
+ </AuthStack>
49
+ </CardContent>
50
+ </Card>
51
+
52
+ <Card>
53
+ <CardHeader>
54
+ <CardTitle level={2}>無効状態</CardTitle>
55
+ <CardDescription>
56
+ アクションだけが無効になります。アドレスは引き続き選択・読み上げできます。
57
+ </CardDescription>
58
+ </CardHeader>
59
+ <CardContent>
60
+ <AuthStack>
61
+ <AuthAccountSummary
62
+ email="locked.account@example.co.jp"
63
+ actionLabel="切り替えできません"
64
+ onAction={() => {}}
65
+ disabled
66
+ />
67
+ </AuthStack>
68
+ </CardContent>
69
+ </Card>
70
+
71
+ <Card>
72
+ <CardHeader>
73
+ <CardTitle level={2}>長いアドレスと多言語</CardTitle>
74
+ <CardDescription>
75
+ 省略記号で切り詰めても、ベトナム語の声調記号とラテン文字のディセンダーが欠けないことを
76
+ 確認します。ホバーで全文をtitle属性から参照できます。
77
+ </CardDescription>
78
+ </CardHeader>
79
+ <CardContent>
80
+ <AuthStack>
81
+ <AuthAccountSummary
82
+ email="very.long.authoritative.account.address@example.enterprise.invalid"
83
+ actionLabel="アカウントを切り替える"
84
+ onAction={() => {}}
85
+ />
86
+ <AuthAccountSummary
87
+ email="phuong.nguyen.quynh@doanhnghiep.example.vn"
88
+ avatarFallback="Ph"
89
+ actionLabel="Chuyển đổi tài khoản"
90
+ onAction={() => {}}
91
+ />
92
+ <AuthAccountSummary
93
+ email="jennifer.pettigrew@enterprise-security.example.com"
94
+ avatarFallback="JP"
95
+ actionLabel="Switch account"
96
+ onAction={() => {}}
97
+ />
98
+ </AuthStack>
99
+ </CardContent>
100
+ </Card>
101
+ </PageContainer>
102
+ );
103
+ }
@@ -0,0 +1,28 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { AuthDivider, AuthStack, PageContainer } from "@godxjp/ui/layout";
3
+
4
+ /**
5
+ * AuthDivider — localized conjunction between equal separator rules. The label remains visible and
6
+ * centred under long Japanese, English and RTL content.
7
+ */
8
+ export default function Demo() {
9
+ return (
10
+ <PageContainer title="AuthDivider" subtitle="認証手段を分けるローカライズ済み区切り">
11
+ <Card>
12
+ <CardHeader>
13
+ <CardTitle level={2}>言語とcontent stress</CardTitle>
14
+ <CardDescription>区切り線はlabelの長さに応じて同じ比率で縮みます。</CardDescription>
15
+ </CardHeader>
16
+ <CardContent>
17
+ <AuthStack>
18
+ <AuthDivider label="または" />
19
+ <AuthDivider label="or continue with your organization account" />
20
+ <div dir="rtl">
21
+ <AuthDivider label="أو تابع باستخدام حساب المؤسسة" />
22
+ </div>
23
+ </AuthStack>
24
+ </CardContent>
25
+ </Card>
26
+ </PageContainer>
27
+ );
28
+ }
@@ -0,0 +1,37 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { Button } from "@godxjp/ui/general";
3
+ import { AuthFooter, AuthStack, PageContainer } from "@godxjp/ui/layout";
4
+
5
+ /**
6
+ * AuthFooter — shared hosted-identity legal line. Every item remains consumer-owned React content,
7
+ * allowing real links and locale controls without the layout component inventing navigation.
8
+ */
9
+ export default function Demo() {
10
+ return (
11
+ <PageContainer title="AuthFooter" subtitle="製品名 · 規約 · プライバシー · 言語">
12
+ <Card>
13
+ <CardHeader>
14
+ <CardTitle level={2}>認証画面の法務フッター</CardTitle>
15
+ <CardDescription>
16
+ localeは任意です。リンク先と遷移方法はconsumerが所有します。
17
+ </CardDescription>
18
+ </CardHeader>
19
+ <CardContent>
20
+ <AuthStack>
21
+ <AuthFooter
22
+ product="Acme Identity"
23
+ terms={<a href="#terms">利用規約</a>}
24
+ privacy={<a href="#privacy">プライバシー</a>}
25
+ locale={
26
+ <Button type="button" variant="ghost" size="sm">
27
+ 日本語
28
+ </Button>
29
+ }
30
+ />
31
+ <AuthFooter product="Godx ID" terms="Terms" privacy="Privacy" />
32
+ </AuthStack>
33
+ </CardContent>
34
+ </Card>
35
+ </PageContainer>
36
+ );
37
+ }
@@ -0,0 +1,36 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { AuthAccountSummary, AuthIdentity, AuthStack, PageContainer } from "@godxjp/ui/layout";
3
+
4
+ /**
5
+ * AuthIdentity — canonical identity title with optional relying-party request context. The
6
+ * requester line is consumer data and may be omitted for first-party authentication.
7
+ */
8
+ export default function Demo() {
9
+ return (
10
+ <PageContainer title="AuthIdentity" subtitle="ホストIDと依頼元サービスのコンテキスト">
11
+ <Card>
12
+ <CardHeader>
13
+ <CardTitle level={2}>依頼元あり・なし</CardTitle>
14
+ <CardDescription>
15
+ 外部サービスからの認証要求だけrequesterを表示し、通常ログインでは省略します。
16
+ </CardDescription>
17
+ </CardHeader>
18
+ <CardContent>
19
+ <AuthStack>
20
+ <AuthIdentity title="Godx IDにログイン" requester="勤怠管理が認証を要求しています" />
21
+ <AuthIdentity title="アカウントを確認" />
22
+ <AuthIdentity
23
+ title="Continue to Godx ID"
24
+ requester="Enterprise Security and Compliance Administration is requesting sign in"
25
+ />
26
+ <AuthAccountSummary
27
+ email="very.long.authoritative.account@example.enterprise.invalid"
28
+ actionLabel="アカウントを切り替える"
29
+ onAction={() => {}}
30
+ />
31
+ </AuthStack>
32
+ </CardContent>
33
+ </Card>
34
+ </PageContainer>
35
+ );
36
+ }
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Sign-in MFA challenge (5 states)
3
+ viewport: 1440x2000
4
+ ---
5
+
6
+ ## otp · otp/error · otp/loading · recovery-code · passkey-failure
7
+
8
+ This is the **sign-in challenge**. `TwoFactorSetup` is the **enrollment** Dialog (QR, manual key,
9
+ recovery-code output) — a challenge has no secret to reveal and no dialog to dismiss, it _is_ the
10
+ page. Reusing the enrollment dialog here is the anti-pattern this example exists to prevent.
11
+
12
+ ## Focus order (WAI-ARIA APG + WCAG 2.4.3)
13
+
14
+ DOM order **is** the task order, so no `tabindex` is needed anywhere:
15
+
16
+ 1. the code field — one `InputOTP` (or one `Input` for a recovery code)
17
+ 2. the primary action — `Button fullWidth`
18
+ 3. fallback A
19
+ 4. fallback B
20
+
21
+ The 6-slot row is **one field**, not six. `InputOTP` owns paste, arrow keys, backspace and the
22
+ caret, and exposes a single focus stop; six `Input`s would put six stops in the tab ring and break
23
+ paste of a 6-digit code — the single most common real-world MFA interaction.
24
+
25
+ The error message is rendered by `FormField error` with `role="alert"` and wired as
26
+ `aria-errormessage` on the field, which also carries `aria-invalid` — so a screen-reader user hears
27
+ "wrong code" without leaving the field, and sighted users get the destructive slot borders. State is
28
+ never signalled by colour alone (WCAG 1.4.1): the text is always there.
29
+
30
+ ## Loading
31
+
32
+ `<Button loading loadingText="検証中…">` keeps the button's box while it is pending, so the panel
33
+ never jumps mid-submit, and the input is `disabled` for the duration. The fallbacks are disabled
34
+ too — a second verification must not race the first.
35
+
36
+ ## Fallback row
37
+
38
+ `<Flex justify="between" gap="sm" wrap>` with two ghost buttons. The two fallbacks share one
39
+ horizontal row while the localized labels fit the panel and **wrap to a stack** when they do not —
40
+ a content-driven reflow, so it is correct for JA, EN and VI without a media query. See the
41
+ long-label example.
@@ -0,0 +1,254 @@
1
+ import { useState } from "react";
2
+
3
+ import { Alert, AlertDescription, AlertTitle } from "@godxjp/ui/feedback";
4
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
5
+ import { FormField, Input, InputOTP, InputOTPGroup, InputOTPSlot } from "@godxjp/ui/data-entry";
6
+ import { Button, Logo, Text } from "@godxjp/ui/general";
7
+ import { AuthFooter, AuthShell, AuthStack, Flex } from "@godxjp/ui/layout";
8
+ import { AppSettingPicker } from "@godxjp/ui/navigation";
9
+
10
+ /**
11
+ * SIGN-IN MFA CHALLENGE — the three canonical SCR-008 states plus the error / loading paths,
12
+ * stacked at the real 432px measure.
13
+ *
14
+ * This is the SIGN-IN challenge, not enrollment. `TwoFactorSetup` is the enrollment Dialog (QR /
15
+ * manual key / recovery output) and must never be reused here: a challenge has no secret to reveal
16
+ * and no dialog to dismiss — it IS the page.
17
+ *
18
+ * FOCUS ORDER is DOM order, and DOM order is the task order:
19
+ * 1. the code field (OTP row / recovery-code Input) 2. the primary action
20
+ * 3. fallback A 4. fallback B
21
+ * The OTP row is ONE field — `InputOTP` owns paste, arrow keys and the caret; six separate
22
+ * `Input`s would put six stops in the tab ring and break paste.
23
+ *
24
+ * State coverage: otp (idle) · otp ERROR (wrong code) · otp LOADING (verifying) · recovery-code ·
25
+ * passkey-failure. The first panel owns the standalone frame's single `level={1}` heading; the
26
+ * remaining state sections use `level={2}`. A real route renders ONE panel at `level={1}`.
27
+ */
28
+ export default function Demo() {
29
+ const [code, setCode] = useState("");
30
+ const [wrongCode, setWrongCode] = useState("140228");
31
+ const [pendingCode, setPendingCode] = useState("482915");
32
+ const [recoveryCode, setRecoveryCode] = useState("");
33
+
34
+ return (
35
+ <AuthShell
36
+ variant="canonical"
37
+ preset="account-recovery"
38
+ brand={
39
+ <Flex align="center" gap="sm">
40
+ <Logo mark="godx" tone="success" />
41
+ <Text weight="medium">GoDX ID</Text>
42
+ </Flex>
43
+ }
44
+ footer={
45
+ <AuthFooter
46
+ product="GoDX ID"
47
+ terms="利用規約"
48
+ privacy="プライバシー"
49
+ locale={<AppSettingPicker kind="locale" appearance="labeled" compact />}
50
+ />
51
+ }
52
+ >
53
+ <Flex direction="col" gap="lg">
54
+ <Text size="xs" tone="muted" mono>
55
+ 1 / 5 · otp · 認証アプリの 6 桁コード(1 行 6 スロット)
56
+ </Text>
57
+ <Card>
58
+ <CardHeader>
59
+ <CardTitle level={1}>二段階認証</CardTitle>
60
+ <CardDescription>
61
+ 認証アプリに表示されている 6 桁のコードを入力してください。
62
+ </CardDescription>
63
+ </CardHeader>
64
+ <CardContent>
65
+ <AuthStack>
66
+ <FormField id="mfa-otp-idle" label="確認コード" required>
67
+ <InputOTP maxLength={6} pattern="^[0-9]+$" value={code} onChange={setCode}>
68
+ <InputOTPGroup>
69
+ <InputOTPSlot index={0} />
70
+ <InputOTPSlot index={1} />
71
+ <InputOTPSlot index={2} />
72
+ <InputOTPSlot index={3} />
73
+ <InputOTPSlot index={4} />
74
+ <InputOTPSlot index={5} />
75
+ </InputOTPGroup>
76
+ </InputOTP>
77
+ </FormField>
78
+ <Button fullWidth>確認する</Button>
79
+ <Flex justify="between" gap="sm" wrap>
80
+ <Button variant="ghost" size="sm">
81
+ リカバリコードを使う
82
+ </Button>
83
+ <Button variant="ghost" size="sm">
84
+ パスキーで再試行
85
+ </Button>
86
+ </Flex>
87
+ </AuthStack>
88
+ </CardContent>
89
+ </Card>
90
+
91
+ <Text size="xs" tone="muted" mono>
92
+ 2 / 5 · otp(error)— コード不一致 · aria-invalid + role=alert
93
+ </Text>
94
+ <Card>
95
+ <CardHeader>
96
+ <CardTitle level={2}>二段階認証</CardTitle>
97
+ <CardDescription>
98
+ 認証アプリに表示されている 6 桁のコードを入力してください。
99
+ </CardDescription>
100
+ </CardHeader>
101
+ <CardContent>
102
+ <AuthStack>
103
+ <FormField
104
+ id="mfa-otp-error"
105
+ label="確認コード"
106
+ error="コードが正しくありません。残り 4 回入力できます。"
107
+ required
108
+ >
109
+ <InputOTP
110
+ maxLength={6}
111
+ pattern="^[0-9]+$"
112
+ value={wrongCode}
113
+ onChange={setWrongCode}
114
+ >
115
+ <InputOTPGroup>
116
+ <InputOTPSlot index={0} />
117
+ <InputOTPSlot index={1} />
118
+ <InputOTPSlot index={2} />
119
+ <InputOTPSlot index={3} />
120
+ <InputOTPSlot index={4} />
121
+ <InputOTPSlot index={5} />
122
+ </InputOTPGroup>
123
+ </InputOTP>
124
+ </FormField>
125
+ <Button fullWidth>確認する</Button>
126
+ <Flex justify="between" gap="sm" wrap>
127
+ <Button variant="ghost" size="sm">
128
+ リカバリコードを使う
129
+ </Button>
130
+ <Button variant="ghost" size="sm">
131
+ パスキーで再試行
132
+ </Button>
133
+ </Flex>
134
+ </AuthStack>
135
+ </CardContent>
136
+ </Card>
137
+
138
+ <Text size="xs" tone="muted" mono>
139
+ 3 / 5 · otp(loading)— 検証中 · 入力をロックし、ボタンの箱は動かさない
140
+ </Text>
141
+ <Card>
142
+ <CardHeader>
143
+ <CardTitle level={2}>二段階認証</CardTitle>
144
+ <CardDescription>コードを検証しています。しばらくお待ちください。</CardDescription>
145
+ </CardHeader>
146
+ <CardContent>
147
+ <AuthStack>
148
+ <FormField id="mfa-otp-loading" label="確認コード" required>
149
+ <InputOTP
150
+ disabled
151
+ maxLength={6}
152
+ pattern="^[0-9]+$"
153
+ value={pendingCode}
154
+ onChange={setPendingCode}
155
+ >
156
+ <InputOTPGroup>
157
+ <InputOTPSlot index={0} />
158
+ <InputOTPSlot index={1} />
159
+ <InputOTPSlot index={2} />
160
+ <InputOTPSlot index={3} />
161
+ <InputOTPSlot index={4} />
162
+ <InputOTPSlot index={5} />
163
+ </InputOTPGroup>
164
+ </InputOTP>
165
+ </FormField>
166
+ <Button fullWidth loading loadingText="検証中…">
167
+ 確認する
168
+ </Button>
169
+ <Flex justify="between" gap="sm" wrap>
170
+ <Button variant="ghost" size="sm" disabled>
171
+ リカバリコードを使う
172
+ </Button>
173
+ <Button variant="ghost" size="sm" disabled>
174
+ パスキーで再試行
175
+ </Button>
176
+ </Flex>
177
+ </AuthStack>
178
+ </CardContent>
179
+ </Card>
180
+
181
+ <Text size="xs" tone="muted" mono>
182
+ 4 / 5 · recovery-code · 一度きりのリカバリコード(1 つのテキスト入力)
183
+ </Text>
184
+ <Card>
185
+ <CardHeader>
186
+ <CardTitle level={2}>リカバリコードを入力</CardTitle>
187
+ <CardDescription>
188
+ 二段階認証の設定時に保存した、一度だけ使えるコードを入力してください。
189
+ </CardDescription>
190
+ </CardHeader>
191
+ <CardContent>
192
+ <AuthStack>
193
+ <FormField
194
+ id="mfa-recovery-code"
195
+ label="リカバリコード"
196
+ helper="ハイフンを含めて入力してください(例: 4f7c-92ab-30de)。"
197
+ required
198
+ >
199
+ <Input
200
+ autoComplete="one-time-code"
201
+ inputMode="text"
202
+ spellCheck={false}
203
+ placeholder="4f7c-92ab-30de"
204
+ value={recoveryCode}
205
+ onChange={(event) => setRecoveryCode(event.target.value)}
206
+ />
207
+ </FormField>
208
+ <Button fullWidth>確認する</Button>
209
+ <Flex justify="between" gap="sm" wrap>
210
+ <Button variant="ghost" size="sm">
211
+ 認証アプリに戻る
212
+ </Button>
213
+ <Button variant="ghost" size="sm">
214
+ パスキーで再試行
215
+ </Button>
216
+ </Flex>
217
+ </AuthStack>
218
+ </CardContent>
219
+ </Card>
220
+
221
+ <Text size="xs" tone="muted" mono>
222
+ 5 / 5 · passkey-failure · パスキー認証に失敗(destructive 通知 + 代替手段)
223
+ </Text>
224
+ <Card>
225
+ <CardHeader>
226
+ <CardTitle level={2}>パスキーで確認できませんでした</CardTitle>
227
+ <CardDescription>
228
+ このデバイスのパスキーを読み取れませんでした。別の方法で本人確認を続けられます。
229
+ </CardDescription>
230
+ </CardHeader>
231
+ <CardContent>
232
+ <AuthStack>
233
+ <Alert tone="destructive">
234
+ <AlertTitle>パスキーの認証がキャンセルされました</AlertTitle>
235
+ <AlertDescription>
236
+ デバイスのロック解除が完了しなかったか、対応するパスキーが見つかりませんでした。
237
+ </AlertDescription>
238
+ </Alert>
239
+ <Button fullWidth>パスキーで再試行</Button>
240
+ <Flex justify="between" gap="sm" wrap>
241
+ <Button variant="ghost" size="sm">
242
+ 認証アプリのコードを使う
243
+ </Button>
244
+ <Button variant="ghost" size="sm">
245
+ リカバリコードを使う
246
+ </Button>
247
+ </Flex>
248
+ </AuthStack>
249
+ </CardContent>
250
+ </Card>
251
+ </Flex>
252
+ </AuthShell>
253
+ );
254
+ }
@@ -0,0 +1,25 @@
1
+ --- title: Viewport 390x844 viewport: 390x844 ---
2
+
3
+ ## The 390 reference image is NOT a valid source
4
+
5
+ It overflows and crops horizontally: the two 432px panels are still laid out side by side. It shows no mobile route, no mobile gutter and no reflow, and it was **not traced**. Accepting its cropped overflow as "intended mobile behaviour" would ship a broken screen with a canonical signature on it, so the issue's own words apply: _a route-level mobile reference or an explicit responsive contract is required_.
6
+
7
+ What follows is that **explicit contract**, decided in the library and enforced by tokens + tests.
8
+
9
+ ## The contract at ≤ 30rem
10
+
11
+ | Aspect | Contract |
12
+ | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
13
+ | Page gutter | `--auth-shell-recovery-main-padding-mobile` = **15px inline** ⇒ panel `x=15, width=360` at a 390 viewport. |
14
+ | Why 15px | It is the canonical **Login** mobile gutter (`--auth-shell-canonical-main-padding-mobile`). Login → Recovery must not make the surface jump. |
15
+ | Panel measure | `min(100%, 27rem)`. 432px is a **max**-width, so the panel simply becomes 360px — it is never scaled, cropped or scrolled. |
16
+ | Card inset | Unchanged (24px, `--auth-shell-compact-card-inset`) ⇒ a **310px** content column. |
17
+ | OTP row | Stays **one row of 6 slots**: 6 × 36px = **216px** ≤ 310px. Slots are never shrunk and the row never scrolls. |
18
+ | Primary action | `Button fullWidth` — spans the panel at every width. |
19
+ | Fallback row | Wraps to a **stack** when the two localized labels exceed the content column; otherwise it stays one row. Content-driven, no media query. |
20
+ | Title/description | Stay inside the bordered surface; long JA/VI strings wrap inside the 310px column and grow the panel's height. |
21
+ | Vertical | The column stays centred; when the panel is taller than the viewport the shell scrolls from the top — the top of the panel is never clipped. |
22
+
23
+ ## Not defined here
24
+
25
+ Anything the reference could have specified but did not — a mobile-specific type ramp, a sticky bottom action bar, a full-bleed edge-to-edge panel — is **deliberately absent**. Inventing it would be fabricating a canonical. If SCR-008 later ships a real 390 route artboard and it disagrees with the table above, the fix is a token retune (or a new preset), not consumer CSS.
@@ -0,0 +1,82 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { FormField, InputOTP, InputOTPGroup, InputOTPSlot } from "@godxjp/ui/data-entry";
5
+ import { Button, Logo, Reveal, Text } from "@godxjp/ui/general";
6
+ import { AuthFooter, AuthShell, AuthStack, Flex } from "@godxjp/ui/layout";
7
+ import { AppSettingPicker } from "@godxjp/ui/navigation";
8
+
9
+ /**
10
+ * Viewport fixture — 390x844 (mobile). THE MOBILE CONTRACT, decided here.
11
+ *
12
+ * ⚠️ The 390 canonical reference supplied with gh#233 is a desktop 2x2 COMPOSITE that overflows and
13
+ * crops horizontally. It is not a route-level mobile artboard and it was NOT traced. The behaviour
14
+ * below is a decided, documented contract — see the Overview page.
15
+ *
16
+ * At <=30rem the `account-recovery` preset switches its page gutter to
17
+ * `--auth-shell-recovery-main-padding-mobile` (15px inline), so the panel is x=15, width=360 — the
18
+ * SAME page rhythm as the canonical Login flow, so moving from Login to Recovery on a phone never
19
+ * makes the surface jump. The panel keeps its full 24px card inset, giving a 310px content column;
20
+ * the 6-slot OTP row (6 x 36px = 216px) fits that column at every supported width with no scroll,
21
+ * no shrunken slots and no horizontal overflow.
22
+ */
23
+ export default function Demo() {
24
+ const [code, setCode] = useState("");
25
+
26
+ return (
27
+ <AuthShell
28
+ variant="canonical"
29
+ preset="account-recovery"
30
+ brand={
31
+ <Flex align="center" gap="sm">
32
+ <Logo mark="godx" tone="success" />
33
+ <Text weight="medium">GoDX ID</Text>
34
+ </Flex>
35
+ }
36
+ footer={
37
+ <AuthFooter
38
+ product="GoDX ID"
39
+ terms="利用規約"
40
+ privacy="プライバシー"
41
+ locale={<AppSettingPicker kind="locale" appearance="labeled" compact />}
42
+ />
43
+ }
44
+ >
45
+ <Reveal>
46
+ <Card>
47
+ <CardHeader>
48
+ <CardTitle level={1}>二段階認証</CardTitle>
49
+ <CardDescription>
50
+ 認証アプリに表示されている 6 桁のコードを入力してください。
51
+ </CardDescription>
52
+ </CardHeader>
53
+ <CardContent>
54
+ <AuthStack>
55
+ <FormField id="mfa-code-mobile" label="確認コード" required>
56
+ <InputOTP maxLength={6} pattern="^[0-9]+$" value={code} onChange={setCode}>
57
+ <InputOTPGroup>
58
+ <InputOTPSlot index={0} />
59
+ <InputOTPSlot index={1} />
60
+ <InputOTPSlot index={2} />
61
+ <InputOTPSlot index={3} />
62
+ <InputOTPSlot index={4} />
63
+ <InputOTPSlot index={5} />
64
+ </InputOTPGroup>
65
+ </InputOTP>
66
+ </FormField>
67
+ <Button fullWidth>確認する</Button>
68
+ <Flex justify="between" gap="sm" wrap>
69
+ <Button variant="ghost" size="sm">
70
+ リカバリコードを使う
71
+ </Button>
72
+ <Button variant="ghost" size="sm">
73
+ パスキーで再試行
74
+ </Button>
75
+ </Flex>
76
+ </AuthStack>
77
+ </CardContent>
78
+ </Card>
79
+ </Reveal>
80
+ </AuthShell>
81
+ );
82
+ }
@@ -0,0 +1,24 @@
1
+ --- title: Password recovery (4 states) viewport: 1440x1700 ---
2
+
3
+ ## request · sent · new-password · expired
4
+
5
+ One anatomy, four states. Nothing below the `Card` changes shape — only the **notice**, the **fields** and the copy:
6
+
7
+ | State | Notice | Fields | Primary | Fallback row |
8
+ | -------------- | -------------------------- | -------------------------------------------------- | ------------------------------------- | ------------------------------------- |
9
+ | `request` | — | email (`autoComplete="username"`) | send reset link | back to sign-in · contact support |
10
+ | `sent` | `Alert tone="success"` | — | resend (**disabled** during cooldown) | back to sign-in · use another address |
11
+ | `new-password` | — | new + confirm `PasswordInput` + `PasswordStrength` | update password | back to sign-in |
12
+ | `expired` | `Alert tone="destructive"` | — | request a new link | back to sign-in · contact support |
13
+
14
+ ## What is presentation and what is not
15
+
16
+ The panel renders **only** what the consumer passes it. It does **not** know reset semantics: no route, no token lifetime, no "is this link still valid" decision, no password policy. The `sent` panel prints the masked address the **server** sent (`h*****@example.co.jp`) — the library never reconstructs an identifier from an email.
17
+
18
+ ## Error, loading and disabled
19
+
20
+ - **Error** — `FormField error` puts `aria-invalid` + `aria-errormessage` on the control and renders the message with `role="alert"`. The confirm field above shows the canonical mismatch case. - **Disabled** — a resend cooldown is `<Button disabled>`. Never a hidden button: the affordance stays visible so the user knows resending is possible, just not yet. - **Loading** — `<Button loading loadingText="…">` (demonstrated in the MFA example).
21
+
22
+ ## Heading level
23
+
24
+ A real route renders **one** panel and its `CardTitle` is the page `h1`. The four panels are stacked here at `level={2}` under a caption line purely so the states can be compared at an identical measure — do not copy `level={2}` into a route that has no other heading.