@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,230 @@
1
+ import { AppProvider } from "@godxjp/ui/app";
2
+ import { formatDate } from "@godxjp/ui/datetime";
3
+ import { Text } from "@godxjp/ui/general";
4
+ import {
5
+ Card,
6
+ CardContent,
7
+ CardDescription,
8
+ CardHeader,
9
+ CardTitle,
10
+ Descriptions,
11
+ } from "@godxjp/ui/data-display";
12
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
13
+
14
+ /**
15
+ * formatDate · MANDATORY date/time display function from @godxjp/ui/datetime.
16
+ * Reads locale, timezone, dateFormat, and timeFormat from AppProvider context.
17
+ * NEVER call date-fns or Intl.DateTimeFormat directly; use formatDate instead.
18
+ * Composed only from real @godxjp/ui components. All inputs are fixed ISO strings.
19
+ */
20
+
21
+ const ISO_DATE = "2024-04-12";
22
+ const ISO_DATETIME = "2024-04-12T09:30:00+09:00";
23
+ const HH_MM = "09:30";
24
+ const PAST_DATETIME = "2024-01-15T14:45:00+09:00";
25
+ const NULL_VALUE = null;
26
+
27
+ export default function Demo() {
28
+ return (
29
+ <AppProvider
30
+ defaultLocale="ja"
31
+ defaultTimezone="Asia/Tokyo"
32
+ defaultDateFormat="iso"
33
+ defaultTimeFormat="24h"
34
+ persist={false}
35
+ >
36
+ <PageContainer
37
+ title="formatDate"
38
+ subtitle="日付・時刻・相対表示の統一フォーマット関数 · AppProvider コンテキストを自動参照"
39
+ >
40
+ <Flex direction="col" gap="lg">
41
+ {/* Overview */}
42
+ <Card>
43
+ <CardHeader>
44
+ <CardTitle level={2}>概要</CardTitle>
45
+ <CardDescription>
46
+ formatDate は @godxjp/ui/datetime からインポートする関数。 AppProvider の locale /
47
+ timezone / dateFormat / timeFormat を読み取り、 null / undefined を渡すと em-dash
48
+ (&mdash;) を返す。 date-fns や Intl.DateTimeFormat を直接呼ばないこと。
49
+ </CardDescription>
50
+ </CardHeader>
51
+ <CardContent>
52
+ <Text as="p" tone="muted">
53
+ このデモは{" "}
54
+ <Text as="code" mono size="xs">
55
+ defaultLocale=&quot;ja&quot; defaultTimezone=&quot;Asia/Tokyo&quot;
56
+ defaultDateFormat=&quot;iso&quot; defaultTimeFormat=&quot;24h&quot;
57
+ </Text>{" "}
58
+ の AppProvider でラップされている。
59
+ </Text>
60
+ </CardContent>
61
+ </Card>
62
+
63
+ {/* kind: "date" */}
64
+ <Card>
65
+ <CardHeader>
66
+ <CardTitle level={2}>kind: &quot;date&quot; · 日付のみ</CardTitle>
67
+ <CardDescription>
68
+ ISO yyyy-MM-dd を渡すと auto で &quot;date&quot; と判定されるが、 kind:
69
+ &quot;date&quot; を明示すると ISO datetime 文字列でも日付部分だけを表示できる。
70
+ </CardDescription>
71
+ </CardHeader>
72
+ <CardContent>
73
+ <Descriptions columns={2}>
74
+ <Descriptions.Item label="入力値" mono>
75
+ {ISO_DATE}
76
+ </Descriptions.Item>
77
+ <Descriptions.Item label="kind">&quot;date&quot;</Descriptions.Item>
78
+ <Descriptions.Item label="出力" mono span={2}>
79
+ {formatDate(ISO_DATE, { kind: "date" })}
80
+ </Descriptions.Item>
81
+ </Descriptions>
82
+ </CardContent>
83
+ </Card>
84
+
85
+ {/* kind: "time" */}
86
+ <Card>
87
+ <CardHeader>
88
+ <CardTitle level={2}>kind: &quot;time&quot; · 時刻のみ</CardTitle>
89
+ <CardDescription>
90
+ HH:mm 文字列は auto-detection で &quot;time&quot; と判定される。 AppProvider の
91
+ timeFormat (24h / 12h) に従い出力が切り替わる。
92
+ </CardDescription>
93
+ </CardHeader>
94
+ <CardContent>
95
+ <Descriptions columns={2}>
96
+ <Descriptions.Item label="入力値" mono>
97
+ {HH_MM}
98
+ </Descriptions.Item>
99
+ <Descriptions.Item label="kind">&quot;time&quot;</Descriptions.Item>
100
+ <Descriptions.Item label="出力 (24h)" mono span={2}>
101
+ {formatDate(HH_MM, { kind: "time" })}
102
+ </Descriptions.Item>
103
+ </Descriptions>
104
+ </CardContent>
105
+ </Card>
106
+
107
+ {/* kind: "datetime" */}
108
+ <Card>
109
+ <CardHeader>
110
+ <CardTitle level={2}>kind: &quot;datetime&quot; · 日時</CardTitle>
111
+ <CardDescription>
112
+ ISO datetime 文字列を渡すと auto-detection で &quot;datetime&quot; と判定される。
113
+ 取引タイムスタンプや更新日時の表示に使用する。
114
+ </CardDescription>
115
+ </CardHeader>
116
+ <CardContent>
117
+ <Descriptions columns={2}>
118
+ <Descriptions.Item label="入力値" mono span={2}>
119
+ {ISO_DATETIME}
120
+ </Descriptions.Item>
121
+ <Descriptions.Item label="kind">&quot;datetime&quot;</Descriptions.Item>
122
+ <Descriptions.Item label="出力" mono>
123
+ {formatDate(ISO_DATETIME, { kind: "datetime" })}
124
+ </Descriptions.Item>
125
+ </Descriptions>
126
+ </CardContent>
127
+ </Card>
128
+
129
+ {/* kind: "long" */}
130
+ <Card>
131
+ <CardHeader>
132
+ <CardTitle level={2}>kind: &quot;long&quot; · 長形式 (PPP)</CardTitle>
133
+ <CardDescription>
134
+ モーダルや詳細パネルで年月日を読みやすく表示するときに使う。
135
+ ロケールに合わせた月名や曜日を含む完全形式で出力される。
136
+ </CardDescription>
137
+ </CardHeader>
138
+ <CardContent>
139
+ <Descriptions columns={2}>
140
+ <Descriptions.Item label="入力値" mono>
141
+ {ISO_DATE}
142
+ </Descriptions.Item>
143
+ <Descriptions.Item label="kind">&quot;long&quot;</Descriptions.Item>
144
+ <Descriptions.Item label="出力" mono span={2}>
145
+ {formatDate(ISO_DATE, { kind: "long" })}
146
+ </Descriptions.Item>
147
+ </Descriptions>
148
+ </CardContent>
149
+ </Card>
150
+
151
+ {/* kind: "relative" */}
152
+ <Card>
153
+ <CardHeader>
154
+ <CardTitle level={2}>kind: &quot;relative&quot; · 相対表示</CardTitle>
155
+ <CardDescription>
156
+ アクティビティフィードや監査ログで &quot;3日前&quot; のような相対表現を出力する。
157
+ ロケールに応じた文字列 (ja: &quot;3日前&quot; / en: &quot;3 days ago&quot;) になる。
158
+ </CardDescription>
159
+ </CardHeader>
160
+ <CardContent>
161
+ <Descriptions columns={2}>
162
+ <Descriptions.Item label="入力値" mono span={2}>
163
+ {PAST_DATETIME}
164
+ </Descriptions.Item>
165
+ <Descriptions.Item label="kind">&quot;relative&quot;</Descriptions.Item>
166
+ <Descriptions.Item label="出力" mono>
167
+ {formatDate(PAST_DATETIME, { kind: "relative" })}
168
+ </Descriptions.Item>
169
+ </Descriptions>
170
+ </CardContent>
171
+ </Card>
172
+
173
+ {/* null / undefined handling */}
174
+ <Card>
175
+ <CardHeader>
176
+ <CardTitle level={2}>null / undefined · em-dash フォールバック</CardTitle>
177
+ <CardDescription>
178
+ null / undefined / 空文字を渡すと em-dash (&mdash;) を返す。
179
+ 呼び出し前に三項演算子でガードする必要はない。
180
+ </CardDescription>
181
+ </CardHeader>
182
+ <CardContent>
183
+ <Descriptions columns={2}>
184
+ <Descriptions.Item label="入力値" mono>
185
+ null
186
+ </Descriptions.Item>
187
+ <Descriptions.Item label="kind">(省略)</Descriptions.Item>
188
+ <Descriptions.Item label="出力" mono span={2}>
189
+ {formatDate(NULL_VALUE)}
190
+ </Descriptions.Item>
191
+ </Descriptions>
192
+ </CardContent>
193
+ </Card>
194
+
195
+ {/* Summary table */}
196
+ <Card>
197
+ <CardHeader>
198
+ <CardTitle level={2}>kind オプション一覧</CardTitle>
199
+ <CardDescription>
200
+ 各 kind と対応する入力・出力の早見表。auto は入力値の形式から自動判定する。
201
+ </CardDescription>
202
+ </CardHeader>
203
+ <CardContent>
204
+ <Descriptions columns={3}>
205
+ <Descriptions.Item label='kind: "date"' mono>
206
+ {formatDate(ISO_DATE, { kind: "date" })}
207
+ </Descriptions.Item>
208
+ <Descriptions.Item label='kind: "time"' mono>
209
+ {formatDate(HH_MM, { kind: "time" })}
210
+ </Descriptions.Item>
211
+ <Descriptions.Item label='kind: "datetime"' mono>
212
+ {formatDate(ISO_DATETIME, { kind: "datetime" })}
213
+ </Descriptions.Item>
214
+ <Descriptions.Item label='kind: "long"' mono>
215
+ {formatDate(ISO_DATE, { kind: "long" })}
216
+ </Descriptions.Item>
217
+ <Descriptions.Item label='kind: "relative"' mono>
218
+ {formatDate(PAST_DATETIME, { kind: "relative" })}
219
+ </Descriptions.Item>
220
+ <Descriptions.Item label='kind: "auto" (省略時)' mono>
221
+ {formatDate(ISO_DATE)}
222
+ </Descriptions.Item>
223
+ </Descriptions>
224
+ </CardContent>
225
+ </Card>
226
+ </Flex>
227
+ </PageContainer>
228
+ </AppProvider>
229
+ );
230
+ }
@@ -0,0 +1,160 @@
1
+ import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
2
+
3
+ import {
4
+ Badge,
5
+ Card,
6
+ CardAction,
7
+ CardContent,
8
+ CardDescription,
9
+ CardHeader,
10
+ CardTitle,
11
+ DataTable,
12
+ type ColumnDef,
13
+ } from "@godxjp/ui/data-display";
14
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
15
+ import { ButtonRefetch } from "@godxjp/ui/query";
16
+
17
+ /**
18
+ * ButtonRefetch · a Refresh button wired directly to a useQuery result: it spins
19
+ * and auto-disables while query.isFetching and calls query.refetch() on click.
20
+ * Never pass onClick/disabled yourself. Composed from real @godxjp/ui +
21
+ * @tanstack/react-query.
22
+ */
23
+ const queryClient = new QueryClient();
24
+
25
+ type Invoice = { id: string; partner: string; status: "active" | "pending" };
26
+ const invoices: Invoice[] = [
27
+ { id: "INV-0312", partner: "株式会社ベトヤ", status: "active" },
28
+ { id: "INV-0311", partner: "ハノイ物流", status: "pending" },
29
+ ];
30
+ const columns: ColumnDef<Invoice>[] = [
31
+ { key: "id", header: "請求書番号" },
32
+ { key: "partner", header: "取引先" },
33
+ { key: "status", header: "状態", render: (row) => <Badge status={row.status} /> },
34
+ ];
35
+
36
+ /** Each card owns its own query so the matrices never refetch in lockstep. */
37
+ function useInvoiceQuery(key: string) {
38
+ return useQuery({ queryKey: [key], queryFn: async () => invoices });
39
+ }
40
+
41
+ function Block() {
42
+ const query = useInvoiceQuery("br-invoices");
43
+ return (
44
+ <Card>
45
+ <CardHeader>
46
+ <CardTitle level={2}>請求書 一覧</CardTitle>
47
+ <CardDescription>The header Refresh button is bound to the query.</CardDescription>
48
+ <CardAction>
49
+ <ButtonRefetch query={query} label="更新" />
50
+ </CardAction>
51
+ </CardHeader>
52
+ <CardContent flush>
53
+ <DataTable
54
+ data={query.data ?? []}
55
+ columns={columns}
56
+ getRowId={(r) => r.id}
57
+ loading={query.isPending}
58
+ />
59
+ </CardContent>
60
+ </Card>
61
+ );
62
+ }
63
+
64
+ function VariantBlock() {
65
+ const query = useInvoiceQuery("br-variants");
66
+ return (
67
+ <Card>
68
+ <CardHeader>
69
+ <CardTitle level={2}>variant</CardTitle>
70
+ <CardDescription>
71
+ Button の構造バリアントをそのまま受け取る。既定は outline · ページヘッダーでは outline か
72
+ ghost を使い、default は主要操作のために空けておく。
73
+ </CardDescription>
74
+ </CardHeader>
75
+ <CardContent>
76
+ <Flex direction="row" gap="sm" wrap>
77
+ <ButtonRefetch query={query} variant="default" label="default" />
78
+ <ButtonRefetch query={query} variant="secondary" label="secondary" />
79
+ <ButtonRefetch query={query} variant="outline" label="outline" />
80
+ <ButtonRefetch query={query} variant="dashed" label="dashed" />
81
+ <ButtonRefetch query={query} variant="ghost" label="ghost" />
82
+ <ButtonRefetch query={query} variant="destructive" label="destructive" />
83
+ <ButtonRefetch query={query} variant="link" label="link" />
84
+ </Flex>
85
+ </CardContent>
86
+ </Card>
87
+ );
88
+ }
89
+
90
+ function SizeBlock() {
91
+ const query = useInvoiceQuery("br-sizes");
92
+ return (
93
+ <Card>
94
+ <CardHeader>
95
+ <CardTitle level={2}>size</CardTitle>
96
+ <CardDescription>
97
+ テキスト付きの 5 段階と、正方形のアイコンのみ 4 段階。アイコンのみの場合は label
98
+ を外し、aria-label で名前を与える。
99
+ </CardDescription>
100
+ </CardHeader>
101
+ <CardContent>
102
+ <Flex direction="col" gap="md">
103
+ <Flex direction="row" gap="sm" wrap>
104
+ <ButtonRefetch query={query} size="xs" label="xs" />
105
+ <ButtonRefetch query={query} size="sm" label="sm" />
106
+ <ButtonRefetch query={query} size="md" label="md" />
107
+ <ButtonRefetch query={query} size="default" label="default" />
108
+ <ButtonRefetch query={query} size="lg" label="lg" />
109
+ </Flex>
110
+ <Flex direction="row" gap="sm" wrap>
111
+ <ButtonRefetch query={query} size="icon-xs" label={null} aria-label="更新 icon-xs" />
112
+ <ButtonRefetch query={query} size="icon-sm" label={null} aria-label="更新 icon-sm" />
113
+ <ButtonRefetch query={query} size="icon" label={null} aria-label="更新 icon" />
114
+ <ButtonRefetch query={query} size="icon-lg" label={null} aria-label="更新 icon-lg" />
115
+ </Flex>
116
+ </Flex>
117
+ </CardContent>
118
+ </Card>
119
+ );
120
+ }
121
+
122
+ function ShapeBlock() {
123
+ const query = useInvoiceQuery("br-shapes");
124
+ return (
125
+ <Card>
126
+ <CardHeader>
127
+ <CardTitle level={2}>shape</CardTitle>
128
+ <CardDescription>
129
+ 角の形状。既定は制御半径 · pill は完全な丸み · sharp は直角で、隣接するツールバーの
130
+ 角に合わせる。
131
+ </CardDescription>
132
+ </CardHeader>
133
+ <CardContent>
134
+ <Flex direction="row" gap="sm" wrap>
135
+ <ButtonRefetch query={query} shape="default" label="default" />
136
+ <ButtonRefetch query={query} shape="pill" label="pill" />
137
+ <ButtonRefetch query={query} shape="sharp" label="sharp" />
138
+ </Flex>
139
+ </CardContent>
140
+ </Card>
141
+ );
142
+ }
143
+
144
+ export default function Demo() {
145
+ return (
146
+ <QueryClientProvider client={queryClient}>
147
+ <PageContainer
148
+ title="ButtonRefetch"
149
+ subtitle="Refresh button bound to a useQuery · spins while fetching"
150
+ >
151
+ <Flex direction="col" gap="lg">
152
+ <Block />
153
+ <VariantBlock />
154
+ <SizeBlock />
155
+ <ShapeBlock />
156
+ </Flex>
157
+ </PageContainer>
158
+ </QueryClientProvider>
159
+ );
160
+ }
@@ -0,0 +1,192 @@
1
+ import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
2
+
3
+ import {
4
+ Badge,
5
+ Card,
6
+ CardContent,
7
+ CardDescription,
8
+ CardHeader,
9
+ CardTitle,
10
+ DataTable,
11
+ EmptyState,
12
+ type ColumnDef,
13
+ } from "@godxjp/ui/data-display";
14
+ import { SkeletonTable } from "@godxjp/ui/feedback";
15
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
16
+ import { DataState } from "@godxjp/ui/query";
17
+
18
+ /**
19
+ * DataState · drives skeleton / error / empty / success for ONE useQuery block.
20
+ * It IS the conditional; never branch on isPending/isError yourself. Composed
21
+ * only from real @godxjp/ui components + @tanstack/react-query.
22
+ */
23
+ const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } });
24
+
25
+ type Invoice = { id: string; partner: string; status: "active" | "pending" };
26
+
27
+ const invoices: Invoice[] = [
28
+ { id: "INV-0312", partner: "株式会社ベトヤ", status: "active" },
29
+ { id: "INV-0311", partner: "ハノイ物流", status: "pending" },
30
+ ];
31
+
32
+ const columns: ColumnDef<Invoice>[] = [
33
+ { key: "id", header: "請求書番号" },
34
+ { key: "partner", header: "取引先" },
35
+ { key: "status", header: "状態", render: (row) => <Badge status={row.status} /> },
36
+ ];
37
+
38
+ function SuccessBlock() {
39
+ const query = useQuery({ queryKey: ["ds-success"], queryFn: async () => invoices });
40
+ return (
41
+ <DataState
42
+ query={query}
43
+ skeleton={<SkeletonTable />}
44
+ isEmpty={(d) => d.length === 0}
45
+ empty={<EmptyState title="データがありません" />}
46
+ >
47
+ {(d) => <DataTable data={d} columns={columns} getRowId={(r) => r.id} />}
48
+ </DataState>
49
+ );
50
+ }
51
+
52
+ function LoadingBlock() {
53
+ const query = useQuery({
54
+ queryKey: ["ds-loading"],
55
+ queryFn: () => new Promise<Invoice[]>(() => {}),
56
+ });
57
+ return (
58
+ <DataState query={query} skeleton={<SkeletonTable />}>
59
+ {(d) => <DataTable data={d} columns={columns} getRowId={(r) => r.id} />}
60
+ </DataState>
61
+ );
62
+ }
63
+
64
+ function ErrorBlock() {
65
+ const query = useQuery<Invoice[]>({
66
+ queryKey: ["ds-error"],
67
+ queryFn: async () => {
68
+ throw new Error("サーバーエラー (503) · 取得に失敗しました");
69
+ },
70
+ });
71
+ return (
72
+ <DataState query={query} skeleton={<SkeletonTable />}>
73
+ {(d) => <DataTable data={d} columns={columns} getRowId={(r) => r.id} />}
74
+ </DataState>
75
+ );
76
+ }
77
+
78
+ function PrerequisiteBlock() {
79
+ // A tenant-scoped query stays disabled until an organization is selected (`enabled:false`).
80
+ // It reads as pending with fetchStatus "idle" — DataState shows the prerequisite, not a skeleton.
81
+ const query = useQuery<Invoice[]>({
82
+ queryKey: ["ds-prerequisite"],
83
+ queryFn: async () => invoices,
84
+ enabled: false,
85
+ });
86
+ return (
87
+ <DataState
88
+ query={query}
89
+ skeleton={<SkeletonTable />}
90
+ prerequisite={
91
+ <EmptyState
92
+ title="組織を選択してください"
93
+ description="表示するデータを絞り込むために組織を選択してください。"
94
+ />
95
+ }
96
+ >
97
+ {(d) => <DataTable data={d} columns={columns} getRowId={(r) => r.id} />}
98
+ </DataState>
99
+ );
100
+ }
101
+
102
+ function AuthErrorBlock() {
103
+ // A 401 / expired token never resolves by retrying — DataState offers session renewal instead.
104
+ const query = useQuery<Invoice[]>({
105
+ queryKey: ["ds-auth-error"],
106
+ queryFn: async () => {
107
+ throw new Error("Access token invalid");
108
+ },
109
+ });
110
+ return (
111
+ <DataState
112
+ query={query}
113
+ skeleton={<SkeletonTable />}
114
+ onAuthError={() => window.location.assign("/login")}
115
+ >
116
+ {(d) => <DataTable data={d} columns={columns} getRowId={(r) => r.id} />}
117
+ </DataState>
118
+ );
119
+ }
120
+
121
+ export default function Demo() {
122
+ return (
123
+ <QueryClientProvider client={queryClient}>
124
+ <PageContainer
125
+ title="DataState"
126
+ subtitle="useQuery lifecycle · skeleton / error / empty / success in one widget"
127
+ >
128
+ <Flex direction="col" gap="lg">
129
+ <Card>
130
+ <CardHeader>
131
+ <CardTitle level={2}>Success</CardTitle>
132
+ <CardDescription>
133
+ Resolved data renders through the children function.
134
+ </CardDescription>
135
+ </CardHeader>
136
+ <CardContent flush>
137
+ <SuccessBlock />
138
+ </CardContent>
139
+ </Card>
140
+
141
+ <Card>
142
+ <CardHeader>
143
+ <CardTitle level={2}>Loading (skeleton)</CardTitle>
144
+ <CardDescription>The skeleton prop renders during the pending phase.</CardDescription>
145
+ </CardHeader>
146
+ <CardContent flush>
147
+ <LoadingBlock />
148
+ </CardContent>
149
+ </Card>
150
+
151
+ <Card>
152
+ <CardHeader>
153
+ <CardTitle level={2}>Prerequisite (disabled query)</CardTitle>
154
+ <CardDescription>
155
+ An `enabled:false` query is unstarted, not loading. The prerequisite slot renders
156
+ instead of an endless skeleton.
157
+ </CardDescription>
158
+ </CardHeader>
159
+ <CardContent>
160
+ <PrerequisiteBlock />
161
+ </CardContent>
162
+ </Card>
163
+
164
+ <Card>
165
+ <CardHeader>
166
+ <CardTitle level={2}>Error · transient (retry)</CardTitle>
167
+ <CardDescription>
168
+ A 5xx/network failure is retryable, so AlertQueryError offers Retry automatically.
169
+ </CardDescription>
170
+ </CardHeader>
171
+ <CardContent>
172
+ <ErrorBlock />
173
+ </CardContent>
174
+ </Card>
175
+
176
+ <Card>
177
+ <CardHeader>
178
+ <CardTitle level={2}>Error · auth (session renewal)</CardTitle>
179
+ <CardDescription>
180
+ A 401 / expired token routes to session renewal via `onAuthError`, never a blind
181
+ retry, and never surfaces the raw token message.
182
+ </CardDescription>
183
+ </CardHeader>
184
+ <CardContent>
185
+ <AuthErrorBlock />
186
+ </CardContent>
187
+ </Card>
188
+ </Flex>
189
+ </PageContainer>
190
+ </QueryClientProvider>
191
+ );
192
+ }
@@ -0,0 +1,93 @@
1
+ import { QueryClient, QueryClientProvider, useInfiniteQuery } from "@tanstack/react-query";
2
+
3
+ import {
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ EmptyState,
10
+ Timeline,
11
+ type TimelineItem,
12
+ } from "@godxjp/ui/data-display";
13
+ import { SkeletonTable } from "@godxjp/ui/feedback";
14
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
15
+ import { InfiniteQueryState, flattenItemPages } from "@godxjp/ui/query";
16
+
17
+ /**
18
+ * InfiniteQueryState · useInfiniteQuery widget: flattens pages, renders the
19
+ * skeleton/empty/error states, and a built-in load-more footer. Use
20
+ * flattenItemPages for `{ items }` pages. Composed from real @godxjp/ui +
21
+ * @tanstack/react-query.
22
+ */
23
+ const queryClient = new QueryClient();
24
+
25
+ type Activity = { id: string; text: string; actor: string; time: string };
26
+ const feed: Activity[] = [
27
+ { id: "a1", text: "請求書 INV-0312 を承認", actor: "経理 田中", time: "10:24" },
28
+ { id: "a2", text: "仕訳 #2024-0312 を作成", actor: "システム", time: "10:20" },
29
+ { id: "a3", text: "請求書 INV-0312 を発行", actor: "営業 グエン", time: "09:50" },
30
+ { id: "a4", text: "受注 ORD-0455 を登録", actor: "営業 グエン", time: "09:30" },
31
+ { id: "a5", text: "取引先 BTY-0012 を更新", actor: "管理 佐藤", time: "09:10" },
32
+ ];
33
+
34
+ const PAGE = 3;
35
+
36
+ function Block() {
37
+ const query = useInfiniteQuery({
38
+ queryKey: ["activity-feed"],
39
+ queryFn: async ({ pageParam }) => {
40
+ const start = pageParam;
41
+ return {
42
+ items: feed.slice(start, start + PAGE),
43
+ nextCursor: start + PAGE < feed.length ? start + PAGE : null,
44
+ };
45
+ },
46
+ initialPageParam: 0,
47
+ getNextPageParam: (last) => last.nextCursor,
48
+ });
49
+
50
+ return (
51
+ <InfiniteQueryState<{ items: Activity[]; nextCursor: number | null }, Activity[]>
52
+ query={query}
53
+ skeleton={<SkeletonTable />}
54
+ flatten={flattenItemPages}
55
+ isEmpty={(items) => items.length === 0}
56
+ empty={<EmptyState title="アクティビティがありません" />}
57
+ >
58
+ {(items) => (
59
+ <Timeline
60
+ items={items.map<TimelineItem>((a, i) => ({
61
+ title: a.text,
62
+ location: a.actor,
63
+ time: a.time,
64
+ current: i === 0,
65
+ }))}
66
+ />
67
+ )}
68
+ </InfiniteQueryState>
69
+ );
70
+ }
71
+
72
+ export default function Demo() {
73
+ return (
74
+ <QueryClientProvider client={queryClient}>
75
+ <PageContainer
76
+ title="InfiniteQueryState"
77
+ subtitle="useInfiniteQuery · flatten pages + load-more footer"
78
+ >
79
+ <Flex direction="col" gap="lg">
80
+ <Card>
81
+ <CardHeader>
82
+ <CardTitle level={2}>アクティビティ</CardTitle>
83
+ <CardDescription>Click 「もっと見る」 to append the next page.</CardDescription>
84
+ </CardHeader>
85
+ <CardContent>
86
+ <Block />
87
+ </CardContent>
88
+ </Card>
89
+ </Flex>
90
+ </PageContainer>
91
+ </QueryClientProvider>
92
+ );
93
+ }