banhaten 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/CHANGELOG.md +139 -73
  2. package/CONTRIBUTING.md +46 -44
  3. package/README.md +192 -190
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -0
  7. package/docs/design-system/README.md +22 -20
  8. package/docs/design-system/adoption-quality-remediation.md +87 -87
  9. package/docs/design-system/agent-usage.md +13 -13
  10. package/docs/design-system/appearance-presets.md +189 -189
  11. package/docs/design-system/appearances/default.md +94 -94
  12. package/docs/design-system/appearances/rounded.md +95 -95
  13. package/docs/design-system/appearances/sharp.md +95 -95
  14. package/docs/design-system/component-docs-pattern.md +81 -81
  15. package/docs/design-system/component-implementation-ownership-audit.md +245 -244
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
  17. package/docs/design-system/component-showcase-consistency-report.md +219 -219
  18. package/docs/design-system/component-token-consistency-audit.md +173 -173
  19. package/docs/design-system/components/README.md +90 -76
  20. package/docs/design-system/components/accordion.md +53 -53
  21. package/docs/design-system/components/activity-feed.md +94 -94
  22. package/docs/design-system/components/activity-heatmap.md +57 -57
  23. package/docs/design-system/components/agent-input.md +85 -0
  24. package/docs/design-system/components/alert-dialog.md +72 -72
  25. package/docs/design-system/components/alert.md +98 -98
  26. package/docs/design-system/components/approval-card.md +134 -0
  27. package/docs/design-system/components/aspect-ratio.md +45 -45
  28. package/docs/design-system/components/attribute.md +89 -89
  29. package/docs/design-system/components/autocomplete.md +75 -75
  30. package/docs/design-system/components/avatar.md +54 -54
  31. package/docs/design-system/components/badge.md +54 -54
  32. package/docs/design-system/components/banner.md +87 -87
  33. package/docs/design-system/components/breadcrumbs.md +177 -176
  34. package/docs/design-system/components/button-group.md +98 -98
  35. package/docs/design-system/components/button.md +83 -80
  36. package/docs/design-system/components/card.md +88 -88
  37. package/docs/design-system/components/carousel.md +46 -46
  38. package/docs/design-system/components/catalog-components.md +47 -47
  39. package/docs/design-system/components/chart.md +95 -24
  40. package/docs/design-system/components/checkbox.md +54 -54
  41. package/docs/design-system/components/collapsible.md +67 -53
  42. package/docs/design-system/components/command.md +62 -62
  43. package/docs/design-system/components/context-menu.md +46 -46
  44. package/docs/design-system/components/date-picker.md +81 -79
  45. package/docs/design-system/components/divider.md +102 -102
  46. package/docs/design-system/components/empty-state.md +56 -56
  47. package/docs/design-system/components/field.md +70 -70
  48. package/docs/design-system/components/file-upload.md +187 -187
  49. package/docs/design-system/components/hover-card.md +48 -48
  50. package/docs/design-system/components/icons.md +48 -48
  51. package/docs/design-system/components/inline-citations.md +93 -0
  52. package/docs/design-system/components/input-group.md +58 -58
  53. package/docs/design-system/components/input-otp.md +56 -56
  54. package/docs/design-system/components/input.md +117 -61
  55. package/docs/design-system/components/item.md +59 -57
  56. package/docs/design-system/components/kbd.md +54 -49
  57. package/docs/design-system/components/label.md +49 -49
  58. package/docs/design-system/components/menu.md +71 -61
  59. package/docs/design-system/components/menubar.md +47 -47
  60. package/docs/design-system/components/modal.md +105 -105
  61. package/docs/design-system/components/native-select.md +54 -54
  62. package/docs/design-system/components/navigation-menu.md +50 -50
  63. package/docs/design-system/components/onboarding-step-list-item.md +82 -82
  64. package/docs/design-system/components/page-header.md +93 -86
  65. package/docs/design-system/components/pagination.md +57 -57
  66. package/docs/design-system/components/popover.md +60 -60
  67. package/docs/design-system/components/progress-slider.md +50 -50
  68. package/docs/design-system/components/progress.md +76 -76
  69. package/docs/design-system/components/radio-card.md +51 -51
  70. package/docs/design-system/components/radio-group.md +57 -57
  71. package/docs/design-system/components/resizable.md +44 -44
  72. package/docs/design-system/components/rolling-count.md +61 -0
  73. package/docs/design-system/components/scroll-area.md +51 -51
  74. package/docs/design-system/components/segmented-control.md +54 -54
  75. package/docs/design-system/components/select.md +68 -62
  76. package/docs/design-system/components/sheet.md +67 -67
  77. package/docs/design-system/components/shimmer-text.md +67 -0
  78. package/docs/design-system/components/sidebar.md +127 -76
  79. package/docs/design-system/components/skeleton.md +75 -75
  80. package/docs/design-system/components/slideout.md +65 -65
  81. package/docs/design-system/components/slider.md +63 -63
  82. package/docs/design-system/components/social-button.md +50 -50
  83. package/docs/design-system/components/spinner.md +62 -62
  84. package/docs/design-system/components/steps.md +65 -65
  85. package/docs/design-system/components/streaming-text.md +82 -0
  86. package/docs/design-system/components/table.md +419 -414
  87. package/docs/design-system/components/tabs.md +59 -55
  88. package/docs/design-system/components/tag.md +80 -80
  89. package/docs/design-system/components/task-list.md +95 -0
  90. package/docs/design-system/components/textarea.md +50 -50
  91. package/docs/design-system/components/thinking-reasoning.md +72 -0
  92. package/docs/design-system/components/thinking-state.md +67 -0
  93. package/docs/design-system/components/timeline.md +83 -83
  94. package/docs/design-system/components/toast.md +58 -58
  95. package/docs/design-system/components/toggle.md +81 -81
  96. package/docs/design-system/components/toolbar.md +92 -87
  97. package/docs/design-system/components/tooltip.md +94 -92
  98. package/docs/design-system/components/typography.md +18 -18
  99. package/docs/design-system/density-and-elevation.md +65 -61
  100. package/docs/design-system/design-system-test-missing-items.md +368 -368
  101. package/docs/design-system/direction-and-localization.md +23 -23
  102. package/docs/design-system/form-recipes.md +73 -73
  103. package/docs/design-system/gap-promotion-policy.md +21 -21
  104. package/docs/design-system/icons.md +74 -69
  105. package/docs/design-system/installation.md +70 -68
  106. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  107. package/docs/design-system/registry-and-cli.md +64 -64
  108. package/docs/design-system/release-policy.md +30 -30
  109. package/docs/design-system/roadmap.md +14 -14
  110. package/docs/design-system/support-matrix.md +23 -23
  111. package/docs/design-system/tabs.md +54 -53
  112. package/docs/design-system/template-gap-audit.md +32 -0
  113. package/docs/design-system/templates.md +59 -0
  114. package/docs/design-system/token-governance.md +72 -60
  115. package/package.json +98 -98
  116. package/registry/component-contract.json +40 -40
  117. package/registry/components/accordion.tsx +155 -155
  118. package/registry/components/agent-input-parts.tsx +552 -0
  119. package/registry/components/agent-input-state.ts +156 -0
  120. package/registry/components/agent-input.css +307 -0
  121. package/registry/components/agent-input.tsx +382 -0
  122. package/registry/components/alert-dialog.tsx +297 -297
  123. package/registry/components/alert.tsx +293 -293
  124. package/registry/components/approval-card.css +409 -0
  125. package/registry/components/approval-card.tsx +401 -0
  126. package/registry/components/approval-frame.tsx +108 -0
  127. package/registry/components/approval-questions.tsx +559 -0
  128. package/registry/components/aspect-ratio.tsx +30 -30
  129. package/registry/components/attribute.tsx +454 -448
  130. package/registry/components/autocomplete.tsx +598 -651
  131. package/registry/components/avatar.tsx +385 -381
  132. package/registry/components/badge.tsx +629 -629
  133. package/registry/components/button-group.tsx +565 -565
  134. package/registry/components/button.tsx +127 -123
  135. package/registry/components/card.tsx +638 -638
  136. package/registry/components/carousel.tsx +296 -296
  137. package/registry/components/chart-block-data.ts +177 -0
  138. package/registry/components/chart-block.css +171 -0
  139. package/registry/components/chart-block.tsx +260 -0
  140. package/registry/components/chart-interactions.ts +123 -0
  141. package/registry/components/chart-options.cartesian.ts +162 -0
  142. package/registry/components/chart-options.paint.ts +99 -0
  143. package/registry/components/chart-options.parts.ts +72 -0
  144. package/registry/components/chart-options.radial.ts +109 -0
  145. package/registry/components/chart-options.ts +44 -0
  146. package/registry/components/chart-options.types.ts +67 -0
  147. package/registry/components/chart.tsx +203 -203
  148. package/registry/components/checkbox.tsx +247 -247
  149. package/registry/components/collapsible.tsx +109 -69
  150. package/registry/components/command.tsx +208 -208
  151. package/registry/components/context-menu.tsx +236 -236
  152. package/registry/components/data-chart.tsx +40 -0
  153. package/registry/components/date-picker.tsx +1289 -1277
  154. package/registry/components/echart-theme.ts +246 -0
  155. package/registry/components/echart.css +49 -0
  156. package/registry/components/echart.tsx +178 -0
  157. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  158. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  159. package/registry/components/expanded/Banner.tsx +179 -179
  160. package/registry/components/expanded/Breadcrumbs.tsx +131 -131
  161. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  162. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  163. package/registry/components/expanded/EmptyState.tsx +155 -155
  164. package/registry/components/expanded/FileUpload.tsx +543 -543
  165. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -59
  166. package/registry/components/expanded/PageHeader.tsx +179 -166
  167. package/registry/components/expanded/Slideout.tsx +108 -108
  168. package/registry/components/expanded/Steps.tsx +402 -402
  169. package/registry/components/expanded/Table.tsx +1092 -1071
  170. package/registry/components/expanded/Timeline.tsx +203 -203
  171. package/registry/components/expanded/activityFeed.css +248 -248
  172. package/registry/components/expanded/activityHeatmap.css +66 -66
  173. package/registry/components/expanded/banner.css +260 -255
  174. package/registry/components/expanded/breadcrumbs.css +140 -140
  175. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  176. package/registry/components/expanded/divider.css +75 -75
  177. package/registry/components/expanded/emptyState.css +111 -111
  178. package/registry/components/expanded/fileUpload.css +457 -457
  179. package/registry/components/expanded/onboardingStepListItem.css +135 -126
  180. package/registry/components/expanded/pageHeader.css +248 -290
  181. package/registry/components/expanded/slideout.css +276 -276
  182. package/registry/components/expanded/steps.css +356 -356
  183. package/registry/components/expanded/table.css +606 -603
  184. package/registry/components/expanded/timeline.css +286 -286
  185. package/registry/components/field.tsx +283 -283
  186. package/registry/components/hover-card.tsx +48 -48
  187. package/registry/components/inline-citations.css +126 -0
  188. package/registry/components/inline-citations.tsx +292 -0
  189. package/registry/components/input-content.ts +107 -107
  190. package/registry/components/input-group.tsx +130 -130
  191. package/registry/components/input-otp.tsx +584 -584
  192. package/registry/components/input.tsx +990 -972
  193. package/registry/components/item.tsx +189 -189
  194. package/registry/components/kbd.tsx +246 -151
  195. package/registry/components/label.tsx +78 -78
  196. package/registry/components/menu.tsx +978 -986
  197. package/registry/components/menubar.tsx +226 -226
  198. package/registry/components/modal.tsx +872 -872
  199. package/registry/components/native-select.tsx +205 -205
  200. package/registry/components/navigation-menu.tsx +171 -171
  201. package/registry/components/pagination.css +36 -36
  202. package/registry/components/pagination.tsx +560 -555
  203. package/registry/components/popover.tsx +338 -338
  204. package/registry/components/progress-slider.tsx +216 -216
  205. package/registry/components/radio-card.tsx +676 -677
  206. package/registry/components/radio-group.tsx +570 -570
  207. package/registry/components/resizable.tsx +108 -108
  208. package/registry/components/rolling-count.css +37 -0
  209. package/registry/components/rolling-count.tsx +110 -0
  210. package/registry/components/scroll-area.tsx +91 -91
  211. package/registry/components/segmented-control.tsx +87 -87
  212. package/registry/components/select-content.tsx +218 -218
  213. package/registry/components/select.tsx +937 -932
  214. package/registry/components/sheet.tsx +305 -305
  215. package/registry/components/shimmer-text.css +69 -0
  216. package/registry/components/shimmer-text.tsx +43 -0
  217. package/registry/components/sidebar.tsx +1433 -358
  218. package/registry/components/skeleton.css +54 -54
  219. package/registry/components/skeleton.tsx +482 -482
  220. package/registry/components/slider.tsx +380 -380
  221. package/registry/components/social-button.tsx +387 -387
  222. package/registry/components/spinner.tsx +78 -78
  223. package/registry/components/streaming-text.css +45 -0
  224. package/registry/components/streaming-text.tsx +165 -0
  225. package/registry/components/table-elements.tsx +128 -128
  226. package/registry/components/tabs.css +222 -218
  227. package/registry/components/tabs.tsx +241 -241
  228. package/registry/components/tag.tsx +423 -423
  229. package/registry/components/task-list.css +328 -0
  230. package/registry/components/task-list.tsx +429 -0
  231. package/registry/components/textarea.tsx +610 -610
  232. package/registry/components/thinking-reasoning.css +178 -0
  233. package/registry/components/thinking-reasoning.tsx +253 -0
  234. package/registry/components/thinking-state.css +8 -0
  235. package/registry/components/thinking-state.tsx +46 -0
  236. package/registry/components/toast.tsx +136 -136
  237. package/registry/components/toggle.tsx +256 -256
  238. package/registry/components/toolbar.tsx +539 -539
  239. package/registry/components/tooltip.tsx +433 -431
  240. package/registry/examples/agent-input-demo.tsx +90 -0
  241. package/registry/examples/alert-demo.tsx +34 -34
  242. package/registry/examples/alert-dialog-demo.tsx +42 -42
  243. package/registry/examples/approval-card-demo.tsx +83 -0
  244. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  245. package/registry/examples/attribute-demo.tsx +65 -65
  246. package/registry/examples/autocomplete-demo.tsx +109 -109
  247. package/registry/examples/avatar-demo.tsx +132 -132
  248. package/registry/examples/badge-demo.tsx +69 -69
  249. package/registry/examples/button-demo.tsx +86 -83
  250. package/registry/examples/button-group-demo.tsx +63 -63
  251. package/registry/examples/card-demo.tsx +86 -86
  252. package/registry/examples/carousel-demo.tsx +43 -43
  253. package/registry/examples/chart-block-demo.tsx +5 -0
  254. package/registry/examples/chart-demo.tsx +18 -33
  255. package/registry/examples/checkbox-demo.tsx +62 -62
  256. package/registry/examples/collapsible-demo.tsx +16 -16
  257. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  258. package/registry/examples/command-demo.tsx +42 -42
  259. package/registry/examples/command-palette-demo.tsx +235 -236
  260. package/registry/examples/context-menu-demo.tsx +29 -29
  261. package/registry/examples/control-density-contract-demo.tsx +65 -61
  262. package/registry/examples/date-picker-demo.tsx +127 -127
  263. package/registry/examples/divider-demo.tsx +17 -17
  264. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  265. package/registry/examples/expanded/banner-demo.tsx +48 -48
  266. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  267. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  268. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  269. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  270. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  271. package/registry/examples/expanded/steps-demo.tsx +29 -29
  272. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  273. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  274. package/registry/examples/field-demo.tsx +51 -51
  275. package/registry/examples/hover-card-demo.tsx +23 -23
  276. package/registry/examples/inline-citations-demo.tsx +31 -0
  277. package/registry/examples/input-actions-demo.tsx +36 -0
  278. package/registry/examples/input-demo.tsx +87 -87
  279. package/registry/examples/input-group-demo.tsx +16 -16
  280. package/registry/examples/input-otp-demo.tsx +72 -72
  281. package/registry/examples/item-demo.tsx +46 -46
  282. package/registry/examples/kbd-demo.tsx +12 -11
  283. package/registry/examples/label-demo.tsx +20 -20
  284. package/registry/examples/menu-demo.tsx +122 -122
  285. package/registry/examples/menubar-demo.tsx +34 -34
  286. package/registry/examples/modal-demo.tsx +74 -74
  287. package/registry/examples/native-select-demo.tsx +16 -16
  288. package/registry/examples/navigation-menu-demo.tsx +29 -29
  289. package/registry/examples/pagination-demo.tsx +20 -20
  290. package/registry/examples/popover-demo.tsx +547 -546
  291. package/registry/examples/progress-demo.tsx +37 -37
  292. package/registry/examples/progress-slider-demo.tsx +29 -29
  293. package/registry/examples/radio-card-demo.tsx +51 -51
  294. package/registry/examples/radio-group-demo.tsx +62 -62
  295. package/registry/examples/resizable-demo.tsx +22 -22
  296. package/registry/examples/results-toolbar-demo.tsx +44 -44
  297. package/registry/examples/rolling-count-demo.tsx +39 -0
  298. package/registry/examples/scroll-area-demo.tsx +15 -15
  299. package/registry/examples/segmented-control-demo.tsx +39 -39
  300. package/registry/examples/select-demo.tsx +87 -87
  301. package/registry/examples/sheet-demo.tsx +47 -47
  302. package/registry/examples/shimmer-text-demo.tsx +20 -0
  303. package/registry/examples/sidebar-demo.tsx +101 -57
  304. package/registry/examples/slider-demo.tsx +31 -31
  305. package/registry/examples/social-button-demo.tsx +61 -61
  306. package/registry/examples/spinner-demo.tsx +59 -59
  307. package/registry/examples/streaming-text-demo.tsx +28 -0
  308. package/registry/examples/tabs-demo.tsx +13 -13
  309. package/registry/examples/tag-demo.tsx +29 -29
  310. package/registry/examples/task-list-demo.tsx +74 -0
  311. package/registry/examples/textarea-demo.tsx +79 -79
  312. package/registry/examples/thinking-reasoning-demo.tsx +74 -0
  313. package/registry/examples/thinking-state-demo.tsx +13 -0
  314. package/registry/examples/toast-demo.tsx +35 -35
  315. package/registry/examples/toggle-demo.tsx +59 -59
  316. package/registry/examples/tooltip-demo.tsx +115 -115
  317. package/registry/guidance/USAGE.md +27 -27
  318. package/registry/guidance/charts.LICENSE.txt +24 -0
  319. package/registry/hooks/use-controllable-state.ts +33 -0
  320. package/registry/hooks/use-direction.ts +207 -207
  321. package/registry/hooks/use-listbox-navigation.ts +73 -0
  322. package/registry/hooks/use-motion-end.ts +55 -0
  323. package/registry/hooks/use-reduced-motion.ts +28 -0
  324. package/registry/index.json +1634 -184
  325. package/registry/styles/globals.css +1462 -1570
  326. package/registry.json +364 -10
  327. package/schema/config.schema.json +51 -51
  328. package/schema/registry.schema.json +194 -190
  329. package/schema/tokens.schema.json +167 -163
  330. package/src/cli/command-line.js +194 -194
  331. package/src/cli/config-editors.js +9 -9
  332. package/src/cli/doctor.js +399 -399
  333. package/src/cli/file-transaction.js +302 -295
  334. package/src/cli/global-css.js +153 -153
  335. package/src/cli/index.js +1002 -1009
  336. package/src/cli/install-plan.js +592 -592
  337. package/src/cli/install-receipt.js +171 -171
  338. package/src/cli/jsonc.js +203 -203
  339. package/src/cli/package-install-state.js +254 -254
  340. package/src/cli/package-manager.js +238 -238
  341. package/src/cli/package-plan.js +185 -185
  342. package/src/cli/package-version.js +97 -97
  343. package/src/cli/registry-query.js +207 -207
  344. package/src/cli/reporting.js +55 -55
  345. package/src/cli/schema-validation.js +19 -19
  346. package/src/cli/source-scanner.js +686 -686
  347. package/src/cli/vite-config.js +478 -478
  348. package/tokens/banhaten.tokens.json +458 -224
