banhaten 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/CHANGELOG.md +139 -73
  2. package/CONTRIBUTING.md +46 -44
  3. package/README.md +192 -190
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -0
  7. package/docs/design-system/README.md +22 -20
  8. package/docs/design-system/adoption-quality-remediation.md +87 -87
  9. package/docs/design-system/agent-usage.md +13 -13
  10. package/docs/design-system/appearance-presets.md +189 -189
  11. package/docs/design-system/appearances/default.md +94 -94
  12. package/docs/design-system/appearances/rounded.md +95 -95
  13. package/docs/design-system/appearances/sharp.md +95 -95
  14. package/docs/design-system/component-docs-pattern.md +81 -81
  15. package/docs/design-system/component-implementation-ownership-audit.md +245 -244
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
  17. package/docs/design-system/component-showcase-consistency-report.md +219 -219
  18. package/docs/design-system/component-token-consistency-audit.md +173 -173
  19. package/docs/design-system/components/README.md +90 -76
  20. package/docs/design-system/components/accordion.md +53 -53
  21. package/docs/design-system/components/activity-feed.md +94 -94
  22. package/docs/design-system/components/activity-heatmap.md +57 -57
  23. package/docs/design-system/components/agent-input.md +85 -0
  24. package/docs/design-system/components/alert-dialog.md +72 -72
  25. package/docs/design-system/components/alert.md +98 -98
  26. package/docs/design-system/components/approval-card.md +134 -0
  27. package/docs/design-system/components/aspect-ratio.md +45 -45
  28. package/docs/design-system/components/attribute.md +89 -89
  29. package/docs/design-system/components/autocomplete.md +75 -75
  30. package/docs/design-system/components/avatar.md +54 -54
  31. package/docs/design-system/components/badge.md +54 -54
  32. package/docs/design-system/components/banner.md +87 -87
  33. package/docs/design-system/components/breadcrumbs.md +177 -176
  34. package/docs/design-system/components/button-group.md +98 -98
  35. package/docs/design-system/components/button.md +83 -80
  36. package/docs/design-system/components/card.md +88 -88
  37. package/docs/design-system/components/carousel.md +46 -46
  38. package/docs/design-system/components/catalog-components.md +47 -47
  39. package/docs/design-system/components/chart.md +95 -24
  40. package/docs/design-system/components/checkbox.md +54 -54
  41. package/docs/design-system/components/collapsible.md +67 -53
  42. package/docs/design-system/components/command.md +62 -62
  43. package/docs/design-system/components/context-menu.md +46 -46
  44. package/docs/design-system/components/date-picker.md +81 -79
  45. package/docs/design-system/components/divider.md +102 -102
  46. package/docs/design-system/components/empty-state.md +56 -56
  47. package/docs/design-system/components/field.md +70 -70
  48. package/docs/design-system/components/file-upload.md +187 -187
  49. package/docs/design-system/components/hover-card.md +48 -48
  50. package/docs/design-system/components/icons.md +48 -48
  51. package/docs/design-system/components/inline-citations.md +93 -0
  52. package/docs/design-system/components/input-group.md +58 -58
  53. package/docs/design-system/components/input-otp.md +56 -56
  54. package/docs/design-system/components/input.md +117 -61
  55. package/docs/design-system/components/item.md +59 -57
  56. package/docs/design-system/components/kbd.md +54 -49
  57. package/docs/design-system/components/label.md +49 -49
  58. package/docs/design-system/components/menu.md +71 -61
  59. package/docs/design-system/components/menubar.md +47 -47
  60. package/docs/design-system/components/modal.md +105 -105
  61. package/docs/design-system/components/native-select.md +54 -54
  62. package/docs/design-system/components/navigation-menu.md +50 -50
  63. package/docs/design-system/components/onboarding-step-list-item.md +82 -82
  64. package/docs/design-system/components/page-header.md +93 -86
  65. package/docs/design-system/components/pagination.md +57 -57
  66. package/docs/design-system/components/popover.md +60 -60
  67. package/docs/design-system/components/progress-slider.md +50 -50
  68. package/docs/design-system/components/progress.md +76 -76
  69. package/docs/design-system/components/radio-card.md +51 -51
  70. package/docs/design-system/components/radio-group.md +57 -57
  71. package/docs/design-system/components/resizable.md +44 -44
  72. package/docs/design-system/components/rolling-count.md +61 -0
  73. package/docs/design-system/components/scroll-area.md +51 -51
  74. package/docs/design-system/components/segmented-control.md +54 -54
  75. package/docs/design-system/components/select.md +68 -62
  76. package/docs/design-system/components/sheet.md +67 -67
  77. package/docs/design-system/components/shimmer-text.md +67 -0
  78. package/docs/design-system/components/sidebar.md +127 -76
  79. package/docs/design-system/components/skeleton.md +75 -75
  80. package/docs/design-system/components/slideout.md +65 -65
  81. package/docs/design-system/components/slider.md +63 -63
  82. package/docs/design-system/components/social-button.md +50 -50
  83. package/docs/design-system/components/spinner.md +62 -62
  84. package/docs/design-system/components/steps.md +65 -65
  85. package/docs/design-system/components/streaming-text.md +82 -0
  86. package/docs/design-system/components/table.md +419 -414
  87. package/docs/design-system/components/tabs.md +59 -55
  88. package/docs/design-system/components/tag.md +80 -80
  89. package/docs/design-system/components/task-list.md +95 -0
  90. package/docs/design-system/components/textarea.md +50 -50
  91. package/docs/design-system/components/thinking-reasoning.md +72 -0
  92. package/docs/design-system/components/thinking-state.md +67 -0
  93. package/docs/design-system/components/timeline.md +83 -83
  94. package/docs/design-system/components/toast.md +58 -58
  95. package/docs/design-system/components/toggle.md +81 -81
  96. package/docs/design-system/components/toolbar.md +92 -87
  97. package/docs/design-system/components/tooltip.md +94 -92
  98. package/docs/design-system/components/typography.md +18 -18
  99. package/docs/design-system/density-and-elevation.md +65 -61
  100. package/docs/design-system/design-system-test-missing-items.md +368 -368
  101. package/docs/design-system/direction-and-localization.md +23 -23
  102. package/docs/design-system/form-recipes.md +73 -73
  103. package/docs/design-system/gap-promotion-policy.md +21 -21
  104. package/docs/design-system/icons.md +74 -69
  105. package/docs/design-system/installation.md +70 -68
  106. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  107. package/docs/design-system/registry-and-cli.md +64 -64
  108. package/docs/design-system/release-policy.md +30 -30
  109. package/docs/design-system/roadmap.md +14 -14
  110. package/docs/design-system/support-matrix.md +23 -23
  111. package/docs/design-system/tabs.md +54 -53
  112. package/docs/design-system/template-gap-audit.md +32 -0
  113. package/docs/design-system/templates.md +59 -0
  114. package/docs/design-system/token-governance.md +72 -60
  115. package/package.json +98 -98
  116. package/registry/component-contract.json +40 -40
  117. package/registry/components/accordion.tsx +155 -155
  118. package/registry/components/agent-input-parts.tsx +552 -0
  119. package/registry/components/agent-input-state.ts +156 -0
  120. package/registry/components/agent-input.css +307 -0
  121. package/registry/components/agent-input.tsx +382 -0
  122. package/registry/components/alert-dialog.tsx +297 -297
  123. package/registry/components/alert.tsx +293 -293
  124. package/registry/components/approval-card.css +409 -0
  125. package/registry/components/approval-card.tsx +401 -0
  126. package/registry/components/approval-frame.tsx +108 -0
  127. package/registry/components/approval-questions.tsx +559 -0
  128. package/registry/components/aspect-ratio.tsx +30 -30
  129. package/registry/components/attribute.tsx +454 -448
  130. package/registry/components/autocomplete.tsx +598 -651
  131. package/registry/components/avatar.tsx +385 -381
  132. package/registry/components/badge.tsx +629 -629
  133. package/registry/components/button-group.tsx +565 -565
  134. package/registry/components/button.tsx +127 -123
  135. package/registry/components/card.tsx +638 -638
  136. package/registry/components/carousel.tsx +296 -296
  137. package/registry/components/chart-block-data.ts +177 -0
  138. package/registry/components/chart-block.css +171 -0
  139. package/registry/components/chart-block.tsx +260 -0
  140. package/registry/components/chart-interactions.ts +123 -0
  141. package/registry/components/chart-options.cartesian.ts +162 -0
  142. package/registry/components/chart-options.paint.ts +99 -0
  143. package/registry/components/chart-options.parts.ts +72 -0
  144. package/registry/components/chart-options.radial.ts +109 -0
  145. package/registry/components/chart-options.ts +44 -0
  146. package/registry/components/chart-options.types.ts +67 -0
  147. package/registry/components/chart.tsx +203 -203
  148. package/registry/components/checkbox.tsx +247 -247
  149. package/registry/components/collapsible.tsx +109 -69
  150. package/registry/components/command.tsx +208 -208
  151. package/registry/components/context-menu.tsx +236 -236
  152. package/registry/components/data-chart.tsx +40 -0
  153. package/registry/components/date-picker.tsx +1289 -1277
  154. package/registry/components/echart-theme.ts +246 -0
  155. package/registry/components/echart.css +49 -0
  156. package/registry/components/echart.tsx +178 -0
  157. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  158. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  159. package/registry/components/expanded/Banner.tsx +179 -179
  160. package/registry/components/expanded/Breadcrumbs.tsx +131 -131
  161. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  162. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  163. package/registry/components/expanded/EmptyState.tsx +155 -155
  164. package/registry/components/expanded/FileUpload.tsx +543 -543
  165. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -59
  166. package/registry/components/expanded/PageHeader.tsx +179 -166
  167. package/registry/components/expanded/Slideout.tsx +108 -108
  168. package/registry/components/expanded/Steps.tsx +402 -402
  169. package/registry/components/expanded/Table.tsx +1092 -1071
  170. package/registry/components/expanded/Timeline.tsx +203 -203
  171. package/registry/components/expanded/activityFeed.css +248 -248
  172. package/registry/components/expanded/activityHeatmap.css +66 -66
  173. package/registry/components/expanded/banner.css +260 -255
  174. package/registry/components/expanded/breadcrumbs.css +140 -140
  175. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  176. package/registry/components/expanded/divider.css +75 -75
  177. package/registry/components/expanded/emptyState.css +111 -111
  178. package/registry/components/expanded/fileUpload.css +457 -457
  179. package/registry/components/expanded/onboardingStepListItem.css +135 -126
  180. package/registry/components/expanded/pageHeader.css +248 -290
  181. package/registry/components/expanded/slideout.css +276 -276
  182. package/registry/components/expanded/steps.css +356 -356
  183. package/registry/components/expanded/table.css +606 -603
  184. package/registry/components/expanded/timeline.css +286 -286
  185. package/registry/components/field.tsx +283 -283
  186. package/registry/components/hover-card.tsx +48 -48
  187. package/registry/components/inline-citations.css +126 -0
  188. package/registry/components/inline-citations.tsx +292 -0
  189. package/registry/components/input-content.ts +107 -107
  190. package/registry/components/input-group.tsx +130 -130
  191. package/registry/components/input-otp.tsx +584 -584
  192. package/registry/components/input.tsx +990 -972
  193. package/registry/components/item.tsx +189 -189
  194. package/registry/components/kbd.tsx +246 -151
  195. package/registry/components/label.tsx +78 -78
  196. package/registry/components/menu.tsx +978 -986
  197. package/registry/components/menubar.tsx +226 -226
  198. package/registry/components/modal.tsx +872 -872
  199. package/registry/components/native-select.tsx +205 -205
  200. package/registry/components/navigation-menu.tsx +171 -171
  201. package/registry/components/pagination.css +36 -36
  202. package/registry/components/pagination.tsx +560 -555
  203. package/registry/components/popover.tsx +338 -338
  204. package/registry/components/progress-slider.tsx +216 -216
  205. package/registry/components/radio-card.tsx +676 -677
  206. package/registry/components/radio-group.tsx +570 -570
  207. package/registry/components/resizable.tsx +108 -108
  208. package/registry/components/rolling-count.css +37 -0
  209. package/registry/components/rolling-count.tsx +110 -0
  210. package/registry/components/scroll-area.tsx +91 -91
  211. package/registry/components/segmented-control.tsx +87 -87
  212. package/registry/components/select-content.tsx +218 -218
  213. package/registry/components/select.tsx +937 -932
  214. package/registry/components/sheet.tsx +305 -305
  215. package/registry/components/shimmer-text.css +69 -0
  216. package/registry/components/shimmer-text.tsx +43 -0
  217. package/registry/components/sidebar.tsx +1433 -358
  218. package/registry/components/skeleton.css +54 -54
  219. package/registry/components/skeleton.tsx +482 -482
  220. package/registry/components/slider.tsx +380 -380
  221. package/registry/components/social-button.tsx +387 -387
  222. package/registry/components/spinner.tsx +78 -78
  223. package/registry/components/streaming-text.css +45 -0
  224. package/registry/components/streaming-text.tsx +165 -0
  225. package/registry/components/table-elements.tsx +128 -128
  226. package/registry/components/tabs.css +222 -218
  227. package/registry/components/tabs.tsx +241 -241
  228. package/registry/components/tag.tsx +423 -423
  229. package/registry/components/task-list.css +328 -0
  230. package/registry/components/task-list.tsx +429 -0
  231. package/registry/components/textarea.tsx +610 -610
  232. package/registry/components/thinking-reasoning.css +178 -0
  233. package/registry/components/thinking-reasoning.tsx +253 -0
  234. package/registry/components/thinking-state.css +8 -0
  235. package/registry/components/thinking-state.tsx +46 -0
  236. package/registry/components/toast.tsx +136 -136
  237. package/registry/components/toggle.tsx +256 -256
  238. package/registry/components/toolbar.tsx +539 -539
  239. package/registry/components/tooltip.tsx +433 -431
  240. package/registry/examples/agent-input-demo.tsx +90 -0
  241. package/registry/examples/alert-demo.tsx +34 -34
  242. package/registry/examples/alert-dialog-demo.tsx +42 -42
  243. package/registry/examples/approval-card-demo.tsx +83 -0
  244. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  245. package/registry/examples/attribute-demo.tsx +65 -65
  246. package/registry/examples/autocomplete-demo.tsx +109 -109
  247. package/registry/examples/avatar-demo.tsx +132 -132
  248. package/registry/examples/badge-demo.tsx +69 -69
  249. package/registry/examples/button-demo.tsx +86 -83
  250. package/registry/examples/button-group-demo.tsx +63 -63
  251. package/registry/examples/card-demo.tsx +86 -86
  252. package/registry/examples/carousel-demo.tsx +43 -43
  253. package/registry/examples/chart-block-demo.tsx +5 -0
  254. package/registry/examples/chart-demo.tsx +18 -33
  255. package/registry/examples/checkbox-demo.tsx +62 -62
  256. package/registry/examples/collapsible-demo.tsx +16 -16
  257. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  258. package/registry/examples/command-demo.tsx +42 -42
  259. package/registry/examples/command-palette-demo.tsx +235 -236
  260. package/registry/examples/context-menu-demo.tsx +29 -29
  261. package/registry/examples/control-density-contract-demo.tsx +65 -61
  262. package/registry/examples/date-picker-demo.tsx +127 -127
  263. package/registry/examples/divider-demo.tsx +17 -17
  264. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  265. package/registry/examples/expanded/banner-demo.tsx +48 -48
  266. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  267. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  268. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  269. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  270. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  271. package/registry/examples/expanded/steps-demo.tsx +29 -29
  272. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  273. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  274. package/registry/examples/field-demo.tsx +51 -51
  275. package/registry/examples/hover-card-demo.tsx +23 -23
  276. package/registry/examples/inline-citations-demo.tsx +31 -0
  277. package/registry/examples/input-actions-demo.tsx +36 -0
  278. package/registry/examples/input-demo.tsx +87 -87
  279. package/registry/examples/input-group-demo.tsx +16 -16
  280. package/registry/examples/input-otp-demo.tsx +72 -72
  281. package/registry/examples/item-demo.tsx +46 -46
  282. package/registry/examples/kbd-demo.tsx +12 -11
  283. package/registry/examples/label-demo.tsx +20 -20
  284. package/registry/examples/menu-demo.tsx +122 -122
  285. package/registry/examples/menubar-demo.tsx +34 -34
  286. package/registry/examples/modal-demo.tsx +74 -74
  287. package/registry/examples/native-select-demo.tsx +16 -16
  288. package/registry/examples/navigation-menu-demo.tsx +29 -29
  289. package/registry/examples/pagination-demo.tsx +20 -20
  290. package/registry/examples/popover-demo.tsx +547 -546
  291. package/registry/examples/progress-demo.tsx +37 -37
  292. package/registry/examples/progress-slider-demo.tsx +29 -29
  293. package/registry/examples/radio-card-demo.tsx +51 -51
  294. package/registry/examples/radio-group-demo.tsx +62 -62
  295. package/registry/examples/resizable-demo.tsx +22 -22
  296. package/registry/examples/results-toolbar-demo.tsx +44 -44
  297. package/registry/examples/rolling-count-demo.tsx +39 -0
  298. package/registry/examples/scroll-area-demo.tsx +15 -15
  299. package/registry/examples/segmented-control-demo.tsx +39 -39
  300. package/registry/examples/select-demo.tsx +87 -87
  301. package/registry/examples/sheet-demo.tsx +47 -47
  302. package/registry/examples/shimmer-text-demo.tsx +20 -0
  303. package/registry/examples/sidebar-demo.tsx +101 -57
  304. package/registry/examples/slider-demo.tsx +31 -31
  305. package/registry/examples/social-button-demo.tsx +61 -61
  306. package/registry/examples/spinner-demo.tsx +59 -59
  307. package/registry/examples/streaming-text-demo.tsx +28 -0
  308. package/registry/examples/tabs-demo.tsx +13 -13
  309. package/registry/examples/tag-demo.tsx +29 -29
  310. package/registry/examples/task-list-demo.tsx +74 -0
  311. package/registry/examples/textarea-demo.tsx +79 -79
  312. package/registry/examples/thinking-reasoning-demo.tsx +74 -0
  313. package/registry/examples/thinking-state-demo.tsx +13 -0
  314. package/registry/examples/toast-demo.tsx +35 -35
  315. package/registry/examples/toggle-demo.tsx +59 -59
  316. package/registry/examples/tooltip-demo.tsx +115 -115
  317. package/registry/guidance/USAGE.md +27 -27
  318. package/registry/guidance/charts.LICENSE.txt +24 -0
  319. package/registry/hooks/use-controllable-state.ts +33 -0
  320. package/registry/hooks/use-direction.ts +207 -207
  321. package/registry/hooks/use-listbox-navigation.ts +73 -0
  322. package/registry/hooks/use-motion-end.ts +55 -0
  323. package/registry/hooks/use-reduced-motion.ts +28 -0
  324. package/registry/index.json +1634 -184
  325. package/registry/styles/globals.css +1462 -1570
  326. package/registry.json +364 -10
  327. package/schema/config.schema.json +51 -51
  328. package/schema/registry.schema.json +194 -190
  329. package/schema/tokens.schema.json +167 -163
  330. package/src/cli/command-line.js +194 -194
  331. package/src/cli/config-editors.js +9 -9
  332. package/src/cli/doctor.js +399 -399
  333. package/src/cli/file-transaction.js +302 -295
  334. package/src/cli/global-css.js +153 -153
  335. package/src/cli/index.js +1002 -1009
  336. package/src/cli/install-plan.js +592 -592
  337. package/src/cli/install-receipt.js +171 -171
  338. package/src/cli/jsonc.js +203 -203
  339. package/src/cli/package-install-state.js +254 -254
  340. package/src/cli/package-manager.js +238 -238
  341. package/src/cli/package-plan.js +185 -185
  342. package/src/cli/package-version.js +97 -97
  343. package/src/cli/registry-query.js +207 -207
  344. package/src/cli/reporting.js +55 -55
  345. package/src/cli/schema-validation.js +19 -19
  346. package/src/cli/source-scanner.js +686 -686
  347. package/src/cli/vite-config.js +478 -478
  348. package/tokens/banhaten.tokens.json +458 -224
