@godxjp/ui 19.1.0 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) 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 +2 -12
  11. package/dist/components/data-display/card.d.ts +21 -41
  12. package/dist/components/data-display/carousel.d.ts +1 -2
  13. package/dist/components/data-display/code-block.d.ts +4 -0
  14. package/dist/components/data-display/code-block.js +24 -0
  15. package/dist/components/data-display/data-table.d.ts +15 -37
  16. package/dist/components/data-display/data-table.js +1 -3
  17. package/dist/components/data-display/descriptions.d.ts +2 -6
  18. package/dist/components/data-display/descriptions.js +0 -2
  19. package/dist/components/data-display/index.d.ts +4 -0
  20. package/dist/components/data-display/index.js +4 -0
  21. package/dist/components/data-display/list-row.d.ts +3 -22
  22. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  23. package/dist/components/data-display/progress.d.ts +1 -1
  24. package/dist/components/data-display/prose.d.ts +4 -0
  25. package/dist/components/data-display/prose.js +20 -0
  26. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  27. package/dist/components/data-display/table.d.ts +20 -80
  28. package/dist/components/data-display/table.js +0 -3
  29. package/dist/components/data-display/timeline.d.ts +3 -5
  30. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  31. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  32. package/dist/components/data-entry/calendar.d.ts +3 -2
  33. package/dist/components/data-entry/calendar.js +58 -3
  34. package/dist/components/data-entry/command-palette.d.ts +8 -22
  35. package/dist/components/data-entry/date-picker.d.ts +4 -5
  36. package/dist/components/data-entry/date-picker.js +6 -1
  37. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  38. package/dist/components/data-entry/date-range-picker.js +8 -3
  39. package/dist/components/data-entry/form-errors.d.ts +7 -18
  40. package/dist/components/data-entry/form-field.js +1 -5
  41. package/dist/components/data-entry/form.d.ts +1 -9
  42. package/dist/components/data-entry/input.d.ts +16 -14
  43. package/dist/components/data-entry/input.js +3 -0
  44. package/dist/components/data-entry/month-picker.js +2 -2
  45. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  46. package/dist/components/data-entry/month-range-picker.js +2 -2
  47. package/dist/components/data-entry/number-input.d.ts +1 -5
  48. package/dist/components/data-entry/number-input.js +1 -0
  49. package/dist/components/data-entry/radio.js +0 -1
  50. package/dist/components/data-entry/search-select.d.ts +2 -4
  51. package/dist/components/data-entry/select.d.ts +11 -6
  52. package/dist/components/data-entry/select.js +4 -2
  53. package/dist/components/data-entry/switch.js +0 -1
  54. package/dist/components/data-entry/textarea.d.ts +10 -16
  55. package/dist/components/data-entry/time-picker.d.ts +3 -5
  56. package/dist/components/data-entry/upload-types.d.ts +1 -5
  57. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  58. package/dist/components/feedback/dialog.d.ts +6 -15
  59. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  60. package/dist/components/feedback/sheet.d.ts +3 -10
  61. package/dist/components/feedback/sheet.js +1 -1
  62. package/dist/components/feedback/sonner.js +2 -3
  63. package/dist/components/general/activity.d.ts +4 -30
  64. package/dist/components/general/button.js +1 -10
  65. package/dist/components/general/logo.d.ts +6 -28
  66. package/dist/components/general/reveal.d.ts +3 -9
  67. package/dist/components/general/typography.d.ts +1 -3
  68. package/dist/components/layout/account-chip.d.ts +8 -0
  69. package/dist/components/layout/account-chip.js +45 -0
  70. package/dist/components/layout/auth-divider.d.ts +2 -9
  71. package/dist/components/layout/auth-shell.d.ts +1 -14
  72. package/dist/components/layout/breadcrumb.d.ts +1 -5
  73. package/dist/components/layout/centered-shell.d.ts +4 -18
  74. package/dist/components/layout/error-surface.d.ts +11 -28
  75. package/dist/components/layout/error-surface.js +4 -1
  76. package/dist/components/layout/index.d.ts +2 -0
  77. package/dist/components/layout/index.js +2 -0
  78. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  79. package/dist/components/layout/master-detail.d.ts +2 -18
  80. package/dist/components/layout/page-container.js +0 -1
  81. package/dist/components/layout/responsive-grid.d.ts +6 -1
  82. package/dist/components/layout/responsive-grid.js +9 -2
  83. package/dist/components/layout/service-role-panel.d.ts +7 -19
  84. package/dist/components/layout/sidebar.d.ts +5 -27
  85. package/dist/components/layout/sidebar.js +0 -1
  86. package/dist/components/layout/split-pane.d.ts +0 -7
  87. package/dist/components/layout/topbar.d.ts +1 -14
  88. package/dist/components/navigation/app-setting-picker.js +1 -3
  89. package/dist/components/navigation/filter-bar.d.ts +1 -6
  90. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  91. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  92. package/dist/components/navigation/tabs.js +4 -8
  93. package/dist/components/query/data-state.d.ts +2 -2
  94. package/dist/components/ui/credential-reveal.d.ts +1 -4
  95. package/dist/components/ui/hover-card.d.ts +1 -2
  96. package/dist/components/ui/separator.d.ts +2 -15
  97. package/dist/components/ui/toggle-group.d.ts +1 -5
  98. package/dist/components/ui/toggle.d.ts +6 -31
  99. package/dist/email/brand-mark.d.ts +6 -34
  100. package/dist/email/color.d.ts +7 -17
  101. package/dist/email/geometry.d.ts +4 -8
  102. package/dist/email/index.d.ts +4 -48
  103. package/dist/email/inline-style.d.ts +3 -9
  104. package/dist/email/urgency.d.ts +2 -7
  105. package/dist/form/form-context.d.ts +2 -5
  106. package/dist/form/form-root.d.ts +1 -2
  107. package/dist/i18n/messages/en.json +4 -0
  108. package/dist/i18n/messages/ja.json +4 -0
  109. package/dist/i18n/messages/vi.json +4 -0
  110. package/dist/inertia/index.d.ts +2 -10
  111. package/dist/lib/control-styles.d.ts +10 -21
  112. package/dist/lib/control-styles.js +4 -6
  113. package/dist/lib/datetime/format-date.d.ts +1 -4
  114. package/dist/lib/field-a11y.d.ts +11 -68
  115. package/dist/lib/field-a11y.js +0 -1
  116. package/dist/lib/format.d.ts +4 -8
  117. package/dist/lib/hooks.d.ts +6 -12
  118. package/dist/lib/permission-grid.d.ts +3 -18
  119. package/dist/lib/query-error.d.ts +3 -3
  120. package/dist/props/components/app.prop.d.ts +15 -38
  121. package/dist/props/components/charts.prop.d.ts +2 -3
  122. package/dist/props/components/data-display.prop.d.ts +48 -72
  123. package/dist/props/components/data-entry.prop.d.ts +35 -40
  124. package/dist/props/components/form.prop.d.ts +2 -6
  125. package/dist/props/components/general.prop.d.ts +11 -27
  126. package/dist/props/components/layout.prop.d.ts +89 -260
  127. package/dist/props/components/navigation.prop.d.ts +27 -42
  128. package/dist/props/registry.d.ts +31 -0
  129. package/dist/props/registry.js +33 -0
  130. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  131. package/dist/props/vocabulary/index.d.ts +1 -1
  132. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  133. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  134. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  135. package/dist/styles/alert-layout.css +1 -32
  136. package/dist/styles/badge-layout.css +4 -18
  137. package/dist/styles/base.css +14 -113
  138. package/dist/styles/card-layout.css +6 -128
  139. package/dist/styles/chart-layout.css +2 -17
  140. package/dist/styles/control.css +380 -458
  141. package/dist/styles/core.css +21 -0
  142. package/dist/styles/data-display-layout.css +175 -94
  143. package/dist/styles/data-entry-layout.css +0 -45
  144. package/dist/styles/density.css +1 -30
  145. package/dist/styles/dialog-layout.css +5 -69
  146. package/dist/styles/focus-ring.css +13 -87
  147. package/dist/styles/fonts.css +1 -31
  148. package/dist/styles/form-layout.css +7 -91
  149. package/dist/styles/index.css +2 -20
  150. package/dist/styles/layout.css +38 -456
  151. package/dist/styles/logo-layout.css +1 -35
  152. package/dist/styles/motion.css +3 -42
  153. package/dist/styles/navigation-layout.css +3 -50
  154. package/dist/styles/shell-layout.css +37 -403
  155. package/dist/styles/table-layout.css +16 -274
  156. package/dist/styles/text-layout.css +7 -21
  157. package/dist/styles/toggle.css +1 -23
  158. package/dist/theme/dxs.canonical.css +1 -55
  159. package/dist/theme/example.service.css +1 -26
  160. package/dist/theme/famgia.service.css +5 -15
  161. package/dist/tokens/axes.css +3 -40
  162. package/dist/tokens/base.css +1 -4
  163. package/dist/tokens/components/activity.css +6 -42
  164. package/dist/tokens/components/badge.css +4 -13
  165. package/dist/tokens/components/banner.css +4 -9
  166. package/dist/tokens/components/card.css +32 -88
  167. package/dist/tokens/components/chart.css +9 -26
  168. package/dist/tokens/components/control.css +37 -222
  169. package/dist/tokens/components/data-display.css +28 -79
  170. package/dist/tokens/components/data-entry.css +5 -19
  171. package/dist/tokens/components/descriptions.css +7 -27
  172. package/dist/tokens/components/email.css +38 -84
  173. package/dist/tokens/components/error-surface.css +2 -18
  174. package/dist/tokens/components/feedback.css +27 -124
  175. package/dist/tokens/components/form.css +13 -45
  176. package/dist/tokens/components/legal-document.css +16 -41
  177. package/dist/tokens/components/list-row.css +11 -36
  178. package/dist/tokens/components/logo.css +2 -57
  179. package/dist/tokens/components/navigation.css +16 -94
  180. package/dist/tokens/components/scroll-area.css +2 -18
  181. package/dist/tokens/components/separator.css +8 -30
  182. package/dist/tokens/components/sheet.css +3 -14
  183. package/dist/tokens/components/shell.css +53 -307
  184. package/dist/tokens/components/sidebar.css +5 -22
  185. package/dist/tokens/components/table.css +19 -140
  186. package/dist/tokens/components/toggle.css +3 -65
  187. package/dist/tokens/components/upload.css +7 -43
  188. package/dist/tokens/foundation.css +108 -383
  189. package/dist/tokens/semantic/layout.css +33 -207
  190. package/docs/CANONICAL-CONTRACTS.md +206 -0
  191. package/docs/COMPONENTS.md +157 -0
  192. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  193. package/docs/CONSUMER-RULES.md +14 -0
  194. package/docs/CUSTOMER-THEMING.md +162 -0
  195. package/docs/DATETIME.md +69 -0
  196. package/docs/DEVELOPMENT.md +173 -0
  197. package/docs/FORMS.md +143 -0
  198. package/docs/FRAME-A11Y-CI.md +267 -0
  199. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  200. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  201. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  202. package/docs/FRAME-COVERAGE.md +29 -0
  203. package/docs/PROPS-REGISTRY.md +61 -0
  204. package/docs/PROPS-VOCABULARY.md +100 -0
  205. package/docs/README.md +60 -0
  206. package/docs/REGISTRY.md +70 -0
  207. package/docs/SPACING.md +56 -0
  208. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  209. package/docs/TESTING.md +98 -0
  210. package/docs/TOKENS.md +347 -0
  211. package/docs/asset-modules.d.ts +46 -0
  212. package/docs/assets/cover-terrain.svg +6 -0
  213. package/docs/assets/portrait-amber.svg +5 -0
  214. package/docs/assets/portrait-clay.svg +5 -0
  215. package/docs/assets/portrait-indigo.svg +5 -0
  216. package/docs/assets/portrait-iris.svg +5 -0
  217. package/docs/assets/portrait-moss.svg +5 -0
  218. package/docs/assets/portrait-plum.svg +5 -0
  219. package/docs/assets/portrait-slate.svg +5 -0
  220. package/docs/charts/compact-bar-trend.tsx +328 -0
  221. package/docs/charts/size-tiers.tsx +192 -0
  222. package/docs/data-display/accordion.tsx +99 -0
  223. package/docs/data-display/avatar.tsx +355 -0
  224. package/docs/data-display/badge.tsx +247 -0
  225. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  226. package/docs/data-display/card/index.md +3 -0
  227. package/docs/data-display/card/index.tsx +285 -0
  228. package/docs/data-display/carousel.tsx +156 -0
  229. package/docs/data-display/charts.tsx +198 -0
  230. package/docs/data-display/code-block.tsx +90 -0
  231. package/docs/data-display/collapsible.tsx +162 -0
  232. package/docs/data-display/credential-reveal.tsx +145 -0
  233. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  234. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  235. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  236. package/docs/data-display/data-table/index.md +5 -0
  237. package/docs/data-display/data-table/index.tsx +295 -0
  238. package/docs/data-display/descriptions.tsx +143 -0
  239. package/docs/data-display/empty-state.tsx +164 -0
  240. package/docs/data-display/hover-card.tsx +181 -0
  241. package/docs/data-display/list-row.tsx +420 -0
  242. package/docs/data-display/permission-matrix.tsx +184 -0
  243. package/docs/data-display/popover-touch.tsx +27 -0
  244. package/docs/data-display/popover.tsx +245 -0
  245. package/docs/data-display/progress.tsx +84 -0
  246. package/docs/data-display/prose.tsx +105 -0
  247. package/docs/data-display/qr-code.tsx +68 -0
  248. package/docs/data-display/scroll-area.tsx +271 -0
  249. package/docs/data-display/service-launcher-card.tsx +145 -0
  250. package/docs/data-display/stat-card.tsx +99 -0
  251. package/docs/data-display/table.tsx +251 -0
  252. package/docs/data-display/timeline.tsx +112 -0
  253. package/docs/data-display/touch-actions.tsx +36 -0
  254. package/docs/data-display/tree-list.tsx +107 -0
  255. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  256. package/docs/data-entry/calendar.tsx +180 -0
  257. package/docs/data-entry/cascader.tsx +378 -0
  258. package/docs/data-entry/checkbox.tsx +256 -0
  259. package/docs/data-entry/color-picker.tsx +117 -0
  260. package/docs/data-entry/command-palette.tsx +179 -0
  261. package/docs/data-entry/command.tsx +262 -0
  262. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  263. package/docs/data-entry/date-picker.tsx +191 -0
  264. package/docs/data-entry/date-range-picker.tsx +149 -0
  265. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  266. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  267. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  268. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  269. package/docs/data-entry/form-field/index.md +8 -0
  270. package/docs/data-entry/form-field/index.tsx +326 -0
  271. package/docs/data-entry/form-inertia.tsx +80 -0
  272. package/docs/data-entry/form-root.tsx +102 -0
  273. package/docs/data-entry/form.tsx +724 -0
  274. package/docs/data-entry/input-otp.tsx +231 -0
  275. package/docs/data-entry/input.tsx +114 -0
  276. package/docs/data-entry/label.tsx +100 -0
  277. package/docs/data-entry/month-picker.tsx +101 -0
  278. package/docs/data-entry/month-range-picker.tsx +115 -0
  279. package/docs/data-entry/number-input.tsx +240 -0
  280. package/docs/data-entry/password-input.tsx +106 -0
  281. package/docs/data-entry/password-strength.tsx +97 -0
  282. package/docs/data-entry/radio-group.tsx +95 -0
  283. package/docs/data-entry/rating.tsx +87 -0
  284. package/docs/data-entry/search-input.tsx +120 -0
  285. package/docs/data-entry/select-async-contracts.tsx +108 -0
  286. package/docs/data-entry/select-matrix.tsx +204 -0
  287. package/docs/data-entry/select.tsx +369 -0
  288. package/docs/data-entry/slider.tsx +130 -0
  289. package/docs/data-entry/switch.tsx +67 -0
  290. package/docs/data-entry/tag-input.tsx +108 -0
  291. package/docs/data-entry/textarea.tsx +209 -0
  292. package/docs/data-entry/time-picker.tsx +99 -0
  293. package/docs/data-entry/toggle-count.tsx +293 -0
  294. package/docs/data-entry/toggle-group.tsx +225 -0
  295. package/docs/data-entry/toggle.tsx +127 -0
  296. package/docs/data-entry/transfer.tsx +97 -0
  297. package/docs/data-entry/tree-select.tsx +204 -0
  298. package/docs/data-entry/upload.tsx +184 -0
  299. package/docs/feedback/alert-dialog.tsx +270 -0
  300. package/docs/feedback/alert.tsx +248 -0
  301. package/docs/feedback/banner.tsx +183 -0
  302. package/docs/feedback/danger-confirm.tsx +88 -0
  303. package/docs/feedback/dialog-touch.tsx +24 -0
  304. package/docs/feedback/dialog.tsx +193 -0
  305. package/docs/feedback/sheet.tsx +410 -0
  306. package/docs/feedback/skeleton.tsx +111 -0
  307. package/docs/feedback/toast.tsx +135 -0
  308. package/docs/feedback/tooltip.tsx +171 -0
  309. package/docs/feedback/two-factor-setup.tsx +68 -0
  310. package/docs/foundation/_email-specimen.ts +274 -0
  311. package/docs/foundation/colors.tsx +202 -0
  312. package/docs/foundation/density.tsx +232 -0
  313. package/docs/foundation/email-tokens.tsx +306 -0
  314. package/docs/foundation/radius-shadow.tsx +152 -0
  315. package/docs/foundation/spacing.tsx +211 -0
  316. package/docs/foundation/typography.tsx +147 -0
  317. package/docs/general/activity.tsx +224 -0
  318. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  319. package/docs/general/button/examples/form-actions.tsx +85 -0
  320. package/docs/general/button/examples/toolbar.tsx +160 -0
  321. package/docs/general/button/index.md +12 -0
  322. package/docs/general/button/index.tsx +211 -0
  323. package/docs/general/logo.tsx +131 -0
  324. package/docs/general/reveal.tsx +41 -0
  325. package/docs/general/typography.tsx +152 -0
  326. package/docs/layout/account-chip.tsx +72 -0
  327. package/docs/layout/admin-collection.tsx +122 -0
  328. package/docs/layout/app-shell.tsx +374 -0
  329. package/docs/layout/aspect-ratio.tsx +119 -0
  330. package/docs/layout/auth-account-summary.tsx +103 -0
  331. package/docs/layout/auth-divider.tsx +28 -0
  332. package/docs/layout/auth-footer.tsx +37 -0
  333. package/docs/layout/auth-identity.tsx +36 -0
  334. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  336. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  338. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  340. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  342. package/docs/layout/auth-recovery/index.md +140 -0
  343. package/docs/layout/auth-recovery/index.tsx +96 -0
  344. package/docs/layout/auth-shell-context.tsx +103 -0
  345. package/docs/layout/auth-shell-device.tsx +112 -0
  346. package/docs/layout/auth-shell-registration.tsx +335 -0
  347. package/docs/layout/auth-shell-variants.tsx +139 -0
  348. package/docs/layout/auth-shell.tsx +59 -0
  349. package/docs/layout/auth-stack.tsx +40 -0
  350. package/docs/layout/centered-shell.tsx +102 -0
  351. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  352. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  353. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  354. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  355. package/docs/layout/error-surface/index.md +153 -0
  356. package/docs/layout/error-surface/index.tsx +239 -0
  357. package/docs/layout/flex.tsx +262 -0
  358. package/docs/layout/legal-document-shell/_data.ts +110 -0
  359. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  361. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  363. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  365. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  367. package/docs/layout/legal-document-shell/index.md +51 -0
  368. package/docs/layout/legal-document-shell/index.tsx +101 -0
  369. package/docs/layout/master-detail.tsx +387 -0
  370. package/docs/layout/org-switcher.tsx +131 -0
  371. package/docs/layout/page-container.tsx +946 -0
  372. package/docs/layout/resizable-panel.tsx +419 -0
  373. package/docs/layout/responsive-grid.tsx +235 -0
  374. package/docs/layout/separator.tsx +327 -0
  375. package/docs/layout/service-role-panel.tsx +144 -0
  376. package/docs/layout/sidebar.tsx +586 -0
  377. package/docs/layout/split-pane.tsx +451 -0
  378. package/docs/layout/topbar.tsx +347 -0
  379. package/docs/navigation/app-setting-picker.tsx +141 -0
  380. package/docs/navigation/breadcrumb.tsx +128 -0
  381. package/docs/navigation/context-menu.tsx +117 -0
  382. package/docs/navigation/dropdown-menu.tsx +213 -0
  383. package/docs/navigation/filter-bar.tsx +227 -0
  384. package/docs/navigation/menubar.tsx +141 -0
  385. package/docs/navigation/navigation-menu.tsx +165 -0
  386. package/docs/navigation/pagination.tsx +241 -0
  387. package/docs/navigation/steps.tsx +263 -0
  388. package/docs/navigation/tabs-rtl.tsx +28 -0
  389. package/docs/navigation/tabs.tsx +308 -0
  390. package/docs/navigation/toolbar.tsx +339 -0
  391. package/docs/providers/app-provider.tsx +191 -0
  392. package/docs/providers/format-date.tsx +230 -0
  393. package/docs/query/button-refetch.tsx +160 -0
  394. package/docs/query/data-state.tsx +192 -0
  395. package/docs/query/infinite-query-state.tsx +93 -0
  396. package/docs/query/mutation-feedback.tsx +70 -0
  397. package/docs/query/prefetch-link.tsx +262 -0
  398. package/docs/query/touch-actions.tsx +68 -0
  399. package/docs/showcase/acme-portal.tsx +441 -0
  400. package/docs/showcase/acme-website.tsx +455 -0
  401. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  402. package/docs/showcase/case2-employee-me.tsx +441 -0
  403. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  404. package/docs/showcase/case4-login.tsx +307 -0
  405. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  406. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  407. package/docs/showcase/futurelastic-web.tsx +390 -0
  408. package/docs/showcase/org-switcher.tsx +313 -0
  409. package/docs/showcase/permission-matrix.tsx +343 -0
  410. package/docs/showcase/public-landing.tsx +210 -0
  411. package/docs/showcase/settings-account-sections.tsx +559 -0
  412. package/docs/showcase/settings-security-mfa.tsx +145 -0
  413. package/docs/showcase/table-approval-queue.tsx +199 -0
  414. package/docs/showcase/table-bulk-actions.tsx +460 -0
  415. package/docs/showcase/table-compact-kintone.tsx +438 -0
  416. package/docs/showcase/table-conditional-format.tsx +367 -0
  417. package/docs/showcase/table-crud-list.tsx +544 -0
  418. package/docs/showcase/table-density.tsx +340 -0
  419. package/docs/showcase/table-expandable-rows.tsx +471 -0
  420. package/docs/showcase/table-filter-chips.tsx +461 -0
  421. package/docs/showcase/table-footer-totals.tsx +311 -0
  422. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  423. package/docs/showcase/table-master-detail.tsx +479 -0
  424. package/docs/showcase/table-pagination.tsx +320 -0
  425. package/docs/showcase/table-states.tsx +363 -0
  426. package/docs/showcase/table-sticky-columns.tsx +373 -0
  427. package/docs/showcase/table-tree-rows.tsx +444 -0
  428. package/docs/showcase/table-view-tabs.tsx +488 -0
  429. package/package.json +9 -11
  430. package/scripts/_agent-setup.mjs +16 -2
  431. package/scripts/audit-hook.mjs +3 -13
  432. package/scripts/init-agent-kit.mjs +1 -14
  433. package/scripts/postinstall.mjs +12 -12
  434. package/scripts/ui-audit.mjs +93 -31
  435. package/scripts/visual-audit-rules.mjs +51 -7
  436. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,152 @@