@@ -1,69 +1,69 @@
1
- # Sheet
2
-
3
- Sheet is a Radix Dialog-based side or edge panel for contextual workflows that need more room than a popover but less interruption than a full modal. It supports logical `start` and `end` sides for RTL, plus top and bottom placements.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Sheet>
9
- <SheetTrigger asChild>
10
- <Button>Open settings</Button>
11
- </SheetTrigger>
12
- <SheetContent side="end">
13
- <SheetHeader>
14
- <SheetTitle>Workspace settings</SheetTitle>
15
- <SheetDescription>Update billing and access controls.</SheetDescription>
16
- </SheetHeader>
17
- <SheetBody>...</SheetBody>
18
- <SheetFooter>...</SheetFooter>
19
- </SheetContent>
20
- </Sheet>
21
- ```
22
-
23
- | Part | Purpose |
24
- | --- | --- |
25
- | `Sheet`, `SheetTrigger`, `SheetClose`, `SheetPortal` | Radix Dialog shell |
26
- | `SheetOverlay`, `SheetContent` | overlay and trapped panel |
27
- | `SheetHeader`, `SheetTitle`, `SheetDescription` | accessible heading area |
28
- | `SheetBody`, `SheetFooter` | scrollable content and actions |
29
-
30
- | Prop | Values |
31
- | --- | --- |
32
- | `side` | `start`, `end`, `top`, `bottom` |
33
- | `size` | `sm`, `default`, `lg` |
34
- | `showCloseButton` | `boolean` |
35
-
36
- ## Token Contract
37
-
38
- Sheet uses Banhaten overlay, raised surface, border, radius, shadow, spacing, typography, focus, and content tokens.
39
-
40
- ## RTL
41
-
42
- Use `side="start"` and `side="end"` instead of physical left/right placement. CSS logical edges place the panel on the right edge in LTR for `end`, and on the left edge in RTL.
43
-
44
- ## Accessibility
45
-
46
- Radix Dialog provides focus trap, Escape dismissal, outside dismissal, title/description wiring, and modal dialog semantics. Use Alert Dialog for destructive confirmations.
47
-
48
- ## Install
49
-
50
- ```bash
51
- npx banhaten add sheet
52
- ```
53
-
54
- ## Examples
55
-
56
- Primary registry example: `examples/sheet-demo.tsx`.
57
-
58
- Open the live component page or run `npx banhaten docs sheet` to inspect source files, install command, and examples.
59
-
60
- ## RTL Rules
61
-
62
- - `inheritsDirection`: true
63
- - `placement`: Use side="start" and side="end" for logical placement; CSS start/end edges mirror under RTL.
64
- - `textDirection`: Title and description use dir="auto" for Arabic and English copy.
65
- - `semantics`: Radix Dialog handles modal semantics, focus trapping, and dismissal.
66
-
1
+ # Sheet
2
+
3
+ Sheet is a Radix Dialog-based side or edge panel for contextual workflows that need more room than a popover but less interruption than a full modal. It supports logical `start` and `end` sides for RTL, plus top and bottom placements.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Sheet>
9
+ <SheetTrigger asChild>
10
+ <Button>Open settings</Button>
11
+ </SheetTrigger>
12
+ <SheetContent side="end">
13
+ <SheetHeader>
14
+ <SheetTitle>Workspace settings</SheetTitle>
15
+ <SheetDescription>Update billing and access controls.</SheetDescription>
16
+ </SheetHeader>
17
+ <SheetBody>...</SheetBody>
18
+ <SheetFooter>...</SheetFooter>
19
+ </SheetContent>
20
+ </Sheet>
21
+ ```
22
+
23
+ | Part | Purpose |
24
+ | --- | --- |
25
+ | `Sheet`, `SheetTrigger`, `SheetClose`, `SheetPortal` | Radix Dialog shell |
26
+ | `SheetOverlay`, `SheetContent` | overlay and trapped panel |
27
+ | `SheetHeader`, `SheetTitle`, `SheetDescription` | accessible heading area |
28
+ | `SheetBody`, `SheetFooter` | scrollable content and actions |
29
+
30
+ | Prop | Values |
31
+ | --- | --- |
32
+ | `side` | `start`, `end`, `top`, `bottom` |
33
+ | `size` | `sm`, `default`, `lg` |
34
+ | `showCloseButton` | `boolean` |
35
+
36
+ ## Token Contract
37
+
38
+ Sheet uses Banhaten overlay, raised surface, border, radius, shadow, spacing, typography, focus, and content tokens.
39
+
40
+ ## RTL
41
+
42
+ Use `side="start"` and `side="end"` instead of physical left/right placement. CSS logical edges place the panel on the right edge in LTR for `end`, and on the left edge in RTL.
43
+
44
+ ## Accessibility
45
+
46
+ Radix Dialog provides focus trap, Escape dismissal, outside dismissal, title/description wiring, and modal dialog semantics. Use Alert Dialog for destructive confirmations.
47
+
48
+ ## Install
49
+
50
+ ```bash
51
+ npx banhaten add sheet
52
+ ```
53
+
54
+ ## Examples
55
+
56
+ Primary registry example: `examples/sheet-demo.tsx`.
57
+
58
+ Open the live component page or run `npx banhaten docs sheet` to inspect source files, install command, and examples.
59
+
60
+ ## RTL Rules
61
+
62
+ - `inheritsDirection`: true
63
+ - `placement`: Use side="start" and side="end" for logical placement; CSS start/end edges mirror under RTL.
64
+ - `textDirection`: Title and description use dir="auto" for Arabic and English copy.
65
+ - `semantics`: Radix Dialog handles modal semantics, focus trapping, and dismissal.
66
+
67
67
  <!-- registry-contract:start -->
