@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
@@ -72,9 +72,8 @@ export type CompactBarTrendProp = {
72
72
  /** Plot-height tier — `xs|sm|md|lg`. Defaults to `xs` (dashboard summary-card density). */
73
73
  size?: SizeProp;
74
74
  /**
75
- * Index of the emphasized ("current") bar. Negative counts from the end
76
- * (`-1` = the latest datum); out of range = no emphasis. Never colour-only —
77
- * the emphasized row is annotated in the screen-reader text alternative.
75
+ * Index of the emphasized ("current") bar. Negative counts from the end (`-1` = the latest
76
+ * datum); out of range = no emphasis.
78
77
  */
79
78
  emphasizedIndex?: number;
80
79
  /** Render the category tick labels under the plot. */
@@ -1,5 +1,31 @@
1
1
  /** Data Display component prop types — @see docs/COMPONENTS.md#data-display */
2
2
  import type * as React from "react";
3
+ /** @see CodeBlock — a block of preformatted text (request bodies, logs, snippets). */
4
+ export type CodeBlockProp = {
5
+ /** The text. Pass a string; a highlighter's spans also work. */
6
+ children?: ChildrenProp;
7
+ /** Soft-wrap long lines (default true). `false` scrolls horizontally instead. */
8
+ wrap?: boolean;
9
+ /** Scroll inside the block past this height. Default `none` (grows with the content). */
10
+ maxHeight?: "sm" | "md" | "lg" | "none";
11
+ /** Type size. Default `sm`. */
12
+ size?: Extract<SizeProp, "xs" | "sm">;
13
+ /** Cosmetic: lands on `data-language`; no highlighter is bundled. */
14
+ language?: string;
15
+ className?: ClassNameProp;
16
+ };
17
+ /**
18
+ * @see Prose — typography for rendered content (Markdown, CMS bodies). Styles descendant semantic
19
+ * HTML from the tokens; it has no opinion about where the HTML comes from.
20
+ */
21
+ export type ProseProp = {
22
+ /** Body size. `md` is the page body size; `sm` is the compact step. Default `md`. */
23
+ size?: Extract<SizeProp, "sm" | "md">;
24
+ /** `fit` scales images to the column (default); `original` shows them at their authored size. */
25
+ imageSize?: "fit" | "original";
26
+ className?: ClassNameProp;
27
+ children?: ChildrenProp;
28
+ };
3
29
  import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp, DescriptionsLayoutProp } from "../vocabulary/index.js";
4
30
  /** @see EmptyState */
5
31
  /**
@@ -15,26 +41,14 @@ export type EmptyStateProp = {
15
41
  action?: ActionProp;
16
42
  /** Visual weight appropriate to the empty condition. Default `page`. */
17
43
  variant?: "page" | "section" | "compact";
18
- /**
19
- * Medallion colour intent. Default `muted` (the neutral placeholder look). Set `success` for a
20
- * confirmation zero-state (e.g. device approved), or `warning`/`destructive`/`info` to match the
21
- * condition — tints the icon foreground + medallion fill from the matching role token, so a
22
- * consumer never hand-rolls a `.ui-success-state` class to recolour it.
23
- */
44
+ /** Medallion colour intent. Default `muted` (the neutral placeholder look). */
24
45
  tone?: EmptyStateToneProp;
25
- /**
26
- * Semantic heading level (`h1`–`h4`) for the title. Default `3`. Choose it to
27
- * keep the page outline valid (`h1 → h2 → h3`, no skipped levels), NOT for
28
- * visual size — the title size is fixed by `--empty-state` styles regardless
29
- * of level. A page/onboarding empty state directly under a page `h1` uses
30
- * `titleLevel={2}`; an empty state nested in an already-`h2` section uses `3`.
31
- */
46
+ /** Semantic heading level (`h1`–`h4`) for the title. Default `3`. */
32
47
  titleLevel?: HeadingLevelProp;
33
48
  /**
34
- * Render the title as a non-heading element (`p` / `div`) instead of a
35
- * heading. Use for a `compact`/`section` empty state placed inside a section
36
- * that already owns its heading, so the zero-state message is not announced as
37
- * a heading and cannot skip an outline level. Overrides `titleLevel`.
49
+ * Render the title as a non-heading element (`p` / `div`) instead of a heading. Use for a
50
+ * `compact`/`section` empty state placed inside a section that already owns its heading, so the
51
+ * zero-state message is not announced as a heading and cannot skip an outline level.
38
52
  */
