banhaten 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +139 -73
- package/CONTRIBUTING.md +46 -44
- package/README.md +192 -190
- package/SECURITY.md +15 -15
- package/banhaten.config.example.json +11 -11
- package/docs/design-spacing.md +13 -0
- package/docs/design-system/README.md +22 -20
- 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 -244
- package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
- 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 +90 -76
- package/docs/design-system/components/accordion.md +53 -53
- package/docs/design-system/components/activity-feed.md +94 -94
- package/docs/design-system/components/activity-heatmap.md +57 -57
- package/docs/design-system/components/agent-input.md +85 -0
- package/docs/design-system/components/alert-dialog.md +72 -72
- package/docs/design-system/components/alert.md +98 -98
- package/docs/design-system/components/approval-card.md +134 -0
- package/docs/design-system/components/aspect-ratio.md +45 -45
- package/docs/design-system/components/attribute.md +89 -89
- package/docs/design-system/components/autocomplete.md +75 -75
- package/docs/design-system/components/avatar.md +54 -54
- package/docs/design-system/components/badge.md +54 -54
- package/docs/design-system/components/banner.md +87 -87
- package/docs/design-system/components/breadcrumbs.md +177 -176
- package/docs/design-system/components/button-group.md +98 -98
- package/docs/design-system/components/button.md +83 -80
- package/docs/design-system/components/card.md +88 -88
- package/docs/design-system/components/carousel.md +46 -46
- package/docs/design-system/components/catalog-components.md +47 -47
- package/docs/design-system/components/chart.md +95 -24
- package/docs/design-system/components/checkbox.md +54 -54
- package/docs/design-system/components/collapsible.md +67 -53
- package/docs/design-system/components/command.md +62 -62
- package/docs/design-system/components/context-menu.md +46 -46
- package/docs/design-system/components/date-picker.md +81 -79
- 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 +187 -187
- package/docs/design-system/components/hover-card.md +48 -48
- package/docs/design-system/components/icons.md +48 -48
- package/docs/design-system/components/inline-citations.md +93 -0
- package/docs/design-system/components/input-group.md +58 -58
- package/docs/design-system/components/input-otp.md +56 -56
- package/docs/design-system/components/input.md +117 -61
- package/docs/design-system/components/item.md +59 -57
- package/docs/design-system/components/kbd.md +54 -49
- package/docs/design-system/components/label.md +49 -49
- package/docs/design-system/components/menu.md +71 -61
- package/docs/design-system/components/menubar.md +47 -47
- package/docs/design-system/components/modal.md +105 -105
- package/docs/design-system/components/native-select.md +54 -54
- package/docs/design-system/components/navigation-menu.md +50 -50
- package/docs/design-system/components/onboarding-step-list-item.md +82 -82
- package/docs/design-system/components/page-header.md +93 -86
- package/docs/design-system/components/pagination.md +57 -57
- package/docs/design-system/components/popover.md +60 -60
- package/docs/design-system/components/progress-slider.md +50 -50
- package/docs/design-system/components/progress.md +76 -76
- package/docs/design-system/components/radio-card.md +51 -51
- package/docs/design-system/components/radio-group.md +57 -57
- package/docs/design-system/components/resizable.md +44 -44
- package/docs/design-system/components/rolling-count.md +61 -0
- package/docs/design-system/components/scroll-area.md +51 -51
- package/docs/design-system/components/segmented-control.md +54 -54
- package/docs/design-system/components/select.md +68 -62
- package/docs/design-system/components/sheet.md +67 -67
- package/docs/design-system/components/shimmer-text.md +67 -0
- package/docs/design-system/components/sidebar.md +127 -76
- package/docs/design-system/components/skeleton.md +75 -75
- package/docs/design-system/components/slideout.md +65 -65
- package/docs/design-system/components/slider.md +63 -63
- package/docs/design-system/components/social-button.md +50 -50
- package/docs/design-system/components/spinner.md +62 -62
- package/docs/design-system/components/steps.md +65 -65
- package/docs/design-system/components/streaming-text.md +82 -0
- package/docs/design-system/components/table.md +419 -414
- package/docs/design-system/components/tabs.md +59 -55
- package/docs/design-system/components/tag.md +80 -80
- package/docs/design-system/components/task-list.md +95 -0
- package/docs/design-system/components/textarea.md +50 -50
- package/docs/design-system/components/thinking-reasoning.md +72 -0
- package/docs/design-system/components/thinking-state.md +67 -0
- package/docs/design-system/components/timeline.md +83 -83
- package/docs/design-system/components/toast.md +58 -58
- package/docs/design-system/components/toggle.md +81 -81
- package/docs/design-system/components/toolbar.md +92 -87
- package/docs/design-system/components/tooltip.md +94 -92
- package/docs/design-system/components/typography.md +18 -18
- package/docs/design-system/density-and-elevation.md +65 -61
- 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 -69
- package/docs/design-system/installation.md +70 -68
- 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 -53
- package/docs/design-system/template-gap-audit.md +32 -0
- package/docs/design-system/templates.md +59 -0
- package/docs/design-system/token-governance.md +72 -60
- package/package.json +98 -98
- package/registry/component-contract.json +40 -40
- package/registry/components/accordion.tsx +155 -155
- package/registry/components/agent-input-parts.tsx +552 -0
- package/registry/components/agent-input-state.ts +156 -0
- package/registry/components/agent-input.css +307 -0
- package/registry/components/agent-input.tsx +382 -0
- package/registry/components/alert-dialog.tsx +297 -297
- package/registry/components/alert.tsx +293 -293
- package/registry/components/approval-card.css +409 -0
- package/registry/components/approval-card.tsx +401 -0
- package/registry/components/approval-frame.tsx +108 -0
- package/registry/components/approval-questions.tsx +559 -0
- package/registry/components/aspect-ratio.tsx +30 -30
- package/registry/components/attribute.tsx +454 -448
- package/registry/components/autocomplete.tsx +598 -651
- package/registry/components/avatar.tsx +385 -381
- package/registry/components/badge.tsx +629 -629
- package/registry/components/button-group.tsx +565 -565
- package/registry/components/button.tsx +127 -123
- package/registry/components/card.tsx +638 -638
- package/registry/components/carousel.tsx +296 -296
- package/registry/components/chart-block-data.ts +177 -0
- package/registry/components/chart-block.css +171 -0
- package/registry/components/chart-block.tsx +260 -0
- package/registry/components/chart-interactions.ts +123 -0
- package/registry/components/chart-options.cartesian.ts +162 -0
- package/registry/components/chart-options.paint.ts +99 -0
- package/registry/components/chart-options.parts.ts +72 -0
- package/registry/components/chart-options.radial.ts +109 -0
- package/registry/components/chart-options.ts +44 -0
- package/registry/components/chart-options.types.ts +67 -0
- package/registry/components/chart.tsx +203 -203
- package/registry/components/checkbox.tsx +247 -247
- package/registry/components/collapsible.tsx +109 -69
- package/registry/components/command.tsx +208 -208
- package/registry/components/context-menu.tsx +236 -236
- package/registry/components/data-chart.tsx +40 -0
- package/registry/components/date-picker.tsx +1289 -1277
- package/registry/components/echart-theme.ts +246 -0
- package/registry/components/echart.css +49 -0
- package/registry/components/echart.tsx +178 -0
- 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 +131 -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 -59
- package/registry/components/expanded/PageHeader.tsx +179 -166
- package/registry/components/expanded/Slideout.tsx +108 -108
- package/registry/components/expanded/Steps.tsx +402 -402
- package/registry/components/expanded/Table.tsx +1092 -1071
- 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 -255
- package/registry/components/expanded/breadcrumbs.css +140 -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 -126
- package/registry/components/expanded/pageHeader.css +248 -290
- package/registry/components/expanded/slideout.css +276 -276
- package/registry/components/expanded/steps.css +356 -356
- package/registry/components/expanded/table.css +606 -603
- 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/inline-citations.css +126 -0
- package/registry/components/inline-citations.tsx +292 -0
- 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 +990 -972
- package/registry/components/item.tsx +189 -189
- package/registry/components/kbd.tsx +246 -151
- package/registry/components/label.tsx +78 -78
- package/registry/components/menu.tsx +978 -986
- 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 -555
- package/registry/components/popover.tsx +338 -338
- package/registry/components/progress-slider.tsx +216 -216
- package/registry/components/radio-card.tsx +676 -677
- package/registry/components/radio-group.tsx +570 -570
- package/registry/components/resizable.tsx +108 -108
- package/registry/components/rolling-count.css +37 -0
- package/registry/components/rolling-count.tsx +110 -0
- 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 -932
- package/registry/components/sheet.tsx +305 -305
- package/registry/components/shimmer-text.css +69 -0
- package/registry/components/shimmer-text.tsx +43 -0
- package/registry/components/sidebar.tsx +1433 -358
- 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/streaming-text.css +45 -0
- package/registry/components/streaming-text.tsx +165 -0
- package/registry/components/table-elements.tsx +128 -128
- package/registry/components/tabs.css +222 -218
- package/registry/components/tabs.tsx +241 -241
- package/registry/components/tag.tsx +423 -423
- package/registry/components/task-list.css +328 -0
- package/registry/components/task-list.tsx +429 -0
- package/registry/components/textarea.tsx +610 -610
- package/registry/components/thinking-reasoning.css +178 -0
- package/registry/components/thinking-reasoning.tsx +253 -0
- package/registry/components/thinking-state.css +8 -0
- package/registry/components/thinking-state.tsx +46 -0
- 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 -431
- package/registry/examples/agent-input-demo.tsx +90 -0
- package/registry/examples/alert-demo.tsx +34 -34
- package/registry/examples/alert-dialog-demo.tsx +42 -42
- package/registry/examples/approval-card-demo.tsx +83 -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 -83
- 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-block-demo.tsx +5 -0
- package/registry/examples/chart-demo.tsx +18 -33
- 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 -236
- package/registry/examples/context-menu-demo.tsx +29 -29
- package/registry/examples/control-density-contract-demo.tsx +65 -61
- 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/inline-citations-demo.tsx +31 -0
- package/registry/examples/input-actions-demo.tsx +36 -0
- 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 -11
- 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 -546
- 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/rolling-count-demo.tsx +39 -0
- 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/shimmer-text-demo.tsx +20 -0
- package/registry/examples/sidebar-demo.tsx +101 -57
- 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/streaming-text-demo.tsx +28 -0
- package/registry/examples/tabs-demo.tsx +13 -13
- package/registry/examples/tag-demo.tsx +29 -29
- package/registry/examples/task-list-demo.tsx +74 -0
- package/registry/examples/textarea-demo.tsx +79 -79
- package/registry/examples/thinking-reasoning-demo.tsx +74 -0
- package/registry/examples/thinking-state-demo.tsx +13 -0
- 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/guidance/charts.LICENSE.txt +24 -0
- package/registry/hooks/use-controllable-state.ts +33 -0
- package/registry/hooks/use-direction.ts +207 -207
- package/registry/hooks/use-listbox-navigation.ts +73 -0
- package/registry/hooks/use-motion-end.ts +55 -0
- package/registry/hooks/use-reduced-motion.ts +28 -0
- package/registry/index.json +1634 -184
- package/registry/styles/globals.css +1462 -1570
- package/registry.json +364 -10
- package/schema/config.schema.json +51 -51
- package/schema/registry.schema.json +194 -190
- package/schema/tokens.schema.json +167 -163
- 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 -295
- package/src/cli/global-css.js +153 -153
- package/src/cli/index.js +1002 -1009
- 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 +458 -224
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Thinking State
|
|
2
|
+
|
|
3
|
+
`ThinkingState` is the smallest AI status surface: a shimmering label that tells the user the agent is working before its first token arrives. The shimmer comes from [Shimmer Text](./shimmer-text.md), so labels, active task rows, and enhancing prompts all move the same way.
|
|
4
|
+
|
|
5
|
+
Use Thinking State for the pre-response beat in a conversation. Use Thinking Reasoning when the agent exposes intermediate reasoning, and Spinner for ordinary non-AI loading.
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { ThinkingState } from "@/components/ui/thinking-state"
|
|
11
|
+
|
|
12
|
+
<ThinkingState />
|
|
13
|
+
<ThinkingState status="done">Thought</ThinkingState>
|
|
14
|
+
<ThinkingState>جارٍ التفكير</ThinkingState>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`ThinkingState` renders a polite live region with `role="status"`. Its `status` prop matches Thinking Reasoning's, so one flag drives both.
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| --- | --- | --- | --- |
|
|
21
|
+
| `status` | `"thinking" \| "done"` | `"thinking"` | Thinking runs the brightness sweep; done leaves the label as static text. |
|
|
22
|
+
| `tone` | `"subtle" \| "default"` | `"subtle"` | Secondary or primary text color pair for the sweep. |
|
|
23
|
+
| `children` | `React.ReactNode` | `"Thinking"` | Localized label text. |
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx banhaten add thinking-state
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
Primary registry example: `examples/thinking-state-demo.tsx`.
|
|
34
|
+
|
|
35
|
+
## Token Contract
|
|
36
|
+
|
|
37
|
+
Typography uses the `body-xs-medium` scale in `--bh-content-subtle`. The shimmer colors and sweep come from the `shimmer-text` registry dependency.
|
|
38
|
+
|
|
39
|
+
Covered source files: `components/thinking-state.tsx`, `components/thinking-state.css`, and the `shimmer-text` registry dependency.
|
|
40
|
+
|
|
41
|
+
## RTL Rules
|
|
42
|
+
|
|
43
|
+
- The label inherits document direction.
|
|
44
|
+
- The shine sweeps from the reading start to the reading end, so RTL text uses mirrored keyframes automatically.
|
|
45
|
+
|
|
46
|
+
## Accessibility
|
|
47
|
+
|
|
48
|
+
`ThinkingState` announces once through `aria-live="polite"`. The shimmer is purely decorative: under `prefers-reduced-motion` it renders as static text in the base color with no gradient.
|
|
49
|
+
|
|
50
|
+
<!-- registry-contract:start -->
|
|
51
|
+
## Registry Contract
|
|
52
|
+
|
|
53
|
+
This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
|
|
54
|
+
`supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
|
|
55
|
+
|
|
56
|
+
| Field | Values |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `supportedExports` | `components/thinking-state.tsx: ThinkingState` |
|
|
59
|
+
| `parts` | `ThinkingState` |
|
|
60
|
+
| `registryDependencies` | `shimmer-text` |
|
|
61
|
+
| `props.status` | `"thinking" \| "done"; default "thinking"; Thinking runs the brightness sweep; done leaves the label as static text.` |
|
|
62
|
+
| `props.tone` | `"subtle" \| "default"; default "subtle"; Secondary or primary text color pair for the sweep.` |
|
|
63
|
+
| `props.children` | `React.ReactNode; default "\"Thinking\""; Localized label text.` |
|
|
64
|
+
| `states` | `thinking`, `done` |
|
|
65
|
+
| `tokens` | `--bh-content-subtle`, `--bh-font-family`, `--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` |
|
|
66
|
+
| `tones` | `subtle`, `default` |
|
|
67
|
+
<!-- registry-contract:end -->
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
# Timeline
|
|
2
|
-
|
|
3
|
-
Timelines show ordered progress or dated events. Use `Timeline` for a complete sequence and `TimelineItem` when a consumer needs to compose a custom layout.
|
|
4
|
-
|
|
5
|
-
Figma references:
|
|
6
|
-
|
|
7
|
-
- `TimelineVetical`, node `572:6768`
|
|
8
|
-
- `TimeLineHorizontal`, node `584:4501`
|
|
9
|
-
- `TimelineVerticalItem`, node `572:6444`
|
|
10
|
-
- `TimelineHorizontalItem`, node `582:4214`
|
|
11
|
-
|
|
12
|
-
## Variants
|
|
13
|
-
|
|
14
|
-
| Prop | Values |
|
|
15
|
-
| --- | --- |
|
|
16
|
-
| `orientation` | `vertical`, `horizontal` |
|
|
17
|
-
| `variant` | `default`, `icon` |
|
|
18
|
-
| `state` | `finished`, `active`, `inactive` |
|
|
19
|
-
| `dir` | `ltr`, `rtl` |
|
|
20
|
-
|
|
21
|
-
The Figma source includes vertical timelines with seven steps and horizontal timelines with six steps. Code accepts any `steps` array.
|
|
22
|
-
|
|
23
|
-
## API
|
|
24
|
-
|
|
25
|
-
```tsx
|
|
26
|
-
<Timeline
|
|
27
|
-
orientation="vertical"
|
|
28
|
-
variant="default"
|
|
29
|
-
dir="ltr"
|
|
30
|
-
steps={[
|
|
31
|
-
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "finished" },
|
|
32
|
-
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "active" },
|
|
33
|
-
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "inactive" },
|
|
34
|
-
]}
|
|
35
|
-
/>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`TimelineStep` supports `label`, `caption`, `date`, `topDate`, `bottomDate`, `state`, `icon`, and visibility flags for leading/top/bottom dates, caption, connector line, and bottom padding.
|
|
39
|
-
|
|
40
|
-
## Token Contract
|
|
41
|
-
|
|
42
|
-
- `--bg-brand-default`: filled icon marker
|
|
43
|
-
- `--bg-default`: default marker center
|
|
44
|
-
- `--bg-muted`: inactive icon marker
|
|
45
|
-
- `--border-brand-strong`: finished connector line
|
|
46
|
-
- `--border-default`: active and inactive connector line
|
|
47
|
-
- `--content-default`: labels and inactive check
|
|
48
|
-
- `--content-subtle`: dates and captions
|
|
49
|
-
- `--radius-full`: marker and line radius
|
|
50
|
-
|
|
51
|
-
## Pixel Rules
|
|
52
|
-
|
|
53
|
-
- Dates are `12px / 16px`, regular.
|
|
54
|
-
- Labels are `15px / 24px`, semibold.
|
|
55
|
-
- Captions are `14px / 20px`, regular.
|
|
56
|
-
- Default markers reserve a `20px` box with a small circular ring.
|
|
57
|
-
- Icon markers are `28px` circles with an 18px check glyph.
|
|
58
|
-
- Vertical item gaps use `12px`; horizontal item body spacing uses `10px`.
|
|
59
|
-
- Finished connector lines use the brand border color.
|
|
60
|
-
- Active and inactive connector lines use the default border color.
|
|
61
|
-
- RTL mirrors the date/content placement while preserving source step order.
|
|
62
|
-
|
|
63
|
-
## Install
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
npx banhaten add timeline
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Examples
|
|
70
|
-
|
|
71
|
-
Primary registry example: `examples/expanded/timeline-demo.tsx`.
|
|
72
|
-
|
|
73
|
-
Open the live component page or run `npx banhaten docs timeline` to inspect source files, install command, and examples.
|
|
74
|
-
|
|
75
|
-
## RTL Rules
|
|
76
|
-
|
|
77
|
-
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
78
|
-
|
|
79
|
-
## Accessibility
|
|
80
|
-
|
|
81
|
-
Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
|
|
82
|
-
|
|
1
|
+
# Timeline
|
|
2
|
+
|
|
3
|
+
Timelines show ordered progress or dated events. Use `Timeline` for a complete sequence and `TimelineItem` when a consumer needs to compose a custom layout.
|
|
4
|
+
|
|
5
|
+
Figma references:
|
|
6
|
+
|
|
7
|
+
- `TimelineVetical`, node `572:6768`
|
|
8
|
+
- `TimeLineHorizontal`, node `584:4501`
|
|
9
|
+
- `TimelineVerticalItem`, node `572:6444`
|
|
10
|
+
- `TimelineHorizontalItem`, node `582:4214`
|
|
11
|
+
|
|
12
|
+
## Variants
|
|
13
|
+
|
|
14
|
+
| Prop | Values |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `orientation` | `vertical`, `horizontal` |
|
|
17
|
+
| `variant` | `default`, `icon` |
|
|
18
|
+
| `state` | `finished`, `active`, `inactive` |
|
|
19
|
+
| `dir` | `ltr`, `rtl` |
|
|
20
|
+
|
|
21
|
+
The Figma source includes vertical timelines with seven steps and horizontal timelines with six steps. Code accepts any `steps` array.
|
|
22
|
+
|
|
23
|
+
## API
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
<Timeline
|
|
27
|
+
orientation="vertical"
|
|
28
|
+
variant="default"
|
|
29
|
+
dir="ltr"
|
|
30
|
+
steps={[
|
|
31
|
+
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "finished" },
|
|
32
|
+
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "active" },
|
|
33
|
+
{ label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "inactive" },
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`TimelineStep` supports `label`, `caption`, `date`, `topDate`, `bottomDate`, `state`, `icon`, and visibility flags for leading/top/bottom dates, caption, connector line, and bottom padding.
|
|
39
|
+
|
|
40
|
+
## Token Contract
|
|
41
|
+
|
|
42
|
+
- `--bg-brand-default`: filled icon marker
|
|
43
|
+
- `--bg-default`: default marker center
|
|
44
|
+
- `--bg-muted`: inactive icon marker
|
|
45
|
+
- `--border-brand-strong`: finished connector line
|
|
46
|
+
- `--border-default`: active and inactive connector line
|
|
47
|
+
- `--content-default`: labels and inactive check
|
|
48
|
+
- `--content-subtle`: dates and captions
|
|
49
|
+
- `--radius-full`: marker and line radius
|
|
50
|
+
|
|
51
|
+
## Pixel Rules
|
|
52
|
+
|
|
53
|
+
- Dates are `12px / 16px`, regular.
|
|
54
|
+
- Labels are `15px / 24px`, semibold.
|
|
55
|
+
- Captions are `14px / 20px`, regular.
|
|
56
|
+
- Default markers reserve a `20px` box with a small circular ring.
|
|
57
|
+
- Icon markers are `28px` circles with an 18px check glyph.
|
|
58
|
+
- Vertical item gaps use `12px`; horizontal item body spacing uses `10px`.
|
|
59
|
+
- Finished connector lines use the brand border color.
|
|
60
|
+
- Active and inactive connector lines use the default border color.
|
|
61
|
+
- RTL mirrors the date/content placement while preserving source step order.
|
|
62
|
+
|
|
63
|
+
## Install
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx banhaten add timeline
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Examples
|
|
70
|
+
|
|
71
|
+
Primary registry example: `examples/expanded/timeline-demo.tsx`.
|
|
72
|
+
|
|
73
|
+
Open the live component page or run `npx banhaten docs timeline` to inspect source files, install command, and examples.
|
|
74
|
+
|
|
75
|
+
## RTL Rules
|
|
76
|
+
|
|
77
|
+
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
78
|
+
|
|
79
|
+
## Accessibility
|
|
80
|
+
|
|
81
|
+
Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
|
|
82
|
+
|
|
83
83
|
<!-- registry-contract:start -->
|
|
84
84
|
## Registry Contract
|
|
85
85
|
|
|
@@ -93,6 +93,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
93
93
|
| `registryDependencies` | None |
|
|
94
94
|
| `orientations` | `vertical`, `horizontal` |
|
|
95
95
|
| `states` | `finished`, `active`, `inactive` |
|
|
96
|
-
| `tokens` | `--bh-bg-brand-default`, `--bh-bg-default`, `--bh-bg-muted`, `--bh-border-brand-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-font-family`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-icon-stroke-300`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-timeline-grid-width`, `--bh-timeline-narrow-width`, `--bh-timeline-sidebar-width`, `--
|
|
96
|
+
| `tokens` | `--bh-bg-brand-default`, `--bh-bg-default`, `--bh-bg-muted`, `--bh-border-brand-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-font-family`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-icon-stroke-300`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-timeline-grid-width`, `--bh-timeline-narrow-width`, `--bh-timeline-sidebar-width`, `--elevation-component-focus-ring` |
|
|
97
97
|
| `variants` | `default`, `icon` |
|
|
98
98
|
<!-- registry-contract:end -->
|
|
@@ -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
|
|
|
@@ -69,5 +69,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
69
69
|
| `features` | `semantic shortcuts`, `action slot`, `close button`, `logical placement`, `toast promise support` |
|
|
70
70
|
| `intents` | `default`, `success`, `danger`, `warning`, `info` |
|
|
71
71
|
| `sides` | `start`, `end` |
|
|
72
|
-
| `tokens` | `--bh-bg-brand-subtle`, `--bh-bg-danger-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-soft`, `--bh-bg-raised`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-danger-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-content-brand-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-warning-default`, `--bh-control-default`, `--bh-font-family`, `--bh-interactive-brand-default`, `--bh-radius-xl-10`, `--bh-space-lg-10`, `--bh-space-xs-4`, `--bh-text-body-sm-semibold-font-size`, `--bh-text-body-sm-semibold-font-weight`, `--bh-text-body-sm-semibold-letter-spacing`, `--bh-text-body-sm-semibold-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-toast-accent`, `--bh-toast-accent-bg`, `--
|
|
72
|
+
| `tokens` | `--bh-bg-brand-subtle`, `--bh-bg-danger-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-soft`, `--bh-bg-raised`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-danger-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-content-brand-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-warning-default`, `--bh-control-default`, `--bh-font-family`, `--bh-interactive-brand-default`, `--bh-radius-xl-10`, `--bh-space-lg-10`, `--bh-space-xs-4`, `--bh-text-body-sm-semibold-font-size`, `--bh-text-body-sm-semibold-font-weight`, `--bh-text-body-sm-semibold-letter-spacing`, `--bh-text-body-sm-semibold-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-toast-accent`, `--bh-toast-accent-bg`, `--elevation-component-default` |
|
|
73
73
|
<!-- registry-contract:end -->
|
|
@@ -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 | `--
|
|
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
|
|
|
@@ -92,5 +92,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
92
92
|
| `features` | `optional handle icons`, `leading label`, `trailing label`, `supporting text` |
|
|
93
93
|
| `sizes` | `sm`, `md` |
|
|
94
94
|
| `states` | `unchecked`, `checked`, `hover`, `focused`, `disabled` |
|
|
95
|
-
| `tokens` | `--bh-content-default`, `--bh-content-disabled`, `--bh-content-on-light`, `--bh-content-subtle`, `--bh-icon-stroke-250`, `--bh-interactive-switch-active`, `--bh-interactive-switch-active-disabled`, `--bh-interactive-switch-active-hover`, `--bh-interactive-switch-default`, `--bh-interactive-switch-disabled`, `--bh-interactive-switch-handle`, `--bh-interactive-switch-handle-disabled`, `--bh-interactive-switch-hover`, `--bh-menu-switch-handle-size`, `--bh-menu-switch-height`, `--bh-menu-switch-padding`, `--bh-menu-switch-width`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xxs-2`, `--bh-text-body-md-medium-font-weight`, `--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-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-toggle-handle-size`, `--bh-toggle-icon-size-md`, `--bh-toggle-icon-size-sm`, `--bh-toggle-offset`, `--
|
|
95
|
+
| `tokens` | `--bh-content-default`, `--bh-content-disabled`, `--bh-content-on-light`, `--bh-content-subtle`, `--bh-icon-stroke-250`, `--bh-interactive-switch-active`, `--bh-interactive-switch-active-disabled`, `--bh-interactive-switch-active-hover`, `--bh-interactive-switch-default`, `--bh-interactive-switch-disabled`, `--bh-interactive-switch-handle`, `--bh-interactive-switch-handle-disabled`, `--bh-interactive-switch-hover`, `--bh-menu-switch-handle-size`, `--bh-menu-switch-height`, `--bh-menu-switch-padding`, `--bh-menu-switch-width`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xxs-2`, `--bh-text-body-md-medium-font-weight`, `--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-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--bh-toggle-handle-size`, `--bh-toggle-icon-size-md`, `--bh-toggle-icon-size-sm`, `--bh-toggle-offset`, `--elevation-03`, `--elevation-social-button-focus-ring` |
|
|
96
96
|
<!-- registry-contract:end -->
|