banhaten 0.5.0 → 0.6.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 (290) hide show
  1. package/CHANGELOG.md +177 -139
  2. package/CONTRIBUTING.md +46 -46
  3. package/README.md +192 -192
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -13
  7. package/docs/design-system/README.md +22 -22
  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 +91 -90
  20. package/docs/design-system/components/accordion.md +52 -52
  21. package/docs/design-system/components/activity-feed.md +93 -93
  22. package/docs/design-system/components/activity-heatmap.md +56 -56
  23. package/docs/design-system/components/alert-dialog.md +71 -71
  24. package/docs/design-system/components/alert.md +103 -97
  25. package/docs/design-system/components/app-header.md +97 -0
  26. package/docs/design-system/components/aspect-ratio.md +45 -45
  27. package/docs/design-system/components/attribute.md +101 -89
  28. package/docs/design-system/components/autocomplete.md +75 -75
  29. package/docs/design-system/components/avatar.md +53 -53
  30. package/docs/design-system/components/badge.md +55 -55
  31. package/docs/design-system/components/banner.md +86 -86
  32. package/docs/design-system/components/breadcrumbs.md +181 -177
  33. package/docs/design-system/components/button-group.md +97 -97
  34. package/docs/design-system/components/button.md +80 -80
  35. package/docs/design-system/components/card.md +102 -88
  36. package/docs/design-system/components/carousel.md +46 -46
  37. package/docs/design-system/components/catalog-components.md +46 -46
  38. package/docs/design-system/components/checkbox.md +53 -53
  39. package/docs/design-system/components/collapsible.md +63 -63
  40. package/docs/design-system/components/command.md +61 -61
  41. package/docs/design-system/components/context-menu.md +45 -45
  42. package/docs/design-system/components/date-picker.md +80 -80
  43. package/docs/design-system/components/divider.md +102 -102
  44. package/docs/design-system/components/empty-state.md +56 -56
  45. package/docs/design-system/components/field.md +70 -70
  46. package/docs/design-system/components/file-upload.md +186 -186
  47. package/docs/design-system/components/hover-card.md +47 -47
  48. package/docs/design-system/components/icons.md +48 -48
  49. package/docs/design-system/components/input-group.md +57 -57
  50. package/docs/design-system/components/input-otp.md +56 -56
  51. package/docs/design-system/components/input.md +111 -109
  52. package/docs/design-system/components/item.md +58 -58
  53. package/docs/design-system/components/kbd.md +49 -49
  54. package/docs/design-system/components/label.md +49 -49
  55. package/docs/design-system/components/menu.md +94 -73
  56. package/docs/design-system/components/menubar.md +46 -46
  57. package/docs/design-system/components/modal.md +104 -104
  58. package/docs/design-system/components/native-select.md +53 -53
  59. package/docs/design-system/components/navigation-menu.md +49 -49
  60. package/docs/design-system/components/onboarding-step-list-item.md +81 -81
  61. package/docs/design-system/components/page-header.md +127 -93
  62. package/docs/design-system/components/pagination.md +56 -56
  63. package/docs/design-system/components/popover.md +59 -59
  64. package/docs/design-system/components/progress-slider.md +49 -49
  65. package/docs/design-system/components/progress.md +76 -76
  66. package/docs/design-system/components/radio-card.md +50 -50
  67. package/docs/design-system/components/radio-group.md +56 -56
  68. package/docs/design-system/components/resizable.md +43 -43
  69. package/docs/design-system/components/scroll-area.md +50 -50
  70. package/docs/design-system/components/segmented-control.md +54 -54
  71. package/docs/design-system/components/select.md +68 -64
  72. package/docs/design-system/components/sheet.md +66 -66
  73. package/docs/design-system/components/sidebar.md +167 -111
  74. package/docs/design-system/components/skeleton.md +74 -74
  75. package/docs/design-system/components/slideout.md +64 -64
  76. package/docs/design-system/components/slider.md +62 -62
  77. package/docs/design-system/components/social-button.md +49 -49
  78. package/docs/design-system/components/spinner.md +62 -62
  79. package/docs/design-system/components/steps.md +65 -65
  80. package/docs/design-system/components/table.md +499 -422
  81. package/docs/design-system/components/tabs.md +74 -59
  82. package/docs/design-system/components/tag.md +79 -79
  83. package/docs/design-system/components/textarea.md +49 -49
  84. package/docs/design-system/components/timeline.md +82 -82
  85. package/docs/design-system/components/toast.md +57 -57
  86. package/docs/design-system/components/toggle.md +80 -80
  87. package/docs/design-system/components/toolbar.md +89 -89
  88. package/docs/design-system/components/tooltip.md +92 -92
  89. package/docs/design-system/components/typography.md +18 -18
  90. package/docs/design-system/density-and-elevation.md +65 -65
  91. package/docs/design-system/design-system-test-missing-items.md +368 -368
  92. package/docs/design-system/direction-and-localization.md +23 -23
  93. package/docs/design-system/form-recipes.md +73 -73
  94. package/docs/design-system/gap-promotion-policy.md +21 -21
  95. package/docs/design-system/icons.md +74 -74
  96. package/docs/design-system/installation.md +70 -70
  97. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  98. package/docs/design-system/registry-and-cli.md +64 -64
  99. package/docs/design-system/release-policy.md +30 -30
  100. package/docs/design-system/roadmap.md +14 -14
  101. package/docs/design-system/support-matrix.md +23 -23
  102. package/docs/design-system/tabs.md +54 -54
  103. package/docs/design-system/template-gap-audit.md +32 -32
  104. package/docs/design-system/templates.md +59 -59
  105. package/docs/design-system/token-governance.md +72 -72
  106. package/package.json +98 -98
  107. package/registry/component-contract.json +40 -40
  108. package/registry/components/accordion.tsx +155 -155
  109. package/registry/components/alert-dialog.tsx +297 -297
  110. package/registry/components/alert.tsx +309 -293
  111. package/registry/components/app-header.tsx +151 -0
  112. package/registry/components/aspect-ratio.tsx +30 -30
  113. package/registry/components/attribute.tsx +489 -454
  114. package/registry/components/autocomplete.tsx +598 -598
  115. package/registry/components/avatar.tsx +385 -385
  116. package/registry/components/badge.tsx +630 -629
  117. package/registry/components/button-group.tsx +565 -565
  118. package/registry/components/button.tsx +128 -127
  119. package/registry/components/card.tsx +651 -638
  120. package/registry/components/carousel.tsx +296 -296
  121. package/registry/components/chart.tsx +203 -203
  122. package/registry/components/checkbox.tsx +247 -247
  123. package/registry/components/collapsible.tsx +109 -109
  124. package/registry/components/command.tsx +208 -208
  125. package/registry/components/context-menu.tsx +236 -236
  126. package/registry/components/date-picker.tsx +1289 -1289
  127. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  128. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  129. package/registry/components/expanded/Banner.tsx +179 -179
  130. package/registry/components/expanded/Breadcrumbs.tsx +135 -131
  131. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  132. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  133. package/registry/components/expanded/EmptyState.tsx +155 -155
  134. package/registry/components/expanded/FileUpload.tsx +543 -543
  135. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -60
  136. package/registry/components/expanded/PageHeader.tsx +209 -179
  137. package/registry/components/expanded/Slideout.tsx +108 -108
  138. package/registry/components/expanded/Steps.tsx +402 -402
  139. package/registry/components/expanded/Table.tsx +1109 -1092
  140. package/registry/components/expanded/Timeline.tsx +203 -203
  141. package/registry/components/expanded/activityFeed.css +248 -248
  142. package/registry/components/expanded/activityHeatmap.css +66 -66
  143. package/registry/components/expanded/banner.css +260 -260
  144. package/registry/components/expanded/breadcrumbs.css +157 -140
  145. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  146. package/registry/components/expanded/divider.css +75 -75
  147. package/registry/components/expanded/emptyState.css +111 -111
  148. package/registry/components/expanded/fileUpload.css +457 -457
  149. package/registry/components/expanded/onboardingStepListItem.css +135 -135
  150. package/registry/components/expanded/pageHeader.css +284 -248
  151. package/registry/components/expanded/slideout.css +276 -276
  152. package/registry/components/expanded/steps.css +356 -356
  153. package/registry/components/expanded/table.css +655 -606
  154. package/registry/components/expanded/timeline.css +286 -286
  155. package/registry/components/field.tsx +283 -283
  156. package/registry/components/hover-card.tsx +48 -48
  157. package/registry/components/input-content.ts +107 -107
  158. package/registry/components/input-group.tsx +130 -130
  159. package/registry/components/input-otp.tsx +584 -584
  160. package/registry/components/input.tsx +992 -990
  161. package/registry/components/item.tsx +189 -189
  162. package/registry/components/kbd.tsx +246 -246
  163. package/registry/components/label.tsx +78 -78
  164. package/registry/components/menu.tsx +1091 -978
  165. package/registry/components/menubar.tsx +226 -226
  166. package/registry/components/modal.tsx +872 -872
  167. package/registry/components/native-select.tsx +205 -205
  168. package/registry/components/navigation-menu.tsx +171 -171
  169. package/registry/components/pagination.css +36 -36
  170. package/registry/components/pagination.tsx +560 -560
  171. package/registry/components/popover.tsx +338 -338
  172. package/registry/components/progress-slider.tsx +216 -216
  173. package/registry/components/radio-card.tsx +676 -676
  174. package/registry/components/radio-group.tsx +570 -570
  175. package/registry/components/resizable.tsx +108 -108
  176. package/registry/components/scroll-area.tsx +91 -91
  177. package/registry/components/segmented-control.tsx +87 -87
  178. package/registry/components/select-content.tsx +218 -218
  179. package/registry/components/select.tsx +937 -937
  180. package/registry/components/sheet.tsx +305 -305
  181. package/registry/components/sidebar.tsx +1535 -1433
  182. package/registry/components/skeleton.css +54 -54
  183. package/registry/components/skeleton.tsx +482 -482
  184. package/registry/components/slider.tsx +380 -380
  185. package/registry/components/social-button.tsx +387 -387
  186. package/registry/components/spinner.tsx +78 -78
  187. package/registry/components/table-elements.tsx +287 -128
  188. package/registry/components/tabs.css +246 -222
  189. package/registry/components/tabs.tsx +245 -241
  190. package/registry/components/tag.tsx +423 -423
  191. package/registry/components/textarea.tsx +610 -610
  192. package/registry/components/toast.tsx +136 -136
  193. package/registry/components/toggle.tsx +256 -256
  194. package/registry/components/toolbar.tsx +539 -539
  195. package/registry/components/tooltip.tsx +433 -433
  196. package/registry/examples/alert-demo.tsx +34 -34
  197. package/registry/examples/alert-dialog-demo.tsx +42 -42
  198. package/registry/examples/app-header-demo.tsx +40 -0
  199. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  200. package/registry/examples/attribute-demo.tsx +65 -65
  201. package/registry/examples/autocomplete-demo.tsx +109 -109
  202. package/registry/examples/avatar-demo.tsx +132 -132
  203. package/registry/examples/badge-demo.tsx +69 -69
  204. package/registry/examples/button-demo.tsx +86 -86
  205. package/registry/examples/button-group-demo.tsx +63 -63
  206. package/registry/examples/card-demo.tsx +86 -86
  207. package/registry/examples/carousel-demo.tsx +43 -43
  208. package/registry/examples/chart-demo.tsx +18 -18
  209. package/registry/examples/checkbox-demo.tsx +62 -62
  210. package/registry/examples/collapsible-demo.tsx +16 -16
  211. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  212. package/registry/examples/command-demo.tsx +42 -42
  213. package/registry/examples/command-palette-demo.tsx +235 -235
  214. package/registry/examples/context-menu-demo.tsx +29 -29
  215. package/registry/examples/control-density-contract-demo.tsx +65 -65
  216. package/registry/examples/date-picker-demo.tsx +127 -127
  217. package/registry/examples/divider-demo.tsx +17 -17
  218. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  219. package/registry/examples/expanded/banner-demo.tsx +48 -48
  220. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  221. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  222. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  223. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  224. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  225. package/registry/examples/expanded/steps-demo.tsx +29 -29
  226. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  227. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  228. package/registry/examples/field-demo.tsx +51 -51
  229. package/registry/examples/hover-card-demo.tsx +23 -23
  230. package/registry/examples/input-actions-demo.tsx +36 -36
  231. package/registry/examples/input-demo.tsx +87 -87
  232. package/registry/examples/input-group-demo.tsx +16 -16
  233. package/registry/examples/input-otp-demo.tsx +72 -72
  234. package/registry/examples/item-demo.tsx +46 -46
  235. package/registry/examples/kbd-demo.tsx +12 -12
  236. package/registry/examples/label-demo.tsx +20 -20
  237. package/registry/examples/menu-demo.tsx +122 -122
  238. package/registry/examples/menubar-demo.tsx +34 -34
  239. package/registry/examples/modal-demo.tsx +74 -74
  240. package/registry/examples/native-select-demo.tsx +16 -16
  241. package/registry/examples/navigation-menu-demo.tsx +29 -29
  242. package/registry/examples/pagination-demo.tsx +20 -20
  243. package/registry/examples/popover-demo.tsx +547 -547
  244. package/registry/examples/progress-demo.tsx +37 -37
  245. package/registry/examples/progress-slider-demo.tsx +29 -29
  246. package/registry/examples/radio-card-demo.tsx +51 -51
  247. package/registry/examples/radio-group-demo.tsx +62 -62
  248. package/registry/examples/resizable-demo.tsx +22 -22
  249. package/registry/examples/results-toolbar-demo.tsx +44 -44
  250. package/registry/examples/scroll-area-demo.tsx +15 -15
  251. package/registry/examples/segmented-control-demo.tsx +39 -39
  252. package/registry/examples/select-demo.tsx +87 -87
  253. package/registry/examples/sheet-demo.tsx +47 -47
  254. package/registry/examples/sidebar-demo.tsx +101 -101
  255. package/registry/examples/slider-demo.tsx +31 -31
  256. package/registry/examples/social-button-demo.tsx +61 -61
  257. package/registry/examples/spinner-demo.tsx +59 -59
  258. package/registry/examples/tabs-demo.tsx +13 -13
  259. package/registry/examples/tag-demo.tsx +29 -29
  260. package/registry/examples/textarea-demo.tsx +79 -79
  261. package/registry/examples/toast-demo.tsx +35 -35
  262. package/registry/examples/toggle-demo.tsx +59 -59
  263. package/registry/examples/tooltip-demo.tsx +115 -115
  264. package/registry/guidance/USAGE.md +27 -27
  265. package/registry/hooks/use-direction.ts +207 -207
  266. package/registry/index.json +387 -17
  267. package/registry/styles/globals.css +46 -0
  268. package/registry.json +24 -2
  269. package/schema/config.schema.json +51 -51
  270. package/schema/registry.schema.json +194 -194
  271. package/schema/tokens.schema.json +167 -167
  272. package/src/cli/command-line.js +194 -194
  273. package/src/cli/config-editors.js +9 -9
  274. package/src/cli/doctor.js +399 -399
  275. package/src/cli/file-transaction.js +302 -302
  276. package/src/cli/global-css.js +153 -153
  277. package/src/cli/index.js +1002 -1002
  278. package/src/cli/install-plan.js +592 -592
  279. package/src/cli/install-receipt.js +171 -171
  280. package/src/cli/jsonc.js +203 -203
  281. package/src/cli/package-install-state.js +254 -254
  282. package/src/cli/package-manager.js +238 -238
  283. package/src/cli/package-plan.js +185 -185
  284. package/src/cli/package-version.js +97 -97
  285. package/src/cli/registry-query.js +207 -207
  286. package/src/cli/reporting.js +55 -55
  287. package/src/cli/schema-validation.js +19 -19
  288. package/src/cli/source-scanner.js +686 -686
  289. package/src/cli/vite-config.js +478 -478
  290. package/tokens/banhaten.tokens.json +184 -0
