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,84 @@
1
+ # Input
2
+
3
+ Input is the text-entry field primitive for forms, filters, search, numeric entry, tags, shortcuts, add-ons, and action-adorned fields. It supports default and soft variants, md/lg sizing, helper and error text, and RTL-safe slot placement.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Input label="Email" placeholder="name@example.com" />
9
+ <Input state="error" label="Amount" message="Enter a valid amount" />
10
+ ```
11
+
12
+ | Prop | Type / values | Default | Notes |
13
+ | --- | --- | --- | --- |
14
+ | `kind` | `default`, `shortcut`, `add-on`, `inline-add-on`, `tags`, `inline-tags`, `trailing-dropdown`, `leading-dropdown`, `quantity`, `quantity-2`, `trailing-button`, `leading-button` | `default` | Selects the input composition. |
15
+ | `variant` | `default`, `soft` | `default` | Selects the input surface. |
16
+ | `size` | `md`, `lg` | `lg` | Selects the control height. |
17
+ | `state` | `default`, `filled`, `error`, `disabled` | `default` | Selects the visual state. |
18
+ | `label`, `message` | `ReactNode` | `null` | Their presence enables the corresponding text rows unless explicitly disabled. |
19
+ | `hasLeadingIcon` | `boolean` | `false` | Set true to show the default at-sign icon. |
20
+ | `leadingIcon` | `ReactNode \| false` | `null` | A node enables the leading slot; false always removes it. |
21
+ | `hasInformationIcon` | `boolean` | `false` | Set true to show the default information icon. |
22
+ | `trailingIcon` | `ReactNode \| false` | `null` | A node enables the trailing slot; false always removes it. |
23
+
24
+ ## Migration
25
+
26
+ Input no longer adds the default at-sign or information icon when their props are omitted. Add `hasLeadingIcon` or `hasInformationIcon` to retain either previous default, or supply a custom `leadingIcon` or `trailingIcon` to enable that slot. Explicit `false` always removes the corresponding slot.
27
+
28
+ ## Token Contract
29
+
30
+ Input consumes Banhaten field, control, typography, spacing, border, radius, content, disabled, error, and focus tokens. Add-on and button segments should use logical borders and shared field tokens.
31
+
32
+ ## RTL
33
+
34
+ Input uses logical start/end slots and `text-start`. Labels, values, add-ons, tags, and helper text use `dir="auto"` where string copy is rendered.
35
+
36
+ ## Accessibility
37
+
38
+ Connect labels and helper/error text through the component props when possible. Use `state="error"` with visible error copy instead of relying only on red borders.
39
+
40
+ ## Install
41
+
42
+ ```bash
43
+ npx banhaten add input
44
+ ```
45
+
46
+ ## Examples
47
+
48
+ Primary registry example: `examples/input-demo.tsx`.
49
+
50
+ Open the live component page or run `npx banhaten docs input` to inspect source files, install command, and examples.
51
+
52
+ ## RTL Rules
53
+
54
+ - `inheritsDirection`: true
55
+ - `textAlignment`: Uses text-start and dir="auto" so Arabic and English labels, values, add-ons, tags, and helper text align naturally.
56
+ - `spacing`: Uses logical start/end borders and inherited direction so leading and trailing segments mirror in RTL.
57
+
58
+ <!-- registry-contract:start -->
59
+ ## Registry Contract
60
+
61
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
62
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
63
+
64
+ | Field | Values |
65
+ | --- | --- |
66
+ | `supportedExports` | `components/input-content.ts: getInputDefaultValue, getInputHelperText, getInputPlaceholder, getInputTags, inputCopy`, `components/input.tsx: Input, inputContent, inputControl, inputRoot, inputSurface` |
67
+ | `parts` | `Input` |
68
+ | `registryDependencies` | `kbd` |
69
+ | `props.density` | `"compact" \| "default" \| "comfortable"; default "default"; Preferred cross-component sizing contract. Overrides the legacy size prop with 32px, 36px, or 40px control heights.` |
70
+ | `props.hasLeadingIcon` | `boolean; default false; Deprecated compatibility alias for showAtSign.` |
71
+ | `props.leadingIcon` | `React.ReactNode \| false; default null; Supplies and enables a custom leading icon; false always removes the leading slot.` |
72
+ | `props.hasInformationIcon` | `boolean; default false; Deprecated compatibility alias for showInfo.` |
73
+ | `props.trailingIcon` | `React.ReactNode \| false; default null; Supplies and enables a custom trailing icon; false always removes the information slot.` |
74
+ | `props.showAtSign` | `boolean; default false; Explicitly shows the semantic at-sign affordance when no leadingIcon is supplied.` |
75
+ | `props.showInfo` | `boolean; default false; Explicitly shows the semantic information affordance when no trailingIcon is supplied.` |
76
+ | `props.shortcutKeys` | `readonly string[]; default "Mod,K"; Renders the shortcut kind with shared Kbd keycaps. Use Mod for a platform-aware primary modifier.` |
77
+ | `props.shortcut` | `React.ReactNode; default null; Deprecated single-keycap escape hatch. Prefer shortcutKeys for a structured shortcut chord.` |
78
+ | `densities` | `compact`, `default`, `comfortable` |
79
+ | `kinds` | `default`, `shortcut`, `add-on`, `inline-add-on`, `tags`, `inline-tags`, `trailing-dropdown`, `leading-dropdown`, `quantity`, `quantity-2`, `trailing-button`, `leading-button` |
80
+ | `sizes` | `md`, `lg`, `comfortable` |
81
+ | `states` | `default`, `filled`, `error`, `disabled` |
82
+ | `tokens` | `--bh-border-danger-strong`, `--bh-border-default`, `--bh-border-disabled`, `--bh-border-input`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-md`, `--bh-icon-stroke-225`, `--bh-input-border`, `--bh-input-chevron-size`, `--bh-input-comfortable-height`, `--bh-input-comfortable-padding-x`, `--bh-input-content-gap`, `--bh-input-helper-gap`, `--bh-input-icon-size`, `--bh-input-info-icon-size`, `--bh-input-inline-gap`, `--bh-input-inline-tags-gap`, `--bh-input-label-gap`, `--bh-input-lg-height`, `--bh-input-lg-padding-x`, `--bh-input-md-height`, `--bh-input-md-padding-x`, `--bh-input-radius`, `--bh-input-segment-gap`, `--bh-input-segment-padding-x`, `--bh-input-stepper-icon-size`, `--bh-input-stepper-width`, `--bh-input-tag-height`, `--bh-input-tag-padding-x`, `--bh-input-width`, `--bh-interactive-input-default`, `--bh-interactive-input-disabled`, `--bh-interactive-input-soft`, `--bh-interactive-input-soft-disabled`, `--bh-interactive-secondary-default`, `--bh-interactive-secondary-disabled`, `--bh-interactive-secondary-hover`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-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-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-z-raised`, `--shadow-component-default`, `--shadow-input`, `--shadow-input-disabled-overlay`, `--shadow-input-focus-overlay`, `--shadow-input-focus-ring`, `--shadow-input-focus-surface`, `--shadow-input-overlay`, `--shadow-input-surface` |
83
+ | `variants` | `default`, `soft` |
84
+ <!-- registry-contract:end -->
@@ -0,0 +1,72 @@
1
+ # Item
2
+
3
+ Item is Banhaten’s composable row primitive for lists, settings, search results, files, and compact summaries. It keeps media, copy, and actions on one logical layout contract without embedding product behavior or placeholder content.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <ItemGroup aria-label="Recent documents">
9
+ <Item role="listitem" variant="outline">
10
+ <ItemMedia><FileTextIcon aria-hidden="true" /></ItemMedia>
11
+ <ItemContent>
12
+ <ItemTitle>Launch checklist</ItemTitle>
13
+ <ItemDescription>Updated five minutes ago</ItemDescription>
14
+ </ItemContent>
15
+ <ItemActions>{/* real controls */}</ItemActions>
16
+ </Item>
17
+ </ItemGroup>
18
+ ```
19
+
20
+ Use `asChild` when the whole row should be a native link or button. Interactive controls inside `ItemActions` must retain their own accessible names.
21
+
22
+ ## Variants
23
+
24
+ | Prop | Values |
25
+ | --- | --- |
26
+ | `variant` | `default`, `muted`, `outline` |
27
+ | `size` | `sm`, `md`, `lg` |
28
+ | `disabled` | `boolean` |
29
+ | `ItemMedia variant` | `icon`, `avatar`, `image` |
30
+
31
+ ## Install
32
+
33
+ ```bash
34
+ npx banhaten add item
35
+ ```
36
+
37
+ ## Accessibility
38
+
39
+ `ItemGroup` defaults to `role="list"`; give rows `role="listitem"` when using the default non-semantic `div`. Prefer native anchors or buttons through `asChild` for interactive rows. Disabled styling maps to `aria-disabled` and does not invent click behavior.
40
+
41
+ ## RTL Rules
42
+
43
+ - `inheritsDirection`: true
44
+ - `layout`: media, content, and actions follow logical flex order.
45
+ - `textDirection`: title and description use `dir="auto"`.
46
+
47
+ ## Token Contract
48
+
49
+ Every dimension, surface, color, radius, type style, focus treatment, and transition resolves through Banhaten tokens. Covered source file: `components/item.tsx`.
50
+
51
+ ## Examples
52
+
53
+ Primary registry example: `examples/item-demo.tsx`.
54
+
55
+ Open the live component page or run `npx banhaten docs item` to inspect source files, install command, and examples.
56
+
57
+ <!-- registry-contract:start -->
58
+ ## Registry Contract
59
+
60
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
61
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
62
+
63
+ | Field | Values |
64
+ | --- | --- |
65
+ | `supportedExports` | `components/item.tsx: Item, ItemActions, ItemContent, ItemDescription, ItemGroup, ItemMedia, ItemSeparator, ItemTitle, itemVariants` |
66
+ | `parts` | `Item`, `ItemGroup`, `ItemMedia`, `ItemContent`, `ItemTitle`, `ItemDescription`, `ItemActions`, `ItemSeparator` |
67
+ | `registryDependencies` | None |
68
+ | `features` | `media slot`, `content slots`, `action slot`, `asChild composition`, `disabled semantics` |
69
+ | `sizes` | `sm`, `md`, `lg` |
70
+ | `tokens` | `--bh-bg-default`, `--bh-bg-neutral-default`, `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-raised-hover`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-on-color`, `--bh-content-subtle`, `--bh-interactive-ghost-hover`, `--bh-item-actions-gap`, `--bh-item-content-gap`, `--bh-item-gap`, `--bh-item-group-gap`, `--bh-item-icon-size`, `--bh-item-media-radius`, `--bh-item-media-size`, `--bh-item-min-height-lg`, `--bh-item-min-height-md`, `--bh-item-min-height-sm`, `--bh-item-padding-x`, `--bh-item-padding-y`, `--bh-item-radius`, `--bh-radius-full`, `--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` |
71
+ | `variants` | `default`, `muted`, `outline` |
72
+ <!-- registry-contract:end -->
@@ -0,0 +1,62 @@
1
+ # Kbd
2
+
3
+ Kbd renders compact keyboard hints for shortcuts, command rows, and form help text.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Kbd>⌘</Kbd>
9
+ <Kbd>K</Kbd>
10
+ <Kbd size="md">Shift</Kbd>
11
+ ```
12
+
13
+ | Prop | Values |
14
+ | --- | --- |
15
+ | `size` | `sm`, `md` |
16
+
17
+ ## Token Contract
18
+
19
+ Kbd uses Banhaten border, soft interactive background, radius, body-xs typography, and button shadow tokens.
20
+
21
+ ## RTL
22
+
23
+ Kbd is direction-neutral. Use surrounding text direction for shortcut descriptions.
24
+
25
+ ## Accessibility
26
+
27
+ Use Kbd as supporting text, not as the only label for an action.
28
+
29
+ ## Install
30
+
31
+ ```bash
32
+ npx banhaten add kbd
33
+ ```
34
+
35
+ ## Examples
36
+
37
+ Primary registry example: `examples/kbd-demo.tsx`.
38
+
39
+ Open the live component page or run `npx banhaten docs kbd` to inspect source files, install command, and examples.
40
+
41
+ ## RTL Rules
42
+
43
+ - `inheritsDirection`: false
44
+ - `semantics`: Kbd is direction-neutral and should be paired with surrounding text labels.
45
+
46
+ <!-- registry-contract:start -->
47
+ ## Registry Contract
48
+
49
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
50
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
51
+
52
+ | Field | Values |
53
+ | --- | --- |
54
+ | `supportedExports` | `components/kbd.tsx: Kbd, KbdShortcut, kbdVariants` |
55
+ | `parts` | `Kbd`, `KbdShortcut` |
56
+ | `registryDependencies` | None |
57
+ | `props.keys` | `readonly string[]; default null; Required by KbdShortcut. Each entry renders as its own keycap; use Mod for the platform primary modifier.` |
58
+ | `props.platform` | `"auto" \| "mac" \| "windows" \| "linux"; default "auto"; Resolves Mod to Command on Apple platforms and Control elsewhere.` |
59
+ | `props.disabled` | `boolean; default false; Uses disabled border, surface, content, and shadow tokens for shortcuts inside disabled controls.` |
60
+ | `sizes` | `sm`, `md` |
61
+ | `tokens` | `--bh-border-default`, `--bh-border-disabled`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-font-family`, `--bh-interactive-soft-default`, `--bh-interactive-soft-disabled`, `--bh-radius-md-6`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--shadow-button-soft` |
62
+ <!-- registry-contract:end -->
@@ -0,0 +1,64 @@
1
+ # Label
2
+
3
+ Label renders accessible control labels with Banhaten typography, required markers, optional text, tone variants, and RTL-safe copy. It is backed by Radix Label.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Label htmlFor="email" required>
9
+ Email address
10
+ </Label>
11
+ ```
12
+
13
+ | Prop | Values |
14
+ | --- | --- |
15
+ | `htmlFor` | target control id |
16
+ | `tone` | `default`, `subtle`, `danger` |
17
+ | `required` | `boolean` |
18
+ | `optionalText` | `ReactNode` |
19
+
20
+ ## Token Contract
21
+
22
+ Label consumes Banhaten body-sm, body-xs, content, danger, spacing, and disabled-state tokens.
23
+
24
+ ## RTL
25
+
26
+ Label uses logical inline spacing and `dir="auto"` for label and optional text.
27
+
28
+ ## Accessibility
29
+
30
+ Use `htmlFor` for native controls. For complete form rows with description and error text, use `Field`.
31
+
32
+ ## Install
33
+
34
+ ```bash
35
+ npx banhaten add label
36
+ ```
37
+
38
+ ## Examples
39
+
40
+ Primary registry example: `examples/label-demo.tsx`.
41
+
42
+ Open the live component page or run `npx banhaten docs label` to inspect source files, install command, and examples.
43
+
44
+ ## RTL Rules
45
+
46
+ - `inheritsDirection`: true
47
+ - `textDirection`: Label and optional text use dir="auto" so Arabic and English labels resolve naturally.
48
+ - `spacing`: Uses logical inline spacing between label text, required marker, and optional text.
49
+
50
+ <!-- registry-contract:start -->
51
+ ## Registry Contract
52
+
53
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
54
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
55
+
56
+ | Field | Values |
57
+ | --- | --- |
58
+ | `supportedExports` | `components/label.tsx: Label, labelVariants` |
59
+ | `parts` | `Label` |
60
+ | `registryDependencies` | None |
61
+ | `features` | `required marker`, `optional text`, `disabled styling` |
62
+ | `tokens` | `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-space-xs-4`, `--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-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` |
63
+ | `tones` | `default`, `subtle`, `danger` |
64
+ <!-- registry-contract:end -->
@@ -0,0 +1,76 @@
1
+ # Menu
2
+
3
+ Menu is a Radix DropdownMenu-backed action surface for contextual commands, navigation, progress rows, labels, captions, call-to-action rows, submenus, and rich item media.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <MenuRoot>
9
+ <MenuTrigger>Open menu</MenuTrigger>
10
+ <MenuContent width="menu">
11
+ <MenuItem>Profile</MenuItem>
12
+ <MenuSeparator />
13
+ <MenuItem kind="button">Upgrade plan</MenuItem>
14
+ </MenuContent>
15
+ </MenuRoot>
16
+ ```
17
+
18
+ | Part | Purpose |
19
+ | --- | --- |
20
+ | `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal` | Radix-backed menu shell |
21
+ | `MenuItem`, `MenuItemContent`, media slots | interactive rows |
22
+ | `MenuSub`, `MenuSubTrigger`, `MenuSubContent` | nested menus |
23
+ | `MenuLabel`, `MenuCaption`, `MenuSeparator` | non-interactive structure |
24
+
25
+ | Prop | Values |
26
+ | --- | --- |
27
+ | `width` | `menu`, `default`, `multiline`, `action`, `auto` |
28
+ | `kind` | `default`, `multiline`, `action`, `progress`, `button` |
29
+
30
+ ## Token Contract
31
+
32
+ Menu uses Banhaten raised surface, menu shadow, item typography, border, radius, spacing, progress, badge, switch, and focus tokens.
33
+
34
+ ## RTL
35
+
36
+ Menu uses logical padding and flex direction so leading icons, trailing actions, badges, switches, meta text, and submenus mirror naturally. Directional icons should use `data-rtl-flip="true"`.
37
+
38
+ ## Accessibility
39
+
40
+ Radix provides menu roles, focus management, typeahead, keyboard navigation, Escape handling, and outside dismissal. Keep non-command copy in labels or captions, not disabled menu items.
41
+
42
+ ## Install
43
+
44
+ ```bash
45
+ npx banhaten add menu
46
+ ```
47
+
48
+ ## Examples
49
+
50
+ Primary registry example: `examples/menu-demo.tsx`.
51
+
52
+ Open the live component page or run `npx banhaten docs menu` to inspect source files, install command, and examples.
53
+
54
+ ## RTL Rules
55
+
56
+ - `inheritsDirection`: true
57
+ - `spacing`: Uses logical padding and flex direction so leading, trailing, badge, switch, right text, and action slots mirror naturally.
58
+ - `directionalIconFlip`: Use data-rtl-flip="true" on chevrons and arrows that should mirror.
59
+ - `textDirection`: Text slots use dir="auto" by default for Arabic and English labels.
60
+
61
+ <!-- registry-contract:start -->
62
+ ## Registry Contract
63
+
64
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
65
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
66
+
67
+ | Field | Values |
68
+ | --- | --- |
69
+ | `supportedExports` | `components/menu.tsx: Menu, MenuCaption, MenuContent, MenuItem, MenuItemAction, MenuItemAvatar, MenuItemBadge, MenuItemContent, MenuItemDescription, MenuItemIcon, MenuItemMeta, MenuItemSwitch, MenuItemText, MenuItemTitle, MenuLabel, MenuPortal, MenuPreview, MenuProgress, MenuRoot, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuSurface, MenuTrigger, menuItemContentVariants, menuItemIconVariants, menuItemVariants, menuVariants` |
70
+ | `parts` | `Menu`, `MenuPreview`, `MenuSurface`, `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal`, `MenuSub`, `MenuSubTrigger`, `MenuSubContent`, `MenuItem`, `MenuItemContent`, `MenuItemIcon`, `MenuItemAvatar`, `MenuItemText`, `MenuItemTitle`, `MenuItemDescription`, `MenuItemMeta`, `MenuItemBadge`, `MenuItemSwitch`, `MenuItemAction`, `MenuProgress`, `MenuSeparator`, `MenuLabel`, `MenuCaption` |
71
+ | `registryDependencies` | None |
72
+ | `itemKinds` | `default`, `multiline`, `action`, `progress`, `button` |
73
+ | `states` | `default`, `disabled` |
74
+ | `tokens` | `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-border-brand-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-default`, `--bh-icon-stroke-300`, `--bh-interactive-indicator-default`, `--bh-interactive-outlined-default`, `--bh-interactive-outlined-hover`, `--bh-interactive-switch-active`, `--bh-interactive-switch-default`, `--bh-interactive-switch-disabled`, `--bh-interactive-switch-handle`, `--bh-interactive-switch-handle-disabled`, `--bh-menu-action-gap`, `--bh-menu-action-height`, `--bh-menu-action-padding-x`, `--bh-menu-badge-height`, `--bh-menu-badge-padding-x`, `--bh-menu-bg`, `--bh-menu-divider-padding-y`, `--bh-menu-gap`, `--bh-menu-icon-padding`, `--bh-menu-item-action-height`, `--bh-menu-item-action-width`, `--bh-menu-item-bg`, `--bh-menu-item-button-height`, `--bh-menu-item-caption-height`, `--bh-menu-item-content-compact-padding-y`, `--bh-menu-item-content-padding`, `--bh-menu-item-default-height`, `--bh-menu-item-default-width`, `--bh-menu-item-divider-height`, `--bh-menu-item-gap`, `--bh-menu-item-hover-bg`, `--bh-menu-item-label-height`, `--bh-menu-item-multiline-height`, `--bh-menu-item-multiline-width`, `--bh-menu-item-padding-x`, `--bh-menu-item-progress-height`, `--bh-menu-item-radius`, `--bh-menu-item-slot-gap`, `--bh-menu-label-padding-x`, `--bh-menu-leading-icon-size`, `--bh-menu-padding-y`, `--bh-menu-progress-gap`, `--bh-menu-progress-height`, `--bh-menu-radius`, `--bh-menu-switch-handle-size`, `--bh-menu-switch-height`, `--bh-menu-switch-padding`, `--bh-menu-switch-width`, `--bh-menu-trailing-icon-size`, `--bh-menu-width`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-space-5xl-24`, `--bh-space-7xl-40`, `--bh-space-md-8`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-medium-font-size`, `--bh-text-body-3xs-medium-font-weight`, `--bh-text-body-3xs-medium-letter-spacing`, `--bh-text-body-3xs-medium-line-height`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--shadow-menu` |
75
+ | `widths` | `menu`, `default`, `multiline`, `action`, `auto` |
76
+ <!-- registry-contract:end -->
@@ -0,0 +1,60 @@
1
+ # Menubar
2
+
3
+ Menubar wraps Radix Menubar for application-style top menus.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Menubar>
9
+ <MenubarMenu>
10
+ <MenubarTrigger>File</MenubarTrigger>
11
+ <MenubarContent>
12
+ <MenubarItem>New</MenubarItem>
13
+ </MenubarContent>
14
+ </MenubarMenu>
15
+ </Menubar>
16
+ ```
17
+
18
+ ## Token Contract
19
+
20
+ Menubar uses Banhaten menu, surface, border, shadow, hover, spacing, and body typography tokens.
21
+
22
+ ## RTL
23
+
24
+ Triggers, menu items, and shortcuts use logical spacing and inherited direction.
25
+
26
+ ## Accessibility
27
+
28
+ Radix provides menubar roles, keyboard navigation, open state, and submenu behavior.
29
+
30
+ ## Install
31
+
32
+ ```bash
33
+ npx banhaten add menubar
34
+ ```
35
+
36
+ ## Examples
37
+
38
+ Primary registry example: `examples/menubar-demo.tsx`.
39
+
40
+ Open the live component page or run `npx banhaten docs menubar` to inspect source files, install command, and examples.
41
+
42
+ ## RTL Rules
43
+
44
+ - `inheritsDirection`: true
45
+ - `spacing`: Triggers, items, and shortcuts use logical spacing.
46
+
47
+ <!-- registry-contract:start -->
48
+ ## Registry Contract
49
+
50
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
51
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
52
+
53
+ | Field | Values |
54
+ | --- | --- |
55
+ | `supportedExports` | `components/menubar.tsx: Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarTrigger` |
56
+ | `parts` | `Menubar`, `MenubarMenu`, `MenubarTrigger`, `MenubarContent`, `MenubarItem`, `MenubarCheckboxItem`, `MenubarRadioItem`, `MenubarLabel`, `MenubarSeparator`, `MenubarShortcut` |
57
+ | `registryDependencies` | None |
58
+ | `features` | `top menu`, `keyboard navigation`, `checkbox items`, `radio items`, `shortcuts` |
59
+ | `tokens` | `--bh-bg-raised`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-interactive-ghost-hover`, `--bh-interactive-soft-default`, `--bh-menu-item-default-height`, `--bh-menu-item-hover-bg`, `--bh-menu-width`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-radius-xl-10`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-8xl-48`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--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-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--bh-z-popover`, `--shadow-component-default`, `--shadow-menu` |
60
+ <!-- registry-contract:end -->
@@ -0,0 +1,119 @@
1
+ # Modal
2
+
3
+ `Modal` presents a focused dialog surface for decisions and blocking workflows. `ConfirmModal` adds the constrained alert-dialog/confirm pattern for consequential actions.
4
+
5
+ Figma reference: `Design system 3.0 Copy / Modal`, node `227:5480`.
6
+
7
+ ## Variants
8
+
9
+ The implementation covers the six-node Modal matrix from Figma:
10
+
11
+ | Prop | Values |
12
+ | --- | --- |
13
+ | `size` | `sm`, `default`, `lg` |
14
+ | `dir` | `ltr`, `rtl` |
15
+
16
+ ## API
17
+
18
+ ```tsx
19
+ <Modal size="default" />
20
+ <Modal dir="rtl" messages={arabicModalMessages} size="lg" />
21
+ <ConfirmModal intent="danger" confirmLabel="Delete project" />
22
+ ```
23
+
24
+ | Prop | Default |
25
+ | --- | --- |
26
+ | `size` | `sm` |
27
+ | `dir` | inherited |
28
+ | `title` | English default; overrides `messages.title` |
29
+ | `description` | English default; overrides `messages.description` |
30
+ | `messages` | partial localized Modal message catalog |
31
+ | `closeLabel` | overrides `messages.closeLabel` |
32
+ | `showIcon` | `true` |
33
+ | `showCloseButton` | `true` |
34
+ | `showDivider` | `true` |
35
+ | `showFooter` | `true` |
36
+ | `showCheckbox` | `true` |
37
+ | `footer` | none |
38
+
39
+ `ConfirmModal` also accepts:
40
+
41
+ | Prop | Default |
42
+ | --- | --- |
43
+ | `intent` | `danger` |
44
+ | `messages` | partial localized ConfirmModal message catalog |
45
+ | `confirmLabel` / `cancelLabel` | English; direct props override `messages` |
46
+ | `confirmLoading` | `false` |
47
+ | `confirmDisabled` | `false` |
48
+ | `preventOutsideDismiss` | `true` |
49
+ | `closeOnConfirm` / `closeOnCancel` | `true` |
50
+ | `onConfirm` / `onCancel` | none |
51
+
52
+ ## Pixel Rules
53
+
54
+ - Small, Default, and Large modal widths are `440px`, `560px`, and `700px`.
55
+ - The shell uses `--bh-radius-2xl-12`.
56
+ - Header padding is `20px 20px 8px`, with logical end padding reserved for the close button.
57
+ - Body padding is `10px 20px 20px`.
58
+ - Footer padding is `16px 20px`, with a `10px` gap.
59
+ - Actions reuse `Button` with `size="sm"`, `variant="soft"` for the secondary action, and the default variant for the primary action.
60
+ - Confirm actions reuse `Button` with `variant="danger"`, `variant="warning"`, or `variant="default"` from the selected intent.
61
+ - The opt-out control reuses `Checkbox`.
62
+ - Loading confirm actions reuse the Banhaten `Spinner` component.
63
+
64
+ ## Token Contract
65
+
66
+ The component consumes existing Banhaten variables:
67
+
68
+ - Surface: `--bh-bg-raised`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-warning-subtle`
69
+ - Border: `--bh-border-subtle`
70
+ - Content: `--bh-content-default`, `--bh-content-subtle`, `--bh-content-danger-default`, `--bh-content-warning-default`
71
+ - Shape: `--bh-radius-2xl-12`, `--bh-radius-full`
72
+ - Space: `--bh-space-xs-4`, `--bh-space-sm-6`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`
73
+ - Type: `--bh-text-heading-sm-semibold-*`, `--bh-text-body-md-regular-*`
74
+ - Elevation: `--shadow-component-default`, `--shadow-button-focus`, `--shadow-button-danger-focus`
75
+
76
+ ## Accessibility
77
+
78
+ - `ModalContent` is backed by Radix Dialog for focus trap, Escape, outside-click dismissal, and ARIA dialog semantics.
79
+ - `ModalTitle` and `ModalDescription` map to Radix dialog title and description primitives.
80
+ - The close affordance is a real button through `ModalCloseButton`.
81
+ - `ConfirmModal` sets `role="alertdialog"`, focuses the cancel action first when present, disables outside-pointer dismissal by default, and can optionally prevent Escape dismissal.
82
+ - `ModalSurface` is presentational and intended for static documentation or visual comparison, not live modal behavior.
83
+ - Direction never selects modal copy. Choose `messages` from the product locale; direct title, description, action, and close-label props have highest precedence.
84
+
85
+ ## Install
86
+
87
+ ```bash
88
+ npx banhaten add modal
89
+ ```
90
+
91
+ ## Examples
92
+
93
+ Primary registry example: `examples/modal-demo.tsx`.
94
+
95
+ Open the live component page or run `npx banhaten docs modal` to inspect source files, install command, and examples.
96
+
97
+ ## RTL Rules
98
+
99
+ - `inheritsDirection`: true
100
+ - `closePlacement`: Close uses logical inline-end placement so it moves to the left side in RTL.
101
+ - `footerOrder`: The checkbox and action cluster use inherited direction and logical gaps so their order mirrors naturally.
102
+ - `messages`: Direction does not select language. Modal and ConfirmModal accept explicit message catalogs plus direct label overrides.
103
+ - `textDirection`: Title, description, checkbox label, confirm labels, and actions use dir="auto" for Arabic and English copy.
104
+
105
+ <!-- registry-contract:start -->
106
+ ## Registry Contract
107
+
108
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
109
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
110
+
111
+ | Field | Values |
112
+ | --- | --- |
113
+ | `supportedExports` | `components/modal.tsx: ConfirmModal, Modal, ModalActionButton, ModalActions, ModalBody, ModalClose, ModalCloseButton, ModalContent, ModalDescription, ModalDivider, ModalFooter, ModalFooterCheckbox, ModalHeader, ModalHeaderIcon, ModalOverlay, ModalPortal, ModalRoot, ModalSurface, ModalTitle, ModalTrigger, arabicConfirmModalMessages, arabicModalMessages, modalContentVariants, modalSurfaceVariants` |
114
+ | `parts` | `Modal`, `ConfirmModal`, `ModalRoot`, `ModalTrigger`, `ModalContent`, `ModalPortal`, `ModalOverlay`, `ModalHeader`, `ModalHeaderIcon`, `ModalTitle`, `ModalDescription`, `ModalBody`, `ModalDivider`, `ModalFooter`, `ModalFooterCheckbox`, `ModalActions`, `ModalActionButton`, `ModalClose`, `ModalCloseButton`, `ModalSurface` |
115
+ | `registryDependencies` | `alert-dialog`, `button`, `checkbox`, `spinner` |
116
+ | `intents` | `default`, `warning`, `danger` |
117
+ | `sizes` | `sm`, `default`, `lg` |
118
+ | `tokens` | `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-raised`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-warning-default`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-modal-action-label-padding-x`, `--bh-modal-border`, `--bh-modal-width`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--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-xs-4`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-semibold-font-size`, `--bh-text-heading-sm-semibold-font-weight`, `--bh-text-heading-sm-semibold-letter-spacing`, `--bh-text-heading-sm-semibold-line-height`, `--bh-z-overlay`, `--shadow-button-focus`, `--shadow-component-default`, `--shadow-modal` |
119
+ <!-- registry-contract:end -->
@@ -0,0 +1,70 @@
1
+ # Native Select
2
+
3
+ Native Select is a tokenized native `<select>` field for platform forms, mobile fallback, and lightweight option sets.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <NativeSelect
9
+ label="Workspace"
10
+ options={[
11
+ { label: "Design", value: "design" },
12
+ { label: "Engineering", value: "engineering" },
13
+ ]}
14
+ />
15
+ ```
16
+
17
+ | Prop | Values |
18
+ | --- | --- |
19
+ | `size` | `md`, `lg` |
20
+ | `variant` | `default`, `soft` |
21
+ | `state` | `default`, `filled`, `error`, `disabled` |
22
+ | `options` | array of `{ label, value, disabled }` |
23
+
24
+ ## Token Contract
25
+
26
+ Native Select reuses Banhaten select width, label, helper, trigger, border, focus, icon, and validation tokens.
27
+
28
+ ## RTL
29
+
30
+ Native Select accepts `dir` and uses logical padding plus an inline-end chevron.
31
+
32
+ ## Accessibility
33
+
34
+ Prefer `label` or an external `<Label htmlFor>` and use helper or error copy for validation context.
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npx banhaten add native-select
40
+ ```
41
+
42
+ ## Examples
43
+
44
+ Primary registry example: `examples/native-select-demo.tsx`.
45
+
46
+ Open the live component page or run `npx banhaten docs native-select` to inspect source files, install command, and examples.
47
+
48
+ ## RTL Rules
49
+
50
+ - `inheritsDirection`: true
51
+ - `spacing`: Uses logical padding and inline-end chevron placement.
52
+ - `textDirection`: Label and helper copy use dir="auto" through Label and helper text.
53
+
54
+ <!-- registry-contract:start -->
55
+ ## Registry Contract
56
+
57
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
58
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
59
+
60
+ | Field | Values |
61
+ | --- | --- |
62
+ | `supportedExports` | `components/native-select.tsx: NativeSelect, nativeSelectControlVariants, nativeSelectRootVariants` |
63
+ | `parts` | `NativeSelect` |
64
+ | `registryDependencies` | `label` |
65
+ | `features` | `options array`, `native children`, `label`, `helper text`, `error text` |
66
+ | `sizes` | `md`, `lg` |
67
+ | `states` | `default`, `filled`, `error`, `disabled` |
68
+ | `tokens` | `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-icon-stroke-200`, `--bh-input-lg-height`, `--bh-input-md-height`, `--bh-select-field-gap`, `--bh-select-trigger-bg`, `--bh-select-trigger-bg-disabled`, `--bh-select-trigger-bg-soft`, `--bh-select-trigger-border`, `--bh-select-trigger-border-current`, `--bh-select-trigger-border-disabled`, `--bh-select-trigger-border-error`, `--bh-select-trigger-border-focus`, `--bh-select-trigger-icon-color`, `--bh-select-trigger-padding-x`, `--bh-select-trigger-radius`, `--bh-select-width`, `--bh-space-3xl-16`, `--bh-space-8xl-48`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-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-component-default`, `--shadow-select-danger-focus-ring`, `--shadow-select-focus-ring`, `--shadow-select-trigger` |
69
+ | `variants` | `default`, `soft` |
70
+ <!-- registry-contract:end -->