68
68
  ## Registry Contract
69
69
 
@@ -78,5 +78,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
78
78
  | `features` | `focus trap`, `outside dismissal`, `Escape dismissal`, `logical sides`, `scrollable body`, `footer actions` |
79
79
  | `sides` | `start`, `end`, `top`, `bottom` |
80
80
  | `sizes` | `sm`, `default`, `lg` |
81
- | `tokens` | `--bh-bg-backdrop`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-subtle`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-17xl-288`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-xs-4`, `--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-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` |
81
+ | `tokens` | `--bh-bg-backdrop`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-subtle`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-17xl-288`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-xs-4`, `--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-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`, `--elevation-button-focus`, `--elevation-component-default` |
82
82
  <!-- registry-contract:end -->
@@ -0,0 +1,67 @@
1
+ # Shimmer Text
2
+
3
+ `ShimmerText` is text with a soft brightness valley sweeping through it, for labels of work in progress such as a sync that is running or a file being read. The AI conversation components share it: the Thinking State label, the Thinking Reasoning header, the active Task List row, and the Agent Input while it enhances a prompt all use it, so they move the same way.
4
+
5
+ Use it to mark a moving part inside ordinary copy. It is presentational; announce progress through your own semantics or through Thinking State.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ import { ShimmerText } from "@/components/ui/shimmer-text"
11
+
12
+ <p>
13
+ Searching the workspace for <ShimmerText tone="default">billing/invoices.ts</ShimmerText>
14
+ </p>
15
+
16
+ <ShimmerText>Reading 12 files</ShimmerText>
17
+ <ShimmerText animated={false}>Read 12 files</ShimmerText>
18
+ ```
19
+
20
+ | Prop | Type | Default | Description |
21
+ | --- | --- | --- | --- |
22
+ | `animated` | `boolean` | `true` | Runs the brightness sweep. Set false to keep the same colors without motion. |
23
+ | `tone` | `"subtle" \| "default"` | `"subtle"` | `subtle` reads as secondary copy; `default` matches primary text. |
24
+
25
+ Any other `span` prop passes through. The `data-slot="shimmer-text"` attribute is what the styles key on, so it cannot be overridden; wrap the primitive when you need your own hook.
26
+
27
+ ## Install
28
+
29
+ ```bash
30
+ npx banhaten add shimmer-text
31
+ ```
32
+
33
+ ## Examples
34
+
35
+ Primary registry example: `examples/shimmer-text-demo.tsx`.
36
+
37
+ ## Token Contract
38
+
39
+ The shimmer is built from existing content tokens: the base color is `--bh-content-subtle` (or `--bh-content-default` for the `default` tone) and the passing valley is `--bh-content-disabled` (or `--bh-content-subtle`). The sweep runs on `--bh-shimmer-text-duration` with the `--bh-easing-standard` foundation easing. Text size and weight are inherited.
40
+
41
+ Covered source files: `components/shimmer-text.tsx` and `components/shimmer-text.css`.
42
+
43
+ ## RTL Rules
44
+
45
+ - The text inherits document direction.
46
+ - The shine sweeps from the reading start to the reading end, so RTL text uses mirrored keyframes automatically.
47
+
48
+ ## Accessibility
49
+
50
+ The glyphs stay real text, so screen readers read them normally. The shimmer is purely decorative: under `prefers-reduced-motion` it renders as static text in the base color with no gradient, and the resting color keeps the base text contrast.
51
+
52
+ <!-- registry-contract:start -->
53
+ ## Registry Contract
54
+
55
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
56
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
57
+
58
+ | Field | Values |
59
+ | --- | --- |
60
+ | `supportedExports` | `components/shimmer-text.tsx: ShimmerText` |
61
+ | `parts` | `ShimmerText` |
62
+ | `registryDependencies` | None |
63
+ | `props.animated` | `boolean; default "true"; Runs the brightness sweep; set false to keep the same colors without motion.` |
64
+ | `props.tone` | `"subtle" \| "default"; default "subtle"; Secondary or primary text color pair for the sweep.` |
65
+ | `tokens` | `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-easing-standard`, `--bh-shimmer-text-duration` |
66
+ | `tones` | `subtle`, `default` |
67
+ <!-- registry-contract:end -->
@@ -1,74 +1,110 @@
1
- # Sidebar
2
-
3
- Sidebar is a composable app navigation surface with collapse state, grouped menu items, logical start/end placement, and generated `--bh-sidebar-*` tokens.
4
-
5
- `Sidebar` can also render as a standalone static navigation surface. Use `SidebarProvider` whenever collapse controls or provider-aware menu parts are present.
6
-
7
- ## API
8
-
9
- ```tsx
10
- <SidebarProvider>
11
- <Sidebar>
12
- <SidebarHeader>
13
- Workspace
14
- <SidebarToggle />
15
- </SidebarHeader>
16
- <SidebarBody>
17
- <SidebarGroup>
18
- <SidebarGroupLabel>Main</SidebarGroupLabel>
19
- <SidebarMenu>
20
- <SidebarMenuItem>
21
- <SidebarMenuButton active>Overview</SidebarMenuButton>
22
- </SidebarMenuItem>
23
- </SidebarMenu>
24
- </SidebarGroup>
25
- </SidebarBody>
26
- </Sidebar>
27
- </SidebarProvider>
28
- ```
29
-
30
- | Part | Purpose |
31
- | --- | --- |
32
- | `SidebarProvider` | controlled or uncontrolled collapsed state |
33
- | `Sidebar` | navigation surface |
34
- | `SidebarHeader`, `SidebarBody`, `SidebarFooter` | layout regions |
35
- | `SidebarGroup`, `SidebarGroupLabel` | grouped navigation |
36
- | `SidebarMenu`, `SidebarMenuItem`, `SidebarMenuButton` | menu structure |
37
- | `SidebarToggle`, `SidebarRail` | collapse controls |
38
- | `SidebarTrigger` | shadcn-compatible alias for `SidebarToggle` |
39
- | `SidebarInset` | main content wrapper for app-shell layouts |
40
-
41
- ## Token Contract
42
-
43
- Sidebar uses generated `--bh-sidebar-width`, `--bh-sidebar-width-collapsed`, `--bh-sidebar-item-height`, `--bh-sidebar-padding`, `--bh-sidebar-bg`, `--bh-sidebar-border`, and `--shadow-sidebar` tokens.
44
-
45
- ## RTL
46
-
47
- Use `dir="rtl"` on `SidebarProvider` and `side="start"` or `side="end"` for logical placement.
48
-
49
- ## Accessibility
50
-
51
- Use clear labels for collapsed icon-only menu buttons. `SidebarToggle` announces the pressed collapse state.
52
- Sidebar composition parts must be rendered inside `SidebarProvider`.
53
-
54
- ## Install
55
-
56
- ```bash
57
- npx banhaten add sidebar
58
- ```
59
-
60
- ## Examples
61
-
62
- Primary registry example: `examples/sidebar-demo.tsx`.
63
-
64
- Open the live component page or run `npx banhaten docs sidebar` to inspect source files, install command, and examples.
65
-
66
- ## RTL Rules
67
-
68
- - `inheritsDirection`: true
69
- - `placement`: Use side="start" or side="end" with dir on SidebarProvider for logical placement.
70
- - `spacing`: Menu item icon and label spacing uses flex gaps and logical text alignment.
71
-
1
+ # Sidebar
2
+
3
+ Sidebar is the complete Figma-aligned application navigation system. It provides a 900px minimum height, 280px expanded shell and 48px icon rail, staged expand/collapse motion, brand and workspace headers, grouped and nested menus, tree navigation, badges and actions, user footers with hover identity previews, tooltips, controlled state, and logical RTL placement.
4
+
5
+ All sidebar parts render inside `SidebarProvider`. The provider owns controlled or uncontrolled collapse state and supplies the tooltip context used by icon-only menu rows.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ <SidebarProvider>
11
+ <Sidebar>
12
+ <SidebarHeader>
13
+ <SidebarHeaderWorkspaceSwitch label="Acme Inc" />
14
+ </SidebarHeader>
15
+ <SidebarBody>
16
+ <SidebarGroup>
17
+ <SidebarGroupLabel>Main</SidebarGroupLabel>
18
+ <SidebarMenu>
19
+ <SidebarMenuItem>
20
+ <SidebarMenuButton active icon={<LayoutGridIcon />}>
21
+ Overview
22
+ </SidebarMenuButton>
23
+ </SidebarMenuItem>
24
+ <SidebarMenuItem>
25
+ <SidebarMenuButton icon={<CreditCardIcon />}>
26
+ Transactions
27
+ </SidebarMenuButton>
28
+ <SidebarMenuSub>
29
+ <SidebarMenuSubButton active showLine>
30
+ Payments
31
+ </SidebarMenuSubButton>
32
+ </SidebarMenuSub>
33
+ </SidebarMenuItem>
34
+ </SidebarMenu>
35
+ </SidebarGroup>
36
+ </SidebarBody>
37
+ <SidebarFooter>
38
+ <SidebarFooterUser name="Olivia Rhye" supportText="olivia@acme.com" />
39
+ </SidebarFooter>
40
+ </Sidebar>
41
+ </SidebarProvider>
42
+ ```
43
+
44
+ | Part | Purpose |
45
+ | --- | --- |
46
+ | `SidebarProvider` | controlled or uncontrolled collapsed state |
47
+ | `Sidebar` | 280px navigation surface and 48px collapsed rail |
48
+ | `SidebarHeader`, `SidebarBody`, `SidebarFooter` | layout regions |
49
+ | `SidebarHeaderBrand`, `SidebarHeaderWorkspaceSwitch` | brand and workspace header compositions |
50
+ | `SidebarHeaderAction` | compact search or custom header action |
51
+ | `SidebarFooterUser` | supporting-text or bordered user switcher with a collapsed hover/focus identity preview |
52
+ | `SidebarGroup`, `SidebarGroupLabel`, `SidebarGroupAction` | grouped navigation, disclosure, and actions |
53
+ | `SidebarMenu`, `SidebarMenuItem`, `SidebarMenuButton` | default and avatar menu structure with optional slots |
54
+ | `SidebarMenuBadge` | neutral count badge for a menu row |
55
+ | `SidebarMenuSub`, `SidebarMenuSubButton` | plain or line-guided Level 2 navigation |
56
+ | `SidebarTreeGroup`, `SidebarMenuTreeItem` | four-level file or project tree navigation |
57
+ | `SidebarToggle`, `SidebarRail` | collapse controls |
58
+ | `SidebarTrigger` | shadcn-compatible alias for `SidebarToggle` |
59
+ | `SidebarInset` | main content wrapper for app-shell layouts |
60
+
61
+ `SidebarMenuButton` accepts `variant="default" | "avatar" | "level2" | "level2-line"`. Its optional `icon`, `supportText`, `badge`, and `trailingIcon` props keep every row aligned to the Figma slots. Prefer `SidebarMenuSubButton` for nested rows because its `showLine` prop selects the nested treatment directly.
62
+
63
+ Use `SidebarHeaderBrand` for product navigation. Use `SidebarHeaderWorkspaceSwitch` with `variant="actions"` for the compact search/collapse header or `variant="card"` for the bordered workspace card.
64
+
65
+ Brand and workspace headers keep a visible `SidebarTrigger` beneath their identity control while the rail is collapsed, so the same header can always expand again. Pass `collapseAction={false}` only when another persistent expand control is present.
66
+
67
+ When the rail is collapsed, `SidebarFooterUser` reveals the user's name and supporting text beside the avatar on hover or keyboard focus. Set `showIdentityPreview={false}` to disable that behavior. To make the row selectable, wrap it with `MenuRoot` and `MenuTrigger asChild`, then render account actions in a portalled `MenuContent`; the live playground example demonstrates this composition.
68
+
69
+ ## Token Contract
70
+
71
+ Sidebar uses generated `--bh-sidebar-*` tokens for its 900px minimum height, expanded and collapsed widths, row heights, header actions, compact controls, workspace cards, tree indentation, user-preview placement, motion duration and easing, padding, backgrounds, borders, and menu states. Expanded and collapsed navigation share the same 18px glyph in a centered 20px slot. Do not replace these dimensions with local literals in product compositions.
72
+
73
+ ## Motion
74
+
75
+ The shell, header, menu rows, nested lists, and footer share one tokenized choreography. The width boundary uses `--bh-sidebar-motion-duration` with `--bh-sidebar-motion-easing`; labels and secondary actions use the faster `--bh-sidebar-motion-duration-content`. Content exits as collapse begins and returns after `--bh-sidebar-motion-delay-content`, while icons stay on the logical-start track instead of jumping to the center of the still-expanded shell.
76
+
77
+ Nested menus and group labels contract through layout rather than unmounting on the first frame. The rail remains clipped until its width transition finishes, then permits the footer identity preview to extend outside the shell. The global reduced-motion rule and component-level `motion-reduce` variants remove the choreography when the user requests less motion.
78
+
79
+ ## RTL
80
+
81
+ Use `dir="rtl"` on `SidebarProvider` and `side="start"` or `side="end"` for logical placement. Inline borders, padding, submenu guides, tree indentation, collapse icons, and disclosure chevrons mirror automatically.
82
+
83
+ ## Accessibility
84
+
85
+ Provide a text child or explicit `aria-label` for every menu button. Collapsed rows reuse that label in a tooltip. Active menu and tree rows expose `aria-current="page"`; expandable tree rows expose `aria-expanded`; `SidebarToggle` announces both its action and pressed collapse state.
86
+
87
+ Level 2 rows, group labels, and tree groups remain mounted long enough to animate, but become `aria-hidden` and inert while collapsed so keyboard and assistive-technology users do not encounter invisible controls. Use native links through `asChild` when a row navigates, and keep button rendering for in-place actions.
88
+
89
+ ## Install
90
+
91
+ ```bash
92
+ npx banhaten add sidebar
93
+ ```
94
+
95
+ ## Examples
96
+
97
+ Primary registry example: `examples/sidebar-demo.tsx`.
98
+
99
+ Open the live component page or run `npx banhaten docs sidebar` to inspect source files, install command, and examples.
100
+
101
+ ## RTL Rules
102
+
103
+ - `inheritsDirection`: true
104
+ - `placement`: Use side="start" or side="end" with dir on SidebarProvider for logical placement and border selection.
105
+ - `spacing`: Headers, menu rows, nested guides, tree indentation, group actions, and footer content use logical inline spacing.
106
+ - `icons`: Directional collapse, disclosure, and tree chevrons mirror in RTL; semantic icons retain their orientation.
107
+
72
108
  <!-- registry-contract:start -->