@@ -1,49 +1,49 @@
1
- # Carousel
2
-
3
- Carousel is an Embla-backed carousel with content, item, previous, and next controls.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Carousel messages={{ previousSlide: "Previous item", nextSlide: "Next item" }}>
9
- <CarouselContent>
10
- <CarouselItem>Slide</CarouselItem>
11
- </CarouselContent>
12
- <CarouselPrevious />
13
- <CarouselNext />
14
- </Carousel>
15
- ```
16
-
17
- ## Token Contract
18
-
19
- Carousel controls use Banhaten Button tokens, spacing, radius, and directional icon behavior.
20
-
21
- ## RTL
22
-
23
- Directional icons flip in RTL. Direction does not select a language; pass `messages` on `Carousel` or `aria-label` on an individual control. Set Embla options through `opts` when you need a custom direction strategy.
24
-
25
- ## Accessibility
26
-
27
- Carousel exposes a region and English button-label defaults for previous and next controls. `messages` accepts partial localized overrides, while a control's direct `aria-label` has highest precedence.
28
-
29
- ## Install
30
-
31
- ```bash
32
- npx banhaten add carousel
33
- ```
34
-
35
- ## Examples
36
-
37
- Primary registry example: `examples/carousel-demo.tsx`.
38
-
39
- Open the live component page or run `npx banhaten docs carousel` to inspect source files, install command, and examples.
40
-
41
- ## RTL Rules
42
-
43
- - `inheritsDirection`: true
44
- - `directionalIconFlip`: Previous and next arrow icons flip in RTL.
45
- - `messages`: Direction does not select language. Pass messages or direct aria-label overrides for localized control names.
46
-
1
+ # Carousel
2
+
3
+ Carousel is an Embla-backed carousel with content, item, previous, and next controls.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Carousel messages={{ previousSlide: "Previous item", nextSlide: "Next item" }}>
9
+ <CarouselContent>
10
+ <CarouselItem>Slide</CarouselItem>
11
+ </CarouselContent>
12
+ <CarouselPrevious />
13
+ <CarouselNext />
14
+ </Carousel>
15
+ ```
16
+
17
+ ## Token Contract
18
+
19
+ Carousel controls use Banhaten Button tokens, spacing, radius, and directional icon behavior.
20
+
21
+ ## RTL
22
+
23
+ Directional icons flip in RTL. Direction does not select a language; pass `messages` on `Carousel` or `aria-label` on an individual control. Set Embla options through `opts` when you need a custom direction strategy.
24
+
25
+ ## Accessibility
26
+
27
+ Carousel exposes a region and English button-label defaults for previous and next controls. `messages` accepts partial localized overrides, while a control's direct `aria-label` has highest precedence.
28
+
29
+ ## Install
30
+
31
+ ```bash
32
+ npx banhaten add carousel
33
+ ```
34
+
35
+ ## Examples
36
+
37
+ Primary registry example: `examples/carousel-demo.tsx`.
38
+
39
+ Open the live component page or run `npx banhaten docs carousel` to inspect source files, install command, and examples.
40
+
41
+ ## RTL Rules
42
+
43
+ - `inheritsDirection`: true
44
+ - `directionalIconFlip`: Previous and next arrow icons flip in RTL.
45
+ - `messages`: Direction does not select language. Pass messages or direct aria-label overrides for localized control names.
46
+
47
47
  <!-- registry-contract:start -->
