banhaten 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/CONTRIBUTING.md +44 -0
  3. package/README.md +145 -328
  4. package/SECURITY.md +15 -0
  5. package/banhaten.config.example.json +1 -3
  6. package/docs/design-system/README.md +20 -0
  7. package/docs/design-system/adoption-quality-remediation.md +87 -0
  8. package/docs/design-system/agent-usage.md +13 -0
  9. package/docs/design-system/appearance-presets.md +189 -0
  10. package/docs/design-system/appearances/default.md +94 -0
  11. package/docs/design-system/appearances/rounded.md +95 -0
  12. package/docs/design-system/appearances/sharp.md +95 -0
  13. package/docs/design-system/component-docs-pattern.md +81 -0
  14. package/docs/design-system/component-showcase-consistency-report.md +217 -0
  15. package/docs/design-system/component-token-consistency-audit.md +173 -0
  16. package/docs/design-system/components/README.md +75 -0
  17. package/docs/design-system/components/accordion.md +67 -0
  18. package/docs/design-system/components/activity-feed.md +106 -0
  19. package/docs/design-system/components/alert-dialog.md +87 -0
  20. package/docs/design-system/components/alert.md +111 -0
  21. package/docs/design-system/components/aspect-ratio.md +59 -0
  22. package/docs/design-system/components/attribute.md +103 -0
  23. package/docs/design-system/components/autocomplete.md +93 -0
  24. package/docs/design-system/components/avatar.md +70 -0
  25. package/docs/design-system/components/badge.md +72 -0
  26. package/docs/design-system/components/banner.md +99 -0
  27. package/docs/design-system/components/breadcrumbs.md +188 -0
  28. package/docs/design-system/components/button-group.md +117 -0
  29. package/docs/design-system/components/button.md +95 -0
  30. package/docs/design-system/components/card.md +95 -0
  31. package/docs/design-system/components/carousel.md +61 -0
  32. package/docs/design-system/components/catalog-components.md +59 -0
  33. package/docs/design-system/components/chart.md +58 -0
  34. package/docs/design-system/components/checkbox.md +68 -0
  35. package/docs/design-system/components/collapsible.md +63 -0
  36. package/docs/design-system/components/command.md +75 -0
  37. package/docs/design-system/components/context-menu.md +59 -0
  38. package/docs/design-system/components/date-picker.md +97 -0
  39. package/docs/design-system/components/divider.md +117 -0
  40. package/docs/design-system/components/empty-state.md +72 -0
  41. package/docs/design-system/components/field.md +86 -0
  42. package/docs/design-system/components/file-upload.md +199 -0
  43. package/docs/design-system/components/hover-card.md +61 -0
  44. package/docs/design-system/components/icons.md +48 -0
  45. package/docs/design-system/components/input-group.md +73 -0
  46. package/docs/design-system/components/input-otp.md +73 -0
  47. package/docs/design-system/components/input.md +84 -0
  48. package/docs/design-system/components/item.md +72 -0
  49. package/docs/design-system/components/kbd.md +62 -0
  50. package/docs/design-system/components/label.md +64 -0
  51. package/docs/design-system/components/menu.md +76 -0
  52. package/docs/design-system/components/menubar.md +60 -0
  53. package/docs/design-system/components/modal.md +119 -0
  54. package/docs/design-system/components/native-select.md +70 -0
  55. package/docs/design-system/components/navigation-menu.md +63 -0
  56. package/docs/design-system/components/onboarding-step-list-item.md +94 -0
  57. package/docs/design-system/components/page-header.md +98 -0
  58. package/docs/design-system/components/pagination.md +71 -0
  59. package/docs/design-system/components/popover.md +77 -0
  60. package/docs/design-system/components/progress-slider.md +66 -0
  61. package/docs/design-system/components/progress.md +92 -0
  62. package/docs/design-system/components/radio-card.md +65 -0
  63. package/docs/design-system/components/radio-group.md +72 -0
  64. package/docs/design-system/components/resizable.md +57 -0
  65. package/docs/design-system/components/scroll-area.md +60 -0
  66. package/docs/design-system/components/segmented-control.md +71 -0
  67. package/docs/design-system/components/select.md +87 -0
  68. package/docs/design-system/components/sheet.md +82 -0
  69. package/docs/design-system/components/sidebar.md +83 -0
  70. package/docs/design-system/components/skeleton.md +91 -0
  71. package/docs/design-system/components/slideout.md +77 -0
  72. package/docs/design-system/components/slider.md +81 -0
  73. package/docs/design-system/components/social-button.md +65 -0
  74. package/docs/design-system/components/spinner.md +77 -0
  75. package/docs/design-system/components/steps.md +77 -0
  76. package/docs/design-system/components/table.md +411 -0
  77. package/docs/design-system/components/tabs.md +69 -0
  78. package/docs/design-system/components/tag.md +95 -0
  79. package/docs/design-system/components/textarea.md +64 -0
  80. package/docs/design-system/components/timeline.md +95 -0
  81. package/docs/design-system/components/toast.md +73 -0
  82. package/docs/design-system/components/toggle.md +96 -0
  83. package/docs/design-system/components/toolbar.md +105 -0
  84. package/docs/design-system/components/tooltip.md +107 -0
  85. package/docs/design-system/components/typography.md +18 -0
  86. package/docs/design-system/density-and-elevation.md +44 -0
  87. package/docs/design-system/design-system-test-missing-items.md +368 -0
  88. package/docs/design-system/direction-and-localization.md +23 -0
  89. package/docs/design-system/form-recipes.md +73 -0
  90. package/docs/design-system/gap-promotion-policy.md +21 -0
  91. package/docs/design-system/gap-promotion-report.md +166 -0
  92. package/docs/design-system/icons.md +69 -0
  93. package/docs/design-system/installation.md +68 -0
  94. package/docs/design-system/launch-comparison-shadcn.md +98 -0
  95. package/docs/design-system/registry-and-cli.md +64 -0
  96. package/docs/design-system/release-policy.md +30 -0
  97. package/docs/design-system/roadmap.md +14 -0
  98. package/docs/design-system/support-matrix.md +23 -0
  99. package/docs/design-system/tabs.md +53 -0
  100. package/docs/design-system/token-governance.md +60 -0
  101. package/package.json +97 -65
  102. package/registry/component-contract.json +40 -0
  103. package/registry/components/alert-dialog.tsx +297 -0
  104. package/registry/components/alert.tsx +86 -65
  105. package/registry/components/aspect-ratio.tsx +30 -0
  106. package/registry/components/autocomplete.tsx +23 -9
  107. package/registry/components/avatar.tsx +7 -7
  108. package/registry/components/badge.tsx +1 -1
  109. package/registry/components/button-group.tsx +321 -4
  110. package/registry/components/button.tsx +38 -17
  111. package/registry/components/card.tsx +68 -59
  112. package/registry/components/carousel.tsx +282 -0
  113. package/registry/components/chart.tsx +203 -0
  114. package/registry/components/checkbox.tsx +3 -3
  115. package/registry/components/collapsible.tsx +69 -0
  116. package/registry/components/command.tsx +174 -0
  117. package/registry/components/context-menu.tsx +236 -0
  118. package/registry/components/date-picker.tsx +246 -105
  119. package/registry/components/expanded/ActivityFeed.tsx +6 -15
  120. package/registry/components/expanded/Banner.tsx +3 -3
  121. package/registry/components/expanded/Breadcrumbs.tsx +5 -5
  122. package/registry/components/expanded/CatalogComponentsShowcase.tsx +13 -13
  123. package/registry/components/expanded/CatalogDivider.tsx +1 -1
  124. package/registry/components/expanded/EmptyState.tsx +1 -1
  125. package/registry/components/expanded/FileUpload.tsx +9 -2
  126. package/registry/components/expanded/OnboardingStepListItem.tsx +2 -4
  127. package/registry/components/expanded/PageHeader.tsx +14 -14
  128. package/registry/components/expanded/Slideout.tsx +15 -415
  129. package/registry/components/expanded/Steps.tsx +4 -4
  130. package/registry/components/expanded/Table.tsx +116 -69
  131. package/registry/components/expanded/Timeline.tsx +3 -3
  132. package/registry/components/expanded/activityFeed.css +1 -1
  133. package/registry/components/expanded/breadcrumbs.css +139 -139
  134. package/registry/components/expanded/catalogComponentsShowcase.css +83 -83
  135. package/registry/components/expanded/divider.css +1 -1
  136. package/registry/components/expanded/emptyState.css +1 -1
  137. package/registry/components/expanded/fileUpload.css +6 -6
  138. package/registry/components/expanded/slideout.css +9 -685
  139. package/registry/components/expanded/steps.css +274 -274
  140. package/registry/components/expanded/table.css +2 -2
  141. package/registry/components/expanded/timeline.css +264 -264
  142. package/registry/components/field.tsx +230 -0
  143. package/registry/components/hover-card.tsx +48 -0
  144. package/registry/components/input-content.ts +1 -0
  145. package/registry/components/input-group.tsx +130 -0
  146. package/registry/components/input-otp.tsx +13 -3
  147. package/registry/components/input.tsx +70 -45
  148. package/registry/components/item.tsx +189 -0
  149. package/registry/components/kbd.tsx +151 -0
  150. package/registry/components/label.tsx +78 -0
  151. package/registry/components/menu.tsx +34 -246
  152. package/registry/components/menubar.tsx +226 -0
  153. package/registry/components/modal.tsx +216 -143
  154. package/registry/components/native-select.tsx +205 -0
  155. package/registry/components/navigation-menu.tsx +171 -0
  156. package/registry/components/pagination.tsx +80 -58
  157. package/registry/components/popover.tsx +162 -664
  158. package/registry/components/radio-card.tsx +116 -87
  159. package/registry/components/radio-group.tsx +1 -1
  160. package/registry/components/resizable.tsx +74 -0
  161. package/registry/components/scroll-area.tsx +67 -0
  162. package/registry/components/segmented-control.tsx +87 -0
  163. package/registry/components/select-content.tsx +2 -2
  164. package/registry/components/select.tsx +54 -20
  165. package/registry/components/sheet.tsx +305 -0
  166. package/registry/components/sidebar.tsx +352 -0
  167. package/registry/components/skeleton.css +0 -3
  168. package/registry/components/social-button.tsx +116 -30
  169. package/registry/components/spinner.tsx +18 -55
  170. package/registry/components/{expanded/tabs.css → tabs.css} +127 -106
  171. package/registry/components/tabs.tsx +246 -0
  172. package/registry/components/tag.tsx +2 -2
  173. package/registry/components/textarea.tsx +4 -4
  174. package/registry/components/toast.tsx +136 -0
  175. package/registry/components/toggle.tsx +2 -2
  176. package/registry/components/toolbar.tsx +89 -17
  177. package/registry/components/tooltip.tsx +1 -1
  178. package/registry/examples/alert-demo.tsx +25 -5
  179. package/registry/examples/alert-dialog-demo.tsx +42 -0
  180. package/registry/examples/aspect-ratio-demo.tsx +11 -0
  181. package/registry/examples/attribute-demo.tsx +1 -1
  182. package/registry/examples/autocomplete-demo.tsx +3 -3
  183. package/registry/examples/avatar-demo.tsx +7 -7
  184. package/registry/examples/badge-demo.tsx +1 -1
  185. package/registry/examples/button-demo.tsx +6 -6
  186. package/registry/examples/button-group-demo.tsx +23 -2
  187. package/registry/examples/card-demo.tsx +46 -8
  188. package/registry/examples/carousel-demo.tsx +43 -0
  189. package/registry/examples/chart-demo.tsx +33 -0
  190. package/registry/examples/checkbox-demo.tsx +5 -5
  191. package/registry/examples/collapsible-demo.tsx +16 -0
  192. package/registry/examples/collection-filter-bar-demo.tsx +135 -0
  193. package/registry/examples/command-demo.tsx +42 -0
  194. package/registry/examples/{expanded/command-bar-demo.tsx → command-palette-demo.tsx} +5 -15
  195. package/registry/examples/context-menu-demo.tsx +29 -0
  196. package/registry/examples/control-density-contract-demo.tsx +61 -0
  197. package/registry/examples/date-picker-demo.tsx +12 -12
  198. package/registry/examples/divider-demo.tsx +3 -3
  199. package/registry/examples/expanded/banner-demo.tsx +1 -1
  200. package/registry/examples/expanded/breadcrumbs-demo.tsx +1 -1
  201. package/registry/examples/expanded/empty-state-demo.tsx +1 -1
  202. package/registry/examples/expanded/file-upload-demo.tsx +1 -1
  203. package/registry/examples/expanded/onboarding-step-demo.tsx +1 -1
  204. package/registry/examples/expanded/slideout-demo.tsx +2 -2
  205. package/registry/examples/expanded/steps-demo.tsx +1 -1
  206. package/registry/examples/expanded/tabs-demo.tsx +2 -2
  207. package/registry/examples/expanded/timeline-demo.tsx +1 -1
  208. package/registry/examples/field-demo.tsx +51 -0
  209. package/registry/examples/hover-card-demo.tsx +23 -0
  210. package/registry/examples/input-demo.tsx +6 -6
  211. package/registry/examples/input-group-demo.tsx +16 -0
  212. package/registry/examples/input-otp-demo.tsx +4 -4
  213. package/registry/examples/item-demo.tsx +46 -0
  214. package/registry/examples/kbd-demo.tsx +11 -0
  215. package/registry/examples/label-demo.tsx +20 -0
  216. package/registry/examples/menu-demo.tsx +1 -1
  217. package/registry/examples/menubar-demo.tsx +34 -0
  218. package/registry/examples/modal-demo.tsx +67 -9
  219. package/registry/examples/native-select-demo.tsx +16 -0
  220. package/registry/examples/navigation-menu-demo.tsx +29 -0
  221. package/registry/examples/pagination-demo.tsx +6 -3
  222. package/registry/examples/popover-demo.tsx +19 -19
  223. package/registry/examples/progress-demo.tsx +1 -1
  224. package/registry/examples/progress-slider-demo.tsx +1 -1
  225. package/registry/examples/radio-card-demo.tsx +4 -4
  226. package/registry/examples/radio-group-demo.tsx +2 -2
  227. package/registry/examples/resizable-demo.tsx +22 -0
  228. package/registry/examples/results-toolbar-demo.tsx +44 -0
  229. package/registry/examples/scroll-area-demo.tsx +15 -0
  230. package/registry/examples/segmented-control-demo.tsx +39 -0
  231. package/registry/examples/select-demo.tsx +1 -1
  232. package/registry/examples/sheet-demo.tsx +47 -0
  233. package/registry/examples/sidebar-demo.tsx +55 -0
  234. package/registry/examples/slider-demo.tsx +3 -3
  235. package/registry/examples/social-button-demo.tsx +18 -8
  236. package/registry/examples/spinner-demo.tsx +13 -13
  237. package/registry/examples/tabs-demo.tsx +13 -0
  238. package/registry/examples/tag-demo.tsx +1 -1
  239. package/registry/examples/textarea-demo.tsx +4 -4
  240. package/registry/examples/toast-demo.tsx +35 -0
  241. package/registry/examples/toggle-demo.tsx +6 -6
  242. package/registry/examples/tooltip-demo.tsx +4 -4
  243. package/registry/guidance/USAGE.md +27 -0
  244. package/registry/hooks/use-direction.ts +193 -13
  245. package/registry/index.json +6010 -432
  246. package/registry/styles/globals.css +3112 -4690
  247. package/registry.json +1582 -0
  248. package/schema/config.schema.json +51 -0
  249. package/schema/registry.schema.json +190 -0
  250. package/schema/tokens.schema.json +163 -0
  251. package/src/cli/command-line.js +194 -0
  252. package/src/cli/config-editors.js +9 -0
  253. package/src/cli/doctor.js +399 -0
  254. package/src/cli/file-transaction.js +295 -0
  255. package/src/cli/global-css.js +153 -0
  256. package/src/cli/index.js +639 -1391
  257. package/src/cli/install-plan.js +592 -0
  258. package/src/cli/install-receipt.js +171 -0
  259. package/src/cli/jsonc.js +203 -0
  260. package/src/cli/package-install-state.js +254 -0
  261. package/src/cli/package-manager.js +238 -0
  262. package/src/cli/package-plan.js +185 -0
  263. package/src/cli/package-version.js +97 -0
  264. package/src/cli/registry-query.js +207 -0
  265. package/src/cli/reporting.js +55 -0
  266. package/src/cli/schema-validation.js +19 -0
  267. package/src/cli/source-scanner.js +686 -0
  268. package/src/cli/vite-config.js +478 -0
  269. package/tokens/banhaten.tokens.json +4313 -310
  270. package/registry/assets/avatars/avatar-02.jpg +0 -0
  271. package/registry/assets/avatars/avatar-03.jpg +0 -0
  272. package/registry/assets/avatars/avatar-04.jpg +0 -0
  273. package/registry/assets/avatars/avatar-05.jpg +0 -0
  274. package/registry/assets/avatars/avatar-06.jpg +0 -0
  275. package/registry/assets/avatars/avatar-07.jpg +0 -0
  276. package/registry/assets/avatars/avatar-08.jpg +0 -0
  277. package/registry/assets/avatars/avatar-09.jpg +0 -0
  278. package/registry/assets/avatars/avatar-10.jpg +0 -0
  279. package/registry/assets/avatars/avatar-11.jpg +0 -0
  280. package/registry/assets/avatars/avatar-12.jpg +0 -0
  281. package/registry/assets/avatars/avatar-13.jpg +0 -0
  282. package/registry/assets/avatars/avatar-14.jpg +0 -0
  283. package/registry/assets/avatars/avatar-15.jpg +0 -0
  284. package/registry/assets/avatars/avatar-16.jpg +0 -0
  285. package/registry/assets/avatars/avatar-17.jpg +0 -0
  286. package/registry/assets/avatars/avatar-18.jpg +0 -0
  287. package/registry/assets/avatars/avatar-19.jpg +0 -0
  288. package/registry/assets/avatars/avatar-20.jpg +0 -0
  289. package/registry/assets/avatars/avatar-21.jpg +0 -0
  290. package/registry/assets/avatars/avatar-22.jpg +0 -0
  291. package/registry/assets/avatars/avatar-23.jpg +0 -0
  292. package/registry/assets/avatars/avatar-24.jpg +0 -0
  293. package/registry/assets/avatars/avatar-25.jpg +0 -0
  294. package/registry/assets/avatars/avatar-26.jpg +0 -0
  295. package/registry/assets/avatars/avatar-27.jpg +0 -0
  296. package/registry/assets/avatars/avatar-28.jpg +0 -0
  297. package/registry/assets/avatars/avatar-29.jpg +0 -0
  298. package/registry/assets/avatars/avatar-30.jpg +0 -0
  299. package/registry/assets/avatars/avatar-31.jpg +0 -0
  300. package/registry/assets/avatars/avatar-32.jpg +0 -0
  301. package/registry/assets/avatars/avatar-33.jpg +0 -0
  302. package/registry/assets/avatars/avatar-34.jpg +0 -0
  303. package/registry/assets/avatars/avatar-35.jpg +0 -0
  304. package/registry/assets/image-assets.json +0 -744
  305. package/registry/assets/images/art-02.jpg +0 -0
  306. package/registry/assets/images/art-03.jpg +0 -0
  307. package/registry/assets/images/art-04.jpg +0 -0
  308. package/registry/assets/images/art-05.jpg +0 -0
  309. package/registry/assets/images/art-06.jpg +0 -0
  310. package/registry/assets/images/art-07.jpg +0 -0
  311. package/registry/assets/images/art-08.jpg +0 -0
  312. package/registry/assets/images/art-09.jpg +0 -0
  313. package/registry/assets/images/art-10.jpg +0 -0
  314. package/registry/assets/images/art-11.jpg +0 -0
  315. package/registry/assets/images/art-12.jpg +0 -0
  316. package/registry/assets/images/art-13.jpg +0 -0
  317. package/registry/assets/images/art-14.jpg +0 -0
  318. package/registry/assets/images/art-15.jpg +0 -0
  319. package/registry/assets/images/art-16.jpg +0 -0
  320. package/registry/assets/images/art-17.jpg +0 -0
  321. package/registry/assets/images/art-18.jpg +0 -0
  322. package/registry/assets/images/art-19.jpg +0 -0
  323. package/registry/assets/images/art-20.jpg +0 -0
  324. package/registry/assets/images/art-21.jpg +0 -0
  325. package/registry/assets/images/art-22.jpg +0 -0
  326. package/registry/assets/images/art-23.jpg +0 -0
  327. package/registry/assets/images/art-24.jpg +0 -0
  328. package/registry/assets/images/art-25.jpg +0 -0
  329. package/registry/assets/images/art-26.jpg +0 -0
  330. package/registry/assets/images/art-27.jpg +0 -0
  331. package/registry/assets/images/nature-01.jpg +0 -0
  332. package/registry/assets/images/nature-02.jpg +0 -0
  333. package/registry/assets/images/nature-03.jpg +0 -0
  334. package/registry/assets/images/nature-04.jpg +0 -0
  335. package/registry/assets/images/nature-05.jpg +0 -0
  336. package/registry/assets/images/nature-06.jpg +0 -0
  337. package/registry/assets/images/nature-07.jpg +0 -0
  338. package/registry/assets/images/nature-08.jpg +0 -0
  339. package/registry/assets/images/nature-09.jpg +0 -0
  340. package/registry/assets/images/nature-10.jpg +0 -0
  341. package/registry/assets/images/nature-11.jpg +0 -0
  342. package/registry/assets/images/nature-12.jpg +0 -0
  343. package/registry/assets/images/nature-13.jpg +0 -0
  344. package/registry/assets/images/nature-14.jpg +0 -0
  345. package/registry/assets/images/nature-15.jpg +0 -0
  346. package/registry/assets/images/nature-16.jpg +0 -0
  347. package/registry/assets/images/nature-17.jpg +0 -0
  348. package/registry/assets/images/nature-18.jpg +0 -0
  349. package/registry/assets/images/nature-19.jpg +0 -0
  350. package/registry/assets/images/nature-20.jpg +0 -0
  351. package/registry/components/expanded/BannerBoard.tsx +0 -225
  352. package/registry/components/expanded/CatalogTag.tsx +0 -85
  353. package/registry/components/expanded/CommandBar.tsx +0 -386
  354. package/registry/components/expanded/IconExplorer.tsx +0 -612
  355. package/registry/components/expanded/Tabs.tsx +0 -86
  356. package/registry/components/expanded/TimelineShowcase.tsx +0 -158
  357. package/registry/components/expanded/commandBar.css +0 -470
  358. package/registry/components/expanded/iconExplorer.css +0 -764
  359. package/registry/components/expanded/iconPacks.ts +0 -866
  360. package/registry/components/expanded/tag.css +0 -148
  361. package/registry/examples/expanded/icons-demo.tsx +0 -5
  362. package/tokens/Color mode.zip +0 -0
  363. package/tokens/Numbers.zip +0 -0
  364. package/tokens/Radius.zip +0 -0
  365. package/tokens/Theme.zip +0 -0