73
109
  ## Registry Contract
74
110
 
@@ -77,9 +113,24 @@ This table is generated from `registry/index.json`; edit the component-owned sou
77
113
 
78
114
  | Field | Values |
79
115
  | --- | --- |
80
- | `supportedExports` | `components/sidebar.tsx: Sidebar, SidebarBody, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarToggle, SidebarTrigger` |
81
- | `parts` | `SidebarProvider`, `Sidebar`, `SidebarHeader`, `SidebarBody`, `SidebarFooter`, `SidebarGroup`, `SidebarGroupLabel`, `SidebarMenu`, `SidebarMenuItem`, `SidebarMenuButton`, `SidebarToggle`, `SidebarTrigger`, `SidebarInset`, `SidebarRail` |
82
- | `registryDependencies` | None |
83
- | `features` | `standalone static surface`, `controlled collapse`, `uncontrolled collapse`, `group labels`, `icon-only collapsed state`, `logical side placement` |
84
- | `tokens` | `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-hover`, `--bh-radius-lg-8`, `--bh-sidebar-bg`, `--bh-sidebar-bg-collapsed`, `--bh-sidebar-border`, `--bh-sidebar-icon-size`, `--bh-sidebar-item-bg-active`, `--bh-sidebar-item-bg-hover`, `--bh-sidebar-item-content`, `--bh-sidebar-item-content-active`, `--bh-sidebar-item-gap`, `--bh-sidebar-item-height`, `--bh-sidebar-item-padding-x`, `--bh-sidebar-padding`, `--bh-sidebar-rail-width`, `--bh-sidebar-width`, `--bh-sidebar-width-collapsed`, `--bh-space-19xl-384`, `--bh-space-5xl-24`, `--bh-space-md-8`, `--bh-space-xl-12`, `--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-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-focus`, `--shadow-sidebar` |
116
+ | `supportedExports` | `components/sidebar.tsx: Sidebar, SidebarBody, SidebarFooter, SidebarFooterUser, SidebarGroup, SidebarGroupAction, SidebarGroupLabel, SidebarHeader, SidebarHeaderAction, SidebarHeaderBrand, SidebarHeaderWorkspaceSwitch, SidebarInset, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuTreeItem, SidebarProvider, SidebarRail, SidebarToggle, SidebarTreeGroup, SidebarTrigger` |
117
+ | `parts` | `SidebarProvider`, `Sidebar`, `SidebarHeader`, `SidebarHeaderAction`, `SidebarHeaderBrand`, `SidebarHeaderWorkspaceSwitch`, `SidebarBody`, `SidebarFooter`, `SidebarFooterUser`, `SidebarGroup`, `SidebarGroupAction`, `SidebarGroupLabel`, `SidebarMenu`, `SidebarMenuItem`, `SidebarMenuBadge`, `SidebarMenuButton`, `SidebarMenuSub`, `SidebarMenuSubButton`, `SidebarMenuTreeItem`, `SidebarTreeGroup`, `SidebarToggle`, `SidebarTrigger`, `SidebarInset`, `SidebarRail` |
118
+ | `registryDependencies` | `tooltip` |
119
+ | `props.collapsed` | `boolean; default false; Controls the provider-owned 280px expanded or 48px rail state. Pair with onCollapsedChange for controlled usage.` |
120
+ | `props.defaultCollapsed` | `boolean; default false; Sets the initial rail state when SidebarProvider owns collapse state internally.` |
121
+ | `props.showIdentityPreview` | `boolean; default true; Reveals the collapsed footer user's name and supporting text beside the rail on hover or keyboard focus.` |
122
+ | `props.side` | `"start" \| "end"; default "start"; Places Sidebar on the logical start or end edge and selects the matching logical border.` |
123
+ | `props.variant` | `SidebarMenuButtonVariant \| SidebarWorkspaceVariant \| "default" \| "supporting-text"; default "part-specific"; Selects default/avatar/nested menu rows, action/card workspace headers, or default/supporting-text footers on the part that owns it.` |
124
+ | `props.active` | `boolean; default false; Applies the selected menu or tree treatment and exposes aria-current="page".` |
125
+ | `props.state` | `"default" \| "hover" \| "active" \| "focus"; default "default"; Deterministic interaction state for documentation matrices; product hover and focus remain native CSS interactions.` |
126
+ | `props.showLine` | `boolean; default false; Selects the neutral/brand line-guided Level 2 treatment on SidebarMenuSubButton.` |
127
+ | `props.level` | `1 \| 2 \| 3 \| 4; default 1; Controls tokenized logical indentation for SidebarMenuTreeItem.` |
128
+ | `props.expandable` | `boolean; default false; Adds a disclosure affordance to group labels or tree-group headings.` |
129
+ | `props.asChild` | `boolean; default false; Renders menu, tree, or inset content through Radix Slot while preserving sidebar layout and semantics.` |
130
+ | `directions` | `ltr`, `rtl` |
131
+ | `features` | `280px expanded and 48px collapsed shells`, `controlled collapse`, `uncontrolled collapse`, `brand header with search and collapse actions`, `workspace action and card headers`, `visible collapsed-header expand action`, `default, avatar, Level 2, and Level 2 line menu rows`, `supporting text, count badge, and trailing action slots`, `group labels with disclosure and icon actions`, `four-level tree navigation`, `supporting-text and bordered user footers`, `collapsed footer identity preview on hover and keyboard focus`, `tokenized staged expand and collapse motion`, `reduced-motion fallback`, `icon-only rail with tooltips`, `logical side placement and RTL mirroring` |
132
+ | `sides` | `start`, `end` |
133
+ | `states` | `default`, `hover`, `active`, `focus`, `expanded`, `collapsed` |
134
+ | `tokens` | `--bh-bg-brand-default`, `--bh-bg-default`, `--bh-bg-default-hover`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-border-width-strong`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-sm`, `--bh-icon-stroke-200`, `--bh-interactive-ghost-active`, `--bh-interactive-ghost-default`, `--bh-interactive-ghost-hover`, `--bh-opacity-0`, `--bh-opacity-100`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-radius-xl-10`, `--bh-sidebar-active-guide-height`, `--bh-sidebar-bg`, `--bh-sidebar-bg-collapsed`, `--bh-sidebar-border`, `--bh-sidebar-brand-height`, `--bh-sidebar-compact-control-size`, `--bh-sidebar-header-action-size`, `--bh-sidebar-icon-size`, `--bh-sidebar-icon-size-collapsed`, `--bh-sidebar-icon-slot-size`, `--bh-sidebar-item-bg-active`, `--bh-sidebar-item-bg-hover`, `--bh-sidebar-item-content`, `--bh-sidebar-item-content-active`, `--bh-sidebar-item-height`, `--bh-sidebar-item-height-collapsed`, `--bh-sidebar-item-padding-x`, `--bh-sidebar-level-2-indent-width`, `--bh-sidebar-min-height`, `--bh-sidebar-motion-delay-content`, `--bh-sidebar-motion-duration`, `--bh-sidebar-motion-duration-content`, `--bh-sidebar-motion-easing`, `--bh-sidebar-padding`, `--bh-sidebar-rail-width`, `--bh-sidebar-tree-indent-step`, `--bh-sidebar-tree-item-height`, `--bh-sidebar-user-preview-gap`, `--bh-sidebar-user-preview-height`, `--bh-sidebar-user-preview-width`, `--bh-sidebar-width`, `--bh-sidebar-width-collapsed`, `--bh-sidebar-workspace-card-height`, `--bh-sidebar-workspace-trigger-max-width`, `--bh-sidebar-workspace-trigger-width`, `--bh-space-10xl-80`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-semibold-font-size`, `--bh-text-body-3xs-semibold-font-weight`, `--bh-text-body-3xs-semibold-letter-spacing`, `--bh-text-body-3xs-semibold-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xl-semibold-font-size`, `--bh-text-body-xl-semibold-font-weight`, `--bh-text-body-xl-semibold-letter-spacing`, `--bh-text-body-xl-semibold-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-text-body-xs-semibold-font-weight`, `--bh-z-overlay`, `--elevation-button-focus`, `--elevation-component-default` |
135
+ | `variants` | `default menu`, `avatar menu`, `Level 2 menu`, `Level 2 line menu`, `workspace actions`, `workspace card`, `default footer`, `supporting-text footer` |
85
136
  <!-- registry-contract:end -->
