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,67 +1,67 @@
1
- # Slideout
2
-
3
- `Slideout` renders a right- or left-aligned panel for focused secondary workflows. It supports desktop and mobile breakpoints, three desktop widths, optional header action, optional footer actions, and LTR/RTL direction.
4
-
5
- Figma reference: `Slideout`, node `256:19065`.
6
-
7
- ## Examples
8
-
9
- The local implementation includes these Figma slot-content examples:
10
-
11
- | Example | Figma node |
12
- | --- | --- |
13
- | Filters | `256:18779` |
14
- | User profile activity | `256:18872` |
15
- | Payment detail | `256:18901` |
16
- | Payment detail 02 | `256:18964` |
17
-
18
- ## API
19
-
20
- ```tsx
21
- <Slideout size="small" breakpoint="desktop" dir="ltr">
22
- <SlideoutFiltersExample />
23
- </Slideout>
24
- ```
25
-
26
- | Prop | Values | Default |
27
- | --- | --- | --- |
28
- | `size` | `small`, `medium`, `large` | `small` |
29
- | `breakpoint` | `desktop`, `mobile` | `desktop` |
30
- | `dir` | `ltr`, `rtl` | `ltr` |
31
- | `title` | `string` | none |
32
- | `headerAction` | `boolean` | `true` |
33
- | `footer` | `boolean` | `true` |
34
- | `secondaryAction` | `boolean` | `true` |
35
-
36
- ## Layout
37
-
38
- - Desktop outer sizes match the Figma matrix: small `356px`, medium `416px`, and large `516px`, each at `900px` height.
39
- - Mobile uses `375px x 812px` and removes the desktop panel corner radius.
40
- - Header and footer are fixed-height regions; the body owns vertical scrolling.
41
- - Slot content is passed as children so product workflows can compose filters, activity, payment details, forms, or custom content without changing the panel API.
42
-
43
- ## Accessibility
44
-
45
- - The panel uses `role="dialog"` with the current title as its accessible label.
46
- - Close and action controls are real buttons.
47
- - Slot examples keep text content as real text and mirror layout through `dir="rtl"` rather than separate component APIs.
48
-
49
- ## Install
50
-
51
- ```bash
52
- npx banhaten add slideout
53
- ```
54
-
55
- ## Token Contract
56
-
57
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
58
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
59
- Covered source files: `components/expanded/slideout.css`, `components/expanded/Slideout.tsx`.
60
-
61
- ## RTL Rules
62
-
63
- This component has no special RTL contract beyond inherited document direction and logical spacing.
64
-
1
+ # Slideout
2
+
3
+ `Slideout` renders a right- or left-aligned panel for focused secondary workflows. It supports desktop and mobile breakpoints, three desktop widths, optional header action, optional footer actions, and LTR/RTL direction.
4
+
5
+ Figma reference: `Slideout`, node `256:19065`.
6
+
7
+ ## Examples
8
+
9
+ The local implementation includes these Figma slot-content examples:
10
+
11
+ | Example | Figma node |
12
+ | --- | --- |
13
+ | Filters | `256:18779` |
14
+ | User profile activity | `256:18872` |
15
+ | Payment detail | `256:18901` |
16
+ | Payment detail 02 | `256:18964` |
17
+
18
+ ## API
19
+
20
+ ```tsx
21
+ <Slideout size="small" breakpoint="desktop" dir="ltr">
22
+ <SlideoutFiltersExample />
23
+ </Slideout>
24
+ ```
25
+
26
+ | Prop | Values | Default |
27
+ | --- | --- | --- |
28
+ | `size` | `small`, `medium`, `large` | `small` |
29
+ | `breakpoint` | `desktop`, `mobile` | `desktop` |
30
+ | `dir` | `ltr`, `rtl` | `ltr` |
31
+ | `title` | `string` | none |
32
+ | `headerAction` | `boolean` | `true` |
33
+ | `footer` | `boolean` | `true` |
34
+ | `secondaryAction` | `boolean` | `true` |
35
+
36
+ ## Layout
37
+
38
+ - Desktop outer sizes match the Figma matrix: small `356px`, medium `416px`, and large `516px`, each at `900px` height.
39
+ - Mobile uses `375px x 812px` and removes the desktop panel corner radius.
40
+ - Header and footer are fixed-height regions; the body owns vertical scrolling.
41
+ - Slot content is passed as children so product workflows can compose filters, activity, payment details, forms, or custom content without changing the panel API.
42
+
43
+ ## Accessibility
44
+
45
+ - The panel uses `role="dialog"` with the current title as its accessible label.
46
+ - Close and action controls are real buttons.
47
+ - Slot examples keep text content as real text and mirror layout through `dir="rtl"` rather than separate component APIs.
48
+
49
+ ## Install
50
+
51
+ ```bash
52
+ npx banhaten add slideout
53
+ ```
54
+
55
+ ## Token Contract
56
+
57
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
58
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
59
+ Covered source files: `components/expanded/slideout.css`, `components/expanded/Slideout.tsx`.
60
+
61
+ ## RTL Rules
62
+
63
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
64
+
65
65
  <!-- registry-contract:start -->
