banhaten 0.4.0 → 0.5.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 (348) hide show
  1. package/CHANGELOG.md +139 -100
  2. package/CONTRIBUTING.md +46 -44
  3. package/README.md +192 -190
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -0
  7. package/docs/design-system/README.md +22 -20
  8. package/docs/design-system/adoption-quality-remediation.md +87 -87
  9. package/docs/design-system/agent-usage.md +13 -13
  10. package/docs/design-system/appearance-presets.md +189 -189
  11. package/docs/design-system/appearances/default.md +94 -94
  12. package/docs/design-system/appearances/rounded.md +95 -95
  13. package/docs/design-system/appearances/sharp.md +95 -95
  14. package/docs/design-system/component-docs-pattern.md +81 -81
  15. package/docs/design-system/component-implementation-ownership-audit.md +245 -245
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -225
  17. package/docs/design-system/component-showcase-consistency-report.md +219 -219
  18. package/docs/design-system/component-token-consistency-audit.md +173 -173
  19. package/docs/design-system/components/README.md +90 -76
  20. package/docs/design-system/components/accordion.md +53 -53
  21. package/docs/design-system/components/activity-feed.md +94 -94
  22. package/docs/design-system/components/activity-heatmap.md +57 -57
  23. package/docs/design-system/components/agent-input.md +85 -0
  24. package/docs/design-system/components/alert-dialog.md +72 -72
  25. package/docs/design-system/components/alert.md +97 -97
  26. package/docs/design-system/components/approval-card.md +134 -0
  27. package/docs/design-system/components/aspect-ratio.md +45 -45
  28. package/docs/design-system/components/attribute.md +88 -88
  29. package/docs/design-system/components/autocomplete.md +75 -75
  30. package/docs/design-system/components/avatar.md +54 -54
  31. package/docs/design-system/components/badge.md +54 -54
  32. package/docs/design-system/components/banner.md +87 -87
  33. package/docs/design-system/components/breadcrumbs.md +176 -175
  34. package/docs/design-system/components/button-group.md +98 -98
  35. package/docs/design-system/components/button.md +83 -80
  36. package/docs/design-system/components/card.md +88 -88
  37. package/docs/design-system/components/carousel.md +46 -46
  38. package/docs/design-system/components/catalog-components.md +47 -47
  39. package/docs/design-system/components/chart.md +95 -24
  40. package/docs/design-system/components/checkbox.md +54 -54
  41. package/docs/design-system/components/collapsible.md +67 -53
  42. package/docs/design-system/components/command.md +62 -62
  43. package/docs/design-system/components/context-menu.md +46 -46
  44. package/docs/design-system/components/date-picker.md +81 -81
  45. package/docs/design-system/components/divider.md +102 -102
  46. package/docs/design-system/components/empty-state.md +56 -56
  47. package/docs/design-system/components/field.md +70 -70
  48. package/docs/design-system/components/file-upload.md +187 -187
  49. package/docs/design-system/components/hover-card.md +48 -48
  50. package/docs/design-system/components/icons.md +48 -48
  51. package/docs/design-system/components/inline-citations.md +93 -0
  52. package/docs/design-system/components/input-group.md +58 -58
  53. package/docs/design-system/components/input-otp.md +56 -56
  54. package/docs/design-system/components/input.md +114 -60
  55. package/docs/design-system/components/item.md +59 -59
  56. package/docs/design-system/components/kbd.md +51 -49
  57. package/docs/design-system/components/label.md +49 -49
  58. package/docs/design-system/components/menu.md +71 -61
  59. package/docs/design-system/components/menubar.md +47 -47
  60. package/docs/design-system/components/modal.md +105 -105
  61. package/docs/design-system/components/native-select.md +54 -54
  62. package/docs/design-system/components/navigation-menu.md +50 -50
  63. package/docs/design-system/components/onboarding-step-list-item.md +82 -82
  64. package/docs/design-system/components/page-header.md +93 -86
  65. package/docs/design-system/components/pagination.md +57 -57
  66. package/docs/design-system/components/popover.md +60 -60
  67. package/docs/design-system/components/progress-slider.md +50 -50
  68. package/docs/design-system/components/progress.md +76 -76
  69. package/docs/design-system/components/radio-card.md +51 -51
  70. package/docs/design-system/components/radio-group.md +57 -57
  71. package/docs/design-system/components/resizable.md +44 -44
  72. package/docs/design-system/components/rolling-count.md +61 -0
  73. package/docs/design-system/components/scroll-area.md +51 -51
  74. package/docs/design-system/components/segmented-control.md +54 -54
  75. package/docs/design-system/components/select.md +68 -62
  76. package/docs/design-system/components/sheet.md +67 -67
  77. package/docs/design-system/components/shimmer-text.md +67 -0
  78. package/docs/design-system/components/sidebar.md +110 -99
  79. package/docs/design-system/components/skeleton.md +75 -75
  80. package/docs/design-system/components/slideout.md +65 -65
  81. package/docs/design-system/components/slider.md +63 -63
  82. package/docs/design-system/components/social-button.md +50 -50
  83. package/docs/design-system/components/spinner.md +62 -62
  84. package/docs/design-system/components/steps.md +65 -65
  85. package/docs/design-system/components/streaming-text.md +82 -0
  86. package/docs/design-system/components/table.md +419 -414
  87. package/docs/design-system/components/tabs.md +59 -55
  88. package/docs/design-system/components/tag.md +80 -80
  89. package/docs/design-system/components/task-list.md +95 -0
  90. package/docs/design-system/components/textarea.md +50 -50
  91. package/docs/design-system/components/thinking-reasoning.md +72 -0
  92. package/docs/design-system/components/thinking-state.md +67 -0
  93. package/docs/design-system/components/timeline.md +83 -83
  94. package/docs/design-system/components/toast.md +58 -58
  95. package/docs/design-system/components/toggle.md +81 -81
  96. package/docs/design-system/components/toolbar.md +92 -87
  97. package/docs/design-system/components/tooltip.md +94 -92
  98. package/docs/design-system/components/typography.md +18 -18
  99. package/docs/design-system/density-and-elevation.md +65 -65
  100. package/docs/design-system/design-system-test-missing-items.md +368 -368
  101. package/docs/design-system/direction-and-localization.md +23 -23
  102. package/docs/design-system/form-recipes.md +73 -73
  103. package/docs/design-system/gap-promotion-policy.md +21 -21
  104. package/docs/design-system/icons.md +74 -74
  105. package/docs/design-system/installation.md +70 -68
  106. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  107. package/docs/design-system/registry-and-cli.md +64 -64
  108. package/docs/design-system/release-policy.md +30 -30
  109. package/docs/design-system/roadmap.md +14 -14
  110. package/docs/design-system/support-matrix.md +23 -23
  111. package/docs/design-system/tabs.md +54 -53
  112. package/docs/design-system/template-gap-audit.md +32 -0
  113. package/docs/design-system/templates.md +59 -0
  114. package/docs/design-system/token-governance.md +72 -59
  115. package/package.json +98 -98
  116. package/registry/component-contract.json +40 -40
  117. package/registry/components/accordion.tsx +155 -155
  118. package/registry/components/agent-input-parts.tsx +552 -0
  119. package/registry/components/agent-input-state.ts +156 -0
  120. package/registry/components/agent-input.css +307 -0
  121. package/registry/components/agent-input.tsx +382 -0
  122. package/registry/components/alert-dialog.tsx +297 -297
  123. package/registry/components/alert.tsx +293 -293
  124. package/registry/components/approval-card.css +409 -0
  125. package/registry/components/approval-card.tsx +401 -0
  126. package/registry/components/approval-frame.tsx +108 -0
  127. package/registry/components/approval-questions.tsx +559 -0
  128. package/registry/components/aspect-ratio.tsx +30 -30
  129. package/registry/components/attribute.tsx +454 -454
  130. package/registry/components/autocomplete.tsx +598 -651
  131. package/registry/components/avatar.tsx +385 -385
  132. package/registry/components/badge.tsx +629 -629
  133. package/registry/components/button-group.tsx +565 -565
  134. package/registry/components/button.tsx +127 -123
  135. package/registry/components/card.tsx +638 -638
  136. package/registry/components/carousel.tsx +296 -296
  137. package/registry/components/chart-block-data.ts +177 -0
  138. package/registry/components/chart-block.css +171 -0
  139. package/registry/components/chart-block.tsx +260 -0
  140. package/registry/components/chart-interactions.ts +123 -0
  141. package/registry/components/chart-options.cartesian.ts +162 -0
  142. package/registry/components/chart-options.paint.ts +99 -0
  143. package/registry/components/chart-options.parts.ts +72 -0
  144. package/registry/components/chart-options.radial.ts +109 -0
  145. package/registry/components/chart-options.ts +44 -0
  146. package/registry/components/chart-options.types.ts +67 -0
  147. package/registry/components/chart.tsx +203 -203
  148. package/registry/components/checkbox.tsx +247 -247
  149. package/registry/components/collapsible.tsx +109 -69
  150. package/registry/components/command.tsx +208 -208
  151. package/registry/components/context-menu.tsx +236 -236
  152. package/registry/components/data-chart.tsx +40 -0
  153. package/registry/components/date-picker.tsx +1289 -1289
  154. package/registry/components/echart-theme.ts +246 -0
  155. package/registry/components/echart.css +49 -0
  156. package/registry/components/echart.tsx +178 -0
  157. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  158. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  159. package/registry/components/expanded/Banner.tsx +179 -179
  160. package/registry/components/expanded/Breadcrumbs.tsx +131 -131
  161. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  162. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  163. package/registry/components/expanded/EmptyState.tsx +155 -155
  164. package/registry/components/expanded/FileUpload.tsx +543 -543
  165. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -60
  166. package/registry/components/expanded/PageHeader.tsx +179 -166
  167. package/registry/components/expanded/Slideout.tsx +108 -108
  168. package/registry/components/expanded/Steps.tsx +402 -402
  169. package/registry/components/expanded/Table.tsx +1092 -1071
  170. package/registry/components/expanded/Timeline.tsx +203 -203
  171. package/registry/components/expanded/activityFeed.css +248 -248
  172. package/registry/components/expanded/activityHeatmap.css +66 -66
  173. package/registry/components/expanded/banner.css +260 -260
  174. package/registry/components/expanded/breadcrumbs.css +140 -140
  175. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  176. package/registry/components/expanded/divider.css +75 -75
  177. package/registry/components/expanded/emptyState.css +111 -111
  178. package/registry/components/expanded/fileUpload.css +457 -457
  179. package/registry/components/expanded/onboardingStepListItem.css +135 -135
  180. package/registry/components/expanded/pageHeader.css +248 -290
  181. package/registry/components/expanded/slideout.css +276 -276
  182. package/registry/components/expanded/steps.css +356 -356
  183. package/registry/components/expanded/table.css +606 -606
  184. package/registry/components/expanded/timeline.css +286 -286
  185. package/registry/components/field.tsx +283 -283
  186. package/registry/components/hover-card.tsx +48 -48
  187. package/registry/components/inline-citations.css +126 -0
  188. package/registry/components/inline-citations.tsx +292 -0
  189. package/registry/components/input-content.ts +107 -107
  190. package/registry/components/input-group.tsx +130 -130
  191. package/registry/components/input-otp.tsx +584 -584
  192. package/registry/components/input.tsx +990 -979
  193. package/registry/components/item.tsx +189 -189
  194. package/registry/components/kbd.tsx +246 -245
  195. package/registry/components/label.tsx +78 -78
  196. package/registry/components/menu.tsx +978 -986
  197. package/registry/components/menubar.tsx +226 -226
  198. package/registry/components/modal.tsx +872 -872
  199. package/registry/components/native-select.tsx +205 -205
  200. package/registry/components/navigation-menu.tsx +171 -171
  201. package/registry/components/pagination.css +36 -36
  202. package/registry/components/pagination.tsx +560 -560
  203. package/registry/components/popover.tsx +338 -338
  204. package/registry/components/progress-slider.tsx +216 -216
  205. package/registry/components/radio-card.tsx +676 -676
  206. package/registry/components/radio-group.tsx +570 -570
  207. package/registry/components/resizable.tsx +108 -108
  208. package/registry/components/rolling-count.css +37 -0
  209. package/registry/components/rolling-count.tsx +110 -0
  210. package/registry/components/scroll-area.tsx +91 -91
  211. package/registry/components/segmented-control.tsx +87 -87
  212. package/registry/components/select-content.tsx +218 -218
  213. package/registry/components/select.tsx +937 -932
  214. package/registry/components/sheet.tsx +305 -305
  215. package/registry/components/shimmer-text.css +69 -0
  216. package/registry/components/shimmer-text.tsx +43 -0
  217. package/registry/components/sidebar.tsx +1433 -1230
  218. package/registry/components/skeleton.css +54 -54
  219. package/registry/components/skeleton.tsx +482 -482
  220. package/registry/components/slider.tsx +380 -380
  221. package/registry/components/social-button.tsx +387 -387
  222. package/registry/components/spinner.tsx +78 -78
  223. package/registry/components/streaming-text.css +45 -0
  224. package/registry/components/streaming-text.tsx +165 -0
  225. package/registry/components/table-elements.tsx +128 -128
  226. package/registry/components/tabs.css +222 -218
  227. package/registry/components/tabs.tsx +241 -241
  228. package/registry/components/tag.tsx +423 -423
  229. package/registry/components/task-list.css +328 -0
  230. package/registry/components/task-list.tsx +429 -0
  231. package/registry/components/textarea.tsx +610 -610
  232. package/registry/components/thinking-reasoning.css +178 -0
  233. package/registry/components/thinking-reasoning.tsx +253 -0
  234. package/registry/components/thinking-state.css +8 -0
  235. package/registry/components/thinking-state.tsx +46 -0
  236. package/registry/components/toast.tsx +136 -136
  237. package/registry/components/toggle.tsx +256 -256
  238. package/registry/components/toolbar.tsx +539 -539
  239. package/registry/components/tooltip.tsx +433 -431
  240. package/registry/examples/agent-input-demo.tsx +90 -0
  241. package/registry/examples/alert-demo.tsx +34 -34
  242. package/registry/examples/alert-dialog-demo.tsx +42 -42
  243. package/registry/examples/approval-card-demo.tsx +83 -0
  244. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  245. package/registry/examples/attribute-demo.tsx +65 -65
  246. package/registry/examples/autocomplete-demo.tsx +109 -109
  247. package/registry/examples/avatar-demo.tsx +132 -132
  248. package/registry/examples/badge-demo.tsx +69 -69
  249. package/registry/examples/button-demo.tsx +86 -83
  250. package/registry/examples/button-group-demo.tsx +63 -63
  251. package/registry/examples/card-demo.tsx +86 -86
  252. package/registry/examples/carousel-demo.tsx +43 -43
  253. package/registry/examples/chart-block-demo.tsx +5 -0
  254. package/registry/examples/chart-demo.tsx +18 -33
  255. package/registry/examples/checkbox-demo.tsx +62 -62
  256. package/registry/examples/collapsible-demo.tsx +16 -16
  257. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  258. package/registry/examples/command-demo.tsx +42 -42
  259. package/registry/examples/command-palette-demo.tsx +235 -235
  260. package/registry/examples/context-menu-demo.tsx +29 -29
  261. package/registry/examples/control-density-contract-demo.tsx +65 -61
  262. package/registry/examples/date-picker-demo.tsx +127 -127
  263. package/registry/examples/divider-demo.tsx +17 -17
  264. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  265. package/registry/examples/expanded/banner-demo.tsx +48 -48
  266. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  267. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  268. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  269. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  270. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  271. package/registry/examples/expanded/steps-demo.tsx +29 -29
  272. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  273. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  274. package/registry/examples/field-demo.tsx +51 -51
  275. package/registry/examples/hover-card-demo.tsx +23 -23
  276. package/registry/examples/inline-citations-demo.tsx +31 -0
  277. package/registry/examples/input-actions-demo.tsx +36 -0
  278. package/registry/examples/input-demo.tsx +87 -87
  279. package/registry/examples/input-group-demo.tsx +16 -16
  280. package/registry/examples/input-otp-demo.tsx +72 -72
  281. package/registry/examples/item-demo.tsx +46 -46
  282. package/registry/examples/kbd-demo.tsx +12 -12
  283. package/registry/examples/label-demo.tsx +20 -20
  284. package/registry/examples/menu-demo.tsx +122 -122
  285. package/registry/examples/menubar-demo.tsx +34 -34
  286. package/registry/examples/modal-demo.tsx +74 -74
  287. package/registry/examples/native-select-demo.tsx +16 -16
  288. package/registry/examples/navigation-menu-demo.tsx +29 -29
  289. package/registry/examples/pagination-demo.tsx +20 -20
  290. package/registry/examples/popover-demo.tsx +547 -546
  291. package/registry/examples/progress-demo.tsx +37 -37
  292. package/registry/examples/progress-slider-demo.tsx +29 -29
  293. package/registry/examples/radio-card-demo.tsx +51 -51
  294. package/registry/examples/radio-group-demo.tsx +62 -62
  295. package/registry/examples/resizable-demo.tsx +22 -22
  296. package/registry/examples/results-toolbar-demo.tsx +44 -44
  297. package/registry/examples/rolling-count-demo.tsx +39 -0
  298. package/registry/examples/scroll-area-demo.tsx +15 -15
  299. package/registry/examples/segmented-control-demo.tsx +39 -39
  300. package/registry/examples/select-demo.tsx +87 -87
  301. package/registry/examples/sheet-demo.tsx +47 -47
  302. package/registry/examples/shimmer-text-demo.tsx +20 -0
  303. package/registry/examples/sidebar-demo.tsx +101 -101
  304. package/registry/examples/slider-demo.tsx +31 -31
  305. package/registry/examples/social-button-demo.tsx +61 -61
  306. package/registry/examples/spinner-demo.tsx +59 -59
  307. package/registry/examples/streaming-text-demo.tsx +28 -0
  308. package/registry/examples/tabs-demo.tsx +13 -13
  309. package/registry/examples/tag-demo.tsx +29 -29
  310. package/registry/examples/task-list-demo.tsx +74 -0
  311. package/registry/examples/textarea-demo.tsx +79 -79
  312. package/registry/examples/thinking-reasoning-demo.tsx +74 -0
  313. package/registry/examples/thinking-state-demo.tsx +13 -0
  314. package/registry/examples/toast-demo.tsx +35 -35
  315. package/registry/examples/toggle-demo.tsx +59 -59
  316. package/registry/examples/tooltip-demo.tsx +115 -115
  317. package/registry/guidance/USAGE.md +27 -27
  318. package/registry/guidance/charts.LICENSE.txt +24 -0
  319. package/registry/hooks/use-controllable-state.ts +33 -0
  320. package/registry/hooks/use-direction.ts +207 -207
  321. package/registry/hooks/use-listbox-navigation.ts +73 -0
  322. package/registry/hooks/use-motion-end.ts +55 -0
  323. package/registry/hooks/use-reduced-motion.ts +28 -0
  324. package/registry/index.json +1403 -155
  325. package/registry/styles/globals.css +946 -1088
  326. package/registry.json +361 -8
  327. package/schema/config.schema.json +51 -51
  328. package/schema/registry.schema.json +194 -190
  329. package/schema/tokens.schema.json +167 -163
  330. package/src/cli/command-line.js +194 -194
  331. package/src/cli/config-editors.js +9 -9
  332. package/src/cli/doctor.js +399 -399
  333. package/src/cli/file-transaction.js +302 -295
  334. package/src/cli/global-css.js +153 -153
  335. package/src/cli/index.js +1002 -1009
  336. package/src/cli/install-plan.js +592 -592
  337. package/src/cli/install-receipt.js +171 -171
  338. package/src/cli/jsonc.js +203 -203
  339. package/src/cli/package-install-state.js +254 -254
  340. package/src/cli/package-manager.js +238 -238
  341. package/src/cli/package-plan.js +185 -185
  342. package/src/cli/package-version.js +97 -97
  343. package/src/cli/registry-query.js +207 -207
  344. package/src/cli/reporting.js +55 -55
  345. package/src/cli/schema-validation.js +19 -19
  346. package/src/cli/source-scanner.js +686 -686
  347. package/src/cli/vite-config.js +478 -478
  348. package/tokens/banhaten.tokens.json +306 -192
