banhaten 0.3.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 -73
  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 -244
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
  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 +98 -98
  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 +89 -89
  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 +177 -176
  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 -79
  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 +117 -61
  55. package/docs/design-system/components/item.md +59 -57
  56. package/docs/design-system/components/kbd.md +54 -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 +127 -76
  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 -61
  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 -69
  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 -60
  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 -448
  130. package/registry/components/autocomplete.tsx +598 -651
  131. package/registry/components/avatar.tsx +385 -381
  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 -1277
  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 -59
  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 -255
  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 -126
  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 -603
  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 -972
  193. package/registry/components/item.tsx +189 -189
  194. package/registry/components/kbd.tsx +246 -151
  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 -555
  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 -677
  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 -358
  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 -236
  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 -11
  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 -57
  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 +1634 -184
  325. package/registry/styles/globals.css +1462 -1570
  326. package/registry.json +364 -10
  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 +458 -224
@@ -1,91 +1,91 @@
1
- # Attribute
2
-
3
- Attribute is a semantic description-list component for key-value information. It supports card headers, inline rows, right-aligned values, stacked mobile rows, two-column summaries, row dividers, bordered row groups, compact density, and RTL direction.
4
-
5
- The implementation follows the Figma component at `Design system 3.0 Copy / Attribute Card` (`255:123238`) and uses only existing Banhaten tokens.
6
-
7
- ## API
8
-
9
- Use `AttributeCard` for the surface, `AttributeHeader` for optional title and description content, `AttributeList` for the `dl`, and `AttributeItem` for each `dt`/`dd` pair.
10
-
11
- ```tsx
12
- <AttributeCard>
13
- <AttributeHeader
14
- title="Company profile"
15
- description="Key-value information in a scannable card."
16
- />
17
- <AttributeList>
18
- <AttributeItem label="Name">Acme Corporation</AttributeItem>
19
- <AttributeItem label="Type">Business</AttributeItem>
20
- <AttributeItem label="Industry">Software</AttributeItem>
21
- </AttributeList>
22
- </AttributeCard>
23
- ```
24
-
25
- ## Variants
26
-
27
- | Prop | Values |
28
- | --- | --- |
29
- | `AttributeCard padding` | `default`, `compact` |
30
- | `AttributeList layout` | `inline`, `end`, `stacked`, `two-column` |
31
- | `AttributeList density` | `compact`, `default`, `comfortable` |
32
- | `AttributeList dividers` | `boolean` |
33
- | `AttributeList bordered` | `boolean` |
34
- | `AttributeList labelWidth` | CSS length, default `220px` |
35
- | `AttributeItem fullSpan` | `boolean`, useful in `two-column` layouts |
36
- | `AttributeItem truncate` | `boolean` |
37
-
38
- ## Composition
39
-
40
- Values are open React slots. Compose existing primitives for status badges, copy buttons, file rows, progress bars, skeleton bars, links, and custom details.
41
-
42
- ```tsx
43
- <AttributeList layout="end" dividers>
44
- <AttributeItem label="Subscription">
45
- <Badge color="green" type="dot">Active</Badge>
46
- </AttributeItem>
47
- <AttributeItem label="API key" truncate>
48
- sk_live_************1234
49
- <Button aria-label="Copy API key" size="icon-xs" variant="outline">
50
- <CopyIcon />
51
- </Button>
52
- </AttributeItem>
53
- </AttributeList>
54
- ```
55
-
56
- ## RTL
57
-
58
- Attribute inherits direction from any parent. The component uses logical text alignment and `dir="auto"` wrappers for string labels and values, so Arabic and English content can sit in the same card without manual left/right classes.
59
-
60
- ## Install
61
-
62
- ```bash
63
- npx banhaten add attribute
64
- ```
65
-
66
- ## Examples
67
-
68
- Primary registry example: `examples/attribute-demo.tsx`.
69
-
70
- Open the live component page or run `npx banhaten docs attribute` to inspect source files, install command, and examples.
71
-
72
- ## Token Contract
73
-
74
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
75
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
76
- Covered source files: `components/attribute.tsx`.
77
-
78
- ## RTL Rules
79
-
80
- - `inheritsDirection`: true
81
- - `layout`: Uses logical text alignment and inherited direction so label and value columns mirror naturally.
82
- - `textDirection`: String labels and values use dir="auto" wrappers while custom slots can control their own direction.
83
- - `composition`: Rows accept ReactNode values, so badges, buttons, links, progress bars, skeletons, files, and custom content can be composed from existing Banhaten primitives.
84
-
85
- ## Accessibility
86
-
87
- Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
88
-
1
+ # Attribute
2
+
3
+ Attribute is a semantic description-list component for key-value information. It supports card headers, inline rows, right-aligned values, stacked mobile rows, two-column summaries, row dividers, bordered row groups, compact density, and RTL direction.
4
+
5
+ The implementation follows the Figma component at `Design system 3.0 Copy / Attribute Card` (`255:123238`) and uses only existing Banhaten tokens.
6
+
7
+ ## API
8
+
9
+ Use `AttributeCard` for the surface, `AttributeHeader` for optional title and description content, `AttributeList` for the `dl`, and `AttributeItem` for each `dt`/`dd` pair.
10
+
11
+ ```tsx
12
+ <AttributeCard>
13
+ <AttributeHeader
14
+ title="Company profile"
15
+ description="Key-value information in a scannable card."
16
+ />
17
+ <AttributeList>
18
+ <AttributeItem label="Name">Acme Corporation</AttributeItem>
19
+ <AttributeItem label="Type">Business</AttributeItem>
20
+ <AttributeItem label="Industry">Software</AttributeItem>
21
+ </AttributeList>
22
+ </AttributeCard>
23
+ ```
24
+
25
+ ## Variants
26
+
27
+ | Prop | Values |
28
+ | --- | --- |
29
+ | `AttributeCard padding` | `default`, `compact` |
30
+ | `AttributeList layout` | `inline`, `end`, `stacked`, `two-column` |
31
+ | `AttributeList density` | `compact`, `default`, `comfortable` |
32
+ | `AttributeList dividers` | `boolean` |
33
+ | `AttributeList bordered` | `boolean` |
34
+ | `AttributeList labelWidth` | CSS length, default `220px` |
35
+ | `AttributeItem fullSpan` | `boolean`, useful in `two-column` layouts |
36
+ | `AttributeItem truncate` | `boolean` |
37
+
38
+ ## Composition
39
+
40
+ Values are open React slots. Compose existing primitives for status badges, copy buttons, file rows, progress bars, skeleton bars, links, and custom details.
41
+
42
+ ```tsx
43
+ <AttributeList layout="end" dividers>
44
+ <AttributeItem label="Subscription">
45
+ <Badge color="green" type="dot">Active</Badge>
46
+ </AttributeItem>
47
+ <AttributeItem label="API key" truncate>
48
+ sk_live_************1234
49
+ <Button aria-label="Copy API key" size="icon-xs" variant="outline">
50
+ <CopyIcon />
51
+ </Button>
52
+ </AttributeItem>
53
+ </AttributeList>
54
+ ```
55
+
56
+ ## RTL
57
+
58
+ Attribute inherits direction from any parent. The component uses logical text alignment and `dir="auto"` wrappers for string labels and values, so Arabic and English content can sit in the same card without manual left/right classes.
59
+
60
+ ## Install
61
+
62
+ ```bash
63
+ npx banhaten add attribute
64
+ ```
65
+
66
+ ## Examples
67
+
68
+ Primary registry example: `examples/attribute-demo.tsx`.
69
+
70
+ Open the live component page or run `npx banhaten docs attribute` to inspect source files, install command, and examples.
71
+
72
+ ## Token Contract
73
+
74
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
75
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
76
+ Covered source files: `components/attribute.tsx`.
77
+
78
+ ## RTL Rules
79
+
80
+ - `inheritsDirection`: true
81
+ - `layout`: Uses logical text alignment and inherited direction so label and value columns mirror naturally.
82
+ - `textDirection`: String labels and values use dir="auto" wrappers while custom slots can control their own direction.
83
+ - `composition`: Rows accept ReactNode values, so badges, buttons, links, progress bars, skeletons, files, and custom content can be composed from existing Banhaten primitives.
84
+
85
+ ## Accessibility
86
+
87
+ Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
88
+
89
89
  <!-- registry-contract:start -->
