banhaten 0.5.0 → 0.6.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 (290) hide show
  1. package/CHANGELOG.md +177 -139
  2. package/CONTRIBUTING.md +46 -46
  3. package/README.md +192 -192
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -13
  7. package/docs/design-system/README.md +22 -22
  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 -245
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -225
  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 +91 -90
  20. package/docs/design-system/components/accordion.md +52 -52
  21. package/docs/design-system/components/activity-feed.md +93 -93
  22. package/docs/design-system/components/activity-heatmap.md +56 -56
  23. package/docs/design-system/components/alert-dialog.md +71 -71
  24. package/docs/design-system/components/alert.md +103 -97
  25. package/docs/design-system/components/app-header.md +97 -0
  26. package/docs/design-system/components/aspect-ratio.md +45 -45
  27. package/docs/design-system/components/attribute.md +101 -89
  28. package/docs/design-system/components/autocomplete.md +75 -75
  29. package/docs/design-system/components/avatar.md +53 -53
  30. package/docs/design-system/components/badge.md +55 -55
  31. package/docs/design-system/components/banner.md +86 -86
  32. package/docs/design-system/components/breadcrumbs.md +181 -177
  33. package/docs/design-system/components/button-group.md +97 -97
  34. package/docs/design-system/components/button.md +80 -80
  35. package/docs/design-system/components/card.md +102 -88
  36. package/docs/design-system/components/carousel.md +46 -46
  37. package/docs/design-system/components/catalog-components.md +46 -46
  38. package/docs/design-system/components/checkbox.md +53 -53
  39. package/docs/design-system/components/collapsible.md +63 -63
  40. package/docs/design-system/components/command.md +61 -61
  41. package/docs/design-system/components/context-menu.md +45 -45
  42. package/docs/design-system/components/date-picker.md +80 -80
  43. package/docs/design-system/components/divider.md +102 -102
  44. package/docs/design-system/components/empty-state.md +56 -56
  45. package/docs/design-system/components/field.md +70 -70
  46. package/docs/design-system/components/file-upload.md +186 -186
  47. package/docs/design-system/components/hover-card.md +47 -47
  48. package/docs/design-system/components/icons.md +48 -48
  49. package/docs/design-system/components/input-group.md +57 -57
  50. package/docs/design-system/components/input-otp.md +56 -56
  51. package/docs/design-system/components/input.md +111 -109
  52. package/docs/design-system/components/item.md +58 -58
  53. package/docs/design-system/components/kbd.md +49 -49
  54. package/docs/design-system/components/label.md +49 -49
  55. package/docs/design-system/components/menu.md +94 -73
  56. package/docs/design-system/components/menubar.md +46 -46
  57. package/docs/design-system/components/modal.md +104 -104
  58. package/docs/design-system/components/native-select.md +53 -53
  59. package/docs/design-system/components/navigation-menu.md +49 -49
  60. package/docs/design-system/components/onboarding-step-list-item.md +81 -81
  61. package/docs/design-system/components/page-header.md +127 -93
  62. package/docs/design-system/components/pagination.md +56 -56
  63. package/docs/design-system/components/popover.md +59 -59
  64. package/docs/design-system/components/progress-slider.md +49 -49
  65. package/docs/design-system/components/progress.md +76 -76
  66. package/docs/design-system/components/radio-card.md +50 -50
  67. package/docs/design-system/components/radio-group.md +56 -56
  68. package/docs/design-system/components/resizable.md +43 -43
  69. package/docs/design-system/components/scroll-area.md +50 -50
  70. package/docs/design-system/components/segmented-control.md +54 -54
  71. package/docs/design-system/components/select.md +68 -64
  72. package/docs/design-system/components/sheet.md +66 -66
  73. package/docs/design-system/components/sidebar.md +167 -111
  74. package/docs/design-system/components/skeleton.md +74 -74
  75. package/docs/design-system/components/slideout.md +64 -64
  76. package/docs/design-system/components/slider.md +62 -62
  77. package/docs/design-system/components/social-button.md +49 -49
  78. package/docs/design-system/components/spinner.md +62 -62
  79. package/docs/design-system/components/steps.md +65 -65
  80. package/docs/design-system/components/table.md +499 -422
  81. package/docs/design-system/components/tabs.md +74 -59
  82. package/docs/design-system/components/tag.md +79 -79
  83. package/docs/design-system/components/textarea.md +49 -49
  84. package/docs/design-system/components/timeline.md +82 -82
  85. package/docs/design-system/components/toast.md +57 -57
  86. package/docs/design-system/components/toggle.md +80 -80
  87. package/docs/design-system/components/toolbar.md +89 -89
  88. package/docs/design-system/components/tooltip.md +92 -92
  89. package/docs/design-system/components/typography.md +18 -18
  90. package/docs/design-system/density-and-elevation.md +65 -65
  91. package/docs/design-system/design-system-test-missing-items.md +368 -368
  92. package/docs/design-system/direction-and-localization.md +23 -23
  93. package/docs/design-system/form-recipes.md +73 -73
  94. package/docs/design-system/gap-promotion-policy.md +21 -21
  95. package/docs/design-system/icons.md +74 -74
  96. package/docs/design-system/installation.md +70 -70
  97. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  98. package/docs/design-system/registry-and-cli.md +64 -64
  99. package/docs/design-system/release-policy.md +30 -30
  100. package/docs/design-system/roadmap.md +14 -14
  101. package/docs/design-system/support-matrix.md +23 -23
  102. package/docs/design-system/tabs.md +54 -54
  103. package/docs/design-system/template-gap-audit.md +32 -32
  104. package/docs/design-system/templates.md +59 -59
  105. package/docs/design-system/token-governance.md +72 -72
  106. package/package.json +98 -98
  107. package/registry/component-contract.json +40 -40
  108. package/registry/components/accordion.tsx +155 -155
  109. package/registry/components/alert-dialog.tsx +297 -297
  110. package/registry/components/alert.tsx +309 -293
  111. package/registry/components/app-header.tsx +151 -0
  112. package/registry/components/aspect-ratio.tsx +30 -30
  113. package/registry/components/attribute.tsx +489 -454
  114. package/registry/components/autocomplete.tsx +598 -598
  115. package/registry/components/avatar.tsx +385 -385
  116. package/registry/components/badge.tsx +630 -629
  117. package/registry/components/button-group.tsx +565 -565
  118. package/registry/components/button.tsx +128 -127
  119. package/registry/components/card.tsx +651 -638
  120. package/registry/components/carousel.tsx +296 -296
  121. package/registry/components/chart.tsx +203 -203
  122. package/registry/components/checkbox.tsx +247 -247
  123. package/registry/components/collapsible.tsx +109 -109
  124. package/registry/components/command.tsx +208 -208
  125. package/registry/components/context-menu.tsx +236 -236
  126. package/registry/components/date-picker.tsx +1289 -1289
  127. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  128. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  129. package/registry/components/expanded/Banner.tsx +179 -179
  130. package/registry/components/expanded/Breadcrumbs.tsx +135 -131
  131. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  132. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  133. package/registry/components/expanded/EmptyState.tsx +155 -155
  134. package/registry/components/expanded/FileUpload.tsx +543 -543
  135. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -60
  136. package/registry/components/expanded/PageHeader.tsx +209 -179
  137. package/registry/components/expanded/Slideout.tsx +108 -108
  138. package/registry/components/expanded/Steps.tsx +402 -402
  139. package/registry/components/expanded/Table.tsx +1109 -1092
  140. package/registry/components/expanded/Timeline.tsx +203 -203
  141. package/registry/components/expanded/activityFeed.css +248 -248
  142. package/registry/components/expanded/activityHeatmap.css +66 -66
  143. package/registry/components/expanded/banner.css +260 -260
  144. package/registry/components/expanded/breadcrumbs.css +157 -140
  145. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  146. package/registry/components/expanded/divider.css +75 -75
  147. package/registry/components/expanded/emptyState.css +111 -111
  148. package/registry/components/expanded/fileUpload.css +457 -457
  149. package/registry/components/expanded/onboardingStepListItem.css +135 -135
  150. package/registry/components/expanded/pageHeader.css +284 -248
  151. package/registry/components/expanded/slideout.css +276 -276
  152. package/registry/components/expanded/steps.css +356 -356
  153. package/registry/components/expanded/table.css +655 -606
  154. package/registry/components/expanded/timeline.css +286 -286
  155. package/registry/components/field.tsx +283 -283
  156. package/registry/components/hover-card.tsx +48 -48
  157. package/registry/components/input-content.ts +107 -107
  158. package/registry/components/input-group.tsx +130 -130
  159. package/registry/components/input-otp.tsx +584 -584
  160. package/registry/components/input.tsx +992 -990
  161. package/registry/components/item.tsx +189 -189
  162. package/registry/components/kbd.tsx +246 -246
  163. package/registry/components/label.tsx +78 -78
  164. package/registry/components/menu.tsx +1091 -978
  165. package/registry/components/menubar.tsx +226 -226
  166. package/registry/components/modal.tsx +872 -872
  167. package/registry/components/native-select.tsx +205 -205
  168. package/registry/components/navigation-menu.tsx +171 -171
  169. package/registry/components/pagination.css +36 -36
  170. package/registry/components/pagination.tsx +560 -560
  171. package/registry/components/popover.tsx +338 -338
  172. package/registry/components/progress-slider.tsx +216 -216
  173. package/registry/components/radio-card.tsx +676 -676
  174. package/registry/components/radio-group.tsx +570 -570
  175. package/registry/components/resizable.tsx +108 -108
  176. package/registry/components/scroll-area.tsx +91 -91
  177. package/registry/components/segmented-control.tsx +87 -87
  178. package/registry/components/select-content.tsx +218 -218
  179. package/registry/components/select.tsx +937 -937
  180. package/registry/components/sheet.tsx +305 -305
  181. package/registry/components/sidebar.tsx +1535 -1433
  182. package/registry/components/skeleton.css +54 -54
  183. package/registry/components/skeleton.tsx +482 -482
  184. package/registry/components/slider.tsx +380 -380
  185. package/registry/components/social-button.tsx +387 -387
  186. package/registry/components/spinner.tsx +78 -78
  187. package/registry/components/table-elements.tsx +287 -128
  188. package/registry/components/tabs.css +246 -222
  189. package/registry/components/tabs.tsx +245 -241
  190. package/registry/components/tag.tsx +423 -423
  191. package/registry/components/textarea.tsx +610 -610
  192. package/registry/components/toast.tsx +136 -136
  193. package/registry/components/toggle.tsx +256 -256
  194. package/registry/components/toolbar.tsx +539 -539
  195. package/registry/components/tooltip.tsx +433 -433
  196. package/registry/examples/alert-demo.tsx +34 -34
  197. package/registry/examples/alert-dialog-demo.tsx +42 -42
  198. package/registry/examples/app-header-demo.tsx +40 -0
  199. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  200. package/registry/examples/attribute-demo.tsx +65 -65
  201. package/registry/examples/autocomplete-demo.tsx +109 -109
  202. package/registry/examples/avatar-demo.tsx +132 -132
  203. package/registry/examples/badge-demo.tsx +69 -69
  204. package/registry/examples/button-demo.tsx +86 -86
  205. package/registry/examples/button-group-demo.tsx +63 -63
  206. package/registry/examples/card-demo.tsx +86 -86
  207. package/registry/examples/carousel-demo.tsx +43 -43
  208. package/registry/examples/chart-demo.tsx +18 -18
  209. package/registry/examples/checkbox-demo.tsx +62 -62
  210. package/registry/examples/collapsible-demo.tsx +16 -16
  211. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  212. package/registry/examples/command-demo.tsx +42 -42
  213. package/registry/examples/command-palette-demo.tsx +235 -235
  214. package/registry/examples/context-menu-demo.tsx +29 -29
  215. package/registry/examples/control-density-contract-demo.tsx +65 -65
  216. package/registry/examples/date-picker-demo.tsx +127 -127
  217. package/registry/examples/divider-demo.tsx +17 -17
  218. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  219. package/registry/examples/expanded/banner-demo.tsx +48 -48
  220. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  221. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  222. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  223. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  224. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  225. package/registry/examples/expanded/steps-demo.tsx +29 -29
  226. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  227. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  228. package/registry/examples/field-demo.tsx +51 -51
  229. package/registry/examples/hover-card-demo.tsx +23 -23
  230. package/registry/examples/input-actions-demo.tsx +36 -36
  231. package/registry/examples/input-demo.tsx +87 -87
  232. package/registry/examples/input-group-demo.tsx +16 -16
  233. package/registry/examples/input-otp-demo.tsx +72 -72
  234. package/registry/examples/item-demo.tsx +46 -46
  235. package/registry/examples/kbd-demo.tsx +12 -12
  236. package/registry/examples/label-demo.tsx +20 -20
  237. package/registry/examples/menu-demo.tsx +122 -122
  238. package/registry/examples/menubar-demo.tsx +34 -34
  239. package/registry/examples/modal-demo.tsx +74 -74
  240. package/registry/examples/native-select-demo.tsx +16 -16
  241. package/registry/examples/navigation-menu-demo.tsx +29 -29
  242. package/registry/examples/pagination-demo.tsx +20 -20
  243. package/registry/examples/popover-demo.tsx +547 -547
  244. package/registry/examples/progress-demo.tsx +37 -37
  245. package/registry/examples/progress-slider-demo.tsx +29 -29
  246. package/registry/examples/radio-card-demo.tsx +51 -51
  247. package/registry/examples/radio-group-demo.tsx +62 -62
  248. package/registry/examples/resizable-demo.tsx +22 -22
  249. package/registry/examples/results-toolbar-demo.tsx +44 -44
  250. package/registry/examples/scroll-area-demo.tsx +15 -15
  251. package/registry/examples/segmented-control-demo.tsx +39 -39
  252. package/registry/examples/select-demo.tsx +87 -87
  253. package/registry/examples/sheet-demo.tsx +47 -47
  254. package/registry/examples/sidebar-demo.tsx +101 -101
  255. package/registry/examples/slider-demo.tsx +31 -31
  256. package/registry/examples/social-button-demo.tsx +61 -61
  257. package/registry/examples/spinner-demo.tsx +59 -59
  258. package/registry/examples/tabs-demo.tsx +13 -13
  259. package/registry/examples/tag-demo.tsx +29 -29
  260. package/registry/examples/textarea-demo.tsx +79 -79
  261. package/registry/examples/toast-demo.tsx +35 -35
  262. package/registry/examples/toggle-demo.tsx +59 -59
  263. package/registry/examples/tooltip-demo.tsx +115 -115
  264. package/registry/guidance/USAGE.md +27 -27
  265. package/registry/hooks/use-direction.ts +207 -207
  266. package/registry/index.json +387 -17
  267. package/registry/styles/globals.css +46 -0
  268. package/registry.json +24 -2
  269. package/schema/config.schema.json +51 -51
  270. package/schema/registry.schema.json +194 -194
  271. package/schema/tokens.schema.json +167 -167
  272. package/src/cli/command-line.js +194 -194
  273. package/src/cli/config-editors.js +9 -9
  274. package/src/cli/doctor.js +399 -399
  275. package/src/cli/file-transaction.js +302 -302
  276. package/src/cli/global-css.js +153 -153
  277. package/src/cli/index.js +1002 -1002
  278. package/src/cli/install-plan.js +592 -592
  279. package/src/cli/install-receipt.js +171 -171
  280. package/src/cli/jsonc.js +203 -203
  281. package/src/cli/package-install-state.js +254 -254
  282. package/src/cli/package-manager.js +238 -238
  283. package/src/cli/package-plan.js +185 -185
  284. package/src/cli/package-version.js +97 -97
  285. package/src/cli/registry-query.js +207 -207
  286. package/src/cli/reporting.js +55 -55
  287. package/src/cli/schema-validation.js +19 -19
  288. package/src/cli/source-scanner.js +686 -686
  289. package/src/cli/vite-config.js +478 -478
  290. package/tokens/banhaten.tokens.json +184 -0
