@godxjp/ui 19.0.0 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/README.md +25 -128
  2. package/dist/app/app-provider.d.ts +1 -1
  3. package/dist/app/app-provider.js +3 -0
  4. package/dist/app/theme-axes.d.ts +4 -15
  5. package/dist/app/timezones.d.ts +1 -4
  6. package/dist/components/charts/area-chart.d.ts +2 -3
  7. package/dist/components/charts/bar-chart.d.ts +2 -3
  8. package/dist/components/charts/chart-frame.d.ts +7 -16
  9. package/dist/components/charts/chart-summary.d.ts +2 -2
  10. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  11. package/dist/components/charts/index.d.ts +1 -6
  12. package/dist/components/data-display/badge.d.ts +2 -12
  13. package/dist/components/data-display/card.d.ts +21 -41
  14. package/dist/components/data-display/carousel.d.ts +1 -2
  15. package/dist/components/data-display/code-block.d.ts +4 -0
  16. package/dist/components/data-display/code-block.js +24 -0
  17. package/dist/components/data-display/data-table.d.ts +15 -37
  18. package/dist/components/data-display/data-table.js +1 -3
  19. package/dist/components/data-display/descriptions.d.ts +2 -6
  20. package/dist/components/data-display/descriptions.js +0 -2
  21. package/dist/components/data-display/index.d.ts +4 -0
  22. package/dist/components/data-display/index.js +4 -0
  23. package/dist/components/data-display/list-row.d.ts +3 -22
  24. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  25. package/dist/components/data-display/progress.d.ts +1 -1
  26. package/dist/components/data-display/prose.d.ts +4 -0
  27. package/dist/components/data-display/prose.js +20 -0
  28. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  29. package/dist/components/data-display/table.d.ts +20 -80
  30. package/dist/components/data-display/table.js +0 -3
  31. package/dist/components/data-display/timeline.d.ts +3 -5
  32. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  33. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  34. package/dist/components/data-entry/calendar.d.ts +3 -2
  35. package/dist/components/data-entry/calendar.js +58 -3
  36. package/dist/components/data-entry/cascader.js +3 -1
  37. package/dist/components/data-entry/checkbox-group.js +12 -5
  38. package/dist/components/data-entry/checkbox.js +30 -21
  39. package/dist/components/data-entry/command-palette.d.ts +8 -22
  40. package/dist/components/data-entry/date-picker.d.ts +4 -5
  41. package/dist/components/data-entry/date-picker.js +12 -3
  42. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  43. package/dist/components/data-entry/date-range-picker.js +17 -6
  44. package/dist/components/data-entry/form-errors.d.ts +7 -18
  45. package/dist/components/data-entry/form-field.d.ts +1 -1
  46. package/dist/components/data-entry/form-field.js +15 -6
  47. package/dist/components/data-entry/form.d.ts +1 -9
  48. package/dist/components/data-entry/input.d.ts +16 -14
  49. package/dist/components/data-entry/input.js +13 -3
  50. package/dist/components/data-entry/month-picker.js +6 -4
  51. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  52. package/dist/components/data-entry/month-range-picker.js +11 -5
  53. package/dist/components/data-entry/number-input.d.ts +1 -5
  54. package/dist/components/data-entry/number-input.js +1 -0
  55. package/dist/components/data-entry/radio.js +19 -6
  56. package/dist/components/data-entry/search-select.d.ts +3 -5
  57. package/dist/components/data-entry/search-select.js +8 -2
  58. package/dist/components/data-entry/select.d.ts +15 -2
  59. package/dist/components/data-entry/select.js +57 -10
  60. package/dist/components/data-entry/switch.js +9 -2
  61. package/dist/components/data-entry/textarea.d.ts +10 -16
  62. package/dist/components/data-entry/textarea.js +8 -1
  63. package/dist/components/data-entry/time-picker.d.ts +3 -5
  64. package/dist/components/data-entry/tree-select.js +3 -1
  65. package/dist/components/data-entry/upload-types.d.ts +1 -5
  66. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  67. package/dist/components/feedback/dialog.d.ts +6 -15
  68. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  69. package/dist/components/feedback/sheet.d.ts +3 -10
  70. package/dist/components/feedback/sheet.js +1 -1
  71. package/dist/components/feedback/sonner.js +2 -3
  72. package/dist/components/general/activity.d.ts +4 -30
  73. package/dist/components/general/button.js +1 -10
  74. package/dist/components/general/logo.d.ts +6 -28
  75. package/dist/components/general/reveal.d.ts +3 -9
  76. package/dist/components/general/typography.d.ts +1 -3
  77. package/dist/components/layout/account-chip.d.ts +8 -0
  78. package/dist/components/layout/account-chip.js +45 -0
  79. package/dist/components/layout/auth-divider.d.ts +2 -9
  80. package/dist/components/layout/auth-shell.d.ts +1 -14
  81. package/dist/components/layout/breadcrumb.d.ts +1 -5
  82. package/dist/components/layout/centered-shell.d.ts +4 -18
  83. package/dist/components/layout/error-surface.d.ts +11 -28
  84. package/dist/components/layout/error-surface.js +4 -1
  85. package/dist/components/layout/index.d.ts +2 -0
  86. package/dist/components/layout/index.js +2 -0
  87. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  88. package/dist/components/layout/master-detail.d.ts +2 -18
  89. package/dist/components/layout/page-container.js +0 -1
  90. package/dist/components/layout/responsive-grid.d.ts +6 -1
  91. package/dist/components/layout/responsive-grid.js +9 -2
  92. package/dist/components/layout/service-role-panel.d.ts +7 -19
  93. package/dist/components/layout/sidebar.d.ts +5 -27
  94. package/dist/components/layout/sidebar.js +0 -1
  95. package/dist/components/layout/split-pane.d.ts +0 -7
  96. package/dist/components/layout/topbar.d.ts +1 -14
  97. package/dist/components/navigation/app-setting-picker.js +1 -3
  98. package/dist/components/navigation/filter-bar.d.ts +1 -6
  99. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  100. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  101. package/dist/components/navigation/tabs.js +4 -8
  102. package/dist/components/query/data-state.d.ts +2 -2
  103. package/dist/components/ui/credential-reveal.d.ts +1 -4
  104. package/dist/components/ui/hover-card.d.ts +1 -2
  105. package/dist/components/ui/separator.d.ts +2 -15
  106. package/dist/components/ui/toggle-group.d.ts +1 -5
  107. package/dist/components/ui/toggle.d.ts +6 -31
  108. package/dist/email/brand-mark.d.ts +6 -34
  109. package/dist/email/color.d.ts +7 -17
  110. package/dist/email/geometry.d.ts +4 -8
  111. package/dist/email/index.d.ts +4 -48
  112. package/dist/email/inline-style.d.ts +3 -9
  113. package/dist/email/urgency.d.ts +2 -7
  114. package/dist/form/form-context.d.ts +2 -5
  115. package/dist/form/form-root.d.ts +1 -2
  116. package/dist/i18n/messages/en.json +4 -0
  117. package/dist/i18n/messages/ja.json +4 -0
  118. package/dist/i18n/messages/vi.json +4 -0
  119. package/dist/inertia/index.d.ts +2 -10
  120. package/dist/lib/control-styles.d.ts +10 -21
  121. package/dist/lib/control-styles.js +4 -6
  122. package/dist/lib/datetime/format-date.d.ts +1 -4
  123. package/dist/lib/field-a11y.d.ts +31 -36
  124. package/dist/lib/field-a11y.js +16 -2
  125. package/dist/lib/format.d.ts +4 -8
  126. package/dist/lib/hooks.d.ts +6 -12
  127. package/dist/lib/permission-grid.d.ts +3 -18
  128. package/dist/lib/query-error.d.ts +3 -3
  129. package/dist/props/components/app.prop.d.ts +19 -27
  130. package/dist/props/components/charts.prop.d.ts +2 -3
  131. package/dist/props/components/data-display.prop.d.ts +48 -72
  132. package/dist/props/components/data-entry.prop.d.ts +41 -30
  133. package/dist/props/components/form.prop.d.ts +2 -6
  134. package/dist/props/components/general.prop.d.ts +11 -27
  135. package/dist/props/components/layout.prop.d.ts +89 -260
  136. package/dist/props/components/navigation.prop.d.ts +27 -42
  137. package/dist/props/registry.d.ts +31 -0
  138. package/dist/props/registry.js +33 -0
  139. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  140. package/dist/props/vocabulary/index.d.ts +1 -1
  141. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  142. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  143. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  144. package/dist/styles/alert-layout.css +1 -32
  145. package/dist/styles/badge-layout.css +4 -18
  146. package/dist/styles/base.css +14 -113
  147. package/dist/styles/card-layout.css +6 -128
  148. package/dist/styles/chart-layout.css +2 -17
  149. package/dist/styles/control.css +380 -458
  150. package/dist/styles/core.css +21 -0
  151. package/dist/styles/data-display-layout.css +175 -94
  152. package/dist/styles/data-entry-layout.css +0 -45
  153. package/dist/styles/density.css +1 -30
  154. package/dist/styles/dialog-layout.css +5 -69
  155. package/dist/styles/focus-ring.css +13 -87
  156. package/dist/styles/fonts.css +1 -31
  157. package/dist/styles/form-layout.css +7 -91
  158. package/dist/styles/index.css +2 -20
  159. package/dist/styles/layout.css +38 -456
  160. package/dist/styles/logo-layout.css +1 -35
  161. package/dist/styles/motion.css +3 -42
  162. package/dist/styles/navigation-layout.css +3 -50
  163. package/dist/styles/shell-layout.css +37 -403
  164. package/dist/styles/table-layout.css +16 -274
  165. package/dist/styles/text-layout.css +7 -21
  166. package/dist/styles/toggle.css +1 -23
  167. package/dist/theme/dxs.canonical.css +1 -55
  168. package/dist/theme/example.service.css +1 -26
  169. package/dist/theme/famgia.service.css +5 -15
  170. package/dist/tokens/axes.css +3 -40
  171. package/dist/tokens/base.css +1 -4
  172. package/dist/tokens/components/activity.css +6 -42
  173. package/dist/tokens/components/badge.css +4 -13
  174. package/dist/tokens/components/banner.css +4 -9
  175. package/dist/tokens/components/card.css +32 -88
  176. package/dist/tokens/components/chart.css +9 -26
  177. package/dist/tokens/components/control.css +37 -222
  178. package/dist/tokens/components/data-display.css +28 -79
  179. package/dist/tokens/components/data-entry.css +5 -19
  180. package/dist/tokens/components/descriptions.css +7 -27
  181. package/dist/tokens/components/email.css +38 -84
  182. package/dist/tokens/components/error-surface.css +2 -18
  183. package/dist/tokens/components/feedback.css +27 -124
  184. package/dist/tokens/components/form.css +13 -45
  185. package/dist/tokens/components/legal-document.css +16 -41
  186. package/dist/tokens/components/list-row.css +11 -36
  187. package/dist/tokens/components/logo.css +2 -57
  188. package/dist/tokens/components/navigation.css +16 -94
  189. package/dist/tokens/components/scroll-area.css +2 -18
  190. package/dist/tokens/components/separator.css +8 -30
  191. package/dist/tokens/components/sheet.css +3 -14
  192. package/dist/tokens/components/shell.css +53 -307
  193. package/dist/tokens/components/sidebar.css +5 -22
  194. package/dist/tokens/components/table.css +19 -140
  195. package/dist/tokens/components/toggle.css +3 -65
  196. package/dist/tokens/components/upload.css +7 -43
  197. package/dist/tokens/foundation.css +108 -383
  198. package/dist/tokens/semantic/layout.css +33 -207
  199. package/docs/CANONICAL-CONTRACTS.md +206 -0
  200. package/docs/COMPONENTS.md +157 -0
  201. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  202. package/docs/CONSUMER-RULES.md +14 -0
  203. package/docs/CUSTOMER-THEMING.md +162 -0
  204. package/docs/DATETIME.md +69 -0
  205. package/docs/DEVELOPMENT.md +173 -0
  206. package/docs/FORMS.md +143 -0
  207. package/docs/FRAME-A11Y-CI.md +267 -0
  208. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  209. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  210. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  211. package/docs/FRAME-COVERAGE.md +29 -0
  212. package/docs/PROPS-REGISTRY.md +61 -0
  213. package/docs/PROPS-VOCABULARY.md +100 -0
  214. package/docs/README.md +60 -0
  215. package/docs/REGISTRY.md +70 -0
  216. package/docs/SPACING.md +56 -0
  217. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  218. package/docs/TESTING.md +98 -0
  219. package/docs/TOKENS.md +347 -0
  220. package/docs/asset-modules.d.ts +46 -0
  221. package/docs/assets/cover-terrain.svg +6 -0
  222. package/docs/assets/portrait-amber.svg +5 -0
  223. package/docs/assets/portrait-clay.svg +5 -0
  224. package/docs/assets/portrait-indigo.svg +5 -0
  225. package/docs/assets/portrait-iris.svg +5 -0
  226. package/docs/assets/portrait-moss.svg +5 -0
  227. package/docs/assets/portrait-plum.svg +5 -0
  228. package/docs/assets/portrait-slate.svg +5 -0
  229. package/docs/charts/compact-bar-trend.tsx +328 -0
  230. package/docs/charts/size-tiers.tsx +192 -0
  231. package/docs/data-display/accordion.tsx +99 -0
  232. package/docs/data-display/avatar.tsx +355 -0
  233. package/docs/data-display/badge.tsx +247 -0
  234. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  235. package/docs/data-display/card/index.md +3 -0
  236. package/docs/data-display/card/index.tsx +285 -0
  237. package/docs/data-display/carousel.tsx +156 -0
  238. package/docs/data-display/charts.tsx +198 -0
  239. package/docs/data-display/code-block.tsx +90 -0
  240. package/docs/data-display/collapsible.tsx +162 -0
  241. package/docs/data-display/credential-reveal.tsx +145 -0
  242. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  243. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  244. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  245. package/docs/data-display/data-table/index.md +5 -0
  246. package/docs/data-display/data-table/index.tsx +295 -0
  247. package/docs/data-display/descriptions.tsx +143 -0
  248. package/docs/data-display/empty-state.tsx +164 -0
  249. package/docs/data-display/hover-card.tsx +181 -0
  250. package/docs/data-display/list-row.tsx +420 -0
  251. package/docs/data-display/permission-matrix.tsx +184 -0
  252. package/docs/data-display/popover-touch.tsx +27 -0
  253. package/docs/data-display/popover.tsx +245 -0
  254. package/docs/data-display/progress.tsx +84 -0
  255. package/docs/data-display/prose.tsx +105 -0
  256. package/docs/data-display/qr-code.tsx +68 -0
  257. package/docs/data-display/scroll-area.tsx +271 -0
  258. package/docs/data-display/service-launcher-card.tsx +145 -0
  259. package/docs/data-display/stat-card.tsx +99 -0
  260. package/docs/data-display/table.tsx +251 -0
  261. package/docs/data-display/timeline.tsx +112 -0
  262. package/docs/data-display/touch-actions.tsx +36 -0
  263. package/docs/data-display/tree-list.tsx +107 -0
  264. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  265. package/docs/data-entry/calendar.tsx +180 -0
  266. package/docs/data-entry/cascader.tsx +378 -0
  267. package/docs/data-entry/checkbox.tsx +256 -0
  268. package/docs/data-entry/color-picker.tsx +117 -0
  269. package/docs/data-entry/command-palette.tsx +179 -0
  270. package/docs/data-entry/command.tsx +262 -0
  271. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  272. package/docs/data-entry/date-picker.tsx +191 -0
  273. package/docs/data-entry/date-range-picker.tsx +149 -0
  274. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  275. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  276. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  277. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  278. package/docs/data-entry/form-field/index.md +8 -0
  279. package/docs/data-entry/form-field/index.tsx +326 -0
  280. package/docs/data-entry/form-inertia.tsx +80 -0
  281. package/docs/data-entry/form-root.tsx +102 -0
  282. package/docs/data-entry/form.tsx +724 -0
  283. package/docs/data-entry/input-otp.tsx +231 -0
  284. package/docs/data-entry/input.tsx +114 -0
  285. package/docs/data-entry/label.tsx +100 -0
  286. package/docs/data-entry/month-picker.tsx +101 -0
  287. package/docs/data-entry/month-range-picker.tsx +115 -0
  288. package/docs/data-entry/number-input.tsx +240 -0
  289. package/docs/data-entry/password-input.tsx +106 -0
  290. package/docs/data-entry/password-strength.tsx +97 -0
  291. package/docs/data-entry/radio-group.tsx +95 -0
  292. package/docs/data-entry/rating.tsx +87 -0
  293. package/docs/data-entry/search-input.tsx +120 -0
  294. package/docs/data-entry/select-async-contracts.tsx +108 -0
  295. package/docs/data-entry/select-matrix.tsx +204 -0
  296. package/docs/data-entry/select.tsx +369 -0
  297. package/docs/data-entry/slider.tsx +130 -0
  298. package/docs/data-entry/switch.tsx +67 -0
  299. package/docs/data-entry/tag-input.tsx +108 -0
  300. package/docs/data-entry/textarea.tsx +209 -0
  301. package/docs/data-entry/time-picker.tsx +99 -0
  302. package/docs/data-entry/toggle-count.tsx +293 -0
  303. package/docs/data-entry/toggle-group.tsx +225 -0
  304. package/docs/data-entry/toggle.tsx +127 -0
  305. package/docs/data-entry/transfer.tsx +97 -0
  306. package/docs/data-entry/tree-select.tsx +204 -0
  307. package/docs/data-entry/upload.tsx +184 -0
  308. package/docs/feedback/alert-dialog.tsx +270 -0
  309. package/docs/feedback/alert.tsx +248 -0
  310. package/docs/feedback/banner.tsx +183 -0
  311. package/docs/feedback/danger-confirm.tsx +88 -0
  312. package/docs/feedback/dialog-touch.tsx +24 -0
  313. package/docs/feedback/dialog.tsx +193 -0
  314. package/docs/feedback/sheet.tsx +410 -0
  315. package/docs/feedback/skeleton.tsx +111 -0
  316. package/docs/feedback/toast.tsx +135 -0
  317. package/docs/feedback/tooltip.tsx +171 -0
  318. package/docs/feedback/two-factor-setup.tsx +68 -0
  319. package/docs/foundation/_email-specimen.ts +274 -0
  320. package/docs/foundation/colors.tsx +202 -0
  321. package/docs/foundation/density.tsx +232 -0
  322. package/docs/foundation/email-tokens.tsx +306 -0
  323. package/docs/foundation/radius-shadow.tsx +152 -0
  324. package/docs/foundation/spacing.tsx +211 -0
  325. package/docs/foundation/typography.tsx +147 -0
  326. package/docs/general/activity.tsx +224 -0
  327. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  328. package/docs/general/button/examples/form-actions.tsx +85 -0
  329. package/docs/general/button/examples/toolbar.tsx +160 -0
  330. package/docs/general/button/index.md +12 -0
  331. package/docs/general/button/index.tsx +211 -0
  332. package/docs/general/logo.tsx +131 -0
  333. package/docs/general/reveal.tsx +41 -0
  334. package/docs/general/typography.tsx +152 -0
  335. package/docs/layout/account-chip.tsx +72 -0
  336. package/docs/layout/admin-collection.tsx +122 -0
  337. package/docs/layout/app-shell.tsx +374 -0
  338. package/docs/layout/aspect-ratio.tsx +119 -0
  339. package/docs/layout/auth-account-summary.tsx +103 -0
  340. package/docs/layout/auth-divider.tsx +28 -0
  341. package/docs/layout/auth-footer.tsx +37 -0
  342. package/docs/layout/auth-identity.tsx +36 -0
  343. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  344. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  345. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  346. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  347. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  348. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  349. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  350. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  351. package/docs/layout/auth-recovery/index.md +140 -0
  352. package/docs/layout/auth-recovery/index.tsx +96 -0
  353. package/docs/layout/auth-shell-context.tsx +103 -0
  354. package/docs/layout/auth-shell-device.tsx +112 -0
  355. package/docs/layout/auth-shell-registration.tsx +335 -0
  356. package/docs/layout/auth-shell-variants.tsx +139 -0
  357. package/docs/layout/auth-shell.tsx +59 -0
  358. package/docs/layout/auth-stack.tsx +40 -0
  359. package/docs/layout/centered-shell.tsx +102 -0
  360. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  361. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  362. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  363. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  364. package/docs/layout/error-surface/index.md +153 -0
  365. package/docs/layout/error-surface/index.tsx +239 -0
  366. package/docs/layout/flex.tsx +262 -0
  367. package/docs/layout/legal-document-shell/_data.ts +110 -0
  368. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  369. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  370. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  371. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  372. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  373. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  374. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  375. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  376. package/docs/layout/legal-document-shell/index.md +51 -0
  377. package/docs/layout/legal-document-shell/index.tsx +101 -0
  378. package/docs/layout/master-detail.tsx +387 -0
  379. package/docs/layout/org-switcher.tsx +131 -0
  380. package/docs/layout/page-container.tsx +946 -0
  381. package/docs/layout/resizable-panel.tsx +419 -0
  382. package/docs/layout/responsive-grid.tsx +235 -0
  383. package/docs/layout/separator.tsx +327 -0
  384. package/docs/layout/service-role-panel.tsx +144 -0
  385. package/docs/layout/sidebar.tsx +586 -0
  386. package/docs/layout/split-pane.tsx +451 -0
  387. package/docs/layout/topbar.tsx +347 -0
  388. package/docs/navigation/app-setting-picker.tsx +141 -0
  389. package/docs/navigation/breadcrumb.tsx +128 -0
  390. package/docs/navigation/context-menu.tsx +117 -0
  391. package/docs/navigation/dropdown-menu.tsx +213 -0
  392. package/docs/navigation/filter-bar.tsx +227 -0
  393. package/docs/navigation/menubar.tsx +141 -0
  394. package/docs/navigation/navigation-menu.tsx +165 -0
  395. package/docs/navigation/pagination.tsx +241 -0
  396. package/docs/navigation/steps.tsx +263 -0
  397. package/docs/navigation/tabs-rtl.tsx +28 -0
  398. package/docs/navigation/tabs.tsx +308 -0
  399. package/docs/navigation/toolbar.tsx +339 -0
  400. package/docs/providers/app-provider.tsx +191 -0
  401. package/docs/providers/format-date.tsx +230 -0
  402. package/docs/query/button-refetch.tsx +160 -0
  403. package/docs/query/data-state.tsx +192 -0
  404. package/docs/query/infinite-query-state.tsx +93 -0
  405. package/docs/query/mutation-feedback.tsx +70 -0
  406. package/docs/query/prefetch-link.tsx +262 -0
  407. package/docs/query/touch-actions.tsx +68 -0
  408. package/docs/showcase/acme-portal.tsx +441 -0
  409. package/docs/showcase/acme-website.tsx +455 -0
  410. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  411. package/docs/showcase/case2-employee-me.tsx +441 -0
  412. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  413. package/docs/showcase/case4-login.tsx +307 -0
  414. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  415. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  416. package/docs/showcase/futurelastic-web.tsx +390 -0
  417. package/docs/showcase/org-switcher.tsx +313 -0
  418. package/docs/showcase/permission-matrix.tsx +343 -0
  419. package/docs/showcase/public-landing.tsx +210 -0
  420. package/docs/showcase/settings-account-sections.tsx +559 -0
  421. package/docs/showcase/settings-security-mfa.tsx +145 -0
  422. package/docs/showcase/table-approval-queue.tsx +199 -0
  423. package/docs/showcase/table-bulk-actions.tsx +460 -0
  424. package/docs/showcase/table-compact-kintone.tsx +438 -0
  425. package/docs/showcase/table-conditional-format.tsx +367 -0
  426. package/docs/showcase/table-crud-list.tsx +544 -0
  427. package/docs/showcase/table-density.tsx +340 -0
  428. package/docs/showcase/table-expandable-rows.tsx +471 -0
  429. package/docs/showcase/table-filter-chips.tsx +461 -0
  430. package/docs/showcase/table-footer-totals.tsx +311 -0
  431. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  432. package/docs/showcase/table-master-detail.tsx +479 -0
  433. package/docs/showcase/table-pagination.tsx +320 -0
  434. package/docs/showcase/table-states.tsx +363 -0
  435. package/docs/showcase/table-sticky-columns.tsx +373 -0
  436. package/docs/showcase/table-tree-rows.tsx +444 -0
  437. package/docs/showcase/table-view-tabs.tsx +488 -0
  438. package/package.json +10 -11
  439. package/scripts/_agent-setup.mjs +16 -2
  440. package/scripts/audit-hook.mjs +3 -13
  441. package/scripts/init-agent-kit.mjs +1 -14
  442. package/scripts/postinstall.mjs +12 -12
  443. package/scripts/ui-audit.mjs +93 -31
  444. package/scripts/visual-audit-rules.mjs +51 -7
  445. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,181 @@