90
90
  ## Registry Contract
91
91
 
@@ -99,5 +99,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
99
99
  | `registryDependencies` | None |
100
100
  | `densities` | `compact`, `default`, `comfortable` |
101
101
  | `layouts` | `inline`, `end`, `stacked`, `two-column` |
102
- | `tokens` | `--bh-attribute-header-icon-size`, `--bh-attribute-header-icon-size-lg`, `--bh-attribute-label-width`, `--bh-bg-default`, `--bh-bg-neutral-soft`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-subtle`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-medium-font-size`, `--bh-text-heading-sm-medium-font-weight`, `--bh-text-heading-sm-medium-letter-spacing`, `--bh-text-heading-sm-medium-line-height` |
102
+ | `tokens` | `--bh-attribute-header-icon-size`, `--bh-attribute-header-icon-size-lg`, `--bh-attribute-label-width`, `--bh-bg-default`, `--bh-bg-neutral-soft`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-subtle`, `--bh-icon-size-default`, `--bh-icon-slot-size-default`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-medium-font-size`, `--bh-text-heading-sm-medium-font-weight`, `--bh-text-heading-sm-medium-letter-spacing`, `--bh-text-heading-sm-medium-line-height` |
103
103
  <!-- registry-contract:end -->
@@ -1,78 +1,78 @@
1
- # Autocomplete
2
-
3
- Autocomplete is a searchable combobox field for choosing one or many known options.
4
-
5
- The implementation is intentionally composed from existing Banhaten primitives: `Input` owns the field surface, `SelectMenu` and `SelectMenuItem` own the result list, and `Tag` owns selected multi-value chips. The component adds filtering, selected-value state, keyboard navigation, ARIA combobox wiring, and controlled or uncontrolled APIs.
6
-
7
- ## API
8
-
9
- ```tsx
10
- <Autocomplete
11
- label="Owner"
12
- placeholder="Search people"
13
- options={[
14
- { value: "ahmed", label: "Ahmed Galal", addonText: "Design system" },
15
- { value: "nora", label: "Nora Ali", addonText: "Product" },
16
- ]}
17
- />
18
- ```
19
-
20
- | Prop | Values | Default |
21
- | --- | --- | --- |
22
- | `options` | `{ value, label, addonText, itemType, media, keywords, disabled }[]` | required |
23
- | `selectionMode` | `single`, `multiple` | `single` |
24
- | `value` / `defaultValue` | `string` or `string[]` | none |
25
- | `inputValue` / `defaultInputValue` | `string` | inferred from selected single value |
26
- | `open` / `defaultOpen` | `boolean` | `false` |
27
- | `filterOptions` | custom filtering function | label, value, and keywords filter |
28
- | `size` | `md`, `lg` | `lg` |
29
- | `variant` | `default`, `soft` | `default` |
30
- | `state` | `default`, `filled`, `error`, `disabled` | inferred |
31
- | `dir` | `ltr`, `rtl`, `auto` | inherited |
32
-
33
- ## Composition Rules
34
-
35
- - Use autocomplete for known option sets that benefit from search.
36
- - Use `Select` when the option set is short and browsing is faster than typing.
37
- - Use `selectionMode="multiple"` when selected options need removable chips; chips render with `Tag`.
38
- - Keep async fetching, debouncing, and remote loading in product code by controlling `inputValue`, `open`, and `options`.
39
- - Keep option labels concise. Use `addonText` for secondary metadata.
40
-
41
- ## Accessibility
42
-
43
- - The input uses `role="combobox"`, `aria-autocomplete="list"`, `aria-expanded`, `aria-controls`, and `aria-activedescendant`.
44
- - Results render as a `listbox` using Select menu rows.
45
- - Arrow keys move the active option, `Enter` selects, `Escape` closes, and `Backspace` removes the last selected tag in multiple mode when the search field is empty.
46
- - Labels and helper text are associated with the input, and error state maps to `aria-invalid`.
47
-
48
- ## Token Contract
49
-
50
- Autocomplete consumes tokens through the primitives it composes:
51
-
52
- - Field surface, typography, icon sizing, focus ring, and disabled/error states from `Input`.
53
- - Menu surface, item rows, hover state, selected check, and item media slots from `Select`.
54
- - Removable selected chips from `Tag`.
55
- - Additional layout uses spacing, content, and z-index tokens only.
56
-
57
- ## Install
58
-
59
- ```bash
60
- npx banhaten add autocomplete
61
- ```
62
-
63
- ## Examples
64
-
65
- Primary registry example: `examples/autocomplete-demo.tsx`.
66
-
67
- Open the live component page or run `npx banhaten docs autocomplete` to inspect source files, install command, and examples.
68
-
69
- ## RTL Rules
70
-
71
- - `inheritsDirection`: true
72
- - `composition`: Uses the existing Input field, Select menu and menu item rows, and Tag chips instead of introducing new visual primitives.
73
- - `spacing`: Uses logical positioning, logical gaps, and inherited direction so the input, menu rows, checks, helper text, and selected tags mirror naturally.
74
- - `textDirection`: Labels, option text, helper text, and tag labels use dir="auto" through the composed primitives.
75
-
1
+ # Autocomplete
2
+
3
+ Autocomplete is a searchable combobox field for choosing one or many known options.
4
+
5
+ The implementation is intentionally composed from existing Banhaten primitives: `Input` owns the field surface, `SelectMenu` and `SelectMenuItem` own the result list, and `Tag` owns selected multi-value chips. The component adds filtering, selected-value state, keyboard navigation, ARIA combobox wiring, and controlled or uncontrolled APIs.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ <Autocomplete
11
+ label="Owner"
12
+ placeholder="Search people"
13
+ options={[
14
+ { value: "ahmed", label: "Ahmed Galal", addonText: "Design system" },
15
+ { value: "nora", label: "Nora Ali", addonText: "Product" },
16
+ ]}
17
+ />
18
+ ```
19
+
20
+ | Prop | Values | Default |
21
+ | --- | --- | --- |
22
+ | `options` | `{ value, label, addonText, itemType, media, keywords, disabled }[]` | required |
23
+ | `selectionMode` | `single`, `multiple` | `single` |
24
+ | `value` / `defaultValue` | `string` or `string[]` | none |
25
+ | `inputValue` / `defaultInputValue` | `string` | inferred from selected single value |
26
+ | `open` / `defaultOpen` | `boolean` | `false` |
27
+ | `filterOptions` | custom filtering function | label, value, and keywords filter |
28
+ | `size` | `md`, `lg` | `lg` |
29
+ | `variant` | `default`, `soft` | `default` |
30
+ | `state` | `default`, `filled`, `error`, `disabled` | inferred |
31
+ | `dir` | `ltr`, `rtl`, `auto` | inherited |
32
+
33
+ ## Composition Rules
34
+
35
+ - Use autocomplete for known option sets that benefit from search.
36
+ - Use `Select` when the option set is short and browsing is faster than typing.
37
+ - Use `selectionMode="multiple"` when selected options need removable chips; chips render with `Tag`.
38
+ - Keep async fetching, debouncing, and remote loading in product code by controlling `inputValue`, `open`, and `options`.
39
+ - Keep option labels concise. Use `addonText` for secondary metadata.
40
+
41
+ ## Accessibility
42
+
43
+ - The input uses `role="combobox"`, `aria-autocomplete="list"`, `aria-expanded`, `aria-controls`, and `aria-activedescendant`.
44
+ - Results render as a `listbox` using Select menu rows.
45
+ - Arrow keys move the active option, `Enter` selects, `Escape` closes, and `Backspace` removes the last selected tag in multiple mode when the search field is empty.
46
+ - Labels and helper text are associated with the input, and error state maps to `aria-invalid`.
47
+
48
+ ## Token Contract
49
+
50
+ Autocomplete consumes tokens through the primitives it composes:
51
+
52
+ - Field surface, typography, icon sizing, focus ring, and disabled/error states from `Input`.
53
+ - Menu surface, item rows, hover state, selected check, and item media slots from `Select`.
54
+ - Removable selected chips from `Tag`.
55
+ - Additional layout uses spacing, content, and z-index tokens only.
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ npx banhaten add autocomplete
61
+ ```
62
+
63
+ ## Examples
64
+
65
+ Primary registry example: `examples/autocomplete-demo.tsx`.
66
+
67
+ Open the live component page or run `npx banhaten docs autocomplete` to inspect source files, install command, and examples.
68
+
69
+ ## RTL Rules
70
+
71
+ - `inheritsDirection`: true
72
+ - `composition`: Uses the existing Input field, Select menu and menu item rows, and Tag chips instead of introducing new visual primitives.
73
+ - `spacing`: Uses logical positioning, logical gaps, and inherited direction so the input, menu rows, checks, helper text, and selected tags mirror naturally.
74
+ - `textDirection`: Labels, option text, helper text, and tag labels use dir="auto" through the composed primitives.
75
+
76
76
  <!-- registry-contract:start -->
