@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,251 @@
1
+ import {
2
+ Card,
3
+ CardContent,
4
+ CardDescription,
5
+ CardHeader,
6
+ CardTitle,
7
+ ListRow,
8
+ Table,
9
+ TableBody,
10
+ TableCell,
11
+ TableHead,
12
+ TableHeader,
13
+ TableRow,
14
+ } from "@godxjp/ui/data-display";
15
+ import { Text } from "@godxjp/ui/general";
16
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
17
+
18
+ /**
19
+ * Table — the primitive table shell (Table/TableHeader/TableBody/TableRow/
20
+ * TableHead/TableCell). Prefer DataTable for admin lists; reach for these only
21
+ * for a custom one-off table. Composed only from real @godxjp/ui components.
22
+ */
23
+ export default function Demo() {
24
+ return (
25
+ <PageContainer
26
+ title="Table"
27
+ subtitle="Primitive table shell · prefer DataTable for admin lists"
28
+ >
29
+ <Flex direction="col" gap="lg">
30
+ <Card>
31
+ <CardHeader>
32
+ <CardTitle level={2}>仕訳明細</CardTitle>
33
+ <CardDescription>
34
+ A fixed double-entry breakdown. The second row is rendered with the built-in selected
35
+ state (TableRow data-state=&quot;selected&quot;), and a caption + total footer row
36
+ exercise caption-bottom and a summary row.
37
+ </CardDescription>
38
+ </CardHeader>
39
+ <CardContent flush>
40
+ <Table>
41
+ <caption className="px-4 py-2 text-start">
42
+ <Text size="xs" tone="muted">
43
+ 2026年5月 売上計上(税込)
44
+ </Text>
45
+ </caption>
46
+ <TableHeader>
47
+ <TableRow>
48
+ <TableHead>勘定科目</TableHead>
49
+ <TableHead className="text-end">借方</TableHead>
50
+ <TableHead className="text-end">貸方</TableHead>
51
+ </TableRow>
52
+ </TableHeader>
53
+ <TableBody>
54
+ <TableRow>
55
+ <TableCell>売掛金</TableCell>
56
+ <TableCell className="text-end tabular-nums">¥482,000</TableCell>
57
+ <TableCell className="text-end">—</TableCell>
58
+ </TableRow>
59
+ {/* Built-in selected-row state — data-[state=selected]:bg-primary/[0.06]. */}
60
+ <TableRow data-state="selected">
61
+ <TableCell>売上高</TableCell>
62
+ <TableCell className="text-end">—</TableCell>
63
+ <TableCell className="text-end tabular-nums">¥438,182</TableCell>
64
+ </TableRow>
65
+ <TableRow>
66
+ <TableCell>仮受消費税</TableCell>
67
+ <TableCell className="text-end">—</TableCell>
68
+ <TableCell className="text-end tabular-nums">¥43,818</TableCell>
69
+ </TableRow>
70
+ <TableRow className="font-medium">
71
+ <TableCell>合計</TableCell>
72
+ <TableCell className="text-end tabular-nums">¥482,000</TableCell>
73
+ <TableCell className="text-end tabular-nums">¥482,000</TableCell>
74
+ </TableRow>
75
+ </TableBody>
76
+ </Table>
77
+ </CardContent>
78
+ </Card>
79
+
80
+ <Card>
81
+ <CardHeader>
82
+ <CardTitle level={2}>月次推移</CardTitle>
83
+ <CardDescription>
84
+ A wide table, more columns than the viewport can hold, so the built-in scroll wrapper
85
+ (.relative w-full overflow-auto) scrolls horizontally.
86
+ </CardDescription>
87
+ </CardHeader>
88
+ <CardContent flush>
89
+ <Table>
90
+ <TableHeader>
91
+ <TableRow>
92
+ <TableHead>勘定科目</TableHead>
93
+ <TableHead className="text-end">1月</TableHead>
94
+ <TableHead className="text-end">2月</TableHead>
95
+ <TableHead className="text-end">3月</TableHead>
96
+ <TableHead className="text-end">4月</TableHead>
97
+ <TableHead className="text-end">5月</TableHead>
98
+ <TableHead className="text-end">6月</TableHead>
99
+ <TableHead className="text-end">7月</TableHead>
100
+ <TableHead className="text-end">8月</TableHead>
101
+ <TableHead className="text-end">9月</TableHead>
102
+ </TableRow>
103
+ </TableHeader>
104
+ <TableBody>
105
+ <TableRow>
106
+ <TableCell>売上高</TableCell>
107
+ <TableCell className="text-end tabular-nums">¥412,000</TableCell>
108
+ <TableCell className="text-end tabular-nums">¥438,182</TableCell>
109
+ <TableCell className="text-end tabular-nums">¥455,900</TableCell>
110
+ <TableCell className="text-end tabular-nums">¥471,300</TableCell>
111
+ <TableCell className="text-end tabular-nums">¥482,000</TableCell>
112
+ <TableCell className="text-end tabular-nums">¥499,540</TableCell>
113
+ <TableCell className="text-end tabular-nums">¥510,200</TableCell>
114
+ <TableCell className="text-end tabular-nums">¥528,770</TableCell>
115
+ <TableCell className="text-end tabular-nums">¥541,090</TableCell>
116
+ </TableRow>
117
+ <TableRow>
118
+ <TableCell>売上原価</TableCell>
119
+ <TableCell className="text-end tabular-nums">¥206,000</TableCell>
120
+ <TableCell className="text-end tabular-nums">¥219,091</TableCell>
121
+ <TableCell className="text-end tabular-nums">¥227,950</TableCell>
122
+ <TableCell className="text-end tabular-nums">¥235,650</TableCell>
123
+ <TableCell className="text-end tabular-nums">¥241,000</TableCell>
124
+ <TableCell className="text-end tabular-nums">¥249,770</TableCell>
125
+ <TableCell className="text-end tabular-nums">¥255,100</TableCell>
126
+ <TableCell className="text-end tabular-nums">¥264,385</TableCell>
127
+ <TableCell className="text-end tabular-nums">¥270,545</TableCell>
128
+ </TableRow>
129
+ </TableBody>
130
+ </Table>
131
+ </CardContent>
132
+ </Card>
133
+
134
+ {/* ── The flush full-bleed FRAME contract (gh#305 · gh#306) ───────────────────────────
135
+ Four cards, side by side, so the whole rule is visible at once: which edges a
136
+ full-bleed table keeps inside a card, and who draws the line under the header. */}
137
+ <Card>
138
+ <CardHeader>
139
+ <CardTitle level={2}>出荷伝票一覧 · bordered, flush</CardTitle>
140
+ <CardDescription>
141
+ `bordered` draws the full cell grid for merged (rowSpan) cells. Inside a flush
142
+ CardContent the three edges that coincide with the CARD frame are dropped, so there is
143
+ no doubled frame. The block-start edge stays, as the divider under this header. Its
144
+ width is `--table-flush-divider-width`.
145
+ </CardDescription>
146
+ </CardHeader>
147
+ <CardContent flush>
148
+ <Table bordered>
149
+ <TableHeader>
150
+ <TableRow>
151
+ <TableHead>倉庫</TableHead>
152
+ <TableHead>伝票番号</TableHead>
153
+ <TableHead className="text-end">個数</TableHead>
154
+ </TableRow>
155
+ </TableHeader>
156
+ <TableBody>
157
+ <TableRow>
158
+ <TableCell rowSpan={2}>東京第一</TableCell>
159
+ <TableCell>SH-2026-0412</TableCell>
160
+ <TableCell className="text-end tabular-nums">18</TableCell>
161
+ </TableRow>
162
+ <TableRow>
163
+ <TableCell>SH-2026-0413</TableCell>
164
+ <TableCell className="text-end tabular-nums">6</TableCell>
165
+ </TableRow>
166
+ <TableRow>
167
+ <TableCell>大阪南</TableCell>
168
+ <TableCell>SH-2026-0414</TableCell>
169
+ <TableCell className="text-end tabular-nums">24</TableCell>
170
+ </TableRow>
171
+ </TableBody>
172
+ </Table>
173
+ </CardContent>
174
+ </Card>
175
+
176
+ <Card>
177
+ <CardHeader>
178
+ <CardTitle level={2}>出荷伝票一覧 · bordered, NOT flush</CardTitle>
179
+ <CardDescription>
180
+ The same table in a padded CardContent. Nothing frames it here, so it keeps its own
181
+ full frame. The suppression above is scoped to a flush body, never to `bordered`.
182
+ </CardDescription>
183
+ </CardHeader>
184
+ <CardContent>
185
+ <Table bordered>
186
+ <TableHeader>
187
+ <TableRow>
188
+ <TableHead>倉庫</TableHead>
189
+ <TableHead>伝票番号</TableHead>
190
+ <TableHead className="text-end">個数</TableHead>
191
+ </TableRow>
192
+ </TableHeader>
193
+ <TableBody>
194
+ <TableRow>
195
+ <TableCell>東京第一</TableCell>
196
+ <TableCell>SH-2026-0412</TableCell>
197
+ <TableCell className="text-end tabular-nums">18</TableCell>
198
+ </TableRow>
199
+ </TableBody>
200
+ </Table>
201
+ </CardContent>
202
+ </Card>
203
+
204
+ <Card>
205
+ <CardHeader banded>
206
+ <CardTitle level={2}>出荷伝票一覧 · banded header</CardTitle>
207
+ <CardDescription>
208
+ A banded header already draws its own bottom border, so the flush table below stands
209
+ its divider down instead of stacking a second hairline on it. Same for a CardBar or a
210
+ DataTable.Toolbar above the table. Same again for a card with no header at all, where
211
+ the card frame IS the top edge.
212
+ </CardDescription>
213
+ </CardHeader>
214
+ <CardContent flush>
215
+ <Table bordered>
216
+ <TableHeader>
217
+ <TableRow>
218
+ <TableHead>倉庫</TableHead>
219
+ <TableHead>伝票番号</TableHead>
220
+ <TableHead className="text-end">個数</TableHead>
221
+ </TableRow>
222
+ </TableHeader>
223
+ <TableBody>
224
+ <TableRow>
225
+ <TableCell>東京第一</TableCell>
226
+ <TableCell>SH-2026-0412</TableCell>
227
+ <TableCell className="text-end tabular-nums">18</TableCell>
228
+ </TableRow>
229
+ </TableBody>
230
+ </Table>
231
+ </CardContent>
232
+ </Card>
233
+
234
+ <Card>
235
+ <CardHeader>
236
+ <CardTitle level={2}>関連ファイル · flush, no table</CardTitle>
237
+ <CardDescription>
238
+ A flush body that is not a table at all. `flush` zeroes BOTH block edges for every
239
+ full-bleed body, so these rows butt against the header band exactly like the tables
240
+ above. The header supplies the gap, not the body.
241
+ </CardDescription>
242
+ </CardHeader>
243
+ <CardContent flush>
244
+ <ListRow title="出荷指図書_2026-04.pdf" description="1.2 MB · 2026-04-12" />
245
+ <ListRow title="検品記録_2026-04.csv" description="18 KB · 2026-04-12" />
246
+ </CardContent>
247
+ </Card>
248
+ </Flex>
249
+ </PageContainer>
250
+ );
251
+ }
@@ -0,0 +1,112 @@
1
+ import {
2
+ Card,
3
+ CardContent,
4
+ CardDescription,
5
+ CardHeader,
6
+ CardTitle,
7
+ Timeline,
8
+ type TimelineItem,
9
+ } from "@godxjp/ui/data-display";
10
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
11
+
12
+ /**
13
+ * Timeline — vertical event list with an icon rail; the current item gets a
14
+ * highlighted glyph. Composed only from real @godxjp/ui components.
15
+ */
16
+ const items: TimelineItem[] = [
17
+ {
18
+ title: "承認待ち",
19
+ location: "経理 田中",
20
+ time: "10:24",
21
+ note: "金額が20万円を超えるため部長承認が必要",
22
+ current: true,
23
+ },
24
+ { title: "仕訳を作成", location: "システム", time: "10:20" },
25
+ { title: "請求書を発行", location: "営業 グエン", time: "09:50" },
26
+ { title: "受注を登録", location: "営業 グエン", time: "09:30" },
27
+ ];
28
+
29
+ // Second shape: a title-only minimal item, and the current step at the END
30
+ // (so the connector line is omitted on the highlighted item).
31
+ const compactItems: TimelineItem[] = [
32
+ { title: "出荷完了", location: "東京倉庫", time: "14:02" },
33
+ { title: "梱包" },
34
+ { title: "ピッキング中", current: true },
35
+ ];
36
+
37
+ // Pattern A — route stepper: numbered circles via variant="ordinal";
38
+ // status drives colour only, `location` reads "from → to".
39
+ const routeItems: TimelineItem[] = [
40
+ { title: "集荷", location: "東京 → 名古屋", status: "pending" },
41
+ { title: "幹線輸送", location: "名古屋 → 大阪", status: "pending" },
42
+ { title: "ラストマイル", location: "大阪 → 配達先", status: "pending" },
43
+ ];
44
+
45
+ // Pattern B — VAT / approval tracker: variant="status" picks the glyph by
46
+ // status (done → check, current → filled dot, pending → number).
47
+ const approvalItems: TimelineItem[] = [
48
+ { title: "請求書を発行", location: "営業 グエン", time: "09:50", status: "done" },
49
+ { title: "仕訳を作成", location: "システム", time: "10:20", status: "done" },
50
+ { title: "承認待ち", location: "経理 田中", time: "10:24", status: "current" },
51
+ { title: "消費税を計上", location: "経理", status: "pending" },
52
+ ];
53
+
54
+ export default function Demo() {
55
+ return (
56
+ <PageContainer title="Timeline" subtitle="現在のステップを強調する縦型のイベント一覧">
57
+ <Flex direction="col" gap="lg">
58
+ <Card>
59
+ <CardHeader>
60
+ <CardTitle level={2}>承認フロー</CardTitle>
61
+ <CardDescription>
62
+ items 配列を渡し、進行中のステップに current: true
63
+ を付与します。variant=&quot;icon&quot;
64
+ が既定で、全ステップ共通のドットグリフを描きます。
65
+ </CardDescription>
66
+ </CardHeader>
67
+ <CardContent>
68
+ <Timeline variant="icon" items={items} />
69
+ </CardContent>
70
+ </Card>
71
+
72
+ <Card>
73
+ <CardHeader>
74
+ <CardTitle level={2}>出荷ステータス</CardTitle>
75
+ <CardDescription>
76
+ タイトルのみの最小項目と、最後尾の current(接続線が省略される)を示します。
77
+ </CardDescription>
78
+ </CardHeader>
79
+ <CardContent>
80
+ <Timeline items={compactItems} />
81
+ </CardContent>
82
+ </Card>
83
+
84
+ <Card>
85
+ <CardHeader>
86
+ <CardTitle level={2}>配送ルート進捗</CardTitle>
87
+ <CardDescription>
88
+ variant="ordinal" で各ステップを連番(1,2,3…)で表示し、status
89
+ で色だけを切り替えます。
90
+ </CardDescription>
91
+ </CardHeader>
92
+ <CardContent>
93
+ <Timeline variant="ordinal" items={routeItems} />
94
+ </CardContent>
95
+ </Card>
96
+
97
+ <Card>
98
+ <CardHeader>
99
+ <CardTitle level={2}>承認・消費税トラッカー</CardTitle>
100
+ <CardDescription>
101
+ variant="status" は status ごとにグリフを切り替えます(done → チェック、current →
102
+ 塗りつぶしドット、pending → 連番)。
103
+ </CardDescription>
104
+ </CardHeader>
105
+ <CardContent>
106
+ <Timeline variant="status" items={approvalItems} />
107
+ </CardContent>
108
+ </Card>
109
+ </Flex>
110
+ </PageContainer>
111
+ );
112
+ }
@@ -0,0 +1,36 @@
1
+ import { useState } from "react";
2
+ import { DataTable, ListRow, type ColumnDef } from "@godxjp/ui/data-display";
3
+ import { Button } from "@godxjp/ui/general";
4
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
5
+
6
+ type Row = { id: string; name: string };
7
+ const rows: Row[] = [{ id: "1", name: "請求書 INV-1" }];
8
+ const columns: ColumnDef<Row>[] = [{ key: "name", header: "名前" }];
9
+
10
+ export default function Demo() {
11
+ const [buttonCount, setButtonCount] = useState(0);
12
+ const [rowActions, setRowActions] = useState(0);
13
+ const [selected, setSelected] = useState<Set<string>>(new Set());
14
+ return (
15
+ <PageContainer title="Touch action journeys">
16
+ <Flex direction="col" gap="lg">
17
+ <Button onClick={() => setButtonCount((n) => n + 1)}>Button action</Button>
18
+ <output aria-label="Button result">{buttonCount}</output>
19
+ <ListRow
20
+ title="Session"
21
+ trailing={<Button onClick={() => setRowActions((n) => n + 1)}>Sign out</Button>}
22
+ />
23
+ <output aria-label="ListRow result">{rowActions}</output>
24
+ <DataTable
25
+ data={rows}
26
+ columns={columns}
27
+ getRowId={(row) => row.id}
28
+ selectable
29
+ selected={selected}
30
+ onSelectChange={setSelected}
31
+ />
32
+ <output aria-label="Selection result">{selected.size}</output>
33
+ </Flex>
34
+ </PageContainer>
35
+ );
36
+ }
@@ -0,0 +1,107 @@
1
+ import {
2
+ Badge,
3
+ Card,
4
+ CardContent,
5
+ CardDescription,
6
+ CardHeader,
7
+ CardTitle,
8
+ EmptyState,
9
+ TreeList,
10
+ } from "@godxjp/ui/data-display";
11
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
12
+ import { FolderTree } from "lucide-react";
13
+
14
+ /**
15
+ * TreeList — a flat array rendered as an indented hierarchy; depth is data-driven
16
+ * (never nest DOM). active highlights a row (aria-current); badge surfaces a
17
+ * secondary label. Indentation is defined for depth 0-2, so flatten deeper
18
+ * branches before rendering. Composed only from real @godxjp/ui components.
19
+ */
20
+ const accounts = [
21
+ { id: "1000", title: "資産", depth: 0, badge: "親科目" },
22
+ { id: "1100", title: "流動資産", depth: 1, description: "1年以内に現金化" },
23
+ {
24
+ id: "1110",
25
+ title: "現金及び預金",
26
+ description: "普通・当座・小口",
27
+ depth: 2,
28
+ badge: "3 口座",
29
+ active: true,
30
+ },
31
+ {
32
+ id: "1120",
33
+ title: "売掛金",
34
+ description: "得意先への未回収債権",
35
+ depth: 2,
36
+ badge: (
37
+ <Badge variant="outline" tone="warning">
38
+ 要確認
39
+ </Badge>
40
+ ),
41
+ },
42
+ { id: "2000", title: "負債", depth: 0, badge: "親科目" },
43
+ { id: "2100", title: "流動負債", depth: 1, description: "1年以内に支払" },
44
+ { id: "2110", title: "買掛金", depth: 2, badge: "12 件" },
45
+ ];
46
+
47
+ // Independent data: active is allowed on any depth, including a top-level parent.
48
+ const departments = [
49
+ { id: "d0", title: "本社", depth: 0, active: true, badge: "選択中" },
50
+ { id: "d1", title: "営業部", depth: 1, description: "首都圏・関西" },
51
+ { id: "d2", title: "開発部", depth: 1, description: "プロダクト・基盤" },
52
+ ];
53
+
54
+ export default function Demo() {
55
+ return (
56
+ <PageContainer
57
+ title="TreeList"
58
+ subtitle="Hierarchical list · depth lives in the data, not the DOM"
59
+ >
60
+ <Flex direction="col" gap="lg">
61
+ <Card>
62
+ <CardHeader>
63
+ <CardTitle level={2}>勘定科目ツリー</CardTitle>
64
+ <CardDescription>
65
+ Pre-filter server-side; each item still carries its depth (0-2). An active leaf
66
+ carries aria-current; badges accept a string or a nested Badge node.
67
+ </CardDescription>
68
+ </CardHeader>
69
+ <CardContent>
70
+ <TreeList items={accounts} />
71
+ </CardContent>
72
+ </Card>
73
+
74
+ <Card>
75
+ <CardHeader>
76
+ <CardTitle level={2}>組織ツリー(親を選択中)</CardTitle>
77
+ <CardDescription>
78
+ active is data-driven and works at any depth. Here the depth-0 parent is the current
79
+ row.
80
+ </CardDescription>
81
+ </CardHeader>
82
+ <CardContent>
83
+ <TreeList items={departments} />
84
+ </CardContent>
85
+ </Card>
86
+
87
+ <Card>
88
+ <CardHeader>
89
+ <CardTitle level={2}>空の状態</CardTitle>
90
+ <CardDescription>
91
+ An empty items={"{[]}"} array renders an empty list. Pair it with an EmptyState
92
+ placeholder.
93
+ </CardDescription>
94
+ </CardHeader>
95
+ <CardContent>
96
+ <TreeList items={[]} />
97
+ <EmptyState
98
+ icon={FolderTree}
99
+ title="科目がありません"
100
+ description="フィルター条件に一致する勘定科目が見つかりませんでした。"
101
+ />
102
+ </CardContent>
103
+ </Card>
104
+ </Flex>
105
+ </PageContainer>
106
+ );
107
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * BranchScopePicker — 適用範囲 (all branches vs an explicit subset, gh#257).
3
+ *
4
+ * One controlled `{ mode, branchIds }` value; real RadioGroup + CheckboxGroup + SearchInput
5
+ * underneath. `error` is FIELD VALIDATION (aria-errormessage); a failed branch read is
6
+ * `listError`, a refused one is `denied` (#216 vocabulary). Branch data below is demo-only.
7
+ */
8
+ import * as React from "react";
9
+
10
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
11
+ import { BranchScopePicker, FormField, type BranchScopeValueProp } from "@godxjp/ui/data-entry";
12
+ import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
13
+
14
+ const BRANCHES = [
15
+ { id: "hq", name: "東京本社", description: "東京都千代田区" },
16
+ { id: "osaka", name: "大阪支店", description: "大阪府大阪市" },
17
+ { id: "nagoya", name: "名古屋支店", description: "愛知県名古屋市" },
18
+ { id: "fukuoka", name: "福岡営業所", description: "福岡県福岡市" },
19
+ {
20
+ id: "hanoi",
21
+ name: "Chi nhánh Hà Nội",
22
+ description: "Việt Nam · đang chuẩn bị",
23
+ disabled: true,
24
+ },
25
+ ];
26
+
27
+ export default function Demo() {
28
+ const [scope, setScope] = React.useState<BranchScopeValueProp>({ mode: "all" });
29
+ const [validated, setValidated] = React.useState<BranchScopeValueProp>({
30
+ mode: "selected",
31
+ branchIds: [],
32
+ });
33
+
34
+ const validationError =
35
+ validated.mode === "selected" && (validated.branchIds?.length ?? 0) === 0
36
+ ? "1 件以上のブランチを選択してください"
37
+ : undefined;
38
+
39
+ return (
40
+ <PageContainer
41
+ title="BranchScopePicker"
42
+ subtitle="「すべてのブランチ」か「選択したブランチのみ」かを 1 つの値で扱う適用範囲コントロール。"
43
+ density="compact"
44
+ >
45
+ <Flex direction="col" gap="lg">
46
+ <ResponsiveGrid columns={{ md: 2 }}>
47
+ <Card>
48
+ <CardHeader>
49
+ <CardTitle level={2}>基本</CardTitle>
50
+ <CardDescription>
51
+ 既定は「すべてのブランチ」。subset に切り替えると検索付きチェックリストが開く。 mode
52
+ を戻しても branchIds は保持される。
53
+ </CardDescription>
54
+ </CardHeader>
55
+ <CardContent>
56
+ <FormField label="適用範囲" required>
57
+ <BranchScopePicker branches={BRANCHES} value={scope} onValueChange={setScope} />
58
+ </FormField>
59
+ </CardContent>
60
+ </Card>
61
+
62
+ <Card>
63
+ <CardHeader>
64
+ <CardTitle level={2}>バリデーション</CardTitle>
65
+ <CardDescription>
66
+ 「選択したブランチのみ」で 0 件のままのとき、error が aria-errormessage
67
+ 付きで表示される。
68
+ </CardDescription>
69
+ </CardHeader>
70
+ <CardContent>
71
+ <FormField label="通知の配信範囲" required>
72
+ <BranchScopePicker
73
+ branches={BRANCHES}
74
+ value={validated}
75
+ onValueChange={setValidated}
76
+ error={validationError}
77
+ />
78
+ </FormField>
79
+ </CardContent>
80
+ </Card>
81
+
82
+ <Card>
83
+ <CardHeader>
84
+ <CardTitle level={2}>読み取り専用 / 無効</CardTitle>
85
+ <CardDescription>
86
+ readOnly は現在値の静的サマリー(バッジ)。disabled は表示のまま操作不可。
87
+ </CardDescription>
88
+ </CardHeader>
89
+ <CardContent>
90
+ <Flex direction="col" gap="md">
91
+ <BranchScopePicker
92
+ branches={BRANCHES}
93
+ value={{ mode: "selected", branchIds: ["hq", "osaka"] }}
94
+ readOnly
95
+ />
96
+ <BranchScopePicker
97
+ branches={BRANCHES}
98
+ value={{ mode: "selected", branchIds: ["hq"] }}
99
+ disabled
100
+ />
101
+ </Flex>
102
+ </CardContent>
103
+ </Card>
104
+
105
+ <Card>
106
+ <CardHeader>
107
+ <CardTitle level={2}>コレクション状態(#216 の語彙)</CardTitle>
108
+ <CardDescription>loading → denied → listError → empty の優先順位。</CardDescription>
109
+ </CardHeader>
110
+ <CardContent>
111
+ <Flex direction="col" gap="md">
112
+ <BranchScopePicker branches={[]} loading />
113
+ <BranchScopePicker branches={[]} denied />
114
+ <BranchScopePicker branches={[]} listError />
115
+ <BranchScopePicker branches={[]} />
116
+ </Flex>
117
+ </CardContent>
118
+ </Card>
119
+ </ResponsiveGrid>
120
+ </Flex>
121
+ </PageContainer>
122
+ );
123
+ }