1
+ import {
2
+ Avatar,
3
+ AvatarFallback,
4
+ AvatarImage,
5
+ Card,
6
+ CardContent,
7
+ CardDescription,
8
+ CardHeader,
9
+ CardTitle,
10
+ HoverCard,
11
+ HoverCardContent,
12
+ HoverCardTrigger,
13
+ } from "@godxjp/ui/data-display";
14
+ import { Button, Text } from "@godxjp/ui/general";
15
+ import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
16
+
17
+ /**
18
+ * HoverCard — a rich popover shown on hover/focus of a trigger (sighted-pointer
19
+ * affordance; not a replacement for Tooltip). Composed only from real
20
+ * @godxjp/ui components. Touch layouts must keep essential identity/actions visible in the
21
+ * trigger or destination; never make HoverCard the only route to required information.
22
+ */
23
+ export default function Demo() {
24
+ return (
25
+ <PageContainer
26
+ title="HoverCard"
27
+ subtitle="Rich preview on hover/focus · entity peek, user card, positioning & delay"
28
+ >
29
+ <Flex direction="col" gap="lg">
30
+ {/* Entity peek — hover (or focus) the link to reveal the card */}
31
+ <Card>
32
+ <CardHeader>
33
+ <CardTitle level={2}>取引先プレビュー</CardTitle>
34
+ <CardDescription>
35
+ リンクをホバーまたはフォーカスすると、ページを離れずに取引先を確認できます。トリガーは
36
+ フォーカス可能なリンクなので、キーボード操作でも開きます。
37
+ </CardDescription>
38
+ </CardHeader>
39
+ <CardContent>
40
+ <HoverCard>
41
+ <HoverCardTrigger asChild>
42
+ <Button variant="link">株式会社ベトヤ</Button>
43
+ </HoverCardTrigger>
44
+ <HoverCardContent>
45
+ <Flex direction="row" gap="md" align="center">
46
+ <Avatar>
47
+ <AvatarFallback>VB</AvatarFallback>
48
+ </Avatar>
49
+ <Flex direction="col" gap="xs">
50
+ <Text weight="medium">株式会社ベトヤ</Text>
51
+ <Text size="xs" tone="muted">
52
+ 取引先 · BTY-0012 · 売掛 ¥482,000
53
+ </Text>
54
+ </Flex>
55
+ </Flex>
56
+ </HoverCardContent>
57
+ </HoverCard>
58
+ </CardContent>
59
+ </Card>
60
+
61
+ {/* User card — the second pattern promised by the subtitle */}
62
+ <Card>
63
+ <CardHeader>
64
+ <CardTitle level={2}>ユーザーカード</CardTitle>
65
+ <CardDescription>
66
+ 担当者名にホバーすると、連絡先と所属を含むユーザーカードを表示します。
67
+ </CardDescription>
68
+ </CardHeader>
69
+ <CardContent>
70
+ <HoverCard>
71
+ <HoverCardTrigger asChild>
72
+ <Button variant="link">田中 美咲</Button>
73
+ </HoverCardTrigger>
74
+ <HoverCardContent>
75
+ <Flex direction="row" gap="md" align="center">
76
+ <Avatar>
77
+ <AvatarImage src="/avatars/tanaka.png" alt="田中 美咲" />
78
+ <AvatarFallback>田</AvatarFallback>
79
+ </Avatar>
80
+ <Flex direction="col" gap="xs">
81
+ <Text weight="medium">田中 美咲</Text>
82
+ <Text size="xs" tone="muted">
83
+ 営業部 · 主任
84
+ </Text>
85
+ <Text size="xs" tone="muted">
86
+ misaki.tanaka@example.co.jp
87
+ </Text>
88
+ </Flex>
89
+ </Flex>
90
+ </HoverCardContent>
91
+ </HoverCard>
92
+ </CardContent>
93
+ </Card>
94
+
95
+ {/* Positioning — every `side` value, plus `align` and `sideOffset` */}
96
+ <Card>
97
+ <CardHeader>
98
+ <CardTitle level={2}>配置(side · align · sideOffset)</CardTitle>
99
+ <CardDescription>
100
+ ポップオーバーを開く向きは side(top / right / bottom / left)、トリガーに沿った
101
+ 位置は align、トリガーとの距離は sideOffset で制御します。各リンクをホバーすると
102
+ その向きで表示されます。
103
+ </CardDescription>
104
+ </CardHeader>
105
+ <CardContent>
106
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
107
+ <HoverCard>
108
+ <HoverCardTrigger asChild>
109
+ <Button variant="link">side=top</Button>
110
+ </HoverCardTrigger>
111
+ <HoverCardContent side="top">
112
+ <Text>上に表示(align=center)</Text>
113
+ </HoverCardContent>
114
+ </HoverCard>
115
+
116
+ <HoverCard>
117
+ <HoverCardTrigger asChild>
118
+ <Button variant="link">side=right</Button>
119
+ </HoverCardTrigger>
120
+ <HoverCardContent side="right" align="start">
121
+ <Text>右に表示(align=start)</Text>
122
+ </HoverCardContent>
123
+ </HoverCard>
124
+
125
+ <HoverCard>
126
+ <HoverCardTrigger asChild>
127
+ <Button variant="link">side=bottom</Button>
128
+ </HoverCardTrigger>
129
+ <HoverCardContent side="bottom" align="end">
130
+ <Text>下に表示(align=end)</Text>
131
+ </HoverCardContent>
132
+ </HoverCard>
133
+
134
+ <HoverCard>
135
+ <HoverCardTrigger asChild>
136
+ <Button variant="link">side=left</Button>
137
+ </HoverCardTrigger>
138
+ <HoverCardContent side="left" sideOffset={12}>
139
+ <Text>左に表示(sideOffset=12)</Text>
140
+ </HoverCardContent>
141
+ </HoverCard>
142
+ </ResponsiveGrid>
143
+ </CardContent>
144
+ </Card>
145
+
146
+ {/* Delay — openDelay / closeDelay tune the hover affordance */}
147
+ <Card>
148
+ <CardHeader>
149
+ <CardTitle level={2}>開閉ディレイ(openDelay · closeDelay)</CardTitle>
150
+ <CardDescription>
151
+ openDelay はホバーから表示までの待ち時間、closeDelay は離れてから閉じるまでの
152
+ 猶予です。長い openDelay で誤爆を防ぎ、長い closeDelay でポップオーバー内へ
153
+ ポインタを移動しやすくします。
154
+ </CardDescription>
155
+ </CardHeader>
156
+ <CardContent>
157
+ <Flex direction="row" gap="lg" wrap>
158
+ <HoverCard openDelay={700} closeDelay={150}>
159
+ <HoverCardTrigger asChild>
160
+ <Button variant="link">openDelay=700ms</Button>
161
+ </HoverCardTrigger>
162
+ <HoverCardContent>
163
+ <Text>待ってから表示。意図しないホバーで開きません。</Text>
164
+ </HoverCardContent>
165
+ </HoverCard>
166
+
167
+ <HoverCard openDelay={0} closeDelay={600}>
168
+ <HoverCardTrigger asChild>
169
+ <Button variant="link">closeDelay=600ms</Button>
170
+ </HoverCardTrigger>
171
+ <HoverCardContent>
172
+ <Text>即座に表示し、離れても少し残るのでカード内に移動できます。</Text>
173
+ </HoverCardContent>
174
+ </HoverCard>
175
+ </Flex>
176
+ </CardContent>
177
+ </Card>
178
+ </Flex>
179
+ </PageContainer>
180
+ );
181
+ }
@@ -0,0 +1,420 @@
1
+ import {
2
+ Avatar,
3
+ AvatarFallback,
4
+ Badge,
5
+ Card,
6
+ CardContent,
7
+ CardDescription,
8
+ CardHeader,
9
+ CardTitle,
10
+ ListRow,
11
+ } from "@godxjp/ui/data-display";
12
+ import { Button, Text } from "@godxjp/ui/general";
13
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
14
+ import { KeyRound, Laptop, Link2, Smartphone } from "lucide-react";
15
+
16
+ /**
17
+ * ListRow — the single-line entity-row surface for SHORT lists inside a Card. Replaces the
18
+ * hand-rolled `flex items-center justify-between border-b py-3` repeated across account pages.
19
+ * Drop rows into a flush CardContent: they stack with a quiet divider and the Card border closes
20
+ * the list. Border / radius / padding are tokenized (`--list-row-*`).
21
+ */
22
+ export default function Demo() {
23
+ return (
24
+ <PageContainer
25
+ title="ListRow"
26
+ subtitle="leading · title/description · trailing action · short entity lists inside a Card"
27
+ >
28
+ <Flex direction="col" gap="lg">
29
+ <Card>
30
+ <CardHeader>
31
+ <CardTitle level={2}>アクティブなセッション Active sessions</CardTitle>
32
+ <CardDescription>
33
+ Rows live in a flush CardContent and draw their own dividers. Trailing holds the row
34
+ action: a status Badge or a destructive Button.
35
+ </CardDescription>
36
+ </CardHeader>
37
+ <CardContent flush>
38
+ <ListRow
39
+ leading={<Smartphone aria-hidden="true" className="size-4" />}
40
+ title="iPhone 15 · Tokyo"
41
+ description="最終アクセス 2分前 · 153.240.x.x"
42
+ trailing={<Badge status="active" />}
43
+ />
44
+ <ListRow
45
+ leading={<Laptop aria-hidden="true" className="size-4" />}
46
+ title="MacBook Pro · Osaka"
47
+ description="最終アクセス 3日前 · 126.18.x.x"
48
+ trailing={
49
+ <Button size="xs" variant="outline">
50
+ ログアウト Sign out
51
+ </Button>
52
+ }
53
+ />
54
+ <ListRow
55
+ leading={<Laptop aria-hidden="true" className="size-4" />}
56
+ title="Windows · Nagoya"
57
+ description="最終アクセス 先月 · 49.98.x.x"
58
+ trailing={
59
+ <Button size="xs" variant="outline">
60
+ ログアウト Sign out
61
+ </Button>
62
+ }
63
+ />
64
+ </CardContent>
65
+ </Card>
66
+
67
+ <Card>
68
+ <CardHeader>
69
+ <CardTitle level={2}>連携アカウント Linked accounts</CardTitle>
70
+ <CardDescription>
71
+ Leading takes an icon or Avatar; trailing takes any action control. `as="li"` when the
72
+ rows are a semantic list.
73
+ </CardDescription>
74
+ </CardHeader>
75
+ <CardContent flush>
76
+ {/* `as="li"` rows are a SEMANTIC list — axe's `listitem` rule requires the parent to
77
+ actually be a list container (ul/ol/role=list), not just visually stacked divs. */}
78
+ <ul>
79
+ <ListRow
80
+ as="li"
81
+ leading={<Link2 aria-hidden="true" className="size-4" />}
82
+ title="GitHub"
83
+ description="taro@example.com として接続済み"
84
+ trailing={
85
+ <Button size="xs" variant="ghost">
86
+ 解除 Disconnect
87
+ </Button>
88
+ }
89
+ />
90
+ <ListRow
91
+ as="li"
92
+ leading={<KeyRound aria-hidden="true" className="size-4" />}
93
+ title="Passkey · iCloud Keychain"
94
+ description="2026年3月12日に追加"
95
+ trailing={<Badge tone="neutral">未使用</Badge>}
96
+ />
97
+ </ul>
98
+ </CardContent>
99
+ </Card>
100
+
101
+ {/* #224 — a long organization name plus TWO trailing Buttons. The content column shrinks
102
+ to `min(--list-row-body-min-width, 100%)` and the actions wrap onto their own line at
103
+ narrow widths, so the page root never scrolls horizontally at 390px. */}
104
+ <Card>
105
+ <CardHeader>
106
+ <CardTitle level={2}>招待 Pending invitations</CardTitle>
107
+ <CardDescription>
108
+ Long titles + two actions: the row wraps instead of widening the page. Retune the
109
+ stack threshold with `--list-row-body-min-width`, the action gap with
110
+ `--list-row-trailing-gap`.
111
+ </CardDescription>
112
+ </CardHeader>
113
+ <CardContent flush>
114
+ <ListRow
115
+ align="start"
116
+ overflow="wrap"
117
+ leading={
118
+ <Avatar className="size-8">
119
+ <AvatarFallback>グ</AvatarFallback>
120
+ </Avatar>
121
+ }
122
+ title="グローバル・トランスフォーメーション推進本部 デジタルプラットフォーム統括部"
123
+ description="招待者 山田 太郎 · 2026-07-28"
124
+ trailing={
125
+ <>
126
+ <Button size="xs" variant="ghost">
127
+ 辞退 Decline
128
+ </Button>
129
+ <Button size="xs" variant="outline">
130
+ 参加 Accept
131
+ </Button>
132
+ </>
133
+ }
134
+ />
135
+ <ListRow
136
+ align="start"
137
+ overflow="wrap"
138
+ leading={
139
+ <Avatar className="size-8">
140
+ <AvatarFallback>T</AvatarFallback>
141
+ </Avatar>
142
+ }
143
+ title="Trung tâm Điều phối Chuyển đổi số và Quản trị Dữ liệu Doanh nghiệp Toàn cầu"
144
+ description="Người mời nguyễn.van.a@example.com · 2026-07-27"
145
+ trailing={
146
+ <>
147
+ <Button size="xs" variant="ghost">
148
+ Từ chối
149
+ </Button>
150
+ <Button size="xs" variant="outline">
151
+ Chấp nhận
152
+ </Button>
153
+ </>
154
+ }
155
+ />
156
+ <ListRow
157
+ leading={
158
+ <Avatar className="size-8">
159
+ <AvatarFallback>A</AvatarFallback>
160
+ </Avatar>
161
+ }
162
+ title="Acme Global Transformation Office · Data Platform Division"
163
+ description="Invited by taro@example.com · 2026-07-26"
164
+ trailing={
165
+ <>
166
+ <Button size="xs" variant="ghost">
167
+ Decline
168
+ </Button>
169
+ <Button size="xs" variant="outline">
170
+ Accept
171
+ </Button>
172
+ </>
173
+ }
174
+ />
175
+ </CardContent>
176
+ </Card>
177
+
178
+ {/* #246 — `density="compact"` inline-actions geometry. Inside the canonical narrow card
179
+ (358px at a 390px viewport → 326px content column) the 36px Avatar, the shrinkable
180
+ title/description and the two small trailing Buttons stay on ONE line, and the history
181
+ rows keep their status Badge + ISO-8601 date inline with the title. The #224 wrap
182
+ contract is untouched: a cluster that cannot fit still wraps, never widening the page. */}
183
+ <Card>
184
+ <CardHeader>
185
+ <CardTitle level={2}>招待 · コンパクト Compact invitations</CardTitle>
186
+ <CardDescription>
187
+ `density=&quot;compact&quot;` lowers the row inset, the column gap and the body
188
+ threshold (`--list-row-compact-*`) so avatar · title · actions read as one line in a
189
+ narrow card, instead of the actions dropping to a second row.
190
+ </CardDescription>
191
+ </CardHeader>
192
+ <CardContent flush>
193
+ <ListRow
194
+ density="compact"
195
+ leading={
196
+ <Avatar className="size-9">
197
+ <AvatarFallback>グ</AvatarFallback>
198
+ </Avatar>
199
+ }
200
+ title="グローバル推進本部"
201
+ description="山田 太郎 · 2026-07-28"
202
+ trailing={
203
+ <>
204
+ <Button size="xs" variant="ghost">
205
+ 辞退
206
+ </Button>
207
+ <Button size="xs" variant="outline">
208
+ 参加
209
+ </Button>
210
+ </>
211
+ }
212
+ />
213
+ <ListRow
214
+ density="compact"
215
+ leading={
216
+ <Avatar className="size-9">
217
+ <AvatarFallback>T</AvatarFallback>
218
+ </Avatar>
219
+ }
220
+ title="Trung tâm Dữ liệu"
221
+ description="nguyen.van.a@example.com · 2026-07-27"
222
+ trailing={
223
+ <>
224
+ <Button size="xs" variant="ghost">
225
+ Từ chối
226
+ </Button>
227
+ <Button size="xs" variant="outline">
228
+ Đồng ý
229
+ </Button>
230
+ </>
231
+ }
232
+ />
233
+ <ListRow
234
+ density="compact"
235
+ leading={
236
+ <Avatar className="size-9">
237
+ <AvatarFallback>A</AvatarFallback>
238
+ </Avatar>
239
+ }
240
+ title="Acme Data Platform"
241
+ description="taro@example.com · 2026-07-26"
242
+ trailing={
243
+ <>
244
+ <Button size="xs" variant="ghost">
245
+ Decline
246
+ </Button>
247
+ <Button size="xs" variant="outline">
248
+ Accept
249
+ </Button>
250
+ </>
251
+ }
252
+ />
253
+ {/* Compact does NOT give up the #224 safety net: a title too long for the compact
254
+ threshold still wraps (and the actions drop to their own line if they cannot fit),
255
+ so the page root never scrolls horizontally. */}
256
+ <ListRow
257
+ density="compact"
258
+ align="start"
259
+ overflow="wrap"
260
+ leading={
261
+ <Avatar className="size-9">
262
+ <AvatarFallback>グ</AvatarFallback>
263
+ </Avatar>
264
+ }
265
+ title="グローバル・トランスフォーメーション推進本部 デジタルプラットフォーム統括部"
266
+ description="Trung tâm Điều phối Chuyển đổi số · 2026-07-25"
267
+ trailing={
268
+ <>
269
+ <Button size="xs" variant="ghost">
270
+ 辞退 Decline
271
+ </Button>
272
+ <Button size="xs" variant="outline">
273
+ 参加 Accept
274
+ </Button>
275
+ </>
276
+ }
277
+ />
278
+ </CardContent>
279
+ </Card>
280
+
281
+ {/* #246 — the compact HISTORY row: no leading slot, status Badge + ISO-8601 date inline. */}
282
+ <Card>
283
+ <CardHeader>
284
+ <CardTitle level={2}>履歴 Invitation history</CardTitle>
285
+ <CardDescription>
286
+ A compact row with a status Badge and an ISO-8601 date in `trailing` stays a single
287
+ line at 390px. The metadata never drops under the title.
288
+ </CardDescription>
289
+ </CardHeader>
290
+ <CardContent flush>
291
+ <ListRow
292
+ density="compact"
293
+ title="グローバル推進本部"
294
+ trailing={
295
+ <>
296
+ <Badge tone="success">承認済み</Badge>
297
+ <Text size="xs" tone="muted">
298
+ 2026-07-12
299
+ </Text>
300
+ </>
301
+ }
302
+ />
303
+ <ListRow
304
+ density="compact"
305
+ title="Trung tâm Dữ liệu"
306
+ trailing={
307
+ <>
308
+ <Badge tone="neutral">期限切れ</Badge>
309
+ <Text size="xs" tone="muted">
310
+ 2026-06-30
311
+ </Text>
312
+ </>
313
+ }
314
+ />
315
+ <ListRow
316
+ density="compact"
317
+ title="Acme Data Platform"
318
+ trailing={
319
+ <>
320
+ <Badge tone="destructive">辞退</Badge>
321
+ <Text size="xs" tone="muted">
322
+ 2026-06-18
323
+ </Text>
324
+ </>
325
+ }
326
+ />
327
+ </CardContent>
328
+ </Card>
329
+
330
+ {/* Both density branches on the same content, so the inset difference is readable at rest
331
+ without toggling anything. `default` is what a row renders with density omitted. */}
332
+ <Card>
333
+ <CardHeader>
334
+ <CardTitle level={2}>密度の対比 density=default vs compact</CardTitle>
335
+ <CardDescription>
336
+ 同じ行を density=&quot;default&quot;(既定 · ゆとりのある行間)と
337
+ density=&quot;compact&quot;(明細向けの詰めた行間)で並べています。切り替えるのは
338
+ inset · 列間 · 本文の折り返し閾値だけで、内容と操作は変わりません。
339
+ </CardDescription>
340
+ </CardHeader>
341
+ <CardContent flush>
342
+ <ListRow
343
+ density="default"
344
+ leading={<Laptop aria-hidden="true" className="size-4" />}
345
+ title="MacBook Pro · Osaka"
346
+ description={'density="default" · 最終アクセス 3日前'}
347
+ trailing={<Badge status="active" />}
348
+ />
349
+ <ListRow
350
+ density="compact"
351
+ leading={<Laptop aria-hidden="true" className="size-4" />}
352
+ title="MacBook Pro · Osaka"
353
+ description={'density="compact" · 最終アクセス 3日前'}
354
+ trailing={<Badge status="active" />}
355
+ />
356
+ </CardContent>
357
+ </Card>
358
+
359
+ {/* #225 — notification rows. `unread` renders the indicator dot (a SHAPE with localized
360
+ sr-only text, never colour alone) plus the tokenized emphasis surface; read rows keep
361
+ the gutter so every title stays on one optical axis. */}
362
+ <Card>
363
+ <CardHeader>
364
+ <CardTitle level={2}>通知 Notifications</CardTitle>
365
+ <CardDescription>
366
+ `unread` = indicator dot + `--list-row-unread-background`; `unread={false}` = the
367
+ neutral `--list-row-read-background`. Zero, one or two inline trailing actions.
368
+ </CardDescription>
369
+ </CardHeader>
370
+ <CardContent flush>
371
+ <ListRow
372
+ unread
373
+ align="start"
374
+ overflow="wrap"
375
+ title="組織「グローバル・トランスフォーメーション推進本部」への招待が届いています"
376
+ description="2026-07-30 09:12"
377
+ trailing={
378
+ <>
379
+ <Button size="xs" variant="ghost">
380
+ 既読にする
381
+ </Button>
382
+ <Button size="xs" variant="outline">
383
+ 開く
384
+ </Button>
385
+ </>
386
+ }
387
+ />
388
+ <ListRow
389
+ unread
390
+ align="start"
391
+ overflow="wrap"
392
+ title="Yêu cầu phê duyệt hợp đồng cung cấp dịch vụ vận hành hạ tầng đám mây quý III"
393
+ description="2026-07-29 17:04"
394
+ trailing={
395
+ <Button size="xs" variant="outline">
396
+ Mở
397
+ </Button>
398
+ }
399
+ />
400
+ <ListRow
401
+ unread={false}
402
+ align="start"
403
+ overflow="wrap"
404
+ title="Your monthly platform usage report for the Data Platform Division is ready"
405
+ description="2026-07-28 08:00"
406
+ />
407
+ <ListRow
408
+ unread={false}
409
+ align="start"
410
+ overflow="wrap"
411
+ title="請求書 INV-2026-0731 が発行されました"
412
+ description="2026-07-27 18:40"
413
+ trailing={<Badge tone="neutral">既読</Badge>}
414
+ />
415
+ </CardContent>
416
+ </Card>
417
+ </Flex>
418
+ </PageContainer>
419
+ );
420
+ }