@@ -1,55 +1,55 @@
1
- # Accordion
2
-
3
- Accordion is the disclosure primitive for grouped details, settings, FAQs, and compact content sections. It is backed by Radix Accordion and supports single or multiple expansion, size variants, visual treatments, animation, and RTL-safe copy.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Accordion type="single" collapsible>
9
- <AccordionItem value="billing">
10
- <AccordionTrigger>Billing</AccordionTrigger>
11
- <AccordionContent>Invoice and payment details.</AccordionContent>
12
- </AccordionItem>
13
- </Accordion>
14
- ```
15
-
16
- | Prop | Values | Default |
17
- | --- | --- | --- |
18
- | `variant` | `default`, `bordered`, `cards`, `soft` | `default` |
19
- | `size` | `sm`, `default`, `lg` | `default` |
20
- | `type` | Radix `single`, `multiple` | required |
21
- | `collapsible` | `boolean` | Radix default |
22
-
23
- ## Token Contract
24
-
25
- Accordion uses Banhaten spacing, border, radius, content, interactive, typography, and animation tokens. Avoid raw colors or pixel values in local variants.
26
-
27
- ## RTL
28
-
29
- Accordion inherits direction from its parent. Triggers and content use logical spacing and `text-start`; text labels use `dir="auto"` where the component renders string copy.
30
-
31
- ## Accessibility
32
-
33
- Radix provides button semantics, `aria-expanded`, roving state, and keyboard behavior. Keep trigger content concise and do not put nested interactive controls inside `AccordionTrigger`.
34
-
35
- ## Install
36
-
37
- ```bash
38
- npx banhaten add accordion
39
- ```
40
-
41
- ## Examples
42
-
43
- Primary registry example: `examples/accordion-demo.tsx`.
44
-
45
- Open the live component page or run `npx banhaten docs accordion` to inspect source files, install command, and examples.
46
-
47
- ## RTL Rules
48
-
49
- - `inheritsDirection`: true
50
- - `textAlignment`: Uses text-start and dir="auto" so Arabic and English copy align and punctuate naturally.
51
- - `spacing`: Uses gap and logical inherited direction rather than physical left/right spacing.
52
-
1
+ # Accordion
2
+
3
+ Accordion is the disclosure primitive for grouped details, settings, FAQs, and compact content sections. It is backed by Radix Accordion and supports single or multiple expansion, size variants, visual treatments, animation, and RTL-safe copy.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Accordion type="single" collapsible>
9
+ <AccordionItem value="billing">
10
+ <AccordionTrigger>Billing</AccordionTrigger>
11
+ <AccordionContent>Invoice and payment details.</AccordionContent>
12
+ </AccordionItem>
13
+ </Accordion>
14
+ ```
15
+
16
+ | Prop | Values | Default |
17
+ | --- | --- | --- |
18
+ | `variant` | `default`, `bordered`, `cards`, `soft` | `default` |
19
+ | `size` | `sm`, `default`, `lg` | `default` |
20
+ | `type` | Radix `single`, `multiple` | required |
21
+ | `collapsible` | `boolean` | Radix default |
22
+
23
+ ## Token Contract
24
+
25
+ Accordion uses Banhaten spacing, border, radius, content, interactive, typography, and animation tokens. Avoid raw colors or pixel values in local variants.
26
+
27
+ ## RTL
28
+
29
+ Accordion inherits direction from its parent. Triggers and content use logical spacing and `text-start`; text labels use `dir="auto"` where the component renders string copy.
30
+
31
+ ## Accessibility
32
+
33
+ Radix provides button semantics, `aria-expanded`, roving state, and keyboard behavior. Keep trigger content concise and do not put nested interactive controls inside `AccordionTrigger`.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ npx banhaten add accordion
39
+ ```
40
+
41
+ ## Examples
42
+
43
+ Primary registry example: `examples/accordion-demo.tsx`.
44
+
45
+ Open the live component page or run `npx banhaten docs accordion` to inspect source files, install command, and examples.
46
+
47
+ ## RTL Rules
48
+
49
+ - `inheritsDirection`: true
50
+ - `textAlignment`: Uses text-start and dir="auto" so Arabic and English copy align and punctuate naturally.
51
+ - `spacing`: Uses gap and logical inherited direction rather than physical left/right spacing.
52
+
53
53
  <!-- registry-contract:start -->
54
54
  ## Registry Contract
55
55
 
@@ -62,6 +62,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
62
62
  | `parts` | `Accordion`, `AccordionItem`, `AccordionTrigger`, `AccordionContent` |
63
63
  | `registryDependencies` | None |
64
64
  | `sizes` | `sm`, `default`, `lg` |
65
- | `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-accordion`, `--bh-duration-default`, `--bh-easing-out`, `--bh-opacity-50`, `--bh-radius-md-6`, `--bh-radius-xs-2`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-line-height`, `--shadow-accordion-item`, `--shadow-button-focus` |
65
+ | `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-accordion`, `--bh-duration-default`, `--bh-easing-out`, `--bh-opacity-50`, `--bh-radius-md-6`, `--bh-radius-xs-2`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-line-height`, `--elevation-accordion-item`, `--elevation-button-focus` |
66
66
  | `variants` | `default`, `bordered`, `cards`, `soft` |
67
67
  <!-- registry-contract:end -->
@@ -1,96 +1,96 @@
1
- # Activity Feed
2
-
3
- `ActivityFeed` renders a vertical timeline of activity items with avatars, status dots, captions or slot content, timestamps, and action buttons.
4
-
5
- Figma reference: `Design system 3.0 Copy / ActivityFeed`, component set node `587:19445`.
6
-
7
- ## Variants
8
-
9
- The Figma component defines these top-level variants:
10
-
11
- | Direction | Node |
12
- | --- | --- |
13
- | LTR | `587:19381` |
14
- | RTL | `587:19711` |
15
-
16
- `ActivityFeedItem` also supports `caption` and `slot` item types through the `type` prop.
17
-
18
- ## API
19
-
20
- ```tsx
21
- <ActivityFeed
22
- dir="ltr"
23
- items={[
24
- {
25
- label: "Label",
26
- supportText: "Support Text",
27
- link: "#Link",
28
- caption: "Caption text",
29
- timestamp: "Mar 15. 2050",
30
- type: "caption",
31
- },
32
- ]}
33
- />
34
- ```
35
-
36
- | Prop | Values | Default |
37
- | --- | --- | --- |
38
- | `dir` | `ltr`, `rtl` | `ltr` |
39
- | `items` | `ActivityFeedItemProps[]` | ten caption items |
40
- | `avatarSrc` | `string` | local Figma avatar asset |
41
- | `type` | `caption`, `slot` | `caption` |
42
- | `hasStatus` | `boolean` | `true` |
43
- | `hasActionButtons` | `boolean` | `true` |
44
- | `hasTwoActionButtons` | `boolean` | `true` |
45
- | `showLine` | `boolean` | `true` |
46
- | `showPaddingBottom` | `boolean` | `true` |
47
-
48
- ## Token Contract
49
-
50
- The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
51
-
52
- - Backgrounds: `--bh-bg-raised`, `--bh-bg-success-default`
53
- - Borders: `--bh-border-default`, `--bh-border-subtle`
54
- - Content: `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`
55
- - Interactive: `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`
56
- - Shape: `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-control-default`
57
- - Space: `--bh-space-xxs-2`, `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`
58
-
59
- ## Pixel Rules
60
-
61
- - Feed width is `600px`.
62
- - Items use a `12px` gap between the indicator rail and content.
63
- - Avatar is `32px` square with a full radius and subtle border.
64
- - The status dot renders in a `16px` box with a `6px` success fill.
65
- - Body text is Inter `15px / 24px`; timestamps are `14px / 20px`.
66
- - Captions use `12px` padding, subtle border, white raised fill, and `4px` radius.
67
- - Slot content is `76px` high with purple dashed border and subtle purple fill.
68
- - Actions use `8px` top padding, `8px` button gap, and `36px` tall buttons.
69
- - The repeated-item default uses a `22px` decorative bottom spacer so ten items fit the `2000px` Figma feed frame.
70
- - RTL mirrors the avatar rail to the right and right-aligns text content.
71
-
72
- ## Accessibility
73
-
74
- - The feed uses a labelled `section`; provide `ariaLabel` when the surrounding context is not explicit.
75
- - Status dots and connector lines are decorative. Use item copy or parent-level announcements for meaningful state.
76
- - Action buttons are real `button` or `a` elements and support `ariaLabel`, `disabled`, `href`, and `onClick`.
77
-
78
- ## Install
79
-
80
- ```bash
81
- npx banhaten add activity-feed
82
- ```
83
-
84
- ## Examples
85
-
86
- Primary registry example: `examples/expanded/activity-feed-demo.tsx`.
87
-
88
- Open the live component page or run `npx banhaten docs activity-feed` to inspect source files, install command, and examples.
89
-
90
- ## RTL Rules
91
-
92
- This component has no special RTL contract beyond inherited document direction and logical spacing.
93
-
1
+ # Activity Feed
2
+
3
+ `ActivityFeed` renders a vertical timeline of activity items with avatars, status dots, captions or slot content, timestamps, and action buttons.
4
+
5
+ Figma reference: `Design system 3.0 Copy / ActivityFeed`, component set node `587:19445`.
6
+
7
+ ## Variants
8
+
9
+ The Figma component defines these top-level variants:
10
+
11
+ | Direction | Node |
12
+ | --- | --- |
13
+ | LTR | `587:19381` |
14
+ | RTL | `587:19711` |
15
+
16
+ `ActivityFeedItem` also supports `caption` and `slot` item types through the `type` prop.
17
+
18
+ ## API
19
+
20
+ ```tsx
21
+ <ActivityFeed
22
+ dir="ltr"
23
+ items={[
24
+ {
25
+ label: "Label",
26
+ supportText: "Support Text",
27
+ link: "#Link",
28
+ caption: "Caption text",
29
+ timestamp: "Mar 15. 2050",
30
+ type: "caption",
31
+ },
32
+ ]}
33
+ />
34
+ ```
35
+
36
+ | Prop | Values | Default |
37
+ | --- | --- | --- |
38
+ | `dir` | `ltr`, `rtl` | `ltr` |
39
+ | `items` | `ActivityFeedItemProps[]` | ten caption items |
40
+ | `avatarSrc` | `string` | local Figma avatar asset |
41
+ | `type` | `caption`, `slot` | `caption` |
42
+ | `hasStatus` | `boolean` | `true` |
43
+ | `hasActionButtons` | `boolean` | `true` |
44
+ | `hasTwoActionButtons` | `boolean` | `true` |
45
+ | `showLine` | `boolean` | `true` |
46
+ | `showPaddingBottom` | `boolean` | `true` |
47
+
48
+ ## Token Contract
49
+
50
+ The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
51
+
52
+ - Backgrounds: `--bh-bg-raised`, `--bh-bg-success-default`
53
+ - Borders: `--bh-border-default`, `--bh-border-subtle`
54
+ - Content: `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`
55
+ - Interactive: `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`
56
+ - Shape: `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-control-default`
57
+ - Space: `--bh-space-xxs-2`, `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`
58
+
59
+ ## Pixel Rules
60
+
61
+ - Feed width is `600px`.
62
+ - Items use a `12px` gap between the indicator rail and content.
63
+ - Avatar is `32px` square with a full radius and subtle border.
64
+ - The status dot renders in a `16px` box with a `6px` success fill.
65
+ - Body text is Inter `15px / 24px`; timestamps are `14px / 20px`.
66
+ - Captions use `12px` padding, subtle border, white raised fill, and `4px` radius.
67
+ - Slot content is `76px` high with purple dashed border and subtle purple fill.
68
+ - Actions use `8px` top padding, `8px` button gap, and `36px` tall buttons.
69
+ - The repeated-item default uses a `22px` decorative bottom spacer so ten items fit the `2000px` Figma feed frame.
70
+ - RTL mirrors the avatar rail to the right and right-aligns text content.
71
+
72
+ ## Accessibility
73
+
74
+ - The feed uses a labelled `section`; provide `ariaLabel` when the surrounding context is not explicit.
75
+ - Status dots and connector lines are decorative. Use item copy or parent-level announcements for meaningful state.
76
+ - Action buttons are real `button` or `a` elements and support `ariaLabel`, `disabled`, `href`, and `onClick`.
77
+
78
+ ## Install
79
+
80
+ ```bash
81
+ npx banhaten add activity-feed
82
+ ```
83
+
84
+ ## Examples
85
+
86
+ Primary registry example: `examples/expanded/activity-feed-demo.tsx`.
87
+
88
+ Open the live component page or run `npx banhaten docs activity-feed` to inspect source files, install command, and examples.
89
+
90
+ ## RTL Rules
91
+
92
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
93
+
94
94
  <!-- registry-contract:start -->
95
95
  ## Registry Contract
96
96
 
@@ -103,6 +103,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
103
103
  | `parts` | `ActivityFeed`, `ActivityFeedItem` |
104
104
  | `registryDependencies` | `button` |
105
105
  | `states` | `default`, `with-status`, `with-link`, `with-actions` |
106
- | `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-regular-font-size`, `--shadow-button-raised`, `--shadow-component-default` |
106
+ | `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-regular-font-size`, `--elevation-button-raised`, `--elevation-component-default` |
107
107
  | `variants` | `caption`, `slot` |
108
108
  <!-- registry-contract:end -->
@@ -1,59 +1,59 @@
1
- # Activity Heatmap
2
-
3
- `ActivityHeatmap` visualizes activity as seven-day week columns with five intensity levels. It is domain-neutral: contribution totals, period controls, headings, and product-specific copy belong to the surrounding composition.
4
-
5
- ## API
6
-
7
- ```tsx
8
- import {
9
- ActivityHeatmap,
10
- type ActivityHeatmapItem,
11
- } from "@/components/ui/expanded/ActivityHeatmap"
12
-
13
- const items: ActivityHeatmapItem[] = activity.map((level, index) => ({
14
- id: String(index),
15
- label: `Day ${index + 1}, activity level ${level} of 4`,
16
- level,
17
- }))
18
-
19
- <ActivityHeatmap
20
- ariaLabel="Weekly activity over the last 39 weeks"
21
- items={items}
22
- />
23
- ```
24
-
25
- Items are supplied in column-major order: the first seven values make the first week, the next seven make the second week, and so on. `level` accepts `0`, `1`, `2`, `3`, or `4`.
26
-
27
- ## Token Contract
28
-
29
- The component introduces no new design tokens and contains no raw visual values. Its complete visual contract is composed from existing Banhaten tokens:
30
-
31
- - Cell size: `--bh-space-3xl-16`
32
- - Gap: `--bh-space-xs-4`
33
- - Radius: `--bh-radius-sm-4`
34
- - Empty level: `--bh-bg-neutral-medium`
35
- - Activity levels: `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-default`, `--bh-content-accent-purple-strong`
36
-
37
- ## RTL Rules
38
-
39
- Set `dir="rtl"` or inherit an RTL direction boundary to place the first supplied week at the logical start edge. Item order is never mutated in JavaScript.
40
-
41
- ## Accessibility
42
-
43
- The heatmap exposes one image-style accessible summary through `ariaLabel`, avoiding hundreds of repetitive focus stops. Give each item a concise `label` to provide a native pointer tooltip. If users must inspect or act on individual days, pair the heatmap with an accessible table or list rather than turning every cell into a button.
44
-
45
- ## Install
46
-
47
- ```bash
48
- npx banhaten add activity-heatmap
49
- ```
50
-
51
- ## Examples
52
-
53
- Primary registry example: `examples/expanded/activity-heatmap-demo.tsx`.
54
-
55
- Open the live component page or run `npx banhaten docs activity-heatmap` to inspect source files, installation, and examples.
56
-
1
+ # Activity Heatmap
2
+
3
+ `ActivityHeatmap` visualizes activity as seven-day week columns with five intensity levels. It is domain-neutral: contribution totals, period controls, headings, and product-specific copy belong to the surrounding composition.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ import {
9
+ ActivityHeatmap,
10
+ type ActivityHeatmapItem,
11
+ } from "@/components/ui/expanded/ActivityHeatmap"
12
+
13
+ const items: ActivityHeatmapItem[] = activity.map((level, index) => ({
14
+ id: String(index),
15
+ label: `Day ${index + 1}, activity level ${level} of 4`,
16
+ level,
17
+ }))
18
+
19
+ <ActivityHeatmap
20
+ ariaLabel="Weekly activity over the last 39 weeks"
21
+ items={items}
22
+ />
23
+ ```
24
+
25
+ Items are supplied in column-major order: the first seven values make the first week, the next seven make the second week, and so on. `level` accepts `0`, `1`, `2`, `3`, or `4`.
26
+
27
+ ## Token Contract
28
+
29
+ The component introduces no new design tokens and contains no raw visual values. Its complete visual contract is composed from existing Banhaten tokens:
30
+
31
+ - Cell size: `--bh-space-3xl-16`
32
+ - Gap: `--bh-space-xs-4`
33
+ - Radius: `--bh-radius-sm-4`
34
+ - Empty level: `--bh-bg-neutral-medium`
35
+ - Activity levels: `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-default`, `--bh-content-accent-purple-strong`
36
+
37
+ ## RTL Rules
38
+
39
+ Set `dir="rtl"` or inherit an RTL direction boundary to place the first supplied week at the logical start edge. Item order is never mutated in JavaScript.
40
+
41
+ ## Accessibility
42
+
43
+ The heatmap exposes one image-style accessible summary through `ariaLabel`, avoiding hundreds of repetitive focus stops. Give each item a concise `label` to provide a native pointer tooltip. If users must inspect or act on individual days, pair the heatmap with an accessible table or list rather than turning every cell into a button.
44
+
45
+ ## Install
46
+
47
+ ```bash
48
+ npx banhaten add activity-heatmap
49
+ ```
50
+
51
+ ## Examples
52
+
53
+ Primary registry example: `examples/expanded/activity-heatmap-demo.tsx`.
54
+
55
+ Open the live component page or run `npx banhaten docs activity-heatmap` to inspect source files, installation, and examples.
56
+
57
57
  <!-- registry-contract:start -->
