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.
- package/CHANGELOG.md +177 -139
- package/CONTRIBUTING.md +46 -46
- package/README.md +192 -192
- package/SECURITY.md +15 -15
- package/banhaten.config.example.json +11 -11
- package/docs/design-spacing.md +13 -13
- package/docs/design-system/README.md +22 -22
- package/docs/design-system/adoption-quality-remediation.md +87 -87
- package/docs/design-system/agent-usage.md +13 -13
- package/docs/design-system/appearance-presets.md +189 -189
- package/docs/design-system/appearances/default.md +94 -94
- package/docs/design-system/appearances/rounded.md +95 -95
- package/docs/design-system/appearances/sharp.md +95 -95
- package/docs/design-system/component-docs-pattern.md +81 -81
- package/docs/design-system/component-implementation-ownership-audit.md +245 -245
- package/docs/design-system/component-quality-audit-2026-08-20.md +225 -225
- package/docs/design-system/component-showcase-consistency-report.md +219 -219
- package/docs/design-system/component-token-consistency-audit.md +173 -173
- package/docs/design-system/components/README.md +91 -90
- package/docs/design-system/components/accordion.md +52 -52
- package/docs/design-system/components/activity-feed.md +93 -93
- package/docs/design-system/components/activity-heatmap.md +56 -56
- package/docs/design-system/components/alert-dialog.md +71 -71
- package/docs/design-system/components/alert.md +103 -97
- package/docs/design-system/components/app-header.md +97 -0
- package/docs/design-system/components/aspect-ratio.md +45 -45
- package/docs/design-system/components/attribute.md +101 -89
- package/docs/design-system/components/autocomplete.md +75 -75
- package/docs/design-system/components/avatar.md +53 -53
- package/docs/design-system/components/badge.md +55 -55
- package/docs/design-system/components/banner.md +86 -86
- package/docs/design-system/components/breadcrumbs.md +181 -177
- package/docs/design-system/components/button-group.md +97 -97
- package/docs/design-system/components/button.md +80 -80
- package/docs/design-system/components/card.md +102 -88
- package/docs/design-system/components/carousel.md +46 -46
- package/docs/design-system/components/catalog-components.md +46 -46
- package/docs/design-system/components/checkbox.md +53 -53
- package/docs/design-system/components/collapsible.md +63 -63
- package/docs/design-system/components/command.md +61 -61
- package/docs/design-system/components/context-menu.md +45 -45
- package/docs/design-system/components/date-picker.md +80 -80
- package/docs/design-system/components/divider.md +102 -102
- package/docs/design-system/components/empty-state.md +56 -56
- package/docs/design-system/components/field.md +70 -70
- package/docs/design-system/components/file-upload.md +186 -186
- package/docs/design-system/components/hover-card.md +47 -47
- package/docs/design-system/components/icons.md +48 -48
- package/docs/design-system/components/input-group.md +57 -57
- package/docs/design-system/components/input-otp.md +56 -56
- package/docs/design-system/components/input.md +111 -109
- package/docs/design-system/components/item.md +58 -58
- package/docs/design-system/components/kbd.md +49 -49
- package/docs/design-system/components/label.md +49 -49
- package/docs/design-system/components/menu.md +94 -73
- package/docs/design-system/components/menubar.md +46 -46
- package/docs/design-system/components/modal.md +104 -104
- package/docs/design-system/components/native-select.md +53 -53
- package/docs/design-system/components/navigation-menu.md +49 -49
- package/docs/design-system/components/onboarding-step-list-item.md +81 -81
- package/docs/design-system/components/page-header.md +127 -93
- package/docs/design-system/components/pagination.md +56 -56
- package/docs/design-system/components/popover.md +59 -59
- package/docs/design-system/components/progress-slider.md +49 -49
- package/docs/design-system/components/progress.md +76 -76
- package/docs/design-system/components/radio-card.md +50 -50
- package/docs/design-system/components/radio-group.md +56 -56
- package/docs/design-system/components/resizable.md +43 -43
- package/docs/design-system/components/scroll-area.md +50 -50
- package/docs/design-system/components/segmented-control.md +54 -54
- package/docs/design-system/components/select.md +68 -64
- package/docs/design-system/components/sheet.md +66 -66
- package/docs/design-system/components/sidebar.md +167 -111
- package/docs/design-system/components/skeleton.md +74 -74
- package/docs/design-system/components/slideout.md +64 -64
- package/docs/design-system/components/slider.md +62 -62
- package/docs/design-system/components/social-button.md +49 -49
- package/docs/design-system/components/spinner.md +62 -62
- package/docs/design-system/components/steps.md +65 -65
- package/docs/design-system/components/table.md +499 -422
- package/docs/design-system/components/tabs.md +74 -59
- package/docs/design-system/components/tag.md +79 -79
- package/docs/design-system/components/textarea.md +49 -49
- package/docs/design-system/components/timeline.md +82 -82
- package/docs/design-system/components/toast.md +57 -57
- package/docs/design-system/components/toggle.md +80 -80
- package/docs/design-system/components/toolbar.md +89 -89
- package/docs/design-system/components/tooltip.md +92 -92
- package/docs/design-system/components/typography.md +18 -18
- package/docs/design-system/density-and-elevation.md +65 -65
- package/docs/design-system/design-system-test-missing-items.md +368 -368
- package/docs/design-system/direction-and-localization.md +23 -23
- package/docs/design-system/form-recipes.md +73 -73
- package/docs/design-system/gap-promotion-policy.md +21 -21
- package/docs/design-system/icons.md +74 -74
- package/docs/design-system/installation.md +70 -70
- package/docs/design-system/launch-comparison-shadcn.md +98 -98
- package/docs/design-system/registry-and-cli.md +64 -64
- package/docs/design-system/release-policy.md +30 -30
- package/docs/design-system/roadmap.md +14 -14
- package/docs/design-system/support-matrix.md +23 -23
- package/docs/design-system/tabs.md +54 -54
- package/docs/design-system/template-gap-audit.md +32 -32
- package/docs/design-system/templates.md +59 -59
- package/docs/design-system/token-governance.md +72 -72
- package/package.json +98 -98
- package/registry/component-contract.json +40 -40
- package/registry/components/accordion.tsx +155 -155
- package/registry/components/alert-dialog.tsx +297 -297
- package/registry/components/alert.tsx +309 -293
- package/registry/components/app-header.tsx +151 -0
- package/registry/components/aspect-ratio.tsx +30 -30
- package/registry/components/attribute.tsx +489 -454
- package/registry/components/autocomplete.tsx +598 -598
- package/registry/components/avatar.tsx +385 -385
- package/registry/components/badge.tsx +630 -629
- package/registry/components/button-group.tsx +565 -565
- package/registry/components/button.tsx +128 -127
- package/registry/components/card.tsx +651 -638
- package/registry/components/carousel.tsx +296 -296
- package/registry/components/chart.tsx +203 -203
- package/registry/components/checkbox.tsx +247 -247
- package/registry/components/collapsible.tsx +109 -109
- package/registry/components/command.tsx +208 -208
- package/registry/components/context-menu.tsx +236 -236
- package/registry/components/date-picker.tsx +1289 -1289
- package/registry/components/expanded/ActivityFeed.tsx +227 -227
- package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
- package/registry/components/expanded/Banner.tsx +179 -179
- package/registry/components/expanded/Breadcrumbs.tsx +135 -131
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
- package/registry/components/expanded/CatalogDivider.tsx +49 -49
- package/registry/components/expanded/EmptyState.tsx +155 -155
- package/registry/components/expanded/FileUpload.tsx +543 -543
- package/registry/components/expanded/OnboardingStepListItem.tsx +60 -60
- package/registry/components/expanded/PageHeader.tsx +209 -179
- package/registry/components/expanded/Slideout.tsx +108 -108
- package/registry/components/expanded/Steps.tsx +402 -402
- package/registry/components/expanded/Table.tsx +1109 -1092
- package/registry/components/expanded/Timeline.tsx +203 -203
- package/registry/components/expanded/activityFeed.css +248 -248
- package/registry/components/expanded/activityHeatmap.css +66 -66
- package/registry/components/expanded/banner.css +260 -260
- package/registry/components/expanded/breadcrumbs.css +157 -140
- package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
- package/registry/components/expanded/divider.css +75 -75
- package/registry/components/expanded/emptyState.css +111 -111
- package/registry/components/expanded/fileUpload.css +457 -457
- package/registry/components/expanded/onboardingStepListItem.css +135 -135
- package/registry/components/expanded/pageHeader.css +284 -248
- package/registry/components/expanded/slideout.css +276 -276
- package/registry/components/expanded/steps.css +356 -356
- package/registry/components/expanded/table.css +655 -606
- package/registry/components/expanded/timeline.css +286 -286
- package/registry/components/field.tsx +283 -283
- package/registry/components/hover-card.tsx +48 -48
- package/registry/components/input-content.ts +107 -107
- package/registry/components/input-group.tsx +130 -130
- package/registry/components/input-otp.tsx +584 -584
- package/registry/components/input.tsx +992 -990
- package/registry/components/item.tsx +189 -189
- package/registry/components/kbd.tsx +246 -246
- package/registry/components/label.tsx +78 -78
- package/registry/components/menu.tsx +1091 -978
- package/registry/components/menubar.tsx +226 -226
- package/registry/components/modal.tsx +872 -872
- package/registry/components/native-select.tsx +205 -205
- package/registry/components/navigation-menu.tsx +171 -171
- package/registry/components/pagination.css +36 -36
- package/registry/components/pagination.tsx +560 -560
- package/registry/components/popover.tsx +338 -338
- package/registry/components/progress-slider.tsx +216 -216
- package/registry/components/radio-card.tsx +676 -676
- package/registry/components/radio-group.tsx +570 -570
- package/registry/components/resizable.tsx +108 -108
- package/registry/components/scroll-area.tsx +91 -91
- package/registry/components/segmented-control.tsx +87 -87
- package/registry/components/select-content.tsx +218 -218
- package/registry/components/select.tsx +937 -937
- package/registry/components/sheet.tsx +305 -305
- package/registry/components/sidebar.tsx +1535 -1433
- package/registry/components/skeleton.css +54 -54
- package/registry/components/skeleton.tsx +482 -482
- package/registry/components/slider.tsx +380 -380
- package/registry/components/social-button.tsx +387 -387
- package/registry/components/spinner.tsx +78 -78
- package/registry/components/table-elements.tsx +287 -128
- package/registry/components/tabs.css +246 -222
- package/registry/components/tabs.tsx +245 -241
- package/registry/components/tag.tsx +423 -423
- package/registry/components/textarea.tsx +610 -610
- package/registry/components/toast.tsx +136 -136
- package/registry/components/toggle.tsx +256 -256
- package/registry/components/toolbar.tsx +539 -539
- package/registry/components/tooltip.tsx +433 -433
- package/registry/examples/alert-demo.tsx +34 -34
- package/registry/examples/alert-dialog-demo.tsx +42 -42
- package/registry/examples/app-header-demo.tsx +40 -0
- package/registry/examples/aspect-ratio-demo.tsx +11 -11
- package/registry/examples/attribute-demo.tsx +65 -65
- package/registry/examples/autocomplete-demo.tsx +109 -109
- package/registry/examples/avatar-demo.tsx +132 -132
- package/registry/examples/badge-demo.tsx +69 -69
- package/registry/examples/button-demo.tsx +86 -86
- package/registry/examples/button-group-demo.tsx +63 -63
- package/registry/examples/card-demo.tsx +86 -86
- package/registry/examples/carousel-demo.tsx +43 -43
- package/registry/examples/chart-demo.tsx +18 -18
- package/registry/examples/checkbox-demo.tsx +62 -62
- package/registry/examples/collapsible-demo.tsx +16 -16
- package/registry/examples/collection-filter-bar-demo.tsx +135 -135
- package/registry/examples/command-demo.tsx +42 -42
- package/registry/examples/command-palette-demo.tsx +235 -235
- package/registry/examples/context-menu-demo.tsx +29 -29
- package/registry/examples/control-density-contract-demo.tsx +65 -65
- package/registry/examples/date-picker-demo.tsx +127 -127
- package/registry/examples/divider-demo.tsx +17 -17
- package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
- package/registry/examples/expanded/banner-demo.tsx +48 -48
- package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
- package/registry/examples/expanded/empty-state-demo.tsx +39 -39
- package/registry/examples/expanded/file-upload-demo.tsx +60 -60
- package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
- package/registry/examples/expanded/slideout-demo.tsx +15 -15
- package/registry/examples/expanded/steps-demo.tsx +29 -29
- package/registry/examples/expanded/tabs-demo.tsx +13 -13
- package/registry/examples/expanded/timeline-demo.tsx +18 -18
- package/registry/examples/field-demo.tsx +51 -51
- package/registry/examples/hover-card-demo.tsx +23 -23
- package/registry/examples/input-actions-demo.tsx +36 -36
- package/registry/examples/input-demo.tsx +87 -87
- package/registry/examples/input-group-demo.tsx +16 -16
- package/registry/examples/input-otp-demo.tsx +72 -72
- package/registry/examples/item-demo.tsx +46 -46
- package/registry/examples/kbd-demo.tsx +12 -12
- package/registry/examples/label-demo.tsx +20 -20
- package/registry/examples/menu-demo.tsx +122 -122
- package/registry/examples/menubar-demo.tsx +34 -34
- package/registry/examples/modal-demo.tsx +74 -74
- package/registry/examples/native-select-demo.tsx +16 -16
- package/registry/examples/navigation-menu-demo.tsx +29 -29
- package/registry/examples/pagination-demo.tsx +20 -20
- package/registry/examples/popover-demo.tsx +547 -547
- package/registry/examples/progress-demo.tsx +37 -37
- package/registry/examples/progress-slider-demo.tsx +29 -29
- package/registry/examples/radio-card-demo.tsx +51 -51
- package/registry/examples/radio-group-demo.tsx +62 -62
- package/registry/examples/resizable-demo.tsx +22 -22
- package/registry/examples/results-toolbar-demo.tsx +44 -44
- package/registry/examples/scroll-area-demo.tsx +15 -15
- package/registry/examples/segmented-control-demo.tsx +39 -39
- package/registry/examples/select-demo.tsx +87 -87
- package/registry/examples/sheet-demo.tsx +47 -47
- package/registry/examples/sidebar-demo.tsx +101 -101
- package/registry/examples/slider-demo.tsx +31 -31
- package/registry/examples/social-button-demo.tsx +61 -61
- package/registry/examples/spinner-demo.tsx +59 -59
- package/registry/examples/tabs-demo.tsx +13 -13
- package/registry/examples/tag-demo.tsx +29 -29
- package/registry/examples/textarea-demo.tsx +79 -79
- package/registry/examples/toast-demo.tsx +35 -35
- package/registry/examples/toggle-demo.tsx +59 -59
- package/registry/examples/tooltip-demo.tsx +115 -115
- package/registry/guidance/USAGE.md +27 -27
- package/registry/hooks/use-direction.ts +207 -207
- package/registry/index.json +387 -17
- package/registry/styles/globals.css +46 -0
- package/registry.json +24 -2
- package/schema/config.schema.json +51 -51
- package/schema/registry.schema.json +194 -194
- package/schema/tokens.schema.json +167 -167
- package/src/cli/command-line.js +194 -194
- package/src/cli/config-editors.js +9 -9
- package/src/cli/doctor.js +399 -399
- package/src/cli/file-transaction.js +302 -302
- package/src/cli/global-css.js +153 -153
- package/src/cli/index.js +1002 -1002
- package/src/cli/install-plan.js +592 -592
- package/src/cli/install-receipt.js +171 -171
- package/src/cli/jsonc.js +203 -203
- package/src/cli/package-install-state.js +254 -254
- package/src/cli/package-manager.js +238 -238
- package/src/cli/package-plan.js +185 -185
- package/src/cli/package-version.js +97 -97
- package/src/cli/registry-query.js +207 -207
- package/src/cli/reporting.js +55 -55
- package/src/cli/schema-validation.js +19 -19
- package/src/cli/source-scanner.js +686 -686
- package/src/cli/vite-config.js +478 -478
- package/tokens/banhaten.tokens.json +184 -0
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
# Kbd
|
|
2
|
-
|
|
3
|
-
Kbd renders physical keyboard keys. Shortcut renders a compact combined hint for Inputs and constrained action rows, while KbdShortcut renders each physical key on its own surface.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Shortcut keys={["Mod", "K"]} />
|
|
9
|
-
<KbdShortcut keys={["Mod", "K"]} />
|
|
10
|
-
<Kbd>Esc</Kbd>
|
|
11
|
-
<Kbd size="md">Shift</Kbd>
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
| Prop | Values |
|
|
15
|
-
| --- | --- |
|
|
16
|
-
| `dir` | `ltr` by default on Kbd; override only for localized non-shortcut key names |
|
|
17
|
-
| `size` | `sm`, `md` |
|
|
18
|
-
| `keys` | `readonly string[]`; use `Mod` for Command on Apple platforms and Control elsewhere |
|
|
19
|
-
| `platform` | `auto`, `mac`, `windows`, `linux` |
|
|
20
|
-
|
|
21
|
-
## Token Contract
|
|
22
|
-
|
|
23
|
-
Kbd uses Banhaten border, soft interactive background, radius, body-xs typography, and button elevation tokens. Shortcut uses the Figma compact contract: 20px height/minimum width, 4px inline padding and radius, body-2xs medium typography, and no keycap elevation.
|
|
24
|
-
|
|
25
|
-
## RTL
|
|
26
|
-
|
|
27
|
-
Kbd defaults to `dir="ltr"` so physical modifiers and keys keep their canonical order inside RTL interfaces. Surrounding shortcut descriptions retain their own text direction; pass an explicit `dir` only for localized, non-shortcut key names.
|
|
28
|
-
|
|
29
|
-
## Accessibility
|
|
30
|
-
|
|
31
|
-
Use Kbd as supporting text, not as the only label for an action.
|
|
32
|
-
|
|
33
|
-
## Install
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npx banhaten add kbd
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Examples
|
|
40
|
-
|
|
41
|
-
Primary registry example: `examples/kbd-demo.tsx`.
|
|
42
|
-
|
|
43
|
-
Open the live component page or run `npx banhaten docs kbd` to inspect source files, install command, and examples.
|
|
44
|
-
|
|
45
|
-
## RTL Rules
|
|
46
|
-
|
|
47
|
-
- `inheritsDirection`: false
|
|
48
|
-
- `semantics`: Kbd defaults to dir="ltr" so physical key order stays stable, while surrounding shortcut descriptions keep their own text direction.
|
|
49
|
-
|
|
1
|
+
# Kbd
|
|
2
|
+
|
|
3
|
+
Kbd renders physical keyboard keys. Shortcut renders a compact combined hint for Inputs and constrained action rows, while KbdShortcut renders each physical key on its own surface.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Shortcut keys={["Mod", "K"]} />
|
|
9
|
+
<KbdShortcut keys={["Mod", "K"]} />
|
|
10
|
+
<Kbd>Esc</Kbd>
|
|
11
|
+
<Kbd size="md">Shift</Kbd>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
| Prop | Values |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `dir` | `ltr` by default on Kbd; override only for localized non-shortcut key names |
|
|
17
|
+
| `size` | `sm`, `md` |
|
|
18
|
+
| `keys` | `readonly string[]`; use `Mod` for Command on Apple platforms and Control elsewhere |
|
|
19
|
+
| `platform` | `auto`, `mac`, `windows`, `linux` |
|
|
20
|
+
|
|
21
|
+
## Token Contract
|
|
22
|
+
|
|
23
|
+
Kbd uses Banhaten border, soft interactive background, radius, body-xs typography, and button elevation tokens. Shortcut uses the Figma compact contract: 20px height/minimum width, 4px inline padding and radius, body-2xs medium typography, and no keycap elevation.
|
|
24
|
+
|
|
25
|
+
## RTL
|
|
26
|
+
|
|
27
|
+
Kbd defaults to `dir="ltr"` so physical modifiers and keys keep their canonical order inside RTL interfaces. Surrounding shortcut descriptions retain their own text direction; pass an explicit `dir` only for localized, non-shortcut key names.
|
|
28
|
+
|
|
29
|
+
## Accessibility
|
|
30
|
+
|
|
31
|
+
Use Kbd as supporting text, not as the only label for an action.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx banhaten add kbd
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Examples
|
|
40
|
+
|
|
41
|
+
Primary registry example: `examples/kbd-demo.tsx`.
|
|
42
|
+
|
|
43
|
+
Open the live component page or run `npx banhaten docs kbd` to inspect source files, install command, and examples.
|
|
44
|
+
|
|
45
|
+
## RTL Rules
|
|
46
|
+
|
|
47
|
+
- `inheritsDirection`: false
|
|
48
|
+
- `semantics`: Kbd defaults to dir="ltr" so physical key order stays stable, while surrounding shortcut descriptions keep their own text direction.
|
|
49
|
+
|
|
50
50
|
<!-- registry-contract:start -->
|
|
51
51
|
## Registry Contract
|
|
52
52
|
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
# Label
|
|
2
|
-
|
|
3
|
-
Label renders accessible control labels with Banhaten typography, required markers, optional text, tone variants, and RTL-safe copy. It is backed by Radix Label.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Label htmlFor="email" required>
|
|
9
|
-
Email address
|
|
10
|
-
</Label>
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
| Prop | Values |
|
|
14
|
-
| --- | --- |
|
|
15
|
-
| `htmlFor` | target control id |
|
|
16
|
-
| `tone` | `default`, `subtle`, `danger` |
|
|
17
|
-
| `required` | `boolean` |
|
|
18
|
-
| `optionalText` | `ReactNode` |
|
|
19
|
-
|
|
20
|
-
## Token Contract
|
|
21
|
-
|
|
22
|
-
Label consumes Banhaten body-sm, body-xs, content, danger, spacing, and disabled-state tokens.
|
|
23
|
-
|
|
24
|
-
## RTL
|
|
25
|
-
|
|
26
|
-
Label uses logical inline spacing and `dir="auto"` for label and optional text.
|
|
27
|
-
|
|
28
|
-
## Accessibility
|
|
29
|
-
|
|
30
|
-
Use `htmlFor` for native controls. For complete form rows with description and error text, use `Field`.
|
|
31
|
-
|
|
32
|
-
## Install
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
npx banhaten add label
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Examples
|
|
39
|
-
|
|
40
|
-
Primary registry example: `examples/label-demo.tsx`.
|
|
41
|
-
|
|
42
|
-
Open the live component page or run `npx banhaten docs label` to inspect source files, install command, and examples.
|
|
43
|
-
|
|
44
|
-
## RTL Rules
|
|
45
|
-
|
|
46
|
-
- `inheritsDirection`: true
|
|
47
|
-
- `textDirection`: Label and optional text use dir="auto" so Arabic and English labels resolve naturally.
|
|
48
|
-
- `spacing`: Uses logical inline spacing between label text, required marker, and optional text.
|
|
49
|
-
|
|
1
|
+
# Label
|
|
2
|
+
|
|
3
|
+
Label renders accessible control labels with Banhaten typography, required markers, optional text, tone variants, and RTL-safe copy. It is backed by Radix Label.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Label htmlFor="email" required>
|
|
9
|
+
Email address
|
|
10
|
+
</Label>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
| Prop | Values |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `htmlFor` | target control id |
|
|
16
|
+
| `tone` | `default`, `subtle`, `danger` |
|
|
17
|
+
| `required` | `boolean` |
|
|
18
|
+
| `optionalText` | `ReactNode` |
|
|
19
|
+
|
|
20
|
+
## Token Contract
|
|
21
|
+
|
|
22
|
+
Label consumes Banhaten body-sm, body-xs, content, danger, spacing, and disabled-state tokens.
|
|
23
|
+
|
|
24
|
+
## RTL
|
|
25
|
+
|
|
26
|
+
Label uses logical inline spacing and `dir="auto"` for label and optional text.
|
|
27
|
+
|
|
28
|
+
## Accessibility
|
|
29
|
+
|
|
30
|
+
Use `htmlFor` for native controls. For complete form rows with description and error text, use `Field`.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx banhaten add label
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
|
|
40
|
+
Primary registry example: `examples/label-demo.tsx`.
|
|
41
|
+
|
|
42
|
+
Open the live component page or run `npx banhaten docs label` to inspect source files, install command, and examples.
|
|
43
|
+
|
|
44
|
+
## RTL Rules
|
|
45
|
+
|
|
46
|
+
- `inheritsDirection`: true
|
|
47
|
+
- `textDirection`: Label and optional text use dir="auto" so Arabic and English labels resolve naturally.
|
|
48
|
+
- `spacing`: Uses logical inline spacing between label text, required marker, and optional text.
|
|
49
|
+
|
|
50
50
|
<!-- registry-contract:start -->
|
|
51
51
|
## Registry Contract
|
|
52
52
|
|
|
@@ -1,72 +1,91 @@
|
|
|
1
|
-
# Menu
|
|
2
|
-
|
|
3
|
-
Menu is a Radix DropdownMenu-backed action surface for contextual commands, navigation, progress rows, labels, captions, call-to-action rows, submenus, and rich item media.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<MenuRoot>
|
|
9
|
-
<MenuTrigger>Open menu</MenuTrigger>
|
|
10
|
-
<MenuContent width="menu">
|
|
11
|
-
<MenuItem>Profile</MenuItem>
|
|
12
|
-
<MenuSeparator />
|
|
13
|
-
<MenuItem kind="button">Upgrade plan</MenuItem>
|
|
14
|
-
</MenuContent>
|
|
15
|
-
</MenuRoot>
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
| Part | Purpose |
|
|
19
|
-
| --- | --- |
|
|
20
|
-
| `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal` | Radix-backed menu shell |
|
|
21
|
-
| `MenuItem`, `MenuItemContent`, media slots | interactive rows |
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
|
|
31
|
-
`
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
1
|
+
# Menu
|
|
2
|
+
|
|
3
|
+
Menu is a Radix DropdownMenu-backed action surface for contextual commands, navigation, progress rows, labels, captions, call-to-action rows, submenus, and rich item media.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<MenuRoot>
|
|
9
|
+
<MenuTrigger>Open menu</MenuTrigger>
|
|
10
|
+
<MenuContent width="menu">
|
|
11
|
+
<MenuItem>Profile</MenuItem>
|
|
12
|
+
<MenuSeparator />
|
|
13
|
+
<MenuItem kind="button">Upgrade plan</MenuItem>
|
|
14
|
+
</MenuContent>
|
|
15
|
+
</MenuRoot>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Part | Purpose |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal` | Radix-backed menu shell |
|
|
21
|
+
| `MenuItem`, `MenuItemContent`, media slots | interactive rows |
|
|
22
|
+
| `MenuRadioGroup`, `MenuRadioItem` | one choice among items, such as a display time zone |
|
|
23
|
+
| `MenuSub`, `MenuSubTrigger`, `MenuSubContent` | nested menus |
|
|
24
|
+
| `MenuLabel`, `MenuCaption`, `MenuSeparator` | non-interactive structure |
|
|
25
|
+
|
|
26
|
+
| Prop | Values |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `width` | `menu`, `default`, `multiline`, `action`, `auto` |
|
|
29
|
+
| `kind` | `default`, `multiline`, `action`, `progress`, `button` |
|
|
30
|
+
| `MenuItem.onSelect` | `(event: Event) => void` |
|
|
31
|
+
| `MenuRadioGroup.value`, `MenuRadioGroup.onValueChange` | the chosen value; `(value: string) => void` |
|
|
32
|
+
| `MenuRadioItem.value` | the value the item stands for |
|
|
33
|
+
|
|
34
|
+
`MenuItem.onSelect` uses Radix's native selection `Event`, not React's DOM text-selection event. Selection closes the menu by default; prevent it when a toggle or multi-select flow should remain open:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<MenuItem onSelect={(event: Event) => event.preventDefault()}>
|
|
38
|
+
Keep this menu open
|
|
39
|
+
</MenuItem>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Use `MenuRadioGroup` and `MenuRadioItem` when the menu sets one value. Items are `menuitemradio` with `aria-checked`, and the chosen one shows a trailing check. Choosing an item closes the menu and calls `onValueChange`. They also render in `MenuPreview`, where the group's `value` marks the chosen item.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<MenuRoot>
|
|
46
|
+
<MenuTrigger asChild>
|
|
47
|
+
<Button variant="outline">Riyadh · UTC+3</Button>
|
|
48
|
+
</MenuTrigger>
|
|
49
|
+
<MenuContent align="end">
|
|
50
|
+
<MenuRadioGroup value={zone} onValueChange={setZone}>
|
|
51
|
+
<MenuRadioItem value="Asia/Riyadh">Riyadh · UTC+3</MenuRadioItem>
|
|
52
|
+
<MenuRadioItem value="Asia/Dubai">Dubai · UTC+4</MenuRadioItem>
|
|
53
|
+
</MenuRadioGroup>
|
|
54
|
+
</MenuContent>
|
|
55
|
+
</MenuRoot>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Token Contract
|
|
59
|
+
|
|
60
|
+
Menu uses Banhaten raised surface, menu shadow, item typography, border, radius, spacing, progress, badge, switch, and focus tokens. Leading glyphs are 18px inside 20px slots; trailing 16px affordances remain unchanged.
|
|
61
|
+
|
|
62
|
+
## RTL
|
|
63
|
+
|
|
64
|
+
Menu uses logical padding and flex direction so leading icons, trailing actions, badges, switches, meta text, and submenus mirror naturally. Directional icons should use `data-rtl-flip="true"`.
|
|
65
|
+
|
|
66
|
+
## Accessibility
|
|
67
|
+
|
|
68
|
+
Radix provides menu roles, focus management, typeahead, keyboard navigation, Escape handling, and outside dismissal. Keep non-command copy in labels or captions, not disabled menu items.
|
|
69
|
+
|
|
70
|
+
## Install
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npx banhaten add menu
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Examples
|
|
77
|
+
|
|
78
|
+
Primary registry example: `examples/menu-demo.tsx`.
|
|
79
|
+
|
|
80
|
+
Open the live component page or run `npx banhaten docs menu` to inspect source files, install command, and examples.
|
|
81
|
+
|
|
82
|
+
## RTL Rules
|
|
83
|
+
|
|
84
|
+
- `inheritsDirection`: true
|
|
85
|
+
- `spacing`: Uses logical padding and flex direction so leading, trailing, badge, switch, right text, and action slots mirror naturally.
|
|
86
|
+
- `directionalIconFlip`: Use data-rtl-flip="true" on chevrons and arrows that should mirror.
|
|
87
|
+
- `textDirection`: Text slots use dir="auto" by default for Arabic and English labels.
|
|
88
|
+
|
|
70
89
|
<!-- registry-contract:start -->
|
|
71
90
|
## Registry Contract
|
|
72
91
|
|
|
@@ -75,12 +94,14 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
75
94
|
|
|
76
95
|
| Field | Values |
|
|
77
96
|
| --- | --- |
|
|
78
|
-
| `supportedExports` | `components/menu.tsx: Menu, MenuCaption, MenuContent, MenuItem, MenuItemAction, MenuItemAvatar, MenuItemBadge, MenuItemContent, MenuItemDescription, MenuItemIcon, MenuItemMeta, MenuItemSwitch, MenuItemText, MenuItemTitle, MenuLabel, MenuPortal, MenuPreview, MenuProgress, MenuRoot, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuSurface, MenuTrigger, menuItemContentVariants, menuItemIconVariants, menuItemVariants, menuVariants` |
|
|
79
|
-
| `parts` | `Menu`, `MenuPreview`, `MenuSurface`, `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal`, `MenuSub`, `MenuSubTrigger`, `MenuSubContent`, `MenuItem`, `MenuItemContent`, `MenuItemIcon`, `MenuItemAvatar`, `MenuItemText`, `MenuItemTitle`, `MenuItemDescription`, `MenuItemMeta`, `MenuItemBadge`, `MenuItemSwitch`, `MenuItemAction`, `MenuProgress`, `MenuSeparator`, `MenuLabel`, `MenuCaption` |
|
|
97
|
+
| `supportedExports` | `components/menu.tsx: Menu, MenuCaption, MenuContent, MenuItem, MenuItemAction, MenuItemAvatar, MenuItemBadge, MenuItemContent, MenuItemDescription, MenuItemIcon, MenuItemMeta, MenuItemSwitch, MenuItemText, MenuItemTitle, MenuLabel, MenuPortal, MenuPreview, MenuProgress, MenuRadioGroup, MenuRadioItem, MenuRoot, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuSurface, MenuTrigger, menuItemContentVariants, menuItemIconVariants, menuItemVariants, menuVariants` |
|
|
98
|
+
| `parts` | `Menu`, `MenuPreview`, `MenuSurface`, `MenuRoot`, `MenuTrigger`, `MenuContent`, `MenuPortal`, `MenuSub`, `MenuSubTrigger`, `MenuSubContent`, `MenuItem`, `MenuItemContent`, `MenuItemIcon`, `MenuItemAvatar`, `MenuItemText`, `MenuItemTitle`, `MenuItemDescription`, `MenuItemMeta`, `MenuItemBadge`, `MenuItemSwitch`, `MenuItemAction`, `MenuRadioGroup`, `MenuRadioItem`, `MenuProgress`, `MenuSeparator`, `MenuLabel`, `MenuCaption` |
|
|
80
99
|
| `registryDependencies` | None |
|
|
81
100
|
| `props.onSelect` | `(event: Event) => void; default null; MenuItem selection handler. Uses Radix's native selection Event, not React's DOM text-selection event; call event.preventDefault() to keep toggle or multi-select menus open.` |
|
|
101
|
+
| `props.onValueChange` | `(value: string) => void; default null; MenuRadioGroup only. Receives the value of the MenuRadioItem that was chosen.` |
|
|
102
|
+
| `props.value` | `string; default null; MenuRadioGroup: the chosen value. MenuRadioItem: the value the item stands for; the item matching its group's value is checked, with role menuitemradio, aria-checked and a trailing check.` |
|
|
82
103
|
| `itemKinds` | `default`, `multiline`, `action`, `progress`, `button` |
|
|
83
|
-
| `states` | `default`, `disabled` |
|
|
84
|
-
| `tokens` | `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-border-brand-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-default`, `--bh-icon-stroke-300`, `--bh-interactive-indicator-default`, `--bh-interactive-outlined-default`, `--bh-interactive-outlined-hover`, `--bh-interactive-switch-active`, `--bh-interactive-switch-default`, `--bh-interactive-switch-disabled`, `--bh-interactive-switch-handle`, `--bh-interactive-switch-handle-disabled`, `--bh-menu-action-gap`, `--bh-menu-action-height`, `--bh-menu-action-padding-x`, `--bh-menu-badge-height`, `--bh-menu-badge-padding-x`, `--bh-menu-bg`, `--bh-menu-divider-padding-y`, `--bh-menu-gap`, `--bh-menu-icon-padding`, `--bh-menu-item-action-height`, `--bh-menu-item-action-width`, `--bh-menu-item-bg`, `--bh-menu-item-button-height`, `--bh-menu-item-caption-height`, `--bh-menu-item-content-compact-padding-y`, `--bh-menu-item-content-padding`, `--bh-menu-item-default-height`, `--bh-menu-item-default-width`, `--bh-menu-item-divider-height`, `--bh-menu-item-gap`, `--bh-menu-item-hover-bg`, `--bh-menu-item-label-height`, `--bh-menu-item-multiline-height`, `--bh-menu-item-multiline-width`, `--bh-menu-item-padding-x`, `--bh-menu-item-progress-height`, `--bh-menu-item-radius`, `--bh-menu-item-slot-gap`, `--bh-menu-label-padding-x`, `--bh-menu-leading-icon-size`, `--bh-menu-leading-icon-slot-size`, `--bh-menu-padding-y`, `--bh-menu-progress-gap`, `--bh-menu-progress-height`, `--bh-menu-radius`, `--bh-menu-switch-handle-size`, `--bh-menu-switch-height`, `--bh-menu-switch-padding`, `--bh-menu-switch-width`, `--bh-menu-trailing-icon-size`, `--bh-menu-width`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-space-5xl-24`, `--bh-space-7xl-40`, `--bh-space-md-8`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-medium-font-size`, `--bh-text-body-3xs-medium-font-weight`, `--bh-text-body-3xs-medium-letter-spacing`, `--bh-text-body-3xs-medium-line-height`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--elevation-menu` |
|
|
104
|
+
| `states` | `default`, `disabled`, `checked` |
|
|
105
|
+
| `tokens` | `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`, `--bh-border-brand-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-control-default`, `--bh-icon-stroke-200`, `--bh-icon-stroke-300`, `--bh-interactive-indicator-default`, `--bh-interactive-outlined-default`, `--bh-interactive-outlined-hover`, `--bh-interactive-switch-active`, `--bh-interactive-switch-default`, `--bh-interactive-switch-disabled`, `--bh-interactive-switch-handle`, `--bh-interactive-switch-handle-disabled`, `--bh-menu-action-gap`, `--bh-menu-action-height`, `--bh-menu-action-padding-x`, `--bh-menu-badge-height`, `--bh-menu-badge-padding-x`, `--bh-menu-bg`, `--bh-menu-divider-padding-y`, `--bh-menu-gap`, `--bh-menu-icon-padding`, `--bh-menu-item-action-height`, `--bh-menu-item-action-width`, `--bh-menu-item-bg`, `--bh-menu-item-button-height`, `--bh-menu-item-caption-height`, `--bh-menu-item-content-compact-padding-y`, `--bh-menu-item-content-padding`, `--bh-menu-item-default-height`, `--bh-menu-item-default-width`, `--bh-menu-item-divider-height`, `--bh-menu-item-gap`, `--bh-menu-item-hover-bg`, `--bh-menu-item-label-height`, `--bh-menu-item-multiline-height`, `--bh-menu-item-multiline-width`, `--bh-menu-item-padding-x`, `--bh-menu-item-progress-height`, `--bh-menu-item-radius`, `--bh-menu-item-slot-gap`, `--bh-menu-label-padding-x`, `--bh-menu-leading-icon-size`, `--bh-menu-leading-icon-slot-size`, `--bh-menu-padding-y`, `--bh-menu-progress-gap`, `--bh-menu-progress-height`, `--bh-menu-radius`, `--bh-menu-switch-handle-size`, `--bh-menu-switch-height`, `--bh-menu-switch-padding`, `--bh-menu-switch-width`, `--bh-menu-trailing-icon-size`, `--bh-menu-width`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-space-5xl-24`, `--bh-space-7xl-40`, `--bh-space-md-8`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-medium-font-size`, `--bh-text-body-3xs-medium-font-weight`, `--bh-text-body-3xs-medium-letter-spacing`, `--bh-text-body-3xs-medium-line-height`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-medium-letter-spacing`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--elevation-menu` |
|
|
85
106
|
| `widths` | `menu`, `default`, `multiline`, `action`, `auto` |
|
|
86
107
|
<!-- registry-contract:end -->
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
# Menubar
|
|
2
|
-
|
|
3
|
-
Menubar wraps Radix Menubar for application-style top menus.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Menubar>
|
|
9
|
-
<MenubarMenu>
|
|
10
|
-
<MenubarTrigger>File</MenubarTrigger>
|
|
11
|
-
<MenubarContent>
|
|
12
|
-
<MenubarItem>New</MenubarItem>
|
|
13
|
-
</MenubarContent>
|
|
14
|
-
</MenubarMenu>
|
|
15
|
-
</Menubar>
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Token Contract
|
|
19
|
-
|
|
20
|
-
Menubar uses Banhaten menu, surface, border, shadow, hover, spacing, and body typography tokens.
|
|
21
|
-
|
|
22
|
-
## RTL
|
|
23
|
-
|
|
24
|
-
Triggers, menu items, and shortcuts use logical spacing and inherited direction.
|
|
25
|
-
|
|
26
|
-
## Accessibility
|
|
27
|
-
|
|
28
|
-
Radix provides menubar roles, keyboard navigation, open state, and submenu behavior.
|
|
29
|
-
|
|
30
|
-
## Install
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npx banhaten add menubar
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Examples
|
|
37
|
-
|
|
38
|
-
Primary registry example: `examples/menubar-demo.tsx`.
|
|
39
|
-
|
|
40
|
-
Open the live component page or run `npx banhaten docs menubar` to inspect source files, install command, and examples.
|
|
41
|
-
|
|
42
|
-
## RTL Rules
|
|
43
|
-
|
|
44
|
-
- `inheritsDirection`: true
|
|
45
|
-
- `spacing`: Triggers, items, and shortcuts use logical spacing.
|
|
46
|
-
|
|
1
|
+
# Menubar
|
|
2
|
+
|
|
3
|
+
Menubar wraps Radix Menubar for application-style top menus.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Menubar>
|
|
9
|
+
<MenubarMenu>
|
|
10
|
+
<MenubarTrigger>File</MenubarTrigger>
|
|
11
|
+
<MenubarContent>
|
|
12
|
+
<MenubarItem>New</MenubarItem>
|
|
13
|
+
</MenubarContent>
|
|
14
|
+
</MenubarMenu>
|
|
15
|
+
</Menubar>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Token Contract
|
|
19
|
+
|
|
20
|
+
Menubar uses Banhaten menu, surface, border, shadow, hover, spacing, and body typography tokens.
|
|
21
|
+
|
|
22
|
+
## RTL
|
|
23
|
+
|
|
24
|
+
Triggers, menu items, and shortcuts use logical spacing and inherited direction.
|
|
25
|
+
|
|
26
|
+
## Accessibility
|
|
27
|
+
|
|
28
|
+
Radix provides menubar roles, keyboard navigation, open state, and submenu behavior.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx banhaten add menubar
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Examples
|
|
37
|
+
|
|
38
|
+
Primary registry example: `examples/menubar-demo.tsx`.
|
|
39
|
+
|
|
40
|
+
Open the live component page or run `npx banhaten docs menubar` to inspect source files, install command, and examples.
|
|
41
|
+
|
|
42
|
+
## RTL Rules
|
|
43
|
+
|
|
44
|
+
- `inheritsDirection`: true
|
|
45
|
+
- `spacing`: Triggers, items, and shortcuts use logical spacing.
|
|
46
|
+
|
|
47
47
|
<!-- registry-contract:start -->
|
|
48
48
|
## Registry Contract
|
|
49
49
|
|