@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,123 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { Text } from "@godxjp/ui/general";
5
+ import {
6
+ ContextMenu,
7
+ ContextMenuCheckboxItem,
8
+ ContextMenuContent,
9
+ ContextMenuItem,
10
+ ContextMenuLabel,
11
+ ContextMenuRadioGroup,
12
+ ContextMenuRadioItem,
13
+ ContextMenuSeparator,
14
+ ContextMenuShortcut,
15
+ ContextMenuSub,
16
+ ContextMenuSubContent,
17
+ ContextMenuSubTrigger,
18
+ ContextMenuTrigger,
19
+ } from "@godxjp/ui/navigation";
20
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
21
+
22
+ /**
23
+ * ContextMenu — right-click action menu over a target area. Compose
24
+ * ContextMenu > ContextMenuTrigger + ContextMenuContent > items. Supports
25
+ * sub-menus, checkbox/radio items, separators, and keyboard shortcuts.
26
+ * Composed only from real @godxjp/ui components.
27
+ */
28
+ export default function Demo() {
29
+ const [showRuby, setShowRuby] = useState(true);
30
+ const [showGrid, setShowGrid] = useState(false);
31
+ const [sort, setSort] = useState("date");
32
+
33
+ return (
34
+ <PageContainer
35
+ title="ContextMenu"
36
+ subtitle="右クリックで開くコンテキストメニュー · 行・カード・エリアへのアクション"
37
+ >
38
+ <Flex direction="col" gap="lg">
39
+ <Card>
40
+ <CardHeader>
41
+ <CardTitle level={2}>基本アクション</CardTitle>
42
+ <CardDescription>
43
+ 領域を右クリックするとメニューが開きます。サブメニュー・区切り・ショートカットを含む。
44
+ ContextMenuItem の variant は default と destructive の 2 つ。破棄系のアクションだけを
45
+ destructive にする。
46
+ </CardDescription>
47
+ </CardHeader>
48
+ <CardContent>
49
+ <ContextMenu>
50
+ {/* ui-audit-disable-next-line no-hand-rolled-surface — the dashed area is the right-click target the demo asks you to use */}
51
+ <ContextMenuTrigger className="border-border h-36 w-full cursor-context-menu rounded-md border border-dashed">
52
+ <Flex align="center" justify="center" gap="xs">
53
+ <Text tone="muted">ここを右クリックしてください</Text>
54
+ </Flex>
55
+ </ContextMenuTrigger>
56
+ <ContextMenuContent>
57
+ <ContextMenuLabel>仕訳操作</ContextMenuLabel>
58
+ <ContextMenuItem>
59
+ 編集
60
+ <ContextMenuShortcut>⌘E</ContextMenuShortcut>
61
+ </ContextMenuItem>
62
+ <ContextMenuItem>
63
+ 複製
64
+ <ContextMenuShortcut>⌘D</ContextMenuShortcut>
65
+ </ContextMenuItem>
66
+ <ContextMenuSeparator />
67
+ <ContextMenuSub>
68
+ <ContextMenuSubTrigger>エクスポート</ContextMenuSubTrigger>
69
+ <ContextMenuSubContent>
70
+ <ContextMenuItem>CSV</ContextMenuItem>
71
+ <ContextMenuItem>PDF</ContextMenuItem>
72
+ <ContextMenuItem>Excel</ContextMenuItem>
73
+ </ContextMenuSubContent>
74
+ </ContextMenuSub>
75
+ <ContextMenuSeparator />
76
+ <ContextMenuItem variant="default">アーカイブに移動</ContextMenuItem>
77
+ <ContextMenuItem variant="destructive">
78
+ 削除
79
+ <ContextMenuShortcut>⌫</ContextMenuShortcut>
80
+ </ContextMenuItem>
81
+ </ContextMenuContent>
82
+ </ContextMenu>
83
+ </CardContent>
84
+ </Card>
85
+
86
+ <Card>
87
+ <CardHeader>
88
+ <CardTitle level={2}>チェックボックス・ラジオアイテム</CardTitle>
89
+ <CardDescription>
90
+ 表示設定の切り替えに使用。CheckboxItem は個別トグル、RadioGroup は排他選択。
91
+ </CardDescription>
92
+ </CardHeader>
93
+ <CardContent>
94
+ <ContextMenu>
95
+ {/* ui-audit-disable-next-line no-hand-rolled-surface — the dashed area is the right-click target the demo asks you to use */}
96
+ <ContextMenuTrigger className="border-border h-36 w-full cursor-context-menu rounded-md border border-dashed">
97
+ <Flex align="center" justify="center" gap="xs">
98
+ <Text tone="muted">右クリック · 表示設定</Text>
99
+ </Flex>
100
+ </ContextMenuTrigger>
101
+ <ContextMenuContent>
102
+ <ContextMenuLabel>表示オプション</ContextMenuLabel>
103
+ <ContextMenuCheckboxItem checked={showRuby} onCheckedChange={setShowRuby}>
104
+ ルビ表示
105
+ </ContextMenuCheckboxItem>
106
+ <ContextMenuCheckboxItem checked={showGrid} onCheckedChange={setShowGrid}>
107
+ グリッド線
108
+ </ContextMenuCheckboxItem>
109
+ <ContextMenuSeparator />
110
+ <ContextMenuLabel>並び順</ContextMenuLabel>
111
+ <ContextMenuRadioGroup value={sort} onValueChange={setSort}>
112
+ <ContextMenuRadioItem value="date">日付順</ContextMenuRadioItem>
113
+ <ContextMenuRadioItem value="amount">金額順</ContextMenuRadioItem>
114
+ <ContextMenuRadioItem value="account">科目順</ContextMenuRadioItem>
115
+ </ContextMenuRadioGroup>
116
+ </ContextMenuContent>
117
+ </ContextMenu>
118
+ </CardContent>
119
+ </Card>
120
+ </Flex>
121
+ </PageContainer>
122
+ );
123
+ }
@@ -0,0 +1,213 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { Button, Text } from "@godxjp/ui/general";
5
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
6
+ import {
7
+ DropdownMenu,
8
+ DropdownMenuCheckboxItem,
9
+ DropdownMenuContent,
10
+ DropdownMenuGroup,
11
+ DropdownMenuItem,
12
+ DropdownMenuLabel,
13
+ DropdownMenuRadioGroup,
14
+ DropdownMenuRadioItem,
15
+ DropdownMenuSeparator,
16
+ DropdownMenuSub,
17
+ DropdownMenuSubContent,
18
+ DropdownMenuSubTrigger,
19
+ DropdownMenuTrigger,
20
+ } from "@godxjp/ui/navigation";
21
+ import { MoreHorizontal } from "lucide-react";
22
+
23
+ /**
24
+ * DropdownMenu — Radix dropdown. Compose root/Trigger(asChild)/Content/Item/Separator.
25
+ * Use asChild on Trigger so a godx-ui Button is the real trigger (no double-button).
26
+ * Composed only from real @godxjp/ui components.
27
+ */
28
+ export default function Demo() {
29
+ const [status, setStatus] = useState("draft");
30
+ const [showAmount, setShowAmount] = useState(true);
31
+ const [showPartner, setShowPartner] = useState(true);
32
+ const [showDate, setShowDate] = useState(false);
33
+
34
+ return (
35
+ <PageContainer
36
+ title="DropdownMenu"
37
+ subtitle="Radix dropdown · Trigger asChild + Content + Item/Separator/Sub"
38
+ >
39
+ <Flex direction="col" gap="lg">
40
+ {/* Row action menu — the most common use */}
41
+ <Card>
42
+ <CardHeader>
43
+ <CardTitle level={2}>行アクションメニュー (DataTable 行の &quot;…&quot;)</CardTitle>
44
+ <CardDescription>
45
+ DropdownMenuTrigger に asChild を付けて godx-ui Button をトリガーにする。
46
+ DropdownMenuItem の variant は default と destructive の 2 つ。削除だけを
47
+ variant=&quot;destructive&quot; にし、className で色を上書きしない。
48
+ </CardDescription>
49
+ </CardHeader>
50
+ <CardContent>
51
+ <Flex direction="row" align="center" gap="md">
52
+ <Text>JE-0042 · 売上計上 ¥480,000</Text>
53
+ <DropdownMenu>
54
+ <DropdownMenuTrigger asChild>
55
+ <Button variant="ghost" size="icon-sm" aria-label="行アクション">
56
+ <MoreHorizontal />
57
+ </Button>
58
+ </DropdownMenuTrigger>
59
+ <DropdownMenuContent align="end">
60
+ <DropdownMenuItem>編集</DropdownMenuItem>
61
+ <DropdownMenuItem>複製</DropdownMenuItem>
62
+ <DropdownMenuSeparator />
63
+ <DropdownMenuItem variant="default">アーカイブに移動</DropdownMenuItem>
64
+ <DropdownMenuItem variant="destructive">削除</DropdownMenuItem>
65
+ </DropdownMenuContent>
66
+ </DropdownMenu>
67
+ </Flex>
68
+ </CardContent>
69
+ </Card>
70
+
71
+ {/* Status quick-change with RadioGroup */}
72
+ <Card>
73
+ <CardHeader>
74
+ <CardTitle level={2}>RadioGroup · ステータス即時変更</CardTitle>
75
+ <CardDescription>
76
+ DropdownMenuRadioGroup + DropdownMenuRadioItem でステータスを切り替える。 Select
77
+ の代替。フォーム外でのインライン状態遷移に使う。
78
+ </CardDescription>
79
+ </CardHeader>
80
+ <CardContent>
81
+ <Flex direction="row" align="center" gap="md">
82
+ <span className="text-sm">
83
+ 現在のステータス:{" "}
84
+ <strong>
85
+ {status === "draft" ? "下書き" : status === "posted" ? "承認済" : "取消済"}
86
+ </strong>
87
+ </span>
88
+ <DropdownMenu>
89
+ <DropdownMenuTrigger asChild>
90
+ <Button variant="outline" size="sm">
91
+ ステータスを変更
92
+ </Button>
93
+ </DropdownMenuTrigger>
94
+ <DropdownMenuContent>
95
+ <DropdownMenuLabel>ステータス</DropdownMenuLabel>
96
+ <DropdownMenuSeparator />
97
+ <DropdownMenuRadioGroup value={status} onValueChange={setStatus}>
98
+ <DropdownMenuRadioItem value="draft">下書き</DropdownMenuRadioItem>
99
+ <DropdownMenuRadioItem value="posted">承認済</DropdownMenuRadioItem>
100
+ <DropdownMenuRadioItem value="voided">取消済</DropdownMenuRadioItem>
101
+ </DropdownMenuRadioGroup>
102
+ </DropdownMenuContent>
103
+ </DropdownMenu>
104
+ </Flex>
105
+ </CardContent>
106
+ </Card>
107
+
108
+ {/* Column visibility toggle */}
109
+ <Card>
110
+ <CardHeader>
111
+ <CardTitle level={2}>CheckboxItem · 列の表示 / 非表示</CardTitle>
112
+ <CardDescription>
113
+ DropdownMenuCheckboxItem で DataTable の列表示を切り替える。 checked + onCheckedChange
114
+ で各列の状態を管理する。
115
+ </CardDescription>
116
+ </CardHeader>
117
+ <CardContent>
118
+ <DropdownMenu>
119
+ <DropdownMenuTrigger asChild>
120
+ <Button variant="outline" size="sm">
121
+ 列の設定
122
+ </Button>
123
+ </DropdownMenuTrigger>
124
+ <DropdownMenuContent>
125
+ <DropdownMenuLabel>表示する列</DropdownMenuLabel>
126
+ <DropdownMenuSeparator />
127
+ <DropdownMenuCheckboxItem checked={showAmount} onCheckedChange={setShowAmount}>
128
+ 金額
129
+ </DropdownMenuCheckboxItem>
130
+ <DropdownMenuCheckboxItem checked={showPartner} onCheckedChange={setShowPartner}>
131
+ 取引先
132
+ </DropdownMenuCheckboxItem>
133
+ <DropdownMenuCheckboxItem checked={showDate} onCheckedChange={setShowDate}>
134
+ 日付
135
+ </DropdownMenuCheckboxItem>
136
+ </DropdownMenuContent>
137
+ </DropdownMenu>
138
+ </CardContent>
139
+ </Card>
140
+
141
+ {/* Nested sub-menu for export */}
142
+ <Card>
143
+ <CardHeader>
144
+ <CardTitle level={2}>Sub-menu · エクスポート形式の選択</CardTitle>
145
+ <CardDescription>
146
+ DropdownMenuSub + DropdownMenuSubTrigger + DropdownMenuSubContent でネスト。
147
+ ChevronRight は DropdownMenuSubTrigger が自動で表示する。
148
+ </CardDescription>
149
+ </CardHeader>
150
+ <CardContent>
151
+ <DropdownMenu>
152
+ <DropdownMenuTrigger asChild>
153
+ <Button variant="outline" size="sm">
154
+ 一括操作
155
+ </Button>
156
+ </DropdownMenuTrigger>
157
+ <DropdownMenuContent>
158
+ <DropdownMenuGroup>
159
+ <DropdownMenuItem>承認</DropdownMenuItem>
160
+ <DropdownMenuItem>却下</DropdownMenuItem>
161
+ <DropdownMenuSub>
162
+ <DropdownMenuSubTrigger>エクスポート</DropdownMenuSubTrigger>
163
+ <DropdownMenuSubContent>
164
+ <DropdownMenuItem>CSV</DropdownMenuItem>
165
+ <DropdownMenuItem>Excel (.xlsx)</DropdownMenuItem>
166
+ <DropdownMenuItem>PDF</DropdownMenuItem>
167
+ </DropdownMenuSubContent>
168
+ </DropdownMenuSub>
169
+ </DropdownMenuGroup>
170
+ <DropdownMenuSeparator />
171
+ <DropdownMenuItem variant="destructive">一括削除</DropdownMenuItem>
172
+ </DropdownMenuContent>
173
+ </DropdownMenu>
174
+ </CardContent>
175
+ </Card>
176
+
177
+ {/* Avatar chip / account menu */}
178
+ <Card>
179
+ <CardHeader>
180
+ <CardTitle level={2}>アカウントメニュー · トップバーのアバターチップ</CardTitle>
181
+ <CardDescription>
182
+ DropdownMenuLabel でユーザー情報を表示し、アクションを下に並べる標準パターン。
183
+ </CardDescription>
184
+ </CardHeader>
185
+ <CardContent>
186
+ <DropdownMenu>
187
+ <DropdownMenuTrigger asChild>
188
+ <Button variant="outline" size="sm">
189
+ 田中 太郎
190
+ </Button>
191
+ </DropdownMenuTrigger>
192
+ <DropdownMenuContent align="end" className="w-48">
193
+ <DropdownMenuLabel>
194
+ <Text as="div" weight="medium">
195
+ 田中 太郎
196
+ </Text>
197
+ <Text as="div" size="xs" tone="muted">
198
+ tanaka@example.co.jp
199
+ </Text>
200
+ </DropdownMenuLabel>
201
+ <DropdownMenuSeparator />
202
+ <DropdownMenuItem>プロフィール</DropdownMenuItem>
203
+ <DropdownMenuItem>設定</DropdownMenuItem>
204
+ <DropdownMenuSeparator />
205
+ <DropdownMenuItem variant="destructive">ログアウト</DropdownMenuItem>
206
+ </DropdownMenuContent>
207
+ </DropdownMenu>
208
+ </CardContent>
209
+ </Card>
210
+ </Flex>
211
+ </PageContainer>
212
+ );
213
+ }
@@ -0,0 +1,227 @@
1
+ import { useState } from "react";
2
+ import { Plus } from "lucide-react";
3
+
4
+ import { Button, Text } from "@godxjp/ui/general";
5
+ import {
6
+ SearchInput,
7
+ Select,
8
+ SelectContent,
9
+ SelectItem,
10
+ SelectTrigger,
11
+ SelectValue,
12
+ } from "@godxjp/ui/data-entry";
13
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
14
+ import { FilterBar, FilterBarGroup } from "@godxjp/ui/navigation";
15
+
16
+ const STATUSES = [
17
+ { value: "all", label: "All statuses" },
18
+ { value: "active", label: "Active" },
19
+ { value: "paused", label: "Paused" },
20
+ ];
21
+
22
+ const MODEL_STATUSES = [
23
+ { value: "active", label: "有効" },
24
+ { value: "invited", label: "招待中" },
25
+ { value: "suspended", label: "停止" },
26
+ ];
27
+
28
+ const MODEL_ROLES = [
29
+ { value: "member", label: "Thành viên" },
30
+ { value: "manager", label: "Quản lý" },
31
+ ];
32
+
33
+ /** FilterBar — domain-neutral list filtering with consumer-owned state and clear behavior. */
34
+ export default function Demo() {
35
+ const [query, setQuery] = useState("");
36
+ const [status, setStatus] = useState("all");
37
+ const [department, setDepartment] = useState("all");
38
+ const [approval, setApproval] = useState("all");
39
+ const [period, setPeriod] = useState("all");
40
+ const hasActiveFilters = query !== "" || status !== "all";
41
+
42
+ // Typed model (gh#258) — ALL state is consumer data; the bar only renders it.
43
+ const [modelQuery, setModelQuery] = useState("田中");
44
+ const [modelStatus, setModelStatus] = useState("active");
45
+ const [modelRole, setModelRole] = useState("");
46
+ const modelChips = [
47
+ ...(modelQuery !== "" ? [{ value: "q", label: `検索: ${modelQuery}` }] : []),
48
+ ...(modelStatus !== ""
49
+ ? [
50
+ {
51
+ value: "status",
52
+ label: `状態: ${MODEL_STATUSES.find((s) => s.value === modelStatus)?.label ?? modelStatus}`,
53
+ },
54
+ ]
55
+ : []),
56
+ ...(modelRole !== ""
57
+ ? [
58
+ {
59
+ value: "role",
60
+ label: `Vai trò: ${MODEL_ROLES.find((r) => r.value === modelRole)?.label ?? modelRole}`,
61
+ },
62
+ ]
63
+ : []),
64
+ ];
65
+ const removeModelChip = (value: string) => {
66
+ if (value === "q") setModelQuery("");
67
+ if (value === "status") setModelStatus("");
68
+ if (value === "role") setModelRole("");
69
+ };
70
+ const clearModelFilters = () => {
71
+ setModelQuery("");
72
+ setModelStatus("");
73
+ setModelRole("");
74
+ };
75
+ const modelResultCount = modelChips.length === 0 ? 128 : 42 - modelChips.length * 11;
76
+
77
+ return (
78
+ <PageContainer
79
+ title="FilterBar"
80
+ subtitle="Search, labelled filters, active state, consumer-owned reset, and both responsive overflow strategies"
81
+ >
82
+ <Flex direction="col" gap="lg">
83
+ {/* Typed model (gh#258) — search/filters/chips/reset/result-count/actions as DATA.
84
+ The bar owns layout, token widths, chip lifecycle and keyboard order; the page owns
85
+ every piece of state. Remove a chip, reset, or pick a filter and watch the chips row
86
+ and the localized result count follow. */}
87
+ <Flex direction="col" gap="xs">
88
+ <Text size="xs" tone="muted">
89
+ typed model · search + filters + chips + reset + result count + actions, all
90
+ consumer-controlled data
91
+ </Text>
92
+ <FilterBar
93
+ search={{
94
+ value: modelQuery,
95
+ onValueChange: setModelQuery,
96
+ placeholder: "氏名・メールで検索",
97
+ ariaLabel: "メンバーを検索",
98
+ }}
99
+ filters={[
100
+ {
101
+ value: "status",
102
+ label: "ステータス",
103
+ options: MODEL_STATUSES,
104
+ selected: modelStatus,
105
+ onSelectedChange: setModelStatus,
106
+ placeholder: "すべて",
107
+ },
108
+ {
109
+ value: "role",
110
+ label: "Vai trò",
111
+ options: MODEL_ROLES,
112
+ selected: modelRole,
113
+ onSelectedChange: setModelRole,
114
+ placeholder: "Tất cả",
115
+ },
116
+ ]}
117
+ chips={modelChips}
118
+ onChipRemove={removeModelChip}
119
+ onClear={clearModelFilters}
120
+ hasActiveFilters={modelChips.length > 0}
121
+ resultCount={modelResultCount}
122
+ actions={
123
+ <Button size="sm">
124
+ <Plus aria-hidden="true" />
125
+ メンバーを追加
126
+ </Button>
127
+ }
128
+ />
129
+ </Flex>
130
+
131
+ {/* overflow="wrap" (default) — stacked below 640px, wrapping rows above. */}
132
+ <Flex direction="col" gap="xs">
133
+ <Text size="xs" tone="muted">
134
+ overflow=&quot;wrap&quot; (default) · a small filter set wraps onto extra rows
135
+ </Text>
136
+ <FilterBar
137
+ hasActiveFilters={hasActiveFilters}
138
+ onClear={() => {
139
+ setQuery("");
140
+ setStatus("all");
141
+ }}
142
+ >
143
+ <SearchInput
144
+ aria-label="Search records"
145
+ placeholder="Search records"
146
+ value={query}
147
+ onSearch={setQuery}
148
+ />
149
+ {/* controlId makes the visible caption the Select's real <label>. */}
150
+ <FilterBarGroup label="Status" controlId="fb-status">
151
+ <Select value={status} onValueChange={setStatus}>
152
+ <SelectTrigger id="fb-status">
153
+ <SelectValue />
154
+ </SelectTrigger>
155
+ <SelectContent>
156
+ {STATUSES.map((s) => (
157
+ <SelectItem key={s.value} value={s.value}>
158
+ {s.label}
159
+ </SelectItem>
160
+ ))}
161
+ </SelectContent>
162
+ </Select>
163
+ </FilterBarGroup>
164
+ </FilterBar>
165
+ </Flex>
166
+
167
+ {/* overflow="scroll" — one bounded inline-scrolling row at >= 640px. The long JA/EN/VI
168
+ captions are the point: with `wrap` this same set becomes a three-row strip. */}
169
+ <Flex direction="col" gap="xs">
170
+ <Text size="xs" tone="muted">
171
+ overflow=&quot;scroll&quot; · many filters with long JA/EN/VI labels stay on ONE bounded
172
+ row (still stacked below 640px)
173
+ </Text>
174
+ <FilterBar
175
+ overflow="scroll"
176
+ hasActiveFilters={department !== "all" || approval !== "all" || period !== "all"}
177
+ onClear={() => {
178
+ setDepartment("all");
179
+ setApproval("all");
180
+ setPeriod("all");
181
+ }}
182
+ >
183
+ <FilterBarGroup label="部署(すべての拠点を含む)" controlId="fb-department">
184
+ <Select value={department} onValueChange={setDepartment}>
185
+ <SelectTrigger id="fb-department">
186
+ <SelectValue />
187
+ </SelectTrigger>
188
+ <SelectContent>
189
+ <SelectItem value="all">すべての部署</SelectItem>
190
+ <SelectItem value="warehouse">倉庫</SelectItem>
191
+ </SelectContent>
192
+ </Select>
193
+ </FilterBarGroup>
194
+ <FilterBarGroup
195
+ label="Trạng thái phê duyệt của toàn bộ phòng ban"
196
+ controlId="fb-approval"
197
+ >
198
+ <Select value={approval} onValueChange={setApproval}>
199
+ <SelectTrigger id="fb-approval">
200
+ <SelectValue />
201
+ </SelectTrigger>
202
+ <SelectContent>
203
+ <SelectItem value="all">Tất cả trạng thái</SelectItem>
204
+ <SelectItem value="pending">Chờ phê duyệt</SelectItem>
205
+ </SelectContent>
206
+ </Select>
207
+ </FilterBarGroup>
208
+ <FilterBarGroup
209
+ label="Reporting period including carried-over adjustments"
210
+ controlId="fb-period"
211
+ >
212
+ <Select value={period} onValueChange={setPeriod}>
213
+ <SelectTrigger id="fb-period">
214
+ <SelectValue />
215
+ </SelectTrigger>
216
+ <SelectContent>
217
+ <SelectItem value="all">All periods</SelectItem>
218
+ <SelectItem value="month">This month</SelectItem>
219
+ </SelectContent>
220
+ </Select>
221
+ </FilterBarGroup>
222
+ </FilterBar>
223
+ </Flex>
224
+ </Flex>
225
+ </PageContainer>
226
+ );
227
+ }