@godxjp/ui 19.1.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 (436) 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 +2 -12
  11. package/dist/components/data-display/card.d.ts +21 -41
  12. package/dist/components/data-display/carousel.d.ts +1 -2
  13. package/dist/components/data-display/code-block.d.ts +4 -0
  14. package/dist/components/data-display/code-block.js +24 -0
  15. package/dist/components/data-display/data-table.d.ts +15 -37
  16. package/dist/components/data-display/data-table.js +1 -3
  17. package/dist/components/data-display/descriptions.d.ts +2 -6
  18. package/dist/components/data-display/descriptions.js +0 -2
  19. package/dist/components/data-display/index.d.ts +4 -0
  20. package/dist/components/data-display/index.js +4 -0
  21. package/dist/components/data-display/list-row.d.ts +3 -22
  22. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  23. package/dist/components/data-display/progress.d.ts +1 -1
  24. package/dist/components/data-display/prose.d.ts +4 -0
  25. package/dist/components/data-display/prose.js +20 -0
  26. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  27. package/dist/components/data-display/table.d.ts +20 -80
  28. package/dist/components/data-display/table.js +0 -3
  29. package/dist/components/data-display/timeline.d.ts +3 -5
  30. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  31. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  32. package/dist/components/data-entry/calendar.d.ts +3 -2
  33. package/dist/components/data-entry/calendar.js +58 -3
  34. package/dist/components/data-entry/command-palette.d.ts +8 -22
  35. package/dist/components/data-entry/date-picker.d.ts +4 -5
  36. package/dist/components/data-entry/date-picker.js +6 -1
  37. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  38. package/dist/components/data-entry/date-range-picker.js +8 -3
  39. package/dist/components/data-entry/form-errors.d.ts +7 -18
  40. package/dist/components/data-entry/form-field.js +1 -5
  41. package/dist/components/data-entry/form.d.ts +1 -9
  42. package/dist/components/data-entry/input.d.ts +16 -14
  43. package/dist/components/data-entry/input.js +3 -0
  44. package/dist/components/data-entry/month-picker.js +2 -2
  45. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  46. package/dist/components/data-entry/month-range-picker.js +2 -2
  47. package/dist/components/data-entry/number-input.d.ts +1 -5
  48. package/dist/components/data-entry/number-input.js +1 -0
  49. package/dist/components/data-entry/radio.js +0 -1
  50. package/dist/components/data-entry/search-select.d.ts +2 -4
  51. package/dist/components/data-entry/select.d.ts +11 -6
  52. package/dist/components/data-entry/select.js +4 -2
  53. package/dist/components/data-entry/switch.js +0 -1
  54. package/dist/components/data-entry/textarea.d.ts +10 -16
  55. package/dist/components/data-entry/time-picker.d.ts +3 -5
  56. package/dist/components/data-entry/upload-types.d.ts +1 -5
  57. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  58. package/dist/components/feedback/dialog.d.ts +6 -15
  59. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  60. package/dist/components/feedback/sheet.d.ts +3 -10
  61. package/dist/components/feedback/sheet.js +1 -1
  62. package/dist/components/feedback/sonner.js +2 -3
  63. package/dist/components/general/activity.d.ts +4 -30
  64. package/dist/components/general/button.js +1 -10
  65. package/dist/components/general/logo.d.ts +6 -28
  66. package/dist/components/general/reveal.d.ts +3 -9
  67. package/dist/components/general/typography.d.ts +1 -3
  68. package/dist/components/layout/account-chip.d.ts +8 -0
  69. package/dist/components/layout/account-chip.js +45 -0
  70. package/dist/components/layout/auth-divider.d.ts +2 -9
  71. package/dist/components/layout/auth-shell.d.ts +1 -14
  72. package/dist/components/layout/breadcrumb.d.ts +1 -5
  73. package/dist/components/layout/centered-shell.d.ts +4 -18
  74. package/dist/components/layout/error-surface.d.ts +11 -28
  75. package/dist/components/layout/error-surface.js +4 -1
  76. package/dist/components/layout/index.d.ts +2 -0
  77. package/dist/components/layout/index.js +2 -0
  78. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  79. package/dist/components/layout/master-detail.d.ts +2 -18
  80. package/dist/components/layout/page-container.js +0 -1
  81. package/dist/components/layout/responsive-grid.d.ts +6 -1
  82. package/dist/components/layout/responsive-grid.js +9 -2
  83. package/dist/components/layout/service-role-panel.d.ts +7 -19
  84. package/dist/components/layout/sidebar.d.ts +5 -27
  85. package/dist/components/layout/sidebar.js +0 -1
  86. package/dist/components/layout/split-pane.d.ts +0 -7
  87. package/dist/components/layout/topbar.d.ts +1 -14
  88. package/dist/components/navigation/app-setting-picker.js +1 -3
  89. package/dist/components/navigation/filter-bar.d.ts +1 -6
  90. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  91. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  92. package/dist/components/navigation/tabs.js +4 -8
  93. package/dist/components/query/data-state.d.ts +2 -2
  94. package/dist/components/ui/credential-reveal.d.ts +1 -4
  95. package/dist/components/ui/hover-card.d.ts +1 -2
  96. package/dist/components/ui/separator.d.ts +2 -15
  97. package/dist/components/ui/toggle-group.d.ts +1 -5
  98. package/dist/components/ui/toggle.d.ts +6 -31
  99. package/dist/email/brand-mark.d.ts +6 -34
  100. package/dist/email/color.d.ts +7 -17
  101. package/dist/email/geometry.d.ts +4 -8
  102. package/dist/email/index.d.ts +4 -48
  103. package/dist/email/inline-style.d.ts +3 -9
  104. package/dist/email/urgency.d.ts +2 -7
  105. package/dist/form/form-context.d.ts +2 -5
  106. package/dist/form/form-root.d.ts +1 -2
  107. package/dist/i18n/messages/en.json +4 -0
  108. package/dist/i18n/messages/ja.json +4 -0
  109. package/dist/i18n/messages/vi.json +4 -0
  110. package/dist/inertia/index.d.ts +2 -10
  111. package/dist/lib/control-styles.d.ts +10 -21
  112. package/dist/lib/control-styles.js +4 -6
  113. package/dist/lib/datetime/format-date.d.ts +1 -4
  114. package/dist/lib/field-a11y.d.ts +11 -68
  115. package/dist/lib/field-a11y.js +0 -1
  116. package/dist/lib/format.d.ts +4 -8
  117. package/dist/lib/hooks.d.ts +6 -12
  118. package/dist/lib/permission-grid.d.ts +3 -18
  119. package/dist/lib/query-error.d.ts +3 -3
  120. package/dist/props/components/app.prop.d.ts +15 -38
  121. package/dist/props/components/charts.prop.d.ts +2 -3
  122. package/dist/props/components/data-display.prop.d.ts +48 -72
  123. package/dist/props/components/data-entry.prop.d.ts +35 -40
  124. package/dist/props/components/form.prop.d.ts +2 -6
  125. package/dist/props/components/general.prop.d.ts +11 -27
  126. package/dist/props/components/layout.prop.d.ts +89 -260
  127. package/dist/props/components/navigation.prop.d.ts +27 -42
  128. package/dist/props/registry.d.ts +31 -0
  129. package/dist/props/registry.js +33 -0
  130. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  131. package/dist/props/vocabulary/index.d.ts +1 -1
  132. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  133. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  134. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  135. package/dist/styles/alert-layout.css +1 -32
  136. package/dist/styles/badge-layout.css +4 -18
  137. package/dist/styles/base.css +14 -113
  138. package/dist/styles/card-layout.css +6 -128
  139. package/dist/styles/chart-layout.css +2 -17
  140. package/dist/styles/control.css +380 -458
  141. package/dist/styles/core.css +21 -0
  142. package/dist/styles/data-display-layout.css +175 -94
  143. package/dist/styles/data-entry-layout.css +0 -45
  144. package/dist/styles/density.css +1 -30
  145. package/dist/styles/dialog-layout.css +5 -69
  146. package/dist/styles/focus-ring.css +13 -87
  147. package/dist/styles/fonts.css +1 -31
  148. package/dist/styles/form-layout.css +7 -91
  149. package/dist/styles/index.css +2 -20
  150. package/dist/styles/layout.css +38 -456
  151. package/dist/styles/logo-layout.css +1 -35
  152. package/dist/styles/motion.css +3 -42
  153. package/dist/styles/navigation-layout.css +3 -50
  154. package/dist/styles/shell-layout.css +37 -403
  155. package/dist/styles/table-layout.css +16 -274
  156. package/dist/styles/text-layout.css +7 -21
  157. package/dist/styles/toggle.css +1 -23
  158. package/dist/theme/dxs.canonical.css +1 -55
  159. package/dist/theme/example.service.css +1 -26
  160. package/dist/theme/famgia.service.css +5 -15
  161. package/dist/tokens/axes.css +3 -40
  162. package/dist/tokens/base.css +1 -4
  163. package/dist/tokens/components/activity.css +6 -42
  164. package/dist/tokens/components/badge.css +4 -13
  165. package/dist/tokens/components/banner.css +4 -9
  166. package/dist/tokens/components/card.css +32 -88
  167. package/dist/tokens/components/chart.css +9 -26
  168. package/dist/tokens/components/control.css +37 -222
  169. package/dist/tokens/components/data-display.css +28 -79
  170. package/dist/tokens/components/data-entry.css +5 -19
  171. package/dist/tokens/components/descriptions.css +7 -27
  172. package/dist/tokens/components/email.css +38 -84
  173. package/dist/tokens/components/error-surface.css +2 -18
  174. package/dist/tokens/components/feedback.css +27 -124
  175. package/dist/tokens/components/form.css +13 -45
  176. package/dist/tokens/components/legal-document.css +16 -41
  177. package/dist/tokens/components/list-row.css +11 -36
  178. package/dist/tokens/components/logo.css +2 -57
  179. package/dist/tokens/components/navigation.css +16 -94
  180. package/dist/tokens/components/scroll-area.css +2 -18
  181. package/dist/tokens/components/separator.css +8 -30
  182. package/dist/tokens/components/sheet.css +3 -14
  183. package/dist/tokens/components/shell.css +53 -307
  184. package/dist/tokens/components/sidebar.css +5 -22
  185. package/dist/tokens/components/table.css +19 -140
  186. package/dist/tokens/components/toggle.css +3 -65
  187. package/dist/tokens/components/upload.css +7 -43
  188. package/dist/tokens/foundation.css +108 -383
  189. package/dist/tokens/semantic/layout.css +33 -207
  190. package/docs/CANONICAL-CONTRACTS.md +206 -0
  191. package/docs/COMPONENTS.md +157 -0
  192. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  193. package/docs/CONSUMER-RULES.md +14 -0
  194. package/docs/CUSTOMER-THEMING.md +162 -0
  195. package/docs/DATETIME.md +69 -0
  196. package/docs/DEVELOPMENT.md +173 -0
  197. package/docs/FORMS.md +143 -0
  198. package/docs/FRAME-A11Y-CI.md +267 -0
  199. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  200. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  201. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  202. package/docs/FRAME-COVERAGE.md +29 -0
  203. package/docs/PROPS-REGISTRY.md +61 -0
  204. package/docs/PROPS-VOCABULARY.md +100 -0
  205. package/docs/README.md +60 -0
  206. package/docs/REGISTRY.md +70 -0
  207. package/docs/SPACING.md +56 -0
  208. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  209. package/docs/TESTING.md +98 -0
  210. package/docs/TOKENS.md +347 -0
  211. package/docs/asset-modules.d.ts +46 -0
  212. package/docs/assets/cover-terrain.svg +6 -0
  213. package/docs/assets/portrait-amber.svg +5 -0
  214. package/docs/assets/portrait-clay.svg +5 -0
  215. package/docs/assets/portrait-indigo.svg +5 -0
  216. package/docs/assets/portrait-iris.svg +5 -0
  217. package/docs/assets/portrait-moss.svg +5 -0
  218. package/docs/assets/portrait-plum.svg +5 -0
  219. package/docs/assets/portrait-slate.svg +5 -0
  220. package/docs/charts/compact-bar-trend.tsx +328 -0
  221. package/docs/charts/size-tiers.tsx +192 -0
  222. package/docs/data-display/accordion.tsx +99 -0
  223. package/docs/data-display/avatar.tsx +355 -0
  224. package/docs/data-display/badge.tsx +247 -0
  225. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  226. package/docs/data-display/card/index.md +3 -0
  227. package/docs/data-display/card/index.tsx +285 -0
  228. package/docs/data-display/carousel.tsx +156 -0
  229. package/docs/data-display/charts.tsx +198 -0
  230. package/docs/data-display/code-block.tsx +90 -0
  231. package/docs/data-display/collapsible.tsx +162 -0
  232. package/docs/data-display/credential-reveal.tsx +145 -0
  233. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  234. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  235. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  236. package/docs/data-display/data-table/index.md +5 -0
  237. package/docs/data-display/data-table/index.tsx +295 -0
  238. package/docs/data-display/descriptions.tsx +143 -0
  239. package/docs/data-display/empty-state.tsx +164 -0
  240. package/docs/data-display/hover-card.tsx +181 -0
  241. package/docs/data-display/list-row.tsx +420 -0
  242. package/docs/data-display/permission-matrix.tsx +184 -0
  243. package/docs/data-display/popover-touch.tsx +27 -0
  244. package/docs/data-display/popover.tsx +245 -0
  245. package/docs/data-display/progress.tsx +84 -0
  246. package/docs/data-display/prose.tsx +105 -0
  247. package/docs/data-display/qr-code.tsx +68 -0
  248. package/docs/data-display/scroll-area.tsx +271 -0
  249. package/docs/data-display/service-launcher-card.tsx +145 -0
  250. package/docs/data-display/stat-card.tsx +99 -0
  251. package/docs/data-display/table.tsx +251 -0
  252. package/docs/data-display/timeline.tsx +112 -0
  253. package/docs/data-display/touch-actions.tsx +36 -0
  254. package/docs/data-display/tree-list.tsx +107 -0
  255. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  256. package/docs/data-entry/calendar.tsx +180 -0
  257. package/docs/data-entry/cascader.tsx +378 -0
  258. package/docs/data-entry/checkbox.tsx +256 -0
  259. package/docs/data-entry/color-picker.tsx +117 -0
  260. package/docs/data-entry/command-palette.tsx +179 -0
  261. package/docs/data-entry/command.tsx +262 -0
  262. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  263. package/docs/data-entry/date-picker.tsx +191 -0
  264. package/docs/data-entry/date-range-picker.tsx +149 -0
  265. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  266. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  267. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  268. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  269. package/docs/data-entry/form-field/index.md +8 -0
  270. package/docs/data-entry/form-field/index.tsx +326 -0
  271. package/docs/data-entry/form-inertia.tsx +80 -0
  272. package/docs/data-entry/form-root.tsx +102 -0
  273. package/docs/data-entry/form.tsx +724 -0
  274. package/docs/data-entry/input-otp.tsx +231 -0
  275. package/docs/data-entry/input.tsx +114 -0
  276. package/docs/data-entry/label.tsx +100 -0
  277. package/docs/data-entry/month-picker.tsx +101 -0
  278. package/docs/data-entry/month-range-picker.tsx +115 -0
  279. package/docs/data-entry/number-input.tsx +240 -0
  280. package/docs/data-entry/password-input.tsx +106 -0
  281. package/docs/data-entry/password-strength.tsx +97 -0
  282. package/docs/data-entry/radio-group.tsx +95 -0
  283. package/docs/data-entry/rating.tsx +87 -0
  284. package/docs/data-entry/search-input.tsx +120 -0
  285. package/docs/data-entry/select-async-contracts.tsx +108 -0
  286. package/docs/data-entry/select-matrix.tsx +204 -0
  287. package/docs/data-entry/select.tsx +369 -0
  288. package/docs/data-entry/slider.tsx +130 -0
  289. package/docs/data-entry/switch.tsx +67 -0
  290. package/docs/data-entry/tag-input.tsx +108 -0
  291. package/docs/data-entry/textarea.tsx +209 -0
  292. package/docs/data-entry/time-picker.tsx +99 -0
  293. package/docs/data-entry/toggle-count.tsx +293 -0
  294. package/docs/data-entry/toggle-group.tsx +225 -0
  295. package/docs/data-entry/toggle.tsx +127 -0
  296. package/docs/data-entry/transfer.tsx +97 -0
  297. package/docs/data-entry/tree-select.tsx +204 -0
  298. package/docs/data-entry/upload.tsx +184 -0
  299. package/docs/feedback/alert-dialog.tsx +270 -0
  300. package/docs/feedback/alert.tsx +248 -0
  301. package/docs/feedback/banner.tsx +183 -0
  302. package/docs/feedback/danger-confirm.tsx +88 -0
  303. package/docs/feedback/dialog-touch.tsx +24 -0
  304. package/docs/feedback/dialog.tsx +193 -0
  305. package/docs/feedback/sheet.tsx +410 -0
  306. package/docs/feedback/skeleton.tsx +111 -0
  307. package/docs/feedback/toast.tsx +135 -0
  308. package/docs/feedback/tooltip.tsx +171 -0
  309. package/docs/feedback/two-factor-setup.tsx +68 -0
  310. package/docs/foundation/_email-specimen.ts +274 -0
  311. package/docs/foundation/colors.tsx +202 -0
  312. package/docs/foundation/density.tsx +232 -0
  313. package/docs/foundation/email-tokens.tsx +306 -0
  314. package/docs/foundation/radius-shadow.tsx +152 -0
  315. package/docs/foundation/spacing.tsx +211 -0
  316. package/docs/foundation/typography.tsx +147 -0
  317. package/docs/general/activity.tsx +224 -0
  318. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  319. package/docs/general/button/examples/form-actions.tsx +85 -0
  320. package/docs/general/button/examples/toolbar.tsx +160 -0
  321. package/docs/general/button/index.md +12 -0
  322. package/docs/general/button/index.tsx +211 -0
  323. package/docs/general/logo.tsx +131 -0
  324. package/docs/general/reveal.tsx +41 -0
  325. package/docs/general/typography.tsx +152 -0
  326. package/docs/layout/account-chip.tsx +72 -0
  327. package/docs/layout/admin-collection.tsx +122 -0
  328. package/docs/layout/app-shell.tsx +374 -0
  329. package/docs/layout/aspect-ratio.tsx +119 -0
  330. package/docs/layout/auth-account-summary.tsx +103 -0
  331. package/docs/layout/auth-divider.tsx +28 -0
  332. package/docs/layout/auth-footer.tsx +37 -0
  333. package/docs/layout/auth-identity.tsx +36 -0
  334. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  336. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  338. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  340. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  342. package/docs/layout/auth-recovery/index.md +140 -0
  343. package/docs/layout/auth-recovery/index.tsx +96 -0
  344. package/docs/layout/auth-shell-context.tsx +103 -0
  345. package/docs/layout/auth-shell-device.tsx +112 -0
  346. package/docs/layout/auth-shell-registration.tsx +335 -0
  347. package/docs/layout/auth-shell-variants.tsx +139 -0
  348. package/docs/layout/auth-shell.tsx +59 -0
  349. package/docs/layout/auth-stack.tsx +40 -0
  350. package/docs/layout/centered-shell.tsx +102 -0
  351. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  352. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  353. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  354. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  355. package/docs/layout/error-surface/index.md +153 -0
  356. package/docs/layout/error-surface/index.tsx +239 -0
  357. package/docs/layout/flex.tsx +262 -0
  358. package/docs/layout/legal-document-shell/_data.ts +110 -0
  359. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  361. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  363. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  365. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  367. package/docs/layout/legal-document-shell/index.md +51 -0
  368. package/docs/layout/legal-document-shell/index.tsx +101 -0
  369. package/docs/layout/master-detail.tsx +387 -0
  370. package/docs/layout/org-switcher.tsx +131 -0
  371. package/docs/layout/page-container.tsx +946 -0
  372. package/docs/layout/resizable-panel.tsx +419 -0
  373. package/docs/layout/responsive-grid.tsx +235 -0
  374. package/docs/layout/separator.tsx +327 -0
  375. package/docs/layout/service-role-panel.tsx +144 -0
  376. package/docs/layout/sidebar.tsx +586 -0
  377. package/docs/layout/split-pane.tsx +451 -0
  378. package/docs/layout/topbar.tsx +347 -0
  379. package/docs/navigation/app-setting-picker.tsx +141 -0
  380. package/docs/navigation/breadcrumb.tsx +128 -0
  381. package/docs/navigation/context-menu.tsx +117 -0
  382. package/docs/navigation/dropdown-menu.tsx +213 -0
  383. package/docs/navigation/filter-bar.tsx +227 -0
  384. package/docs/navigation/menubar.tsx +141 -0
  385. package/docs/navigation/navigation-menu.tsx +165 -0
  386. package/docs/navigation/pagination.tsx +241 -0
  387. package/docs/navigation/steps.tsx +263 -0
  388. package/docs/navigation/tabs-rtl.tsx +28 -0
  389. package/docs/navigation/tabs.tsx +308 -0
  390. package/docs/navigation/toolbar.tsx +339 -0
  391. package/docs/providers/app-provider.tsx +191 -0
  392. package/docs/providers/format-date.tsx +230 -0
  393. package/docs/query/button-refetch.tsx +160 -0
  394. package/docs/query/data-state.tsx +192 -0
  395. package/docs/query/infinite-query-state.tsx +93 -0
  396. package/docs/query/mutation-feedback.tsx +70 -0
  397. package/docs/query/prefetch-link.tsx +262 -0
  398. package/docs/query/touch-actions.tsx +68 -0
  399. package/docs/showcase/acme-portal.tsx +441 -0
  400. package/docs/showcase/acme-website.tsx +455 -0
  401. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  402. package/docs/showcase/case2-employee-me.tsx +441 -0
  403. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  404. package/docs/showcase/case4-login.tsx +307 -0
  405. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  406. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  407. package/docs/showcase/futurelastic-web.tsx +390 -0
  408. package/docs/showcase/org-switcher.tsx +313 -0
  409. package/docs/showcase/permission-matrix.tsx +343 -0
  410. package/docs/showcase/public-landing.tsx +210 -0
  411. package/docs/showcase/settings-account-sections.tsx +559 -0
  412. package/docs/showcase/settings-security-mfa.tsx +145 -0
  413. package/docs/showcase/table-approval-queue.tsx +199 -0
  414. package/docs/showcase/table-bulk-actions.tsx +460 -0
  415. package/docs/showcase/table-compact-kintone.tsx +438 -0
  416. package/docs/showcase/table-conditional-format.tsx +367 -0
  417. package/docs/showcase/table-crud-list.tsx +544 -0
  418. package/docs/showcase/table-density.tsx +340 -0
  419. package/docs/showcase/table-expandable-rows.tsx +471 -0
  420. package/docs/showcase/table-filter-chips.tsx +461 -0
  421. package/docs/showcase/table-footer-totals.tsx +311 -0
  422. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  423. package/docs/showcase/table-master-detail.tsx +479 -0
  424. package/docs/showcase/table-pagination.tsx +320 -0
  425. package/docs/showcase/table-states.tsx +363 -0
  426. package/docs/showcase/table-sticky-columns.tsx +373 -0
  427. package/docs/showcase/table-tree-rows.tsx +444 -0
  428. package/docs/showcase/table-view-tabs.tsx +488 -0
  429. package/package.json +9 -11
  430. package/scripts/_agent-setup.mjs +16 -2
  431. package/scripts/audit-hook.mjs +3 -13
  432. package/scripts/init-agent-kit.mjs +1 -14
  433. package/scripts/postinstall.mjs +12 -12
  434. package/scripts/ui-audit.mjs +93 -31
  435. package/scripts/visual-audit-rules.mjs +51 -7
  436. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,369 @@