48
48
  ## Registry Contract
49
49
 
@@ -1,49 +1,49 @@
1
- # Catalog Components
2
-
3
- Catalog Components is an expanded-tier showcase bundle for catalog-style product pages. It brings together breadcrumbs, catalog-only dividers, catalog tag previews, file upload states, and table previews.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <CatalogComponentsShowcase dir="ltr" />
9
- ```
10
-
11
- | Included part | Source |
12
- | --- | --- |
13
- | `Breadcrumbs` | expanded breadcrumbs component |
14
- | `CatalogContentDivider`, `CatalogDivider` | catalog divider visuals |
15
- | `Tag` | core tag component, previewed in the showcase |
16
- | `FileUpload` | expanded upload states |
17
- | `Table` | expanded table preview |
18
-
19
- ## Token Contract
20
-
21
- The bundle uses expanded-tier CSS files plus Banhaten button, surface, border, spacing, typography, tag, upload, and table tokens. Treat this as a composition bundle, not a new primitive token namespace.
22
-
23
- ## RTL
24
-
25
- Catalog examples include LTR and RTL states through the child components. Breadcrumbs, upload rows, table content, and tags should inherit direction from the wrapper.
26
-
27
- ## Accessibility
28
-
29
- Use the individual child component docs for production semantics. This page is a bundled visual reference for catalog composition and component fit.
30
-
31
- ## Install
32
-
33
- ```bash
34
- npx banhaten add catalog-components
35
- ```
36
-
37
- ## Examples
38
-
39
- Primary registry example: `examples/expanded/catalog-components-demo.tsx`.
40
-
41
- Open the live component page or run `npx banhaten docs catalog-components` to inspect source files, install command, and examples.
42
-
43
- ## RTL Rules
44
-
45
- This component has no special RTL contract beyond inherited document direction and logical spacing.
46
-
1
+ # Catalog Components
2
+
3
+ Catalog Components is an expanded-tier showcase bundle for catalog-style product pages. It brings together breadcrumbs, catalog-only dividers, catalog tag previews, file upload states, and table previews.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <CatalogComponentsShowcase dir="ltr" />
9
+ ```
10
+
11
+ | Included part | Source |
12
+ | --- | --- |
13
+ | `Breadcrumbs` | expanded breadcrumbs component |
14
+ | `CatalogContentDivider`, `CatalogDivider` | catalog divider visuals |
15
+ | `Tag` | core tag component, previewed in the showcase |
16
+ | `FileUpload` | expanded upload states |
17
+ | `Table` | expanded table preview |
18
+
19
+ ## Token Contract
20
+
21
+ The bundle uses expanded-tier CSS files plus Banhaten button, surface, border, spacing, typography, tag, upload, and table tokens. Treat this as a composition bundle, not a new primitive token namespace.
22
+
23
+ ## RTL
24
+
25
+ Catalog examples include LTR and RTL states through the child components. Breadcrumbs, upload rows, table content, and tags should inherit direction from the wrapper.
26
+
27
+ ## Accessibility
28
+
29
+ Use the individual child component docs for production semantics. This page is a bundled visual reference for catalog composition and component fit.
30
+
31
+ ## Install
32
+
33
+ ```bash
34
+ npx banhaten add catalog-components
35
+ ```
36
+
37
+ ## Examples
38
+
39
+ Primary registry example: `examples/expanded/catalog-components-demo.tsx`.
40
+
41
+ Open the live component page or run `npx banhaten docs catalog-components` to inspect source files, install command, and examples.
42
+
43
+ ## RTL Rules
44
+
45
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
46
+
47
47
  <!-- registry-contract:start -->