@@ -1,60 +1,60 @@
1
- # Toast
2
-
3
- Toast provides transient feedback for saves, errors, warnings, background work, and undoable actions. It uses a Sonner-style API with Banhaten token styling, semantic intents, action support, and logical LTR/RTL placement.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Toaster />
9
-
10
- toast.success("Project saved")
11
- toast.danger("Unable to publish", {
12
- action: { label: "Retry", onClick: retry },
13
- })
14
- ```
15
-
16
- | Export | Purpose |
17
- | --- | --- |
18
- | `Toaster` | app-level toast viewport |
19
- | `toast` | imperative toast API |
20
- | `toast.success`, `toast.info`, `toast.warning`, `toast.danger` | semantic shortcuts |
21
-
22
- | Prop | Values |
23
- | --- | --- |
24
- | `dir` | `ltr`, `rtl` |
25
- | `side` | `start`, `end` |
26
- | `position` | Sonner position override |
27
-
28
- ## Token Contract
29
-
30
- Toast uses Banhaten raised surface, border, shadow, radius, body typography, action, danger, warning, success, info, and content tokens.
31
-
32
- ## RTL
33
-
34
- `side="end"` resolves to top-right in LTR and top-left in RTL. Use `side="start"` for the opposite logical edge.
35
-
36
- ## Accessibility
37
-
38
- Keep toast copy short and pair destructive failures with a visible retry or recovery path when possible. Do not use toasts as the only place for critical validation errors.
39
-
40
- ## Install
41
-
42
- ```bash
43
- npx banhaten add toast
44
- ```
45
-
46
- ## Examples
47
-
48
- Primary registry example: `examples/toast-demo.tsx`.
49
-
50
- Open the live component page or run `npx banhaten docs toast` to inspect source files, install command, and examples.
51
-
52
- ## RTL Rules
53
-
54
- - `inheritsDirection`: true
55
- - `placement`: side="end" resolves to top-right in LTR and top-left in RTL; side="start" resolves to the opposite edge.
56
- - `textDirection`: Toast content inherits the Toaster direction and uses tokenized typography classes.
57
-
1
+ # Toast
2
+
3
+ Toast provides transient feedback for saves, errors, warnings, background work, and undoable actions. It uses a Sonner-style API with Banhaten token styling, semantic intents, action support, and logical LTR/RTL placement.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Toaster />
9
+
10
+ toast.success("Project saved")
11
+ toast.danger("Unable to publish", {
12
+ action: { label: "Retry", onClick: retry },
13
+ })
14
+ ```
15
+
16
+ | Export | Purpose |
17
+ | --- | --- |
18
+ | `Toaster` | app-level toast viewport |
19
+ | `toast` | imperative toast API |
20
+ | `toast.success`, `toast.info`, `toast.warning`, `toast.danger` | semantic shortcuts |
21
+
22
+ | Prop | Values |
23
+ | --- | --- |
24
+ | `dir` | `ltr`, `rtl` |
25
+ | `side` | `start`, `end` |
26
+ | `position` | Sonner position override |
27
+
28
+ ## Token Contract
29
+
30
+ Toast uses Banhaten raised surface, border, shadow, radius, body typography, action, danger, warning, success, info, and content tokens.
31
+
32
+ ## RTL
33
+
34
+ `side="end"` resolves to top-right in LTR and top-left in RTL. Use `side="start"` for the opposite logical edge.
35
+
36
+ ## Accessibility
37
+
38
+ Keep toast copy short and pair destructive failures with a visible retry or recovery path when possible. Do not use toasts as the only place for critical validation errors.
39
+
40
+ ## Install
41
+
42
+ ```bash
43
+ npx banhaten add toast
44
+ ```
45
+
46
+ ## Examples
47
+
48
+ Primary registry example: `examples/toast-demo.tsx`.
49
+
50
+ Open the live component page or run `npx banhaten docs toast` to inspect source files, install command, and examples.
51
+
52
+ ## RTL Rules
53
+
54
+ - `inheritsDirection`: true
55
+ - `placement`: side="end" resolves to top-right in LTR and top-left in RTL; side="start" resolves to the opposite edge.
56
+ - `textDirection`: Toast content inherits the Toaster direction and uses tokenized typography classes.
57
+
58
58
  <!-- registry-contract:start -->