1
+ import { useState } from "react";
2
+
3
+ import {
4
+ Avatar,
5
+ AvatarFallback,
6
+ Badge,
7
+ Card,
8
+ CardContent,
9
+ CardDescription,
10
+ CardHeader,
11
+ CardTitle,
12
+ } from "@godxjp/ui/data-display";
13
+ import {
14
+ FormField,
15
+ Select,
16
+ SelectContent,
17
+ SelectGroup,
18
+ SelectItem,
19
+ SelectLabel,
20
+ SelectSeparator,
21
+ SelectTrigger,
22
+ SelectValue,
23
+ } from "@godxjp/ui/data-entry";
24
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
25
+
26
+ /**
27
+ * Select — the single-select control. Prefer the data-driven `options` API
28
+ * (handles search, grouping, async); compose sub-parts only for a custom
29
+ * trigger. Never a raw <select>. Composed only from real @godxjp/ui components.
30
+ */
31
+ export default function Demo() {
32
+ const [status, setStatus] = useState("paid");
33
+ const [currency, setCurrency] = useState("JPY");
34
+ const [priority, setPriority] = useState("medium");
35
+ const [priorityMd, setPriorityMd] = useState("medium");
36
+ const [assignee, setAssignee] = useState("tanaka");
37
+ const [reviewer, setReviewer] = useState("tanaka");
38
+ const [reviewerAsync, setReviewerAsync] = useState("tanaka");
39
+ const [reviewerCustom, setReviewerCustom] = useState("tanaka");
40
+ const [reviewerLabel, setReviewerLabel] = useState("tanaka");
41
+
42
+ const people = [
43
+ { value: "tanaka", label: "田中 太郎", sublabel: "tanaka@example.com" },
44
+ { value: "suzuki", label: "鈴木 花子", sublabel: "suzuki@example.com" },
45
+ { value: "sato", label: "佐藤 次郎", sublabel: "sato@example.com" },
46
+ ];
47
+ const avatarFor = (label: string) => (
48
+ <Avatar className="size-5">
49
+ <AvatarFallback>{label.slice(0, 1)}</AvatarFallback>
50
+ </Avatar>
51
+ );
52
+ const peopleWithIcon = people.map((person) => ({ ...person, icon: avatarFor(person.label) }));
53
+
54
+ // A real picker fetches + paginates server-side; we simulate latency so the loading state and the
55
+ // selectedLabel / selectedIcon at-rest behaviour (option not loaded yet) are real.
56
+ const loadPeople = async ({ query }: { query: string; page: number }) => {
57
+ await new Promise((resolve) => setTimeout(resolve, 600));
58
+ const needle = query.trim().toLowerCase();
59
+ const list = needle
60
+ ? peopleWithIcon.filter((person) => person.label.toLowerCase().includes(needle))
61
+ : peopleWithIcon;
62
+ return { options: list, hasMore: false };
63
+ };
64
+
65
+ // Async loaders can reject (network / 500). A rejected loader is a DISTINCT state from
66
+ // "no results": the panel shows an error affordance, never a blank surface.
67
+ const loadFailing = async () => {
68
+ await new Promise((resolve) => setTimeout(resolve, 500));
69
+ throw new Error("network error");
70
+ };
71
+
72
+ return (
73
+ <PageContainer
74
+ title="Select"
75
+ subtitle="Single-select · data-driven options, searchable, or compound"
76
+ >
77
+ <Flex direction="col" gap="lg">
78
+ <Card>
79
+ <CardHeader>
80
+ <CardTitle level={2}>Data-driven (options)</CardTitle>
81
+ <CardDescription>
82
+ Pass an options array; name= submits the value with the form.
83
+ </CardDescription>
84
+ </CardHeader>
85
+ <CardContent>
86
+ <FormField id="status" label="状態">
87
+ <Select
88
+ id="status"
89
+ name="status"
90
+ value={status}
91
+ onValueChange={setStatus}
92
+ placeholder="状態を選択"
93
+ options={[
94
+ { value: "draft", label: "下書き" },
95
+ { value: "sent", label: "送付済" },
96
+ { value: "paid", label: "入金済" },
97
+ { value: "overdue", label: "期限超過" },
98
+ ]}
99
+ />
100
+ </FormField>
101
+ </CardContent>
102
+ </Card>
103
+
104
+ <Card>
105
+ <CardHeader>
106
+ <CardTitle level={2}>Searchable + grouped</CardTitle>
107
+ <CardDescription>
108
+ showSearch enables client-side filtering; group buckets options.
109
+ </CardDescription>
110
+ </CardHeader>
111
+ <CardContent>
112
+ <FormField id="currency" label="通貨">
113
+ <Select
114
+ id="currency"
115
+ name="currency"
116
+ value={currency}
117
+ onValueChange={setCurrency}
118
+ showSearch
119
+ clearable={false}
120
+ searchPlaceholder="通貨を検索..."
121
+ options={[
122
+ { value: "JPY", label: "日本円", group: "アジア" },
123
+ { value: "VND", label: "ベトナムドン", group: "アジア" },
124
+ { value: "EUR", label: "ユーロ", group: "ヨーロッパ" },
125
+ { value: "GBP", label: "英ポンド", group: "ヨーロッパ" },
126
+ ]}
127
+ />
128
+ </FormField>
129
+ </CardContent>
130
+ </Card>
131
+
132
+ <Card>
133
+ <CardHeader>
134
+ <CardTitle level={2}>Searchable + clearable</CardTitle>
135
+ <CardDescription>
136
+ With a value set and clearable (default), an inline ✕ on the trigger resets the
137
+ selection without opening the list.
138
+ </CardDescription>
139
+ </CardHeader>
140
+ <CardContent>
141
+ <FormField id="assignee" label="担当者">
142
+ <Select
143
+ id="assignee"
144
+ name="assignee"
145
+ value={assignee}
146
+ onValueChange={setAssignee}
147
+ showSearch
148
+ searchPlaceholder="担当者を検索..."
149
+ placeholder="担当者を選択"
150
+ options={people}
151
+ />
152
+ </FormField>
153
+ </CardContent>
154
+ </Card>
155
+
156
+ <Card>
157
+ <CardHeader>
158
+ <CardTitle level={2}>Option icon · shown on the trigger too</CardTitle>
159
+ <CardDescription>
160
+ Give each option an `icon` (avatar / flag / lucide icon). It renders before the label
161
+ in the list AND on the trigger once selected, with no `renderOption` needed.
162
+ </CardDescription>
163
+ </CardHeader>
164
+ <CardContent>
165
+ <FormField id="reviewer" label="レビュー担当">
166
+ <Select
167
+ id="reviewer"
168
+ name="reviewer"
169
+ value={reviewer}
170
+ onValueChange={setReviewer}
171
+ showSearch
172
+ searchPlaceholder="担当者を検索..."
173
+ placeholder="担当者を選択"
174
+ options={peopleWithIcon}
175
+ />
176
+ </FormField>
177
+ </CardContent>
178
+ </Card>
179
+
180
+ <Card>
181
+ <CardHeader>
182
+ <CardTitle level={2}>Async (loadOptions) + selectedIcon</CardTitle>
183
+ <CardDescription>
184
+ With `loadOptions` and a preset value, `selectedLabel` + `selectedIcon` show the
185
+ picked person's name AND avatar on the trigger at rest, before the async list has
186
+ loaded.
187
+ </CardDescription>
188
+ </CardHeader>
189
+ <CardContent>
190
+ <FormField id="reviewer-async" label="レビュー担当 (async)">
191
+ <Select
192
+ id="reviewer-async"
193
+ name="reviewer_async"
194
+ value={reviewerAsync}
195
+ onValueChange={setReviewerAsync}
196
+ loadOptions={loadPeople}
197
+ selectedLabel="田中 太郎"
198
+ selectedIcon={avatarFor("田中 太郎")}
199
+ searchPlaceholder="担当者を検索..."
200
+ placeholder="担当者を選択"
201
+ />
202
+ </FormField>
203
+ </CardContent>
204
+ </Card>
205
+
206
+ <Card>
207
+ <CardHeader>
208
+ <CardTitle level={2}>Empty options · trigger disabled</CardTitle>
209
+ <CardDescription>
210
+ A static `options={[]}` list has nothing to pick, so the trigger disables itself and
211
+ never opens a blank popover. Provide options (or an async loadOptions) to enable it.
212
+ </CardDescription>
213
+ </CardHeader>
214
+ <CardContent>
215
+ <FormField id="empty-static" label="部門">
216
+ <Select id="empty-static" name="empty_static" options={[]} placeholder="部門を選択" />
217
+ </FormField>
218
+ </CardContent>
219
+ </Card>
220
+
221
+ <Card>
222
+ <CardHeader>
223
+ <CardTitle level={2}>Async error state (errorMessage)</CardTitle>
224
+ <CardDescription>
225
+ When `loadOptions` rejects, the panel shows a distinct error affordance instead of a
226
+ blank surface or a misleading “no results”. Override the localized default with
227
+ `errorMessage`. Open it to see the loading row resolve into the error row.
228
+ </CardDescription>
229
+ </CardHeader>
230
+ <CardContent>
231
+ <FormField id="reviewer-error" label="レビュー担当 (error)">
232
+ <Select
233
+ id="reviewer-error"
234
+ name="reviewer_error"
235
+ loadOptions={loadFailing}
236
+ errorMessage="担当者を読み込めませんでした"
237
+ searchPlaceholder="担当者を検索..."
238
+ placeholder="担当者を選択"
239
+ />
240
+ </FormField>
241
+ </CardContent>
242
+ </Card>
243
+
244
+ <Card>
245
+ <CardHeader>
246
+ <CardTitle level={2}>Custom rows (renderOption)</CardTitle>
247
+ <CardDescription>
248
+ `renderOption` (like Ant&apos;s optionRender) draws a fully custom row: avatar + name
249
+ + email + a status badge. Use a flex ROW (`div className=&quot;flex
250
+ items-center&quot;`), not a bare `Flex` which defaults to a column.
251
+ </CardDescription>
252
+ </CardHeader>
253
+ <CardContent>
254
+ <FormField id="reviewer-custom" label="レビュー担当 (custom)">
255
+ <Select
256
+ id="reviewer-custom"
257
+ name="reviewer_custom"
258
+ value={reviewerCustom}
259
+ onValueChange={setReviewerCustom}
260
+ showSearch
261
+ searchPlaceholder="担当者を検索..."
262
+ placeholder="担当者を選択"
263
+ options={people}
264
+ renderOption={(option) => (
265
+ <div className="flex w-full items-center gap-2">
266
+ {avatarFor(option.label)}
267
+ <div className="flex min-w-0 flex-col">
268
+ <span className="truncate text-sm font-medium">{option.label}</span>
269
+ <span className="text-muted-foreground truncate text-xs">
270
+ {option.sublabel}
271
+ </span>
272
+ </div>
273
+ <Badge tone="success" className="ms-auto">
274
+ VIP
275
+ </Badge>
276
+ </div>
277
+ )}
278
+ />
279
+ </FormField>
280
+ </CardContent>
281
+ </Card>
282
+
283
+ <Card>
284
+ <CardHeader>
285
+ <CardTitle level={2}>labelRender · custom selected display</CardTitle>
286
+ <CardDescription>
287
+ `labelRender` (Ant Design) customizes the SELECTED value shown on the trigger: here an
288
+ avatar + name + a role badge. The placeholder still shows when nothing is selected.
289
+ </CardDescription>
290
+ </CardHeader>
291
+ <CardContent>
292
+ <FormField id="reviewer-label" label="レビュー担当 (labelRender)">
293
+ <Select
294
+ id="reviewer-label"
295
+ name="reviewer_label"
296
+ value={reviewerLabel}
297
+ onValueChange={setReviewerLabel}
298
+ showSearch
299
+ searchPlaceholder="担当者を検索..."
300
+ placeholder="担当者を選択"
301
+ options={people}
302
+ labelRender={({ label }) => (
303
+ <span className="flex items-center gap-2">
304
+ {avatarFor(String(label))}
305
+ <span className="truncate">{label}</span>
306
+ <Badge tone="info" icon={null} className="ms-1">
307
+ 担当
308
+ </Badge>
309
+ </span>
310
+ )}
311
+ />
312
+ </FormField>
313
+ </CardContent>
314
+ </Card>
315
+
316
+ <Card>
317
+ <CardHeader>
318
+ <CardTitle level={2}>Compound API (custom trigger)</CardTitle>
319
+ <CardDescription>
320
+ Compose sub-parts when the trigger needs custom content. SelectTrigger accepts size
321
+ &quot;sm&quot; and &quot;md&quot;; &quot;md&quot; is the default and matches Input
322
+ height in a form, &quot;sm&quot; fits a dense toolbar or table header.
323
+ </CardDescription>
324
+ </CardHeader>
325
+ <CardContent>
326
+ <Flex direction="col" gap="md">
327
+ <FormField id="priority-md" label="優先度 (size=md)">
328
+ <Select value={priorityMd} onValueChange={setPriorityMd}>
329
+ <SelectTrigger size="md" id="priority-md" aria-labelledby="priority-md-label">
330
+ <SelectValue placeholder="優先度" />
331
+ </SelectTrigger>
332
+ <SelectContent>
333
+ <SelectItem value="high">高</SelectItem>
334
+ <SelectItem value="medium">中</SelectItem>
335
+ <SelectItem value="low">低</SelectItem>
336
+ </SelectContent>
337
+ </Select>
338
+ </FormField>
339
+ <FormField id="priority" label="優先度 (size=sm)">
340
+ <Select value={priority} onValueChange={setPriority}>
341
+ <SelectTrigger size="sm" id="priority" aria-labelledby="priority-label">
342
+ <SelectValue placeholder="優先度" />
343
+ </SelectTrigger>
344
+ <SelectContent>
345
+ <SelectGroup>
346
+ <SelectLabel>標準</SelectLabel>
347
+ <SelectItem value="high">高</SelectItem>
348
+ <SelectItem value="medium">中</SelectItem>
349
+ <SelectItem value="low">低</SelectItem>
350
+ </SelectGroup>
351
+ <SelectSeparator />
352
+ <SelectGroup>
353
+ <SelectLabel>追加レベル</SelectLabel>
354
+ {Array.from({ length: 24 }, (_, index) => (
355
+ <SelectItem key={index} value={`level-${index + 1}`}>
356
+ レベル {index + 1}
357
+ </SelectItem>
358
+ ))}
359
+ </SelectGroup>
360
+ </SelectContent>
361
+ </Select>
362
+ </FormField>
363
+ </Flex>
364
+ </CardContent>
365
+ </Card>
366
+ </Flex>
367
+ </PageContainer>
368
+ );
369
+ }
@@ -0,0 +1,130 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { FormField, Slider } from "@godxjp/ui/data-entry";
5
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
6
+
7
+ /**
8
+ * Slider — Radix Slider wrapper. value/defaultValue MUST be number[] not a plain
9
+ * number. Single-thumb: [50], dual-thumb range: [20, 80].
10
+ * Use onValueCommit (not onValueChange) for expensive side-effects.
11
+ * Composed only from real @godxjp/ui components.
12
+ */
13
+ const yen = (n: number) =>
14
+ new Intl.NumberFormat("ja-JP", { style: "currency", currency: "JPY" }).format(n);
15
+
16
+ export default function Demo() {
17
+ const [taxRate, setTaxRate] = useState<number[]>([10]);
18
+ const [amountRange, setAmountRange] = useState<number[]>([50000, 300000]);
19
+ const [allocation, setAllocation] = useState<number[]>([40]);
20
+
21
+ return (
22
+ <PageContainer
23
+ title="Slider"
24
+ subtitle="Numeric range slider · value/defaultValue must be number[] (single-thumb: [n], range: [min, max])"
25
+ >
26
+ <Flex direction="col" gap="lg">
27
+ <Card>
28
+ <CardHeader>
29
+ <CardTitle level={2}>単一スライダー · 税率設定</CardTitle>
30
+ <CardDescription>
31
+ Single-thumb controlled slider. value={`[n]`} — plain number breaks rendering.
32
+ onValueChange fires on every drag; onValueCommit fires on release.
33
+ </CardDescription>
34
+ </CardHeader>
35
+ <CardContent>
36
+ <Flex direction="col" gap="md">
37
+ <FormField
38
+ id="tax-rate"
39
+ label={`消費税率: ${taxRate[0]}%`}
40
+ helper="0% / 8% (軽減税率) / 10% から選択"
41
+ >
42
+ <Slider
43
+ value={taxRate}
44
+ onValueChange={setTaxRate}
45
+ min={0}
46
+ max={10}
47
+ step={2}
48
+ name="tax_rate"
49
+ aria-label="消費税率"
50
+ />
51
+ </FormField>
52
+ </Flex>
53
+ </CardContent>
54
+ </Card>
55
+
56
+ <Card>
57
+ <CardHeader>
58
+ <CardTitle level={2}>レンジスライダー · 請求金額フィルタ</CardTitle>
59
+ <CardDescription>
60
+ Dual-thumb range slider: value={`[min, max]`}. Use minStepsBetweenThumbs to prevent
61
+ thumbs overlapping.
62
+ </CardDescription>
63
+ </CardHeader>
64
+ <CardContent>
65
+ <FormField
66
+ id="amount-range"
67
+ label={`請求金額: ${yen(amountRange[0])} 〜 ${yen(amountRange[1])}`}
68
+ >
69
+ <Slider
70
+ value={amountRange}
71
+ onValueChange={setAmountRange}
72
+ onValueCommit={(v) => {
73
+ // expensive filter refetch only on commit (pointer/key release)
74
+ void v;
75
+ }}
76
+ min={0}
77
+ max={1000000}
78
+ step={10000}
79
+ minStepsBetweenThumbs={1}
80
+ aria-label="請求金額範囲"
81
+ />
82
+ </FormField>
83
+ </CardContent>
84
+ </Card>
85
+
86
+ <Card>
87
+ <CardHeader>
88
+ <CardTitle level={2}>予算配分スライダー</CardTitle>
89
+ <CardDescription>
90
+ step=5 for coarse granularity. Use name= to submit with a native form without JS
91
+ wiring.
92
+ </CardDescription>
93
+ </CardHeader>
94
+ <CardContent>
95
+ <FormField
96
+ id="allocation"
97
+ label={`広告費配分: ${allocation[0]}%`}
98
+ helper="残り ${100 - allocation[0]}% が運転資金へ充当されます"
99
+ >
100
+ <Slider
101
+ value={allocation}
102
+ onValueChange={setAllocation}
103
+ min={0}
104
+ max={100}
105
+ step={5}
106
+ name="ad_allocation"
107
+ aria-label="広告費配分"
108
+ />
109
+ </FormField>
110
+ </CardContent>
111
+ </Card>
112
+
113
+ <Card>
114
+ <CardHeader>
115
+ <CardTitle level={2}>Disabled (read-only indicator)</CardTitle>
116
+ <CardDescription>
117
+ Pass disabled with a controlled value to show a non-interactive bar. Use Progress for
118
+ pure status display.
119
+ </CardDescription>
120
+ </CardHeader>
121
+ <CardContent>
122
+ <FormField id="locked-rate" label="確定済み税率 (変更不可)">
123
+ <Slider value={[10]} disabled min={0} max={20} step={1} aria-label="確定済み税率" />
124
+ </FormField>
125
+ </CardContent>
126
+ </Card>
127
+ </Flex>
128
+ </PageContainer>
129
+ );
130
+ }
@@ -0,0 +1,67 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
2
+ import { Field, Switch } from "@godxjp/ui/data-entry";
3
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
4
+
5
+ /**
6
+ * Switch — a boolean toggle. Wrap in Field (NOT FormField) for a labelled row
7
+ * with the hidden form input + description. Composed only from real @godxjp/ui
8
+ * components.
9
+ */
10
+ export default function Demo() {
11
+ return (
12
+ <PageContainer title="Switch" subtitle="Boolean toggle · wrap in Field for a labelled row">
13
+ <Flex direction="col" gap="lg">
14
+ <Card>
15
+ <CardHeader>
16
+ <CardTitle level={2}>Labelled rows (Field)</CardTitle>
17
+ <CardDescription>Field owns the label, description, and form input.</CardDescription>
18
+ </CardHeader>
19
+ <CardContent>
20
+ <Flex direction="col" gap="md">
21
+ <Field
22
+ id="invoice-mail"
23
+ label="請求書をメール送信"
24
+ description="発行時に取引先へ自動送信します"
25
+ >
26
+ <Switch id="invoice-mail" defaultChecked />
27
+ </Field>
28
+ <Field id="reminder" label="支払期日リマインダー" description="期日3日前に通知します">
29
+ <Switch id="reminder" />
30
+ </Field>
31
+ <Field id="locked" label="期間ロック" description="確定済みのため変更できません">
32
+ <Switch id="locked" disabled defaultChecked />
33
+ </Field>
34
+ </Flex>
35
+ </CardContent>
36
+ </Card>
37
+
38
+ <Card>
39
+ <CardHeader>
40
+ <CardTitle level={2}>size · sm / md</CardTitle>
41
+ <CardDescription>
42
+ sm は一覧行やツールバーなど密度の高い場所、md (既定) は設定画面の行に使う。
43
+ </CardDescription>
44
+ </CardHeader>
45
+ <CardContent>
46
+ <Flex direction="col" gap="md">
47
+ <Field
48
+ id="sw-size-sm"
49
+ label="自動保存 (sm)"
50
+ description="行の高さを抑えた一覧向けのサイズ"
51
+ >
52
+ <Switch id="sw-size-sm" size="sm" defaultChecked />
53
+ </Field>
54
+ <Field
55
+ id="sw-size-md"
56
+ label="自動保存 (md · 既定)"
57
+ description="設定画面の標準サイズ"
58
+ >
59
+ <Switch id="sw-size-md" size="md" defaultChecked />
60
+ </Field>
61
+ </Flex>
62
+ </CardContent>
63
+ </Card>
64
+ </Flex>
65
+ </PageContainer>
66
+ );
67
+ }
@@ -0,0 +1,108 @@
1
+ import { useState } from "react";
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
+ import { FormField, TagInput } from "@godxjp/ui/data-entry";
5
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
6
+
7
+ /**
8
+ * TagInput — free-form multi-value chips input. value is string[] (NOT string).
9
+ * Enter or comma commits a tag; Backspace on empty removes the last chip.
10
+ * Use Select (multiple, with showSearch) instead when the set of values is fixed.
11
+ * Composed only from real @godxjp/ui components.
12
+ */
13
+ export default function Demo() {
14
+ const [invoiceTags, setInvoiceTags] = useState<string[]>(["営業部", "Q1"]);
15
+ const [skillTags, setSkillTags] = useState<string[]>(["経理", "仕訳入力"]);
16
+ const [recipientEmails, setRecipientEmails] = useState<string[]>([]);
17
+
18
+ return (
19
+ <PageContainer
20
+ title="TagInput"
21
+ subtitle="Free-form chips input · value is string[]; Enter/comma to add, Backspace to remove"
22
+ >
23
+ <Flex direction="col" gap="lg">
24
+ <Card>
25
+ <CardHeader>
26
+ <CardTitle level={2}>請求書ラベル</CardTitle>
27
+ <CardDescription>
28
+ Controlled via value/onValueChange (string[]). Deduplicate is built in. Use for ad-hoc
29
+ record labels.
30
+ </CardDescription>
31
+ </CardHeader>
32
+ <CardContent>
33
+ <FormField id="invoice-tags" label="ラベル" helper="Enterまたはカンマで追加">
34
+ <TagInput
35
+ value={invoiceTags}
36
+ onValueChange={setInvoiceTags}
37
+ placeholder="ラベルを追加..."
38
+ name="labels"
39
+ />
40
+ </FormField>
41
+ </CardContent>
42
+ </Card>
43
+
44
+ <Card>
45
+ <CardHeader>
46
+ <CardTitle level={2}>担当者スキルタグ</CardTitle>
47
+ <CardDescription>
48
+ name= emits a hidden comma-joined input for native form submission without JS wiring.
49
+ </CardDescription>
50
+ </CardHeader>
51
+ <CardContent>
52
+ <FormField id="skill-tags" label="スキル・資格">
53
+ <TagInput
54
+ value={skillTags}
55
+ onValueChange={setSkillTags}
56
+ placeholder="スキルを入力..."
57
+ name="skills"
58
+ />
59
+ </FormField>
60
+ </CardContent>
61
+ </Card>
62
+
63
+ <Card>
64
+ <CardHeader>
65
+ <CardTitle level={2}>承認通知メール送信先</CardTitle>
66
+ <CardDescription>
67
+ Uncontrolled start (empty defaultValue); caller receives full updated array on each
68
+ change.
69
+ </CardDescription>
70
+ </CardHeader>
71
+ <CardContent>
72
+ <FormField
73
+ id="recipient-emails"
74
+ label="CC送信先"
75
+ helper="複数のメールアドレスをEnterで追加できます"
76
+ >
77
+ <TagInput
78
+ id="recipient-emails"
79
+ aria-label="CC送信先メール"
80
+ className="contract-tag-input"
81
+ value={recipientEmails}
82
+ onValueChange={setRecipientEmails}
83
+ placeholder="メールアドレスを追加..."
84
+ name="cc_emails"
85
+ />
86
+ </FormField>
87
+ </CardContent>
88
+ </Card>
89
+
90
+ <Card>
91
+ <CardHeader>
92
+ <CardTitle level={2}>無効状態</CardTitle>
93
+ <CardDescription>
94
+ disabled dims the whole control and drops the remove buttons; the container is marked
95
+ aria-disabled so the dimmed chips are treated as an inactive control (no contrast
96
+ failure).
97
+ </CardDescription>
98
+ </CardHeader>
99
+ <CardContent>
100
+ <FormField id="disabled-tags" label="ラベル">
101
+ <TagInput value={["確定済み", "ロック"]} disabled />
102
+ </FormField>
103
+ </CardContent>
104
+ </Card>
105
+ </Flex>
106
+ </PageContainer>
107
+ );
108
+ }