48
48
  ## Registry Contract
49
49
 
@@ -57,6 +57,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
57
57
  | `registryDependencies` | `breadcrumbs`, `button`, `file-upload`, `table`, `tag` |
58
58
  | `modes` | `showcase`, `divider`, `content-divider` |
59
59
  | `states` | `label`, `action`, `disabled-action` |
60
- | `tokens` | `--bh-bg-raised`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-catalog-file-grid-max`, `--bh-catalog-file-grid-min`, `--bh-catalog-file-preview-max`, `--bh-catalog-file-preview-min`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-default`, `--bh-focus-ring-width`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-interactive-ghost-hover`, `--bh-interactive-soft-default`, `--bh-opacity-65`, `--bh-radius-lg-8`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-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-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-heading-xs-semibold-font-size`, `--bh-text-heading-xs-semibold-font-weight`, `--bh-text-heading-xs-semibold-line-height`, `--shadow-component-default` |
60
+ | `tokens` | `--bh-bg-raised`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-catalog-file-grid-max`, `--bh-catalog-file-grid-min`, `--bh-catalog-file-preview-max`, `--bh-catalog-file-preview-min`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-default`, `--bh-focus-ring-width`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-interactive-ghost-hover`, `--bh-interactive-soft-default`, `--bh-opacity-65`, `--bh-radius-lg-8`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-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-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-heading-xs-semibold-font-size`, `--bh-text-heading-xs-semibold-font-weight`, `--bh-text-heading-xs-semibold-line-height`, `--elevation-component-default` |
61
61
  | `variants` | `solid-divider`, `dotted-divider` |
