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
@@ -19,7 +19,7 @@ import { Checkbox } from "@/components/ui/checkbox"
19
19
  import { Input } from "@/components/ui/input"
20
20
  import { cn } from "@/lib/utils"
21
21
  import {
22
- Menu,
22
+ MenuPreview,
23
23
  MenuItem,
24
24
  MenuItemIcon,
25
25
  MenuItemText,
@@ -46,8 +46,8 @@ const rtlDescription = "يظهر هذا المحتوى في الاتجاه من
46
46
 
47
47
  export function PopoverDemo() {
48
48
  return (
49
- <div className="grid min-w-0 gap-4">
50
- <div className="grid gap-4 xl:grid-cols-2 2xl:grid-cols-3">
49
+ <div className="grid min-w-0 gap-[var(--bh-space-3xl-16)]">
50
+ <div className="grid gap-[var(--bh-space-3xl-16)] xl:grid-cols-2 2xl:grid-cols-3">
51
51
  <PopoverExample title="Basic Bottom">
52
52
  <Popover defaultOpen>
53
53
  <PopoverTrigger asChild>
@@ -122,7 +122,7 @@ export function PopoverDemo() {
122
122
  </PopoverExample>
123
123
  </div>
124
124
 
125
- <div className="grid gap-4 xl:grid-cols-2 2xl:grid-cols-3">
125
+ <div className="grid gap-[var(--bh-space-3xl-16)] xl:grid-cols-2 2xl:grid-cols-3">
126
126
  <PopoverExample title="Icon Button Trigger">
127
127
  <Popover defaultOpen>
128
128
  <PopoverTrigger asChild>
@@ -199,7 +199,7 @@ export function PopoverDemo() {
199
199
  </PopoverExample>
200
200
  </div>
201
201
 
202
- <div className="grid gap-4 2xl:grid-cols-2">
202
+ <div className="grid gap-[var(--bh-space-3xl-16)] 2xl:grid-cols-2">
203
203
  <PopoverExample density="large" title="Large Content">
204
204
  <Popover defaultOpen>
205
205
  <PopoverTrigger asChild>
@@ -256,7 +256,7 @@ export function PopoverDemo() {
256
256
  </PopoverExample>
257
257
  </div>
258
258
 
259
- <div className="grid gap-4 2xl:grid-cols-2">
259
+ <div className="grid gap-[var(--bh-space-3xl-16)] 2xl:grid-cols-2">
260
260
  <PopoverExample density="matrix" title="Arrow Alignment">
261
261
  <div className="grid min-w-[calc(var(--bh-popover-sm-width)+var(--bh-popover-sm-width)+var(--bh-popover-sm-width)+var(--bh-space-18xl-320))] grid-cols-3 place-items-start gap-[var(--bh-space-6xl-32)]">
262
262
  {(["start", "center", "end"] as const).map((align) => (
@@ -304,7 +304,7 @@ export function PopoverDemo() {
304
304
  </PopoverTrigger>
305
305
  <PopoverContent align="start" dir="rtl" side="right" size="md">
306
306
  <PopoverHeader>
307
- <div className="grid min-w-0 gap-1">
307
+ <div className="grid min-w-0 gap-[var(--bh-space-xs-4)]">
308
308
  <PopoverTitle>{rtlTitle}</PopoverTitle>
309
309
  <PopoverDescription>{rtlDescription}</PopoverDescription>
310
310
  </div>
@@ -337,14 +337,14 @@ function PopoverExample({
337
337
  <div
338
338
  data-popover-example={title}
339
339
  className={cn(
340
- "rounded-md border border-border bg-background p-4",
340
+ "rounded-md border border-border bg-background p-[var(--bh-space-3xl-16)]",
341
341
  popoverExampleWidthClasses[density]
342
342
  )}
343
343
  >
344
344
  <p className="text-xs font-semibold text-muted-foreground">{title}</p>
345
345
  <div
346
346
  className={cn(
347
- "mt-4 flex overflow-visible",
347
+ "mt-[var(--bh-space-3xl-16)] flex overflow-visible",
348
348
  popoverExampleStageHeightClasses[density],
349
349
  popoverExamplePlacementClasses[placement]
350
350
  )}
@@ -391,7 +391,7 @@ function LargeContent() {
391
391
  return (
392
392
  <>
393
393
  <PopoverHeader>
394
- <div className="grid min-w-0 gap-1">
394
+ <div className="grid min-w-0 gap-[var(--bh-space-xs-4)]">
395
395
  <PopoverTitle>Details</PopoverTitle>
396
396
  <PopoverDescription>
397
397
  Larger content can hold explanations, lists, images, and actions.
@@ -400,9 +400,9 @@ function LargeContent() {
400
400
  <PopoverClose />
401
401
  </PopoverHeader>
402
402
  <PopoverBody>
403
- <div className="grid gap-3 rounded-[var(--bh-radius-lg-8)] bg-[var(--bh-bg-neutral-subtle)] p-3">
404
- <div className="h-16 rounded-[var(--bh-radius-md-6)] bg-[var(--bh-bg-raised)]" />
405
- <div className="flex flex-wrap gap-2">
403
+ <div className="grid gap-[var(--bh-space-xl-12)] rounded-[var(--bh-radius-lg-8)] bg-[var(--bh-bg-neutral-subtle)] p-[var(--bh-space-xl-12)]">
404
+ <div className="h-[var(--bh-space-9xl-64)] rounded-[var(--bh-radius-md-6)] bg-[var(--bh-bg-raised)]" />
405
+ <div className="flex flex-wrap gap-[var(--bh-space-md-8)]">
406
406
  <Badge color="green" type="dot">
407
407
  Ready
408
408
  </Badge>
@@ -424,7 +424,7 @@ function FilterContent() {
424
424
  return (
425
425
  <>
426
426
  <PopoverHeader>
427
- <div className="grid min-w-0 gap-1">
427
+ <div className="grid min-w-0 gap-[var(--bh-space-xs-4)]">
428
428
  <PopoverTitle>Status</PopoverTitle>
429
429
  <PopoverDescription>Narrow the table results.</PopoverDescription>
430
430
  </div>
@@ -438,10 +438,10 @@ function FilterContent() {
438
438
  placeholder="Search filters"
439
439
  size="md"
440
440
  />
441
- <div className="grid gap-2">
441
+ <div className="grid gap-[var(--bh-space-md-8)]">
442
442
  {filterOptions.map((option, index) => (
443
443
  <label
444
- className="flex items-center gap-2 text-[length:var(--bh-text-body-xs-regular-font-size)] font-[var(--bh-text-body-xs-regular-font-weight)] leading-[var(--bh-text-body-xs-regular-line-height)] tracking-[var(--bh-text-body-xs-regular-letter-spacing)] text-[var(--bh-content-default)]"
444
+ className="flex items-center gap-[var(--bh-space-md-8)] text-[length:var(--bh-text-body-xs-regular-font-size)] font-[var(--bh-text-body-xs-regular-font-weight)] leading-[var(--bh-text-body-xs-regular-line-height)] tracking-[var(--bh-text-body-xs-regular-letter-spacing)] text-[var(--bh-content-default)]"
445
445
  key={option}
446
446
  >
447
447
  <Checkbox defaultChecked={index === 0} />
@@ -472,7 +472,7 @@ function SettingsContent() {
472
472
  return (
473
473
  <>
474
474
  <PopoverHeader>
475
- <div className="grid min-w-0 gap-1">
475
+ <div className="grid min-w-0 gap-[var(--bh-space-xs-4)]">
476
476
  <PopoverTitle>Settings</PopoverTitle>
477
477
  <PopoverDescription>Update notification preferences.</PopoverDescription>
478
478
  </div>
@@ -501,7 +501,7 @@ function SettingsContent() {
501
501
 
502
502
  function ActionsContent() {
503
503
  return (
504
- <Menu
504
+ <MenuPreview
505
505
  aria-label="Popover actions"
506
506
  className="w-[var(--bh-popover-action-width,var(--bh-menu-width))] bg-transparent py-0 shadow-none"
507
507
  width="auto"
@@ -541,6 +541,6 @@ function ActionsContent() {
541
541
  </MenuItemTitle>
542
542
  </MenuItemText>
543
543
  </MenuItem>
544
- </Menu>
544
+ </MenuPreview>
545
545
  )
546
546
  }
@@ -2,7 +2,7 @@ import { Progress } from "@/components/ui/progress"
2
2
 
3
3
  export function ProgressDemo() {
4
4
  return (
5
- <div className="grid w-full max-w-md gap-6">
5
+ <div className="grid w-full max-w-md gap-[var(--bh-space-5xl-24)]">
6
6
  <Progress
7
7
  aria-label="Upload progress"
8
8
  helperText="Preparing the final file"
@@ -2,7 +2,7 @@ import { ProgressSlider } from "@/components/ui/progress-slider"
2
2
 
3
3
  export function ProgressSliderDemo() {
4
4
  return (
5
- <div className="grid gap-6">
5
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
6
6
  <ProgressSlider
7
7
  aria-label="Investment amount"
8
8
  defaultValue={28}
@@ -17,21 +17,21 @@ const radioCardRtlDemoProps = {
17
17
 
18
18
  export function RadioCardDemo() {
19
19
  return (
20
- <div className="grid gap-6">
21
- <div className="flex flex-wrap items-start gap-4">
20
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
21
+ <div className="flex flex-wrap items-start gap-[var(--bh-space-3xl-16)]">
22
22
  <RadioCard {...radioCardDemoProps} type="with-icon" />
23
23
  <RadioCard {...radioCardDemoProps} type="icon-radio-right" />
24
24
  <RadioCard {...radioCardDemoProps} type="icon-radio-left" />
25
25
  <RadioCard {...radioCardDemoProps} type="radio-label" />
26
26
  </div>
27
27
 
28
- <div className="flex flex-wrap items-start gap-4">
28
+ <div className="flex flex-wrap items-start gap-[var(--bh-space-3xl-16)]">
29
29
  <RadioCard {...radioCardDemoProps} checked type="with-avatar" />
30
30
  <RadioCard {...radioCardDemoProps} checked type="payment" />
31
31
  <RadioCard {...radioCardDemoProps} checked type="company-icon" />
32
32
  </div>
33
33
 
34
- <div className="flex flex-wrap items-start gap-4" dir="rtl">
34
+ <div className="flex flex-wrap items-start gap-[var(--bh-space-3xl-16)]" dir="rtl">
35
35
  <RadioCard {...radioCardRtlDemoProps} direction="rtl" type="with-icon" />
36
36
  <RadioCard
37
37
  {...radioCardRtlDemoProps}
@@ -6,7 +6,7 @@ import {
6
6
 
7
7
  export function RadioGroupDemo() {
8
8
  return (
9
- <div className="grid gap-6">
9
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
10
10
  <RadioGroup
11
11
  defaultValue="monthly"
12
12
  description="Choose the cadence for generated invoices."
@@ -42,7 +42,7 @@ export function RadioGroupDemo() {
42
42
  <RadioGroupItem value="wallet" label="Wallet" />
43
43
  </RadioGroup>
44
44
 
45
- <div className="grid gap-3">
45
+ <div className="grid gap-[var(--bh-space-xl-12)]">
46
46
  <RadioField
47
47
  defaultChecked
48
48
  label="Use as default"
@@ -0,0 +1,22 @@
1
+ import {
2
+ ResizableHandle,
3
+ ResizablePanel,
4
+ ResizablePanelGroup,
5
+ } from "@/components/ui/resizable"
6
+
7
+ export function ResizableDemo() {
8
+ return (
9
+ <ResizablePanelGroup
10
+ direction="horizontal"
11
+ className="h-[var(--bh-space-14xl-192)] rounded-xl border border-[var(--bh-border-subtle)]"
12
+ >
13
+ <ResizablePanel defaultSize={35}>
14
+ <div className="flex size-full items-center justify-center text-sm">Sidebar</div>
15
+ </ResizablePanel>
16
+ <ResizableHandle withHandle />
17
+ <ResizablePanel defaultSize={65}>
18
+ <div className="flex size-full items-center justify-center text-sm">Content</div>
19
+ </ResizablePanel>
20
+ </ResizablePanelGroup>
21
+ )
22
+ }
@@ -0,0 +1,44 @@
1
+ import {
2
+ SegmentedControl,
3
+ SegmentedControlItem,
4
+ SegmentedControlLabel,
5
+ } from "@/components/ui/segmented-control"
6
+ import {
7
+ Toolbar,
8
+ ToolbarButton,
9
+ ToolbarSection,
10
+ ToolbarText,
11
+ } from "@/components/ui/toolbar"
12
+
13
+ export function ResultsToolbarDemo() {
14
+ return (
15
+ <Toolbar
16
+ aria-label="Bookmark results"
17
+ data-recipe="results-toolbar"
18
+ layout="split"
19
+ wrap
20
+ >
21
+ <ToolbarText density="default">
22
+ <strong>5,371</strong>&nbsp;bookmarks · keep scrolling to browse all
23
+ </ToolbarText>
24
+
25
+ <ToolbarSection align="end" wrap>
26
+ <SegmentedControl
27
+ aria-label="Cards per row"
28
+ defaultValue="4"
29
+ density="default"
30
+ >
31
+ <SegmentedControlLabel>Cards / row</SegmentedControlLabel>
32
+ {[3, 4, 5, 6].map((count) => (
33
+ <SegmentedControlItem key={count} value={String(count)}>
34
+ {count}
35
+ </SegmentedControlItem>
36
+ ))}
37
+ </SegmentedControl>
38
+ <ToolbarButton density="default" variant="outline">
39
+ Select
40
+ </ToolbarButton>
41
+ </ToolbarSection>
42
+ </Toolbar>
43
+ )
44
+ }
@@ -0,0 +1,15 @@
1
+ import { ScrollArea } from "@/components/ui/scroll-area"
2
+
3
+ export function ScrollAreaDemo() {
4
+ return (
5
+ <ScrollArea className="h-[var(--bh-space-14xl-192)] w-[var(--bh-space-17xl-288)] rounded-xl border border-[var(--bh-border-subtle)] bg-[var(--bh-bg-raised)]">
6
+ <div className="grid gap-[var(--bh-space-md-8)] p-[var(--bh-space-3xl-16)]">
7
+ {Array.from({ length: 12 }, (_, index) => (
8
+ <div key={index} className="rounded-lg bg-[var(--bh-bg-neutral-subtle)] px-[var(--bh-space-xl-12)] py-[var(--bh-space-md-8)] text-sm">
9
+ Activity item {index + 1}
10
+ </div>
11
+ ))}
12
+ </div>
13
+ </ScrollArea>
14
+ )
15
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ SegmentedControl,
3
+ SegmentedControlItem,
4
+ SegmentedControlLabel,
5
+ } from "@/components/ui/segmented-control"
6
+
7
+ export function SegmentedControlDemo() {
8
+ return (
9
+ <div className="grid gap-[var(--bh-space-3xl-16)]">
10
+ <SegmentedControl
11
+ aria-label="Cards per row"
12
+ defaultValue="4"
13
+ density="default"
14
+ >
15
+ <SegmentedControlLabel>Cards / row</SegmentedControlLabel>
16
+ {[3, 4, 5, 6].map((count) => (
17
+ <SegmentedControlItem key={count} value={String(count)}>
18
+ {count}
19
+ </SegmentedControlItem>
20
+ ))}
21
+ </SegmentedControl>
22
+
23
+ <div dir="rtl">
24
+ <SegmentedControl
25
+ aria-label="عدد البطاقات في الصف"
26
+ defaultValue="4"
27
+ density="compact"
28
+ >
29
+ <SegmentedControlLabel>بطاقات / صف</SegmentedControlLabel>
30
+ {[3, 4, 5, 6].map((count) => (
31
+ <SegmentedControlItem key={count} value={String(count)}>
32
+ {count}
33
+ </SegmentedControlItem>
34
+ ))}
35
+ </SegmentedControl>
36
+ </div>
37
+ </div>
38
+ )
39
+ }
@@ -7,7 +7,7 @@ import {
7
7
 
8
8
  export function SelectDemo() {
9
9
  return (
10
- <div className="grid gap-8">
10
+ <div className="grid gap-[var(--bh-space-6xl-32)]">
11
11
  <Select
12
12
  helperText="This is a hint text"
13
13
  label="Label"
@@ -0,0 +1,47 @@
1
+ import { Button } from "@/components/ui/button"
2
+ import {
3
+ Sheet,
4
+ SheetBody,
5
+ SheetContent,
6
+ SheetDescription,
7
+ SheetFooter,
8
+ SheetHeader,
9
+ SheetTitle,
10
+ SheetTrigger,
11
+ } from "@/components/ui/sheet"
12
+
13
+ export function SheetDemo() {
14
+ return (
15
+ <div className="flex flex-wrap gap-[var(--bh-space-md-8)]">
16
+ {(["start", "end", "top", "bottom"] as const).map((side) => (
17
+ <Sheet key={side}>
18
+ <SheetTrigger asChild>
19
+ <Button size="sm" variant="outline">
20
+ {side}
21
+ </Button>
22
+ </SheetTrigger>
23
+ <SheetContent side={side}>
24
+ <SheetHeader>
25
+ <SheetTitle>Workspace settings</SheetTitle>
26
+ <SheetDescription>
27
+ Review billing, access, and notification settings.
28
+ </SheetDescription>
29
+ </SheetHeader>
30
+ <SheetBody>
31
+ <div className="grid gap-[var(--bh-space-md-8)] text-[length:var(--bh-text-body-sm-regular-font-size)] font-[var(--bh-text-body-sm-regular-font-weight)] leading-[var(--bh-text-body-sm-regular-line-height)] tracking-[var(--bh-text-body-sm-regular-letter-spacing)] text-[var(--bh-content-subtle)]">
32
+ <p>Sheets are suited to contextual workflows that need more space than a popover.</p>
33
+ <p>Use logical start and end sides so the panel mirrors in RTL surfaces.</p>
34
+ </div>
35
+ </SheetBody>
36
+ <SheetFooter>
37
+ <Button size="sm" variant="soft">
38
+ Cancel
39
+ </Button>
40
+ <Button size="sm">Save changes</Button>
41
+ </SheetFooter>
42
+ </SheetContent>
43
+ </Sheet>
44
+ ))}
45
+ </div>
46
+ )
47
+ }
@@ -0,0 +1,55 @@
1
+ import { HomeIcon, SettingsIcon, UsersIcon } from "lucide-react"
2
+
3
+ import {
4
+ Sidebar,
5
+ SidebarBody,
6
+ SidebarFooter,
7
+ SidebarGroup,
8
+ SidebarGroupLabel,
9
+ SidebarHeader,
10
+ SidebarInset,
11
+ SidebarMenu,
12
+ SidebarMenuButton,
13
+ SidebarMenuItem,
14
+ SidebarProvider,
15
+ SidebarTrigger,
16
+ } from "@/components/ui/sidebar"
17
+
18
+ export function SidebarDemo() {
19
+ return (
20
+ <SidebarProvider className="flex h-[var(--bh-space-18xl-320)]" defaultCollapsed={false}>
21
+ <Sidebar>
22
+ <SidebarHeader>
23
+ <div className="min-w-0 flex-1 text-sm font-semibold group-data-[collapsed=true]/sidebar:hidden">
24
+ Banhaten
25
+ </div>
26
+ <SidebarTrigger />
27
+ </SidebarHeader>
28
+ <SidebarBody>
29
+ <SidebarGroup>
30
+ <SidebarGroupLabel>Workspace</SidebarGroupLabel>
31
+ <SidebarMenu>
32
+ <SidebarMenuItem>
33
+ <SidebarMenuButton active icon={<HomeIcon />}>
34
+ Overview
35
+ </SidebarMenuButton>
36
+ </SidebarMenuItem>
37
+ <SidebarMenuItem>
38
+ <SidebarMenuButton icon={<UsersIcon />}>Members</SidebarMenuButton>
39
+ </SidebarMenuItem>
40
+ <SidebarMenuItem>
41
+ <SidebarMenuButton icon={<SettingsIcon />}>Settings</SidebarMenuButton>
42
+ </SidebarMenuItem>
43
+ </SidebarMenu>
44
+ </SidebarGroup>
45
+ </SidebarBody>
46
+ <SidebarFooter>
47
+ <SidebarMenuButton icon={<SettingsIcon />}>Admin</SidebarMenuButton>
48
+ </SidebarFooter>
49
+ </Sidebar>
50
+ <SidebarInset className="grid place-items-center bg-[var(--bh-bg-subtle)] p-[var(--bh-space-4xl-20)] text-sm text-[var(--bh-content-subtle)]">
51
+ App content
52
+ </SidebarInset>
53
+ </SidebarProvider>
54
+ )
55
+ }
@@ -2,7 +2,7 @@ import { Slider } from "@/components/ui/slider"
2
2
 
3
3
  export function SliderDemo() {
4
4
  return (
5
- <div className="grid gap-8">
5
+ <div className="grid gap-[var(--bh-space-6xl-32)]">
6
6
  <Slider
7
7
  aria-label="Budget amount"
8
8
  defaultValue={[40]}
@@ -17,10 +17,10 @@ export function SliderDemo() {
17
17
  minStepsBetweenThumbs={4}
18
18
  />
19
19
 
20
- <div className="flex h-44 items-center">
20
+ <div className="flex h-[calc(var(--bh-space-13xl-160)_+_var(--bh-space-3xl-16))] items-center">
21
21
  <Slider
22
22
  aria-label="Risk tolerance"
23
- className="h-40"
23
+ className="h-[var(--bh-space-13xl-160)]"
24
24
  defaultValue={[60]}
25
25
  orientation="vertical"
26
26
  tone="warning"
@@ -1,4 +1,8 @@
1
- import { SocialButton, type SocialPlatform } from "@/components/ui/social-button"
1
+ import {
2
+ arabicSocialButtonMessages,
3
+ SocialButton,
4
+ type SocialPlatform,
5
+ } from "@/components/ui/social-button"
2
6
 
3
7
  const socialPlatforms: SocialPlatform[] = [
4
8
  "apple",
@@ -11,36 +15,42 @@ const socialPlatforms: SocialPlatform[] = [
11
15
 
12
16
  export function SocialButtonDemo() {
13
17
  return (
14
- <div className="flex flex-col gap-6">
15
- <div className="flex flex-wrap items-center gap-3">
18
+ <div className="flex flex-col gap-[var(--bh-space-5xl-24)]">
19
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
16
20
  {socialPlatforms.map((platform) => (
17
21
  <SocialButton key={platform} platform={platform} />
18
22
  ))}
19
23
  </div>
20
24
 
21
- <div className="flex flex-wrap items-center gap-3">
25
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
22
26
  {socialPlatforms.map((platform) => (
23
27
  <SocialButton key={platform} platform={platform} variant="outline" />
24
28
  ))}
25
29
  </div>
26
30
 
27
- <div className="flex flex-wrap items-center gap-3">
31
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
28
32
  {socialPlatforms.map((platform) => (
29
33
  <SocialButton key={platform} platform={platform} size="icon" />
30
34
  ))}
31
35
  </div>
32
36
 
33
- <div dir="rtl" className="flex flex-wrap items-center gap-3">
37
+ <div dir="rtl" className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
34
38
  {socialPlatforms.map((platform) => (
35
- <SocialButton key={platform} dir="rtl" platform={platform} />
39
+ <SocialButton
40
+ key={platform}
41
+ dir="rtl"
42
+ messages={arabicSocialButtonMessages}
43
+ platform={platform}
44
+ />
36
45
  ))}
37
46
  </div>
38
47
 
39
- <div dir="rtl" className="flex flex-wrap items-center gap-3">
48
+ <div dir="rtl" className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
40
49
  {socialPlatforms.map((platform) => (
41
50
  <SocialButton
42
51
  key={platform}
43
52
  dir="rtl"
53
+ messages={arabicSocialButtonMessages}
44
54
  platform={platform}
45
55
  variant="outline"
46
56
  />
@@ -4,52 +4,52 @@ import { DynamicSpinner, Spinner } from "@/components/ui/spinner"
4
4
 
5
5
  export function SpinnerDemo() {
6
6
  return (
7
- <div className="grid gap-6">
8
- <div className="flex flex-wrap items-center gap-6">
7
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
8
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-5xl-24)]">
9
9
  <Spinner
10
10
  className="text-primary"
11
- style={{ "--bh-spinner-size": "16px" } as React.CSSProperties}
11
+ style={{ "--bh-spinner-size": "var(--bh-space-3xl-16)" } as React.CSSProperties}
12
12
  />
13
13
  <Spinner
14
14
  className="text-success"
15
- style={{ "--bh-spinner-size": "20px" } as React.CSSProperties}
15
+ style={{ "--bh-spinner-size": "var(--bh-space-4xl-20)" } as React.CSSProperties}
16
16
  />
17
17
  <Spinner
18
18
  className="text-danger"
19
- style={{ "--bh-spinner-size": "24px" } as React.CSSProperties}
19
+ style={{ "--bh-spinner-size": "var(--bh-space-5xl-24)" } as React.CSSProperties}
20
20
  />
21
21
  <DynamicSpinner
22
22
  className="text-primary"
23
- style={{ "--bh-spinner-size": "16px" } as React.CSSProperties}
23
+ style={{ "--bh-spinner-size": "var(--bh-space-3xl-16)" } as React.CSSProperties}
24
24
  />
25
25
  <DynamicSpinner
26
26
  className="text-success"
27
- style={{ "--bh-spinner-size": "20px" } as React.CSSProperties}
27
+ style={{ "--bh-spinner-size": "var(--bh-space-4xl-20)" } as React.CSSProperties}
28
28
  />
29
29
  <DynamicSpinner
30
30
  className="text-danger"
31
- style={{ "--bh-spinner-size": "24px" } as React.CSSProperties}
31
+ style={{ "--bh-spinner-size": "var(--bh-space-5xl-24)" } as React.CSSProperties}
32
32
  />
33
33
  </div>
34
34
 
35
- <div className="flex flex-wrap items-center gap-3">
35
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-xl-12)]">
36
36
  <div
37
- className="inline-flex items-center gap-2 text-sm text-muted-foreground"
37
+ className="inline-flex items-center gap-[var(--bh-space-md-8)] text-sm text-muted-foreground"
38
38
  role="status"
39
39
  >
40
40
  <Spinner
41
41
  className="text-current"
42
- style={{ "--bh-spinner-size": "18px" } as React.CSSProperties}
42
+ style={{ "--bh-spinner-size": "calc(var(--bh-space-2xl-14) + var(--bh-space-xs-4))" } as React.CSSProperties}
43
43
  />
44
44
  Loading
45
45
  </div>
46
46
  <div
47
- className="inline-flex items-center gap-2 text-sm text-muted-foreground"
47
+ className="inline-flex items-center gap-[var(--bh-space-md-8)] text-sm text-muted-foreground"
48
48
  role="status"
49
49
  >
50
50
  <DynamicSpinner
51
51
  className="text-current"
52
- style={{ "--bh-spinner-size": "18px" } as React.CSSProperties}
52
+ style={{ "--bh-spinner-size": "calc(var(--bh-space-2xl-14) + var(--bh-space-xs-4))" } as React.CSSProperties}
53
53
  />
54
54
  Syncing
55
55
  </div>
@@ -0,0 +1,13 @@
1
+ import { Tabs } from "@/components/ui/tabs"
2
+
3
+ const tabItems = ["Overview", "Details", "Settings", "Activity", "Files"]
4
+
5
+ export function TabsDemo() {
6
+ return (
7
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
8
+ <Tabs ariaLabel="Tabs" items={tabItems} />
9
+ <Tabs ariaLabel="Tabs" items={tabItems} variant="segment" />
10
+ <Tabs ariaLabel="Tabs" items={tabItems} variant="rounded" />
11
+ </div>
12
+ )
13
+ }
@@ -4,7 +4,7 @@ import { Tag } from "@/components/ui/tag"
4
4
 
5
5
  export function TagDemo() {
6
6
  return (
7
- <div className="flex flex-wrap items-center gap-2">
7
+ <div className="flex flex-wrap items-center gap-[var(--bh-space-md-8)]">
8
8
  <Tag>Label</Tag>
9
9
  <Tag state="active">Active</Tag>
10
10
  <Tag state="disabled">Disabled</Tag>
@@ -31,15 +31,15 @@ const demoRtlTextareaProps = {
31
31
 
32
32
  export function TextareaDemo() {
33
33
  return (
34
- <div className="grid gap-6">
35
- <div className="flex flex-wrap items-start gap-6">
34
+ <div className="grid gap-[var(--bh-space-5xl-24)]">
35
+ <div className="flex flex-wrap items-start gap-[var(--bh-space-5xl-24)]">
36
36
  <Textarea {...demoTextareaProps} />
37
37
  <Textarea {...demoTextareaProps} state="filled" />
38
38
  <Textarea {...demoTextareaProps} hasError state="placeholder" />
39
39
  <Textarea {...demoTextareaProps} state="disabled" />
40
40
  </div>
41
41
 
42
- <div className="flex flex-wrap items-start gap-6">
42
+ <div className="flex flex-wrap items-start gap-[var(--bh-space-5xl-24)]">
43
43
  <Textarea {...demoTextareaProps} type="tags" state="placeholder" />
44
44
  <Textarea
45
45
  {...demoTextareaProps}
@@ -62,7 +62,7 @@ export function TextareaDemo() {
62
62
  />
63
63
  </div>
64
64
 
65
- <div dir="rtl" className="flex flex-wrap items-start gap-6">
65
+ <div dir="rtl" className="flex flex-wrap items-start gap-[var(--bh-space-5xl-24)]">
66
66
  <Textarea {...demoRtlTextareaProps} dir="rtl" />
67
67
  <Textarea {...demoRtlTextareaProps} dir="rtl" state="filled" />
68
68
  <Textarea {...demoRtlTextareaProps} dir="rtl" hasError state="placeholder" />