@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,68 @@
1
+ import {
2
+ Card,
3
+ CardContent,
4
+ CardDescription,
5
+ CardHeader,
6
+ CardTitle,
7
+ CredentialReveal,
8
+ QrCode,
9
+ } from "@godxjp/ui/data-display";
10
+ import { Text } from "@godxjp/ui/general";
11
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
12
+
13
+ const TOTP_URI =
14
+ "otpauth://totp/GoDX:admin@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GoDX&digits=6&period=30";
15
+
16
+ export default function Demo() {
17
+ return (
18
+ <PageContainer title="QrCode" subtitle="ネットワーク送信なしで機密値を端末内エンコード">
19
+ <Flex direction="col" gap="lg">
20
+ <Card>
21
+ <CardHeader>
22
+ <CardTitle level={2}>二要素認証の登録</CardTitle>
23
+ <CardDescription>
24
+ 認証アプリでQRコードを読み取ります。読み取れない場合は手動キーを使用できます。
25
+ </CardDescription>
26
+ </CardHeader>
27
+ <CardContent>
28
+ <Flex direction="col" gap="md">
29
+ <QrCode value={TOTP_URI} label="二要素認証の登録用QRコード" size="lg" />
30
+ <CredentialReveal
31
+ secret="JBSWY3DPEHPK3PXP"
32
+ label="手動設定キー"
33
+ warning={null}
34
+ defaultRevealed
35
+ size="sm"
36
+ />
37
+ </Flex>
38
+ </CardContent>
39
+ </Card>
40
+
41
+ <Card>
42
+ <CardHeader>
43
+ <CardTitle level={2}>Size</CardTitle>
44
+ <CardDescription>
45
+ xs / sm / md / lg。SVGのため高DPIでも鮮明で、狭い画面では利用可能幅に収まります。
46
+ </CardDescription>
47
+ </CardHeader>
48
+ <CardContent>
49
+ <Flex direction="row" gap="lg" wrap align="start">
50
+ {(["xs", "sm", "md", "lg"] as const).map((size) => (
51
+ <Flex key={size} direction="col" gap="xs" align="center">
52
+ <QrCode
53
+ value={`https://godx.jp/qr/${size}`}
54
+ label={`${size} QRコード`}
55
+ size={size}
56
+ />
57
+ <Text as="span" size="sm" tone="muted">
58
+ {size}
59
+ </Text>
60
+ </Flex>
61
+ ))}
62
+ </Flex>
63
+ </CardContent>
64
+ </Card>
65
+ </Flex>
66
+ </PageContainer>
67
+ );
68
+ }
@@ -0,0 +1,303 @@
1
+ import * as React from "react";
2
+
3
+ import {
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardFooter,
8
+ CardHeader,
9
+ CardTitle,
10
+ ScrollArea,
11
+ ScrollBar,
12
+ } from "@godxjp/ui/data-display";
13
+ import { Button, Text } from "@godxjp/ui/general";
14
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
15
+
16
+ /**
17
+ * ScrollArea — custom scrollbar container. ALWAYS set an explicit height/max-height
18
+ * (vertical) or width (horizontal) on the wrapper or the scrollbar never appears.
19
+ * `type` controls when the bar is visible; `ScrollBar orientation="horizontal"`
20
+ * adds a horizontal bar. Composed only from real @godxjp/ui components.
21
+ */
22
+ const entries = Array.from(
23
+ { length: 18 },
24
+ (_, i) => `仕訳 #2024-${String(312 - i).padStart(4, "0")}`,
25
+ );
26
+
27
+ const shortEntries = entries.slice(0, 3);
28
+
29
+ /**
30
+ * The live-stream screen (gh#311). A deterministic clock: the demo never reads `Date.now()`, so the
31
+ * frame is stable, and every timestamp still goes through `Intl.DateTimeFormat` (IANA tz, 24h).
32
+ */
33
+ const STREAM_EPOCH = Date.UTC(2026, 2, 3, 0, 30, 0);
34
+ const STREAM_STEP_MS = 45_000;
35
+ const timeFormatter = new Intl.DateTimeFormat("ja-JP", {
36
+ hour: "2-digit",
37
+ minute: "2-digit",
38
+ timeZone: "Asia/Tokyo",
39
+ });
40
+
41
+ type StreamPost = { id: number; author: string; body: string };
42
+
43
+ const AUTHORS = ["佐藤 千尋", "山本 直樹", "Nguyễn Minh", "経理ボット"];
44
+
45
+ const makePost = (id: number): StreamPost => ({
46
+ id,
47
+ author: AUTHORS[((id % AUTHORS.length) + AUTHORS.length) % AUTHORS.length],
48
+ body:
49
+ id % 4 === 0
50
+ ? `月次締めのバッチが完了しました(#${String(1000 + id)})。`
51
+ : `伝票 #2026-${String(1000 + id)} を確認しました。`,
52
+ });
53
+
54
+ const INITIAL_POSTS = Array.from({ length: 24 }, (_, index) => makePost(index + 1));
55
+
56
+ const columns = [
57
+ "勘定科目",
58
+ "借方",
59
+ "貸方",
60
+ "摘要",
61
+ "部門",
62
+ "プロジェクト",
63
+ "取引先",
64
+ "登録者",
65
+ "承認者",
66
+ ];
67
+
68
+ export default function Demo() {
69
+ const [posts, setPosts] = React.useState<StreamPost[]>(INITIAL_POSTS);
70
+ const [oldestLoaded, setOldestLoaded] = React.useState(1);
71
+ const [newestSeen, setNewestSeen] = React.useState(INITIAL_POSTS.length);
72
+ const [anchored, setAnchored] = React.useState(true);
73
+ const streamViewport = React.useRef<HTMLDivElement>(null);
74
+
75
+ const receiveNewPost = () => {
76
+ const id = newestSeen + 1;
77
+ setNewestSeen(id);
78
+ setPosts((current) => [...current, makePost(id)]);
79
+ };
80
+
81
+ const loadOlderPage = () => {
82
+ const from = oldestLoaded - 10;
83
+ setOldestLoaded(from);
84
+ setPosts((current) => [
85
+ ...Array.from({ length: 10 }, (_, index) => makePost(from + index)),
86
+ ...current,
87
+ ]);
88
+ };
89
+
90
+ // The keyboard route back to the newest item. Anchoring must never be the ONLY way there, so the
91
+ // affordance is a real Button, not a scroll gesture.
92
+ const jumpToNewest = () => {
93
+ const viewport = streamViewport.current;
94
+ if (viewport) viewport.scrollTop = viewport.scrollHeight;
95
+ };
96
+
97
+ return (
98
+ <PageContainer
99
+ title="ScrollArea"
100
+ subtitle="Custom scrollbar container · needs an explicit height"
101
+ >
102
+ <Flex direction="col" gap="lg">
103
+ <Card>
104
+ <CardHeader>
105
+ <CardTitle level={2}>ライブ配信ログ(anchor=&quot;bottom&quot;)</CardTitle>
106
+ <CardDescription>
107
+ チャットや監査ログのように増え続けるストリーム。最下部にいる間だけ新着に追従し、履歴を読むために少しでも上へスクロールしたら二度と勝手に動きません(WCAG
108
+ 3.2.5)。「過去を読み込む」で上に挿入しても、いま読んでいる行は動きません。
109
+ </CardDescription>
110
+ </CardHeader>
111
+ <CardContent>
112
+ <Card variant="outline" className="h-64 w-full">
113
+ <CardContent flush>
114
+ <ScrollArea
115
+ anchor="bottom"
116
+ viewportRef={streamViewport}
117
+ onAnchoredChange={setAnchored}
118
+ type="always"
119
+ >
120
+ <CardContent>
121
+ <Flex direction="col">
122
+ {posts.map((post) => (
123
+ <Flex key={post.id} direction="col" gap="xs">
124
+ <Flex gap="sm" align="baseline">
125
+ <Text size="sm" weight="medium">
126
+ {post.author}
127
+ </Text>
128
+ <Text size="xs" tone="muted">
129
+ {timeFormatter.format(
130
+ new Date(STREAM_EPOCH + post.id * STREAM_STEP_MS),
131
+ )}
132
+ </Text>
133
+ </Flex>
134
+ <Text size="sm" tone="muted">
135
+ {post.body}
136
+ </Text>
137
+ </Flex>
138
+ ))}
139
+ </Flex>
140
+ </CardContent>
141
+ </ScrollArea>
142
+ </CardContent>
143
+ </Card>
144
+ </CardContent>
145
+ <CardFooter>
146
+ <Flex gap="sm" wrap>
147
+ <Button type="button" variant="outline" onClick={loadOlderPage}>
148
+ 過去を読み込む
149
+ </Button>
150
+ <Button type="button" variant="outline" onClick={receiveNewPost}>
151
+ 新着を受信
152
+ </Button>
153
+ <Button type="button" onClick={jumpToNewest} disabled={anchored}>
154
+ 最新へ移動
155
+ </Button>
156
+ {/* The stream itself carries no aria-live — a live region on a scroll container
157
+ re-announces on every reflow. The follow state belongs in its own small region. */}
158
+ <Text size="xs" tone="muted" role="status">
159
+ {anchored ? "最新に追従中" : "履歴を閲覧中(追従は停止)"}
160
+ </Text>
161
+ </Flex>
162
+ </CardFooter>
163
+ </Card>
164
+
165
+ <Card>
166
+ <CardHeader>
167
+ <CardTitle level={2}>anchorOffset(追従とみなす帯の広さ)</CardTitle>
168
+ <CardDescription>
169
+ 既定は --scroll-area-anchor-offset(3rem)。0 を渡すと「完全に最下部」でなければ
170
+ 追従しません。行の高さが大きいサービスは theme 側でこのトークンを上げます。
171
+ </CardDescription>
172
+ </CardHeader>
173
+ <CardContent>
174
+ <Card variant="outline" className="h-40 w-full">
175
+ <CardContent flush>
176
+ <ScrollArea anchor="bottom" anchorOffset={0} type="always">
177
+ <CardContent>
178
+ <Flex direction="col" gap="xs">
179
+ {entries.map((e) => (
180
+ <Text key={e} size="sm" className="tabular-nums">
181
+ {e}
182
+ </Text>
183
+ ))}
184
+ </Flex>
185
+ </CardContent>
186
+ </ScrollArea>
187
+ </CardContent>
188
+ </Card>
189
+ </CardContent>
190
+ </Card>
191
+
192
+ <Card>
193
+ <CardHeader>
194
+ <CardTitle level={2}>固定高さのリスト(縦スクロール)</CardTitle>
195
+ <CardDescription>
196
+ ラッパーに h-56 を指定すると、その高さがスクロール領域のビューポートになります。
197
+ </CardDescription>
198
+ </CardHeader>
199
+ <CardContent>
200
+ <Card variant="outline" className="h-56 w-full">
201
+ <CardContent flush>
202
+ <ScrollArea>
203
+ <CardContent>
204
+ <Flex direction="col" gap="xs">
205
+ {entries.map((e) => (
206
+ <div key={e} className="text-sm tabular-nums">
207
+ {e}
208
+ </div>
209
+ ))}
210
+ </Flex>
211
+ </CardContent>
212
+ </ScrollArea>
213
+ </CardContent>
214
+ </Card>
215
+ </CardContent>
216
+ </Card>
217
+
218
+ <Card>
219
+ <CardHeader>
220
+ <CardTitle level={2}>type=&quot;always&quot;(バーを常時表示)</CardTitle>
221
+ <CardDescription>
222
+ 既定の hover はホバー時のみバーを表示します。always
223
+ は内容が溢れる限りバーを常に表示します。
224
+ </CardDescription>
225
+ </CardHeader>
226
+ <CardContent>
227
+ <Card variant="outline" className="h-56 w-full">
228
+ <CardContent flush>
229
+ <ScrollArea type="always">
230
+ <CardContent>
231
+ <Flex direction="col" gap="xs">
232
+ {entries.map((e) => (
233
+ <div key={e} className="text-sm tabular-nums">
234
+ {e}
235
+ </div>
236
+ ))}
237
+ </Flex>
238
+ </CardContent>
239
+ </ScrollArea>
240
+ </CardContent>
241
+ </Card>
242
+ </CardContent>
243
+ </Card>
244
+
245
+ <Card>
246
+ <CardHeader>
247
+ <CardTitle level={2}>
248
+ 横スクロール(ScrollBar orientation=&quot;horizontal&quot;)
249
+ </CardTitle>
250
+ <CardDescription>
251
+ 横方向のバーは明示的に ScrollBar
252
+ を子要素として配置します。中身は幅を指定して溢れさせます。
253
+ </CardDescription>
254
+ </CardHeader>
255
+ <CardContent>
256
+ <Card variant="outline" className="w-full">
257
+ <CardContent flush>
258
+ <ScrollArea>
259
+ <CardContent>
260
+ <Flex gap="lg" className="w-max">
261
+ {columns.map((c) => (
262
+ <div key={c} className="text-sm whitespace-nowrap tabular-nums">
263
+ {c}
264
+ </div>
265
+ ))}
266
+ </Flex>
267
+ </CardContent>
268
+ <ScrollBar orientation="horizontal" />
269
+ </ScrollArea>
270
+ </CardContent>
271
+ </Card>
272
+ </CardContent>
273
+ </Card>
274
+
275
+ <Card>
276
+ <CardHeader>
277
+ <CardTitle level={2}>内容が収まる場合(バー非表示)</CardTitle>
278
+ <CardDescription>
279
+ 中身が高さに収まるときはスクロールバーは表示されません。
280
+ </CardDescription>
281
+ </CardHeader>
282
+ <CardContent>
283
+ <Card variant="outline" className="h-56 w-full">
284
+ <CardContent flush>
285
+ <ScrollArea type="always">
286
+ <CardContent>
287
+ <Flex direction="col" gap="xs">
288
+ {shortEntries.map((e) => (
289
+ <div key={e} className="text-sm tabular-nums">
290
+ {e}
291
+ </div>
292
+ ))}
293
+ </Flex>
294
+ </CardContent>
295
+ </ScrollArea>
296
+ </CardContent>
297
+ </Card>
298
+ </CardContent>
299
+ </Card>
300
+ </Flex>
301
+ </PageContainer>
302
+ );
303
+ }
@@ -0,0 +1,145 @@
1
+ import {
2
+ BookPlus,
3
+ Clock3,
4
+ Database,
5
+ LayoutGrid,
6
+ PlugZap,
7
+ ReceiptText,
8
+ ShieldCheck,
9
+ } from "lucide-react";
10
+
11
+ import {
12
+ ServiceCatalogCta,
13
+ ServiceLauncherCard,
14
+ ServiceLauncherCardSkeleton,
15
+ } from "@godxjp/ui/data-display";
16
+ import { Button } from "@godxjp/ui/general";
17
+ import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
18
+
19
+ /**
20
+ * ServiceLauncherCard — organization-scoped launcher states. The consumer supplies every status,
21
+ * entitlement reason and action; the component owns only the shared visual contract.
22
+ */
23
+ export default function Demo() {
24
+ return (
25
+ <PageContainer
26
+ title="ServiceLauncherCard"
27
+ subtitle="利用可能・制限中・読み込み中・カタログ導線"
28
+ >
29
+ <Flex direction="col" gap="lg">
30
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 3 }}>
31
+ <ServiceLauncherCard
32
+ icon={Clock3}
33
+ title="勤怠管理"
34
+ statusLabel="LIVE"
35
+ statusTone="success"
36
+ description="打刻、シフト、休暇申請を一つのワークスペースで管理します。"
37
+ metadata="attendance.godx.jp · Standard"
38
+ action={<Button>サービスを開く</Button>}
39
+ />
40
+ <ServiceLauncherCard
41
+ icon={ReceiptText}
42
+ title="請求管理"
43
+ statusLabel="要契約"
44
+ statusTone="warning"
45
+ description="請求書、支払い方法、利用明細を管理します。"
46
+ metadata="billing.godx.jp"
47
+ disabledReason="この組織には有効な請求管理プランがありません。"
48
+ action={<Button disabled>サービスを開く</Button>}
49
+ />
50
+ <ServiceLauncherCard
51
+ icon={ShieldCheck}
52
+ title="高度なセキュリティ管理と監査ログ"
53
+ statusLabel="管理者限定"
54
+ statusTone="info"
55
+ description="権限、二要素認証ポリシー、監査イベントを確認します。"
56
+ metadata="security.godx.jp · Enterprise"
57
+ action={<Button variant="outline">権限を確認</Button>}
58
+ />
59
+ <ServiceLauncherCardSkeleton label="サービスを読み込み中" />
60
+ <ServiceCatalogCta
61
+ title="サービスカタログから追加"
62
+ action={<Button variant="outline">カタログを見る</Button>}
63
+ />
64
+ </ResponsiveGrid>
65
+
66
+ {/* Remaining status tones — the label text is always the consumer's own copy; the
67
+ * component maps only the tone to a semantic Badge. */}
68
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 3 }}>
69
+ <ServiceLauncherCard
70
+ icon={Database}
71
+ titleLevel={3}
72
+ title="データ連携基盤"
73
+ statusLabel="停止中"
74
+ statusTone="destructive"
75
+ description="外部システムとのデータ同期ジョブを管理します。"
76
+ metadata="sync.godx.jp · Enterprise"
77
+ disabledReason="このサービスは組織の管理者によって停止されています。"
78
+ action={<Button disabled>サービスを開く</Button>}
79
+ />
80
+ <ServiceLauncherCard
81
+ icon={PlugZap}
82
+ titleLevel={3}
83
+ title="連携アプリ"
84
+ statusLabel="準備中"
85
+ statusTone="neutral"
86
+ description="サードパーティ連携の接続とスコープを設定します。"
87
+ action={<Button variant="outline">設定を開く</Button>}
88
+ />
89
+ <ServiceLauncherCard
90
+ icon={BookPlus}
91
+ titleLevel={3}
92
+ title="ナレッジベース"
93
+ statusLabel="アーカイブ"
94
+ statusTone="muted"
95
+ description="社内ドキュメントと運用手順を保管します。"
96
+ metadata="kb.godx.jp · Free"
97
+ action={<Button variant="outline">アーカイブを見る</Button>}
98
+ />
99
+ {/* The companion CTA takes an explicit glyph when the default `Plus` is too generic. */}
100
+ <ServiceCatalogCta
101
+ icon={LayoutGrid}
102
+ title="すべてのサービスを見る"
103
+ action={<Button variant="ghost">カタログ一覧</Button>}
104
+ />
105
+ </ResponsiveGrid>
106
+
107
+ {/* Long JA / EN / VI names + an unbreakable hostname: the tile must wrap, never widen its
108
+ * grid column. Same 3 → 2 → 1 grid, no page-local CSS anywhere. */}
109
+ <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 3 }}>
110
+ <ServiceLauncherCard
111
+ icon={ShieldCheck}
112
+ titleLevel={3}
113
+ title="グローバル人事情報基盤・従業員セルフサービスポータル(アジア太平洋地域)"
114
+ statusLabel="LIVE"
115
+ statusTone="success"
116
+ description="人事マスタ、勤怠、給与、評価を一元管理する統合ワークスペースです。"
117
+ metadata="workforce-identity-administration.ap-northeast-1.godx.jp · Enterprise"
118
+ action={<Button>サービスを開く</Button>}
119
+ />
120
+ <ServiceLauncherCard
121
+ icon={ShieldCheck}
122
+ titleLevel={3}
123
+ title="Acme Global Workforce Identity & Entitlement Administration Console"
124
+ statusLabel="Attention required"
125
+ statusTone="warning"
126
+ description="Review pending entitlement requests before the next access certification."
127
+ metadata="workforce-identity-administration.ap-northeast-1.godx.jp · Enterprise"
128
+ disabledReason="Your organization has no active subscription for this service yet."
129
+ action={<Button disabled>Open service</Button>}
130
+ />
131
+ <ServiceLauncherCard
132
+ icon={ShieldCheck}
133
+ titleLevel={3}
134
+ title="Cổng quản trị định danh và phân quyền nhân sự toàn cầu của doanh nghiệp"
135
+ statusLabel="Chỉ quản trị viên"
136
+ statusTone="info"
137
+ description="Xem lại quyền truy cập, chính sách xác thực hai yếu tố và nhật ký kiểm toán."
138
+ metadata="workforce-identity-administration.ap-southeast-1.godx.jp · Enterprise"
139
+ action={<Button variant="outline">Xem quyền truy cập</Button>}
140
+ />
141
+ </ResponsiveGrid>
142
+ </Flex>
143
+ </PageContainer>
144
+ );
145
+ }
@@ -0,0 +1,99 @@
1
+ import { StatCard } from "@godxjp/ui/data-display";
2
+ import { Text } from "@godxjp/ui/general";
3
+ import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
4
+ import { CheckCircle2, Package, Ship, TrendingUp, Wallet } from "lucide-react";
5
+
6
+ /**
7
+ * StatCard — KPI tile. It IS already a bordered Card, so it renders DIRECTLY in
8
+ * ResponsiveGrid — never wrapped in Card/CardContent (double border). Section
9
+ * titles are headings, not Cards. delta is sign-aware (+green / -red; inverse
10
+ * flips it). Composed only from real @godxjp/ui components.
11
+ */
12
+ export default function Demo() {
13
+ return (
14
+ <PageContainer
15
+ title="StatCard"
16
+ subtitle="KPI tiles · label · value · delta · hint, in a ResponsiveGrid"
17
+ >
18
+ <Flex direction="col" gap="lg">
19
+ <Flex direction="col" gap="sm">
20
+ <Text as="div" weight="medium">
21
+ KPI row (stacked)
22
+ </Text>
23
+ <ResponsiveGrid columns={{ sm: 2, md: 4 }}>
24
+ <StatCard label="月次売上" value="¥8,200,000" delta="+12%" hint="先月比" />
25
+ <StatCard label="請求件数" value="312" delta="+4%" />
26
+ <StatCard label="売掛金残高" value="¥1,284,500" hint="未回収 18件" />
27
+ <StatCard label="回収率" value="96.8%" delta="+1.2%" />
28
+ </ResponsiveGrid>
29
+ </Flex>
30
+
31
+ <Flex direction="col" gap="sm">
32
+ <Text as="div" weight="medium">
33
+ icon medallion (decorative · tinted via --stat-card-icon-* tokens)
34
+ </Text>
35
+ <ResponsiveGrid columns={{ sm: 2, md: 4 }}>
36
+ <StatCard icon={Package} label="処理中の注文" value="4" delta="+2" />
37
+ <StatCard icon={Ship} label="輸送中" value="2" hint="日本 → ベトナム" />
38
+ <StatCard icon={CheckCircle2} label="今月の配達" value="11" delta="+18%" />
39
+ <StatCard icon={Wallet} label="ウォレット残高" value="¥185,000" />
40
+ </ResponsiveGrid>
41
+ </Flex>
42
+
43
+ <Flex direction="col" gap="sm">
44
+ <Text as="div" weight="medium">
45
+ Delta tone · sign-aware (inverse flips it)
46
+ </Text>
47
+ <ResponsiveGrid columns={{ sm: 2, md: 3 }}>
48
+ <StatCard label="新規取引先" value="24" delta="+6" />
49
+ <StatCard label="遅延請求書" value="7" delta="-3" />
50
+ <StatCard
51
+ label="平均処理コスト"
52
+ value="¥1,180"
53
+ delta="-15%"
54
+ inverse
55
+ hint="低いほど良い"
56
+ />
57
+ </ResponsiveGrid>
58
+ </Flex>
59
+
60
+ <Flex direction="col" gap="sm">
61
+ <Text as="div" weight="medium">
62
+ Inline layout (narrow panels)
63
+ </Text>
64
+ <ResponsiveGrid columns={{ sm: 1, md: 2 }}>
65
+ <StatCard layout="inline" label="契約金額" value="¥4,800,000" />
66
+ <StatCard layout="inline" label="消費税" value="¥480,000" hint="10%" />
67
+ </ResponsiveGrid>
68
+ </Flex>
69
+
70
+ <Flex direction="col" gap="sm">
71
+ <Text as="div" weight="medium">
72
+ align=&quot;end&quot; · icon label · neutral delta
73
+ </Text>
74
+ <ResponsiveGrid columns={{ sm: 2, md: 4 }}>
75
+ <StatCard
76
+ label="当期利益"
77
+ value="¥3,120,000"
78
+ delta="+8%"
79
+ align="end"
80
+ hint="既定の密度 · 右寄せ"
81
+ />
82
+ <StatCard label="年間売上" value="¥98,400,000" delta="+11%" hint="ゆとりある密度" />
83
+ <StatCard
84
+ label={
85
+ <>
86
+ <TrendingUp aria-hidden />
87
+ 成長率
88
+ </>
89
+ }
90
+ value="14.2%"
91
+ delta="+2.1%"
92
+ />
93
+ <StatCard label="客単価" value="¥6,400" delta="0%" hint="横ばい" />
94
+ </ResponsiveGrid>
95
+ </Flex>
96
+ </Flex>
97
+ </PageContainer>
98
+ );
99
+ }