banhaten 0.4.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 -100
- 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 -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 +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 +97 -97
- 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 +88 -88
- 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 +176 -175
- 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 -81
- 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 +114 -60
- package/docs/design-system/components/item.md +59 -59
- package/docs/design-system/components/kbd.md +51 -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 +110 -99
- 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 -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 -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 -59
- 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 -454
- package/registry/components/autocomplete.tsx +598 -651
- package/registry/components/avatar.tsx +385 -385
- 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 -1289
- 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 -60
- 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 -260
- 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 -135
- 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 -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/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 -979
- package/registry/components/item.tsx +189 -189
- package/registry/components/kbd.tsx +246 -245
- 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 -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/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 -1230
- 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 -235
- 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 -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 -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 -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/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 +1403 -155
- package/registry/styles/globals.css +946 -1088
- package/registry.json +361 -8
- 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 +306 -192
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
# Accordion
|
|
2
|
-
|
|
3
|
-
Accordion is the disclosure primitive for grouped details, settings, FAQs, and compact content sections. It is backed by Radix Accordion and supports single or multiple expansion, size variants, visual treatments, animation, and RTL-safe copy.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<Accordion type="single" collapsible>
|
|
9
|
-
<AccordionItem value="billing">
|
|
10
|
-
<AccordionTrigger>Billing</AccordionTrigger>
|
|
11
|
-
<AccordionContent>Invoice and payment details.</AccordionContent>
|
|
12
|
-
</AccordionItem>
|
|
13
|
-
</Accordion>
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
| Prop | Values | Default |
|
|
17
|
-
| --- | --- | --- |
|
|
18
|
-
| `variant` | `default`, `bordered`, `cards`, `soft` | `default` |
|
|
19
|
-
| `size` | `sm`, `default`, `lg` | `default` |
|
|
20
|
-
| `type` | Radix `single`, `multiple` | required |
|
|
21
|
-
| `collapsible` | `boolean` | Radix default |
|
|
22
|
-
|
|
23
|
-
## Token Contract
|
|
24
|
-
|
|
25
|
-
Accordion uses Banhaten spacing, border, radius, content, interactive, typography, and animation tokens. Avoid raw colors or pixel values in local variants.
|
|
26
|
-
|
|
27
|
-
## RTL
|
|
28
|
-
|
|
29
|
-
Accordion inherits direction from its parent. Triggers and content use logical spacing and `text-start`; text labels use `dir="auto"` where the component renders string copy.
|
|
30
|
-
|
|
31
|
-
## Accessibility
|
|
32
|
-
|
|
33
|
-
Radix provides button semantics, `aria-expanded`, roving state, and keyboard behavior. Keep trigger content concise and do not put nested interactive controls inside `AccordionTrigger`.
|
|
34
|
-
|
|
35
|
-
## Install
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
npx banhaten add accordion
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Examples
|
|
42
|
-
|
|
43
|
-
Primary registry example: `examples/accordion-demo.tsx`.
|
|
44
|
-
|
|
45
|
-
Open the live component page or run `npx banhaten docs accordion` to inspect source files, install command, and examples.
|
|
46
|
-
|
|
47
|
-
## RTL Rules
|
|
48
|
-
|
|
49
|
-
- `inheritsDirection`: true
|
|
50
|
-
- `textAlignment`: Uses text-start and dir="auto" so Arabic and English copy align and punctuate naturally.
|
|
51
|
-
- `spacing`: Uses gap and logical inherited direction rather than physical left/right spacing.
|
|
52
|
-
|
|
1
|
+
# Accordion
|
|
2
|
+
|
|
3
|
+
Accordion is the disclosure primitive for grouped details, settings, FAQs, and compact content sections. It is backed by Radix Accordion and supports single or multiple expansion, size variants, visual treatments, animation, and RTL-safe copy.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Accordion type="single" collapsible>
|
|
9
|
+
<AccordionItem value="billing">
|
|
10
|
+
<AccordionTrigger>Billing</AccordionTrigger>
|
|
11
|
+
<AccordionContent>Invoice and payment details.</AccordionContent>
|
|
12
|
+
</AccordionItem>
|
|
13
|
+
</Accordion>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
| Prop | Values | Default |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| `variant` | `default`, `bordered`, `cards`, `soft` | `default` |
|
|
19
|
+
| `size` | `sm`, `default`, `lg` | `default` |
|
|
20
|
+
| `type` | Radix `single`, `multiple` | required |
|
|
21
|
+
| `collapsible` | `boolean` | Radix default |
|
|
22
|
+
|
|
23
|
+
## Token Contract
|
|
24
|
+
|
|
25
|
+
Accordion uses Banhaten spacing, border, radius, content, interactive, typography, and animation tokens. Avoid raw colors or pixel values in local variants.
|
|
26
|
+
|
|
27
|
+
## RTL
|
|
28
|
+
|
|
29
|
+
Accordion inherits direction from its parent. Triggers and content use logical spacing and `text-start`; text labels use `dir="auto"` where the component renders string copy.
|
|
30
|
+
|
|
31
|
+
## Accessibility
|
|
32
|
+
|
|
33
|
+
Radix provides button semantics, `aria-expanded`, roving state, and keyboard behavior. Keep trigger content concise and do not put nested interactive controls inside `AccordionTrigger`.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx banhaten add accordion
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Examples
|
|
42
|
+
|
|
43
|
+
Primary registry example: `examples/accordion-demo.tsx`.
|
|
44
|
+
|
|
45
|
+
Open the live component page or run `npx banhaten docs accordion` to inspect source files, install command, and examples.
|
|
46
|
+
|
|
47
|
+
## RTL Rules
|
|
48
|
+
|
|
49
|
+
- `inheritsDirection`: true
|
|
50
|
+
- `textAlignment`: Uses text-start and dir="auto" so Arabic and English copy align and punctuate naturally.
|
|
51
|
+
- `spacing`: Uses gap and logical inherited direction rather than physical left/right spacing.
|
|
52
|
+
|
|
53
53
|
<!-- registry-contract:start -->
|
|
54
54
|
## Registry Contract
|
|
55
55
|
|
|
@@ -62,6 +62,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
62
62
|
| `parts` | `Accordion`, `AccordionItem`, `AccordionTrigger`, `AccordionContent` |
|
|
63
63
|
| `registryDependencies` | None |
|
|
64
64
|
| `sizes` | `sm`, `default`, `lg` |
|
|
65
|
-
| `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-accordion`, `--bh-duration-default`, `--bh-easing-out`, `--bh-opacity-50`, `--bh-radius-md-6`, `--bh-radius-xs-2`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-line-height`, `--
|
|
65
|
+
| `tokens` | `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-accordion`, `--bh-duration-default`, `--bh-easing-out`, `--bh-opacity-50`, `--bh-radius-md-6`, `--bh-radius-xs-2`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-medium-font-size`, `--bh-text-body-xs-medium-line-height`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-line-height`, `--elevation-accordion-item`, `--elevation-button-focus` |
|
|
66
66
|
| `variants` | `default`, `bordered`, `cards`, `soft` |
|
|
67
67
|
<!-- registry-contract:end -->
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
# Activity Feed
|
|
2
|
-
|
|
3
|
-
`ActivityFeed` renders a vertical timeline of activity items with avatars, status dots, captions or slot content, timestamps, and action buttons.
|
|
4
|
-
|
|
5
|
-
Figma reference: `Design system 3.0 Copy / ActivityFeed`, component set node `587:19445`.
|
|
6
|
-
|
|
7
|
-
## Variants
|
|
8
|
-
|
|
9
|
-
The Figma component defines these top-level variants:
|
|
10
|
-
|
|
11
|
-
| Direction | Node |
|
|
12
|
-
| --- | --- |
|
|
13
|
-
| LTR | `587:19381` |
|
|
14
|
-
| RTL | `587:19711` |
|
|
15
|
-
|
|
16
|
-
`ActivityFeedItem` also supports `caption` and `slot` item types through the `type` prop.
|
|
17
|
-
|
|
18
|
-
## API
|
|
19
|
-
|
|
20
|
-
```tsx
|
|
21
|
-
<ActivityFeed
|
|
22
|
-
dir="ltr"
|
|
23
|
-
items={[
|
|
24
|
-
{
|
|
25
|
-
label: "Label",
|
|
26
|
-
supportText: "Support Text",
|
|
27
|
-
link: "#Link",
|
|
28
|
-
caption: "Caption text",
|
|
29
|
-
timestamp: "Mar 15. 2050",
|
|
30
|
-
type: "caption",
|
|
31
|
-
},
|
|
32
|
-
]}
|
|
33
|
-
/>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
| Prop | Values | Default |
|
|
37
|
-
| --- | --- | --- |
|
|
38
|
-
| `dir` | `ltr`, `rtl` | `ltr` |
|
|
39
|
-
| `items` | `ActivityFeedItemProps[]` | ten caption items |
|
|
40
|
-
| `avatarSrc` | `string` | local Figma avatar asset |
|
|
41
|
-
| `type` | `caption`, `slot` | `caption` |
|
|
42
|
-
| `hasStatus` | `boolean` | `true` |
|
|
43
|
-
| `hasActionButtons` | `boolean` | `true` |
|
|
44
|
-
| `hasTwoActionButtons` | `boolean` | `true` |
|
|
45
|
-
| `showLine` | `boolean` | `true` |
|
|
46
|
-
| `showPaddingBottom` | `boolean` | `true` |
|
|
47
|
-
|
|
48
|
-
## Token Contract
|
|
49
|
-
|
|
50
|
-
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.
|
|
51
|
-
|
|
52
|
-
- Backgrounds: `--bh-bg-raised`, `--bh-bg-success-default`
|
|
53
|
-
- Borders: `--bh-border-default`, `--bh-border-subtle`
|
|
54
|
-
- Content: `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`
|
|
55
|
-
- Interactive: `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`
|
|
56
|
-
- Shape: `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-control-default`
|
|
57
|
-
- Space: `--bh-space-xxs-2`, `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`
|
|
58
|
-
|
|
59
|
-
## Pixel Rules
|
|
60
|
-
|
|
61
|
-
- Feed width is `600px`.
|
|
62
|
-
- Items use a `12px` gap between the indicator rail and content.
|
|
63
|
-
- Avatar is `32px` square with a full radius and subtle border.
|
|
64
|
-
- The status dot renders in a `16px` box with a `6px` success fill.
|
|
65
|
-
- Body text is Inter `15px / 24px`; timestamps are `14px / 20px`.
|
|
66
|
-
- Captions use `12px` padding, subtle border, white raised fill, and `4px` radius.
|
|
67
|
-
- Slot content is `76px` high with purple dashed border and subtle purple fill.
|
|
68
|
-
- Actions use `8px` top padding, `8px` button gap, and `36px` tall buttons.
|
|
69
|
-
- The repeated-item default uses a `22px` decorative bottom spacer so ten items fit the `2000px` Figma feed frame.
|
|
70
|
-
- RTL mirrors the avatar rail to the right and right-aligns text content.
|
|
71
|
-
|
|
72
|
-
## Accessibility
|
|
73
|
-
|
|
74
|
-
- The feed uses a labelled `section`; provide `ariaLabel` when the surrounding context is not explicit.
|
|
75
|
-
- Status dots and connector lines are decorative. Use item copy or parent-level announcements for meaningful state.
|
|
76
|
-
- Action buttons are real `button` or `a` elements and support `ariaLabel`, `disabled`, `href`, and `onClick`.
|
|
77
|
-
|
|
78
|
-
## Install
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
npx banhaten add activity-feed
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Examples
|
|
85
|
-
|
|
86
|
-
Primary registry example: `examples/expanded/activity-feed-demo.tsx`.
|
|
87
|
-
|
|
88
|
-
Open the live component page or run `npx banhaten docs activity-feed` to inspect source files, install command, and examples.
|
|
89
|
-
|
|
90
|
-
## RTL Rules
|
|
91
|
-
|
|
92
|
-
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
93
|
-
|
|
1
|
+
# Activity Feed
|
|
2
|
+
|
|
3
|
+
`ActivityFeed` renders a vertical timeline of activity items with avatars, status dots, captions or slot content, timestamps, and action buttons.
|
|
4
|
+
|
|
5
|
+
Figma reference: `Design system 3.0 Copy / ActivityFeed`, component set node `587:19445`.
|
|
6
|
+
|
|
7
|
+
## Variants
|
|
8
|
+
|
|
9
|
+
The Figma component defines these top-level variants:
|
|
10
|
+
|
|
11
|
+
| Direction | Node |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| LTR | `587:19381` |
|
|
14
|
+
| RTL | `587:19711` |
|
|
15
|
+
|
|
16
|
+
`ActivityFeedItem` also supports `caption` and `slot` item types through the `type` prop.
|
|
17
|
+
|
|
18
|
+
## API
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
<ActivityFeed
|
|
22
|
+
dir="ltr"
|
|
23
|
+
items={[
|
|
24
|
+
{
|
|
25
|
+
label: "Label",
|
|
26
|
+
supportText: "Support Text",
|
|
27
|
+
link: "#Link",
|
|
28
|
+
caption: "Caption text",
|
|
29
|
+
timestamp: "Mar 15. 2050",
|
|
30
|
+
type: "caption",
|
|
31
|
+
},
|
|
32
|
+
]}
|
|
33
|
+
/>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Prop | Values | Default |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `dir` | `ltr`, `rtl` | `ltr` |
|
|
39
|
+
| `items` | `ActivityFeedItemProps[]` | ten caption items |
|
|
40
|
+
| `avatarSrc` | `string` | local Figma avatar asset |
|
|
41
|
+
| `type` | `caption`, `slot` | `caption` |
|
|
42
|
+
| `hasStatus` | `boolean` | `true` |
|
|
43
|
+
| `hasActionButtons` | `boolean` | `true` |
|
|
44
|
+
| `hasTwoActionButtons` | `boolean` | `true` |
|
|
45
|
+
| `showLine` | `boolean` | `true` |
|
|
46
|
+
| `showPaddingBottom` | `boolean` | `true` |
|
|
47
|
+
|
|
48
|
+
## Token Contract
|
|
49
|
+
|
|
50
|
+
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.
|
|
51
|
+
|
|
52
|
+
- Backgrounds: `--bh-bg-raised`, `--bh-bg-success-default`
|
|
53
|
+
- Borders: `--bh-border-default`, `--bh-border-subtle`
|
|
54
|
+
- Content: `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`
|
|
55
|
+
- Interactive: `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`
|
|
56
|
+
- Shape: `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-control-default`
|
|
57
|
+
- Space: `--bh-space-xxs-2`, `--bh-space-xs-4`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-xl-12`
|
|
58
|
+
|
|
59
|
+
## Pixel Rules
|
|
60
|
+
|
|
61
|
+
- Feed width is `600px`.
|
|
62
|
+
- Items use a `12px` gap between the indicator rail and content.
|
|
63
|
+
- Avatar is `32px` square with a full radius and subtle border.
|
|
64
|
+
- The status dot renders in a `16px` box with a `6px` success fill.
|
|
65
|
+
- Body text is Inter `15px / 24px`; timestamps are `14px / 20px`.
|
|
66
|
+
- Captions use `12px` padding, subtle border, white raised fill, and `4px` radius.
|
|
67
|
+
- Slot content is `76px` high with purple dashed border and subtle purple fill.
|
|
68
|
+
- Actions use `8px` top padding, `8px` button gap, and `36px` tall buttons.
|
|
69
|
+
- The repeated-item default uses a `22px` decorative bottom spacer so ten items fit the `2000px` Figma feed frame.
|
|
70
|
+
- RTL mirrors the avatar rail to the right and right-aligns text content.
|
|
71
|
+
|
|
72
|
+
## Accessibility
|
|
73
|
+
|
|
74
|
+
- The feed uses a labelled `section`; provide `ariaLabel` when the surrounding context is not explicit.
|
|
75
|
+
- Status dots and connector lines are decorative. Use item copy or parent-level announcements for meaningful state.
|
|
76
|
+
- Action buttons are real `button` or `a` elements and support `ariaLabel`, `disabled`, `href`, and `onClick`.
|
|
77
|
+
|
|
78
|
+
## Install
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
npx banhaten add activity-feed
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Examples
|
|
85
|
+
|
|
86
|
+
Primary registry example: `examples/expanded/activity-feed-demo.tsx`.
|
|
87
|
+
|
|
88
|
+
Open the live component page or run `npx banhaten docs activity-feed` to inspect source files, install command, and examples.
|
|
89
|
+
|
|
90
|
+
## RTL Rules
|
|
91
|
+
|
|
92
|
+
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
93
|
+
|
|
94
94
|
<!-- registry-contract:start -->
|
|
95
95
|
## Registry Contract
|
|
96
96
|
|
|
@@ -103,6 +103,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
103
103
|
| `parts` | `ActivityFeed`, `ActivityFeedItem` |
|
|
104
104
|
| `registryDependencies` | `button` |
|
|
105
105
|
| `states` | `default`, `with-status`, `with-link`, `with-actions` |
|
|
106
|
-
| `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--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-text-body-xs-regular-font-size`, `--
|
|
106
|
+
| `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--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-text-body-xs-regular-font-size`, `--elevation-button-raised`, `--elevation-component-default` |
|
|
107
107
|
| `variants` | `caption`, `slot` |
|
|
108
108
|
<!-- registry-contract:end -->
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# Activity Heatmap
|
|
2
|
-
|
|
3
|
-
`ActivityHeatmap` visualizes activity as seven-day week columns with five intensity levels. It is domain-neutral: contribution totals, period controls, headings, and product-specific copy belong to the surrounding composition.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
import {
|
|
9
|
-
ActivityHeatmap,
|
|
10
|
-
type ActivityHeatmapItem,
|
|
11
|
-
} from "@/components/ui/expanded/ActivityHeatmap"
|
|
12
|
-
|
|
13
|
-
const items: ActivityHeatmapItem[] = activity.map((level, index) => ({
|
|
14
|
-
id: String(index),
|
|
15
|
-
label: `Day ${index + 1}, activity level ${level} of 4`,
|
|
16
|
-
level,
|
|
17
|
-
}))
|
|
18
|
-
|
|
19
|
-
<ActivityHeatmap
|
|
20
|
-
ariaLabel="Weekly activity over the last 39 weeks"
|
|
21
|
-
items={items}
|
|
22
|
-
/>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Items are supplied in column-major order: the first seven values make the first week, the next seven make the second week, and so on. `level` accepts `0`, `1`, `2`, `3`, or `4`.
|
|
26
|
-
|
|
27
|
-
## Token Contract
|
|
28
|
-
|
|
29
|
-
The component introduces no new design tokens and contains no raw visual values. Its complete visual contract is composed from existing Banhaten tokens:
|
|
30
|
-
|
|
31
|
-
- Cell size: `--bh-space-3xl-16`
|
|
32
|
-
- Gap: `--bh-space-xs-4`
|
|
33
|
-
- Radius: `--bh-radius-sm-4`
|
|
34
|
-
- Empty level: `--bh-bg-neutral-medium`
|
|
35
|
-
- Activity levels: `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-default`, `--bh-content-accent-purple-strong`
|
|
36
|
-
|
|
37
|
-
## RTL Rules
|
|
38
|
-
|
|
39
|
-
Set `dir="rtl"` or inherit an RTL direction boundary to place the first supplied week at the logical start edge. Item order is never mutated in JavaScript.
|
|
40
|
-
|
|
41
|
-
## Accessibility
|
|
42
|
-
|
|
43
|
-
The heatmap exposes one image-style accessible summary through `ariaLabel`, avoiding hundreds of repetitive focus stops. Give each item a concise `label` to provide a native pointer tooltip. If users must inspect or act on individual days, pair the heatmap with an accessible table or list rather than turning every cell into a button.
|
|
44
|
-
|
|
45
|
-
## Install
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npx banhaten add activity-heatmap
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Examples
|
|
52
|
-
|
|
53
|
-
Primary registry example: `examples/expanded/activity-heatmap-demo.tsx`.
|
|
54
|
-
|
|
55
|
-
Open the live component page or run `npx banhaten docs activity-heatmap` to inspect source files, installation, and examples.
|
|
56
|
-
|
|
1
|
+
# Activity Heatmap
|
|
2
|
+
|
|
3
|
+
`ActivityHeatmap` visualizes activity as seven-day week columns with five intensity levels. It is domain-neutral: contribution totals, period controls, headings, and product-specific copy belong to the surrounding composition.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import {
|
|
9
|
+
ActivityHeatmap,
|
|
10
|
+
type ActivityHeatmapItem,
|
|
11
|
+
} from "@/components/ui/expanded/ActivityHeatmap"
|
|
12
|
+
|
|
13
|
+
const items: ActivityHeatmapItem[] = activity.map((level, index) => ({
|
|
14
|
+
id: String(index),
|
|
15
|
+
label: `Day ${index + 1}, activity level ${level} of 4`,
|
|
16
|
+
level,
|
|
17
|
+
}))
|
|
18
|
+
|
|
19
|
+
<ActivityHeatmap
|
|
20
|
+
ariaLabel="Weekly activity over the last 39 weeks"
|
|
21
|
+
items={items}
|
|
22
|
+
/>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Items are supplied in column-major order: the first seven values make the first week, the next seven make the second week, and so on. `level` accepts `0`, `1`, `2`, `3`, or `4`.
|
|
26
|
+
|
|
27
|
+
## Token Contract
|
|
28
|
+
|
|
29
|
+
The component introduces no new design tokens and contains no raw visual values. Its complete visual contract is composed from existing Banhaten tokens:
|
|
30
|
+
|
|
31
|
+
- Cell size: `--bh-space-3xl-16`
|
|
32
|
+
- Gap: `--bh-space-xs-4`
|
|
33
|
+
- Radius: `--bh-radius-sm-4`
|
|
34
|
+
- Empty level: `--bh-bg-neutral-medium`
|
|
35
|
+
- Activity levels: `--bh-bg-accent-purple-subtle`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-default`, `--bh-content-accent-purple-strong`
|
|
36
|
+
|
|
37
|
+
## RTL Rules
|
|
38
|
+
|
|
39
|
+
Set `dir="rtl"` or inherit an RTL direction boundary to place the first supplied week at the logical start edge. Item order is never mutated in JavaScript.
|
|
40
|
+
|
|
41
|
+
## Accessibility
|
|
42
|
+
|
|
43
|
+
The heatmap exposes one image-style accessible summary through `ariaLabel`, avoiding hundreds of repetitive focus stops. Give each item a concise `label` to provide a native pointer tooltip. If users must inspect or act on individual days, pair the heatmap with an accessible table or list rather than turning every cell into a button.
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx banhaten add activity-heatmap
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Examples
|
|
52
|
+
|
|
53
|
+
Primary registry example: `examples/expanded/activity-heatmap-demo.tsx`.
|
|
54
|
+
|
|
55
|
+
Open the live component page or run `npx banhaten docs activity-heatmap` to inspect source files, installation, and examples.
|
|
56
|
+
|
|
57
57
|
<!-- registry-contract:start -->
|
|
58
58
|
## Registry Contract
|
|
59
59
|
|
|
@@ -69,5 +69,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
69
69
|
| `props.dir` | `ltr \| rtl; default "inherited"; Places the first activity column at the logical start edge.` |
|
|
70
70
|
| `props.items` | `readonly ActivityHeatmapItem[]; default "[]"; Column-major cells grouped into seven-day weeks, each with a level from zero through four.` |
|
|
71
71
|
| `states` | `level-0`, `level-1`, `level-2`, `level-3`, `level-4` |
|
|
72
|
-
| `tokens` | `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-subtle`, `--bh-bg-neutral-medium`, `--bh-content-accent-purple-strong`, `--bh-content-default`, `--bh-font-family`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-xs-4`, `--
|
|
72
|
+
| `tokens` | `--bh-bg-accent-purple-default`, `--bh-bg-accent-purple-soft`, `--bh-bg-accent-purple-subtle`, `--bh-bg-neutral-medium`, `--bh-content-accent-purple-strong`, `--bh-content-default`, `--bh-font-family`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-xs-4`, `--elevation-component-focus-ring` |
|
|
73
73
|
<!-- registry-contract:end -->
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Agent Input
|
|
2
|
+
|
|
3
|
+
`AgentInput` is the prompt composer for agent conversations. One frame holds an auto-growing editor, skill and attachment chips, an add menu for photos, files, skills, and models, a slash-command skill palette, an optional Enhance Prompt action with a sweeping accent ring, and the send button.
|
|
4
|
+
|
|
5
|
+
It composes Button, Menu, Tag, Spinner, and Shimmer Text rather than restyling them, so density, focus, and RTL behavior match the rest of the system.
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { AgentInput } from "@/components/ui/agent-input"
|
|
11
|
+
|
|
12
|
+
<AgentInput
|
|
13
|
+
models={models}
|
|
14
|
+
onEnhance={enhancePrompt}
|
|
15
|
+
onSend={({ text, attachments, skills, model }) =>
|
|
16
|
+
submit({ files: attachments.map((attachment) => attachment.file), model, skills, text })
|
|
17
|
+
}
|
|
18
|
+
skills={skills}
|
|
19
|
+
/>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Prop | Type | Default | Description |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| `value` / `defaultValue` / `onValueChange` | `string` | `""` | Prompt text. |
|
|
25
|
+
| `onSend` | `(payload: AgentInputPayload) => void` | – | Receives `text`, `attachments`, selected `skills`, and the `model`. Enter sends; Shift+Enter inserts a line break; an Enter that confirms an IME composition never sends. |
|
|
26
|
+
| `onEnhance` | `(prompt, signal) => Promise<string>` | – | Enables Enhance Prompt. Resolve with the rewritten prompt; if it rejects, the original prompt returns. The signal aborts when the field unmounts, and a late result is ignored. |
|
|
27
|
+
| `models` | `readonly AgentInputModel[]` | `[]` | Selectable models with `name`, optional `description`, `meta`, and `icon`. |
|
|
28
|
+
| `model` / `defaultModel` / `onModelChange` | `string` | first model | Selected model id. |
|
|
29
|
+
| `skills` | `readonly AgentInputSkill[]` | `[]` | Skills available from the add menu and by typing `/`. |
|
|
30
|
+
| `selectedSkills` / `defaultSelectedSkills` / `onSelectedSkillsChange` | `readonly string[]` | `[]` | Selected skill ids, shown as chips. |
|
|
31
|
+
| `attachments` / `onAttachmentsChange` | `readonly AgentInputAttachment[]` | internal | Attachment chips `{ id, kind, name, file? }`; omit to let the field own picked files. A picked file's kind follows its MIME type; the picker it came from decides only for files without one. |
|
|
32
|
+
| `disabled` | `boolean` | `false` | Disables editing and actions. |
|
|
33
|
+
| `labels` | `Partial<AgentInputLabels>` | English | Placeholder, menu, action, and remove copy. |
|
|
34
|
+
|
|
35
|
+
Keyboard: `/` opens the skill palette, arrow keys move, Enter or Tab inserts, Escape closes.
|
|
36
|
+
|
|
37
|
+
Files picked through the add menu keep their `File` on `attachment.file`, so you can upload them as soon as they arrive in `onAttachmentsChange` or when `onSend` fires. Attachments you pass in yourself, such as ones restored from a saved draft, can leave `file` out.
|
|
38
|
+
|
|
39
|
+
## Install
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx banhaten add agent-input
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
|
|
47
|
+
Primary registry example: `examples/agent-input-demo.tsx`.
|
|
48
|
+
|
|
49
|
+
## Token Contract
|
|
50
|
+
|
|
51
|
+
The frame uses `--bh-bg-raised`, `--bh-radius-2xl-12`, and `--elevation-02`. The editor uses the `body-sm-regular` scale, `--bh-content-muted` placeholders, and caps at `--bh-agent-input-field-max-height`. The palette reuses Menu tokens (`--bh-menu-bg`, `--bh-menu-radius`, `--bh-menu-item-radius`, `--bh-menu-item-hover-bg`, `--elevation-menu`) at `--bh-agent-input-palette-width`. The enhancing ring is `--bh-agent-input-ring-width` wide and cycles the blue, purple, fuchsia, and aqua accent content tokens on `--bh-agent-input-ring-duration`. Chips, the enhance pill, and the palette move on the shared `--bh-duration-*` and `--bh-easing-emphasized` foundation tokens, and removed chips and the pill unmount when their exit animation ends.
|
|
52
|
+
|
|
53
|
+
Covered source files: `components/agent-input.tsx`, the internal `components/agent-input-parts.tsx` and `components/agent-input-state.ts`, `components/agent-input.css`, and the `button`, `menu`, `shimmer-text`, `spinner`, and `tag` registry dependencies.
|
|
54
|
+
|
|
55
|
+
## RTL Rules
|
|
56
|
+
|
|
57
|
+
- The editor, chips, palette, and action row inherit direction and use logical spacing.
|
|
58
|
+
- The add menu and slash palette open toward the logical start; Menu resolves keyboard direction through its own boundary.
|
|
59
|
+
|
|
60
|
+
## Accessibility
|
|
61
|
+
|
|
62
|
+
The editor is a native textarea labelled by the placeholder. Typing / opens a listbox of skills that the field drives through `aria-activedescendant`, `aria-controls`, `aria-autocomplete`, and `aria-haspopup`; arrow keys move the active option with wrapping and Enter or Tab inserts it. The palette shares its keyboard model with Autocomplete through the `use-listbox-navigation` hook. Chips expose remove buttons named after their item, the add menu is a Radix menu with roving focus, and a status region that stays mounted announces the `enhancing` label when a request starts. Animations collapse to instant changes under `prefers-reduced-motion`.
|
|
63
|
+
|
|
64
|
+
<!-- registry-contract:start -->
|
|
65
|
+
## Registry Contract
|
|
66
|
+
|
|
67
|
+
This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
|
|
68
|
+
`supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
|
|
69
|
+
|
|
70
|
+
| Field | Values |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `supportedExports` | `components/agent-input.tsx: AgentInput` |
|
|
73
|
+
| `parts` | `AgentInput` |
|
|
74
|
+
| `registryDependencies` | `button`, `menu`, `shimmer-text`, `spinner`, `tag` |
|
|
75
|
+
| `props.value` | `string; default null; Controlled prompt text; use defaultValue for uncontrolled usage.` |
|
|
76
|
+
| `props.onSend` | `(payload: AgentInputPayload) => void; default null; Receives text, attachments, skills, and the selected model; picked attachments carry their File for upload.` |
|
|
77
|
+
| `props.onEnhance` | `(prompt: string, signal: AbortSignal) => Promise<string>; default null; Enables the Enhance Prompt action; resolves to the rewritten prompt.` |
|
|
78
|
+
| `props.models` | `readonly AgentInputModel[]; default "[]"; Selectable models with name, description, meta, and icon.` |
|
|
79
|
+
| `props.skills` | `readonly AgentInputSkill[]; default "[]"; Skills available from the add menu and the slash palette.` |
|
|
80
|
+
| `props.attachments` | `readonly AgentInputAttachment[]; default null; Controlled attachment chips; omit to let the field own picked files.` |
|
|
81
|
+
| `props.onAttachmentsChange` | `(attachments: AgentInputAttachment[]) => void; default null; Called when chips are added or removed; picked files arrive with their File, so uploads can start right away.` |
|
|
82
|
+
| `props.labels` | `Partial<AgentInputLabels>; default "English"; Localized placeholder, menu, action, and remove copy.` |
|
|
83
|
+
| `states` | `idle`, `enhancing`, `enhanced` |
|
|
84
|
+
| `tokens` | `--bh-agent-input-field-max-height`, `--bh-agent-input-palette-width`, `--bh-agent-input-ring-duration`, `--bh-agent-input-ring-width`, `--bh-bg-raised`, `--bh-button-xs-height`, `--bh-content-accent-aqua-default`, `--bh-content-accent-blue-default`, `--bh-content-accent-fuchsia-default`, `--bh-content-accent-purple-default`, `--bh-content-default`, `--bh-content-disabled`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-duration-default`, `--bh-duration-moderate`, `--bh-easing-emphasized`, `--bh-font-family`, `--bh-menu-bg`, `--bh-menu-item-hover-bg`, `--bh-menu-item-radius`, `--bh-menu-radius`, `--bh-opacity-0`, `--bh-opacity-100`, `--bh-radius-2xl-12`, `--bh-space-2xl-14`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-font-weight`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-font-weight`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-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-z-popover`, `--elevation-02`, `--elevation-menu` |
|
|
85
|
+
<!-- registry-contract:end -->
|