@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,193 @@
1
+ import { useState } from "react";
2
+ import {
3
+ Dialog,
4
+ DialogContent,
5
+ DialogDescription,
6
+ DialogFooter,
7
+ DialogHeader,
8
+ DialogTitle,
9
+ DialogTrigger,
10
+ } from "@godxjp/ui/feedback";
11
+ import {
12
+ Badge,
13
+ Card,
14
+ CardContent,
15
+ CardDescription,
16
+ CardHeader,
17
+ CardTitle,
18
+ } from "@godxjp/ui/data-display";
19
+ import { Button, Text } from "@godxjp/ui/general";
20
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
21
+
22
+ /** Every branch of DialogHeader's `tone`, in the order the vocabulary declares them. */
23
+ const headerTones = [
24
+ "default",
25
+ "success",
26
+ "warning",
27
+ "destructive",
28
+ "info",
29
+ "muted",
30
+ "neutral",
31
+ ] as const;
32
+
33
+ /**
34
+ * Dialog · compound controlled modal for form-style flows. Always control via
35
+ * open + onOpenChange. Include DialogHeader > DialogTitle (required for a11y).
36
+ * Use DialogFooter for primary/cancel actions.
37
+ */
38
+ export default function Demo() {
39
+ const [createOpen, setCreateOpen] = useState(true);
40
+ const [detailOpen, setDetailOpen] = useState(false);
41
+ const [toneOpen, setToneOpen] = useState(false);
42
+ const [headerTone, setHeaderTone] = useState<(typeof headerTones)[number]>("default");
43
+
44
+ return (
45
+ <PageContainer
46
+ title="Dialog"
47
+ subtitle="compound modal · form flows, detail pop-ups, multi-step wizards"
48
+ >
49
+ <Flex direction="col" gap="lg">
50
+ <Card>
51
+ <CardHeader>
52
+ <CardTitle level={2}>Form-style modal (pre-opened)</CardTitle>
53
+ <CardDescription>
54
+ Controlled via open + onOpenChange. DialogTitle is required for screen-reader
55
+ accessibility. Hold open while pending to prevent double-submit.
56
+ </CardDescription>
57
+ </CardHeader>
58
+ <CardContent>
59
+ <Dialog open={createOpen} onOpenChange={setCreateOpen}>
60
+ <DialogTrigger asChild>
61
+ <Button size="sm">仕訳新規作成</Button>
62
+ </DialogTrigger>
63
+ <DialogContent className="max-w-lg">
64
+ <DialogHeader>
65
+ <DialogTitle>新規仕訳を作成</DialogTitle>
66
+ <DialogDescription>
67
+ 借方・貸方科目と金額を入力して保存してください。
68
+ </DialogDescription>
69
+ </DialogHeader>
70
+ <Flex direction="col" gap="md">
71
+ <Flex direction="row" gap="sm" align="center">
72
+ <Text tone="muted" className="w-20 shrink-0">
73
+ 借方科目
74
+ </Text>
75
+ <Text>売掛金</Text>
76
+ </Flex>
77
+ <Flex direction="row" gap="sm" align="center">
78
+ <Text tone="muted" className="w-20 shrink-0">
79
+ 貸方科目
80
+ </Text>
81
+ <Text>売上高</Text>
82
+ </Flex>
83
+ <Flex direction="row" gap="sm" align="center">
84
+ <Text tone="muted" className="w-20 shrink-0">
85
+ 金額
86
+ </Text>
87
+ <Text>¥ 120,000</Text>
88
+ </Flex>
89
+ </Flex>
90
+ <DialogFooter>
91
+ <Button variant="outline" onClick={() => setCreateOpen(false)}>
92
+ キャンセル
93
+ </Button>
94
+ <Button onClick={() => setCreateOpen(false)}>保存</Button>
95
+ </DialogFooter>
96
+ </DialogContent>
97
+ </Dialog>
98
+ </CardContent>
99
+ </Card>
100
+
101
+ <Card>
102
+ <CardHeader>
103
+ <CardTitle level={2}>Read-only detail pop-up</CardTitle>
104
+ <CardDescription>
105
+ No footer action buttons needed, just a close trigger. Suitable for audit trail,
106
+ attachment preview, or approval history.
107
+ </CardDescription>
108
+ </CardHeader>
109
+ <CardContent>
110
+ <Dialog open={detailOpen} onOpenChange={setDetailOpen}>
111
+ <DialogTrigger asChild>
112
+ <Button variant="outline" size="sm">
113
+ 取引詳細を見る
114
+ </Button>
115
+ </DialogTrigger>
116
+ <DialogContent className="max-w-md">
117
+ <DialogHeader>
118
+ <DialogTitle>取引 #JE-2024-0042</DialogTitle>
119
+ <DialogDescription>2024年3月31日 · 月次決算仕訳</DialogDescription>
120
+ </DialogHeader>
121
+ <Flex direction="col" gap="sm">
122
+ <Flex direction="row" justify="between">
123
+ <Text tone="muted">借方</Text>
124
+ <Text>売掛金 ¥ 240,000</Text>
125
+ </Flex>
126
+ <Flex direction="row" justify="between">
127
+ <Text tone="muted">貸方</Text>
128
+ <Text>売上高 ¥ 240,000</Text>
129
+ </Flex>
130
+ <Flex direction="row" justify="between">
131
+ <Text tone="muted">摘要</Text>
132
+ <Text>3月売上計上</Text>
133
+ </Flex>
134
+ </Flex>
135
+ </DialogContent>
136
+ </Dialog>
137
+ </CardContent>
138
+ </Card>
139
+
140
+ <Card>
141
+ <CardHeader>
142
+ <CardTitle level={2}>DialogHeader tone band (every branch)</CardTitle>
143
+ <CardDescription>
144
+ DialogHeader also takes a prop-driven form: title, subtitle and an extra slot, plus
145
+ tone. tone tints only the header band and leaves the text at the foreground colour, so
146
+ the dialog never turns into a loud solid fill. default paints no band at all; muted
147
+ and neutral deliberately share the same quiet band. Close the pre-opened dialog above
148
+ with Escape, then pick a branch: the same dialog re-opens with that header.
149
+ </CardDescription>
150
+ </CardHeader>
151
+ <CardContent>
152
+ <Flex direction="col" gap="md">
153
+ <Flex direction="row" gap="sm" wrap>
154
+ {headerTones.map((tone) => (
155
+ <Button
156
+ key={tone}
157
+ variant="outline"
158
+ size="sm"
159
+ onClick={() => {
160
+ setHeaderTone(tone);
161
+ setToneOpen(true);
162
+ }}
163
+ >
164
+ {tone}
165
+ </Button>
166
+ ))}
167
+ </Flex>
168
+ <Dialog open={toneOpen} onOpenChange={setToneOpen}>
169
+ <DialogContent className="max-w-md">
170
+ <DialogHeader
171
+ tone={headerTone}
172
+ title="仕訳の取り込み結果"
173
+ subtitle={`見出し帯は tone="${headerTone}" で描画しています。`}
174
+ extra={<Badge tone={headerTone}>{headerTone}</Badge>}
175
+ />
176
+ <Text size="sm">
177
+ 帯の色だけが tone に追従し、見出しと本文の文字色は変わりません。extra
178
+ スロットは帯の右端に固定され、閉じるボタンとは重なりません。
179
+ </Text>
180
+ <DialogFooter>
181
+ <Button variant="outline" onClick={() => setToneOpen(false)}>
182
+ 閉じる
183
+ </Button>
184
+ </DialogFooter>
185
+ </DialogContent>
186
+ </Dialog>
187
+ </Flex>
188
+ </CardContent>
189
+ </Card>
190
+ </Flex>
191
+ </PageContainer>
192
+ );
193
+ }
@@ -0,0 +1,420 @@
1
+ import { useState } from "react";
2
+ import {
3
+ Sheet,
4
+ SheetBody,
5
+ SheetContent,
6
+ SheetDescription,
7
+ SheetFooter,
8
+ SheetHeader,
9
+ SheetTitle,
10
+ SheetTrigger,
11
+ useSheetResponsiveMode,
12
+ } from "@godxjp/ui/feedback";
13
+ import {
14
+ Badge,
15
+ Card,
16
+ CardContent,
17
+ CardDescription,
18
+ CardHeader,
19
+ CardTitle,
20
+ } from "@godxjp/ui/data-display";
21
+ import { Button, Text } from "@godxjp/ui/general";
22
+ import {
23
+ FormField,
24
+ Input,
25
+ Select,
26
+ SelectContent,
27
+ SelectItem,
28
+ SelectTrigger,
29
+ SelectValue,
30
+ } from "@godxjp/ui/data-entry";
31
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
32
+ import { SlidersHorizontal } from "lucide-react";
33
+
34
+ /** Every branch of SheetHeader's `tone`, in the order the vocabulary declares them. */
35
+ const headerTones = [
36
+ "default",
37
+ "success",
38
+ "warning",
39
+ "destructive",
40
+ "info",
41
+ "muted",
42
+ "neutral",
43
+ ] as const;
44
+
45
+ /**
46
+ * Sheet · side-panel drawer (Radix Dialog). Slides in from an edge. Compose
47
+ * Sheet > SheetTrigger (asChild) > SheetContent(side) > SheetHeader >
48
+ * SheetTitle (a11y required) > scrollable body > SheetFooter.
49
+ *
50
+ * SheetFooter is an Ant-Design-style PINNED action bar: it sticks to the bottom
51
+ * via mt-auto, draws a full-bleed top border, and right-aligns its actions with
52
+ * the PRIMARY button rightmost. A destructive / clear / reset action goes
53
+ * far-LEFT · give THAT button className="me-auto". Never stack footer buttons
54
+ * full-width or center them. See cardinal rule #41 "Drawer & dialog footer layout".
55
+ *
56
+ * Fields are real FormField + Input + Select primitives · never faked with
57
+ * styled <span>/<div>. Composed only from real @godxjp/ui components.
58
+ */
59
+ export default function Demo() {
60
+ // Card 1 · pre-opened so the pinned footer + clear-left/apply-right layout is visible at rest.
61
+ const [filterOpen, setFilterOpen] = useState(true);
62
+ const [account, setAccount] = useState("all");
63
+ const [status, setStatus] = useState("all");
64
+ const [source, setSource] = useState("all");
65
+ const [minAmount, setMinAmount] = useState("");
66
+ const [maxAmount, setMaxAmount] = useState("");
67
+
68
+ // Card 2 · quick-edit form: Cancel + Save, both right-aligned (primary rightmost).
69
+ const [editOpen, setEditOpen] = useState(false);
70
+ const [companyName, setCompanyName] = useState("株式会社サンプル");
71
+ const [registration, setRegistration] = useState("T1234567890123");
72
+
73
+ // Card 3 · edit with a destructive action: 削除 far-left (mr-auto), Cancel + Save right.
74
+ const [recordOpen, setRecordOpen] = useState(false);
75
+ const [memo, setMemo] = useState("4月度 経費精算");
76
+
77
+ // Card 4 · responsive detail panel. The SAME hook SheetContent uses, so the label below always
78
+ // reports the presentation the panel will actually render — resize the frame to 390 to see it flip.
79
+ const [detailOpen, setDetailOpen] = useState(false);
80
+ const presentation = useSheetResponsiveMode("auto");
81
+
82
+ // Card 5 · SheetHeader tone band. One panel, re-opened per branch, so only one overlay is ever
83
+ // mounted and the focus trap stays honest.
84
+ const [toneOpen, setToneOpen] = useState(false);
85
+ const [headerTone, setHeaderTone] = useState<(typeof headerTones)[number]>("default");
86
+
87
+ return (
88
+ <PageContainer
89
+ title="Sheet"
90
+ subtitle="side-panel drawer · filters, quick-edit, detail peek (NOT a Dialog replacement)"
91
+ >
92
+ <Flex direction="col" gap="lg">
93
+ <Card>
94
+ <CardHeader>
95
+ <CardTitle level={2}>Advanced filter (pre-opened, side=right)</CardTitle>
96
+ <CardDescription>
97
+ The defining footer pattern: actions are end-aligned, the primary 適用 is last, and
98
+ the clear/reset action クリア moves to the leading edge via
99
+ className=&quot;me-auto&quot;. The footer is pinned to the bottom with a full-bleed
100
+ top border; the body scrolls between a fixed header and footer (header inset == footer
101
+ inset). Fields are real FormField + Select + Input.
102
+ </CardDescription>
103
+ </CardHeader>
104
+ <CardContent>
105
+ <Sheet open={filterOpen} onOpenChange={setFilterOpen}>
106
+ <SheetTrigger asChild>
107
+ <Button variant="outline" size="sm">
108
+ <SlidersHorizontal />
109
+ 詳細検索
110
+ </Button>
111
+ </SheetTrigger>
112
+ <SheetContent side="right" width={420}>
113
+ <SheetHeader
114
+ tone="info"
115
+ title="詳細検索"
116
+ subtitle="条件を組み合わせて仕訳を絞り込みます。"
117
+ extra={<Badge tone="info">3 条件</Badge>}
118
+ />
119
+ <SheetBody>
120
+ <Flex direction="col" gap="md">
121
+ <FormField id="filter-account" label="勘定科目">
122
+ <Select value={account} onValueChange={setAccount}>
123
+ <SelectTrigger id="filter-account" aria-label="勘定科目">
124
+ <SelectValue placeholder="すべての勘定科目" />
125
+ </SelectTrigger>
126
+ <SelectContent>
127
+ <SelectItem value="all">すべての勘定科目</SelectItem>
128
+ <SelectItem value="cash">現金</SelectItem>
129
+ <SelectItem value="sales">売上高</SelectItem>
130
+ <SelectItem value="expense">旅費交通費</SelectItem>
131
+ </SelectContent>
132
+ </Select>
133
+ </FormField>
134
+ <FormField id="filter-status" label="ステータス">
135
+ <Select value={status} onValueChange={setStatus}>
136
+ <SelectTrigger id="filter-status" aria-label="ステータス">
137
+ <SelectValue placeholder="すべてのステータス" />
138
+ </SelectTrigger>
139
+ <SelectContent>
140
+ <SelectItem value="all">すべてのステータス</SelectItem>
141
+ <SelectItem value="draft">下書き</SelectItem>
142
+ <SelectItem value="approved">承認済み</SelectItem>
143
+ </SelectContent>
144
+ </Select>
145
+ </FormField>
146
+ <FormField id="filter-source" label="ソース">
147
+ <Select value={source} onValueChange={setSource}>
148
+ <SelectTrigger id="filter-source" aria-label="ソース">
149
+ <SelectValue placeholder="すべてのソース" />
150
+ </SelectTrigger>
151
+ <SelectContent>
152
+ <SelectItem value="all">すべてのソース</SelectItem>
153
+ <SelectItem value="manual">手入力</SelectItem>
154
+ <SelectItem value="import">インポート</SelectItem>
155
+ </SelectContent>
156
+ </Select>
157
+ </FormField>
158
+ <FormField id="filter-amount-min" label="金額">
159
+ <Flex direction="row" gap="sm" align="center">
160
+ <Input
161
+ id="filter-amount-min"
162
+ className="min-w-0 flex-1"
163
+ inputMode="numeric"
164
+ placeholder="最小"
165
+ value={minAmount}
166
+ onChange={(e) => setMinAmount(e.target.value)}
167
+ />
168
+ <Text tone="muted" aria-hidden="true">
169
+
170
+ </Text>
171
+ <Input
172
+ id="filter-amount-max"
173
+ aria-label="最大金額"
174
+ className="min-w-0 flex-1"
175
+ inputMode="numeric"
176
+ placeholder="最大"
177
+ value={maxAmount}
178
+ onChange={(e) => setMaxAmount(e.target.value)}
179
+ />
180
+ </Flex>
181
+ </FormField>
182
+ </Flex>
183
+ </SheetBody>
184
+ <SheetFooter>
185
+ <Button
186
+ variant="outline"
187
+ className="me-auto"
188
+ onClick={() => {
189
+ setAccount("all");
190
+ setStatus("all");
191
+ setSource("all");
192
+ setMinAmount("");
193
+ setMaxAmount("");
194
+ }}
195
+ >
196
+ クリア
197
+ </Button>
198
+ <Button onClick={() => setFilterOpen(false)}>適用</Button>
199
+ </SheetFooter>
200
+ </SheetContent>
201
+ </Sheet>
202
+ </CardContent>
203
+ </Card>
204
+
205
+ <Card>
206
+ <CardHeader>
207
+ <CardTitle level={2}>Quick-edit form (Cancel + Save, right-aligned)</CardTitle>
208
+ <CardDescription>
209
+ No destructive action, so both buttons sit on the right: キャンセル (secondary) to the
210
+ left of 保存 (primary). Close programmatically on submit success.
211
+ </CardDescription>
212
+ </CardHeader>
213
+ <CardContent>
214
+ <Sheet open={editOpen} onOpenChange={setEditOpen}>
215
+ <SheetTrigger asChild>
216
+ <Button variant="ghost" size="sm">
217
+ 取引先を編集
218
+ </Button>
219
+ </SheetTrigger>
220
+ <SheetContent side="right">
221
+ <SheetHeader>
222
+ <SheetTitle>取引先編集 · 株式会社サンプル</SheetTitle>
223
+ <SheetDescription>取引先の基本情報を編集します。</SheetDescription>
224
+ </SheetHeader>
225
+ <SheetBody>
226
+ <Flex direction="col" gap="md">
227
+ <FormField id="edit-company" label="会社名" required>
228
+ <Input
229
+ id="edit-company"
230
+ value={companyName}
231
+ onChange={(e) => setCompanyName(e.target.value)}
232
+ />
233
+ </FormField>
234
+ <FormField id="edit-registration" label="登録番号" helper="T + 13桁">
235
+ <Input
236
+ id="edit-registration"
237
+ value={registration}
238
+ onChange={(e) => setRegistration(e.target.value)}
239
+ />
240
+ </FormField>
241
+ </Flex>
242
+ </SheetBody>
243
+ <SheetFooter>
244
+ <Button variant="outline" onClick={() => setEditOpen(false)}>
245
+ キャンセル
246
+ </Button>
247
+ <Button onClick={() => setEditOpen(false)}>保存</Button>
248
+ </SheetFooter>
249
+ </SheetContent>
250
+ </Sheet>
251
+ </CardContent>
252
+ </Card>
253
+
254
+ <Card>
255
+ <CardHeader>
256
+ <CardTitle level={2}>Edit with destructive action (削除 far-left)</CardTitle>
257
+ <CardDescription>
258
+ A destructive / clear / reset action goes to the leading edge via
259
+ className=&quot;me-auto&quot; with variant=&quot;destructive&quot;, while キャンセル +
260
+ 保存 stay grouped at the end. This is the same me-auto slot the filter&apos;s クリア
261
+ uses.
262
+ </CardDescription>
263
+ </CardHeader>
264
+ <CardContent>
265
+ <Sheet open={recordOpen} onOpenChange={setRecordOpen}>
266
+ <SheetTrigger asChild>
267
+ <Button variant="ghost" size="sm">
268
+ 仕訳を編集
269
+ </Button>
270
+ </SheetTrigger>
271
+ <SheetContent side="right">
272
+ <SheetHeader>
273
+ <SheetTitle>仕訳編集 · #2024-0412</SheetTitle>
274
+ <SheetDescription>摘要を編集します。削除は元に戻せません。</SheetDescription>
275
+ </SheetHeader>
276
+ <SheetBody>
277
+ <Flex direction="col" gap="md">
278
+ <FormField id="record-memo" label="摘要">
279
+ <Input
280
+ id="record-memo"
281
+ value={memo}
282
+ onChange={(e) => setMemo(e.target.value)}
283
+ />
284
+ </FormField>
285
+ </Flex>
286
+ </SheetBody>
287
+ <SheetFooter>
288
+ <Button
289
+ variant="destructive"
290
+ className="me-auto"
291
+ onClick={() => setRecordOpen(false)}
292
+ >
293
+ 削除
294
+ </Button>
295
+ <Button variant="outline" onClick={() => setRecordOpen(false)}>
296
+ キャンセル
297
+ </Button>
298
+ <Button onClick={() => setRecordOpen(false)}>保存</Button>
299
+ </SheetFooter>
300
+ </SheetContent>
301
+ </Sheet>
302
+ </CardContent>
303
+ </Card>
304
+
305
+ <Card>
306
+ <CardHeader>
307
+ <CardTitle level={2}>
308
+ Responsive detail panel (responsive=&quot;auto&quot; · desktop side / mobile bottom)
309
+ </CardTitle>
310
+ <CardDescription>
311
+ ONE Sheet covers both viewports: above{" "}
312
+ <code>--sheet-responsive-breakpoint-width</code> (48rem / 768px) it is the desktop
313
+ side panel, at or below it the mobile bottom sheet capped by{" "}
314
+ <code>--sheet-bottom-max-height</code>. The breakpoint comes from a theme token. Never
315
+ re-derive it with a page-local <code>useMediaQuery</code>. Focus trap, Escape and
316
+ focus restoration are identical in both presentations because it is the same Radix
317
+ Dialog.
318
+ </CardDescription>
319
+ </CardHeader>
320
+ <CardContent>
321
+ <Flex direction="col" gap="md">
322
+ <Text size="sm" tone="muted" aria-live="polite">
323
+ 現在の表示: {presentation === "bottom" ? "bottom sheet (mobile)" : "side panel"}
324
+ </Text>
325
+ <Sheet open={detailOpen} onOpenChange={setDetailOpen}>
326
+ <SheetTrigger asChild>
327
+ <Button variant="outline" size="sm">
328
+ 請求書の詳細
329
+ </Button>
330
+ </SheetTrigger>
331
+ <SheetContent responsive="auto" width={420}>
332
+ <SheetHeader
333
+ title="請求書 INV-1024"
334
+ subtitle="2026-07-30 発行 · 株式会社サンプル"
335
+ extra={<Badge tone="success">支払済み</Badge>}
336
+ />
337
+ <SheetBody>
338
+ <Flex direction="col" gap="md">
339
+ <Text size="sm">
340
+ レコードのdetail surfaceはdesktopでは右side panel、mobileではbottom
341
+ sheetとして表示されます。
342
+ </Text>
343
+ <Text size="sm" tone="muted">
344
+ 幅は side panel のときだけ適用され、bottom sheet
345
+ では全幅になります(widthはbottomでは無視されます)。
346
+ </Text>
347
+ </Flex>
348
+ </SheetBody>
349
+ <SheetFooter>
350
+ <Button variant="outline" onClick={() => setDetailOpen(false)}>
351
+ 閉じる
352
+ </Button>
353
+ </SheetFooter>
354
+ </SheetContent>
355
+ </Sheet>
356
+ </Flex>
357
+ </CardContent>
358
+ </Card>
359
+
360
+ <Card>
361
+ <CardHeader>
362
+ <CardTitle level={2}>SheetHeader tone band (every branch)</CardTitle>
363
+ <CardDescription>
364
+ SheetHeader carries the same header contract as DialogHeader: title, subtitle, an
365
+ extra slot and tone. tone tints only the band and leaves the text at the foreground
366
+ colour. default paints no band; muted and neutral share the same quiet band on
367
+ purpose, so a caller can name intent without adding colour. Close the pre-opened
368
+ filter panel above with Escape, then pick a branch.
369
+ </CardDescription>
370
+ </CardHeader>
371
+ <CardContent>
372
+ <Flex direction="col" gap="md">
373
+ <Flex direction="row" gap="sm" wrap>
374
+ {headerTones.map((tone) => (
375
+ <Button
376
+ key={tone}
377
+ variant="outline"
378
+ size="sm"
379
+ onClick={() => {
380
+ setHeaderTone(tone);
381
+ setToneOpen(true);
382
+ }}
383
+ >
384
+ {tone}
385
+ </Button>
386
+ ))}
387
+ </Flex>
388
+ <Sheet open={toneOpen} onOpenChange={setToneOpen}>
389
+ <SheetContent side="right" width={420}>
390
+ <SheetHeader
391
+ tone={headerTone}
392
+ title="承認ステータス"
393
+ subtitle={`見出し帯は tone="${headerTone}" で描画しています。`}
394
+ extra={<Badge tone={headerTone}>{headerTone}</Badge>}
395
+ />
396
+ <SheetBody>
397
+ <Flex direction="col" gap="md">
398
+ <Text size="sm">
399
+ 帯の色だけが tone
400
+ に追従し、見出しと本文の文字色は変わりません。帯は本文と同じ左右インセットで全幅に広がります。
401
+ </Text>
402
+ <Text size="sm" tone="muted">
403
+ extra スロットは帯の右端に固定され、閉じるボタンとは重なりません。
404
+ </Text>
405
+ </Flex>
406
+ </SheetBody>
407
+ <SheetFooter>
408
+ <Button variant="outline" onClick={() => setToneOpen(false)}>
409
+ 閉じる
410
+ </Button>
411
+ </SheetFooter>
412
+ </SheetContent>
413
+ </Sheet>
414
+ </Flex>
415
+ </CardContent>
416
+ </Card>
417
+ </Flex>
418
+ </PageContainer>
419
+ );
420
+ }