66
66
  ## Registry Contract
67
67
 
@@ -76,5 +76,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
76
76
  | `modes` | `desktop`, `mobile` |
77
77
  | `sizes` | `small`, `medium`, `large` |
78
78
  | `states` | `header-action`, `footer-actions`, `without-footer`, `primary-only` |
79
- | `tokens` | `--bh-bg-default`, `--bh-bg-dim`, `--bh-bg-muted`, `--bh-bg-neutral-medium`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-default`, `--bh-border-input`, `--bh-border-subtle`, `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-on-color`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-icon-stroke-220`, `--bh-interactive-brand-default`, `--bh-interactive-ghost-hover`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-11xl-96`, `--bh-space-12xl-128`, `--bh-space-18xl-320`, `--bh-space-19xl-384`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-medium-font-size`, `--bh-text-heading-sm-medium-font-weight`, `--bh-text-heading-sm-medium-line-height`, `--bh-text-heading-xs-medium-font-size`, `--bh-text-heading-xs-medium-line-height`, `--shadow-button-raised`, `--shadow-button-soft`, `--shadow-component-default` |
79
+ | `tokens` | `--bh-bg-default`, `--bh-bg-dim`, `--bh-bg-muted`, `--bh-bg-neutral-medium`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-default`, `--bh-border-input`, `--bh-border-subtle`, `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-on-color`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-icon-stroke-220`, `--bh-interactive-brand-default`, `--bh-interactive-ghost-hover`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-space-11xl-96`, `--bh-space-12xl-128`, `--bh-space-18xl-320`, `--bh-space-19xl-384`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-medium-font-size`, `--bh-text-heading-sm-medium-font-weight`, `--bh-text-heading-sm-medium-line-height`, `--bh-text-heading-xs-medium-font-size`, `--bh-text-heading-xs-medium-line-height`, `--elevation-button-raised`, `--elevation-button-soft`, `--elevation-component-default` |
80
80
  <!-- registry-contract:end -->