59
59
  ## Registry Contract
60
60
 
@@ -1,83 +1,83 @@
1
- # Toggle
2
-
3
- Toggle is a Radix Switch-backed boolean control. It supports sm and md switch geometry, active and disabled states, optional handle icons, labeled leading or trailing compositions, supporting text, and inherited RTL direction.
4
-
5
- The implementation follows the Figma components at `Design system 3.0 Copy / Toogle` (`175:23379`) and `Toggle label` (`175:23443`).
6
-
7
- ## API
8
-
9
- Use `Toggle` for standalone controls with an accessible label.
10
-
11
- ```tsx
12
- <Toggle aria-label="Enable notifications" defaultChecked />
13
- ```
14
-
15
- Use `ToggleField` when the visible label and supporting text should name the switch.
16
-
17
- ```tsx
18
- <ToggleField
19
- defaultChecked
20
- controlPosition="end"
21
- label="Email notifications"
22
- description="Send product updates and billing activity."
23
- />
24
- ```
25
-
26
- ## Variants
27
-
28
- | Prop | Values |
29
- | --- | --- |
30
- | `size` | `sm`, `md` |
31
- | `showIcon` | `boolean` |
32
- | `ToggleField controlPosition` | `start`, `end` |
33
- | `disabled` | `boolean` |
34
-
35
- ## Tokens
36
-
37
- Toggle uses the existing Banhaten switch aliases:
38
-
39
- | Purpose | Token |
40
- | --- | --- |
41
- | Default track | `--bh-interactive-switch-default` |
42
- | Hover track | `--bh-interactive-switch-hover` |
43
- | Active track | `--bh-interactive-switch-active` |
44
- | Active hover track | `--bh-interactive-switch-active-hover` |
45
- | Disabled track | `--bh-interactive-switch-disabled` |
46
- | Handle | `--bh-interactive-switch-handle` |
47
- | Disabled handle | `--bh-interactive-switch-handle-disabled` |
48
- | Focus ring | `--elevation-social-button-focus-ring` |
49
-
50
- Text uses body-md for labels and body-xs for supporting text. ToggleField uses logical start/end placement so label order and thumb motion mirror in RTL.
51
-
52
- ## Install
53
-
54
- ```bash
55
- npx banhaten add toggle
56
- ```
57
-
58
- ## Examples
59
-
60
- Primary registry example: `examples/toggle-demo.tsx`.
61
-
62
- Open the live component page or run `npx banhaten docs toggle` to inspect source files, install command, and examples.
63
-
64
- ## Token Contract
65
-
66
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
67
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
68
- Covered source files: `components/toggle.tsx`.
69
-
70
- ## RTL Rules
71
-
72
- - `inheritsDirection`: true
73
- - `controlPlacement`: ToggleField uses start/end control placement so the switch and text order mirror in RTL.
74
- - `handleMotion`: The thumb translates with logical direction, so checked state moves to the visual end edge in LTR and RTL.
75
- - `textDirection`: Labels and descriptions use dir="auto" with tokenized body-md/body-xs typography.
76
-
77
- ## Accessibility
78
-
79
- This component relies on `@radix-ui/react-switch` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
80
-
1
+ # Toggle
2
+
3
+ Toggle is a Radix Switch-backed boolean control. It supports sm and md switch geometry, active and disabled states, optional handle icons, labeled leading or trailing compositions, supporting text, and inherited RTL direction.
4
+
5
+ The implementation follows the Figma components at `Design system 3.0 Copy / Toogle` (`175:23379`) and `Toggle label` (`175:23443`).
6
+
7
+ ## API
8
+
9
+ Use `Toggle` for standalone controls with an accessible label.
10
+
11
+ ```tsx
12
+ <Toggle aria-label="Enable notifications" defaultChecked />
13
+ ```
14
+
15
+ Use `ToggleField` when the visible label and supporting text should name the switch.
16
+
17
+ ```tsx
18
+ <ToggleField
19
+ defaultChecked
20
+ controlPosition="end"
21
+ label="Email notifications"
22
+ description="Send product updates and billing activity."
23
+ />
24
+ ```
25
+
26
+ ## Variants
27
+
28
+ | Prop | Values |
29
+ | --- | --- |
30
+ | `size` | `sm`, `md` |
31
+ | `showIcon` | `boolean` |
32
+ | `ToggleField controlPosition` | `start`, `end` |
33
+ | `disabled` | `boolean` |
34
+
35
+ ## Tokens
36
+
37
+ Toggle uses the existing Banhaten switch aliases:
38
+
39
+ | Purpose | Token |
40
+ | --- | --- |
41
+ | Default track | `--bh-interactive-switch-default` |
42
+ | Hover track | `--bh-interactive-switch-hover` |
43
+ | Active track | `--bh-interactive-switch-active` |
44
+ | Active hover track | `--bh-interactive-switch-active-hover` |
45
+ | Disabled track | `--bh-interactive-switch-disabled` |
46
+ | Handle | `--bh-interactive-switch-handle` |
47
+ | Disabled handle | `--bh-interactive-switch-handle-disabled` |
48
+ | Focus ring | `--elevation-social-button-focus-ring` |
49
+
50
+ Text uses body-md for labels and body-xs for supporting text. ToggleField uses logical start/end placement so label order and thumb motion mirror in RTL.
51
+
52
+ ## Install
53
+
54
+ ```bash
55
+ npx banhaten add toggle
56
+ ```
57
+
58
+ ## Examples
59
+
60
+ Primary registry example: `examples/toggle-demo.tsx`.
61
+
62
+ Open the live component page or run `npx banhaten docs toggle` to inspect source files, install command, and examples.
63
+
64
+ ## Token Contract
65
+
66
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
67
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
68
+ Covered source files: `components/toggle.tsx`.
69
+
70
+ ## RTL Rules
71
+
72
+ - `inheritsDirection`: true
73
+ - `controlPlacement`: ToggleField uses start/end control placement so the switch and text order mirror in RTL.
74
+ - `handleMotion`: The thumb translates with logical direction, so checked state moves to the visual end edge in LTR and RTL.
75
+ - `textDirection`: Labels and descriptions use dir="auto" with tokenized body-md/body-xs typography.
76
+
77
+ ## Accessibility
78
+
79
+ This component relies on `@radix-ui/react-switch` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
80
+
81
81
  <!-- registry-contract:start -->
