@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,419 @@
1
+ import {
2
+ Badge,
3
+ Card,
4
+ CardContent,
5
+ CardDescription,
6
+ CardHeader,
7
+ CardTitle,
8
+ } from "@godxjp/ui/data-display";
9
+ import { Button, Text } from "@godxjp/ui/general";
10
+ import {
11
+ Flex,
12
+ PageContainer,
13
+ ResizableHandle,
14
+ ResizablePanel,
15
+ ResizablePanelGroup,
16
+ } from "@godxjp/ui/layout";
17
+ import { GripHorizontal, GripVertical, PanelLeftClose, PanelLeftOpen } from "lucide-react";
18
+ import * as React from "react";
19
+ import type { Layout, PanelImperativeHandle } from "react-resizable-panels";
20
+
21
+ /**
22
+ * ResizablePanel · react-resizable-panels v4 compound primitive exported as
23
+ * ResizablePanelGroup / ResizablePanel / ResizableHandle. Always compose:
24
+ * ResizablePanelGroup wraps panels+handles; ResizableHandle sits between panels;
25
+ * ResizablePanel holds content. Group orientation is set with orientation
26
+ * ("horizontal" | "vertical"). minSize/maxSize prevent zero-collapse; collapsible
27
+ * + collapsedSize enable collapse-to-zero; defaultLayout + onLayoutChanged persist
28
+ * sizes. Composed only from real @godxjp/ui components.
29
+ */
30
+ export default function Demo() {
31
+ return (
32
+ <PageContainer
33
+ title="ResizablePanel"
34
+ subtitle="ResizablePanelGroup + ResizablePanel + ResizableHandle · サイズ変更可能な分割レイアウト"
35
+ >
36
+ <Flex direction="col" gap="lg">
37
+ <HorizontalCard />
38
+ <VerticalCard />
39
+ <CollapsibleCard />
40
+ <PersistenceCard />
41
+ <DisabledCard />
42
+ <ThreePaneCard />
43
+ </Flex>
44
+ </PageContainer>
45
+ );
46
+ }
47
+
48
+ const frameStyle: React.CSSProperties = {
49
+ border: "1px solid var(--color-border)",
50
+ borderRadius: "var(--radius-md)",
51
+ overflow: "hidden",
52
+ };
53
+
54
+ /** orientation="horizontal" (default) · list + detail master/detail layout. */
55
+ function HorizontalCard() {
56
+ return (
57
+ <Card>
58
+ <CardHeader>
59
+ <CardTitle level={2}>水平分割 · リスト + 詳細</CardTitle>
60
+ <CardDescription>
61
+ orientation=&quot;horizontal&quot;(既定)。ResizableHandle をパネル間に配置。minSize
62
+ でゼロ崩壊を防ぐ。ハンドルをダブルクリックすると defaultSize に戻る。
63
+ </CardDescription>
64
+ </CardHeader>
65
+ <CardContent>
66
+ <div style={{ height: "16rem", ...frameStyle }}>
67
+ <ResizablePanelGroup orientation="horizontal">
68
+ <ResizablePanel id="list-panel" defaultSize="35%" minSize="20%" maxSize="60%">
69
+ {/* No inner overflow: the panel is already the scroll container, and letting it own
70
+ the scrolling is what earns the keyboard tab stop ResizablePanel now manages. */}
71
+ <Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
72
+ <Text size="xs" weight="medium" tone="muted">
73
+ 請求書リスト
74
+ </Text>
75
+ {[
76
+ { id: "INV-2024-001", label: "株式会社アルファ", status: "succeeded" },
77
+ { id: "INV-2024-002", label: "合同会社ベータ", status: "pending" },
78
+ { id: "INV-2024-003", label: "有限会社ガンマ", status: "scheduled" },
79
+ ].map((item) => (
80
+ <Flex key={item.id} direction="row" gap="xs" align="center" justify="between">
81
+ <Flex direction="col" gap="xs">
82
+ <Text weight="medium">{item.id}</Text>
83
+ <Text size="xs" tone="muted">
84
+ {item.label}
85
+ </Text>
86
+ </Flex>
87
+ <Badge status={item.status} />
88
+ </Flex>
89
+ ))}
90
+ </Flex>
91
+ </ResizablePanel>
92
+ <ResizableHandle />
93
+ <ResizablePanel id="detail-panel" defaultSize="65%" minSize="40%">
94
+ <Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
95
+ <Text size="xs" weight="medium" tone="muted">
96
+ 詳細
97
+ </Text>
98
+ <Text weight="bold">INV-2024-001</Text>
99
+ <Flex direction="col" gap="xs">
100
+ <Text>株式会社アルファ</Text>
101
+ <Text tone="muted">金額: ¥1,320,000(税込)</Text>
102
+ <Text tone="muted">支払期日: 2024-02-28</Text>
103
+ </Flex>
104
+ <Flex direction="row" gap="xs" wrap>
105
+ <Button size="sm">承認</Button>
106
+ <Button size="sm" variant="outline">
107
+ 却下
108
+ </Button>
109
+ </Flex>
110
+ </Flex>
111
+ </ResizablePanel>
112
+ </ResizablePanelGroup>
113
+ </div>
114
+ </CardContent>
115
+ </Card>
116
+ );
117
+ }
118
+
119
+ /** orientation="vertical" · top/bottom split with a grip handle. */
120
+ function VerticalCard() {
121
+ return (
122
+ <Card>
123
+ <CardHeader>
124
+ <CardTitle level={2}>垂直分割 · エディタ + プレビュー</CardTitle>
125
+ <CardDescription>
126
+ orientation=&quot;vertical&quot; で上下分割。コードエディタ + 出力プレビューやフォーム +
127
+ 確認画面などの用途。ResizableHandle に children を渡すとグリップアイコンで掴みやすくなる。
128
+ </CardDescription>
129
+ </CardHeader>
130
+ <CardContent>
131
+ <div style={{ height: "18rem", ...frameStyle }}>
132
+ <ResizablePanelGroup orientation="vertical">
133
+ <ResizablePanel id="editor-panel" defaultSize="50%" minSize="25%">
134
+ <Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
135
+ <Text size="xs" weight="medium" tone="muted">
136
+ 仕訳エディタ
137
+ </Text>
138
+ <Flex direction="col" gap="xs">
139
+ <Flex direction="row" gap="sm" align="center" justify="between">
140
+ <Text>売掛金 / 売上高</Text>
141
+ <Badge tone="info">借方 ¥880,000</Badge>
142
+ </Flex>
143
+ <Flex direction="row" gap="sm" align="center" justify="between">
144
+ <Text>仮受消費税 / 売上高</Text>
145
+ <Badge variant="outline">貸方 ¥880,000</Badge>
146
+ </Flex>
147
+ </Flex>
148
+ </Flex>
149
+ </ResizablePanel>
150
+ <ResizableHandle>
151
+ <GripHorizontal aria-hidden="true" size={16} />
152
+ </ResizableHandle>
153
+ <ResizablePanel id="preview-panel" defaultSize="50%" minSize="25%">
154
+ <Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
155
+ <Text size="xs" weight="medium" tone="muted">
156
+ プレビュー
157
+ </Text>
158
+ <Text tone="muted">
159
+ 仕訳内容のプレビューがここに表示されます。貸借が一致していることを確認してください。
160
+ </Text>
161
+ <Flex direction="row" gap="xs">
162
+ <Button size="sm">保存</Button>
163
+ <Button size="sm" variant="outline">
164
+ クリア
165
+ </Button>
166
+ </Flex>
167
+ </Flex>
168
+ </ResizablePanel>
169
+ </ResizablePanelGroup>
170
+ </div>
171
+ </CardContent>
172
+ </Card>
173
+ );
174
+ }
175
+
176
+ /**
177
+ * collapsible + collapsedSize · the sidebar collapses to zero and an imperative
178
+ * panelRef toggle expands/collapses it. Seeded collapsed at rest so the
179
+ * collapsed state is visible in a static screenshot.
180
+ */
181
+ function CollapsibleCard() {
182
+ const panelRef = React.useRef<PanelImperativeHandle | null>(null);
183
+ const [collapsed, setCollapsed] = React.useState(true);
184
+
185
+ const toggle = () => {
186
+ const panel = panelRef.current;
187
+ if (!panel) return;
188
+ if (panel.isCollapsed()) {
189
+ panel.expand();
190
+ setCollapsed(false);
191
+ } else {
192
+ panel.collapse();
193
+ setCollapsed(true);
194
+ }
195
+ };
196
+
197
+ return (
198
+ <Card>
199
+ <CardHeader>
200
+ <CardTitle level={2}>折りたたみ · collapsible サイドバー</CardTitle>
201
+ <CardDescription>
202
+ collapsible + collapsedSize=&#123;0&#125; でサイドバーをゼロまで折りたためる。panelRef の
203
+ collapse()/expand() でトグル。minSize 未満までドラッグしても自動で折りたたまれる。
204
+ </CardDescription>
205
+ </CardHeader>
206
+ <CardContent>
207
+ <Flex direction="col" gap="sm">
208
+ <Flex direction="row" gap="xs" align="center">
209
+ <Button
210
+ size="sm"
211
+ variant="outline"
212
+ onClick={toggle}
213
+ aria-pressed={!collapsed}
214
+ aria-label={collapsed ? "サイドバーを開く" : "サイドバーを閉じる"}
215
+ >
216
+ {collapsed ? (
217
+ <PanelLeftOpen aria-hidden="true" size={16} />
218
+ ) : (
219
+ <PanelLeftClose aria-hidden="true" size={16} />
220
+ )}
221
+ {collapsed ? "サイドバーを開く" : "サイドバーを閉じる"}
222
+ </Button>
223
+ <Text size="xs" tone="muted">
224
+ {collapsed ? "折りたたみ中" : "展開中"}
225
+ </Text>
226
+ </Flex>
227
+ <div style={{ height: "14rem", ...frameStyle }}>
228
+ <ResizablePanelGroup orientation="horizontal">
229
+ <ResizablePanel
230
+ panelRef={panelRef}
231
+ id="collapsible-sidebar"
232
+ collapsible
233
+ collapsedSize="0%"
234
+ defaultSize="0%"
235
+ minSize="15%"
236
+ maxSize="30%"
237
+ onResize={(size) => setCollapsed(size.asPercentage === 0)}
238
+ >
239
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
240
+ <Text size="xs" weight="medium" tone="muted">
241
+ ナビゲーション
242
+ </Text>
243
+ {["売上", "仕入", "経費", "固定資産"].map((item) => (
244
+ <Text key={item} size="sm" tone="muted">
245
+ {item}
246
+ </Text>
247
+ ))}
248
+ </Flex>
249
+ </ResizablePanel>
250
+ <ResizableHandle>
251
+ <GripVertical aria-hidden="true" size={16} />
252
+ </ResizableHandle>
253
+ <ResizablePanel id="collapsible-main" defaultSize="100%" minSize="40%">
254
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
255
+ <Text size="xs" weight="medium" tone="muted">
256
+ メインコンテンツ
257
+ </Text>
258
+ <Text tone="muted">サイドバーが折りたたまれると本文が全幅に広がる。</Text>
259
+ </Flex>
260
+ </ResizablePanel>
261
+ </ResizablePanelGroup>
262
+ </div>
263
+ </Flex>
264
+ </CardContent>
265
+ </Card>
266
+ );
267
+ }
268
+
269
+ /**
270
+ * defaultLayout + onLayoutChanged + a stable id · sizes persist across reloads.
271
+ * In v4 a bare id does NOT persist; you must seed defaultLayout and capture
272
+ * onLayoutChanged. Here the saved layout is held in state and echoed on screen.
273
+ */
274
+ function PersistenceCard() {
275
+ // Layout is a map of panel id -> flexGrow value (relative, not %).
276
+ const [layout, setLayout] = React.useState<Layout>({
277
+ "persisted-nav": 30,
278
+ "persisted-content": 70,
279
+ });
280
+
281
+ const total = Object.values(layout).reduce((sum, n) => sum + n, 0) || 1;
282
+ const ratio = [layout["persisted-nav"], layout["persisted-content"]]
283
+ .map((n) => `${Math.round(((n ?? 0) / total) * 100)}%`)
284
+ .join(" / ");
285
+
286
+ return (
287
+ <Card>
288
+ <CardHeader>
289
+ <CardTitle level={2}>永続化 · defaultLayout + onLayoutChanged</CardTitle>
290
+ <CardDescription>
291
+ v4 では id 単体ではサイズは保存されない。defaultLayout で初期サイズを与え、onLayoutChanged
292
+ を localStorage 等に保存して復元する。現在の比率: {ratio}。
293
+ </CardDescription>
294
+ </CardHeader>
295
+ <CardContent>
296
+ <div style={{ height: "14rem", ...frameStyle }}>
297
+ <ResizablePanelGroup
298
+ id="persisted-group"
299
+ orientation="horizontal"
300
+ defaultLayout={layout}
301
+ onLayoutChanged={setLayout}
302
+ >
303
+ <ResizablePanel id="persisted-nav" defaultSize="30%" minSize="20%" maxSize="50%">
304
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
305
+ <Text size="xs" weight="medium" tone="muted">
306
+ 勘定科目
307
+ </Text>
308
+ <Text tone="muted">この比率は保存されます。</Text>
309
+ </Flex>
310
+ </ResizablePanel>
311
+ <ResizableHandle />
312
+ <ResizablePanel id="persisted-content" defaultSize="70%" minSize="30%">
313
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
314
+ <Text size="xs" weight="medium" tone="muted">
315
+ 仕訳一覧
316
+ </Text>
317
+ <Text tone="muted">ハンドルを動かすと上の比率表示が即時に更新される。</Text>
318
+ </Flex>
319
+ </ResizablePanel>
320
+ </ResizablePanelGroup>
321
+ </div>
322
+ </CardContent>
323
+ </Card>
324
+ );
325
+ }
326
+
327
+ /**
328
+ * disabled · read-only layout. Group disabled freezes all panels; an individual
329
+ * Separator can be disabled, and disableDoubleClick suppresses double-click reset.
330
+ */
331
+ function DisabledCard() {
332
+ return (
333
+ <Card>
334
+ <CardHeader>
335
+ <CardTitle level={2}>無効化 · disabled / disableDoubleClick</CardTitle>
336
+ <CardDescription>
337
+ ResizablePanelGroup に disabled
338
+ を渡すとレイアウトを固定(読み取り専用)にできる。Separator 単位の
339
+ disabled、ダブルクリックでのリセットを抑止する disableDoubleClick
340
+ もある。下の例はハンドルがグレーアウトし操作できない。
341
+ </CardDescription>
342
+ </CardHeader>
343
+ <CardContent>
344
+ <div style={{ height: "12rem", ...frameStyle }}>
345
+ <ResizablePanelGroup orientation="horizontal" disabled>
346
+ <ResizablePanel id="disabled-left" defaultSize="40%" minSize="20%">
347
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
348
+ <Text size="xs" weight="medium" tone="muted">
349
+ 確定済みレイアウト
350
+ </Text>
351
+ <Text tone="muted">承認後は配置を変更できません。</Text>
352
+ </Flex>
353
+ </ResizablePanel>
354
+ <ResizableHandle disabled disableDoubleClick />
355
+ <ResizablePanel id="disabled-right" defaultSize="60%" minSize="20%">
356
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
357
+ <Text size="xs" weight="medium" tone="muted">
358
+ プレビュー
359
+ </Text>
360
+ <Text tone="muted">読み取り専用ビュー。</Text>
361
+ </Flex>
362
+ </ResizablePanel>
363
+ </ResizablePanelGroup>
364
+ </div>
365
+ </CardContent>
366
+ </Card>
367
+ );
368
+ }
369
+
370
+ /** Three panes · multiple handles compose 3+ panes (IDE-style layout). */
371
+ function ThreePaneCard() {
372
+ return (
373
+ <Card>
374
+ <CardHeader>
375
+ <CardTitle level={2}>3ペイン · サイドバー + メイン + インスペクタ</CardTitle>
376
+ <CardDescription>
377
+ ResizableHandle を複数配置することで3ペイン以上に分割できる。IDE
378
+ スタイルのコードエディタやダッシュボードビルダーに適している。
379
+ </CardDescription>
380
+ </CardHeader>
381
+ <CardContent>
382
+ <div style={{ height: "14rem", ...frameStyle }}>
383
+ <ResizablePanelGroup orientation="horizontal">
384
+ <ResizablePanel id="sidebar-3pane" defaultSize="20%" minSize="15%" maxSize="30%">
385
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
386
+ <Text size="xs" weight="medium" tone="muted">
387
+ ナビゲーション
388
+ </Text>
389
+ {["売上", "仕入", "経費", "固定資産"].map((item) => (
390
+ <Text key={item} size="sm" tone="muted">
391
+ {item}
392
+ </Text>
393
+ ))}
394
+ </Flex>
395
+ </ResizablePanel>
396
+ <ResizableHandle />
397
+ <ResizablePanel id="main-3pane" defaultSize="55%" minSize="30%">
398
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
399
+ <Text size="xs" weight="medium" tone="muted">
400
+ メインコンテンツ
401
+ </Text>
402
+ <Text tone="muted">勘定科目ツリーや仕訳一覧</Text>
403
+ </Flex>
404
+ </ResizablePanel>
405
+ <ResizableHandle />
406
+ <ResizablePanel id="inspector-3pane" defaultSize="25%" minSize="15%" maxSize="40%">
407
+ <Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
408
+ <Text size="xs" weight="medium" tone="muted">
409
+ インスペクタ
410
+ </Text>
411
+ <Text tone="muted">選択項目の詳細・メタデータ</Text>
412
+ </Flex>
413
+ </ResizablePanel>
414
+ </ResizablePanelGroup>
415
+ </div>
416
+ </CardContent>
417
+ </Card>
418
+ );
419
+ }
@@ -0,0 +1,243 @@
1
+ import {
2
+ Card,
3
+ CardContent,
4
+ CardDescription,
5
+ CardHeader,
6
+ CardTitle,
7
+ StatCard,
8
+ } from "@godxjp/ui/data-display";
9
+ import { Text } from "@godxjp/ui/general";
10
+ import { Flex, PageContainer, ResponsiveGrid, SplitPane } from "@godxjp/ui/layout";
11
+
12
+ /**
13
+ * ResponsiveGrid · equal-width multi-column tile grid with automatic responsive
14
+ * collapse (CSS container queries, not viewport). It OWNS its query container
15
+ * (container-type: inline-size), so it responds to the width available to the grid
16
+ * with no external container-type declaration (gh#165). Direct children are typically
17
+ * StatCard (self-contained bordered card · never wrap in Card/CardContent) or
18
+ * Card+CardContent for richer tile bodies. columns accepts a number OR breakpoint
19
+ * object { sm?, md?, lg? } — or use the named `preset` prop (e.g. "pricing-plans") for a
20
+ * recognised collection shape instead of hand-rolling the breakpoint map. Composed only from
21
+ * real @godxjp/ui components.
22
+ */
23
+ export default function Demo() {
24
+ return (
25
+ <PageContainer
26
+ title="ResponsiveGrid"
27
+ subtitle="等幅タイルグリッド · KPI・カード比較・ダッシュボード行"
28
+ >
29
+ <Flex direction="col" gap="lg">
30
+ <Card>
31
+ <CardHeader>
32
+ <CardTitle level={2}>コンテナクエリで折り返し(自己所有のクエリコンテナ)</CardTitle>
33
+ <CardDescription>
34
+ 同じ columns=&#123;4&#125; でも、コンテナ幅で列数が変わる。左の広い領域は 4
35
+ 列、右の狭いサイドバー(約 20rem)は 1 列に折り返す。ビューポート幅は同一なので、
36
+ 折り返しの基準がコンテナ幅であることが分かる。ResponsiveGrid は自身のクエリコンテナ
37
+ (container-type: inline-size)を持つため、外側に @container を用意しなくても正しく
38
+ 折り返す(gh#165)。閾値はコンテナ幅 40 / 48 / 64rem。 列間の gap は
39
+ var(--space-stack-md) に固定で、prop では変更できない。
40
+ </CardDescription>
41
+ </CardHeader>
42
+ <CardContent>
43
+ <SplitPane
44
+ asideWidth="sm"
45
+ aside={
46
+ <Flex direction="col" gap="sm">
47
+ <Text tone="muted">狭いコンテナ(約 20rem)→ sm=1 列</Text>
48
+ {/* No wrapping `@container` needed — ResponsiveGrid OWNS its query container (gh#165). */}
49
+ <ResponsiveGrid columns={4}>
50
+ <StatCard label="今日の入金" value="¥420,000" />
51
+ <StatCard label="未処理" value="6 件" />
52
+ </ResponsiveGrid>
53
+ </Flex>
54
+ }
55
+ >
56
+ <Flex direction="col" gap="sm">
57
+ <Text tone="muted">広いコンテナ → lg=4 列</Text>
58
+ <ResponsiveGrid columns={4}>
59
+ <StatCard label="月次売上" value="¥12,400,000" delta="+8%" hint="先月比" />
60
+ <StatCard label="請求件数" value="486" delta="+12%" />
61
+ <StatCard label="売掛金残高" value="¥3,180,000" hint="未回収 23件" />
62
+ <StatCard label="回収率" value="97.2%" delta="+0.4%" />
63
+ </ResponsiveGrid>
64
+ </Flex>
65
+ </SplitPane>
66
+ </CardContent>
67
+ </Card>
68
+
69
+ <Card>
70
+ <CardHeader>
71
+ <CardTitle level={2}>Container stress · 320 / 768px 相当(外側コンテナ不要)</CardTitle>
72
+ <CardDescription>
73
+ 固定幅の親の中でも、同じ columns=&#123;4&#125; が親幅で列数を変える。親には
74
+ container-type を付けていない。ResponsiveGrid が自身のスコープでクエリするため、
75
+ 外側にコンテナ宣言がなくても 1 列に潰れない(gh#165)。
76
+ </CardDescription>
77
+ </CardHeader>
78
+ <CardContent>
79
+ <Flex direction="col" gap="md">
80
+ {["max-w-80", "max-w-3xl"].map((width) => (
81
+ <div
82
+ key={width}
83
+ className={width}
84
+ style={{ border: "1px solid hsl(var(--border))", padding: "var(--space-2)" }}
85
+ >
86
+ <ResponsiveGrid columns={4}>
87
+ {Array.from({ length: 4 }, (_, index) => (
88
+ <div
89
+ key={index}
90
+ className="bg-muted rounded text-center"
91
+ style={{ padding: "var(--space-3)" }}
92
+ >
93
+ {index + 1}
94
+ </div>
95
+ ))}
96
+ </ResponsiveGrid>
97
+ </div>
98
+ ))}
99
+ </Flex>
100
+ </CardContent>
101
+ </Card>
102
+
103
+ <Card>
104
+ <CardHeader>
105
+ <CardTitle level={2}>columns=&#123;4&#125; · KPI 行(StatCard 直置き)</CardTitle>
106
+ <CardDescription>
107
+ StatCard は自身がボーダー付き Card なので Card/CardContent でラップしない。 columns
108
+ 数値指定時は sm=min(n,2) / md=min(n,3) / lg=n に自動変換。
109
+ </CardDescription>
110
+ </CardHeader>
111
+ <CardContent>
112
+ <ResponsiveGrid columns={4}>
113
+ <StatCard label="月次売上" value="¥12,400,000" delta="+8%" hint="先月比" />
114
+ <StatCard label="請求件数" value="486" delta="+12%" />
115
+ <StatCard label="売掛金残高" value="¥3,180,000" hint="未回収 23件" />
116
+ <StatCard label="回収率" value="97.2%" delta="+0.4%" />
117
+ </ResponsiveGrid>
118
+ </CardContent>
119
+ </Card>
120
+
121
+ <Card>
122
+ <CardHeader>
123
+ <CardTitle level={2}>columns=&#123;3&#125; · 法人比較(Card+CardContent)</CardTitle>
124
+ <CardDescription>
125
+ StatCard 以外のリッチなタイルは Card+CardContent で構成。 columns=&#123;3&#125; → sm=2
126
+ / md=3 / lg=3 に自動変換。
127
+ </CardDescription>
128
+ </CardHeader>
129
+ <CardContent>
130
+ <ResponsiveGrid columns={3}>
131
+ <Card>
132
+ <CardHeader>
133
+ <CardTitle>東京本社</CardTitle>
134
+ <CardDescription>JP-001</CardDescription>
135
+ </CardHeader>
136
+ <CardContent>
137
+ <Flex direction="col" gap="xs">
138
+ <Text>売上: ¥8,200,000</Text>
139
+ <Text tone="muted">取引先: 124社</Text>
140
+ </Flex>
141
+ </CardContent>
142
+ </Card>
143
+ <Card>
144
+ <CardHeader>
145
+ <CardTitle>大阪支社</CardTitle>
146
+ <CardDescription>JP-002</CardDescription>
147
+ </CardHeader>
148
+ <CardContent>
149
+ <Flex direction="col" gap="xs">
150
+ <Text>売上: ¥3,100,000</Text>
151
+ <Text tone="muted">取引先: 57社</Text>
152
+ </Flex>
153
+ </CardContent>
154
+ </Card>
155
+ <Card>
156
+ <CardHeader>
157
+ <CardTitle>福岡拠点</CardTitle>
158
+ <CardDescription>JP-003</CardDescription>
159
+ </CardHeader>
160
+ <CardContent>
161
+ <Flex direction="col" gap="xs">
162
+ <Text>売上: ¥1,060,000</Text>
163
+ <Text tone="muted">取引先: 31社</Text>
164
+ </Flex>
165
+ </CardContent>
166
+ </Card>
167
+ </ResponsiveGrid>
168
+ </CardContent>
169
+ </Card>
170
+
171
+ <Card>
172
+ <CardHeader>
173
+ <CardTitle level={2}>
174
+ columns=&#123;&#123; sm: 1, md: 2, lg: 4 &#125;&#125; ·
175
+ ブレークポイントオブジェクト(3 段制御)
176
+ </CardTitle>
177
+ <CardDescription>
178
+ ブレークポイント指定オブジェクト: sm / md / lg
179
+ キーでコンテナ幅ごとの列数を個別に制御。
180
+ 未指定キーは下位にフォールバック(lg→md→sm、md→sm、sm 既定 1)。 数値指定(sm=min(n,2)
181
+ / md=min(n,3) / lg=n の自動変換)では作れない 「sm=1 / md=2 /
182
+ lg=4」のような任意の組み合わせを表現できる。
183
+ </CardDescription>
184
+ </CardHeader>
185
+ <CardContent>
186
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
187
+ <StatCard layout="inline" label="契約金額" value="¥4,800,000" />
188
+ <StatCard layout="inline" label="消費税額" value="¥480,000" hint="税率 10%" />
189
+ <StatCard layout="inline" label="支払済" value="¥2,400,000" delta="-50%" inverse />
190
+ <StatCard layout="inline" label="残額" value="¥2,400,000" />
191
+ </ResponsiveGrid>
192
+ </CardContent>
193
+ </Card>
194
+
195
+ <Card>
196
+ <CardHeader>
197
+ <CardTitle level={2}>
198
+ preset=&quot;pricing-plans&quot; · 課金プラン一覧(3/3/1)
199
+ </CardTitle>
200
+ <CardDescription>
201
+ 名前付きコレクション geometry: コンテナ幅が lg ステップ(64rem)に達するまでは 1
202
+ 列、そこから 3 列に切り替わる。ResponsiveGrid には lg
203
+ より上のステップが無いため、1024px 相当でも 1440px 相当でも同じ 3 列になる —
204
+ 課金プランカタログの「3/3/1」契約 (dxs-platform/platform#333)。`columns` の代わりに
205
+ `preset` を渡すだけで、呼び出し側がブレークポイント値を自作する必要がない。
206
+ </CardDescription>
207
+ </CardHeader>
208
+ <CardContent>
209
+ <ResponsiveGrid preset="pricing-plans">
210
+ <Card>
211
+ <CardHeader>
212
+ <CardTitle>スタンダード</CardTitle>
213
+ <CardDescription>¥9,800 / 月</CardDescription>
214
+ </CardHeader>
215
+ <CardContent>
216
+ <Text tone="muted">小規模チーム向けの基本プラン。</Text>
217
+ </CardContent>
218
+ </Card>
219
+ <Card>
220
+ <CardHeader>
221
+ <CardTitle>プロフェッショナル</CardTitle>
222
+ <CardDescription>¥29,800 / 月</CardDescription>
223
+ </CardHeader>
224
+ <CardContent>
225
+ <Text tone="muted">成長企業向けの推奨プラン。</Text>
226
+ </CardContent>
227
+ </Card>
228
+ <Card>
229
+ <CardHeader>
230
+ <CardTitle>エンタープライズ</CardTitle>
231
+ <CardDescription>お問い合わせ</CardDescription>
232
+ </CardHeader>
233
+ <CardContent>
234
+ <Text tone="muted">大規模組織向けのカスタムプラン。</Text>
235
+ </CardContent>
236
+ </Card>
237
+ </ResponsiveGrid>
238
+ </CardContent>
239
+ </Card>
240
+ </Flex>
241
+ </PageContainer>
242
+ );
243
+ }