@@ -1,65 +1,65 @@
1
- # Slider
2
-
3
- Slider is an accessible value and range control built on Radix Slider. It matches the Figma single-node and double-node slider sets, including text and tooltip indicators above or below the thumb, RTL, tick marks, disabled state, vertical orientation, and the large pill treatment used by the investment savings background.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Slider aria-label="Investment amount" defaultValue={[45]} />
9
-
10
- <Slider
11
- aria-label="Savings range"
12
- ariaLabels={["Minimum savings", "Maximum savings"]}
13
- defaultValue={[25, 72]}
14
- indicator="lower-text"
15
- minStepsBetweenThumbs={4}
16
- />
17
- ```
18
-
19
- ## Variants
20
-
21
- | Prop | Values |
22
- | --- | --- |
23
- | `variant` | `default`, `pill` |
24
- | `size` | `sm`, `default`, `lg` |
25
- | `tone` | `brand`, `neutral`, `success`, `warning`, `danger` |
26
- | `indicator` | `none`, `lower-text`, `upper-text`, `lower-tooltip`, `upper-tooltip` |
27
- | `orientation` | `horizontal`, `vertical` |
28
-
29
- Use `showTicks` and `tickCount` for dotted track markers. Use `indicator` for Figma text/tooltip markers, `thumbLabel` or `thumbLabels` to customize marker text, `showThumbGrip` for pill controls, and `ariaValueText` for assistive value formatting.
30
-
31
- ## Tokens
32
-
33
- Slider consumes component aliases for track size, thumb size, pill height, tick geometry, thumb shadows, and semantic color roles. Tones map to semantic brand/status/accent tokens so color theme changes are inherited automatically.
34
-
35
- ## Install
36
-
37
- ```bash
38
- npx banhaten add slider
39
- ```
40
-
41
- ## Examples
42
-
43
- Primary registry example: `examples/slider-demo.tsx`.
44
-
45
- Open the live component page or run `npx banhaten docs slider` to inspect source files, install command, and examples.
46
-
47
- ## Token Contract
48
-
49
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
50
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
51
- Covered source files: `components/slider.tsx`.
52
-
53
- ## RTL Rules
54
-
55
- - `inheritsDirection`: true
56
- - `valueDirection`: Radix Slider handles direction and keyboard behavior through the inherited dir attribute.
57
- - `spacing`: Uses logical thumb content spacing and tokenized track/thumb geometry.
58
-
59
- ## Accessibility
60
-
61
- This component relies on `@radix-ui/react-slider` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
62
-
1
+ # Slider
2
+
3
+ Slider is an accessible value and range control built on Radix Slider. It matches the Figma single-node and double-node slider sets, including text and tooltip indicators above or below the thumb, RTL, tick marks, disabled state, vertical orientation, and the large pill treatment used by the investment savings background.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Slider aria-label="Investment amount" defaultValue={[45]} />
9
+
10
+ <Slider
11
+ aria-label="Savings range"
12
+ ariaLabels={["Minimum savings", "Maximum savings"]}
13
+ defaultValue={[25, 72]}
14
+ indicator="lower-text"
15
+ minStepsBetweenThumbs={4}
16
+ />
17
+ ```
18
+
19
+ ## Variants
20
+
21
+ | Prop | Values |
22
+ | --- | --- |
23
+ | `variant` | `default`, `pill` |
24
+ | `size` | `sm`, `default`, `lg` |
25
+ | `tone` | `brand`, `neutral`, `success`, `warning`, `danger` |
26
+ | `indicator` | `none`, `lower-text`, `upper-text`, `lower-tooltip`, `upper-tooltip` |
27
+ | `orientation` | `horizontal`, `vertical` |
28
+
29
+ Use `showTicks` and `tickCount` for dotted track markers. Use `indicator` for Figma text/tooltip markers, `thumbLabel` or `thumbLabels` to customize marker text, `showThumbGrip` for pill controls, and `ariaValueText` for assistive value formatting.
30
+
31
+ ## Tokens
32
+
33
+ Slider consumes component aliases for track size, thumb size, pill height, tick geometry, thumb elevation, and semantic color roles. Tones map to semantic brand/status/accent tokens so color theme changes are inherited automatically.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ npx banhaten add slider
39
+ ```
40
+
41
+ ## Examples
42
+
43
+ Primary registry example: `examples/slider-demo.tsx`.
44
+
45
+ Open the live component page or run `npx banhaten docs slider` to inspect source files, install command, and examples.
46
+
47
+ ## Token Contract
48
+
49
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
50
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
51
+ Covered source files: `components/slider.tsx`.
52
+
53
+ ## RTL Rules
54
+
55
+ - `inheritsDirection`: true
56
+ - `valueDirection`: Radix Slider handles direction and keyboard behavior through the inherited dir attribute.
57
+ - `spacing`: Uses logical thumb content spacing and tokenized track/thumb geometry.
58
+
59
+ ## Accessibility
60
+
61
+ This component relies on `@radix-ui/react-slider` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
62
+
63
63
  <!-- registry-contract:start -->
64
64
  ## Registry Contract
65
65
 
@@ -75,7 +75,7 @@ This table is generated from `registry/index.json`; edit the component-owned sou
75
75
  | `indicators` | `none`, `lower-text`, `upper-text`, `lower-tooltip`, `upper-tooltip` |
76
76
  | `sizes` | `sm`, `default`, `lg` |
77
77
  | `states` | `default`, `disabled` |
78
- | `tokens` | `--bh-bg-always-white`, `--bh-bg-brand-soft`, `--bh-bg-brand-subtle`, `--bh-bg-danger-default`, `--bh-bg-danger-soft`, `--bh-bg-danger-subtle`, `--bh-bg-default`, `--bh-bg-disabled`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-bg-success-soft`, `--bh-bg-success-subtle`, `--bh-bg-warning-default`, `--bh-bg-warning-soft`, `--bh-bg-warning-subtle`, `--bh-border-brand-strong`, `--bh-border-brand-subtle`, `--bh-border-danger-strong`, `--bh-border-danger-subtle`, `--bh-border-disabled`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-border-success-strong`, `--bh-border-success-subtle`, `--bh-border-warning-strong`, `--bh-border-warning-subtle`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-interactive-indicator-default`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-radius-md-6`, `--bh-slider-indicator-gap`, `--bh-slider-pill-height`, `--bh-slider-pill-radius`, `--bh-slider-pill-thumb-border-width`, `--bh-slider-pill-thumb-width`, `--bh-slider-pill-track-bg`, `--bh-slider-range-bg`, `--bh-slider-thumb-bg`, `--bh-slider-thumb-grip-bg`, `--bh-slider-thumb-grip-width`, `--bh-slider-thumb-pill-bg`, `--bh-slider-thumb-pill-border`, `--bh-slider-thumb-radius`, `--bh-slider-thumb-ring-bg`, `--bh-slider-thumb-ring-width-current`, `--bh-slider-thumb-ring-width-lg`, `--bh-slider-thumb-ring-width-md`, `--bh-slider-thumb-ring-width-sm`, `--bh-slider-thumb-size-current`, `--bh-slider-thumb-size-lg`, `--bh-slider-thumb-size-md`, `--bh-slider-thumb-size-sm`, `--bh-slider-tick-bg`, `--bh-slider-tick-gap`, `--bh-slider-tick-size`, `--bh-slider-track-bg`, `--bh-slider-track-radius`, `--bh-slider-track-size-current`, `--bh-slider-track-size-lg`, `--bh-slider-track-size-md`, `--bh-slider-track-size-sm`, `--bh-slider-vertical-height`, `--bh-slider-width`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-medium-letter-spacing`, `--bh-text-body-2xs-medium-line-height`, `--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-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-z-base`, `--bh-z-overlay`, `--bh-z-popover`, `--bh-z-raised`, `--shadow-slider-thumb`, `--shadow-slider-thumb-focus`, `--shadow-slider-tooltip` |
78
+ | `tokens` | `--bh-bg-always-white`, `--bh-bg-brand-soft`, `--bh-bg-brand-subtle`, `--bh-bg-danger-default`, `--bh-bg-danger-soft`, `--bh-bg-danger-subtle`, `--bh-bg-default`, `--bh-bg-disabled`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-bg-success-soft`, `--bh-bg-success-subtle`, `--bh-bg-warning-default`, `--bh-bg-warning-soft`, `--bh-bg-warning-subtle`, `--bh-border-brand-strong`, `--bh-border-brand-subtle`, `--bh-border-danger-strong`, `--bh-border-danger-subtle`, `--bh-border-disabled`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-border-success-strong`, `--bh-border-success-subtle`, `--bh-border-warning-strong`, `--bh-border-warning-subtle`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-subtle`, `--bh-interactive-indicator-default`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-radius-md-6`, `--bh-slider-indicator-gap`, `--bh-slider-pill-height`, `--bh-slider-pill-radius`, `--bh-slider-pill-thumb-border-width`, `--bh-slider-pill-thumb-width`, `--bh-slider-pill-track-bg`, `--bh-slider-range-bg`, `--bh-slider-thumb-bg`, `--bh-slider-thumb-grip-bg`, `--bh-slider-thumb-grip-width`, `--bh-slider-thumb-pill-bg`, `--bh-slider-thumb-pill-border`, `--bh-slider-thumb-radius`, `--bh-slider-thumb-ring-bg`, `--bh-slider-thumb-ring-width-current`, `--bh-slider-thumb-ring-width-lg`, `--bh-slider-thumb-ring-width-md`, `--bh-slider-thumb-ring-width-sm`, `--bh-slider-thumb-size-current`, `--bh-slider-thumb-size-lg`, `--bh-slider-thumb-size-md`, `--bh-slider-thumb-size-sm`, `--bh-slider-tick-bg`, `--bh-slider-tick-gap`, `--bh-slider-tick-size`, `--bh-slider-track-bg`, `--bh-slider-track-radius`, `--bh-slider-track-size-current`, `--bh-slider-track-size-lg`, `--bh-slider-track-size-md`, `--bh-slider-track-size-sm`, `--bh-slider-vertical-height`, `--bh-slider-width`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-medium-letter-spacing`, `--bh-text-body-2xs-medium-line-height`, `--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-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-z-base`, `--bh-z-overlay`, `--bh-z-popover`, `--bh-z-raised`, `--elevation-slider-thumb`, `--elevation-slider-thumb-focus`, `--elevation-slider-tooltip` |
79
79
  | `tones` | `brand`, `neutral`, `success`, `warning`, `danger` |
80
80
  | `valueModes` | `single`, `range`, `multi-thumb` |
81
81
  <!-- registry-contract:end -->
@@ -1,52 +1,52 @@
1
- # Social Button
2
-
3
- Social Button is the sign-in action primitive for supported identity providers. It includes Figma-matched platform styling, solid and outlined variants, icon-only mode, native focus-visible styling, RTL layout, and explicit localized messages.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <SocialButton platform="google">Continue with Google</SocialButton>
9
- <SocialButton platform="apple" variant="outline" size="icon" aria-label="Continue with Apple" />
10
- ```
11
-
12
- | Prop | Values |
13
- | --- | --- |
14
- | `platform` | `apple`, `facebook`, `google`, `linkedin`, `twitter`, `whatsapp` |
15
- | `variant` | `solid`, `outline` |
16
- | `size` | `default`, `icon` |
17
- | `label` | localized label override |
18
- | `messages` | partial provider-label catalog selected by product locale |
19
-
20
- ## Token Contract
21
-
22
- Social Button uses Banhaten control, typography, radius, focus, spacing, and shadow tokens. Provider colors are the limited brand-color exception and should stay scoped to this component.
23
-
24
- ## RTL
25
-
26
- Icon and label spacing uses logical flex rhythm in RTL. Labels remain English unless `messages`, `label`, or text children select another language; `arabicSocialButtonMessages` is available for an explicit Arabic locale.
27
-
28
- ## Accessibility
29
-
30
- Icon-only social buttons must provide `aria-label`. Button text should name the provider and the action, such as `Continue with Google`.
31
-
32
- ## Install
33
-
34
- ```bash
35
- npx banhaten add social-button
36
- ```
37
-
38
- ## Examples
39
-
40
- Primary registry example: `examples/social-button-demo.tsx`.
41
-
42
- Open the live component page or run `npx banhaten docs social-button` to inspect source files, install command, and examples.
43
-
44
- ## RTL Rules
45
-
46
- - `inheritsDirection`: true
47
- - `messages`: Direction controls layout only. Pass label, children, aria-label, or messages to localize provider names.
48
- - `spacing`: Uses logical label padding and flex gap so the icon/label order follows inherited direction.
49
-
1
+ # Social Button
2
+
3
+ Social Button is the sign-in action primitive for supported identity providers. It includes Figma-matched platform styling, solid and outlined variants, icon-only mode, native focus-visible styling, RTL layout, and explicit localized messages.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <SocialButton platform="google">Continue with Google</SocialButton>
9
+ <SocialButton platform="apple" variant="outline" size="icon" aria-label="Continue with Apple" />
10
+ ```
11
+
12
+ | Prop | Values |
13
+ | --- | --- |
14
+ | `platform` | `apple`, `facebook`, `google`, `linkedin`, `twitter`, `whatsapp` |
15
+ | `variant` | `solid`, `outline` |
16
+ | `size` | `default`, `icon` |
17
+ | `label` | localized label override |
18
+ | `messages` | partial provider-label catalog selected by product locale |
19
+
20
+ ## Token Contract
21
+
22
+ Social Button uses Banhaten control, typography, radius, focus, spacing, and elevation tokens. Provider colors are the limited brand-color exception and should stay scoped to this component.
23
+
24
+ ## RTL
25
+
26
+ Icon and label spacing uses logical flex rhythm in RTL. Labels remain English unless `messages`, `label`, or text children select another language; `arabicSocialButtonMessages` is available for an explicit Arabic locale.
27
+
28
+ ## Accessibility
29
+
30
+ Icon-only social buttons must provide `aria-label`. Button text should name the provider and the action, such as `Continue with Google`.
31
+
32
+ ## Install
33
+
34
+ ```bash
35
+ npx banhaten add social-button
36
+ ```
37
+
38
+ ## Examples
39
+
40
+ Primary registry example: `examples/social-button-demo.tsx`.
41
+
42
+ Open the live component page or run `npx banhaten docs social-button` to inspect source files, install command, and examples.
43
+
44
+ ## RTL Rules
45
+
46
+ - `inheritsDirection`: true
47
+ - `messages`: Direction controls layout only. Pass label, children, aria-label, or messages to localize provider names.
48
+ - `spacing`: Uses logical label padding and flex gap so the icon/label order follows inherited direction.
49
+
50
50
  <!-- registry-contract:start -->
51
51
  ## Registry Contract
52
52
 
@@ -60,6 +60,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
60
60
  | `registryDependencies` | None |
61
61
  | `platforms` | `apple`, `facebook`, `google`, `linkedin`, `twitter`, `whatsapp` |
62
62
  | `sizes` | `default`, `icon` |
63
- | `tokens` | `--bh-bg-raised`, `--bh-bg-raised-hover`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-width-default`, `--bh-content-default`, `--bh-icon-stroke-200`, `--bh-icon-stroke-225`, `--bh-opacity-50`, `--bh-social-apple-bg`, `--bh-social-apple-border`, `--bh-social-apple-fg`, `--bh-social-apple-hover`, `--bh-social-apple-icon`, `--bh-social-apple-icon-border`, `--bh-social-apple-outline-icon`, `--bh-social-apple-width`, `--bh-social-apple-width-rtl`, `--bh-social-button-bg`, `--bh-social-button-bg-hover`, `--bh-social-button-border`, `--bh-social-button-current-border`, `--bh-social-button-fg`, `--bh-social-button-focus-border`, `--bh-social-button-gap`, `--bh-social-button-height`, `--bh-social-button-icon`, `--bh-social-button-icon-size`, `--bh-social-button-label-padding-inline-end`, `--bh-social-button-padding-x`, `--bh-social-button-padding-y`, `--bh-social-button-radius`, `--bh-social-button-width`, `--bh-social-button-width-rtl`, `--bh-social-facebook-bg`, `--bh-social-facebook-fg`, `--bh-social-facebook-hover`, `--bh-social-facebook-icon`, `--bh-social-facebook-outline-icon`, `--bh-social-facebook-width`, `--bh-social-facebook-width-rtl`, `--bh-social-google-bg`, `--bh-social-google-border`, `--bh-social-google-fg`, `--bh-social-google-hover`, `--bh-social-google-width`, `--bh-social-google-width-rtl`, `--bh-social-linkedin-bg`, `--bh-social-linkedin-fg`, `--bh-social-linkedin-hover`, `--bh-social-linkedin-icon`, `--bh-social-linkedin-outline-icon`, `--bh-social-linkedin-width`, `--bh-social-linkedin-width-rtl`, `--bh-social-twitter-bg`, `--bh-social-twitter-border`, `--bh-social-twitter-fg`, `--bh-social-twitter-hover`, `--bh-social-twitter-icon`, `--bh-social-twitter-icon-border`, `--bh-social-twitter-outline-icon`, `--bh-social-twitter-width`, `--bh-social-twitter-width-rtl`, `--bh-social-whatsapp-bg`, `--bh-social-whatsapp-fg`, `--bh-social-whatsapp-hover`, `--bh-social-whatsapp-icon`, `--bh-social-whatsapp-outline-icon`, `--bh-social-whatsapp-width`, `--bh-social-whatsapp-width-rtl`, `--bh-text-button-font-size`, `--bh-text-button-font-weight`, `--bh-text-button-letter-spacing`, `--bh-text-button-line-height`, `--shadow-component-default`, `--shadow-social-button`, `--shadow-social-button-focus` |
63
+ | `tokens` | `--bh-bg-raised`, `--bh-bg-raised-hover`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-width-default`, `--bh-content-default`, `--bh-icon-stroke-200`, `--bh-icon-stroke-225`, `--bh-opacity-50`, `--bh-social-apple-bg`, `--bh-social-apple-border`, `--bh-social-apple-fg`, `--bh-social-apple-hover`, `--bh-social-apple-icon`, `--bh-social-apple-icon-border`, `--bh-social-apple-outline-icon`, `--bh-social-apple-width`, `--bh-social-apple-width-rtl`, `--bh-social-button-bg`, `--bh-social-button-bg-hover`, `--bh-social-button-border`, `--bh-social-button-current-border`, `--bh-social-button-fg`, `--bh-social-button-focus-border`, `--bh-social-button-gap`, `--bh-social-button-height`, `--bh-social-button-icon`, `--bh-social-button-icon-size`, `--bh-social-button-label-padding-inline-end`, `--bh-social-button-padding-x`, `--bh-social-button-padding-y`, `--bh-social-button-radius`, `--bh-social-button-width`, `--bh-social-button-width-rtl`, `--bh-social-facebook-bg`, `--bh-social-facebook-fg`, `--bh-social-facebook-hover`, `--bh-social-facebook-icon`, `--bh-social-facebook-outline-icon`, `--bh-social-facebook-width`, `--bh-social-facebook-width-rtl`, `--bh-social-google-bg`, `--bh-social-google-border`, `--bh-social-google-fg`, `--bh-social-google-hover`, `--bh-social-google-width`, `--bh-social-google-width-rtl`, `--bh-social-linkedin-bg`, `--bh-social-linkedin-fg`, `--bh-social-linkedin-hover`, `--bh-social-linkedin-icon`, `--bh-social-linkedin-outline-icon`, `--bh-social-linkedin-width`, `--bh-social-linkedin-width-rtl`, `--bh-social-twitter-bg`, `--bh-social-twitter-border`, `--bh-social-twitter-fg`, `--bh-social-twitter-hover`, `--bh-social-twitter-icon`, `--bh-social-twitter-icon-border`, `--bh-social-twitter-outline-icon`, `--bh-social-twitter-width`, `--bh-social-twitter-width-rtl`, `--bh-social-whatsapp-bg`, `--bh-social-whatsapp-fg`, `--bh-social-whatsapp-hover`, `--bh-social-whatsapp-icon`, `--bh-social-whatsapp-outline-icon`, `--bh-social-whatsapp-width`, `--bh-social-whatsapp-width-rtl`, `--bh-text-button-font-size`, `--bh-text-button-font-weight`, `--bh-text-button-letter-spacing`, `--bh-text-button-line-height`, `--elevation-component-default`, `--elevation-social-button`, `--elevation-social-button-focus` |
64
64
  | `variants` | `solid`, `outline` |
65
65
  <!-- registry-contract:end -->
@@ -1,65 +1,65 @@
1
- # Spinner
2
-
3
- Spinner is a compact loading indicator for buttons, inline feedback, status rows, and pending regions. `Spinner` is the simple steady loader, while `DynamicSpinner` uses the smoother variable-arc motion for moments that benefit from a more organic loading state.
4
-
5
- ## Usage
6
-
7
- ```tsx
8
- import { DynamicSpinner, Spinner } from "@/components/ui/spinner"
9
-
10
- export function LoadingLabel() {
11
- return (
12
- <span className="inline-flex items-center gap-2" role="status">
13
- <Spinner />
14
- Loading
15
-
16
- <DynamicSpinner />
17
- Syncing
18
- </span>
19
- )
20
- }
21
- ```
22
-
23
- ## API
24
-
25
- | Prop | Type | Default | Description |
26
- | --- | --- | --- | --- |
27
- | `className` | `string` | - | Sets color, layout, or other SVG classes. |
28
- | `style` | `React.CSSProperties` | - | Override `--bh-spinner-size` when a local size is needed. |
29
-
30
- ## Guidance
31
-
32
- - Pair the decorative spinner with visible status text or a loading button label.
33
- - Use `Spinner` for ordinary button and inline loading.
34
- - Use `DynamicSpinner` when the loading state is prominent enough to benefit from variable arc motion.
35
- - Keep sizing token-based by setting `--bh-spinner-size` rather than hardcoding SVG geometry.
36
-
37
- ## Install
38
-
39
- ```bash
40
- npx banhaten add spinner
41
- ```
42
-
43
- ## Examples
44
-
45
- Primary registry example: `examples/spinner-demo.tsx`.
46
-
47
- Open the live component page or run `npx banhaten docs spinner` to inspect source files, install command, and examples.
48
-
49
- ## Token Contract
50
-
51
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
52
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
53
- Covered source files: `components/spinner.tsx`.
54
-
55
- ## RTL Rules
56
-
57
- This component has no special RTL contract beyond inherited document direction and logical spacing.
58
-
59
- ## Accessibility
60
-
61
- Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
62
-
1
+ # Spinner
2
+
3
+ Spinner is a compact loading indicator for buttons, inline feedback, status rows, and pending regions. `Spinner` is the simple steady loader, while `DynamicSpinner` uses the smoother variable-arc motion for moments that benefit from a more organic loading state.
4
+
5
+ ## Usage
6
+
7
+ ```tsx
8
+ import { DynamicSpinner, Spinner } from "@/components/ui/spinner"
9
+
10
+ export function LoadingLabel() {
11
+ return (
12
+ <span className="inline-flex items-center gap-2" role="status">
13
+ <Spinner />
14
+ Loading
15
+
16
+ <DynamicSpinner />
17
+ Syncing
18
+ </span>
19
+ )
20
+ }
21
+ ```
22
+
23
+ ## API
24
+
25
+ | Prop | Type | Default | Description |
26
+ | --- | --- | --- | --- |
27
+ | `className` | `string` | - | Sets color, layout, or other SVG classes. |
28
+ | `style` | `React.CSSProperties` | - | Override `--bh-spinner-size` when a local size is needed. |
29
+
30
+ ## Guidance
31
+
32
+ - Pair the decorative spinner with visible status text or a loading button label.
33
+ - Use `Spinner` for ordinary button and inline loading.
34
+ - Use `DynamicSpinner` when the loading state is prominent enough to benefit from variable arc motion.
35
+ - Keep sizing token-based by setting `--bh-spinner-size` rather than hardcoding SVG geometry.
36
+
37
+ ## Install
38
+
39
+ ```bash
40
+ npx banhaten add spinner
41
+ ```
42
+
43
+ ## Examples
44
+
45
+ Primary registry example: `examples/spinner-demo.tsx`.
46
+
47
+ Open the live component page or run `npx banhaten docs spinner` to inspect source files, install command, and examples.
48
+
49
+ ## Token Contract
50
+
51
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
52
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
53
+ Covered source files: `components/spinner.tsx`.
54
+
55
+ ## RTL Rules
56
+
57
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
58
+
59
+ ## Accessibility
60
+
61
+ Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
62
+
63
63
  <!-- registry-contract:start -->
64
64
  ## Registry Contract
65
65