77
77
  ## Registry Contract
78
78
 
@@ -1,56 +1,56 @@
1
- # Avatar
2
-
3
- Avatar represents people, accounts, teams, and system actors. It supports images, initials, icon fallback, circular or rounded forms, status dots, action overlays, stacked groups, group counts, size scale, and RTL-safe overlap.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Avatar name="Ahmed Galal" src="/avatars/avatar-01.jpg" status="available" />
9
-
10
- <AvatarGroup>
11
- <Avatar name="Nora" />
12
- <Avatar name="Omar" />
13
- <AvatarGroupCount>+4</AvatarGroupCount>
14
- </AvatarGroup>
15
- ```
16
-
17
- | Prop | Values |
18
- | --- | --- |
19
- | `size` | `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl` |
20
- | `form` | `circular`, `rounded` |
21
- | `status` | `offline`, `busy`, `blocked`, `available`, `away` |
22
- | `action` | `custom`, `edit`, `verified`, `remove` |
23
-
24
- ## Token Contract
25
-
26
- Avatar consumes Banhaten radius, sizing, border, shadow, status, background, and content tokens. Status and action markers should stay token-bound so themes and dark mode remain consistent.
27
-
28
- ## RTL
29
-
30
- Avatar groups use logical negative margin so overlap reverses naturally in RTL. Status and action affordances use logical end placement.
31
-
32
- ## Accessibility
33
-
34
- Use `name` or accessible image alt text for user avatars. Decorative grouped avatars can be hidden from assistive tech when the surrounding row already names the people.
35
-
36
- ## Install
37
-
38
- ```bash
39
- npx banhaten add avatar
40
- ```
41
-
42
- ## Examples
43
-
44
- Primary registry example: `examples/avatar-demo.tsx`.
45
-
46
- Open the live component page or run `npx banhaten docs avatar` to inspect source files, install command, and examples.
47
-
48
- ## RTL Rules
49
-
50
- - `inheritsDirection`: true
51
- - `groupOverlap`: Uses logical -ms spacing so overlap reverses naturally in RTL.
52
- - `badgePlacement`: Status dots use logical end/bottom positioning; avatar actions use logical end/top positioning.
53
-
1
+ # Avatar
2
+
3
+ Avatar represents people, accounts, teams, and system actors. It supports images, initials, icon fallback, circular or rounded forms, status dots, action overlays, stacked groups, group counts, size scale, and RTL-safe overlap.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Avatar name="Ahmed Galal" src="/avatars/avatar-01.jpg" status="available" />
9
+
10
+ <AvatarGroup>
11
+ <Avatar name="Nora" />
12
+ <Avatar name="Omar" />
13
+ <AvatarGroupCount>+4</AvatarGroupCount>
14
+ </AvatarGroup>
15
+ ```
16
+
17
+ | Prop | Values |
18
+ | --- | --- |
19
+ | `size` | `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl` |
20
+ | `form` | `circular`, `rounded` |
21
+ | `status` | `offline`, `busy`, `blocked`, `available`, `away` |
22
+ | `action` | `custom`, `edit`, `verified`, `remove` |
23
+
24
+ ## Token Contract
25
+
26
+ Avatar consumes Banhaten radius, sizing, border, shadow, status, background, and content tokens. The `md` and `lg` icon fallbacks use 18px glyphs in 20px slots; other avatar sizes keep their existing scale. Status and action markers should stay token-bound so themes and dark mode remain consistent.
27
+
28
+ ## RTL
29
+
30
+ Avatar groups use logical negative margin so overlap reverses naturally in RTL. Status and action affordances use logical end placement.
31
+
32
+ ## Accessibility
33
+
34
+ Use `name` or accessible image alt text for user avatars. Decorative grouped avatars can be hidden from assistive tech when the surrounding row already names the people.
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npx banhaten add avatar
40
+ ```
41
+
42
+ ## Examples
43
+
44
+ Primary registry example: `examples/avatar-demo.tsx`.
45
+
46
+ Open the live component page or run `npx banhaten docs avatar` to inspect source files, install command, and examples.
47
+
48
+ ## RTL Rules
49
+
50
+ - `inheritsDirection`: true
51
+ - `groupOverlap`: Uses logical -ms spacing so overlap reverses naturally in RTL.
52
+ - `badgePlacement`: Status dots use logical end/bottom positioning; avatar actions use logical end/top positioning.
53
+
54
54
  <!-- registry-contract:start -->
55
55
  ## Registry Contract
56
56
 
@@ -66,5 +66,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
66
66
  | `forms` | `circular`, `rounded` |
67
67
  | `sizes` | `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl` |
68
68
  | `statusColors` | `offline`, `busy`, `blocked`, `available`, `away` |
69
- | `tokens` | `--bh-avatar-action-icon-size`, `--bh-avatar-action-icon-size-2xl`, `--bh-avatar-action-icon-size-3xl`, `--bh-avatar-action-icon-size-4xl`, `--bh-avatar-action-icon-size-large`, `--bh-avatar-action-icon-size-medium`, `--bh-avatar-action-icon-size-small`, `--bh-avatar-action-icon-size-tiny`, `--bh-avatar-action-icon-size-xlarge`, `--bh-avatar-action-icon-size-xsmall`, `--bh-avatar-action-size`, `--bh-avatar-action-size-2xl`, `--bh-avatar-action-size-3xl`, `--bh-avatar-action-size-4xl`, `--bh-avatar-action-size-large`, `--bh-avatar-action-size-medium`, `--bh-avatar-action-size-small`, `--bh-avatar-action-size-tiny`, `--bh-avatar-action-size-xlarge`, `--bh-avatar-action-size-xsmall`, `--bh-avatar-fallback-font-size-2xl`, `--bh-avatar-fallback-font-size-2xs`, `--bh-avatar-fallback-font-size-3xl`, `--bh-avatar-fallback-font-size-4xl`, `--bh-avatar-fallback-font-size-lg`, `--bh-avatar-fallback-font-size-md`, `--bh-avatar-fallback-font-size-sm`, `--bh-avatar-fallback-font-size-xl`, `--bh-avatar-fallback-font-size-xs`, `--bh-avatar-fallback-size`, `--bh-avatar-icon-size`, `--bh-avatar-icon-size-2xl`, `--bh-avatar-icon-size-2xs`, `--bh-avatar-icon-size-3xl`, `--bh-avatar-icon-size-4xl`, `--bh-avatar-icon-size-lg`, `--bh-avatar-icon-size-md`, `--bh-avatar-icon-size-sm`, `--bh-avatar-icon-size-xl`, `--bh-avatar-icon-size-xs`, `--bh-avatar-radius`, `--bh-avatar-size`, `--bh-avatar-size-2xl`, `--bh-avatar-size-2xs`, `--bh-avatar-size-3xl`, `--bh-avatar-size-4xl`, `--bh-avatar-size-lg`, `--bh-avatar-size-md`, `--bh-avatar-size-sm`, `--bh-avatar-size-xl`, `--bh-avatar-size-xs`, `--bh-avatar-status-ring`, `--bh-avatar-status-ring-default`, `--bh-avatar-status-ring-thin`, `--bh-avatar-status-size`, `--bh-avatar-status-size-large`, `--bh-avatar-status-size-medium`, `--bh-avatar-status-size-small`, `--bh-avatar-status-size-tiny`, `--bh-avatar-status-size-xlarge`, `--bh-avatar-status-size-xsmall`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-red-default`, `--bh-bg-accent-sky-base`, `--bh-bg-default`, `--bh-bg-neutral-default`, `--bh-bg-neutral-medium`, `--bh-bg-neutral-subtle`, `--bh-bg-success-default`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-font-weight-semibold`, `--bh-icon-stroke-210`, `--bh-icon-stroke-240`, `--bh-icon-stroke-260`, `--bh-icon-stroke-280`, `--bh-interactive-brand-default`, `--bh-interactive-danger-default`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-xl-12`, `--bh-space-xxs-2`, `--bh-text-body-sm-medium-font-size`, `--shadow-avatar-badge` |
69
+ | `tokens` | `--bh-avatar-action-icon-size`, `--bh-avatar-action-icon-size-2xl`, `--bh-avatar-action-icon-size-3xl`, `--bh-avatar-action-icon-size-4xl`, `--bh-avatar-action-icon-size-large`, `--bh-avatar-action-icon-size-medium`, `--bh-avatar-action-icon-size-small`, `--bh-avatar-action-icon-size-tiny`, `--bh-avatar-action-icon-size-xlarge`, `--bh-avatar-action-icon-size-xsmall`, `--bh-avatar-action-size`, `--bh-avatar-action-size-2xl`, `--bh-avatar-action-size-3xl`, `--bh-avatar-action-size-4xl`, `--bh-avatar-action-size-large`, `--bh-avatar-action-size-medium`, `--bh-avatar-action-size-small`, `--bh-avatar-action-size-tiny`, `--bh-avatar-action-size-xlarge`, `--bh-avatar-action-size-xsmall`, `--bh-avatar-fallback-font-size-2xl`, `--bh-avatar-fallback-font-size-2xs`, `--bh-avatar-fallback-font-size-3xl`, `--bh-avatar-fallback-font-size-4xl`, `--bh-avatar-fallback-font-size-lg`, `--bh-avatar-fallback-font-size-md`, `--bh-avatar-fallback-font-size-sm`, `--bh-avatar-fallback-font-size-xl`, `--bh-avatar-fallback-font-size-xs`, `--bh-avatar-fallback-size`, `--bh-avatar-icon-size`, `--bh-avatar-icon-size-2xl`, `--bh-avatar-icon-size-2xs`, `--bh-avatar-icon-size-3xl`, `--bh-avatar-icon-size-4xl`, `--bh-avatar-icon-size-lg`, `--bh-avatar-icon-size-md`, `--bh-avatar-icon-size-sm`, `--bh-avatar-icon-size-xl`, `--bh-avatar-icon-size-xs`, `--bh-avatar-icon-slot-size`, `--bh-avatar-radius`, `--bh-avatar-size`, `--bh-avatar-size-2xl`, `--bh-avatar-size-2xs`, `--bh-avatar-size-3xl`, `--bh-avatar-size-4xl`, `--bh-avatar-size-lg`, `--bh-avatar-size-md`, `--bh-avatar-size-sm`, `--bh-avatar-size-xl`, `--bh-avatar-size-xs`, `--bh-avatar-status-ring`, `--bh-avatar-status-ring-default`, `--bh-avatar-status-ring-thin`, `--bh-avatar-status-size`, `--bh-avatar-status-size-large`, `--bh-avatar-status-size-medium`, `--bh-avatar-status-size-small`, `--bh-avatar-status-size-tiny`, `--bh-avatar-status-size-xlarge`, `--bh-avatar-status-size-xsmall`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-red-default`, `--bh-bg-accent-sky-base`, `--bh-bg-default`, `--bh-bg-neutral-default`, `--bh-bg-neutral-medium`, `--bh-bg-neutral-subtle`, `--bh-bg-success-default`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-font-weight-semibold`, `--bh-icon-slot-size-default`, `--bh-icon-stroke-210`, `--bh-icon-stroke-240`, `--bh-icon-stroke-260`, `--bh-icon-stroke-280`, `--bh-interactive-brand-default`, `--bh-interactive-danger-default`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-xl-12`, `--bh-space-xxs-2`, `--bh-text-body-sm-medium-font-size`, `--elevation-avatar-badge` |
70
70
  <!-- registry-contract:end -->
@@ -1,57 +1,57 @@
1
- # Badge
2
-
3
- Badge is a compact status, count, classification, or metadata primitive. It supports light, outline, and solid styles; semantic color families; dot, flag, leading icon, trailing icon, numeric, and split-action compositions; and RTL-safe layout.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Badge color="green">Active</Badge>
9
- <Badge color="blue" type="dot">New</Badge>
10
- <Badge color="neutral" type="trailing-icon" splitAction>
11
- Filter
12
- </Badge>
13
- ```
14
-
15
- | Prop | Values | Default |
16
- | --- | --- | --- |
17
- | `style` | `light`, `outline`, `solid` | `light` |
18
- | `color` | `neutral`, `blue`, `green`, `amber`, `danger`, `purple`, `fuchsia`, `rose`, `sky`, `golden` | `neutral` |
19
- | `type` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` | `default` |
20
- | `size` | `sm`, `lg` | `sm` |
21
- | `splitAction` | `boolean` | `false` |
22
-
23
- ## Token Contract
24
-
25
- Badge uses semantic content, background, border, radius, typography, icon, opacity, and focus tokens. Provider or brand colors should be added through semantic aliases, not raw literals.
26
-
27
- ## RTL
28
-
29
- Use `data-icon="inline-start"` or `data-icon="inline-end"` on icons. Directional arrows should also set `data-rtl-flip="true"`.
30
-
31
- ## Accessibility
32
-
33
- Badges are usually descriptive text. Do not use color alone for critical status; include a readable label such as `Failed`, `Warning`, or `Active`.
34
-
35
- ## Install
36
-
37
- ```bash
38
- npx banhaten add badge
39
- ```
40
-
41
- ## Examples
42
-
43
- Primary registry example: `examples/badge-demo.tsx`.
44
-
45
- Open the live component page or run `npx banhaten docs badge` to inspect source files, install command, and examples.
46
-
47
- ## RTL Rules
48
-
49
- - `inheritsDirection`: true
50
- - `iconPlacement`: Set type="leading-icon" or type="trailing-icon" and use data-icon="inline-start" or data-icon="inline-end". Add splitAction to give a trailing icon its own token-sized compartment.
51
- - `directionalIconFlip`: Use data-rtl-flip="true" on arrows that should mirror.
52
- - `textDirection`: Uses dir="auto" by default for short Arabic and English labels.
53
- - `legacyVariants`: The previous variant prop is still accepted as a compatibility shim.
54
-
1
+ # Badge
2
+
3
+ Badge is a compact status, count, classification, or metadata primitive. It supports light, outline, and solid styles; semantic color families; dot, flag, leading icon, trailing icon, numeric, and split-action compositions; and RTL-safe layout.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Badge color="green">Active</Badge>
9
+ <Badge color="blue" type="dot">New</Badge>
10
+ <Badge color="neutral" type="trailing-icon" splitAction>
11
+ Filter
12
+ </Badge>
13
+ ```
14
+
15
+ | Prop | Values | Default |
16
+ | --- | --- | --- |
17
+ | `style` | `light`, `outline`, `solid` | `light` |
18
+ | `color` | `neutral`, `blue`, `green`, `amber`, `danger`, `purple`, `fuchsia`, `rose`, `sky`, `golden` | `neutral` |
19
+ | `type` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` | `default` |
20
+ | `size` | `sm`, `lg` | `sm` |
21
+ | `splitAction` | `boolean` | `false` |
22
+
23
+ ## Token Contract
24
+
25
+ Badge uses semantic content, background, border, radius, typography, icon, opacity, and focus tokens. Provider or brand colors should be added through semantic aliases, not raw literals.
26
+
27
+ ## RTL
28
+
29
+ Use `data-icon="inline-start"` or `data-icon="inline-end"` on icons. Directional arrows should also set `data-rtl-flip="true"`.
30
+
31
+ ## Accessibility
32
+
33
+ Badges are usually descriptive text. Do not use color alone for critical status; include a readable label such as `Failed`, `Warning`, or `Active`.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ npx banhaten add badge
39
+ ```
40
+
41
+ ## Examples
42
+
43
+ Primary registry example: `examples/badge-demo.tsx`.
44
+
45
+ Open the live component page or run `npx banhaten docs badge` to inspect source files, install command, and examples.
46
+
47
+ ## RTL Rules
48
+
49
+ - `inheritsDirection`: true
50
+ - `iconPlacement`: Set type="leading-icon" or type="trailing-icon" and use data-icon="inline-start" or data-icon="inline-end". Add splitAction to give a trailing icon its own token-sized compartment.
51
+ - `directionalIconFlip`: Use data-rtl-flip="true" on arrows that should mirror.
52
+ - `textDirection`: Uses dir="auto" by default for short Arabic and English labels.
53
+ - `legacyVariants`: The previous variant prop is still accepted as a compatibility shim.
54
+
55
55
  <!-- registry-contract:start -->
56
56
  ## Registry Contract
57
57