@@ -1,77 +1,77 @@
1
- # Skeleton
2
-
3
- Skeleton is the token-built loading placeholder system for pending content. It includes a small primitive plus composed text, avatar, button, input, card, list, table, and form placeholders.
4
-
5
- ## API
6
-
7
- ```tsx
8
- import {
9
- Skeleton,
10
- SkeletonCard,
11
- SkeletonTable,
12
- SkeletonText,
13
- } from "@/components/ui/skeleton"
14
-
15
- export function LoadingPanel() {
16
- return (
17
- <section aria-busy="true" aria-label="Loading project details">
18
- <SkeletonCard />
19
- <SkeletonTable rows={4} columns={4} />
20
- </section>
21
- )
22
- }
23
- ```
24
-
25
- | Export | Purpose |
26
- | --- | --- |
27
- | `Skeleton` | Base block, text, or circle placeholder. |
28
- | `SkeletonText` | Multi-line text placeholder with optional line widths. |
29
- | `SkeletonAvatar` | Token-sized circular avatar placeholder. |
30
- | `SkeletonButton` | Button-height placeholder for actions and icon buttons. |
31
- | `SkeletonInput` | Label, control, and helper-text loading field. |
32
- | `SkeletonCard` | Media, avatar/text, and action skeleton composition. |
33
- | `SkeletonList` | Repeated row loading state for feeds, menus, and lists. |
34
- | `SkeletonTable` | Header and row loading state for table surfaces. |
35
- | `SkeletonForm` | Repeated input loading state with footer actions. |
36
-
37
- ## Token Contract
38
-
39
- Skeleton consumes Banhaten background, border, radius, spacing, button, card, opacity, and shadow tokens. Custom layout sizing should be passed through CSS variables or token classes rather than raw dimensions.
40
-
41
- - Fill: `--bh-bg-muted`, `--bh-bg-subtle`, `--bh-bg-raised-subtle`, `--bh-bg-brand-subtle`
42
- - Highlight: `--bh-bg-raised-subtle`, `--bh-bg-default`, `--bh-bg-brand-soft`
43
- - Shape: `--bh-radius-md-6`, `--bh-radius-full`, `--bh-control-default`
44
- - Layout: `--bh-space-*`, `--bh-button-*-height`, `--bh-card-desktop-content-padding`
45
-
46
- ## RTL And Accessibility
47
-
48
- - Skeleton compositions inherit `dir` from the nearest parent.
49
- - The shimmer direction mirrors in RTL containers.
50
- - Skeletons are decorative by default. Put `aria-busy="true"` and an accessible label or status message on the loading region when the loading state needs to be announced.
51
-
52
- ## Install
53
-
54
- ```bash
55
- npx banhaten add skeleton
56
- ```
57
-
58
- ## Examples
59
-
60
- Primary registry example: `examples/skeleton-demo.tsx`.
61
-
62
- Open the live component page or run `npx banhaten docs skeleton` to inspect source files, install command, and examples.
63
-
64
- ## RTL Rules
65
-
66
- - `inheritsDirection`: true
67
- - `motion`: The shimmer direction mirrors inside RTL containers while preserving logical layout.
68
- - `composition`: Composed card, list, table, and form placeholders use logical gaps, inherited direction, and token-sized rows.
69
- - `accessibility`: Skeletons are decorative by default; set aria-busy on the loading region and pair with a status label when loading progress needs to be announced.
70
-
71
- ## Accessibility
72
-
73
- Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
74
-
1
+ # Skeleton
2
+
3
+ Skeleton is the token-built loading placeholder system for pending content. It includes a small primitive plus composed text, avatar, button, input, card, list, table, and form placeholders.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ import {
9
+ Skeleton,
10
+ SkeletonCard,
11
+ SkeletonTable,
12
+ SkeletonText,
13
+ } from "@/components/ui/skeleton"
14
+
15
+ export function LoadingPanel() {
16
+ return (
17
+ <section aria-busy="true" aria-label="Loading project details">
18
+ <SkeletonCard />
19
+ <SkeletonTable rows={4} columns={4} />
20
+ </section>
21
+ )
22
+ }
23
+ ```
24
+
25
+ | Export | Purpose |
26
+ | --- | --- |
27
+ | `Skeleton` | Base block, text, or circle placeholder. |
28
+ | `SkeletonText` | Multi-line text placeholder with optional line widths. |
29
+ | `SkeletonAvatar` | Token-sized circular avatar placeholder. |
30
+ | `SkeletonButton` | Button-height placeholder for actions and icon buttons. |
31
+ | `SkeletonInput` | Label, control, and helper-text loading field. |
32
+ | `SkeletonCard` | Media, avatar/text, and action skeleton composition. |
33
+ | `SkeletonList` | Repeated row loading state for feeds, menus, and lists. |
34
+ | `SkeletonTable` | Header and row loading state for table surfaces. |
35
+ | `SkeletonForm` | Repeated input loading state with footer actions. |
36
+
37
+ ## Token Contract
38
+
39
+ Skeleton consumes Banhaten background, border, radius, spacing, button, card, opacity, and elevation tokens. Custom layout sizing should be passed through CSS variables or token classes rather than raw dimensions.
40
+
41
+ - Fill: `--bh-bg-muted`, `--bh-bg-subtle`, `--bh-bg-raised-subtle`, `--bh-bg-brand-subtle`
42
+ - Highlight: `--bh-bg-raised-subtle`, `--bh-bg-default`, `--bh-bg-brand-soft`
43
+ - Shape: `--bh-radius-md-6`, `--bh-radius-full`, `--bh-control-default`
44
+ - Layout: `--bh-space-*`, `--bh-button-*-height`, `--bh-card-desktop-content-padding`
45
+
46
+ ## RTL And Accessibility
47
+
48
+ - Skeleton compositions inherit `dir` from the nearest parent.
49
+ - The shimmer direction mirrors in RTL containers.
50
+ - Skeletons are decorative by default. Put `aria-busy="true"` and an accessible label or status message on the loading region when the loading state needs to be announced.
51
+
52
+ ## Install
53
+
54
+ ```bash
55
+ npx banhaten add skeleton
56
+ ```
57
+
58
+ ## Examples
59
+
60
+ Primary registry example: `examples/skeleton-demo.tsx`.
61
+
62
+ Open the live component page or run `npx banhaten docs skeleton` to inspect source files, install command, and examples.
63
+
64
+ ## RTL Rules
65
+
66
+ - `inheritsDirection`: true
67
+ - `motion`: The shimmer direction mirrors inside RTL containers while preserving logical layout.
68
+ - `composition`: Composed card, list, table, and form placeholders use logical gaps, inherited direction, and token-sized rows.
69
+ - `accessibility`: Skeletons are decorative by default; set aria-busy on the loading region and pair with a status label when loading progress needs to be announced.
70
+
71
+ ## Accessibility
72
+
73
+ Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
74
+
75
75
  <!-- registry-contract:start -->
76
76
  ## Registry Contract
77
77
 
@@ -86,6 +86,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
86
86
  | `features` | `shimmer animation`, `reduced motion`, `text lines`, `avatar placeholders`, `button placeholders`, `input placeholders`, `card placeholders`, `list placeholders`, `table placeholders`, `form placeholders` |
87
87
  | `shapes` | `block`, `text`, `circle` |
88
88
  | `sizes` | `xs`, `sm`, `md`, `lg`, `xl` |
89
- | `tokens` | `--bh-alpha-alpha-transparent`, `--bh-bg-brand-soft`, `--bh-bg-brand-subtle`, `--bh-bg-default`, `--bh-bg-default-hover`, `--bh-bg-muted`, `--bh-bg-raised`, `--bh-bg-raised-subtle`, `--bh-bg-subtle`, `--bh-border-default`, `--bh-border-subtle`, `--bh-button-lg-height`, `--bh-button-md-height`, `--bh-button-sm-height`, `--bh-button-xl-height`, `--bh-card-desktop-content-padding`, `--bh-control-default`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-radius-xl-10`, `--bh-skeleton-bg`, `--bh-skeleton-duration`, `--bh-skeleton-height`, `--bh-skeleton-highlight`, `--bh-skeleton-radius`, `--bh-skeleton-shimmer-width`, `--bh-skeleton-table-columns`, `--bh-skeleton-width`, `--bh-space-11xl-96`, `--bh-space-12xl-128`, `--bh-space-13xl-160`, `--bh-space-14xl-192`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-md-regular-line-height`, `--shadow-component-default` |
89
+ | `tokens` | `--bh-alpha-alpha-transparent`, `--bh-bg-brand-soft`, `--bh-bg-brand-subtle`, `--bh-bg-default`, `--bh-bg-default-hover`, `--bh-bg-muted`, `--bh-bg-raised`, `--bh-bg-raised-subtle`, `--bh-bg-subtle`, `--bh-border-default`, `--bh-border-subtle`, `--bh-button-lg-height`, `--bh-button-md-height`, `--bh-button-sm-height`, `--bh-button-xl-height`, `--bh-card-desktop-content-padding`, `--bh-control-default`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-radius-xl-10`, `--bh-skeleton-bg`, `--bh-skeleton-duration`, `--bh-skeleton-height`, `--bh-skeleton-highlight`, `--bh-skeleton-radius`, `--bh-skeleton-shimmer-width`, `--bh-skeleton-table-columns`, `--bh-skeleton-width`, `--bh-space-11xl-96`, `--bh-space-12xl-128`, `--bh-space-13xl-160`, `--bh-space-14xl-192`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-text-body-md-regular-line-height`, `--elevation-component-default` |
90
90
  | `tones` | `default`, `subtle`, `surface`, `brand` |
91
91
  <!-- registry-contract:end -->