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,78 +1,78 @@
|
|
|
1
|
-
# Autocomplete
|
|
2
|
-
|
|
3
|
-
Autocomplete is a searchable combobox field for choosing one or many known options.
|
|
4
|
-
|
|
5
|
-
The implementation is intentionally composed from existing Banhaten primitives: `Input` owns the field surface, `SelectMenu` and `SelectMenuItem` own the result list, and `Tag` owns selected multi-value chips. The component adds filtering, selected-value state, keyboard navigation, ARIA combobox wiring, and controlled or uncontrolled APIs.
|
|
6
|
-
|
|
7
|
-
## API
|
|
8
|
-
|
|
9
|
-
```tsx
|
|
10
|
-
<Autocomplete
|
|
11
|
-
label="Owner"
|
|
12
|
-
placeholder="Search people"
|
|
13
|
-
options={[
|
|
14
|
-
{ value: "ahmed", label: "Ahmed Galal", addonText: "Design system" },
|
|
15
|
-
{ value: "nora", label: "Nora Ali", addonText: "Product" },
|
|
16
|
-
]}
|
|
17
|
-
/>
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
| Prop | Values | Default |
|
|
21
|
-
| --- | --- | --- |
|
|
22
|
-
| `options` | `{ value, label, addonText, itemType, media, keywords, disabled }[]` | required |
|
|
23
|
-
| `selectionMode` | `single`, `multiple` | `single` |
|
|
24
|
-
| `value` / `defaultValue` | `string` or `string[]` | none |
|
|
25
|
-
| `inputValue` / `defaultInputValue` | `string` | inferred from selected single value |
|
|
26
|
-
| `open` / `defaultOpen` | `boolean` | `false` |
|
|
27
|
-
| `filterOptions` | custom filtering function | label, value, and keywords filter |
|
|
28
|
-
| `size` | `md`, `lg` | `lg` |
|
|
29
|
-
| `variant` | `default`, `soft` | `default` |
|
|
30
|
-
| `state` | `default`, `filled`, `error`, `disabled` | inferred |
|
|
31
|
-
| `dir` | `ltr`, `rtl`, `auto` | inherited |
|
|
32
|
-
|
|
33
|
-
## Composition Rules
|
|
34
|
-
|
|
35
|
-
- Use autocomplete for known option sets that benefit from search.
|
|
36
|
-
- Use `Select` when the option set is short and browsing is faster than typing.
|
|
37
|
-
- Use `selectionMode="multiple"` when selected options need removable chips; chips render with `Tag`.
|
|
38
|
-
- Keep async fetching, debouncing, and remote loading in product code by controlling `inputValue`, `open`, and `options`.
|
|
39
|
-
- Keep option labels concise. Use `addonText` for secondary metadata.
|
|
40
|
-
|
|
41
|
-
## Accessibility
|
|
42
|
-
|
|
43
|
-
- The input uses `role="combobox"`, `aria-autocomplete="list"`, `aria-expanded`, `aria-controls`, and `aria-activedescendant`.
|
|
44
|
-
- Results render as a `listbox` using Select menu rows.
|
|
45
|
-
- Arrow keys move the active option, `Enter` selects, `Escape` closes, and `Backspace` removes the last selected tag in multiple mode when the search field is empty.
|
|
46
|
-
- Labels and helper text are associated with the input, and error state maps to `aria-invalid`.
|
|
47
|
-
|
|
48
|
-
## Token Contract
|
|
49
|
-
|
|
50
|
-
Autocomplete consumes tokens through the primitives it composes:
|
|
51
|
-
|
|
52
|
-
- Field surface, typography, icon sizing, focus ring, and disabled/error states from `Input`.
|
|
53
|
-
- Menu surface, item rows, hover state, selected check, and item media slots from `Select`.
|
|
54
|
-
- Removable selected chips from `Tag`.
|
|
55
|
-
- Additional layout uses spacing, content, and z-index tokens only.
|
|
56
|
-
|
|
57
|
-
## Install
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
npx banhaten add autocomplete
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Examples
|
|
64
|
-
|
|
65
|
-
Primary registry example: `examples/autocomplete-demo.tsx`.
|
|
66
|
-
|
|
67
|
-
Open the live component page or run `npx banhaten docs autocomplete` to inspect source files, install command, and examples.
|
|
68
|
-
|
|
69
|
-
## RTL Rules
|
|
70
|
-
|
|
71
|
-
- `inheritsDirection`: true
|
|
72
|
-
- `composition`: Uses the existing Input field, Select menu and menu item rows, and Tag chips instead of introducing new visual primitives.
|
|
73
|
-
- `spacing`: Uses logical positioning, logical gaps, and inherited direction so the input, menu rows, checks, helper text, and selected tags mirror naturally.
|
|
74
|
-
- `textDirection`: Labels, option text, helper text, and tag labels use dir="auto" through the composed primitives.
|
|
75
|
-
|
|
1
|
+
# Autocomplete
|
|
2
|
+
|
|
3
|
+
Autocomplete is a searchable combobox field for choosing one or many known options.
|
|
4
|
+
|
|
5
|
+
The implementation is intentionally composed from existing Banhaten primitives: `Input` owns the field surface, `SelectMenu` and `SelectMenuItem` own the result list, and `Tag` owns selected multi-value chips. The component adds filtering, selected-value state, keyboard navigation, ARIA combobox wiring, and controlled or uncontrolled APIs.
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
<Autocomplete
|
|
11
|
+
label="Owner"
|
|
12
|
+
placeholder="Search people"
|
|
13
|
+
options={[
|
|
14
|
+
{ value: "ahmed", label: "Ahmed Galal", addonText: "Design system" },
|
|
15
|
+
{ value: "nora", label: "Nora Ali", addonText: "Product" },
|
|
16
|
+
]}
|
|
17
|
+
/>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Prop | Values | Default |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `options` | `{ value, label, addonText, itemType, media, keywords, disabled }[]` | required |
|
|
23
|
+
| `selectionMode` | `single`, `multiple` | `single` |
|
|
24
|
+
| `value` / `defaultValue` | `string` or `string[]` | none |
|
|
25
|
+
| `inputValue` / `defaultInputValue` | `string` | inferred from selected single value |
|
|
26
|
+
| `open` / `defaultOpen` | `boolean` | `false` |
|
|
27
|
+
| `filterOptions` | custom filtering function | label, value, and keywords filter |
|
|
28
|
+
| `size` | `md`, `lg` | `lg` |
|
|
29
|
+
| `variant` | `default`, `soft` | `default` |
|
|
30
|
+
| `state` | `default`, `filled`, `error`, `disabled` | inferred |
|
|
31
|
+
| `dir` | `ltr`, `rtl`, `auto` | inherited |
|
|
32
|
+
|
|
33
|
+
## Composition Rules
|
|
34
|
+
|
|
35
|
+
- Use autocomplete for known option sets that benefit from search.
|
|
36
|
+
- Use `Select` when the option set is short and browsing is faster than typing.
|
|
37
|
+
- Use `selectionMode="multiple"` when selected options need removable chips; chips render with `Tag`.
|
|
38
|
+
- Keep async fetching, debouncing, and remote loading in product code by controlling `inputValue`, `open`, and `options`.
|
|
39
|
+
- Keep option labels concise. Use `addonText` for secondary metadata.
|
|
40
|
+
|
|
41
|
+
## Accessibility
|
|
42
|
+
|
|
43
|
+
- The input uses `role="combobox"`, `aria-autocomplete="list"`, `aria-expanded`, `aria-controls`, and `aria-activedescendant`.
|
|
44
|
+
- Results render as a `listbox` using Select menu rows.
|
|
45
|
+
- Arrow keys move the active option, `Enter` selects, `Escape` closes, and `Backspace` removes the last selected tag in multiple mode when the search field is empty.
|
|
46
|
+
- Labels and helper text are associated with the input, and error state maps to `aria-invalid`.
|
|
47
|
+
|
|
48
|
+
## Token Contract
|
|
49
|
+
|
|
50
|
+
Autocomplete consumes tokens through the primitives it composes:
|
|
51
|
+
|
|
52
|
+
- Field surface, typography, icon sizing, focus ring, and disabled/error states from `Input`.
|
|
53
|
+
- Menu surface, item rows, hover state, selected check, and item media slots from `Select`.
|
|
54
|
+
- Removable selected chips from `Tag`.
|
|
55
|
+
- Additional layout uses spacing, content, and z-index tokens only.
|
|
56
|
+
|
|
57
|
+
## Install
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx banhaten add autocomplete
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Examples
|
|
64
|
+
|
|
65
|
+
Primary registry example: `examples/autocomplete-demo.tsx`.
|
|
66
|
+
|
|
67
|
+
Open the live component page or run `npx banhaten docs autocomplete` to inspect source files, install command, and examples.
|
|
68
|
+
|
|
69
|
+
## RTL Rules
|
|
70
|
+
|
|
71
|
+
- `inheritsDirection`: true
|
|
72
|
+
- `composition`: Uses the existing Input field, Select menu and menu item rows, and Tag chips instead of introducing new visual primitives.
|
|
73
|
+
- `spacing`: Uses logical positioning, logical gaps, and inherited direction so the input, menu rows, checks, helper text, and selected tags mirror naturally.
|
|
74
|
+
- `textDirection`: Labels, option text, helper text, and tag labels use dir="auto" through the composed primitives.
|
|
75
|
+
|
|
76
76
|
<!-- registry-contract:start -->
|
|
77
77
|
## Registry Contract
|
|
78
78
|
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
# Avatar
|
|
2
|
-
|
|
3
|
-
Avatar represents people, accounts, teams, and system actors. It supports images, initials, icon fallback, circular or rounded forms, status dots, action overlays, stacked groups, group counts, size scale, and RTL-safe overlap.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Avatar name="Ahmed Galal" src="/avatars/avatar-01.jpg" status="available" />
|
|
9
|
-
|
|
10
|
-
<AvatarGroup>
|
|
11
|
-
<Avatar name="Nora" />
|
|
12
|
-
<Avatar name="Omar" />
|
|
13
|
-
<AvatarGroupCount>+4</AvatarGroupCount>
|
|
14
|
-
</AvatarGroup>
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
| Prop | Values |
|
|
18
|
-
| --- | --- |
|
|
19
|
-
| `size` | `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl` |
|
|
20
|
-
| `form` | `circular`, `rounded` |
|
|
21
|
-
| `status` | `offline`, `busy`, `blocked`, `available`, `away` |
|
|
22
|
-
| `action` | `custom`, `edit`, `verified`, `remove` |
|
|
23
|
-
|
|
24
|
-
## Token Contract
|
|
25
|
-
|
|
26
|
-
Avatar consumes Banhaten radius, sizing, border, shadow, status, background, and content tokens. The `md` and `lg` icon fallbacks use 18px glyphs in 20px slots; other avatar sizes keep their existing scale. Status and action markers should stay token-bound so themes and dark mode remain consistent.
|
|
27
|
-
|
|
28
|
-
## RTL
|
|
29
|
-
|
|
30
|
-
Avatar groups use logical negative margin so overlap reverses naturally in RTL. Status and action affordances use logical end placement.
|
|
31
|
-
|
|
32
|
-
## Accessibility
|
|
33
|
-
|
|
34
|
-
Use `name` or accessible image alt text for user avatars. Decorative grouped avatars can be hidden from assistive tech when the surrounding row already names the people.
|
|
35
|
-
|
|
36
|
-
## Install
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npx banhaten add avatar
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Examples
|
|
43
|
-
|
|
44
|
-
Primary registry example: `examples/avatar-demo.tsx`.
|
|
45
|
-
|
|
46
|
-
Open the live component page or run `npx banhaten docs avatar` to inspect source files, install command, and examples.
|
|
47
|
-
|
|
48
|
-
## RTL Rules
|
|
49
|
-
|
|
50
|
-
- `inheritsDirection`: true
|
|
51
|
-
- `groupOverlap`: Uses logical -ms spacing so overlap reverses naturally in RTL.
|
|
52
|
-
- `badgePlacement`: Status dots use logical end/bottom positioning; avatar actions use logical end/top positioning.
|
|
53
|
-
|
|
1
|
+
# Avatar
|
|
2
|
+
|
|
3
|
+
Avatar represents people, accounts, teams, and system actors. It supports images, initials, icon fallback, circular or rounded forms, status dots, action overlays, stacked groups, group counts, size scale, and RTL-safe overlap.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Avatar name="Ahmed Galal" src="/avatars/avatar-01.jpg" status="available" />
|
|
9
|
+
|
|
10
|
+
<AvatarGroup>
|
|
11
|
+
<Avatar name="Nora" />
|
|
12
|
+
<Avatar name="Omar" />
|
|
13
|
+
<AvatarGroupCount>+4</AvatarGroupCount>
|
|
14
|
+
</AvatarGroup>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Prop | Values |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `size` | `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl` |
|
|
20
|
+
| `form` | `circular`, `rounded` |
|
|
21
|
+
| `status` | `offline`, `busy`, `blocked`, `available`, `away` |
|
|
22
|
+
| `action` | `custom`, `edit`, `verified`, `remove` |
|
|
23
|
+
|
|
24
|
+
## Token Contract
|
|
25
|
+
|
|
26
|
+
Avatar consumes Banhaten radius, sizing, border, shadow, status, background, and content tokens. The `md` and `lg` icon fallbacks use 18px glyphs in 20px slots; other avatar sizes keep their existing scale. Status and action markers should stay token-bound so themes and dark mode remain consistent.
|
|
27
|
+
|
|
28
|
+
## RTL
|
|
29
|
+
|
|
30
|
+
Avatar groups use logical negative margin so overlap reverses naturally in RTL. Status and action affordances use logical end placement.
|
|
31
|
+
|
|
32
|
+
## Accessibility
|
|
33
|
+
|
|
34
|
+
Use `name` or accessible image alt text for user avatars. Decorative grouped avatars can be hidden from assistive tech when the surrounding row already names the people.
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx banhaten add avatar
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Examples
|
|
43
|
+
|
|
44
|
+
Primary registry example: `examples/avatar-demo.tsx`.
|
|
45
|
+
|
|
46
|
+
Open the live component page or run `npx banhaten docs avatar` to inspect source files, install command, and examples.
|
|
47
|
+
|
|
48
|
+
## RTL Rules
|
|
49
|
+
|
|
50
|
+
- `inheritsDirection`: true
|
|
51
|
+
- `groupOverlap`: Uses logical -ms spacing so overlap reverses naturally in RTL.
|
|
52
|
+
- `badgePlacement`: Status dots use logical end/bottom positioning; avatar actions use logical end/top positioning.
|
|
53
|
+
|
|
54
54
|
<!-- registry-contract:start -->
|
|
55
55
|
## Registry Contract
|
|
56
56
|
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
# Badge
|
|
2
|
-
|
|
3
|
-
Badge is a compact status, count, classification, or metadata primitive. It supports light, outline, and solid styles; semantic color families; dot, flag, leading icon, trailing icon, numeric, and split-action compositions; and RTL-safe layout.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Badge color="green">Active</Badge>
|
|
9
|
-
<Badge color="blue" type="dot">New</Badge>
|
|
10
|
-
<Badge color="neutral" type="trailing-icon" splitAction>
|
|
11
|
-
Filter
|
|
12
|
-
</Badge>
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
| Prop | Values | Default |
|
|
16
|
-
| --- | --- | --- |
|
|
17
|
-
| `style` | `light`, `outline`, `solid` | `light` |
|
|
18
|
-
| `color` | `neutral`, `blue`, `green`, `amber`, `danger`, `purple`, `fuchsia`, `rose`, `sky`, `golden` | `neutral` |
|
|
19
|
-
| `type` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` | `default` |
|
|
20
|
-
| `size` | `sm`, `lg` | `sm` |
|
|
21
|
-
| `splitAction` | `boolean` | `false` |
|
|
22
|
-
|
|
23
|
-
## Token Contract
|
|
24
|
-
|
|
25
|
-
Badge uses semantic content, background, border, radius, typography, icon, opacity, and focus tokens. Provider or brand colors should be added through semantic aliases, not raw literals.
|
|
26
|
-
|
|
27
|
-
## RTL
|
|
28
|
-
|
|
29
|
-
Use `data-icon="inline-start"` or `data-icon="inline-end"` on icons. Directional arrows should also set `data-rtl-flip="true"`.
|
|
30
|
-
|
|
31
|
-
## Accessibility
|
|
32
|
-
|
|
33
|
-
Badges are usually descriptive text. Do not use color alone for critical status; include a readable label such as `Failed`, `Warning`, or `Active`.
|
|
34
|
-
|
|
35
|
-
## Install
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
npx banhaten add badge
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Examples
|
|
42
|
-
|
|
43
|
-
Primary registry example: `examples/badge-demo.tsx`.
|
|
44
|
-
|
|
45
|
-
Open the live component page or run `npx banhaten docs badge` to inspect source files, install command, and examples.
|
|
46
|
-
|
|
47
|
-
## RTL Rules
|
|
48
|
-
|
|
49
|
-
- `inheritsDirection`: true
|
|
50
|
-
- `iconPlacement`: Set type="leading-icon" or type="trailing-icon" and use data-icon="inline-start" or data-icon="inline-end". Add splitAction to give a trailing icon its own token-sized compartment.
|
|
51
|
-
- `directionalIconFlip`: Use data-rtl-flip="true" on arrows that should mirror.
|
|
52
|
-
- `textDirection`: Uses dir="auto" by default for short Arabic and English labels.
|
|
53
|
-
- `legacyVariants`: The previous variant prop is still accepted as a compatibility shim.
|
|
54
|
-
|
|
1
|
+
# Badge
|
|
2
|
+
|
|
3
|
+
Badge is a compact status, count, classification, or metadata primitive. It supports light, outline, and solid styles; semantic color families; dot, flag, leading icon, trailing icon, numeric, and split-action compositions; and RTL-safe layout.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Badge color="green">Active</Badge>
|
|
9
|
+
<Badge color="blue" type="dot">New</Badge>
|
|
10
|
+
<Badge color="neutral" type="trailing-icon" splitAction>
|
|
11
|
+
Filter
|
|
12
|
+
</Badge>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Prop | Values | Default |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `style` | `light`, `outline`, `solid` | `light` |
|
|
18
|
+
| `color` | `neutral`, `blue`, `green`, `amber`, `danger`, `purple`, `fuchsia`, `rose`, `sky`, `golden` | `neutral` |
|
|
19
|
+
| `type` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` | `default` |
|
|
20
|
+
| `size` | `sm`, `lg` | `sm` |
|
|
21
|
+
| `splitAction` | `boolean` | `false` |
|
|
22
|
+
|
|
23
|
+
## Token Contract
|
|
24
|
+
|
|
25
|
+
Badge uses semantic content, background, border, radius, typography, icon, opacity, and focus tokens. Provider or brand colors should be added through semantic aliases, not raw literals.
|
|
26
|
+
|
|
27
|
+
## RTL
|
|
28
|
+
|
|
29
|
+
Use `data-icon="inline-start"` or `data-icon="inline-end"` on icons. Directional arrows should also set `data-rtl-flip="true"`.
|
|
30
|
+
|
|
31
|
+
## Accessibility
|
|
32
|
+
|
|
33
|
+
Badges are usually descriptive text. Do not use color alone for critical status; include a readable label such as `Failed`, `Warning`, or `Active`.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx banhaten add badge
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Examples
|
|
42
|
+
|
|
43
|
+
Primary registry example: `examples/badge-demo.tsx`.
|
|
44
|
+
|
|
45
|
+
Open the live component page or run `npx banhaten docs badge` to inspect source files, install command, and examples.
|
|
46
|
+
|
|
47
|
+
## RTL Rules
|
|
48
|
+
|
|
49
|
+
- `inheritsDirection`: true
|
|
50
|
+
- `iconPlacement`: Set type="leading-icon" or type="trailing-icon" and use data-icon="inline-start" or data-icon="inline-end". Add splitAction to give a trailing icon its own token-sized compartment.
|
|
51
|
+
- `directionalIconFlip`: Use data-rtl-flip="true" on arrows that should mirror.
|
|
52
|
+
- `textDirection`: Uses dir="auto" by default for short Arabic and English labels.
|
|
53
|
+
- `legacyVariants`: The previous variant prop is still accepted as a compatibility shim.
|
|
54
|
+
|
|
55
55
|
<!-- registry-contract:start -->
|
|
56
56
|
## Registry Contract
|
|
57
57
|
|
|
@@ -67,6 +67,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
67
67
|
| `options` | `splitAction` |
|
|
68
68
|
| `sizes` | `sm`, `lg` |
|
|
69
69
|
| `styles` | `light`, `outline`, `solid` |
|
|
70
|
-
| `tokens` | `--bh-badge-focus-ring-width`, `--bh-badge-outline-border-width`, `--bh-bg-accent-amber-default`, `--bh-bg-accent-amber-subtle`, `--bh-bg-accent-blue-bold`, `--bh-bg-accent-blue-subtle`, `--bh-bg-accent-fuchsia-default`, `--bh-bg-accent-fuchsia-subtle`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-golden-subtle`, `--bh-bg-accent-green-default`, `--bh-bg-accent-green-subtle`, `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-red-default`, `--bh-bg-accent-red-subtle`, `--bh-bg-accent-rose-bold`, `--bh-bg-accent-rose-subtle`, `--bh-bg-accent-sky-base`, `--bh-bg-accent-sky-subtle`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-subtle`, `--bh-border-accent-amber-strong`, `--bh-border-accent-amber-subtle`, `--bh-border-accent-blue-strong`, `--bh-border-accent-blue-subtle`, `--bh-border-accent-fuchsia-strong`, `--bh-border-accent-fuchsia-subtle`, `--bh-border-accent-golden-strong`, `--bh-border-accent-golden-subtle`, `--bh-border-accent-green-strong`, `--bh-border-accent-green-subtle`, `--bh-border-accent-purple-strong`, `--bh-border-accent-purple-subtle`, `--bh-border-accent-red-strong`, `--bh-border-accent-red-subtle`, `--bh-border-accent-rose-strong`, `--bh-border-accent-rose-subtle`, `--bh-border-accent-sky-strong`, `--bh-border-accent-sky-subtle`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-focus-danger`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-content-accent-amber-default`, `--bh-content-accent-amber-strong`, `--bh-content-accent-blue-default`, `--bh-content-accent-blue-strong`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-fuchsia-strong`, `--bh-content-accent-golden-default`, `--bh-content-accent-golden-strong`, `--bh-content-accent-green-default`, `--bh-content-accent-green-strong`, `--bh-content-accent-purple-default`, `--bh-content-accent-purple-strong`, `--bh-content-accent-red-default`, `--bh-content-accent-red-strong`, `--bh-content-accent-rose-default`, `--bh-content-accent-rose-strong`, `--bh-content-accent-sky-default`, `--bh-content-accent-sky-strong`, `--bh-content-default`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-on-color`, `--bh-content-on-light`, `--bh-content-on-neutral`, `--bh-interactive-ghost-default`, `--bh-opacity-35`, `--bh-radius-full`, `--bh-radius-xs-2`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--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-semibold-font-weight`, `--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-3xs-semibold-font-weight` |
|
|
70
|
+
| `tokens` | `--bh-badge-focus-ring-width`, `--bh-badge-outline-border-width`, `--bh-bg-accent-amber-default`, `--bh-bg-accent-amber-subtle`, `--bh-bg-accent-blue-bold`, `--bh-bg-accent-blue-subtle`, `--bh-bg-accent-fuchsia-default`, `--bh-bg-accent-fuchsia-subtle`, `--bh-bg-accent-golden-default`, `--bh-bg-accent-golden-subtle`, `--bh-bg-accent-green-default`, `--bh-bg-accent-green-subtle`, `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-red-default`, `--bh-bg-accent-red-subtle`, `--bh-bg-accent-rose-bold`, `--bh-bg-accent-rose-subtle`, `--bh-bg-accent-sky-base`, `--bh-bg-accent-sky-subtle`, `--bh-bg-neutral-bold`, `--bh-bg-neutral-subtle`, `--bh-border-accent-amber-strong`, `--bh-border-accent-amber-subtle`, `--bh-border-accent-blue-strong`, `--bh-border-accent-blue-subtle`, `--bh-border-accent-fuchsia-strong`, `--bh-border-accent-fuchsia-subtle`, `--bh-border-accent-golden-strong`, `--bh-border-accent-golden-subtle`, `--bh-border-accent-green-strong`, `--bh-border-accent-green-subtle`, `--bh-border-accent-purple-strong`, `--bh-border-accent-purple-subtle`, `--bh-border-accent-red-strong`, `--bh-border-accent-red-subtle`, `--bh-border-accent-rose-strong`, `--bh-border-accent-rose-subtle`, `--bh-border-accent-sky-strong`, `--bh-border-accent-sky-subtle`, `--bh-border-default`, `--bh-border-focus`, `--bh-border-focus-danger`, `--bh-border-strong`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-accent-amber-default`, `--bh-content-accent-amber-strong`, `--bh-content-accent-blue-default`, `--bh-content-accent-blue-strong`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-fuchsia-strong`, `--bh-content-accent-golden-default`, `--bh-content-accent-golden-strong`, `--bh-content-accent-green-default`, `--bh-content-accent-green-strong`, `--bh-content-accent-purple-default`, `--bh-content-accent-purple-strong`, `--bh-content-accent-red-default`, `--bh-content-accent-red-strong`, `--bh-content-accent-rose-default`, `--bh-content-accent-rose-strong`, `--bh-content-accent-sky-default`, `--bh-content-accent-sky-strong`, `--bh-content-default`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-on-color`, `--bh-content-on-light`, `--bh-content-on-neutral`, `--bh-interactive-ghost-default`, `--bh-opacity-35`, `--bh-radius-full`, `--bh-radius-xs-2`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-md-8`, `--bh-space-none`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--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-semibold-font-weight`, `--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-3xs-semibold-font-weight` |
|
|
71
71
|
| `types` | `default`, `leading-icon`, `trailing-icon`, `dot`, `flag` |
|
|
72
72
|
<!-- registry-contract:end -->
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
# Banner
|
|
2
|
-
|
|
3
|
-
`Banner` presents short product announcements, notices, or lightweight calls to action.
|
|
4
|
-
|
|
5
|
-
Figma reference: `Design system 3.0 Copy / Banner`, node `237:39513`.
|
|
6
|
-
|
|
7
|
-
## Variants
|
|
8
|
-
|
|
9
|
-
The implementation covers the Banner matrix from Figma:
|
|
10
|
-
|
|
11
|
-
| Prop | Values |
|
|
12
|
-
| --- | --- |
|
|
13
|
-
| `type` | `slim`, `single-action-inline`, `single-action`, `input` |
|
|
14
|
-
| `size` | `floating`, `full-width` |
|
|
15
|
-
| `content` | `title`, `title-description` |
|
|
16
|
-
| `color` | `brand`, `grey`, `brand-light` |
|
|
17
|
-
| `dir` | `ltr`, `rtl` |
|
|
18
|
-
|
|
19
|
-
## API
|
|
20
|
-
|
|
21
|
-
```tsx
|
|
22
|
-
<Banner
|
|
23
|
-
type="single-action"
|
|
24
|
-
size="floating"
|
|
25
|
-
content="title"
|
|
26
|
-
color="brand"
|
|
27
|
-
dir="ltr"
|
|
28
|
-
/>
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
| Prop | Default |
|
|
32
|
-
| --- | --- |
|
|
33
|
-
| `title` | localized demo title |
|
|
34
|
-
| `description` | localized demo description |
|
|
35
|
-
| `linkLabel` | `Link button` |
|
|
36
|
-
| `actionLabel` | `Button` |
|
|
37
|
-
| `inputPlaceholder` | `Placeholder` |
|
|
38
|
-
| `showIcon` | `true` |
|
|
39
|
-
| `showInlineAction` | `true` |
|
|
40
|
-
| `onAction` | none |
|
|
41
|
-
| `onClose` | none |
|
|
42
|
-
|
|
43
|
-
## Pixel Rules
|
|
44
|
-
|
|
45
|
-
- Root padding is `12px 16px`.
|
|
46
|
-
- Slim title rows are `48px`; slim title-description rows are `52px`.
|
|
47
|
-
- Single-action, inline-action, and input rows are `60px`.
|
|
48
|
-
- Floating rows use `10px` radius; full-width rows have square edges.
|
|
49
|
-
- The leading glyph is `18px` in a `20px` slot; the close glyph remains `16px`.
|
|
50
|
-
- Action controls and text inputs are `36px` tall with `8px` radius.
|
|
51
|
-
- LTR body text uses `15px / 24px`. RTL title-only body text uses `12px / 16px`.
|
|
52
|
-
- Title-description content uses a semibold title, a `17px / 28px` separator dot, and regular description text.
|
|
53
|
-
|
|
54
|
-
## Token Contract
|
|
55
|
-
|
|
56
|
-
The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
|
|
57
|
-
|
|
58
|
-
- Backgrounds: `--bh-bg-brand-default`, `--bh-bg-brand-soft`, `--bh-bg-muted`, `--bh-bg-always-white`
|
|
59
|
-
- Content: `--bh-content-default`, `--bh-content-inverse`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-subtle`
|
|
60
|
-
- Borders: `--bh-border-subtle`, `--bh-border-input`
|
|
61
|
-
- Shape: `--bh-control-default`, `--bh-radius-lg-8`, `--bh-radius-xl-10`
|
|
62
|
-
- Space: `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`, `--bh-space-3xl-16`
|
|
63
|
-
|
|
64
|
-
## Accessibility
|
|
65
|
-
|
|
66
|
-
- The banner root exposes an `aria-label`.
|
|
67
|
-
- Link, action, and close affordances are real buttons.
|
|
68
|
-
- The input variant uses a real text input with an `aria-label`.
|
|
69
|
-
- RTL is controlled through `dir="rtl"` so icon, text, action, input, and close placement mirror logically.
|
|
70
|
-
|
|
71
|
-
## Install
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
npx banhaten add banner
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Examples
|
|
78
|
-
|
|
79
|
-
Primary registry example: `examples/expanded/banner-demo.tsx`.
|
|
80
|
-
|
|
81
|
-
Open the live component page or run `npx banhaten docs banner` to inspect source files, install command, and examples.
|
|
82
|
-
|
|
83
|
-
## RTL Rules
|
|
84
|
-
|
|
85
|
-
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
86
|
-
|
|
1
|
+
# Banner
|
|
2
|
+
|
|
3
|
+
`Banner` presents short product announcements, notices, or lightweight calls to action.
|
|
4
|
+
|
|
5
|
+
Figma reference: `Design system 3.0 Copy / Banner`, node `237:39513`.
|
|
6
|
+
|
|
7
|
+
## Variants
|
|
8
|
+
|
|
9
|
+
The implementation covers the Banner matrix from Figma:
|
|
10
|
+
|
|
11
|
+
| Prop | Values |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `type` | `slim`, `single-action-inline`, `single-action`, `input` |
|
|
14
|
+
| `size` | `floating`, `full-width` |
|
|
15
|
+
| `content` | `title`, `title-description` |
|
|
16
|
+
| `color` | `brand`, `grey`, `brand-light` |
|
|
17
|
+
| `dir` | `ltr`, `rtl` |
|
|
18
|
+
|
|
19
|
+
## API
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
<Banner
|
|
23
|
+
type="single-action"
|
|
24
|
+
size="floating"
|
|
25
|
+
content="title"
|
|
26
|
+
color="brand"
|
|
27
|
+
dir="ltr"
|
|
28
|
+
/>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Prop | Default |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `title` | localized demo title |
|
|
34
|
+
| `description` | localized demo description |
|
|
35
|
+
| `linkLabel` | `Link button` |
|
|
36
|
+
| `actionLabel` | `Button` |
|
|
37
|
+
| `inputPlaceholder` | `Placeholder` |
|
|
38
|
+
| `showIcon` | `true` |
|
|
39
|
+
| `showInlineAction` | `true` |
|
|
40
|
+
| `onAction` | none |
|
|
41
|
+
| `onClose` | none |
|
|
42
|
+
|
|
43
|
+
## Pixel Rules
|
|
44
|
+
|
|
45
|
+
- Root padding is `12px 16px`.
|
|
46
|
+
- Slim title rows are `48px`; slim title-description rows are `52px`.
|
|
47
|
+
- Single-action, inline-action, and input rows are `60px`.
|
|
48
|
+
- Floating rows use `10px` radius; full-width rows have square edges.
|
|
49
|
+
- The leading glyph is `18px` in a `20px` slot; the close glyph remains `16px`.
|
|
50
|
+
- Action controls and text inputs are `36px` tall with `8px` radius.
|
|
51
|
+
- LTR body text uses `15px / 24px`. RTL title-only body text uses `12px / 16px`.
|
|
52
|
+
- Title-description content uses a semibold title, a `17px / 28px` separator dot, and regular description text.
|
|
53
|
+
|
|
54
|
+
## Token Contract
|
|
55
|
+
|
|
56
|
+
The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
|
|
57
|
+
|
|
58
|
+
- Backgrounds: `--bh-bg-brand-default`, `--bh-bg-brand-soft`, `--bh-bg-muted`, `--bh-bg-always-white`
|
|
59
|
+
- Content: `--bh-content-default`, `--bh-content-inverse`, `--bh-content-link`, `--bh-content-muted`, `--bh-content-subtle`
|
|
60
|
+
- Borders: `--bh-border-subtle`, `--bh-border-input`
|
|
61
|
+
- Shape: `--bh-control-default`, `--bh-radius-lg-8`, `--bh-radius-xl-10`
|
|
62
|
+
- Space: `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`, `--bh-space-3xl-16`
|
|
63
|
+
|
|
64
|
+
## Accessibility
|
|
65
|
+
|
|
66
|
+
- The banner root exposes an `aria-label`.
|
|
67
|
+
- Link, action, and close affordances are real buttons.
|
|
68
|
+
- The input variant uses a real text input with an `aria-label`.
|
|
69
|
+
- RTL is controlled through `dir="rtl"` so icon, text, action, input, and close placement mirror logically.
|
|
70
|
+
|
|
71
|
+
## Install
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npx banhaten add banner
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Examples
|
|
78
|
+
|
|
79
|
+
Primary registry example: `examples/expanded/banner-demo.tsx`.
|
|
80
|
+
|
|
81
|
+
Open the live component page or run `npx banhaten docs banner` to inspect source files, install command, and examples.
|
|
82
|
+
|
|
83
|
+
## RTL Rules
|
|
84
|
+
|
|
85
|
+
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
86
|
+
|
|
87
87
|
<!-- registry-contract:start -->
|
|
88
88
|
## Registry Contract
|
|
89
89
|
|