39
53
  titleAs?: "h1" | "h2" | "h3" | "h4" | "p" | "div";
40
54
  className?: ClassNameProp;
@@ -75,13 +89,8 @@ export type AvatarProp = React.ComponentPropsWithoutRef<"span"> & {
75
89
  /**
76
90
  * Presence — WHO is reachable right now, drawn as an indicator at the block-end/inline-end
77
91
  * corner of the mark with a localized `sr-only` label folded into the avatar's accessible text.
78
- * Never colour alone (WCAG 1.4.1): each value also has its own silhouette (filled · half-filled ·
79
- * barred · hollow).
80
- *
81
- * OMIT the prop entirely for an entity that has no presence concept (an organization mark, a
82
- * capability medallion) — an absent prop emits no node and no attribute, so the DOM stays
83
- * byte-identical to today's. Pass `"offline"` for a person KNOWN to be unreachable; that is a
84
- * different statement, exactly as `ListRow`'s omitted vs `false` `unread` is.
92
+ * Never colour alone (WCAG 1.4.1): each value also has its own silhouette (filled · half-filled
93
+ * · barred · hollow).
85
94
  */
86
95
  presence?: AvatarPresenceProp;
87
96
  /**
@@ -131,6 +140,13 @@ export type BadgeProp = {
131
140
  variant?: "default" | "secondary" | "outline";
132
141
  /** Status tones plus a brand `primary` tone (soft brand pill); solid brand = `variant="default"`. */
133
142
  tone?: ToneProp | "primary";
143
+ /**
144
+ * The entity's OWN colour (a status, an issue type, a tag) as a CSS colour —
145
+ * DATA, not a semantic tone. Washed into `--badge-tint-surface` rather than
146
+ * filled, because no foreground clears WCAG AA against every colour a picker
147
+ * can produce. Wins over `tone` and over `variant`'s fill.
148
+ */
149
+ color?: string;
134
150
  status?: string;
135
151
  icon?: React.ComponentType<{
136
152
  className?: string;
@@ -149,15 +165,9 @@ export type CredentialRevealTone = Extract<ToneProp, "warning" | "destructive" |
149
165
  export type CredentialRevealProp = {
150
166
  /** The one-time secret value shown masked by default and copied verbatim. */
151
167
  secret: string;
152
- /**
153
- * Accessible name / caption for the secret (e.g. "API key", "デバイス資格情報"). When set it labels
154
- * the secret region; when omitted a generic localized label is used.
155
- */
168
+ /** Accessible name / caption for the secret (e.g. "API key", "デバイス資格情報"). */
156
169
  label?: LabelProp;
157
- /**
158
- * Caution banner copy. Defaults to the localized "shown only once" warning. Pass `null` to
159
- * suppress the banner entirely (e.g. when the surrounding Dialog already carries the caution).
160
- */
170
+ /** Caution banner copy. Defaults to the localized "shown only once" warning. */
161
171
  warning?: React.ReactNode | null;
162
172
  /** Controlled reveal state (masked ↔ shown). */
163
173
  revealed?: boolean;
@@ -213,43 +223,31 @@ export type DataTableProp<T> = {
213
223
  loading?: boolean;
214
224
  empty?: React.ReactNode;
215
225
  /**
216
- * Failure state (#216). `true` = built-in localized message (with a retry when `onRetry` is
217
- * given); any other node replaces it. `false`/`undefined` = the read succeeded.
226
+ * `true` = built-in localized message (with a retry when `onRetry` is given); any other node
227
+ * replaces it. `false`/`undefined` = the read succeeded.
218
228
  */
219
229
  error?: React.ReactNode;
220
- /**
221
- * Permission-denied state (#216) — refused, not failed. `true` = built-in localized message
222
- * with NO retry. Takes precedence over `error`.
223
- */
230
+ /** `true` = built-in localized message with NO retry. Takes precedence over `error`. */
224
231
  denied?: React.ReactNode;
225
232
  /** Retry handler surfaced by the built-in `error` state. */
226
233
  onRetry?: HandlerProp;
227
234
  /**
228
- * Named collection contract (gh#253) the SAME preset the `Table` primitive owns, forwarded to
229
- * the table DataTable renders. `"default"` (the default) emits no attribute and matches no
230
- * selector. `"action-collection"` is the canonical dense approval / action queue: below
231
- * `collapseBelow` the desktop intrinsic column widths give way to the token-owned column-PRIORITY
232
- * measures (`--table-action-collection-*`) under `table-layout: fixed`, cells wrap, and the
233
- * surface drops its `--table-surface-min-inline-size` floor — so every column, row actions
234
- * included, stays inside a 390px frame with no horizontal scroll. Mark each column with
235
+ * `"default"` (the default) emits no attribute and matches no selector. Mark each column with
235
236
  * `priority` on its `ColumnDef`.
236
237
  */
237
238
  preset?: TablePresetProp;
238
239
  /**
239
- * Container step at which `preset="action-collection"` switches to the compact priority measures.
240
- * Measured against the TABLE's own container (a container query), not the viewport, so a table in
241
- * a master rail collapses before the page does. Default `"sm"`. Ignored while `preset` is
242
- * `"default"`.
240
+ * Container step at which `preset="action-collection"` switches to the compact priority
241
+ * measures. Default `"sm"`.
243
242
  */
244
243
  collapseBelow?: BreakpointProp;
245
244
  className?: ClassNameProp;
246
245
  children?: ChildrenProp;
247
246
  };
248
247
  /**
249
- * ListRow geometry `default` (the roomy entity row) or `compact` (#246: the inline-actions row —
250
- * Avatar + title/description + one or two small trailing Buttons on ONE line inside a narrow card).
251
- * A ListRow-LOCAL subset of the shared density vocabulary: the row has no `comfortable` step, so it
252
- * is deliberately narrower than `DensityProp` (and unrelated to `PageDensityProp`/`TableDensityProp`).
248
+ * A ListRow-LOCAL subset of the shared density vocabulary: the row has no `comfortable` step, so
249
+ * it is deliberately narrower than `DensityProp` (and unrelated to
250
+ * `PageDensityProp`/`TableDensityProp`).
253
251
  */
254
252
  export type ListRowDensityProp = Exclude<DensityProp, "comfortable">;
255
253
  /** @see ListRow */
@@ -266,11 +264,8 @@ export type ListRowProp = {
266
264
  trailing?: React.ReactNode;
267
265
  /** Cross-axis alignment of the columns — `center` (default) or `start` for multi-line content. */
268
266
  align?: "center" | "start";
269
- /** How over-long title/description resolve — `truncate` (default) or `wrap` (#224). */
270
267
  overflow?: "truncate" | "wrap";
271
- /** Row geometry — `default` or the compact inline-actions preset (#246). */
272
268
  density?: ListRowDensityProp;
273
- /** Read/unread state — indicator dot + localized `sr-only` text, never colour alone (#225). */
274
269
  unread?: boolean;
275
270
  className?: ClassNameProp;
276
271
  };
@@ -315,8 +310,7 @@ export type PermissionMatrixProp = {
315
310
  grants: PermissionMatrixGrantsProp;
316
311
  /**
317
312
  * Grant toggle handler. Its PRESENCE makes the matrix editable (checkbox cells); omitted, the
318
- * matrix is the canonical read-only ✓/— grid. Locked roles and `readOnly` stay read-only
319
- * regardless.
313
+ * matrix is the canonical read-only ✓/— grid.
320
314
  */
321
315
  onGrantChange?: (roleId: string, permissionId: string, granted: boolean) => void;
322
316
  /** Force the read-only grid even when `onGrantChange` is present (e.g. viewer permission). */
@@ -331,7 +325,6 @@ export type PermissionMatrixProp = {
331
325
  loading?: boolean;
332
326
  /** Custom empty content when `permissions` is empty; defaults to a localized EmptyState. */
333
327
  empty?: React.ReactNode;
334
- /** Failure state (mirrors DataTable #216): `true` = built-in localized message, node = replace. */
335
328
  error?: React.ReactNode;
336
329
  /** Permission-denied state — refused, not failed. Takes precedence over `error`. */
337
330
  denied?: React.ReactNode;
@@ -341,25 +334,15 @@ export type PermissionMatrixProp = {
341
334
  id?: IdProp;
342
335
  };
343
336
  /**
344
- * Edge the ScrollArea viewport sticks to as its content grows (gh#311).
345
- *
346
- * - `none` — the scroll offset is left entirely alone. This is the default and is exactly the
347
- * behaviour a ScrollArea has always had.
348
- * - `bottom` — a live stream (chat, log tail, streaming response, activity feed). While the reader
349
- * is within `anchorOffset` of the bottom, arriving content keeps the newest item in view; once
350
- * they scroll away to read history, growth NEVER moves them, and content inserted ABOVE the
351
- * read position is compensated so the item under their eyes stays put.
337
+ * This is the default and is exactly the behaviour a ScrollArea has always had. - `bottom` — a
338
+ * live stream (chat, log tail, streaming response, activity feed).
352
339
  */
353
340
  export type ScrollAreaAnchorProp = "none" | "bottom";
354
341
  /** @see ScrollArea */
355
342
  export type ScrollAreaProp = {
356
343
  /**
357
344
  * Ref to the element that actually SCROLLS — the Radix viewport — not the root. The root is
358
- * `overflow: hidden` and never scrolls, so the component's own `ref` cannot serve. Use this to
359
- * read `scrollTop`/`scrollHeight`, call `scrollTo()`, restore a saved position, or drive a
360
- * "jump to newest" button. It is the typed, supported alternative to querying the Radix-internal
361
- * `[data-radix-scroll-area-viewport]` attribute, which is not a public contract and is ambiguous
362
- * the moment two ScrollAreas nest.
345
+ * `overflow: hidden` and never scrolls, so the component's own `ref` cannot serve.
363
346
  */
364
347
  viewportRef?: React.Ref<HTMLDivElement>;
365
348
  /** Edge the viewport sticks to as content grows. Default `none` (inert). */
@@ -42,7 +42,6 @@ export type TextareaProp = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {
42
42
  onClear?: () => void;
43
43
  /** `ghost` drops the field's own border/background/ring for a textarea inside a surface that already draws the box. */
44
44
  variant?: "default" | "ghost";
45
- /** Grow the box with its content between `minRows` and `maxRows` instead of a fixed `rows` height (default false). */
46
45
  autoGrow?: boolean;
47
46
  /** Floor in text rows while `autoGrow`; never undercuts the `--control-height` tier. */
48
47
  minRows?: number;
@@ -72,9 +71,9 @@ export type NumberInputProp = FieldA11yProps & {
72
71
  readOnly?: boolean;
73
72
  size?: SizeProp;
74
73
  placeholder?: PlaceholderProp;
75
- /** Leading affix inside the field (e.g. `¥`). Decorative — `aria-hidden`. */
74
+ /** Leading affix inside the field (e.g. `¥`). */
76
75
  prefix?: React.ReactNode;
77
- /** Trailing affix inside the field (e.g. `%`). Decorative — `aria-hidden`. */
76
+ /** Trailing affix inside the field (e.g. `%`). */
78
77
  suffix?: React.ReactNode;
79
78
  /** Form field name — the visible input submits its value natively. */
80
79
  name?: NameProp;
@@ -96,19 +95,12 @@ export type FormProp = React.FormHTMLAttributes<HTMLFormElement> & {
96
95
  collapseBelow?: BreakpointProp | false;
97
96
  columns?: ResponsiveGridColumnsProp;
98
97
  density?: DensityProp;
99
- /**
100
- * Server validation error bag (e.g. Inertia's `form.errors`). Each `FormField name="…"` inside
101
- * resolves its own message from the bag automatically and CLAIMS its key; `<FormErrors />`
102
- * renders the remaining, unclaimed entries — errors attached to hidden/derived fields that no
103
- * visible field displays. Works in both the `<form>` and `asChild` modes. A Form WITHOUT this
104
- * prop joins a surrounding `FormErrorsProvider` instead (sibling Card+Form sections sharing one
105
- * bag); a Form WITH it starts its own (shadowing) registry.
106
- */
98
+ /** Server validation error bag (e.g. Inertia's `form.errors`). */
107
99
  errors?: ErrorBagProp;
108
100
  /**
109
- * Render the caller's own element instead of a `<form>`, keeping only the layout context.
110
- * For routing libraries that own the form element (Inertia, TanStack Form) — two `<form>`
111
- * elements cannot nest. `columns` does not apply in this mode; wrap fields in ResponsiveGrid.
101
+ * Render the caller's own element instead of a `<form>`, keeping only the layout context. For
102
+ * routing libraries that own the form element (Inertia, TanStack Form) — two `<form>` elements
103
+ * cannot nest.
112
104
  */
113
105
  asChild?: boolean;
114
106
  className?: ClassNameProp;
@@ -129,21 +121,15 @@ export type FormFieldProp = {
129
121
  id?: IdProp;
130
122
  /**
131
123
  * Error-bag key of this field. When the surrounding `Form` carries `errors`, the field
132
- * resolves its message from `errors[name]` automatically (an explicit `error` prop wins)
133
- * and CLAIMS the key so `<FormErrors />` does not repeat it. Also the default source of
134
- * {@link FormFieldProp.field} (below), so a field that already names its error key does not
135
- * repeat itself.
124
+ * resolves its message from `errors[name]` automatically (an explicit `error` prop wins) and
125
+ * CLAIMS the key so `<FormErrors />` does not repeat it.
136
126
  */
137
127
  name?: NameProp;
138
128
  /**
139
- * Stable MACHINE key of this field the bare column/parameter name (`project_name`), not a
140
- * bracketed legacy path (gh#337). Rendered on the control as `data-field`, and as a native
141
- * `name` when the app opted in via `<AppProvider emitFieldNames>`.
142
- *
143
- * Defaults to `name`, then `id` — which is why an app whose fields already carry a
144
- * column-named `id` gets the attribute on every control without editing a single screen.
145
- * Set it explicitly only where `id` is a DOM-uniqueness artefact rather than the field key
146
- * (`id="source_slip_field"` for `field="source_slip_id"`).
129
+ * Rendered on the control as `data-field`, and as a native `name` when the app opted in via
130
+ * `<AppProvider emitFieldNames>`. Defaults to `name`, then `id` which is why an app whose
131
+ * fields already carry a column-named `id` gets the attribute on every control without
132
+ * editing a single screen.
147
133
  */
148
134
  field?: NameProp;
149
135
  label: LabelProp;
@@ -288,8 +274,23 @@ export type FieldProp = {
288
274
  };
289
275
  /** @see Slider — numeric range (Radix Slider). */
290
276
  export type SliderProp = React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>;
291
- /** @see Calendar — react-day-picker DayPicker. */
292
- export type CalendarProp = DayPickerProps;
277
+ /** @see Calendar — react-day-picker DayPicker plus an opt-in footer. */
278
+ export type CalendarProp = DayPickerProps & CalendarFooterProp & {
279
+ /** Replaces the built-in footer actions. */
280
+ footer?: React.ReactNode;
281
+ };
282
+ /** Footer actions shared by Calendar and the pickers that embed it. Both default to off. */
283
+ export type CalendarFooterProp = {
284
+ /**
285
+ * Show a Today action: jumps to the current month and selects today (single), fills the open
286
+ * end of the range (range) or adds today (multiple). Disabled when today is outside
287
+ * `startMonth` / `endMonth` or matches `disabled`.
288
+ */
289
+ showToday?: boolean;
290
+ /** Show a Close action that calls `onClose`. */
291
+ showClose?: boolean;
292
+ onClose?: () => void;
293
+ };
293
294
  /** @see DatePicker */
294
295
  export type DatePickerProp = FieldA11yProps & {
295
296
  value?: ValueProp<Date>;
@@ -306,7 +307,7 @@ export type DatePickerProp = FieldA11yProps & {
306
307
  toDate?: Date;
307
308
  /** Show an inline ✕ to clear the value when one is set (default true). */
308
309
  allowClear?: boolean;
309
- };
310
+ } & Pick<CalendarFooterProp, "showToday" | "showClose">;
310
311
  /** @see MonthPicker */
311
312
  export type MonthPickerProp = FieldA11yProps & {
312
313
  value?: ValueProp<Date>;
@@ -360,7 +361,7 @@ export type DateRangePickerProp = FieldA11yProps & {
360
361
  toDate?: Date;
361
362
  /** Show an inline ✕ to clear the range when one is set (default true). */
362
363
  allowClear?: boolean;
363
- };
364
+ } & Pick<CalendarFooterProp, "showToday" | "showClose">;
364
365
  /** @see TimePicker — popover HH:mm picker (canonical 24h storage). */
365
366
  export type TimePickerProp = FieldA11yProps & {
366
367
  value?: ValueProp;
@@ -429,8 +430,7 @@ export type SearchSelectProp = {
429
430
  /**
430
431
  * Custom renderer for the SELECTED value shown on the trigger (Ant Design `labelRender`).
431
432
  * Receives the value, the resolved label, and the full option when it is loaded (undefined for
432
- * an async preset whose page hasn't arrived). Only used while a value is selected; the
433
- * placeholder still shows when empty. Overrides the default icon + label trigger content.
433
+ * an async preset whose page hasn't arrived).
434
434
  */
435
435
  labelRender?: (selected: {
436
436
  value: string;
@@ -458,7 +458,7 @@ export type SearchSelectProp = {
458
458
  /**
459
459
  * Read-only: the current value is shown (and the clear affordance hidden) but the popover cannot
460
460
  * be opened — no new pick, no search. Mirrors the Input/NumberInput readOnly contract (stays
461
- * focusable + submits its value, unlike `disabled`). Default false.
461
+ * focusable + submits its value, unlike `disabled`).
462
462
  */
463
463
  readOnly?: boolean;
464
464
  /** Trigger height tier — forwarded to the underlying Button. Default matches Button's own default. */
@@ -472,7 +472,7 @@ export type SearchSelectProp = {
472
472
  /**
473
473
  * Override the default client-side filter (`options` mode only — ignored with `loadOptions`,
474
474
  * which is responsible for its own server-side filtering). Receives the option and the trimmed
475
- * query; return true to keep the row. Only consulted while the query is non-empty.
475
+ * query; return true to keep the row.
476
476
  */
477
477
  filterOption?: (option: SearchSelectOptionProp, query: string) => boolean;
478
478
  /**
@@ -504,18 +504,13 @@ export type SearchSelectProp = {
504
504
  "aria-invalid"?: boolean | "true" | "false";
505
505
  "aria-required"?: boolean | "true" | "false";
506
506
  "data-testid"?: string;
507
- /** Stable machine key, forwarded to the trigger (gh#337). Normally injected by `FormField`. */
507
+ /** Normally injected by `FormField`. */
508
508
  "data-field"?: string;
509
509
  };
510
510
  /**
511
511
  * Data-driven (Ant-style) form of {@link Select} — one component covering static `options` or
512
512
  * async `loadOptions`, with `showSearch` toggling the searchable combobox vs a plain listbox.
513
513
  * Passing `options`/`loadOptions` to `<Select>` switches it from the compound API to this one.
514
- *
515
- * `readOnly`/`size`/`open`/`onOpenChange`/`search`/`onSearchChange`/`filterOption`/`renderError`/
516
- * `renderLoadMore` (inherited from {@link SearchSelectProp}) take effect ONLY in searchable mode
517
- * (`showSearch` or `loadOptions`) — they configure the `SearchSelect` engine that mode delegates
518
- * to. The plain listbox (no search) is a native Radix listbox and ignores them.
519
514
  */
520
515
  export type SelectDataProp = SearchSelectProp & {
521
516
  /** Show the search box (combobox). Defaults to true when `loadOptions` is set, otherwise false. */
@@ -13,8 +13,7 @@ export type UseZodFormReturnProp<TFieldValues extends FieldValues> = UseFormRetu
13
13
  * Framework-agnostic form-state adapter — decouples `FormRoot`/`FormFieldControl` from any single
14
14
  * form library. The DS ships the built-in react-hook-form path (`form`), and an adapter lets a
15
15
  * SERVER-driven form library plug into the same auto-binding: Inertia's `useForm`
16
- * (`@godxjp/ui/inertia`), formik, or TanStack Form. The core has ZERO dependency on any of them —
17
- * a consumer wraps its own form object in an adapter and passes it to `FormRoot`.
16
+ * (`@godxjp/ui/inertia`), formik, or TanStack Form.
18
17
  */
19
18
  export interface FormStateAdapter {
20
19
  /** Current value of the field `name` (dotted paths allowed if the underlying store supports them). */
@@ -27,7 +26,6 @@ export interface FormStateAdapter {
27
26
  isSubmitting: boolean;
28
27
  /** Optional blur handler (e.g. touch-tracking); called with the field name. */
29
28
  onBlur?(name: string): void;
30
- /** Optional snapshot of all values, passed to `onSubmit`; defaults to `{}` when absent. */
31
29
  getValues?(): unknown;
32
30
  }
33
31
  /** @see FormRoot */
@@ -39,11 +37,9 @@ export type FormRootProp<TFieldValues extends FieldValues> = {
39
37
  form?: UseZodFormReturnProp<TFieldValues>;
40
38
  /**
41
39
  * Framework-agnostic form-state adapter (e.g. `inertiaAdapter(form)` from `@godxjp/ui/inertia`).
42
- * Provide EITHER `form` OR `adapter`. With an adapter, `FormFieldControl` auto-binds each field by
43
- * `name` (value/onChange/error/aria) and `useFormSubmitting()` reads `isSubmitting`.
44
40
  */
45
41
  adapter?: FormStateAdapter;
46
- /** Submit handler. RHF path receives validated `values`; the adapter path calls it with a snapshot (`getValues()`), typically ignored in favour of the form library's own submit (`form.post(url)`). */
42
+ /** Submit handler. */
47
43
  onSubmit: (values: TFieldValues) => void | Promise<void>;
48
44
  children: React.ReactNode;
49
45
  className?: string;
@@ -3,7 +3,7 @@ import type * as React from "react";
3
3
  import type { ActivityAnnounceProp, ActivityVariantProp, AsChildProp, ButtonSizeProp, ButtonVariantProp, ChildrenProp, ClassNameProp, DisabledProp, FontWeightProp, HeadingLevelProp, LabelProp, OnClickProp, PendingProp, RevealDelayProp, ShapeProp, SizeProp, TextAlignProp, TextSizeProp, TextToneProp } from "../vocabulary/index.js";
4
4
  /** @see Text — typographic primitive; replaces hand-rolled `<span className="text-[13px] …">`. */
5
5
  export type TextProp = Omit<React.HTMLAttributes<HTMLElement>, "color"> & {
6
- /** Render element. Default `span`. Covers inline/block text + description-list + code/caption. */
6
+ /** Render element. Default `span`. */
7
7
  as?: "span" | "p" | "div" | "label" | "strong" | "em" | "small" | "code" | "kbd" | "dt" | "dd" | "caption" | "abbr";
8
8
  /** Size from the type scale — never an arbitrary px. Default `sm` (base). */
9
9
  size?: TextSizeProp;
@@ -15,10 +15,8 @@ export type TextProp = Omit<React.HTMLAttributes<HTMLElement>, "color"> & {
15
15
  /** Single-line ellipsis. Mutually exclusive with `clamp` — when both are set, `clamp` wins. */
16
16
  truncate?: boolean;
17
17
  /**
18
- * Multi-line clamp — max rendered lines (integer ≥ 1); overflow ends in an ellipsis.
19
- * Token-owned line-clamp styling (never write the `line-clamp-N` utility page-side).
20
- * Visual-only: the full text stays in the DOM / accessible name. Mutually exclusive with
21
- * `truncate` — when both are set, `clamp` wins (dev builds warn).
18
+ * Multi-line clamp — max rendered lines (integer ≥ 1); overflow ends in an ellipsis. Token-owned
19
+ * line-clamp styling (never write the `line-clamp-N` utility page-side).
22
20
  */
23
21
  clamp?: number;
24
22
  /** Tabular figures for aligned numbers. */
@@ -44,10 +42,6 @@ export type ButtonProp = React.ButtonHTMLAttributes<HTMLButtonElement> & {
44
42
  size?: ButtonSizeProp;
45
43
  /** Corner shape — `default` (control radius) · `pill` (fully rounded) · `sharp` (square). */
46
44
  shape?: ShapeProp;
47
- /**
48
- * Span the full width of the container (`width:100%`) instead of sizing to content —
49
- * the prop form of `className="w-full"` for stacked/auth/dialog-footer actions (rule #42).
50
- */
51
45
  fullWidth?: boolean;
52
46
  asChild?: AsChildProp;
53
47
  onClick?: OnClickProp;
@@ -60,16 +54,13 @@ export type ButtonProp = React.ButtonHTMLAttributes<HTMLButtonElement> & {
60
54
  /** Optional label to swap in while `loading` (pass the `t()`-translated string). */
61
55
  loadingText?: string;
62
56
  /**
63
- * Optional numeric count rendered as a borderless counter pill after the label
64
- * (filter tabs / segmented toggles, e.g. "Chờ bay 18"). Formatted with
65
- * `Intl.NumberFormat` in the active locale and styled to read on the button's
66
- * own variant — never nest a `Badge` inside a Button for this.
67
- * Ignored when `asChild` (Radix Slot requires a single child).
57
+ * Optional numeric count rendered as a borderless counter pill after the label (filter tabs /
58
+ * segmented toggles, e.g. "Chờ bay 18").
68
59
  */
69
60
  count?: number;
70
61
  /**
71
- * Cap for `count` (Ant Badge parity). When `count` exceeds it the pill shows
72
- * `{overflowCount}+` (e.g. `99+`). Defaults to 99.
62
+ * Cap for `count` (Ant Badge parity). When `count` exceeds it the pill shows `{overflowCount}+`
63
+ * (e.g.
73
64
  */
74
65
  overflowCount?: number;
75
66
  /**
@@ -90,7 +81,7 @@ export type RevealProp = React.HTMLAttributes<HTMLDivElement> & {
90
81
  children?: ChildrenProp;
91
82
  /**
92
83
  * Stagger ordinal — an INDEX into the motion ladder (`0..6`), never a raw ms. Each step adds one
93
- * `--reveal-stagger-step` of delay so sibling reveals cascade. Default `0` (enter immediately).
84
+ * `--reveal-stagger-step` of delay so sibling reveals cascade.
94
85
  */
95
86
  delay?: RevealDelayProp;
96
87
  /**
@@ -117,14 +108,11 @@ export type RevealProp = React.HTMLAttributes<HTMLDivElement> & {
117
108
  * own mark structure, so there is no single child to merge onto.
118
109
  */
119
110
  export type ActivityProp = Omit<React.HTMLAttributes<HTMLSpanElement>, "color"> & {
120
- /**
121
- * The mark. Default `dots` — three dots rising in sequence, the ellipsis convention.
122
- * `pulse` is a single breathing mark (live / recording); `bar` an indeterminate sweep (syncing).
123
- */
111
+ /** The mark. Default `dots` — three dots rising in sequence, the ellipsis convention. */
124
112
  variant?: ActivityVariantProp;
125
113
  /**
126
114
  * Size step, the standard ladder. Default `sm` — an ambient mark is never the loudest thing on
127
- * screen. Scales the mark AND the label together (the mark is `em`-based).
115
+ * screen.
128
116
  */
129
117
  size?: SizeProp;
130
118
  /** Semantic colour intent. Default `muted` — ambient, not an alert. */
@@ -132,9 +120,7 @@ export type ActivityProp = Omit<React.HTMLAttributes<HTMLSpanElement>, "color">
132
120
  /**
133
121
  * Localized description of WHAT is happening ("Hưng đang nhập…", "同期中…"). Rendered as visible
134
122
  * `Text` beside the mark when `children` are absent; when `children` ARE present it becomes an
135
- * `sr-only` description instead, so the indicator is never animation-only. Consumer-owned copy —
136
- * the library never invents it, and the plural form of "N people are typing" must come from the
137
- * consumer's `Intl.PluralRules`.
123
+ * `sr-only` description instead, so the indicator is never animation-only.
138
124
  */
139
125
  label?: LabelProp;
140
126
  /**
@@ -145,8 +131,6 @@ export type ActivityProp = Omit<React.HTMLAttributes<HTMLSpanElement>, "color">
145
131
  /**
146
132
  * Announce the label to assistive technology. Default `false` — the DELIBERATE default, because
147
133
  * an ambient indicator that fires a live region on every socket event is a screen-reader flood.
148
- * With `false` NO live region is emitted at all. `"polite"` wraps ONLY the label in a single
149
- * `aria-live="polite" aria-atomic="true"` region; the mark stays outside it and `aria-hidden`.
150
134
  */
151
135
  announce?: ActivityAnnounceProp;
152
136
  className?: ClassNameProp;