58
58
  ## Registry Contract
59
59
 
@@ -69,5 +69,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
69
69
  | `props.dir` | `ltr \| rtl; default "inherited"; Places the first activity column at the logical start edge.` |
70
70
  | `props.items` | `readonly ActivityHeatmapItem[]; default "[]"; Column-major cells grouped into seven-day weeks, each with a level from zero through four.` |
71
71
  | `states` | `level-0`, `level-1`, `level-2`, `level-3`, `level-4` |
72
- | `tokens` | `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-subtle`, `--bh-bg-neutral-medium`, `--bh-content-accent-purple-strong`, `--bh-content-default`, `--bh-font-family`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-xs-4`, `--shadow-component-focus-ring` |
72
+ | `tokens` | `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-subtle`, `--bh-bg-neutral-medium`, `--bh-content-accent-purple-strong`, `--bh-content-default`, `--bh-font-family`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-xs-4`, `--elevation-component-focus-ring` |
73
73
  <!-- registry-contract:end -->
@@ -0,0 +1,85 @@
1
+ # Agent Input
2
+
3
+ `AgentInput` is the prompt composer for agent conversations. One frame holds an auto-growing editor, skill and attachment chips, an add menu for photos, files, skills, and models, a slash-command skill palette, an optional Enhance Prompt action with a sweeping accent ring, and the send button.
4
+
5
+ It composes Button, Menu, Tag, Spinner, and Shimmer Text rather than restyling them, so density, focus, and RTL behavior match the rest of the system.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ import { AgentInput } from "@/components/ui/agent-input"
11
+
12
+ <AgentInput
13
+ models={models}
14
+ onEnhance={enhancePrompt}
15
+ onSend={({ text, attachments, skills, model }) =>
16
+ submit({ files: attachments.map((attachment) => attachment.file), model, skills, text })
17
+ }
18
+ skills={skills}
19
+ />
20
+ ```
21
+
22
+ | Prop | Type | Default | Description |
23
+ | --- | --- | --- | --- |
24
+ | `value` / `defaultValue` / `onValueChange` | `string` | `""` | Prompt text. |
25
+ | `onSend` | `(payload: AgentInputPayload) => void` | – | Receives `text`, `attachments`, selected `skills`, and the `model`. Enter sends; Shift+Enter inserts a line break; an Enter that confirms an IME composition never sends. |
26
+ | `onEnhance` | `(prompt, signal) => Promise<string>` | – | Enables Enhance Prompt. Resolve with the rewritten prompt; if it rejects, the original prompt returns. The signal aborts when the field unmounts, and a late result is ignored. |
27
+ | `models` | `readonly AgentInputModel[]` | `[]` | Selectable models with `name`, optional `description`, `meta`, and `icon`. |
28
+ | `model` / `defaultModel` / `onModelChange` | `string` | first model | Selected model id. |
29
+ | `skills` | `readonly AgentInputSkill[]` | `[]` | Skills available from the add menu and by typing `/`. |
30
+ | `selectedSkills` / `defaultSelectedSkills` / `onSelectedSkillsChange` | `readonly string[]` | `[]` | Selected skill ids, shown as chips. |
31
+ | `attachments` / `onAttachmentsChange` | `readonly AgentInputAttachment[]` | internal | Attachment chips `{ id, kind, name, file? }`; omit to let the field own picked files. A picked file's kind follows its MIME type; the picker it came from decides only for files without one. |
32
+ | `disabled` | `boolean` | `false` | Disables editing and actions. |
33
+ | `labels` | `Partial<AgentInputLabels>` | English | Placeholder, menu, action, and remove copy. |
34
+
35
+ Keyboard: `/` opens the skill palette, arrow keys move, Enter or Tab inserts, Escape closes.
36
+
37
+ Files picked through the add menu keep their `File` on `attachment.file`, so you can upload them as soon as they arrive in `onAttachmentsChange` or when `onSend` fires. Attachments you pass in yourself, such as ones restored from a saved draft, can leave `file` out.
38
+
39
+ ## Install
40
+
41
+ ```bash
42
+ npx banhaten add agent-input
43
+ ```
44
+
45
+ ## Examples
46
+
47
+ Primary registry example: `examples/agent-input-demo.tsx`.
48
+
49
+ ## Token Contract
50
+
51
+ The frame uses `--bh-bg-raised`, `--bh-radius-2xl-12`, and `--elevation-02`. The editor uses the `body-sm-regular` scale, `--bh-content-muted` placeholders, and caps at `--bh-agent-input-field-max-height`. The palette reuses Menu tokens (`--bh-menu-bg`, `--bh-menu-radius`, `--bh-menu-item-radius`, `--bh-menu-item-hover-bg`, `--elevation-menu`) at `--bh-agent-input-palette-width`. The enhancing ring is `--bh-agent-input-ring-width` wide and cycles the blue, purple, fuchsia, and aqua accent content tokens on `--bh-agent-input-ring-duration`. Chips, the enhance pill, and the palette move on the shared `--bh-duration-*` and `--bh-easing-emphasized` foundation tokens, and removed chips and the pill unmount when their exit animation ends.
52
+
53
+ Covered source files: `components/agent-input.tsx`, the internal `components/agent-input-parts.tsx` and `components/agent-input-state.ts`, `components/agent-input.css`, and the `button`, `menu`, `shimmer-text`, `spinner`, and `tag` registry dependencies.
54
+
55
+ ## RTL Rules
56
+
57
+ - The editor, chips, palette, and action row inherit direction and use logical spacing.
58
+ - The add menu and slash palette open toward the logical start; Menu resolves keyboard direction through its own boundary.
59
+
60
+ ## Accessibility
61
+
62
+ The editor is a native textarea labelled by the placeholder. Typing / opens a listbox of skills that the field drives through `aria-activedescendant`, `aria-controls`, `aria-autocomplete`, and `aria-haspopup`; arrow keys move the active option with wrapping and Enter or Tab inserts it. The palette shares its keyboard model with Autocomplete through the `use-listbox-navigation` hook. Chips expose remove buttons named after their item, the add menu is a Radix menu with roving focus, and a status region that stays mounted announces the `enhancing` label when a request starts. Animations collapse to instant changes under `prefers-reduced-motion`.
63
+
64
+ <!-- registry-contract:start -->
65
+ ## Registry Contract
66
+
67
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
68
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
69
+
70
+ | Field | Values |
71
+ | --- | --- |
72
+ | `supportedExports` | `components/agent-input.tsx: AgentInput` |
73
+ | `parts` | `AgentInput` |
74
+ | `registryDependencies` | `button`, `menu`, `shimmer-text`, `spinner`, `tag` |
75
+ | `props.value` | `string; default null; Controlled prompt text; use defaultValue for uncontrolled usage.` |
76
+ | `props.onSend` | `(payload: AgentInputPayload) => void; default null; Receives text, attachments, skills, and the selected model; picked attachments carry their File for upload.` |
77
+ | `props.onEnhance` | `(prompt: string, signal: AbortSignal) => Promise<string>; default null; Enables the Enhance Prompt action; resolves to the rewritten prompt.` |
78
+ | `props.models` | `readonly AgentInputModel[]; default "[]"; Selectable models with name, description, meta, and icon.` |
79
+ | `props.skills` | `readonly AgentInputSkill[]; default "[]"; Skills available from the add menu and the slash palette.` |
80
+ | `props.attachments` | `readonly AgentInputAttachment[]; default null; Controlled attachment chips; omit to let the field own picked files.` |
81
+ | `props.onAttachmentsChange` | `(attachments: AgentInputAttachment[]) => void; default null; Called when chips are added or removed; picked files arrive with their File, so uploads can start right away.` |
82
+ | `props.labels` | `Partial<AgentInputLabels>; default "English"; Localized placeholder, menu, action, and remove copy.` |
83
+ | `states` | `idle`, `enhancing`, `enhanced` |
84
+ | `tokens` | `--bh-agent-input-field-max-height`, `--bh-agent-input-palette-width`, `--bh-agent-input-ring-duration`, `--bh-agent-input-ring-width`, `--bh-bg-raised`, `--bh-button-xs-height`, `--bh-content-accent-aqua-default`, `--bh-content-accent-blue-default`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-purple-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-default`, `--bh-duration-moderate`, `--bh-easing-emphasized`, `--bh-font-family`, `--bh-menu-bg`, `--bh-menu-item-hover-bg`, `--bh-menu-item-radius`, `--bh-menu-radius`, `--bh-opacity-0`, `--bh-opacity-100`, `--bh-radius-2xl-12`, `--bh-space-2xl-14`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-z-popover`, `--elevation-02`, `--elevation-menu` |
85
+ <!-- registry-contract:end -->