1
+ import {
2
+ Badge,
3
+ Card,
4
+ CardContent,
5
+ CardDescription,
6
+ CardHeader,
7
+ CardTitle,
8
+ } from "@godxjp/ui/data-display";
9
+ import { Text } from "@godxjp/ui/general";
10
+ import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
11
+
12
+ /**
13
+ * Radius & Shadow · design-token foundation. base radius 6px; shadows stay flat
14
+ * (cards have NO shadow at rest · elevation only climbs at popover / dialog).
15
+ * Boxes render the real token var; composed only from real @godxjp/ui components.
16
+ */
17
+ // DS authors the base --radius (6px) and derives sm/md/lg in @theme. --radius-xl
18
+ // and --radius-full are NOT overridden · they fall through to Tailwind defaults.
19
+ // `value` is the CSS the swatch renders. ds tokens resolve their var; xl/full are NOT authored as
20
+ // vars (they fall through to Tailwind `rounded-xl` / `rounded-full`), so we render their literal
21
+ // value — otherwise `var(--radius-full)` is undefined and the swatch collapses to a square.
22
+ const radii = [
23
+ { token: "--radius-sm", px: "2px", value: "var(--radius-sm)", source: "ds" as const },
24
+ { token: "--radius-md", px: "4px", value: "var(--radius-md)", source: "ds" as const },
25
+ { token: "--radius", px: "6px (base)", value: "var(--radius)", source: "ds" as const },
26
+ { token: "--radius-lg", px: "6px", value: "var(--radius-lg)", source: "ds" as const },
27
+ { token: "--radius-xl", px: "12px", value: "0.75rem", source: "tw" as const },
28
+ { token: "--radius-full", px: "pill", value: "9999px", source: "tw" as const },
29
+ ];
30
+
31
+ const shadows = [
32
+ { token: "--shadow-sm", role: "subtle lift" },
33
+ { token: "--shadow-lg", role: "popover / elevated" },
34
+ { token: "--shadow-xl", role: "dialog" },
35
+ ];
36
+
37
+ export default function Demo() {
38
+ return (
39
+ <PageContainer
40
+ title="Radius & Shadow"
41
+ subtitle="6px base radius · flat by default · elevation climbs only at popover / dialog"
42
+ >
43
+ <Flex direction="col" gap="lg">
44
+ <Card>
45
+ <CardHeader>
46
+ <CardTitle level={2}>Corner radius</CardTitle>
47
+ <CardDescription>
48
+ The system authors the base 6px radius and derives sm/md/lg from it. xl and full are
49
+ not overridden; they fall through to Tailwind defaults.
50
+ </CardDescription>
51
+ </CardHeader>
52
+ <CardContent>
53
+ <ResponsiveGrid columns={{ sm: 2, md: 3, lg: 6 }}>
54
+ {radii.map((r) => (
55
+ <Flex key={r.token} direction="col" gap="xs">
56
+ <div
57
+ className="bg-secondary border-border h-16 border"
58
+ style={{ borderRadius: r.value }}
59
+ />
60
+ <div>
61
+ <Flex align="center" gap="xs">
62
+ <Text size="xs" mono>
63
+ {r.token}
64
+ </Text>
65
+ {r.source === "tw" ? (
66
+ <Badge variant="outline" className="text-xs">
67
+ Tailwind default
68
+ </Badge>
69
+ ) : null}
70
+ </Flex>
71
+ <Text as="div" size="xs" tone="muted">
72
+ {r.px}
73
+ </Text>
74
+ </div>
75
+ </Flex>
76
+ ))}
77
+ </ResponsiveGrid>
78
+ </CardContent>
79
+ </Card>
80
+
81
+ <Card>
82
+ <CardHeader>
83
+ <CardTitle level={2}>Elevation</CardTitle>
84
+ <CardDescription>
85
+ Cards carry a 1px border and NO shadow at rest. Shadow appears only on floating
86
+ surfaces: popover and dialog.
87
+ </CardDescription>
88
+ </CardHeader>
89
+ <CardContent>
90
+ <Flex direction="col" gap="lg">
91
+ <ResponsiveGrid columns={{ sm: 1, md: 3 }}>
92
+ {shadows.map((s) => (
93
+ <Flex key={s.token} direction="col" gap="xs">
94
+ <div
95
+ className="bg-card h-16 rounded-md"
96
+ style={{ boxShadow: `var(${s.token})` }}
97
+ />
98
+ <div>
99
+ <Text as="div" size="xs" mono>
100
+ {s.token}
101
+ </Text>
102
+ <Text as="div" size="xs" tone="muted">
103
+ {s.role}
104
+ </Text>
105
+ </div>
106
+ </Flex>
107
+ ))}
108
+ </ResponsiveGrid>
109
+
110
+ {/* Rest vs elevated, shown live: a resting Card (border, no shadow) next to a
111
+ floating surface lifted by --shadow-lg, so the elevation rule is demonstrated,
112
+ not just asserted. */}
113
+ <ResponsiveGrid columns={{ sm: 1, md: 2 }}>
114
+ <Flex direction="col" gap="xs">
115
+ <Card>
116
+ <CardContent>
117
+ <Text as="div" weight="medium">
118
+ At rest(カード)
119
+ </Text>
120
+ <Text as="div" size="xs" tone="muted">
121
+ border-border, no shadow
122
+ </Text>
123
+ </CardContent>
124
+ </Card>
125
+ <Text as="div" size="xs" tone="muted">
126
+ resting surface · flat
127
+ </Text>
128
+ </Flex>
129
+ <Flex direction="col" gap="xs">
130
+ <div
131
+ className="bg-popover text-popover-foreground border-border rounded-md border p-4"
132
+ style={{ boxShadow: "var(--shadow-lg)" }}
133
+ >
134
+ <Text as="div" weight="medium">
135
+ Floating(ポップオーバー)
136
+ </Text>
137
+ <Text as="div" size="xs" tone="muted">
138
+ --shadow-lg lifts it off the page
139
+ </Text>
140
+ </div>
141
+ <Text as="div" size="xs" tone="muted">
142
+ floating surface · elevated
143
+ </Text>
144
+ </Flex>
145
+ </ResponsiveGrid>
146
+ </Flex>
147
+ </CardContent>
148
+ </Card>
149
+ </Flex>
150
+ </PageContainer>
151
+ );
152
+ }
@@ -0,0 +1,211 @@
1
+ import { type RefObject, useLayoutEffect, useRef, useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { Text } from "@godxjp/ui/general";
5
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
6
+
7
+ /**
8
+ * Spacing · design-token foundation. Two raw scales (a 4px grid + a golden-ratio
9
+ * φ scale) feed the semantic layout tokens that Flex / PageContainer consume.
10
+ * Each bar's width is the real token var() and every px label is resolved from
11
+ * that same var() at runtime, so nothing can drift from the source. Composed
12
+ * only from real @godxjp/ui components.
13
+ */
14
+ const rawScale = [
15
+ "--space-0",
16
+ "--space-1",
17
+ "--space-2",
18
+ "--space-3",
19
+ "--space-4",
20
+ "--space-5",
21
+ "--space-6",
22
+ "--space-8",
23
+ "--space-10",
24
+ "--space-12",
25
+ ];
26
+
27
+ const phiScale = [
28
+ { token: "--phi-n2", role: "φ⁻² · phi-unit ÷ φ²" },
29
+ { token: "--phi-n1", role: "φ⁻¹ · phi-unit ÷ φ" },
30
+ { token: "--phi-0", role: "φ⁰ · phi-unit (= --space-4)" },
31
+ { token: "--phi-p1", role: "φ¹ · phi-unit × φ" },
32
+ { token: "--phi-p2", role: "φ² · phi-unit × φ²" },
33
+ ];
34
+
35
+ const layoutScale = [
36
+ { token: "--space-page-x", role: "page gutter X (PageContainer)" },
37
+ { token: "--space-page-y", role: "page gutter Y (PageContainer)" },
38
+ { token: "--space-section", role: "section gap (= --phi-0)" },
39
+ { token: "--space-stack-xs", role: "Flex gap='xs'" },
40
+ { token: "--space-stack-sm", role: "Flex gap='sm'" },
41
+ { token: "--space-stack-md", role: "Flex gap='md' (default · = --phi-0)" },
42
+ { token: "--space-stack-lg", role: "Flex gap='lg' (= --phi-p1)" },
43
+ { token: "--space-stack-xl", role: "Flex gap='xl' (= --phi-p2)" },
44
+ { token: "--space-inline-xs", role: "inline gap='xs'" },
45
+ { token: "--space-inline-sm", role: "inline gap='sm'" },
46
+ { token: "--space-inline-md", role: "inline gap='md' (= --phi-n1)" },
47
+ { token: "--space-inline-lg", role: "inline gap='lg' (= --phi-0)" },
48
+ ];
49
+
50
+ const allTokens = [
51
+ ...rawScale,
52
+ ...phiScale.map((s) => s.token),
53
+ ...layoutScale.map((s) => s.token),
54
+ ];
55
+
56
+ /** Resolve each token's computed pixel value from a live probe element, so the
57
+ * px labels are read from the same var() as the bars and can never drift. */
58
+ type PxMap = Record<string, string> & { __probeRef: RefObject<HTMLDivElement | null> };
59
+
60
+ function usePx(tokens: string[]): PxMap {
61
+ const probeRef = useRef<HTMLDivElement>(null);
62
+ const [px, setPx] = useState<Record<string, string>>({});
63
+
64
+ useLayoutEffect(() => {
65
+ const host = probeRef.current;
66
+ if (!host) return;
67
+ const next: Record<string, string> = {};
68
+ for (const token of tokens) {
69
+ const probe = document.createElement("div");
70
+ probe.style.width = `var(${token})`;
71
+ host.appendChild(probe);
72
+ const width = probe.getBoundingClientRect().width;
73
+ host.removeChild(probe);
74
+ next[token] = `${Math.round(width * 10) / 10}px`;
75
+ }
76
+ setPx(next);
77
+ }, [tokens]);
78
+
79
+ return { ...px, __probeRef: probeRef } as PxMap;
80
+ }
81
+
82
+ function TokenBar({
83
+ token,
84
+ px,
85
+ role,
86
+ className,
87
+ }: {
88
+ token: string;
89
+ px?: string;
90
+ role?: string;
91
+ className: string;
92
+ }) {
93
+ return (
94
+ <Flex direction="row" align="center" gap="md">
95
+ <Text size="xs" tone="muted" mono className="w-44 shrink-0">
96
+ {token}
97
+ </Text>
98
+ <div className={className} style={{ width: `var(${token})` }} />
99
+ <Text size="xs" tone="muted" mono className="w-14 shrink-0 text-end">
100
+ {px ?? "·"}
101
+ </Text>
102
+ {role ? (
103
+ <Text size="xs" tone="muted">
104
+ {role}
105
+ </Text>
106
+ ) : null}
107
+ </Flex>
108
+ );
109
+ }
110
+
111
+ export default function Demo() {
112
+ const px = usePx(allTokens);
113
+
114
+ return (
115
+ <PageContainer
116
+ title="Spacing"
117
+ subtitle="4px raw grid + golden-ratio (φ) scale → semantic layout gaps · never raw gap-* / margins"
118
+ >
119
+ {/* Off-screen probe host: bars are measured here, then removed. */}
120
+ <div
121
+ ref={px.__probeRef}
122
+ aria-hidden
123
+ className="pointer-events-none absolute -z-10 opacity-0"
124
+ />
125
+
126
+ <Flex direction="col" gap="lg">
127
+ <Card>
128
+ <CardHeader>
129
+ <CardTitle level={2}>Raw scale · 4px grid</CardTitle>
130
+ <CardDescription>
131
+ The base step is 4px; every value is a 4-multiple. Bar width is the live token var(),
132
+ the px label is resolved from it at runtime.
133
+ </CardDescription>
134
+ </CardHeader>
135
+ <CardContent>
136
+ <Flex direction="col" gap="sm">
137
+ {rawScale.map((token) => (
138
+ <TokenBar
139
+ key={token}
140
+ token={token}
141
+ px={px[token]}
142
+ className="bg-primary h-3 shrink-0 rounded-sm"
143
+ />
144
+ ))}
145
+ </Flex>
146
+ </CardContent>
147
+ </Card>
148
+
149
+ <Card>
150
+ <CardHeader>
151
+ <CardTitle level={2}>Golden-ratio scale · φ ≈ 1.618</CardTitle>
152
+ <CardDescription>
153
+ Off-grid by design: each step is the previous multiplied or divided by φ around{" "}
154
+ <Text mono>--phi-unit</Text> (= --space-4). These back the larger stack / inline gaps,
155
+ so they read as off the 4px grid (e.g. stack-lg ≈ 25.9px).
156
+ </CardDescription>
157
+ </CardHeader>
158
+ <CardContent>
159
+ <Flex direction="col" gap="sm">
160
+ {phiScale.map((s) => (
161
+ <TokenBar
162
+ key={s.token}
163
+ token={s.token}
164
+ px={px[s.token]}
165
+ role={s.role}
166
+ className="bg-attention h-3 shrink-0 rounded-sm"
167
+ />
168
+ ))}
169
+ </Flex>
170
+ </CardContent>
171
+ </Card>
172
+
173
+ <Card>
174
+ <CardHeader>
175
+ <CardTitle level={2}>Semantic layout tokens</CardTitle>
176
+ <CardDescription>
177
+ What Flex gap and PageContainer padding resolve to: set the rhythm once, never
178
+ hand-tune margins per element. Tokens marked (= --phi-*) inherit the golden-ratio
179
+ scale above, so their px value is off the 4px grid.
180
+ </CardDescription>
181
+ </CardHeader>
182
+ <CardContent>
183
+ <Flex direction="col" gap="sm">
184
+ {layoutScale.map((s) => (
185
+ <TokenBar
186
+ key={s.token}
187
+ token={s.token}
188
+ px={px[s.token]}
189
+ role={s.role}
190
+ className="bg-info h-3 shrink-0 rounded-sm"
191
+ />
192
+ ))}
193
+ </Flex>
194
+ </CardContent>
195
+ </Card>
196
+
197
+ <Card>
198
+ <CardHeader>
199
+ <CardTitle level={2}>Density retunes the φ scale</CardTitle>
200
+ <CardDescription>
201
+ PageContainer density remaps <Text mono>--phi-unit</Text> (compact → --space-3,
202
+ comfortable → --space-6). Because every φ-derived token (stack-md/lg/xl, inline-md/lg,
203
+ section) is built from --phi-unit, the whole semantic rhythm scales with one knob ·
204
+ the px values above shift accordingly.
205
+ </CardDescription>
206
+ </CardHeader>
207
+ </Card>
208
+ </Flex>
209
+ </PageContainer>
210
+ );
211
+ }
@@ -0,0 +1,147 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
3
+
4
+ /**
5
+ * Typography · design-token foundation. Real semantic <h1>-<h6> elements (no
6
+ * faked sizes): the base heading layer renders the reference-design scale and keeps
7
+ * the document outline SEO/accessibility correct. Composed only from real
8
+ * @godxjp/ui components.
9
+ */
10
+ export default function Demo() {
11
+ return (
12
+ <PageContainer
13
+ title="Typography"
14
+ subtitle="Noto Sans JP (M PLUS 2 fallback) · 14 / 1.7 body · headings 20/18/14/13 @ 500 · three weights only"
15
+ >
16
+ <Flex direction="col" gap="lg">
17
+ <Card>
18
+ <CardHeader>
19
+ <CardTitle level={2}>Heading scale</CardTitle>
20
+ <CardDescription>
21
+ h1 20 / h2 18 / h3 14 / h4-h6 13px, weight 500 (h5/h6 collapse to 13px). SEO/a11y:
22
+ exactly one &lt;h1&gt; per page (the page title above); h2-h6 below never skip a
23
+ level.
24
+ </CardDescription>
25
+ </CardHeader>
26
+ <CardContent>
27
+ <Flex direction="col" gap="xs">
28
+ <h2>&lt;h2&gt; 見出し · section heading · 18px / 500</h2>
29
+ <h3>&lt;h3&gt; 見出し · subsection · 14px / 500</h3>
30
+ <h4>&lt;h4&gt; 見出し · minor heading · 13px / 500</h4>
31
+ <h5>&lt;h5&gt; 見出し · 13px / 500</h5>
32
+ <h6>&lt;h6&gt; 見出し · 13px / 500</h6>
33
+ </Flex>
34
+ </CardContent>
35
+ </Card>
36
+
37
+ <Card>
38
+ <CardHeader>
39
+ <CardTitle level={2}>Body & weights</CardTitle>
40
+ <CardDescription>
41
+ Default body 14px / 1.7 (間 ma); dense tables 13px / 1.5. Three weights only · 400
42
+ body, 500 heading/label, 700 emphasis. NO 300, NO 600.
43
+ </CardDescription>
44
+ </CardHeader>
45
+ <CardContent>
46
+ <Flex direction="col" gap="sm">
47
+ <p className="text-sm">
48
+ 本文 14px / 1.7 · 漢字の密度に合わせて行間を広めに取り、読み疲れを抑えます。Body
49
+ copy mixes 日本語 and Latin without breaking rhythm.
50
+ </p>
51
+ <Flex direction="col" gap="xs">
52
+ <p className="text-sm font-normal">400 normal · 通常の本文 · regular body</p>
53
+ <p className="text-sm font-medium">
54
+ 500 medium · 見出し・ラベル · headings, labels
55
+ </p>
56
+ <p className="text-sm font-bold">700 bold · 強調のみ · emphasis only</p>
57
+ </Flex>
58
+ </Flex>
59
+ </CardContent>
60
+ </Card>
61
+
62
+ <Card>
63
+ <CardHeader>
64
+ <CardTitle level={2}>Tabular figures</CardTitle>
65
+ <CardDescription>
66
+ tabular-nums on every numeric column / large stat so digits align under 1.7 leading.
67
+ </CardDescription>
68
+ </CardHeader>
69
+ <CardContent>
70
+ <Flex direction="col" gap="xs">
71
+ <span className="text-2xl tabular-nums">¥1,284,500 · tabular ✓</span>
72
+ <span className="text-2xl normal-nums">¥1,284,500 · proportional ✗</span>
73
+ </Flex>
74
+ </CardContent>
75
+ </Card>
76
+
77
+ <Card>
78
+ <CardHeader>
79
+ <CardTitle level={2}>Size scale</CardTitle>
80
+ <CardDescription>
81
+ Six steps on the JP-dense base. text-sm (14px) is body; text-base+ are for stats /
82
+ large numerals, not running copy.
83
+ </CardDescription>
84
+ </CardHeader>
85
+ <CardContent>
86
+ <Flex direction="col" gap="xs">
87
+ <p className="text-xs">text-xs · 13px · 補足・密なテーブル</p>
88
+ <p className="text-sm">text-sm · 14px · 本文 body</p>
89
+ <p className="text-base">text-base · 15px · やや大きい本文</p>
90
+ <p className="text-lg">text-lg · 19px · リード文 lead</p>
91
+ <p className="text-xl">text-xl · 22px · 小見出し統計</p>
92
+ <p className="text-2xl">text-2xl · 26px · 大きな統計値</p>
93
+ </Flex>
94
+ </CardContent>
95
+ </Card>
96
+
97
+ <Card>
98
+ <CardHeader>
99
+ <CardTitle level={2}>Font family</CardTitle>
100
+ <CardDescription>
101
+ font-sans · Noto Sans JP by default (Japanese + Latin, incl. the Vietnamese subset); M
102
+ PLUS 2 is the fallback face for every supported locale. font-mono · the UI-monospace
103
+ stack for code, IDs and aligned digits.
104
+ </CardDescription>
105
+ </CardHeader>
106
+ <CardContent>
107
+ <Flex direction="col" gap="sm">
108
+ <p className="font-sans text-sm">
109
+ 春はあけぼの · Số hóa văn bản · The quick brown fox jumps over the lazy dog
110
+ 0123456789
111
+ </p>
112
+ <code className="font-mono text-sm">
113
+ const id = &quot;EMP-2025-001&quot;; // 0123456789 IlO0
114
+ </code>
115
+ </Flex>
116
+ </CardContent>
117
+ </Card>
118
+
119
+ <Card>
120
+ <CardHeader>
121
+ <CardTitle level={2}>Line height</CardTitle>
122
+ <CardDescription>
123
+ tight 1.25 · headings · normal 1.5 · dense tables · body 1.7 · running 日本語/Latin
124
+ copy (the default applied to &lt;body&gt;).
125
+ </CardDescription>
126
+ </CardHeader>
127
+ <CardContent>
128
+ <Flex direction="col" gap="sm">
129
+ <p className="text-sm leading-tight">
130
+ tight 1.25 · 見出し向けの詰めた行間。Compact leading for headings and single-line
131
+ labels where vertical rhythm should stay tight.
132
+ </p>
133
+ <p className="text-sm leading-normal">
134
+ normal 1.5 · 密なテーブル向け。Slightly looser for dense tables and metadata where
135
+ rows must stay scannable but not cramped.
136
+ </p>
137
+ <p className="text-sm leading-[var(--line-height-body)]">
138
+ body 1.7 · 本文向け。Generous leading for running mixed 日本語 and Latin copy so the
139
+ kanji density never reads as a wall of text.
140
+ </p>
141
+ </Flex>
142
+ </CardContent>
143
+ </Card>
144
+ </Flex>
145
+ </PageContainer>
146
+ );
147
+ }