62
62
  <!-- registry-contract:end -->
@@ -1,46 +1,110 @@
1
1
  # Chart
2
2
 
3
- Chart provides Recharts wrappers with Banhaten chart tokens, responsive sizing, tooltip content, and legend content.
3
+ Eight ECharts families and 18 ready-made blocks adapted from [EvilCharts](https://evilcharts.com/docs/echarts/area-chart/blocks), using Banhaten tokens throughout. Existing Recharts wrappers remain compatible.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx banhaten add chart
9
+ ```
10
+
11
+ This installs the source modules and declares `echarts` and `recharts`. The playground loads the chart page separately; chart instances initialize when visible.
4
12
 
5
13
  ## API
6
14
 
15
+ Use `DataChart` for application data. Every series uses a Banhaten categorical palette index; raw colors are not part of the specification.
16
+
7
17
  ```tsx
8
- <ChartContainer config={{ revenue: { color: "var(--bh-chart-1)" } }}>
9
- <LineChart data={data}>
10
- <ChartTooltip content={<ChartTooltipContent />} />
11
- <Line dataKey="revenue" stroke="var(--color-revenue)" />
12
- </LineChart>
13
- </ChartContainer>
18
+ import { DataChart } from "@/components/ui/data-chart"
19
+ import type { ChartSpec } from "@/components/ui/chart-options"
20
+
21
+ const spec: ChartSpec = {
22
+ family: "area",
23
+ variant: "gradient",
24
+ categoryKey: "month",
25
+ data: [
26
+ { month: "Jan", revenue: 120, costs: 80 },
27
+ { month: "Feb", revenue: 180, costs: 95 },
28
+ { month: "Mar", revenue: 150, costs: 90 },
29
+ ],
30
+ series: [
31
+ { key: "revenue", label: "Revenue", colorIndex: 0 },
32
+ { key: "costs", label: "Costs", colorIndex: 1 },
33
+ ],
34
+ legend: true,
35
+ brush: true,
36
+ }
37
+
38
+ <DataChart label="Revenue and costs" description="Revenue exceeds costs in each month." spec={spec} />
14
39
  ```
15
40
 
41
+ `DataChart` accepts `spec`, required `label`, optional `description`, `loading`, `loadingLabel`, `emptyLabel`, and container attributes. `ChartSpec` selects `area`, `line`, `bar`, `composed`, `radar`, `pie`, `radial`, or `sankey`. Use `stack="stacked"` or `stack="percent"`, `horizontal`, `labels`, `grid`, `max`, `nodes`, and `links` where applicable. Curves are native ECharts approximations, matching the reference implementation; named spline variants are not mathematical spline implementations.
42
+
43
+ Shared parts support seven `legendIndicator` shapes; series `dotStyle` and `activeDotStyle`; `tooltipRadius`, `tooltipSurface`, `tooltipPosition`, and `tooltipCursor`. Translucent tooltips use the Banhaten opacity token. Brush controls are enabled with `brush: true`. Forecast `buffer` tails apply to independent series; stacked series retain their complete data to preserve totals.
44
+
45
+ Use `EChart` for advanced native options. Its `option(theme)` factory receives resolved inherited Banhaten colors, font metrics, spacing, radii, opacity, direction, and reduced-motion preference. An optional `onReady(chart, theme)` callback can attach interactions and return their cleanup. Native options supplied by callers must also use these tokens.
46
+
47
+ ```tsx
48
+ import { ChartBlock } from "@/components/ui/chart-block"
49
+
50
+ <ChartBlock block="latency" />
51
+ ```
52
+
53
+ `ChartBlock` provides example compositions with illustrative datasets. Time-range controls update both chart data and summaries. The visible data table uses the same filtered rows. Use `DataChart` for your own production data or adapt the installed block source.
54
+
55
+ | Family | Block IDs |
56
+ | --- | --- |
57
+ | Area | `latency`, `portfolio`, `benchmark`, `audience` |
58
+ | Line | `payouts`, `shipments` |
59
+ | Bar | `peak`, `grid`, `monospace` |
60
+ | Pie | `market-share`, `progress-rings`, `revenue-mix`, `reliability-score` |
61
+ | Radial | `budget`, `ride`, `cache-tiers` |
62
+ | Sankey | `allocation`, `pipeline` |
63
+
64
+ Legacy `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, and `ChartLegendContent` still compose with Recharts. Their `config` maps series names to `--color-*` CSS variables.
65
+
16
66
  ## Token Contract
17
67
 
18
- Chart adds `--bh-chart-1` through `--bh-chart-5` via the token build. `ChartContainer` maps config entries to `--color-*` variables.
68
+ - Marks use the eight `--bh-chart-categorical-*` colors. Neutral tracks, surfaces, borders, and text use existing semantic tokens.
69
+ - Fonts, weights, sizes, line heights, spacing, radii, opacity, and animation duration resolve from the chart's inherited Banhaten tokens. No duplicate theme palette is maintained.
70
+ - Theme, font, radius, and direction changes update mounted charts. Existing legend selections and brush range survive theme updates.
71
+ - Gradient fills and patterns remain available. Colored blur shadows and glow variants are omitted. Tooltips have no shadow.
72
+ - Numeric data, chart percentages, angles, and geometry ratios describe the visualization rather than design tokens.
73
+ - All source modules, including TypeScript helpers, are included in token governance checks.
19
74
 
20
- ## RTL
75
+ ### Chart corner radii
21
76
 
22
- Chart layout depends on the Recharts configuration. Surrounding labels and legends use logical layout.
77
+ Keep chart marks subtly rounded so their endpoints and stacked joins remain easy to compare. Use `--bh-radius-sm-4` for exposed bar ends and separated donut slices: 4px in the default theme, 6px in rounded mode, and 0px in sharp mode. The native `option(theme)` API exposes this as `theme.markRadius` separately from surface and tooltip radii.
23
78
 
24
- ## Accessibility
79
+ | Mark | Corner treatment |
80
+ | --- | --- |
81
+ | Bars, including composed charts | Small radius at the exposed value end; square at the baseline. |
82
+ | Stacked bars | Square between segments; Small radius only at the outer end of the stack. |
83
+ | Standard pie and donut slices | Square slice corners (0px). |
84
+ | Separated and petal donut slices | Small radius; avoid pill-shaped corners. |
25
85
 
26
- Pair charts with text summaries or tables for critical data. Tooltips are supplemental.
86
+ ## RTL
27
87
 
28
- ## Install
88
+ `DataChart` inherits direction or accepts `dir="rtl"`. Cartesian category axes and value-axis placement mirror. Block controls, summaries, and tables follow logical layout. Data order is preserved. Text uses the active Banhaten Arabic and English font tokens.
29
89
 
30
- ```bash
31
- npx banhaten add chart
32
- ```
90
+ ## Accessibility
91
+
92
+ Supply a meaningful `label` and a concise `description` of the finding. Charts are labelled figures; hover tooltips supplement that description. Blocks provide keyboard-operable time ranges and expandable data tables. For application data, provide a corresponding table or text summary when precise values matter. Do not rely on color alone: use labels, patterns, dashed strokes, or point markers. Reduced motion disables animations and moving dashes.
33
93
 
34
94
  ## Examples
35
95
 
36
- Primary registry example: `examples/chart-demo.tsx`.
96
+ Primary registry example: `examples/chart-demo.tsx`. Ready-made block example: `examples/chart-block-demo.tsx`.
37
97
 
38
- Open the live component page or run `npx banhaten docs chart` to inspect source files, install command, and examples.
98
+ The live Chart page contains all eight families, all 18 blocks, and an Arabic RTL example. Examples include gradients, texture fills, grouped/stacked/percentage series, dots, brush controls, circular and polygon radar grids, pie labels, radial progress, and Sankey links.
39
99
 
40
100
  ## RTL Rules
41
101
 
42
102
  - `inheritsDirection`: true
43
- - `layout`: Chart labels and legends should use logical layout; chart geometry is controlled by Recharts.
103
+ - `layout`: Cartesian axes mirror; block layouts use logical properties. Legacy Recharts geometry remains caller-controlled.
104
+
105
+ ## Source attribution
106
+
107
+ Chart designs and illustrative block data are adapted from the MIT-licensed [EvilCharts repository](https://github.com/legions-developer/evilcharts). Its notice is included in the installed chart files. The shared renderer uses Apache ECharts under Apache-2.0. Banhaten's token layer, family builders, and lifecycle replace duplicated source chart implementations.
44
108
 
45
109
  <!-- registry-contract:start -->
46
110
  ## Registry Contract
@@ -50,9 +114,16 @@ This table is generated from `registry/index.json`; edit the component-owned sou
50
114
 
51
115
  | Field | Values |
52
116
  | --- | --- |
53
- | `supportedExports` | `components/chart.tsx: ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent` |
54
- | `parts` | `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, `ChartLegendContent` |
55
- | `registryDependencies` | None |
56
- | `features` | `responsive container`, `tooltip content`, `legend content`, `config colors` |
57
- | `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-chart-categorical-aqua`, `--bh-chart-categorical-brand`, `--bh-chart-categorical-danger`, `--bh-chart-categorical-fuchsia`, `--bh-chart-categorical-information`, `--bh-chart-categorical-purple`, `--bh-chart-categorical-success`, `--bh-chart-categorical-warning`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-17xl-288`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--shadow-popover` |
117
+ | `supportedExports` | `components/chart.tsx: ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent`, `components/echart.tsx: EChart`, `components/chart-options.ts: createChartOption`, `components/data-chart.tsx: DataChart`, `components/chart-block.tsx: ChartBlock, chartBlocks` |
118
+ | `parts` | `DataChart`, `ChartBlock`, `EChart`, `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, `ChartLegendContent` |
119
+ | `registryDependencies` | `button`, `progress` |
120
+ | `props.spec` | `ChartSpec; default null; DataChart: family, data, series, variant, stacking, labels, brush, and interaction options. Series colors are Banhaten palette indices.` |
121
+ | `props.label` | `string; default null; DataChart / EChart: required accessible chart name.` |
122
+ | `props.description` | `string; default null; DataChart / EChart: optional accessible text summary.` |
123
+ | `props.block` | `ChartBlockId; default null; ChartBlock: one of 18 documented blocks, with illustrative data and period controls where applicable.` |
124
+ | `props.option` | `(theme: EChartTheme) => EChartsOption; default null; EChart: advanced option factory receives resolved inherited Banhaten tokens.` |
125
+ | `props.onReady` | `(chart, theme) => void \| (() => void); default null; EChart: attach custom interactions and return their cleanup.` |
126
+ | `props.config` | `ChartConfig; default null; Legacy ChartContainer: maps series names to CSS color variables.` |
127
+ | `features` | `eight chart families`, `18 ready-made blocks`, `live theme and font tokens`, `responsive SVG`, `tooltips and legends`, `range brush`, `pattern fills`, `reduced motion`, `RTL`, `Recharts compatibility` |
128
+ | `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-chart-categorical-aqua`, `--bh-chart-categorical-brand`, `--bh-chart-categorical-danger`, `--bh-chart-categorical-fuchsia`, `--bh-chart-categorical-information`, `--bh-chart-categorical-purple`, `--bh-chart-categorical-success`, `--bh-chart-categorical-warning`, `--bh-chart-neutral-default`, `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-default`, `--bh-focus-ring-width`, `--bh-font-family`, `--bh-font-family-mono`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-opacity-15`, `--bh-opacity-30`, `--bh-opacity-90`, `--bh-opacity-muted`, `--bh-radius-3xl-16`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-radius-sm-4`, `--bh-radius-xl-10`, `--bh-radius-xs-2`, `--bh-space-11xl-96`, `--bh-space-12xl-128`, `--bh-space-15xl-224`, `--bh-space-17xl-288`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--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-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-regular-font-size`, `--bh-text-body-3xs-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--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-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-text-heading-lg-semibold-font-size`, `--bh-text-heading-lg-semibold-font-weight`, `--bh-text-heading-lg-semibold-letter-spacing`, `--bh-text-heading-lg-semibold-line-height`, `--bh-text-heading-md-semibold-font-size`, `--bh-text-heading-md-semibold-font-weight`, `--bh-text-heading-md-semibold-letter-spacing`, `--bh-text-heading-md-semibold-line-height`, `--bh-text-heading-xs-semibold-font-size`, `--bh-text-heading-xs-semibold-font-weight`, `--bh-text-heading-xs-semibold-letter-spacing`, `--bh-text-heading-xs-semibold-line-height`, `--elevation-popover` |
58
129
  <!-- registry-contract:end -->
@@ -1,56 +1,56 @@
1
- # Checkbox
2
-
3
- Checkbox is the binary selection primitive for forms, preferences, batch actions, and card-style options. It includes the base Radix checkbox control plus `CheckboxCard` for labeled option rows.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Checkbox aria-label="Accept terms" />
9
-
10
- <CheckboxCard
11
- title="Email updates"
12
- description="Receive product and billing notifications."
13
- controlPosition="start"
14
- />
15
- ```
16
-
17
- | Prop | Values |
18
- | --- | --- |
19
- | `checked` | Radix checkbox checked state |
20
- | `disabled` | `boolean` |
21
- | `CheckboxCard.controlPosition` | `start`, `end` |
22
- | `CheckboxCard.state` | default, selected, disabled |
23
-
24
- ## Token Contract
25
-
26
- Checkbox consumes Banhaten control size, radius, component shadow, border, background, content, interactive, disabled, and typography tokens.
27
-
28
- ## RTL
29
-
30
- `CheckboxCard` uses logical start/end control placement. Labels and descriptions use tokenized body text and `dir="auto"` for mixed Arabic and English copy.
31
-
32
- ## Accessibility
33
-
34
- Use native labels or `aria-label` for standalone checkboxes. Prefer `CheckboxCard` when the selection target needs title and description text.
35
-
36
- ## Install
37
-
38
- ```bash
39
- npx banhaten add checkbox
40
- ```
41
-
42
- ## Examples
43
-
44
- Primary registry example: `examples/checkbox-demo.tsx`.
45
-
46
- Open the live component page or run `npx banhaten docs checkbox` to inspect source files, install command, and examples.
47
-
48
- ## RTL Rules
49
-
50
- - `inheritsDirection`: true
51
- - `controlPlacement`: The card uses start/end control placement so the checkbox mirrors correctly in RTL.
52
- - `textDirection`: Labels and descriptions use dir="auto" and tokenized body-md/body-sm typography.
53
-
1
+ # Checkbox
2
+
3
+ Checkbox is the binary selection primitive for forms, preferences, batch actions, and card-style options. It includes the base Radix checkbox control plus `CheckboxCard` for labeled option rows.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Checkbox aria-label="Accept terms" />
9
+
10
+ <CheckboxCard
11
+ title="Email updates"
12
+ description="Receive product and billing notifications."
13
+ controlPosition="start"
14
+ />
15
+ ```
16
+
17
+ | Prop | Values |
18
+ | --- | --- |
19
+ | `checked` | Radix checkbox checked state |
20
+ | `disabled` | `boolean` |
21
+ | `CheckboxCard.controlPosition` | `start`, `end` |
22
+ | `CheckboxCard.state` | default, selected, disabled |
23
+
24
+ ## Token Contract
25
+
26
+ Checkbox consumes Banhaten control size, radius, component shadow, border, background, content, interactive, disabled, and typography tokens.
27
+
28
+ ## RTL
29
+
30
+ `CheckboxCard` uses logical start/end control placement. Labels and descriptions use tokenized body text and `dir="auto"` for mixed Arabic and English copy.
31
+
32
+ ## Accessibility
33
+
34
+ Use native labels or `aria-label` for standalone checkboxes. Prefer `CheckboxCard` when the selection target needs title and description text.
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npx banhaten add checkbox
40
+ ```
41
+
42
+ ## Examples
43
+
44
+ Primary registry example: `examples/checkbox-demo.tsx`.
45
+
46
+ Open the live component page or run `npx banhaten docs checkbox` to inspect source files, install command, and examples.
47
+
48
+ ## RTL Rules
49
+
50
+ - `inheritsDirection`: true
51
+ - `controlPlacement`: The card uses start/end control placement so the checkbox mirrors correctly in RTL.
52
+ - `textDirection`: Labels and descriptions use dir="auto" and tokenized body-md/body-sm typography.
53
+
54
54
  <!-- registry-contract:start -->
55
55
  ## Registry Contract
56
56
 
@@ -64,5 +64,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
64
64
  | `registryDependencies` | None |
65
65
  | `cardPositions` | `start`, `end` |
66
66
  | `states` | `unchecked`, `checked`, `indeterminate`, `selected`, `disabled` |
67
- | `tokens` | `--bh-bg-default`, `--bh-bg-disabled`, `--bh-bg-raised`, `--bh-bg-raised-hover`, `--bh-border-brand-strong`, `--bh-border-disabled`, `--bh-border-input`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-checkbox-card-border`, `--bh-checkbox-card-border-width`, `--bh-checkbox-card-border-width-active`, `--bh-checkbox-card-border-width-current`, `--bh-checkbox-card-content-gap`, `--bh-checkbox-card-gap`, `--bh-checkbox-card-label-gap`, `--bh-checkbox-card-media-icon-size`, `--bh-checkbox-card-padding`, `--bh-checkbox-card-radius`, `--bh-checkbox-card-text-gap`, `--bh-checkbox-card-width`, `--bh-checkbox-control-border`, `--bh-checkbox-control-radius`, `--bh-checkbox-control-size`, `--bh-checkbox-icon-size`, `--bh-checkbox-root-size`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-on-color`, `--bh-content-subtle`, `--bh-icon-stroke-300`, `--bh-interactive-checkbox-default`, `--bh-interactive-checkbox-hover`, `--bh-opacity-60`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-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`, `--shadow-checkbox-card`, `--shadow-checkbox-card-focus`, `--shadow-checkbox-control`, `--shadow-checkbox-focus`, `--shadow-component-default` |
67
+ | `tokens` | `--bh-bg-default`, `--bh-bg-disabled`, `--bh-bg-raised`, `--bh-bg-raised-hover`, `--bh-border-brand-strong`, `--bh-border-disabled`, `--bh-border-input`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-checkbox-card-border`, `--bh-checkbox-card-border-width`, `--bh-checkbox-card-border-width-active`, `--bh-checkbox-card-border-width-current`, `--bh-checkbox-card-content-gap`, `--bh-checkbox-card-gap`, `--bh-checkbox-card-label-gap`, `--bh-checkbox-card-media-icon-size`, `--bh-checkbox-card-padding`, `--bh-checkbox-card-radius`, `--bh-checkbox-card-text-gap`, `--bh-checkbox-card-width`, `--bh-checkbox-control-border`, `--bh-checkbox-control-radius`, `--bh-checkbox-control-size`, `--bh-checkbox-icon-size`, `--bh-checkbox-root-size`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-icon-stroke-300`, `--bh-interactive-checkbox-content`, `--bh-interactive-checkbox-default`, `--bh-interactive-checkbox-hover`, `--bh-opacity-60`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-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`, `--elevation-checkbox-card`, `--elevation-checkbox-card-focus`, `--elevation-checkbox-control`, `--elevation-checkbox-focus`, `--elevation-component-default` |
68
68
  <!-- registry-contract:end -->
@@ -1,52 +1,66 @@
1
- # Collapsible
2
-
3
- Collapsible wraps Radix Collapsible for disclosure sections with Banhaten trigger and content styling.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Collapsible defaultOpen>
9
- <CollapsibleTrigger>Workspace details</CollapsibleTrigger>
10
- <CollapsibleContent>Billing and team settings.</CollapsibleContent>
11
- </Collapsible>
12
- ```
13
-
14
- | Part | Purpose |
15
- | --- | --- |
16
- | `Collapsible` | Radix root |
17
- | `CollapsibleTrigger` | disclosure button |
18
- | `CollapsibleContent` | expandable content region |
19
-
20
- ## Token Contract
21
-
22
- Collapsible uses Banhaten spacing, radius, body typography, ghost hover, focus, and content tokens.
23
-
24
- ## RTL
25
-
26
- The trigger and content use logical text alignment and inherit document direction.
27
-
28
- ## Accessibility
29
-
30
- Radix manages expanded state, trigger attributes, and content relationships.
31
-
32
- ## Install
33
-
34
- ```bash
35
- npx banhaten add collapsible
36
- ```
37
-
38
- ## Examples
39
-
40
- Primary registry example: `examples/collapsible-demo.tsx`.
41
-
42
- Open the live component page or run `npx banhaten docs collapsible` to inspect source files, install command, and examples.
43
-
44
- ## RTL Rules
45
-
46
- - `inheritsDirection`: true
47
- - `textAlignment`: Trigger and content use logical text alignment and inherit direction.
48
- - `spacing`: Icon and label spacing uses flex gap so it mirrors with document direction.
49
-
1
+ # Collapsible
2
+
3
+ Collapsible wraps Radix Collapsible for disclosure sections with Banhaten trigger and content styling.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Collapsible defaultOpen>
9
+ <CollapsibleTrigger>Workspace details</CollapsibleTrigger>
10
+ <CollapsibleContent>Billing and team settings.</CollapsibleContent>
11
+ </Collapsible>
12
+ ```
13
+
14
+ | Part | Purpose |
15
+ | --- | --- |
16
+ | `Collapsible` | Radix root |
17
+ | `CollapsibleTrigger` | disclosure button; with `asChild` your own element becomes the unstyled trigger |
18
+ | `CollapsibleContent` | expandable content region |
19
+ | `CollapsiblePanel` | unstyled content that animates its height open and closed |
20
+
21
+ Components with their own disclosure design compose the unstyled pieces:
22
+
23
+ ```tsx
24
+ <Collapsible open={open} onOpenChange={setOpen}>
25
+ <CollapsibleTrigger asChild>
26
+ <button type="button">Show details</button>
27
+ </CollapsibleTrigger>
28
+ <CollapsiblePanel>…</CollapsiblePanel>
29
+ </Collapsible>
30
+ ```
31
+
32
+ `CollapsiblePanel` animates on `--collapsible-panel-duration` (default `--bh-duration-moderate`) and `--collapsible-panel-easing` (default `--bh-easing-emphasized`); set them on the panel to tune the motion.
33
+
34
+ ## Token Contract
35
+
36
+ Collapsible uses Banhaten spacing, radius, body typography, ghost hover, focus, and content tokens.
37
+
38
+ ## RTL
39
+
40
+ The trigger and content use logical text alignment and inherit document direction.
41
+
42
+ ## Accessibility
43
+
44
+ Radix manages expanded state, trigger attributes, and content relationships. Closed content unmounts after its closing animation, so nothing inside a closed section can be focused or read.
45
+
46
+ ## Install
47
+
48
+ ```bash
49
+ npx banhaten add collapsible
50
+ ```
51
+
52
+ ## Examples
53
+
54
+ Primary registry example: `examples/collapsible-demo.tsx`.
55
+
56
+ Open the live component page or run `npx banhaten docs collapsible` to inspect source files, install command, and examples.
57
+
58
+ ## RTL Rules
59
+
60
+ - `inheritsDirection`: true
61
+ - `textAlignment`: Trigger and content use logical text alignment and inherit direction.
62
+ - `spacing`: Icon and label spacing uses flex gap so it mirrors with document direction.
63
+
50
64
  <!-- registry-contract:start -->
51
65
  ## Registry Contract
52
66
 
@@ -55,9 +69,9 @@ This table is generated from `registry/index.json`; edit the component-owned sou
55
69
 
56
70
  | Field | Values |
57
71
  | --- | --- |
58
- | `supportedExports` | `components/collapsible.tsx: Collapsible, CollapsibleContent, CollapsibleTrigger` |
59
- | `parts` | `Collapsible`, `CollapsibleTrigger`, `CollapsibleContent` |
72
+ | `supportedExports` | `components/collapsible.tsx: Collapsible, CollapsibleContent, CollapsiblePanel, CollapsibleTrigger` |
73
+ | `parts` | `Collapsible`, `CollapsibleTrigger`, `CollapsibleContent`, `CollapsiblePanel` |
60
74
  | `registryDependencies` | None |
61
- | `features` | `controlled state`, `uncontrolled state`, `keyboard trigger`, `RTL` |
62
- | `tokens` | `--bh-content-default`, `--bh-content-subtle`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-radius-lg-8`, `--bh-space-3xl-16`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-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`, `--shadow-button-focus` |
75
+ | `features` | `controlled state`, `uncontrolled state`, `keyboard trigger`, `RTL`, `animated panel`, `custom trigger with asChild` |
76
+ | `tokens` | `--bh-content-default`, `--bh-content-subtle`, `--bh-duration-moderate`, `--bh-easing-emphasized`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-radius-lg-8`, `--bh-space-3xl-16`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-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`, `--elevation-button-focus` |
63
77
  <!-- registry-contract:end -->