82
82
  ## Registry Contract
83
83
 
@@ -1,92 +1,92 @@
1
- # Toolbar
2
-
3
- Toolbar is the token-built implementation of the Figma `Filter Toolbar` component set. It supports eight filter/action layouts, desktop and mobile wrapping, inherited LTR/RTL direction, and layout-group semantics that preserve each control's native Tab and arrow-key behavior.
4
-
5
- ## Install
6
-
7
- ```bash
8
- npx banhaten add toolbar
9
- ```
10
-
11
- ## Anatomy
12
-
13
- - `Toolbar`: root layout surface with `inline`, `split`, `stack`, and `wrap` modes. It defaults to `role="group"`, not the composite-widget `toolbar` role.
14
- - `ToolbarSection`: grouped start, end, wrapped, or stacked control regions.
15
- - `ToolbarSearch`: tokenized search input using Banhaten input height, radius, typography, and focus ring.
16
- - `ToolbarSelect`: button-backed filter trigger using select/input tokens.
17
- - `ToolbarButton`: toolbar action button built with the same Slot and text-label construction as Button.
18
- - `ToolbarIconButton`, `ToolbarFilterButton`, `ToolbarMoreButton`: icon action helpers.
19
- - `ToolbarBadge`: selected-count or applied-filter metadata.
20
- - `ToolbarText` and `ToolbarSpacer`: supporting label and layout slots.
21
-
22
- ## Example
23
-
24
- ```tsx
25
- import {
26
- Toolbar,
27
- ToolbarButton,
28
- ToolbarFilterButton,
29
- ToolbarMoreButton,
30
- ToolbarSearch,
31
- ToolbarSection,
32
- ToolbarSelect,
33
- } from "@/components/ui/toolbar"
34
-
35
- export function Example() {
36
- return (
37
- <Toolbar aria-label="Object filters and actions" layout="split" wrap>
38
- <ToolbarSection grow wrap>
39
- <ToolbarSearch aria-label="Search objects" />
40
- <ToolbarSelect value="Status" />
41
- <ToolbarSelect value="Owner" />
42
- <ToolbarFilterButton />
43
- </ToolbarSection>
44
- <ToolbarSection align="end" wrap>
45
- <ToolbarMoreButton />
46
- <ToolbarButton variant="soft">Export</ToolbarButton>
47
- <ToolbarButton>Create Object</ToolbarButton>
48
- </ToolbarSection>
49
- </Toolbar>
50
- )
51
- }
52
- ```
53
-
54
- ## Token Contract
55
-
56
- Toolbar styling is derived from the existing control tokens: `--bh-input-lg-height`, `--bh-input-radius`, `--bh-input-width`, `--bh-select-width`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-control-default`, input/select/button elevation, and semantic content/interactive tokens.
57
-
58
- ## RTL
59
-
60
- Set `dir="rtl"` on `Toolbar` or inherit it from the document. Sections, fields, button labels, badges, and search text use logical spacing and `dir="auto"` for mixed-language labels.
61
-
62
- ## API
63
-
64
- Supported runtime exports: `Toolbar`, `ToolbarBadge`, `ToolbarButton`, `ToolbarFilterButton`, `ToolbarIconButton`, `ToolbarMoreButton`, `ToolbarSearch`, `ToolbarSection`, `ToolbarSelect`, `ToolbarSpacer`, `ToolbarText`, `toolbarBadgeVariants`, `toolbarButtonVariants`, `toolbarSearchVariants`, `toolbarSectionVariants`, `toolbarSelectVariants`, `toolbarVariants`.
65
-
66
- | Contract | Values |
67
- | --- | --- |
68
- | `styles` | `filter-fields`, `filter-actions`, `selection-actions`, `grouped-fields`, `field-grid`, `inline-search`, `filter-chips`, `saved-segment` |
69
- | `layouts` | `inline`, `split`, `stack`, `wrap` |
70
- | `role` | Defaults to `group`; explicit overrides are forwarded. |
71
-
72
- ## Examples
73
-
74
- Primary registry example: `examples/toolbar-demo.tsx`.
75
-
76
- Open the live component page or run `npx banhaten docs toolbar` to inspect source files, install command, and examples.
77
-
78
- ## RTL Rules
79
-
80
- - `inheritsDirection`: true
81
- - `textAlignment`: Uses logical section layout and dir="auto" labels so mixed English and Arabic filter text aligns naturally.
82
- - `spacing`: Uses tokenized flex gaps and logical icon attributes so search, fields, chips, summaries, and actions mirror without alternate APIs.
83
-
84
- ## Accessibility
85
-
86
- `Toolbar` defaults to `role="group"` because it is a flexible layout surface, not a composite widget. The root is not a tab stop, every enabled control remains in the native Tab sequence, and the component does not intercept arrow keys used by search fields, selects, or nested widgets. Give the group an accessible name when its purpose is not already clear from surrounding content.
87
-
88
- Only override the root with `role="toolbar"` when the application also implements the complete [W3C Toolbar Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/): one Tab stop into the widget, managed arrow-key focus between controls, an accessible name, and orientation behavior. The role override alone does not add that keyboard model.
89
-
1
+ # Toolbar
2
+
3
+ Toolbar is the token-built implementation of the Figma `Filter Toolbar` component set. It supports eight filter/action layouts, desktop and mobile wrapping, inherited LTR/RTL direction, and layout-group semantics that preserve each control's native Tab and arrow-key behavior.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx banhaten add toolbar
9
+ ```
10
+
11
+ ## Anatomy
12
+
13
+ - `Toolbar`: root layout surface with `inline`, `split`, `stack`, and `wrap` modes. It defaults to `role="group"`, not the composite-widget `toolbar` role.
14
+ - `ToolbarSection`: grouped start, end, wrapped, or stacked control regions.
15
+ - `ToolbarSearch`: tokenized search input using Banhaten input height, radius, typography, and focus ring.
16
+ - `ToolbarSelect`: button-backed filter trigger using select/input tokens.
17
+ - `ToolbarButton`: toolbar action button built with the same Slot and text-label construction as Button.
18
+ - `ToolbarIconButton`, `ToolbarFilterButton`, `ToolbarMoreButton`: icon action helpers.
19
+ - `ToolbarBadge`: selected-count or applied-filter metadata.
20
+ - `ToolbarText` and `ToolbarSpacer`: supporting label and layout slots.
21
+
22
+ ## Example
23
+
24
+ ```tsx
25
+ import {
26
+ Toolbar,
27
+ ToolbarButton,
28
+ ToolbarFilterButton,
29
+ ToolbarMoreButton,
30
+ ToolbarSearch,
31
+ ToolbarSection,
32
+ ToolbarSelect,
33
+ } from "@/components/ui/toolbar"
34
+
35
+ export function Example() {
36
+ return (
37
+ <Toolbar aria-label="Object filters and actions" layout="split" wrap>
38
+ <ToolbarSection grow wrap>
39
+ <ToolbarSearch aria-label="Search objects" />
40
+ <ToolbarSelect value="Status" />
41
+ <ToolbarSelect value="Owner" />
42
+ <ToolbarFilterButton />
43
+ </ToolbarSection>
44
+ <ToolbarSection align="end" wrap>
45
+ <ToolbarMoreButton />
46
+ <ToolbarButton variant="soft">Export</ToolbarButton>
47
+ <ToolbarButton>Create Object</ToolbarButton>
48
+ </ToolbarSection>
49
+ </Toolbar>
50
+ )
51
+ }
52
+ ```
53
+
54
+ ## Token Contract
55
+
56
+ Toolbar styling is derived from the existing control tokens: `--bh-input-lg-height`, `--bh-input-radius`, `--bh-input-width`, `--bh-select-width`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-control-default`, input/select/button elevation, and semantic content/interactive tokens.
57
+
58
+ ## RTL
59
+
60
+ Set `dir="rtl"` on `Toolbar` or inherit it from the document. Sections, fields, button labels, badges, and search text use logical spacing and `dir="auto"` for mixed-language labels.
61
+
62
+ ## API
63
+
64
+ Supported runtime exports: `Toolbar`, `ToolbarBadge`, `ToolbarButton`, `ToolbarFilterButton`, `ToolbarIconButton`, `ToolbarMoreButton`, `ToolbarSearch`, `ToolbarSection`, `ToolbarSelect`, `ToolbarSpacer`, `ToolbarText`, `toolbarBadgeVariants`, `toolbarButtonVariants`, `toolbarSearchVariants`, `toolbarSectionVariants`, `toolbarSelectVariants`, `toolbarVariants`.
65
+
66
+ | Contract | Values |
67
+ | --- | --- |
68
+ | `styles` | `filter-fields`, `filter-actions`, `selection-actions`, `grouped-fields`, `field-grid`, `inline-search`, `filter-chips`, `saved-segment` |
69
+ | `layouts` | `inline`, `split`, `stack`, `wrap` |
70
+ | `role` | Defaults to `group`; explicit overrides are forwarded. |
71
+
72
+ ## Examples
73
+
74
+ Primary registry example: `examples/toolbar-demo.tsx`.
75
+
76
+ Open the live component page or run `npx banhaten docs toolbar` to inspect source files, install command, and examples.
77
+
78
+ ## RTL Rules
79
+
80
+ - `inheritsDirection`: true
81
+ - `textAlignment`: Uses logical section layout and dir="auto" labels so mixed English and Arabic filter text aligns naturally.
82
+ - `spacing`: Uses tokenized flex gaps and logical icon attributes so search, fields, chips, summaries, and actions mirror without alternate APIs.
83
+
84
+ ## Accessibility
85
+
86
+ `Toolbar` defaults to `role="group"` because it is a flexible layout surface, not a composite widget. The root is not a tab stop, every enabled control remains in the native Tab sequence, and the component does not intercept arrow keys used by search fields, selects, or nested widgets. Give the group an accessible name when its purpose is not already clear from surrounding content.
87
+
88
+ Only override the root with `role="toolbar"` when the application also implements the complete [W3C Toolbar Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/): one Tab stop into the widget, managed arrow-key focus between controls, an accessible name, and orientation behavior. The role override alone does not add that keyboard model.
89
+
90
90
  <!-- registry-contract:start -->
91
91
  ## Registry Contract
92
92
 
@@ -1,95 +1,95 @@
1
- # Tooltip
2
-
3
- Tooltip is a Radix Tooltip-backed help surface matched to the Figma tooltip matrix. It supports dark and default surfaces, small and large sizes, shortcut and close slots, logical pointer positions, tokenized elevation, and RTL-safe layout.
4
-
5
- ## Install
6
-
7
- ```bash
8
- npx banhaten add tooltip
9
- ```
10
-
11
- ## Anatomy
12
-
13
- - `TooltipProvider`: shared Radix provider for delay timing.
14
- - `Tooltip`: root tooltip wrapper.
15
- - `TooltipTrigger`: trigger element.
16
- - `TooltipContent`: positioned surface with pointer, title, support text, shortcut, and close affordance.
17
- - `TooltipShortcut`: direction-isolated physical shortcut slot.
18
- - `TooltipCloseButton`: optional close affordance.
19
-
20
- ## Example
21
-
22
- ```tsx
23
- import {
24
- Tooltip,
25
- TooltipContent,
26
- TooltipProvider,
27
- TooltipTrigger,
28
- } from "@/components/ui/tooltip"
29
- import { Button } from "@/components/ui/button"
30
-
31
- export function Example() {
32
- return (
33
- <TooltipProvider>
34
- <Tooltip>
35
- <TooltipTrigger asChild>
36
- <Button variant="secondary">Details</Button>
37
- </TooltipTrigger>
38
- <TooltipContent pointerPosition="top-center" size="lg">
39
- More information
40
- </TooltipContent>
41
- </Tooltip>
42
- </TooltipProvider>
43
- )
44
- }
45
- ```
46
-
47
- ## Variants
48
-
49
- | Prop | Values |
50
- | --- | --- |
51
- | `variant` | `dark`, `default` |
52
- | `size` | `sm`, `lg` |
53
- | `pointerPosition` | `top-left`, `top-center`, `top-right`, `bottom-left`, `bottom-center`, `bottom-right`, `center-left`, `center-right`, `none` |
54
- | `showPointer` | `boolean` |
55
-
56
- ## RTL
57
-
58
- Tooltip content uses inherited direction and `dir="auto"` text. `TooltipShortcut` defaults to `dir="ltr"` so physical modifiers and keys do not reorder inside RTL tooltips. Top and bottom left/right positions map to logical start/end in RTL, while center-left and center-right remain physical sides to match the Figma matrix.
59
-
60
- ## API
61
-
62
- Supported runtime exports: `Tooltip`, `TooltipCloseButton`, `TooltipContent`, `TooltipPortal`, `TooltipProvider`, `TooltipRoot`, `TooltipShortcut`, `TooltipTrigger`, `tooltipContentVariants`.
63
-
64
- | Contract | Values |
65
- | --- | --- |
66
- | `variants` | `dark`, `default` |
67
- | `sizes` | `sm`, `lg` |
68
-
69
- ## Examples
70
-
71
- Primary registry example: `examples/tooltip-demo.tsx`.
72
-
73
- Open the live component page or run `npx banhaten docs tooltip` to inspect source files, install command, and examples.
74
-
75
- ## Token Contract
76
-
77
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
78
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
79
- Covered source files: `components/tooltip.tsx`.
80
-
81
- ## RTL Rules
82
-
83
- - `inheritsDirection`: true
84
- - `spacing`: Uses inherited direction with flex layout so label/shortcut and text/close order mirror naturally.
85
- - `pointerPlacement`: Top and bottom left/right positions map to logical start/end in RTL. Center-left and center-right remain physical sides to match the Figma matrix.
86
- - `textDirection`: Labels and support text use dir="auto" for Arabic and English copy.
87
- - `shortcutDirection`: TooltipShortcut defaults to dir="ltr" so physical key order remains stable inside RTL content.
88
-
89
- ## Accessibility
90
-
91
- This component relies on `@radix-ui/react-tooltip` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
92
-
1
+ # Tooltip
2
+
3
+ Tooltip is a Radix Tooltip-backed help surface matched to the Figma tooltip matrix. It supports dark and default surfaces, small and large sizes, shortcut and close slots, logical pointer positions, tokenized elevation, and RTL-safe layout.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx banhaten add tooltip
9
+ ```
10
+
11
+ ## Anatomy
12
+
13
+ - `TooltipProvider`: shared Radix provider for delay timing.
14
+ - `Tooltip`: root tooltip wrapper.
15
+ - `TooltipTrigger`: trigger element.
16
+ - `TooltipContent`: positioned surface with pointer, title, support text, shortcut, and close affordance.
17
+ - `TooltipShortcut`: direction-isolated physical shortcut slot.
18
+ - `TooltipCloseButton`: optional close affordance.
19
+
20
+ ## Example
21
+
22
+ ```tsx
23
+ import {
24
+ Tooltip,
25
+ TooltipContent,
26
+ TooltipProvider,
27
+ TooltipTrigger,
28
+ } from "@/components/ui/tooltip"
29
+ import { Button } from "@/components/ui/button"
30
+
31
+ export function Example() {
32
+ return (
33
+ <TooltipProvider>
34
+ <Tooltip>
35
+ <TooltipTrigger asChild>
36
+ <Button variant="secondary">Details</Button>
37
+ </TooltipTrigger>
38
+ <TooltipContent pointerPosition="top-center" size="lg">
39
+ More information
40
+ </TooltipContent>
41
+ </Tooltip>
42
+ </TooltipProvider>
43
+ )
44
+ }
45
+ ```
46
+
47
+ ## Variants
48
+
49
+ | Prop | Values |
50
+ | --- | --- |
51
+ | `variant` | `dark`, `default` |
52
+ | `size` | `sm`, `lg` |
53
+ | `pointerPosition` | `top-left`, `top-center`, `top-right`, `bottom-left`, `bottom-center`, `bottom-right`, `center-left`, `center-right`, `none` |
54
+ | `showPointer` | `boolean` |
55
+
56
+ ## RTL
57
+
58
+ Tooltip content uses inherited direction and `dir="auto"` text. `TooltipShortcut` defaults to `dir="ltr"` so physical modifiers and keys do not reorder inside RTL tooltips. Top and bottom left/right positions map to logical start/end in RTL, while center-left and center-right remain physical sides to match the Figma matrix.
59
+
60
+ ## API
61
+
62
+ Supported runtime exports: `Tooltip`, `TooltipCloseButton`, `TooltipContent`, `TooltipPortal`, `TooltipProvider`, `TooltipRoot`, `TooltipShortcut`, `TooltipTrigger`, `tooltipContentVariants`.
63
+
64
+ | Contract | Values |
65
+ | --- | --- |
66
+ | `variants` | `dark`, `default` |
67
+ | `sizes` | `sm`, `lg` |
68
+
69
+ ## Examples
70
+
71
+ Primary registry example: `examples/tooltip-demo.tsx`.
72
+
73
+ Open the live component page or run `npx banhaten docs tooltip` to inspect source files, install command, and examples.
74
+
75
+ ## Token Contract
76
+
77
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
78
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
79
+ Covered source files: `components/tooltip.tsx`.
80
+
81
+ ## RTL Rules
82
+
83
+ - `inheritsDirection`: true
84
+ - `spacing`: Uses inherited direction with flex layout so label/shortcut and text/close order mirror naturally.
85
+ - `pointerPlacement`: Top and bottom left/right positions map to logical start/end in RTL. Center-left and center-right remain physical sides to match the Figma matrix.
86
+ - `textDirection`: Labels and support text use dir="auto" for Arabic and English copy.
87
+ - `shortcutDirection`: TooltipShortcut defaults to dir="ltr" so physical key order remains stable inside RTL content.
88
+
89
+ ## Accessibility
90
+
91
+ This component relies on `@radix-ui/react-tooltip` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
92
+
93
93
  <!-- registry-contract:start -->
94
94
  ## Registry Contract
95
95