@@ -0,0 +1,217 @@
1
+ # Component Showcase Consistency Report
2
+
3
+ Date: 2026-06-16
4
+
5
+ ## Purpose
6
+
7
+ This report audits how registry-backed Banhaten components are presented across the playground and docs. The immediate question was whether `Button` is the most complete example and whether the rest of the components should be made consistent with it.
8
+
9
+ ## Short Answer
10
+
11
+ `Button` is the strongest content baseline, but it is not ready to be copied as the implementation template.
12
+
13
+ Use `Button` as the reference for what a complete component page should explain: install, usage, examples, composition, API, RTL, states, variants, sizes, and token/effect readouts. Use the shared `RegistryComponentDocs` renderer as the scalable page skeleton, then attach optional deep reference sections when the component needs visual matrices, state grids, size scales, or token readouts.
14
+
15
+ ## Checks Run
16
+
17
+ - `npm exec -- tsc -p tsconfig.json --noEmit` from `playground` passed.
18
+ - `npm --prefix playground run test:docs` passed.
19
+ - Component docs coverage audit passed for 41 registry-backed pages.
20
+ - `catalog-components` is intentionally covered as a registry bundle alias.
21
+ - `npm run registry:check` passed.
22
+ - Registry mirrors and expanded ownership match across 149 files.
23
+
24
+ ## Current Inventory
25
+
26
+ - Registry items: 42 total.
27
+ - Core items: 28.
28
+ - Expanded items: 14.
29
+ - Playground pages: 41 registry-backed pages plus 1 bundle-only registry item.
30
+ - Pages using shared `RegistryComponentDocs`: 32.
31
+ - Interactive inspector sections rendered on component pages: 0. The previous custom inspector panels and shared inspector helper were removed from the playground.
32
+ - Bespoke pages with hand-authored docs navigation: 9.
33
+ - Components with markdown docs in `docs/design-system/components` or known top-level docs: 27 of 42.
34
+ - Components with registry RTL metadata: 27 of 42.
35
+
36
+ ## Recommended Standard
37
+
38
+ Every public component page should use this consistent pattern:
39
+
40
+ 1. Page header with short component purpose.
41
+ 2. Above-the-fold live preview:
42
+ - Small title and concise subtitle.
43
+ - The real component visible immediately without scrolling past long prose.
44
+ - A vertical stack of example cards so wide components, such as tables, do not get squeezed into a two-column preview.
45
+ - English/LTR example first, then Arabic/RTL directly below it for every component where direction, copy, icon placement, or layout can change.
46
+ 3. Shared registry docs:
47
+ - Preview
48
+ - Installation
49
+ - Usage
50
+ - Examples
51
+ - Composition
52
+ - API Reference
53
+ - RTL Behavior
54
+ - Live Variants
55
+ 4. Visual reference, state matrix, size scale, placement matrix, or token reference rendered from live components when deeper inspection is useful.
56
+ 5. No interactive inspector section in the component page body.
57
+ 6. Registry metadata that matches the real source, example, and playground spec.
58
+ 7. Markdown docs linked from the component docs index when the component is public.
59
+ 8. Tests that catch missing docs routes, registry mirror drift, and obvious source/metadata drift.
60
+
61
+ ## Button Baseline Audit
62
+
63
+ ### What Button Does Well
64
+
65
+ `Button` is currently the most complete component page by depth. It has:
66
+
67
+ - Installation, usage, example, composition, API, RTL, visual reference, size scale, state matrix, and shadow reference sections.
68
+ - Rich examples for variants, sizes, icons, loading, `asChild`, and RTL.
69
+ - Token readouts for fill, text, stroke, effects, geometry, and typography.
70
+ - Registry demo coverage for variants, text sizes, icon sizes, icon placement, loading, and RTL.
71
+
72
+ ### What Button Is Missing Or Inconsistent
73
+
74
+ - Registry size metadata now matches the implementation and examples, including `xl` and `icon-xl`.
75
+ - Source supports compatibility variants that are not part of the visible registry contract: `destructive`, `soft-destructive`, `success`, `warning`, and `link`. Decide whether these are public aliases, deprecated aliases, or should be removed.
76
+ - Button now has a component markdown page and is listed in the component docs index.
77
+ - The interactive inspector has been removed from the Button page, matching the new page direction.
78
+ - The page is a high-quality bespoke file rather than a scalable shared template. Copying it component by component would increase drift.
79
+ - Test coverage only smoke-renders a basic Button. It does not assert the variant/size contract, `asChild`, loading composition, icon sizing, or source/metadata parity.
80
+
81
+ ### Verdict
82
+
83
+ Button should be the content-quality model, not the code-shape model. Its opening preview, registry size metadata, and component markdown docs now match the proposed standard. The remaining work is the source-supported alias policy and a metadata parity check.
84
+
85
+ ## Presentation Families
86
+
87
+ | Family | Components | Current read |
88
+ | --- | --- | --- |
89
+ | Bespoke rich docs plus deep reference | Button, Attribute, Card, Toggle, Modal, Toolbar, Slider, Progress, Alert | Most complete editorially, but highest drift risk because docs are hand-authored per page. Inspector sections should stay removed. |
90
+ | Shared registry docs plus live reference examples | Accordion, Avatar, Badge, Button Group, Checkbox, Date Picker, Divider, Input, Menu, Pagination, Progress Slider, Radio Card, Radio Group, Select, Social Button, Tag, Textarea | Best scalable direction. These already get consistent docs structure from the shared renderer and should add early examples where missing. |
91
+ | Shared registry docs plus expanded custom page | Activity Feed, Banner, Breadcrumbs, Command Bar, File Upload, Onboarding Step, Page Header, Slideout, Steps, Table, Tabs, Timeline | Consistent shell, but registry metadata is under-specified for capabilities and RTL. Expanded/core contract needs a decision. |
92
+ | Shared docs only or custom examples | Tooltip, Spinner, Icons | Acceptable for Spinner and maybe Icons. Tooltip should keep a placement/pointer matrix rather than an inspector. |
93
+ | Bundle-only registry item | Catalog Components | No direct playground page. This is fine if it remains an internal bundle alias; otherwise it needs a public docs page or should be marked as non-public. |
94
+
95
+ ## Component-by-Component Status
96
+
97
+ | Component | Status | Current presentation | Recommendation |
98
+ | --- | --- | --- | --- |
99
+ | Accordion | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
100
+ | Activity Feed | Expanded | Shared docs plus expanded custom page | Add registry capability and RTL metadata. Decide whether it is production or showcase. |
101
+ | Alert | Core | Bespoke rich docs plus deep reference | Strong page. Migrate structure into shared standard or extract page data. |
102
+ | Attribute | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; keep detailed slot/composition examples. |
103
+ | Avatar | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
104
+ | Badge | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
105
+ | Banner | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Promotion candidate for feedback components. |
106
+ | Breadcrumbs | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Promotion candidate with Page Header. |
107
+ | Button | Core | Bespoke baseline | Treat as content baseline. Keep the new above-the-fold examples; resolve variant alias policy and parity tests. |
108
+ | Button Group | Core | Shared docs plus live reference | Good scalable page. Already has markdown docs. |
109
+ | Card | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve image/layout coverage. |
110
+ | Checkbox | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
111
+ | Command Bar | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Clarify keyboard/search contract before promotion. |
112
+ | Date Picker | Core | Shared docs plus live reference | Good scalable page. Keep as shared-docs example for complex form components. |
113
+ | Divider | Core | Shared docs plus live reference | Good. Simple component can keep a lighter visual reference. |
114
+ | File Upload | Expanded | Shared docs plus expanded custom page | Add accessibility/error/queue contract before core promotion. |
115
+ | Icons | Expanded/foundation | Shared docs/explorer only | Treat as foundation tooling, not a normal component. Keep top-level docs or move into components index intentionally. |
116
+ | Input | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
117
+ | Menu | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. Confirm trigger/anchoring expectations. |
118
+ | Modal | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve ConfirmModal guardrail docs. |
119
+ | Onboarding Step | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Rename docs/page consistently around `onboarding-step` vs `onboarding-step-list-item`. |
120
+ | Page Header | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Likely app composition pattern, not primitive. |
121
+ | Pagination | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
122
+ | Progress | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve label/RTL fill coverage. |
123
+ | Progress Slider | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
124
+ | Radio Card | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. Clarify explicit RTL behavior in docs. |
125
+ | Radio Group | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
126
+ | Select | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. Good candidate for metadata parity tests because it has many item types. |
127
+ | Slideout | Expanded | Shared docs plus expanded custom page | Add focus/portal/mobile contract before core promotion. |
128
+ | Slider | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve value mode and indicator examples. |
129
+ | Social Button | Core | Shared docs plus live reference | Keep template. Add markdown docs if public and document provider-color exceptions. |
130
+ | Spinner | Core | Shared docs only | Probably acceptable as a simple primitive. Add markdown docs or explicitly mark as helper primitive. |
131
+ | Steps | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Promotion candidate. |
132
+ | Table | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Clarify Table vs DataTable public contract. |
133
+ | Tabs | Expanded | Shared docs plus expanded custom page | Move or link top-level `docs/design-system/tabs.md` from the component index. Promotion candidate. |
134
+ | Tag | Core | Shared docs plus live reference | Good scalable page. Already has markdown docs. |
135
+ | Textarea | Core | Shared docs plus live reference | Keep template. Add markdown docs if public. |
136
+ | Timeline | Expanded | Shared docs plus expanded custom page | Add capability and RTL metadata. Clarify event/progress variants before promotion. |
137
+ | Toggle | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve labeled field composition. |
138
+ | Toolbar | Core | Bespoke rich docs plus deep reference | Strong page. Migrate to shared standard; preserve responsive/filter examples. |
139
+ | Tooltip | Core | Shared docs plus custom pointer examples | Keep the placement matrix as the equivalent deep reference. Already has markdown docs. |
140
+ | Catalog Components | Expanded bundle | No playground page | Mark private/bundle-only, keep alias coverage, or create a real public docs page. |
141
+
142
+ ## Cross-Cutting Gaps
143
+
144
+ ### P0: Fix Contract Drift
145
+
146
+ - Decide the public/deprecated status of Button compatibility variants: `destructive`, `soft-destructive`, `success`, `warning`, and `link`.
147
+ - Add a parity check that compares registry metadata values against obvious exported spec/example usage for variants and sizes.
148
+
149
+ ### P0: Pick One Page Standard
150
+
151
+ Adopt this as the canonical implementation pattern:
152
+
153
+ - Above-the-fold hero preview that shows the component immediately after the title/subtitle.
154
+ - Early stacked examples: English/LTR first, Arabic/RTL directly below when the component can reasonably render Arabic copy or direction-aware layout.
155
+ - Shared `RegistryComponentDocs` for the common docs surface.
156
+ - Optional "Deep Reference" section for state matrices, size scales, pointer matrices, token readouts, and layout grids.
157
+
158
+ This keeps the consistency of the shared renderer while preserving the richness of Button/Slider/Modal-style pages.
159
+
160
+ ### P1: Normalize Markdown Docs
161
+
162
+ The component docs index currently covers only part of the registry surface. Public components missing component markdown docs are:
163
+
164
+ - Accordion
165
+ - Avatar
166
+ - Badge
167
+ - Checkbox
168
+ - Input
169
+ - Menu
170
+ - Pagination
171
+ - Progress Slider
172
+ - Radio Card
173
+ - Radio Group
174
+ - Select
175
+ - Social Button
176
+ - Spinner
177
+ - Textarea
178
+ - Catalog Components, if public
179
+
180
+ Tabs and Icons have top-level docs, but not under `docs/design-system/components`. Either link them explicitly from the component index or move them under the components directory.
181
+
182
+ ### P1: Fill Expanded Metadata
183
+
184
+ Expanded components often show RTL and multiple states in demos, but their registry metadata does not expose RTL or capability keys. Add metadata for:
185
+
186
+ - Activity Feed
187
+ - Banner
188
+ - Breadcrumbs
189
+ - Command Bar
190
+ - File Upload
191
+ - Onboarding Step
192
+ - Page Header
193
+ - Slideout
194
+ - Steps
195
+ - Table
196
+ - Tabs
197
+ - Timeline
198
+
199
+ This makes the shared API/RTL sections truthful instead of generic.
200
+
201
+ ### P1: Define Simple-Component Exceptions
202
+
203
+ Spinner probably does not need a deep reference section. Icons is closer to foundation tooling than a reusable component primitive. These exceptions should be explicit so they do not look accidentally incomplete.
204
+
205
+ ### P2: Migrate Bespoke Pages Gradually
206
+
207
+ Do not rewrite the best pages all at once. Start with one or two:
208
+
209
+ 1. Button: fix metadata and use it to define the standard.
210
+ 2. Alert or Progress: migrate a smaller bespoke rich page to validate the shared-plus-reference pattern.
211
+ 3. Modal or Slider: migrate a complex page once the pattern feels stable.
212
+
213
+ ## Suggested Decision
214
+
215
+ Make Button the quality bar, but make `above-the-fold examples + RegistryComponentDocs + optional Deep Reference` the page architecture. Then measure every component against that architecture.
216
+
217
+ That gives us a consistent system without losing the parts that make the Button page valuable.
@@ -0,0 +1,173 @@
1
+ # Component Token Consistency Audit
2
+
3
+ Date: 2026-06-13
4
+
5
+ ## Scope
6
+
7
+ Reviewed the distributable component surface in `registry/components`, expanded component files in `registry/components/expanded`, generated/global token CSS in `registry/styles/globals.css`, token generation and contract scripts, and the playground mirrors.
8
+
9
+ This audit is focused on whether component color, spacing, sizing, radius, typography, opacity, focus, z-index, shadow, and motion values are driven by Banhaten tokens or documented component aliases.
10
+
11
+ ## Checks Run
12
+
13
+ - `npm run tokens:check` passed.
14
+ - `npm run registry:check` passed.
15
+ - `npm --prefix playground run test:components` passed with 97 component tests.
16
+
17
+ Current automated coverage:
18
+
19
+ - The token catalog compiler merges the owned `tokens/source/` fragments into
20
+ `tokens/banhaten.tokens.json`; `scripts/generate-token-css.mjs` combines that
21
+ compiled contract with `tokens/banhaten.utilities.css` and emits
22
+ `registry/styles/globals.css` without reading either generated output as an
23
+ authored input.
24
+ - `scripts/check-token-css-reproducibility.mjs` runs the generator in a clean temporary tree with no previous `globals.css` and verifies equivalent generated content after line-ending normalization.
25
+ - `scripts/check-token-contract.mjs` verifies those component aliases exist in the generated CSS.
26
+ - `scripts/check-component-token-usage.mjs` scans `registry/components` for raw component-source values.
27
+ - `scripts/check-registry-mirrors.mjs` verifies playground mirrors stay in sync with registry files.
28
+
29
+ ## Current Status
30
+
31
+ The component library is mostly token-consistent now. The major items from the previous audit have been completed:
32
+
33
+ - Component aliases have explicit owners under `tokens/source/` and compile into
34
+ one publication artifact; JavaScript no longer carries a second token source.
35
+ - Tailwind mappings, keyframes, global rules, accessibility rules, and typography utilities are authored in `tokens/banhaten.utilities.css`; generated CSS is output-only.
36
+ - Generated CSS is current.
37
+ - Component aliases are contract-checked.
38
+ - Registry component source passes the token-usage check.
39
+ - Registry and playground mirrors match.
40
+ - Core focus, z-index, duration, spacing, radius, typography, icon sizing, and common opacity patterns are now tokenized.
41
+
42
+ The remaining changes are smaller consistency and governance items.
43
+
44
+ ## Required Changes
45
+
46
+ ### P1: Replace Remaining Raw `opacity-0` Utilities
47
+
48
+ `--bh-opacity-0` already exists, and most components use tokenized opacity. Replace the remaining Tailwind raw zero-opacity utilities with token-backed forms:
49
+
50
+ - `registry/components/date-picker.tsx`: replace `disabled:opacity-0` with `disabled:opacity-[var(--bh-opacity-0)]`.
51
+ - `registry/components/radio-group.tsx`: replace the hidden input `opacity-0` with `opacity-[var(--bh-opacity-0)]`.
52
+ - `registry/components/textarea.tsx`: replace `after:opacity-0` with `after:opacity-[var(--bh-opacity-0)]`.
53
+ - Sync mirrors through `npm run registry:sync` or the existing mirror workflow.
54
+
55
+ This is not a visual bug, but it is a token-discipline cleanup.
56
+
57
+ ### P1: Tighten The Token-Usage Check For Zero And Full Opacity
58
+
59
+ `scripts/check-component-token-usage.mjs` currently flags raw Tailwind opacity only for `50`, `55`, `60`, and `70`. Extend that rule so component source also flags raw `opacity-0` and `opacity-100`, unless an explicit exception is added.
60
+
61
+ Recommended pattern target:
62
+
63
+ - Flag: `opacity-0`, `opacity-100`, `disabled:opacity-0`, `after:opacity-0`, grouped/state-prefixed variants.
64
+ - Allow: `opacity-[var(--bh-opacity-0)]`, `opacity-[var(--bh-opacity-100)]`.
65
+
66
+ ### P2: Create A Formal Exception Ledger For Non-Token Literals In Alias Source
67
+
68
+ Raw contract values in the authored token fragments are no longer leaking into
69
+ component source. Intentional external or Figma-specific values carry a type and
70
+ stay reviewable under their canonical owner so future cleanup does not
71
+ accidentally erase brand/media fidelity.
72
+
73
+ Document as approved exceptions or promote into a clearer token group:
74
+
75
+ - Social provider colors: Facebook, Google, LinkedIn, WhatsApp.
76
+ - Radio-card illustrative/payment colors and dimensions.
77
+ - Fractional icon/media geometry such as `28.333px`, `13.333px`, and `6.364px`.
78
+ - Effect/shadow color stops, since the supplied token zips do not include effect tokens.
79
+ - Expanded layout widths and breakpoints for showcase/product-sized components.
80
+ - `--bh-activity-feed-completed-brightness: 0.99`, or replace it with a semantic completed-state color if the visual can be expressed without a brightness filter.
81
+
82
+ ### P2: Keep JS Numeric Offsets Paired With CSS Tokens
83
+
84
+ Radix APIs require numeric `sideOffset` values, so these cannot directly consume CSS variables:
85
+
86
+ - `registry/components/select.tsx` uses `SELECT_MENU_SIDE_OFFSET_PX = 4`, mirroring `--bh-select-menu-offset`.
87
+ - `registry/components/tooltip.tsx` uses pointer and pointerless numeric offsets, mirroring tooltip spacing aliases.
88
+
89
+ The comments are already present. The remaining change is to add these cases to the exception ledger or add a small assertion/test that keeps the JS numbers aligned with their matching aliases.
90
+
91
+ ### P3: Clarify Expanded Component Contract
92
+
93
+ Expanded components are registered with `status: "expanded"` and have many layout aliases, especially Icon Explorer, Table, Timeline, Steps, Catalog Components, and File Upload. Decide whether these are production component contracts or documentation/showcase layouts.
94
+
95
+ If production:
96
+
97
+ - Keep the `--bh-*` layout aliases as public component tokens.
98
+ - Add docs for which layout aliases are safe to override.
99
+ - Add them to any token documentation tables.
100
+
101
+ If documentation/showcase only:
102
+
103
+ - Mark them as documentation-level layout tokens.
104
+ - Keep them under the static token check, but document that their large fixed widths are layout constraints rather than primitive spacing tokens.
105
+
106
+ ## Component Matrix
107
+
108
+ ### Core Components
109
+
110
+ Needs token cleanup:
111
+
112
+ - Date Picker: raw `disabled:opacity-0`.
113
+ - Radio Group: raw hidden-input `opacity-0`.
114
+ - Textarea: raw focus-ring pseudo-element `after:opacity-0`.
115
+
116
+ Token-clean under current checks:
117
+
118
+ - Accordion
119
+ - Alert
120
+ - Attribute
121
+ - Avatar
122
+ - Badge
123
+ - Button
124
+ - Button Group
125
+ - Card
126
+ - Checkbox
127
+ - Divider
128
+ - Input
129
+ - Menu
130
+ - Modal
131
+ - Pagination
132
+ - Progress
133
+ - Progress Slider
134
+ - Radio Card
135
+ - Select
136
+ - Select Content
137
+ - Slider
138
+ - Social Button
139
+ - Spinner
140
+ - Tag
141
+ - Toggle
142
+ - Toolbar
143
+ - Tooltip
144
+
145
+ ### Expanded Components
146
+
147
+ No direct component-source token violations remain under the current static check. Their remaining work is contract clarity and exception documentation:
148
+
149
+ - Activity Feed
150
+ - Banner
151
+ - Breadcrumbs
152
+ - Catalog Components Showcase
153
+ - Command Bar
154
+ - Expanded Divider
155
+ - File Upload
156
+ - Icon Explorer
157
+ - Onboarding Step List Item
158
+ - Page Header
159
+ - Slideout
160
+ - Steps
161
+ - Table
162
+ - Tabs
163
+ - Timeline
164
+
165
+ Approved literal media-query breakpoints remain in CSS `@media` conditions because CSS custom properties are not reliable media-query operands. Geometry inside those media query blocks should continue using Banhaten tokens or component aliases.
166
+
167
+ ## Suggested Implementation Order
168
+
169
+ 1. Replace the three raw `opacity-0` utilities in registry components and sync mirrors.
170
+ 2. Extend `scripts/check-component-token-usage.mjs` to catch raw `opacity-0` and `opacity-100`.
171
+ 3. Add an exception ledger for alias-source literals and Radix numeric offsets.
172
+ 4. Decide and document the expanded-component token contract.
173
+ 5. Re-run `npm run tokens:check`, `npm run registry:check`, and `npm --prefix playground run test:components`.
@@ -0,0 +1,75 @@
1
+ # Components
2
+
3
+ Design-system components use semantic props and tokens. Appearance presets may change their visual treatment, but they should not change component APIs.
4
+
5
+ ## Component Catalog
6
+
7
+ - [Accordion](./accordion.md): Radix-backed disclosure primitive with variants, size scale, animation, and RTL-safe text alignment.
8
+ - [Activity Feed](./activity-feed.md): vertical activity timeline with avatars, status dots, captions or slot content, actions, and RTL support.
9
+ - [Alert](./alert.md): compact and expandable contextual feedback with semantic status colors, action links, close control, and RTL support.
10
+ - [Alert Dialog](./alert-dialog.md): Radix AlertDialog-backed confirmation surface for destructive or consequential actions with semantic intent styling.
11
+ - [Aspect Ratio](./aspect-ratio.md): Radix AspectRatio wrapper for fixed-format media, previews, and product surfaces.
12
+ - [Attribute](./attribute.md): semantic key-value description lists with alignment variants, density, bordered rows, rich value slots, and RTL support.
13
+ - [Autocomplete](./autocomplete.md): searchable combobox field composed from Input, Select menu rows, and Tag chips for single or multiple selection.
14
+ - [Avatar](./avatar.md): user avatar primitive with image, fallback, status, action overlays, groups, and RTL-safe overlap.
15
+ - [Badge](./badge.md): compact status and metadata primitive with semantic colors, icons, dots, flags, counts, and RTL support.
16
+ - [Banner](./banner.md): announcement and notice strip with slim, action, inline-action, input, color, size, content, and RTL variants.
17
+ - [Button](./button.md): semantic action primitive with variants, text and icon sizes, loading composition, link composition, and Arabic/RTL-safe icon behavior.
18
+ - [Button Group](./button-group.md): connected action groups with text and icon-only modes, md/sm/xs sizes, RTL widths, dividers, native interaction styling, and active/disabled states.
19
+ - [Breadcrumbs](./breadcrumbs.md): hierarchical page navigation with slash or chevron separators, raised or inline styles, and RTL support.
20
+ - [Card](./card.md): token-built content surface with image placements, footer actions, desktop/mobile spacing, and RTL-safe copy.
21
+ - [Carousel](./carousel.md): Embla-backed carousel with content, item, previous, and next controls.
22
+ - [Catalog Components](./catalog-components.md): expanded catalog showcase bundle for breadcrumbs, dividers, tags, file upload states, and table previews.
23
+ - [Chart](./chart.md): Recharts wrapper with Banhaten chart tokens, responsive container, tooltip content, and legend content.
24
+ - [Checkbox](./checkbox.md): Radix checkbox primitive plus checkbox-card composition with selected, disabled, hover, and RTL states.
25
+ - [Collapsible](./collapsible.md): Radix Collapsible wrapper for disclosure sections with tokenized trigger and content slots.
26
+ - [Command](./command.md): cmdk-backed command menu with search, groups, shortcuts, separators, and empty state.
27
+ - [Context Menu](./context-menu.md): Radix ContextMenu-backed right-click menu with labels, separators, submenus, checks, radios, and shortcuts.
28
+ - [Date Picker](./date-picker.md): calendar and range-picker suite with presets, open states, triggers, time rows, and RTL support.
29
+ - [Divider](./divider.md): horizontal and vertical separator with solid or dotted rules.
30
+ - [Empty State](./empty-state.md): no-results and first-run state with a neutral icon halo, title, supporting copy, actions, and RTL support.
31
+ - [File Upload](./file-upload.md): drag-and-drop upload target with queued file rows, status feedback, and LTR/RTL size variants.
32
+ - [Field](./field.md): accessible form-row composition for labels, controls, descriptions, errors, grouped fields, and validation state.
33
+ - [Hover Card](./hover-card.md): Radix HoverCard-backed preview surface for rich hover and focus context.
34
+ - [Icons](./icons.md): expanded icon explorer for pack review, semantic mapping, shortlist comparison, and Iconify inspection.
35
+ - [Input](./input.md): text-entry field with labels, helper and error text, add-ons, tags, shortcuts, adornments, and RTL states.
36
+ - [Input Group](./input-group.md): grouped input shell for protocol add-ons, inline actions, prefixes, suffixes, and compact rows.
37
+ - [Input OTP](./input-otp.md): one-time-code field with grouped slots, paste distribution, masked values, hidden form value, and RTL keyboard behavior.
38
+ - [Item](./item.md): composable list and action row with media, content, title, description, actions, separators, variants, sizes, and token-only styling.
39
+ - [Kbd](./kbd.md): keyboard hint primitive for shortcuts, command rows, and form help text.
40
+ - [Label](./label.md): Radix-backed accessible label primitive with required, optional, tone, disabled, and RTL-safe text behavior.
41
+ - [Menu](./menu.md): Radix DropdownMenu-backed command surface with rich item slots, submenus, progress rows, labels, captions, and RTL layout.
42
+ - [Menubar](./menubar.md): Radix Menubar-backed application menu with keyboard navigation and menu item slots.
43
+ - [Modal](./modal.md): Radix Dialog-backed modal surface with size variants, header/body/footer slots, ConfirmModal guardrails, Button actions, Checkbox opt-out, and RTL support.
44
+ - [Native Select](./native-select.md): tokenized native select field for platform forms, mobile fallback, and lightweight option sets.
45
+ - [Navigation Menu](./navigation-menu.md): Radix NavigationMenu-backed top navigation with trigger, content, link, viewport, and indicator parts.
46
+ - [Onboarding Step List Item](./onboarding-step-list-item.md): vertical progress-list row with finished, active, and inactive states plus RTL support.
47
+ - [Page Header](./page-header.md): page hierarchy, title metadata, actions, description, and local tabs.
48
+ - [Pagination](./pagination.md): numeric, simple, and summary pagination layouts with soft or ghost styling, captions, RTL layout, and explicit localized messages.
49
+ - [Popover](./popover.md): contextual overlay primitive with click, focus, hover, positioning, arrows, close affordance, and RTL-safe composition.
50
+ - [Progress](./progress.md): read-only progress meter with value fill, labels, helper text, indicator, spinner, and RTL support.
51
+ - [Progress Slider](./progress-slider.md): Radix Slider-based progress control with start-anchored fill, semantic tones, ticks, and RTL keyboard behavior.
52
+ - [Radio Card](./radio-card.md): rich single-choice option card with Figma content types, active/disabled states, and explicit RTL variants.
53
+ - [Radio Group](./radio-group.md): native-input radio group with labels, descriptions, errors, controlled/uncontrolled values, and RTL-safe field rows.
54
+ - [Select](./select.md): Radix Select-backed field and menu item system with item media, selection styles, validation states, and RTL layout.
55
+ - [Segmented Control](./segmented-control.md): content-width single or multiple selection control with semantic density, an optional label segment, keyboard navigation, and RTL support.
56
+ - [Resizable](./resizable.md): react-resizable-panels-backed split pane primitive with tokenized resize handle.
57
+ - [Sheet](./sheet.md): Radix Dialog-based edge panel with logical start/end placement, top/bottom placement, size variants, and RTL support.
58
+ - [Sidebar](./sidebar.md): composable app sidebar with collapse state, grouped menu items, logical placement, and sidebar tokens.
59
+ - [Slideout](./slideout.md): desktop and mobile side panel with header/footer actions, scrollable slots, example content, and RTL support.
60
+ - [Scroll Area](./scroll-area.md): Radix ScrollArea wrapper with tokenized viewport, scrollbar, thumb, and corner styling.
61
+ - [Slider](./slider.md): accessible value and range control with single, range, multi-thumb, vertical, ticked, pill, tone, size, disabled, and RTL variants.
62
+ - [Skeleton](./skeleton.md): token-built loading placeholders for text, avatars, actions, forms, cards, lists, tables, shimmer motion, and RTL surfaces.
63
+ - [Social Button](./social-button.md): sign-in action primitive for supported providers with solid, outline, icon-only, focus, and RTL states.
64
+ - [Spinner](./spinner.md): compact steady and dynamic loading spinners with inherited color and tokenized sizing.
65
+ - [Steps](./steps.md): horizontal and vertical progress indicators with icon or number markers, item-level slots/actions, and RTL support.
66
+ - [Table](./table.md): composable table and data-table workflow with selectable rows, sortable headers, search, filters, pagination, row states, RTL support, and reusable cell item variants.
67
+ - [Tabs](./tabs.md): Radix Tabs-backed local navigation with underline, segmented, and rounded treatments across LTR and RTL.
68
+ - [Textarea](./textarea.md): multiline field with labels, helper and error text, default and tags modes, placeholder, filled, disabled, and RTL states.
69
+ - [Timeline](./timeline.md): vertical and horizontal progress/event sequences with default or icon markers, states, dates, captions, and RTL support.
70
+ - [Toast](./toast.md): Sonner-style feedback primitive with semantic intents, action support, Banhaten token styling, and logical RTL placement.
71
+ - [Tag](./tag.md): compact metadata, filter, and removable-selection chip with type, state, size, close-button, and RTL variants.
72
+ - [Toggle](./toggle.md): switch-style boolean control with sm/md sizes, optional handle icons, labeled leading/trailing rows, supporting text, and RTL support.
73
+ - [Toolbar](./toolbar.md): filter and action toolbar with search, select triggers, icon buttons, chips, summaries, desktop/mobile styles, and RTL support.
74
+ - [Tooltip](./tooltip.md): Radix Tooltip-backed help surface with dark/default variants, pointer positions, shortcut/close slots, and RTL support.
75
+ - [Typography](./typography.md): documentation for existing `.bh-text-*` token utility classes.
@@ -0,0 +1,67 @@
1
+ # Accordion
2
+
3
+ Accordion is the disclosure primitive for grouped details, settings, FAQs, and compact content sections. It is backed by Radix Accordion and supports single or multiple expansion, size variants, visual treatments, animation, and RTL-safe copy.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Accordion type="single" collapsible>
9
+ <AccordionItem value="billing">
10
+ <AccordionTrigger>Billing</AccordionTrigger>
11
+ <AccordionContent>Invoice and payment details.</AccordionContent>
12
+ </AccordionItem>
13
+ </Accordion>
14
+ ```
15
+
16
+ | Prop | Values | Default |
17
+ | --- | --- | --- |
18
+ | `variant` | `default`, `bordered`, `cards`, `soft` | `default` |
19
+ | `size` | `sm`, `default`, `lg` | `default` |
20
+ | `type` | Radix `single`, `multiple` | required |
21
+ | `collapsible` | `boolean` | Radix default |
22
+
23
+ ## Token Contract
24
+
25
+ Accordion uses Banhaten spacing, border, radius, content, interactive, typography, and animation tokens. Avoid raw colors or pixel values in local variants.
26
+
27
+ ## RTL
28
+
29
+ Accordion inherits direction from its parent. Triggers and content use logical spacing and `text-start`; text labels use `dir="auto"` where the component renders string copy.
30
+
31
+ ## Accessibility
32
+
33
+ Radix provides button semantics, `aria-expanded`, roving state, and keyboard behavior. Keep trigger content concise and do not put nested interactive controls inside `AccordionTrigger`.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ npx banhaten add accordion
39
+ ```
40
+
41
+ ## Examples
42
+
43
+ Primary registry example: `examples/accordion-demo.tsx`.
44
+
45
+ Open the live component page or run `npx banhaten docs accordion` to inspect source files, install command, and examples.
46
+
47
+ ## RTL Rules
48
+
49
+ - `inheritsDirection`: true
50
+ - `textAlignment`: Uses text-start and dir="auto" so Arabic and English copy align and punctuate naturally.
51
+ - `spacing`: Uses gap and logical inherited direction rather than physical left/right spacing.
52
+
53
+ <!-- registry-contract:start -->
54
+ ## Registry Contract
55
+
56
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
57
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
58
+
59
+ | Field | Values |
60
+ | --- | --- |
61
+ | `supportedExports` | `components/accordion.tsx: Accordion, AccordionContent, AccordionItem, AccordionTrigger, accordionVariants` |
62
+ | `parts` | `Accordion`, `AccordionItem`, `AccordionTrigger`, `AccordionContent` |
63
+ | `registryDependencies` | None |
64
+ | `sizes` | `sm`, `default`, `lg` |
65
+ | `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-accordion`, `--bh-duration-default`, `--bh-easing-out`, `--bh-opacity-50`, `--bh-radius-md-6`, `--bh-radius-xs-2`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-line-height`, `--shadow-accordion-item`, `--shadow-button-focus` |
66
+ | `variants` | `default`, `bordered`, `cards`, `soft` |
67
+ <!-- registry-contract:end -->
@@ -0,0 +1,106 @@
1
+ # Activity Feed
2
+
3
+ `ActivityFeed` renders a vertical timeline of activity items with avatars, status dots, captions or slot content, timestamps, and action buttons.
4
+
5
+ Figma reference: `Design system 3.0 Copy / ActivityFeed`, component set node `587:19445`.
6
+
7
+ ## Variants
8
+
9
+ The Figma component defines these top-level variants:
10
+
11
+ | Direction | Node |
12
+ | --- | --- |
13
+ | LTR | `587:19381` |
14
+ | RTL | `587:19711` |
15
+
16
+ `ActivityFeedItem` also supports `caption` and `slot` item types through the `type` prop.
17
+
18
+ ## API
19
+
20
+ ```tsx
21
+ <ActivityFeed
22
+ dir="ltr"
23
+ items={[
24
+ {
25
+ label: "Label",
26
+ supportText: "Support Text",
27
+ link: "#Link",
28
+ caption: "Caption text",
29
+ timestamp: "Mar 15. 2050",
30
+ type: "caption",
31
+ },
32
+ ]}
33
+ />
34
+ ```
35
+
36
+ | Prop | Values | Default |
37
+ | --- | --- | --- |
38
+ | `dir` | `ltr`, `rtl` | `ltr` |
39
+ | `items` | `ActivityFeedItemProps[]` | ten caption items |
40
+ | `avatarSrc` | `string` | local Figma avatar asset |
41
+ | `type` | `caption`, `slot` | `caption` |
42
+ | `hasStatus` | `boolean` | `true` |
43
+ | `hasActionButtons` | `boolean` | `true` |
44
+ | `hasTwoActionButtons` | `boolean` | `true` |
45
+ | `showLine` | `boolean` | `true` |
46
+ | `showPaddingBottom` | `boolean` | `true` |
47
+
48
+ ## Token Contract
49
+
50
+ The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
51
+
52
+ - Backgrounds: `--bh-bg-raised`, `--bh-bg-success-default`
53
+ - Borders: `--bh-border-default`, `--bh-border-subtle`
54
+ - Content: `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`
55
+ - Interactive: `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`
56
+ - Shape: `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-control-default`
57
+ - Space: `--bh-space-xxs-2`, `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`
58
+
59
+ ## Pixel Rules
60
+
61
+ - Feed width is `600px`.
62
+ - Items use a `12px` gap between the indicator rail and content.
63
+ - Avatar is `32px` square with a full radius and subtle border.
64
+ - The status dot renders in a `16px` box with a `6px` success fill.
65
+ - Body text is Inter `15px / 24px`; timestamps are `14px / 20px`.
66
+ - Captions use `12px` padding, subtle border, white raised fill, and `4px` radius.
67
+ - Slot content is `76px` high with purple dashed border and subtle purple fill.
68
+ - Actions use `8px` top padding, `8px` button gap, and `36px` tall buttons.
69
+ - The repeated-item default uses a `22px` decorative bottom spacer so ten items fit the `2000px` Figma feed frame.
70
+ - RTL mirrors the avatar rail to the right and right-aligns text content.
71
+
72
+ ## Accessibility
73
+
74
+ - The feed uses a labelled `section`; provide `ariaLabel` when the surrounding context is not explicit.
75
+ - Status dots and connector lines are decorative. Use item copy or parent-level announcements for meaningful state.
76
+ - Action buttons are real `button` or `a` elements and support `ariaLabel`, `disabled`, `href`, and `onClick`.
77
+
78
+ ## Install
79
+
80
+ ```bash
81
+ npx banhaten add activity-feed
82
+ ```
83
+
84
+ ## Examples
85
+
86
+ Primary registry example: `examples/expanded/activity-feed-demo.tsx`.
87
+
88
+ Open the live component page or run `npx banhaten docs activity-feed` to inspect source files, install command, and examples.
89
+
90
+ ## RTL Rules
91
+
92
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
93
+
94
+ <!-- registry-contract:start -->
95
+ ## Registry Contract
96
+
97
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
98
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
99
+
100
+ | Field | Values |
101
+ | --- | --- |
102
+ | `supportedExports` | `components/expanded/ActivityFeed.tsx: ActivityFeed, ActivityFeedItem` |
103
+ | `parts` | `ActivityFeed`, `ActivityFeedItem` |
104
+ | `registryDependencies` | `button` |
105
+ | `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-regular-font-size`, `--shadow-button-raised`, `--shadow-component-default` |
106
+ <!-- registry-contract:end -->