@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,110 @@
1
+ /**
2
+ * Legal copy fixtures for the LegalDocumentShell pages.
3
+ *
4
+ * DATA ONLY (a `.ts` module, never a `.tsx` "kit") — the pages compose the real
5
+ * `@godxjp/ui` primitives themselves, so a consumer can copy any page verbatim.
6
+ * All legal text is CONSUMER-owned; the shell only receives it through `sections`.
7
+ */
8
+
9
+ export type LegalSectionFixture = {
10
+ id: string;
11
+ title: string;
12
+ paragraphs: string[];
13
+ };
14
+
15
+ /** Canonical JA terms-of-service document (SCR-005 shape). */
16
+ export const TERMS_JA: LegalSectionFixture[] = [
17
+ {
18
+ id: "acceptance",
19
+ title: "第1条(本規約への同意)",
20
+ paragraphs: [
21
+ "本規約は、GodX 株式会社(以下「当社」といいます)が提供する各種サービス(以下「本サービス」といいます)の利用条件を定めるものです。利用者は、本サービスを利用することにより、本規約のすべての条項に同意したものとみなされます。",
22
+ "当社は、必要と判断した場合には、利用者に事前に通知することなく本規約を変更することがあります。変更後の本規約は、当社所定のウェブサイトに掲示された時点から効力を生じるものとします。",
23
+ ],
24
+ },
25
+ {
26
+ id: "accounts",
27
+ title: "第2条(アカウントの管理)",
28
+ paragraphs: [
29
+ "利用者は、自己の責任において、本サービスのアカウント情報を適切に管理するものとします。利用者は、いかなる場合にも、アカウントを第三者に譲渡または貸与することはできません。",
30
+ "アカウント情報が第三者によって使用されたことによって生じた損害について、当社に故意または重大な過失がある場合を除き、当社は一切の責任を負いません。",
31
+ ],
32
+ },
33
+ {
34
+ id: "prohibited",
35
+ title: "第3条(禁止事項)",
36
+ paragraphs: [
37
+ "利用者は、本サービスの利用にあたり、法令または公序良俗に違反する行為、当社もしくは第三者の知的財産権を侵害する行為、本サービスの運営を妨害するおそれのある行為を行ってはなりません。",
38
+ "当社は、利用者が前項に違反したと判断した場合、事前の通知なく、当該利用者に対して本サービスの全部または一部の利用を停止することができます。",
39
+ ],
40
+ },
41
+ {
42
+ id: "data-retention",
43
+ title: "第4条(データの保持期間)",
44
+ paragraphs: [
45
+ "当社は、会計関連法令および犯罪収益移転防止法に基づき、取引記録を取引終了日から7年間保持します。保持期間の経過後、当社は速やかに当該記録を削除または匿名化します。",
46
+ "利用者は、いつでも自己の個人データの開示、訂正または削除を請求することができます。ただし、法令上の保持義務が優先する場合はこの限りではありません。",
47
+ ],
48
+ },
49
+ {
50
+ id: "third-party",
51
+ title: "第5条(第三者サービスの利用)",
52
+ paragraphs: [
53
+ "本サービスは、決済、本人確認、通知配信などの目的で第三者のサービスを利用することがあります。当該第三者サービスの利用にあたっては、当該第三者が定める利用条件が別途適用されます。",
54
+ ],
55
+ },
56
+ {
57
+ id: "disclaimer",
58
+ title: "第6条(免責事項)",
59
+ paragraphs: [
60
+ "当社は、本サービスに事実上または法律上の瑕疵がないことを明示的にも黙示的にも保証しておりません。当社は、本サービスに起因して利用者に生じたあらゆる損害について、当社の故意または重過失による場合を除き、一切の責任を負いません。",
61
+ ],
62
+ },
63
+ {
64
+ id: "governing-law",
65
+ title: "第7条(準拠法および管轄裁判所)",
66
+ paragraphs: [
67
+ "本規約の解釈にあたっては、日本法を準拠法とします。本サービスに関して紛争が生じた場合には、東京地方裁判所を第一審の専属的合意管轄裁判所とします。",
68
+ ],
69
+ },
70
+ {
71
+ id: "contact",
72
+ title: "第8条(お問い合わせ窓口)",
73
+ paragraphs: [
74
+ "本規約に関するお問い合わせは、当社所定のお問い合わせフォームまたは legal@example.com までご連絡ください。",
75
+ ],
76
+ },
77
+ ];
78
+
79
+ /**
80
+ * Mixed-script wrapping fixture: the same document rendered with deliberately hostile
81
+ * line-breaking material in JA (no spaces / kinsoku), EN (long compounds + a very long URL)
82
+ * and VI (diacritic-heavy words that must never break mid-word).
83
+ */
84
+ export const WRAPPING_MIXED: LegalSectionFixture[] = [
85
+ {
86
+ id: "ja-kinsoku",
87
+ title: "日本語の長文セクション(禁則処理・行分割の確認)",
88
+ paragraphs: [
89
+ "当社は、個人情報の保護に関する法律その他の関係法令等を遵守し、利用者の個人情報を適正に取り扱うとともに、個人情報の漏えい、滅失または毀損の防止その他の個人情報の安全管理のために必要かつ適切な措置を講じるものとします。",
90
+ "「特定個人情報等」「要配慮個人情報」「仮名加工情報」「匿名加工情報」——これらの用語は、いずれも個人情報保護法に定義される意味を有し、句読点や括弧が行頭に来ないよう禁則処理が適用されます。",
91
+ ],
92
+ },
93
+ {
94
+ id: "en-long-compounds",
95
+ title:
96
+ "2. Cross-border data transfers, sub-processor notifications and telecommunications-infrastructure obligations",
97
+ paragraphs: [
98
+ "The Controller acknowledges that the Processor may engage sub-processors established outside the European Economic Area, provided that an adequacy decision, standard contractual clauses, or another transfer mechanism recognised under Chapter V of the General Data Protection Regulation is in place.",
99
+ "The current sub-processor register is published at https://example.com/legal/sub-processors/register?revision=2026-04-01&format=machine-readable and is updated at least thirty calendar days before any addition takes effect.",
100
+ ],
101
+ },
102
+ {
103
+ id: "vi-dau-thanh",
104
+ title: "3. Quyền riêng tư và nghĩa vụ bảo mật thông tin của người dùng",
105
+ paragraphs: [
106
+ "Chúng tôi chỉ thu thập những thông tin thực sự cần thiết để cung cấp dịch vụ, và tuyệt đối không chia sẻ dữ liệu cá nhân của bạn với bên thứ ba khi chưa nhận được sự đồng ý rõ ràng bằng văn bản.",
107
+ "Người dùng có quyền yêu cầu truy cập, chỉnh sửa hoặc xoá dữ liệu cá nhân của mình bất cứ lúc nào, trừ trường hợp pháp luật hiện hành quy định nghĩa vụ lưu trữ bắt buộc đối với dữ liệu đó.",
108
+ ],
109
+ },
110
+ ];
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: Viewport 1440x900
3
+ viewport: 1440x900
4
+ ---
5
+
6
+ Reference desktop geometry. The shell is wider than 56rem, so the contents render as a **sticky rail**
7
+ on the start side — spanning the header, body and footer rows — beside a 46rem measure-capped
8
+ document column.
9
+
10
+ Scroll the frame: the active contents entry tracks the reading line (`aria-current="location"` + the
11
+ leading marker + a heavier weight), and the rail stays pinned at
12
+ `--legal-document-toc-inset-block-start`.
@@ -0,0 +1,83 @@
1
+ import { useState } from "react";
2
+ import { CenteredShell, Flex, LegalDocumentShell, Topbar } from "@godxjp/ui/layout";
3
+ import { Button, Logo, Text } from "@godxjp/ui/general";
4
+ import { AppSettingPicker } from "@godxjp/ui/navigation";
5
+
6
+ import { TERMS_JA } from "../_data";
7
+
8
+ /**
9
+ * Viewport fixture — 1440×900 (desktop).
10
+ *
11
+ * Reference geometry: the shell is wider than 56rem, so the contents become a STICKY rail on the
12
+ * start side, spanning the header / body / footer rows, beside a 46rem measure-capped column.
13
+ * The rail stays in view for the whole scroll; the active entry tracks the reading line.
14
+ */
15
+ export default function Demo() {
16
+ const [activeSection, setActiveSection] = useState("acceptance");
17
+
18
+ return (
19
+ <CenteredShell
20
+ width="lg"
21
+ topbar={
22
+ <Topbar
23
+ start={
24
+ <Flex align="center" gap="sm">
25
+ <Logo glyph="G" />
26
+ <Text weight="medium">GodX ID</Text>
27
+ </Flex>
28
+ }
29
+ end={<AppSettingPicker kind="locale" />}
30
+ />
31
+ }
32
+ footer={
33
+ <Text size="xs" tone="muted">
34
+ 2026 GodX 株式会社
35
+ </Text>
36
+ }
37
+ >
38
+ <LegalDocumentShell
39
+ title="利用規約"
40
+ version="2.4"
41
+ effectiveDate="2026-04-01"
42
+ summary="本規約は、GodX ID および連携する各サービスの利用条件を定めるものです。ご利用の前に必ずお読みください。"
43
+ contentsLabel="目次"
44
+ activeSection={activeSection}
45
+ onActiveSectionChange={setActiveSection}
46
+ sections={TERMS_JA.map((section) => ({
47
+ id: section.id,
48
+ title: section.title,
49
+ content: (
50
+ <Flex direction="col" gap="sm">
51
+ {section.paragraphs.map((paragraph) => (
52
+ <Text as="p" key={paragraph}>
53
+ {paragraph}
54
+ </Text>
55
+ ))}
56
+ </Flex>
57
+ ),
58
+ }))}
59
+ documentNavigation={
60
+ <Flex direction="col" gap="xs" role="group" aria-label="法的文書">
61
+ <Button variant="secondary" size="sm" fullWidth aria-current="page">
62
+ 利用規約
63
+ </Button>
64
+ <Button variant="ghost" size="sm" fullWidth>
65
+ プライバシーポリシー
66
+ </Button>
67
+ <Button variant="ghost" size="sm" fullWidth>
68
+ Cookie ポリシー
69
+ </Button>
70
+ </Flex>
71
+ }
72
+ footerAction={
73
+ <Flex gap="sm" wrap>
74
+ <Button size="sm">同意する</Button>
75
+ <Button size="sm" variant="outline">
76
+ PDF をダウンロード
77
+ </Button>
78
+ </Flex>
79
+ }
80
+ />
81
+ </CenteredShell>
82
+ );
83
+ }
@@ -0,0 +1,22 @@
1
+ ---
2
+ title: Viewport 390x844
3
+ viewport: 390x844
4
+ ---
5
+
6
+ ## Documented mobile behaviour
7
+
8
+ Below the **56rem** container threshold the shell collapses to one column and the DOM order is
9
+ exactly the reading order:
10
+
11
+ 1. document header (`h1` · version · `<time>` effective date · summary)
12
+ 2. **contents** — a static compact block
13
+ 3. the sections
14
+ 4. `footerAction`
15
+
16
+ The rail is **deliberately not sticky and not height-capped** at this size: pinning a 8-item contents
17
+ list on a 390×844 screen costs more vertical space than it saves, and a height-capped inner scroller
18
+ inside a page scroller is a known touch-scroll trap. The entries stay real anchors with the same
19
+ `--legal-document-scroll-offset` and the same focus handoff, so tapping one jumps to — and focuses —
20
+ the section.
21
+
22
+ Nothing here is a media query: the same rules apply to a 56rem-narrow pane on a large screen.
@@ -0,0 +1,70 @@
1
+ import { useState } from "react";
2
+ import { CenteredShell, Flex, LegalDocumentShell, Topbar } from "@godxjp/ui/layout";
3
+ import { Button, Logo, Text } from "@godxjp/ui/general";
4
+
5
+ import { TERMS_JA } from "../_data";
6
+
7
+ /**
8
+ * Viewport fixture — 390×844 (mobile).
9
+ *
10
+ * Below the 56rem container threshold the shell collapses to ONE column and the DOM order is what
11
+ * you read: document header → contents → sections → footer actions.
12
+ *
13
+ * The contents rail is deliberately **static** here — not sticky and not height-capped — so a phone
14
+ * never loses vertical space to pinned chrome. The entries are still real anchors with the same
15
+ * scroll offset and focus handoff, so tapping one jumps to (and focuses) the section.
16
+ */
17
+ export default function Demo() {
18
+ const [activeSection, setActiveSection] = useState("acceptance");
19
+
20
+ return (
21
+ <CenteredShell
22
+ width="lg"
23
+ topbar={
24
+ <Topbar
25
+ start={
26
+ <Flex align="center" gap="sm">
27
+ <Logo glyph="G" />
28
+ <Text weight="medium">GodX ID</Text>
29
+ </Flex>
30
+ }
31
+ />
32
+ }
33
+ footer={
34
+ <Text size="xs" tone="muted">
35
+ 2026 GodX 株式会社
36
+ </Text>
37
+ }
38
+ >
39
+ <LegalDocumentShell
40
+ title="利用規約"
41
+ version="2.4"
42
+ effectiveDate="2026-04-01"
43
+ summary="本規約は、GodX ID および連携する各サービスの利用条件を定めるものです。"
44
+ contentsLabel="目次"
45
+ activeSection={activeSection}
46
+ onActiveSectionChange={setActiveSection}
47
+ sections={TERMS_JA.map((section) => ({
48
+ id: section.id,
49
+ title: section.title,
50
+ content: (
51
+ <Flex direction="col" gap="sm">
52
+ {section.paragraphs.map((paragraph) => (
53
+ <Text as="p" key={paragraph}>
54
+ {paragraph}
55
+ </Text>
56
+ ))}
57
+ </Flex>
58
+ ),
59
+ }))}
60
+ footerAction={
61
+ <Flex gap="sm" wrap>
62
+ <Button size="sm" fullWidth>
63
+ 同意する
64
+ </Button>
65
+ </Flex>
66
+ }
67
+ />
68
+ </CenteredShell>
69
+ );
70
+ }
@@ -0,0 +1,3 @@
1
+ --- title: Viewport 1024x900 viewport: 1024x900 ---
2
+
3
+ Nothing overflows horizontally and **no consumer CSS changes** between 1440 and 1024 — the shell's own container query does the work.
@@ -0,0 +1,84 @@
1
+ import { useState } from "react";
2
+ import { CenteredShell, Flex, LegalDocumentShell, Topbar } from "@godxjp/ui/layout";
3
+ import { Button, Logo, Text } from "@godxjp/ui/general";
4
+ import { AppSettingPicker } from "@godxjp/ui/navigation";
5
+
6
+ import { TERMS_JA } from "../_data";
7
+
8
+ /**
9
+ * Viewport fixture — 1024×900 (tablet / small laptop).
10
+ *
11
+ * Still above the 56rem container threshold, so the sticky rail is kept and only the document
12
+ * column narrows: the rail track is fixed (`--legal-document-toc-width`) while the measure track is
13
+ * `minmax(0, 46rem)`. Nothing overflows horizontally, and no consumer CSS changes between 1440 and
14
+ * 1024 — the shell's own container query does the work.
15
+ */
16
+ export default function Demo() {
17
+ const [activeSection, setActiveSection] = useState("acceptance");
18
+
19
+ return (
20
+ <CenteredShell
21
+ width="lg"
22
+ topbar={
23
+ <Topbar
24
+ start={
25
+ <Flex align="center" gap="sm">
26
+ <Logo glyph="G" />
27
+ <Text weight="medium">GodX ID</Text>
28
+ </Flex>
29
+ }
30
+ end={<AppSettingPicker kind="locale" />}
31
+ />
32
+ }
33
+ footer={
34
+ <Text size="xs" tone="muted">
35
+ 2026 GodX 株式会社
36
+ </Text>
37
+ }
38
+ >
39
+ <LegalDocumentShell
40
+ title="利用規約"
41
+ version="2.4"
42
+ effectiveDate="2026-04-01"
43
+ summary="本規約は、GodX ID および連携する各サービスの利用条件を定めるものです。ご利用の前に必ずお読みください。"
44
+ contentsLabel="目次"
45
+ activeSection={activeSection}
46
+ onActiveSectionChange={setActiveSection}
47
+ sections={TERMS_JA.map((section) => ({
48
+ id: section.id,
49
+ title: section.title,
50
+ content: (
51
+ <Flex direction="col" gap="sm">
52
+ {section.paragraphs.map((paragraph) => (
53
+ <Text as="p" key={paragraph}>
54
+ {paragraph}
55
+ </Text>
56
+ ))}
57
+ </Flex>
58
+ ),
59
+ }))}
60
+ documentNavigation={
61
+ <Flex direction="col" gap="xs" role="group" aria-label="法的文書">
62
+ <Button variant="secondary" size="sm" fullWidth aria-current="page">
63
+ 利用規約
64
+ </Button>
65
+ <Button variant="ghost" size="sm" fullWidth>
66
+ プライバシーポリシー
67
+ </Button>
68
+ <Button variant="ghost" size="sm" fullWidth>
69
+ Cookie ポリシー
70
+ </Button>
71
+ </Flex>
72
+ }
73
+ footerAction={
74
+ <Flex gap="sm" wrap>
75
+ <Button size="sm">同意する</Button>
76
+ <Button size="sm" variant="outline">
77
+ PDF をダウンロード
78
+ </Button>
79
+ </Flex>
80
+ }
81
+ />
82
+ </CenteredShell>
83
+ );
84
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: Wrapping JA / EN / VI
3
+ viewport: 1440x900
4
+ ---
5
+
6
+ One document, three scripts, deliberately hostile line-breaking material.
7
+
8
+ | Script | Hazard | Rule that handles it |
9
+ | ------ | ------------------------------------------- | ---------------------------------------------------------- |
10
+ | JA | no spaces; punctuation may not start a line | `line-break: strict` (kinsoku) |
11
+ | EN | long compounds and a query-string URL | `overflow-wrap: break-word` — breaks those, and only those |
12
+ | VI | diacritic-heavy words | `word-break: normal` — "nghĩa" is never split mid-word |
13
+
14
+ All three read at `--legal-document-body-line-height` (1.8) inside the 46rem measure, and a long `h2`
15
+ wraps within the measure while keeping `--legal-document-section-title-gap` to its body.
16
+
17
+ Resize the frame down to 390px: the rules are width-independent, so nothing changes except the
18
+ column count.
@@ -0,0 +1,61 @@
1
+ import { CenteredShell, Flex, LegalDocumentShell, Topbar } from "@godxjp/ui/layout";
2
+ import { Button, Logo, Text } from "@godxjp/ui/general";
3
+
4
+ import { WRAPPING_MIXED } from "../_data";
5
+
6
+ /**
7
+ * Wrapping fixture — long JA / EN / VI sections.
8
+ *
9
+ * The same document rendered with deliberately hostile line-breaking material:
10
+ *
11
+ * - **JA** — no spaces at all; `line-break: strict` applies kinsoku so a 、。」 never starts a line.
12
+ * - **EN** — very long compounds and a query-string URL; `overflow-wrap: break-word` breaks those
13
+ * (and only those) rather than pushing a horizontal scrollbar onto the page.
14
+ * - **VI** — diacritic-heavy words; `word-break: normal` keeps them whole, so "nghĩa" is never split.
15
+ *
16
+ * Heading rhythm holds too: a very long `h2` wraps inside the measure and keeps the
17
+ * `--legal-document-section-title-gap` to its body. Resize the frame to check every width.
18
+ */
19
+ export default function Demo() {
20
+ return (
21
+ <CenteredShell
22
+ width="lg"
23
+ topbar={
24
+ <Topbar
25
+ start={
26
+ <Flex align="center" gap="sm">
27
+ <Logo glyph="G" />
28
+ <Text weight="medium">GodX ID</Text>
29
+ </Flex>
30
+ }
31
+ />
32
+ }
33
+ >
34
+ <LegalDocumentShell
35
+ title="Data Processing Agreement · データ処理契約 · Thoả thuận xử lý dữ liệu"
36
+ version="1.12"
37
+ effectiveDate="2026-04-01"
38
+ summary="A single document carrying Japanese, English and Vietnamese sections. The wrapping, kinsoku and heading rhythm must hold in all three at every width."
39
+ contentsLabel="Contents"
40
+ sections={WRAPPING_MIXED.map((section) => ({
41
+ id: section.id,
42
+ title: section.title,
43
+ content: (
44
+ <Flex direction="col" gap="sm">
45
+ {section.paragraphs.map((paragraph) => (
46
+ <Text as="p" key={paragraph}>
47
+ {paragraph}
48
+ </Text>
49
+ ))}
50
+ </Flex>
51
+ ),
52
+ }))}
53
+ footerAction={
54
+ <Button size="sm" variant="outline">
55
+ Download PDF
56
+ </Button>
57
+ }
58
+ />
59
+ </CenteredShell>
60
+ );
61
+ }
@@ -0,0 +1,51 @@
1
+ --- title: Overview viewport: 1440x900 ---
2
+
3
+ The long-form **legal / policy document** surface — terms of service, privacy policy, DPA, cookie policy, SLA, EULA. It renders semantic `article` / `nav` / `section` landmarks and **real anchors**, while every word of legal text stays owned by the consumer (`sections`).
4
+
5
+ ## What the shell owns (so no app re-implements it)
6
+
7
+ | Capability | Behaviour |
8
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
9
+ | Readable measure | `--legal-document-measure-max-width` (46rem) caps the header, the body and the footer at every viewport. |
10
+ | Sticky contents rail | At **≥56rem of shell width** the contents pin beside a measure-capped column and span the whole scroll. |
11
+ | Compact/mobile rail | Below 56rem the shell is one column: header → contents → sections → footer. The rail is **static** — never pinned, never capped. |
12
+ | Scroll spy | An `IntersectionObserver` marks the section at the reading line `aria-current="location"` (+ a marker + a weight — never colour alone). |
13
+ | Hash navigation | `#section-id` on arrival selects that section; activating an entry rewrites the hash with `history.replaceState` (Back is never hijacked). |
14
+ | Scroll offset | `scroll-margin-block-start: var(--legal-document-scroll-offset)` — a jump lands below sticky chrome with no offset arithmetic. |
15
+ | Focus handoff | The target `<section tabIndex={-1}>` takes focus (`preventScroll`) with a **visible ring**, so keyboard users arrive inside it. |
16
+ | Reduced motion | The smooth scroll degrades to an instant jump under `prefers-reduced-motion: reduce`. |
17
+ | i18n | `effectiveDate` takes **ISO 8601** in and is rendered with `Intl.DateTimeFormat` in the active locale, inside `<time dateTime>`. |
18
+
19
+ ## Breakpoint is a CONTAINER query, not a viewport query
20
+
21
+ Dropped into a narrow pane on a 1440px screen it correctly stays single-column; given a wide pane on a small screen it can split. See the three viewport fixtures under **Examples**.
22
+
23
+ ## API
24
+
25
+ ```tsx
26
+ <LegalDocumentShell
27
+ title="利用規約"
28
+ version="2.4"
29
+ effectiveDate="2026-04-01" // ISO 8601 in → Intl.DateTimeFormat out
30
+ summary={summary}
31
+ contentsLabel="目次"
32
+ sections={sections} // { id, title, content }[]
33
+ activeSection={activeSection} // controlled …
34
+ onActiveSectionChange={setActiveSection} // … pair; omit both for uncontrolled
35
+ documentNavigation={switcher} // rail slot, above the contents
36
+ footerAction={actions} // below the last section
37
+ />
38
+ ```
39
+
40
+ `defaultActiveSection` gives the uncontrolled form (defaults to the first section).
41
+
42
+ ## Theming
43
+
44
+ Every value is a `--legal-document-*` component token — the measure, the rail width/offset, the section rhythm, the body leading, the active-entry colours (role-mirror knobs, so a scoped `[data-tenant]` / `.dark` override reaches them).
45
+
46
+ ```css
47
+ --legal-document-toc-border: 1px solid hsl(var(--border));
48
+ --legal-document-header-border: 1px solid hsl(var(--border));
49
+ ```
50
+
51
+ A consumer needs **no** `className` and no `.legal-*` CSS.
@@ -0,0 +1,101 @@
1
+ import { useState } from "react";
2
+ import { CenteredShell, Flex, LegalDocumentShell, Topbar } from "@godxjp/ui/layout";
3
+ import { Button, Logo, Text } from "@godxjp/ui/general";
4
+ import { AppSettingPicker } from "@godxjp/ui/navigation";
5
+
6
+ import { TERMS_JA } from "./_data";
7
+
8
+ /**
9
+ * LegalDocumentShell — the long-form legal/policy document surface (terms, privacy, DPA, cookie
10
+ * policy, SLA) with a table of contents.
11
+ *
12
+ * This is the canonical hosted legal screen: a `CenteredShell` (brand bar + locale picker + page
13
+ * footer) whose column holds the document. The shell owns the geometry AND the behaviour — sticky
14
+ * contents rail at ≥56rem, scroll-spy `aria-current`, hash deep links with a token-driven scroll
15
+ * offset, focus handoff into the target section, reduced-motion-aware scrolling. All legal text is
16
+ * consumer-owned and arrives through `sections`.
17
+ *
18
+ * Shown here: controlled `activeSection` / `onActiveSectionChange`, `version` + ISO `effectiveDate`
19
+ * (formatted with `Intl.DateTimeFormat`), `summary`, `contentsLabel`, the `documentNavigation` rail
20
+ * slot and the `footerAction` slot. Composed only from real @godxjp/ui components — zero custom CSS.
21
+ */
22
+
23
+ const DOCUMENTS = [
24
+ { id: "terms", label: "利用規約" },
25
+ { id: "privacy", label: "プライバシーポリシー" },
26
+ { id: "cookies", label: "Cookie ポリシー" },
27
+ ];
28
+
29
+ export default function Demo() {
30
+ const [documentId, setDocumentId] = useState("terms");
31
+ const [activeSection, setActiveSection] = useState("acceptance");
32
+
33
+ return (
34
+ <CenteredShell
35
+ width="lg"
36
+ topbar={
37
+ <Topbar
38
+ start={
39
+ <Flex align="center" gap="sm">
40
+ <Logo glyph="G" />
41
+ <Text weight="medium">GodX ID</Text>
42
+ </Flex>
43
+ }
44
+ end={<AppSettingPicker kind="locale" />}
45
+ />
46
+ }
47
+ footer={
48
+ <Text size="xs" tone="muted">
49
+ 2026 GodX 株式会社
50
+ </Text>
51
+ }
52
+ >
53
+ <LegalDocumentShell
54
+ title="利用規約"
55
+ version="2.4"
56
+ effectiveDate="2026-04-01"
57
+ summary="本規約は、GodX ID および連携する各サービスの利用条件を定めるものです。ご利用の前に必ずお読みください。"
58
+ contentsLabel="目次"
59
+ sections={TERMS_JA.map((section) => ({
60
+ id: section.id,
61
+ title: section.title,
62
+ content: (
63
+ <Flex direction="col" gap="sm">
64
+ {section.paragraphs.map((paragraph) => (
65
+ <Text as="p" key={paragraph}>
66
+ {paragraph}
67
+ </Text>
68
+ ))}
69
+ </Flex>
70
+ ),
71
+ }))}
72
+ activeSection={activeSection}
73
+ onActiveSectionChange={setActiveSection}
74
+ documentNavigation={
75
+ <Flex direction="col" gap="xs" role="group" aria-label="法的文書">
76
+ {DOCUMENTS.map((document) => (
77
+ <Button
78
+ key={document.id}
79
+ variant={document.id === documentId ? "secondary" : "ghost"}
80
+ size="sm"
81
+ fullWidth
82
+ aria-current={document.id === documentId ? "page" : undefined}
83
+ onClick={() => setDocumentId(document.id)}
84
+ >
85
+ {document.label}
86
+ </Button>
87
+ ))}
88
+ </Flex>
89
+ }
90
+ footerAction={
91
+ <Flex gap="sm" wrap>
92
+ <Button size="sm">同意する</Button>
93
+ <Button size="sm" variant="outline">
94
+ PDF をダウンロード
95
+ </Button>
96
+ </Flex>
97
+ }
98
+ />
99
+ </CenteredShell>
100
+ );
101
+ }