@@ -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. 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
-
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
 
@@ -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
 
@@ -67,6 +67,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
67
67
  | `options` | `splitAction` |
68
68
  | `sizes` | `sm`, `lg` |
69
69
  | `styles` | `light`, `outline`, `solid` |
70
- | `tokens` | `--bh-badge-focus-ring-width`, `--bh-badge-outline-border-width`, `--bh-bg-accent-amber-default`, `--bh-bg-accent-amber-subtle`, `--bh-bg-accent-blue-bold`, `--bh-bg-accent-blue-subtle`, `--bh-bg-accent-fuchsia-default`, `--bh-bg-accent-fuchsia-subtle`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-golden-subtle`, `--bh-bg-accent-green-default`, `--bh-bg-accent-green-subtle`, `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-red-default`, `--bh-bg-accent-red-subtle`, `--bh-bg-accent-rose-bold`, `--bh-bg-accent-rose-subtle`, `--bh-bg-accent-sky-base`, `--bh-bg-accent-sky-subtle`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-subtle`, `--bh-border-accent-amber-strong`, `--bh-border-accent-amber-subtle`, `--bh-border-accent-blue-strong`, `--bh-border-accent-blue-subtle`, `--bh-border-accent-fuchsia-strong`, `--bh-border-accent-fuchsia-subtle`, `--bh-border-accent-golden-strong`, `--bh-border-accent-golden-subtle`, `--bh-border-accent-green-strong`, `--bh-border-accent-green-subtle`, `--bh-border-accent-purple-strong`, `--bh-border-accent-purple-subtle`, `--bh-border-accent-red-strong`, `--bh-border-accent-red-subtle`, `--bh-border-accent-rose-strong`, `--bh-border-accent-rose-subtle`, `--bh-border-accent-sky-strong`, `--bh-border-accent-sky-subtle`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-focus-danger`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-content-accent-amber-default`, `--bh-content-accent-amber-strong`, `--bh-content-accent-blue-default`, `--bh-content-accent-blue-strong`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-fuchsia-strong`, `--bh-content-accent-golden-default`, `--bh-content-accent-golden-strong`, `--bh-content-accent-green-default`, `--bh-content-accent-green-strong`, `--bh-content-accent-purple-default`, `--bh-content-accent-purple-strong`, `--bh-content-accent-red-default`, `--bh-content-accent-red-strong`, `--bh-content-accent-rose-default`, `--bh-content-accent-rose-strong`, `--bh-content-accent-sky-default`, `--bh-content-accent-sky-strong`, `--bh-content-default`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-on-color`, `--bh-content-on-light`, `--bh-content-on-neutral`, `--bh-interactive-ghost-default`, `--bh-opacity-35`, `--bh-radius-full`, `--bh-radius-xs-2`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-medium-letter-spacing`, `--bh-text-body-2xs-medium-line-height`, `--bh-text-body-2xs-semibold-font-weight`, `--bh-text-body-3xs-medium-font-size`, `--bh-text-body-3xs-medium-font-weight`, `--bh-text-body-3xs-medium-letter-spacing`, `--bh-text-body-3xs-medium-line-height`, `--bh-text-body-3xs-semibold-font-weight` |
70
+ | `tokens` | `--bh-badge-focus-ring-width`, `--bh-badge-outline-border-width`, `--bh-bg-accent-amber-default`, `--bh-bg-accent-amber-subtle`, `--bh-bg-accent-blue-bold`, `--bh-bg-accent-blue-subtle`, `--bh-bg-accent-fuchsia-default`, `--bh-bg-accent-fuchsia-subtle`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-golden-subtle`, `--bh-bg-accent-green-default`, `--bh-bg-accent-green-subtle`, `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-red-default`, `--bh-bg-accent-red-subtle`, `--bh-bg-accent-rose-bold`, `--bh-bg-accent-rose-subtle`, `--bh-bg-accent-sky-base`, `--bh-bg-accent-sky-subtle`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-subtle`, `--bh-border-accent-amber-strong`, `--bh-border-accent-amber-subtle`, `--bh-border-accent-blue-strong`, `--bh-border-accent-blue-subtle`, `--bh-border-accent-fuchsia-strong`, `--bh-border-accent-fuchsia-subtle`, `--bh-border-accent-golden-strong`, `--bh-border-accent-golden-subtle`, `--bh-border-accent-green-strong`, `--bh-border-accent-green-subtle`, `--bh-border-accent-purple-strong`, `--bh-border-accent-purple-subtle`, `--bh-border-accent-red-strong`, `--bh-border-accent-red-subtle`, `--bh-border-accent-rose-strong`, `--bh-border-accent-rose-subtle`, `--bh-border-accent-sky-strong`, `--bh-border-accent-sky-subtle`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-focus-danger`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-accent-amber-default`, `--bh-content-accent-amber-strong`, `--bh-content-accent-blue-default`, `--bh-content-accent-blue-strong`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-fuchsia-strong`, `--bh-content-accent-golden-default`, `--bh-content-accent-golden-strong`, `--bh-content-accent-green-default`, `--bh-content-accent-green-strong`, `--bh-content-accent-purple-default`, `--bh-content-accent-purple-strong`, `--bh-content-accent-red-default`, `--bh-content-accent-red-strong`, `--bh-content-accent-rose-default`, `--bh-content-accent-rose-strong`, `--bh-content-accent-sky-default`, `--bh-content-accent-sky-strong`, `--bh-content-default`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-on-color`, `--bh-content-on-light`, `--bh-content-on-neutral`, `--bh-interactive-ghost-default`, `--bh-opacity-35`, `--bh-radius-full`, `--bh-radius-xs-2`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-medium-letter-spacing`, `--bh-text-body-2xs-medium-line-height`, `--bh-text-body-2xs-semibold-font-weight`, `--bh-text-body-3xs-medium-font-size`, `--bh-text-body-3xs-medium-font-weight`, `--bh-text-body-3xs-medium-letter-spacing`, `--bh-text-body-3xs-medium-line-height`, `--bh-text-body-3xs-semibold-font-weight` |
71
71
  | `types` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` |
72
72
  <!-- registry-contract:end -->
@@ -1,89 +1,89 @@
1
- # Banner
2
-
3
- `Banner` presents short product announcements, notices, or lightweight calls to action.
4
-
5
- Figma reference: `Design system 3.0 Copy / Banner`, node `237:39513`.
6
-
7
- ## Variants
8
-
9
- The implementation covers the Banner matrix from Figma:
10
-
11
- | Prop | Values |
12
- | --- | --- |
13
- | `type` | `slim`, `single-action-inline`, `single-action`, `input` |
14
- | `size` | `floating`, `full-width` |
15
- | `content` | `title`, `title-description` |
16
- | `color` | `brand`, `grey`, `brand-light` |
17
- | `dir` | `ltr`, `rtl` |
18
-
19
- ## API
20
-
21
- ```tsx
22
- <Banner
23
- type="single-action"
24
- size="floating"
25
- content="title"
26
- color="brand"
27
- dir="ltr"
28
- />
29
- ```
30
-
31
- | Prop | Default |
32
- | --- | --- |
33
- | `title` | localized demo title |
34
- | `description` | localized demo description |
35
- | `linkLabel` | `Link button` |
36
- | `actionLabel` | `Button` |
37
- | `inputPlaceholder` | `Placeholder` |
38
- | `showIcon` | `true` |
39
- | `showInlineAction` | `true` |
40
- | `onAction` | none |
41
- | `onClose` | none |
42
-
43
- ## Pixel Rules
44
-
45
- - Root padding is `12px 16px`.
46
- - Slim title rows are `48px`; slim title-description rows are `52px`.
47
- - Single-action, inline-action, and input rows are `60px`.
48
- - Floating rows use `10px` radius; full-width rows have square edges.
49
- - The leading glyph is `18px` in a `20px` slot; the close glyph remains `16px`.
50
- - Action controls and text inputs are `36px` tall with `8px` radius.
51
- - LTR body text uses `15px / 24px`. RTL title-only body text uses `12px / 16px`.
52
- - Title-description content uses a semibold title, a `17px / 28px` separator dot, and regular description text.
53
-
54
- ## Token Contract
55
-
56
- 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.
57
-
58
- - Backgrounds: `--bh-bg-brand-default`, `--bh-bg-brand-soft`, `--bh-bg-muted`, `--bh-bg-always-white`
59
- - Content: `--bh-content-default`, `--bh-content-inverse`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-subtle`
60
- - Borders: `--bh-border-subtle`, `--bh-border-input`
61
- - Shape: `--bh-control-default`, `--bh-radius-lg-8`, `--bh-radius-xl-10`
62
- - Space: `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`, `--bh-space-3xl-16`
63
-
64
- ## Accessibility
65
-
66
- - The banner root exposes an `aria-label`.
67
- - Link, action, and close affordances are real buttons.
68
- - The input variant uses a real text input with an `aria-label`.
69
- - RTL is controlled through `dir="rtl"` so icon, text, action, input, and close placement mirror logically.
70
-
71
- ## Install
72
-
73
- ```bash
74
- npx banhaten add banner
75
- ```
76
-
77
- ## Examples
78
-
79
- Primary registry example: `examples/expanded/banner-demo.tsx`.
80
-
81
- Open the live component page or run `npx banhaten docs banner` to inspect source files, install command, and examples.
82
-
83
- ## RTL Rules
84
-
85
- This component has no special RTL contract beyond inherited document direction and logical spacing.
86
-
1
+ # Banner
2
+
3
+ `Banner` presents short product announcements, notices, or lightweight calls to action.
4
+
5
+ Figma reference: `Design system 3.0 Copy / Banner`, node `237:39513`.
6
+
7
+ ## Variants
8
+
9
+ The implementation covers the Banner matrix from Figma:
10
+
11
+ | Prop | Values |
12
+ | --- | --- |
13
+ | `type` | `slim`, `single-action-inline`, `single-action`, `input` |
14
+ | `size` | `floating`, `full-width` |
15
+ | `content` | `title`, `title-description` |
16
+ | `color` | `brand`, `grey`, `brand-light` |
17
+ | `dir` | `ltr`, `rtl` |
18
+
19
+ ## API
20
+
21
+ ```tsx
22
+ <Banner
23
+ type="single-action"
24
+ size="floating"
25
+ content="title"
26
+ color="brand"
27
+ dir="ltr"
28
+ />
29
+ ```
30
+
31
+ | Prop | Default |
32
+ | --- | --- |
33
+ | `title` | localized demo title |
34
+ | `description` | localized demo description |
35
+ | `linkLabel` | `Link button` |
36
+ | `actionLabel` | `Button` |
37
+ | `inputPlaceholder` | `Placeholder` |
38
+ | `showIcon` | `true` |
39
+ | `showInlineAction` | `true` |
40
+ | `onAction` | none |
41
+ | `onClose` | none |
42
+
43
+ ## Pixel Rules
44
+
45
+ - Root padding is `12px 16px`.
46
+ - Slim title rows are `48px`; slim title-description rows are `52px`.
47
+ - Single-action, inline-action, and input rows are `60px`.
48
+ - Floating rows use `10px` radius; full-width rows have square edges.
49
+ - The leading glyph is `18px` in a `20px` slot; the close glyph remains `16px`.
50
+ - Action controls and text inputs are `36px` tall with `8px` radius.
51
+ - LTR body text uses `15px / 24px`. RTL title-only body text uses `12px / 16px`.
52
+ - Title-description content uses a semibold title, a `17px / 28px` separator dot, and regular description text.
53
+
54
+ ## Token Contract
55
+
56
+ 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.
57
+
58
+ - Backgrounds: `--bh-bg-brand-default`, `--bh-bg-brand-soft`, `--bh-bg-muted`, `--bh-bg-always-white`
59
+ - Content: `--bh-content-default`, `--bh-content-inverse`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-subtle`
60
+ - Borders: `--bh-border-subtle`, `--bh-border-input`
61
+ - Shape: `--bh-control-default`, `--bh-radius-lg-8`, `--bh-radius-xl-10`
62
+ - Space: `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`, `--bh-space-3xl-16`
63
+
64
+ ## Accessibility
65
+
66
+ - The banner root exposes an `aria-label`.
67
+ - Link, action, and close affordances are real buttons.
68
+ - The input variant uses a real text input with an `aria-label`.
69
+ - RTL is controlled through `dir="rtl"` so icon, text, action, input, and close placement mirror logically.
70
+
71
+ ## Install
72
+
73
+ ```bash
74
+ npx banhaten add banner
75
+ ```
76
+
77
+ ## Examples
78
+
79
+ Primary registry example: `examples/expanded/banner-demo.tsx`.
80
+
81
+ Open the live component page or run `npx banhaten docs banner` to inspect source files, install command, and examples.
82
+
83
+ ## RTL Rules
84
+
85
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
86
+
87
87
  <!-- registry-contract:start -->
88
88
  ## Registry Contract
89
89