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,74 +1,74 @@
|
|
|
1
|
-
# Alert Dialog
|
|
2
|
-
|
|
3
|
-
Alert Dialog is the destructive or consequential confirmation primitive. It is backed by Radix AlertDialog so focus, Escape behavior, outside interaction, and alert-dialog semantics are handled by the correct primitive.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<AlertDialog>
|
|
9
|
-
<AlertDialogTrigger asChild>
|
|
10
|
-
<Button variant="danger">Delete project</Button>
|
|
11
|
-
</AlertDialogTrigger>
|
|
12
|
-
<AlertDialogContent>
|
|
13
|
-
<AlertDialogHeader>
|
|
14
|
-
<AlertDialogIcon intent="danger" />
|
|
15
|
-
<AlertDialogTitle>Delete project?</AlertDialogTitle>
|
|
16
|
-
</AlertDialogHeader>
|
|
17
|
-
<AlertDialogBody>
|
|
18
|
-
<AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
|
|
19
|
-
</AlertDialogBody>
|
|
20
|
-
<AlertDialogFooter>
|
|
21
|
-
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
22
|
-
<AlertDialogAction>Delete project</AlertDialogAction>
|
|
23
|
-
</AlertDialogFooter>
|
|
24
|
-
</AlertDialogContent>
|
|
25
|
-
</AlertDialog>
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
| Part | Purpose |
|
|
29
|
-
| --- | --- |
|
|
30
|
-
| `AlertDialog`, `AlertDialogTrigger`, `AlertDialogPortal` | Radix AlertDialog shell |
|
|
31
|
-
| `AlertDialogOverlay`, `AlertDialogContent` | modal alert surface |
|
|
32
|
-
| `AlertDialogHeader`, `AlertDialogBody`, `AlertDialogFooter` | layout regions |
|
|
33
|
-
| `AlertDialogTitle`, `AlertDialogDescription`, `AlertDialogIcon` | accessible warning copy |
|
|
34
|
-
| `AlertDialogCancel`, `AlertDialogAction` | safe cancel and confirm actions |
|
|
35
|
-
|
|
36
|
-
| Prop | Values |
|
|
37
|
-
| --- | --- |
|
|
38
|
-
| `size` | `sm`, `default`, `lg` |
|
|
39
|
-
| `intent` | `default`, `warning`, `danger` |
|
|
40
|
-
|
|
41
|
-
## Token Contract
|
|
42
|
-
|
|
43
|
-
Alert Dialog uses Banhaten raised surface, backdrop, border, radius, shadow, semantic intent, body typography, focus, and button tokens.
|
|
44
|
-
|
|
45
|
-
## RTL
|
|
46
|
-
|
|
47
|
-
The surface inherits direction. Title and description use `dir="auto"` and action layout uses logical flex order.
|
|
48
|
-
|
|
49
|
-
## Accessibility
|
|
50
|
-
|
|
51
|
-
Use Alert Dialog for destructive or irreversible choices. Focus should land on the cancel action by default when you build higher-level confirmations. `ConfirmModal` is wired on top of this alert-dialog primitive for the constrained confirmation pattern.
|
|
52
|
-
|
|
53
|
-
## Install
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
npx banhaten add alert-dialog
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Examples
|
|
60
|
-
|
|
61
|
-
Primary registry example: `examples/alert-dialog-demo.tsx`.
|
|
62
|
-
|
|
63
|
-
Open the live component page or run `npx banhaten docs alert-dialog` to inspect source files, install command, and examples.
|
|
64
|
-
|
|
65
|
-
## RTL Rules
|
|
66
|
-
|
|
67
|
-
- `inheritsDirection`: true
|
|
68
|
-
- `textDirection`: Title and description use dir="auto" for Arabic and English copy.
|
|
69
|
-
- `spacing`: Header, body, and footer use logical layout and Banhaten spacing tokens so action order and copy mirror naturally.
|
|
70
|
-
- `semantics`: Radix AlertDialog provides the modal alert role, focus trap, and safe cancellation behavior.
|
|
71
|
-
|
|
1
|
+
# Alert Dialog
|
|
2
|
+
|
|
3
|
+
Alert Dialog is the destructive or consequential confirmation primitive. It is backed by Radix AlertDialog so focus, Escape behavior, outside interaction, and alert-dialog semantics are handled by the correct primitive.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<AlertDialog>
|
|
9
|
+
<AlertDialogTrigger asChild>
|
|
10
|
+
<Button variant="danger">Delete project</Button>
|
|
11
|
+
</AlertDialogTrigger>
|
|
12
|
+
<AlertDialogContent>
|
|
13
|
+
<AlertDialogHeader>
|
|
14
|
+
<AlertDialogIcon intent="danger" />
|
|
15
|
+
<AlertDialogTitle>Delete project?</AlertDialogTitle>
|
|
16
|
+
</AlertDialogHeader>
|
|
17
|
+
<AlertDialogBody>
|
|
18
|
+
<AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
|
|
19
|
+
</AlertDialogBody>
|
|
20
|
+
<AlertDialogFooter>
|
|
21
|
+
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
22
|
+
<AlertDialogAction>Delete project</AlertDialogAction>
|
|
23
|
+
</AlertDialogFooter>
|
|
24
|
+
</AlertDialogContent>
|
|
25
|
+
</AlertDialog>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
| Part | Purpose |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `AlertDialog`, `AlertDialogTrigger`, `AlertDialogPortal` | Radix AlertDialog shell |
|
|
31
|
+
| `AlertDialogOverlay`, `AlertDialogContent` | modal alert surface |
|
|
32
|
+
| `AlertDialogHeader`, `AlertDialogBody`, `AlertDialogFooter` | layout regions |
|
|
33
|
+
| `AlertDialogTitle`, `AlertDialogDescription`, `AlertDialogIcon` | accessible warning copy |
|
|
34
|
+
| `AlertDialogCancel`, `AlertDialogAction` | safe cancel and confirm actions |
|
|
35
|
+
|
|
36
|
+
| Prop | Values |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| `size` | `sm`, `default`, `lg` |
|
|
39
|
+
| `intent` | `default`, `warning`, `danger` |
|
|
40
|
+
|
|
41
|
+
## Token Contract
|
|
42
|
+
|
|
43
|
+
Alert Dialog uses Banhaten raised surface, backdrop, border, radius, shadow, semantic intent, body typography, focus, and button tokens.
|
|
44
|
+
|
|
45
|
+
## RTL
|
|
46
|
+
|
|
47
|
+
The surface inherits direction. Title and description use `dir="auto"` and action layout uses logical flex order.
|
|
48
|
+
|
|
49
|
+
## Accessibility
|
|
50
|
+
|
|
51
|
+
Use Alert Dialog for destructive or irreversible choices. Focus should land on the cancel action by default when you build higher-level confirmations. `ConfirmModal` is wired on top of this alert-dialog primitive for the constrained confirmation pattern.
|
|
52
|
+
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx banhaten add alert-dialog
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Examples
|
|
60
|
+
|
|
61
|
+
Primary registry example: `examples/alert-dialog-demo.tsx`.
|
|
62
|
+
|
|
63
|
+
Open the live component page or run `npx banhaten docs alert-dialog` to inspect source files, install command, and examples.
|
|
64
|
+
|
|
65
|
+
## RTL Rules
|
|
66
|
+
|
|
67
|
+
- `inheritsDirection`: true
|
|
68
|
+
- `textDirection`: Title and description use dir="auto" for Arabic and English copy.
|
|
69
|
+
- `spacing`: Header, body, and footer use logical layout and Banhaten spacing tokens so action order and copy mirror naturally.
|
|
70
|
+
- `semantics`: Radix AlertDialog provides the modal alert role, focus trap, and safe cancellation behavior.
|
|
71
|
+
|
|
72
72
|
<!-- registry-contract:start -->
|
|
73
73
|
## Registry Contract
|
|
74
74
|
|
|
@@ -83,5 +83,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
83
83
|
| `features` | `alert-dialog semantics`, `cancel focus pattern`, `safe cancel action`, `destructive action`, `semantic intent icon` |
|
|
84
84
|
| `intents` | `default`, `warning`, `danger` |
|
|
85
85
|
| `sizes` | `sm`, `default`, `lg` |
|
|
86
|
-
| `tokens` | `--bh-alert-dialog-border`, `--bh-alert-dialog-width`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-warning-default`, `--bh-icon-stroke-200`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--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-heading-sm-semibold-font-size`, `--bh-text-heading-sm-semibold-font-weight`, `--bh-text-heading-sm-semibold-letter-spacing`, `--bh-text-heading-sm-semibold-line-height`, `--bh-z-overlay`, `--
|
|
86
|
+
| `tokens` | `--bh-alert-dialog-border`, `--bh-alert-dialog-width`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-warning-default`, `--bh-icon-stroke-200`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--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-heading-sm-semibold-font-size`, `--bh-text-heading-sm-semibold-font-weight`, `--bh-text-heading-sm-semibold-letter-spacing`, `--bh-text-heading-sm-semibold-line-height`, `--bh-z-overlay`, `--elevation-06`, `--elevation-modal` |
|
|
87
87
|
<!-- registry-contract:end -->
|
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
# Alert
|
|
2
|
-
|
|
3
|
-
`Alert` presents contextual feedback with compact and expandable layouts.
|
|
4
|
-
|
|
5
|
-
Figma reference: `Design system 3.0 Copy / Alert`, node `158:4645`.
|
|
6
|
-
|
|
7
|
-
## Variants
|
|
8
|
-
|
|
9
|
-
The implementation covers the Alert matrix from Figma:
|
|
10
|
-
|
|
11
|
-
| Prop | Values |
|
|
12
|
-
| --- | --- |
|
|
13
|
-
| `status` | `danger`, `success`, `warning`, `info`, `neutral` |
|
|
14
|
-
| `isExpandable` | `false`, `true` |
|
|
15
|
-
| `dir` | `ltr`, `rtl` |
|
|
16
|
-
|
|
17
|
-
## API
|
|
18
|
-
|
|
19
|
-
```tsx
|
|
20
|
-
<Alert status="danger" title="Unable to save" />
|
|
21
|
-
<Alert
|
|
22
|
-
actions={[{ label: "عرض التفاصيل", onClick: openDetails }]}
|
|
23
|
-
status="success"
|
|
24
|
-
isExpandable
|
|
25
|
-
dir="rtl"
|
|
26
|
-
title="تم الحفظ"
|
|
27
|
-
/>
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
| Prop | Default |
|
|
31
|
-
| --- | --- |
|
|
32
|
-
| `status` | `neutral` |
|
|
33
|
-
| `isExpandable` | `false`; requires at least one visible action |
|
|
34
|
-
| `dir` | inherited |
|
|
35
|
-
| `title` | none |
|
|
36
|
-
| `description` | none |
|
|
37
|
-
| `messages` | English close-button message; accepts partial localized overrides |
|
|
38
|
-
| `closeLabel` | overrides `messages.close` |
|
|
39
|
-
| `actions` | none |
|
|
40
|
-
| `showActions` | auto when actions exist |
|
|
41
|
-
| `showCloseButton` | auto when `onClose` exists |
|
|
42
|
-
| `onClose` | none |
|
|
43
|
-
|
|
44
|
-
## Pixel Rules
|
|
45
|
-
|
|
46
|
-
- Compact alerts are `470px` wide and `56px` tall with `16px` padding.
|
|
47
|
-
- Expandable alerts are `500px` wide, content-sized, and use `20px 16px` padding.
|
|
48
|
-
- `isExpandable` falls back to the compact layout when no action is visible.
|
|
49
|
-
- Compact rows use `8px` radius; expandable rows use `10px` radius.
|
|
50
|
-
- Status glyphs are `18px` in `20px` slots; close controls are `20px` with a `16px` close glyph.
|
|
51
|
-
- Compact content uses `8px` between icon and title.
|
|
52
|
-
- Expanded titles align to the block-start edge of the status icon.
|
|
53
|
-
- Expandable content uses `12px` between icon, copy, close, and action rows.
|
|
54
|
-
- The description-to-actions gap remains exactly `12px` as copy wraps.
|
|
55
|
-
- Expanded action rows retain `20px` of block-end padding.
|
|
56
|
-
- Expanded height grows with title and description content; direction does not select a height.
|
|
57
|
-
- Titles use `15px / 24px` medium text.
|
|
58
|
-
- Descriptions use `14px / 20px` regular text at `80%` opacity.
|
|
59
|
-
|
|
60
|
-
## Token Contract
|
|
61
|
-
|
|
62
|
-
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.
|
|
63
|
-
|
|
64
|
-
- Backgrounds: `--bh-bg-danger-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`
|
|
65
|
-
- Borders: `--bh-border-danger-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-default`
|
|
66
|
-
- Content: `--bh-content-danger-strong`, `--bh-content-success-strong`, `--bh-content-warning-strong`, `--bh-content-brand-strong`, `--bh-content-default`
|
|
67
|
-
- Shape: `--bh-radius-lg-8`, `--bh-radius-xl-10`, `--bh-radius-full`
|
|
68
|
-
- Space: `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-space-4xl-20`
|
|
69
|
-
|
|
70
|
-
## Accessibility
|
|
71
|
-
|
|
72
|
-
- The close affordance is a real button.
|
|
73
|
-
- Action links are rendered as real buttons to support product actions.
|
|
74
|
-
- Warning and danger use `role="alert"`; other statuses use `role="status"` unless overridden.
|
|
75
|
-
- `dir` inherits by default and controls visual and reading direction only.
|
|
76
|
-
- The close button keeps its English default under RTL. Pass `closeLabel` or `messages` for localized accessibility copy.
|
|
77
|
-
- Product copy and action behavior are always explicit; the component does not ship demo text or no-op controls.
|
|
78
|
-
|
|
79
|
-
## Install
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
npx banhaten add alert
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Examples
|
|
86
|
-
|
|
87
|
-
Primary registry example: `examples/alert-demo.tsx`.
|
|
88
|
-
|
|
89
|
-
Open the live component page or run `npx banhaten docs alert` to inspect source files, install command, and examples.
|
|
90
|
-
|
|
91
|
-
## RTL Rules
|
|
92
|
-
|
|
93
|
-
- `inheritsDirection`: true
|
|
94
|
-
- `messages`: Direction does not select the close-button language. Pass closeLabel or messages explicitly.
|
|
95
|
-
- `textAlignment`: Uses dir="auto" on title and description while the root dir prop mirrors icon, action, and close placement.
|
|
96
|
-
- `spacing`: Uses flexbox, gap, and logical direction so compact and expandable RTL layouts match the Figma matrix.
|
|
97
|
-
|
|
1
|
+
# Alert
|
|
2
|
+
|
|
3
|
+
`Alert` presents contextual feedback with compact and expandable layouts.
|
|
4
|
+
|
|
5
|
+
Figma reference: `Design system 3.0 Copy / Alert`, node `158:4645`.
|
|
6
|
+
|
|
7
|
+
## Variants
|
|
8
|
+
|
|
9
|
+
The implementation covers the Alert matrix from Figma:
|
|
10
|
+
|
|
11
|
+
| Prop | Values |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `status` | `danger`, `success`, `warning`, `info`, `neutral` |
|
|
14
|
+
| `isExpandable` | `false`, `true` |
|
|
15
|
+
| `dir` | `ltr`, `rtl` |
|
|
16
|
+
|
|
17
|
+
## API
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
<Alert status="danger" title="Unable to save" />
|
|
21
|
+
<Alert
|
|
22
|
+
actions={[{ label: "عرض التفاصيل", onClick: openDetails }]}
|
|
23
|
+
status="success"
|
|
24
|
+
isExpandable
|
|
25
|
+
dir="rtl"
|
|
26
|
+
title="تم الحفظ"
|
|
27
|
+
/>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Prop | Default |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `status` | `neutral` |
|
|
33
|
+
| `isExpandable` | `false`; requires at least one visible action |
|
|
34
|
+
| `dir` | inherited |
|
|
35
|
+
| `title` | none |
|
|
36
|
+
| `description` | none |
|
|
37
|
+
| `messages` | English close-button message; accepts partial localized overrides |
|
|
38
|
+
| `closeLabel` | overrides `messages.close` |
|
|
39
|
+
| `actions` | none |
|
|
40
|
+
| `showActions` | auto when actions exist |
|
|
41
|
+
| `showCloseButton` | auto when `onClose` exists |
|
|
42
|
+
| `onClose` | none |
|
|
43
|
+
|
|
44
|
+
## Pixel Rules
|
|
45
|
+
|
|
46
|
+
- Compact alerts are `470px` wide and `56px` tall with `16px` padding.
|
|
47
|
+
- Expandable alerts are `500px` wide, content-sized, and use `20px 16px` padding.
|
|
48
|
+
- `isExpandable` falls back to the compact layout when no action is visible.
|
|
49
|
+
- Compact rows use `8px` radius; expandable rows use `10px` radius.
|
|
50
|
+
- Status glyphs are `18px` in `20px` slots; close controls are `20px` with a `16px` close glyph.
|
|
51
|
+
- Compact content uses `8px` between icon and title.
|
|
52
|
+
- Expanded titles align to the block-start edge of the status icon.
|
|
53
|
+
- Expandable content uses `12px` between icon, copy, close, and action rows.
|
|
54
|
+
- The description-to-actions gap remains exactly `12px` as copy wraps.
|
|
55
|
+
- Expanded action rows retain `20px` of block-end padding.
|
|
56
|
+
- Expanded height grows with title and description content; direction does not select a height.
|
|
57
|
+
- Titles use `15px / 24px` medium text.
|
|
58
|
+
- Descriptions use `14px / 20px` regular text at `80%` opacity.
|
|
59
|
+
|
|
60
|
+
## Token Contract
|
|
61
|
+
|
|
62
|
+
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.
|
|
63
|
+
|
|
64
|
+
- Backgrounds: `--bh-bg-danger-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`
|
|
65
|
+
- Borders: `--bh-border-danger-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-default`
|
|
66
|
+
- Content: `--bh-content-danger-strong`, `--bh-content-success-strong`, `--bh-content-warning-strong`, `--bh-content-brand-strong`, `--bh-content-default`
|
|
67
|
+
- Shape: `--bh-radius-lg-8`, `--bh-radius-xl-10`, `--bh-radius-full`
|
|
68
|
+
- Space: `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-space-4xl-20`
|
|
69
|
+
|
|
70
|
+
## Accessibility
|
|
71
|
+
|
|
72
|
+
- The close affordance is a real button.
|
|
73
|
+
- Action links are rendered as real buttons to support product actions.
|
|
74
|
+
- Warning and danger use `role="alert"`; other statuses use `role="status"` unless overridden.
|
|
75
|
+
- `dir` inherits by default and controls visual and reading direction only.
|
|
76
|
+
- The close button keeps its English default under RTL. Pass `closeLabel` or `messages` for localized accessibility copy.
|
|
77
|
+
- Product copy and action behavior are always explicit; the component does not ship demo text or no-op controls.
|
|
78
|
+
|
|
79
|
+
## Install
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx banhaten add alert
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Examples
|
|
86
|
+
|
|
87
|
+
Primary registry example: `examples/alert-demo.tsx`.
|
|
88
|
+
|
|
89
|
+
Open the live component page or run `npx banhaten docs alert` to inspect source files, install command, and examples.
|
|
90
|
+
|
|
91
|
+
## RTL Rules
|
|
92
|
+
|
|
93
|
+
- `inheritsDirection`: true
|
|
94
|
+
- `messages`: Direction does not select the close-button language. Pass closeLabel or messages explicitly.
|
|
95
|
+
- `textAlignment`: Uses dir="auto" on title and description while the root dir prop mirrors icon, action, and close placement.
|
|
96
|
+
- `spacing`: Uses flexbox, gap, and logical direction so compact and expandable RTL layouts match the Figma matrix.
|
|
97
|
+
|
|
98
98
|
<!-- registry-contract:start -->
|
|
99
99
|
## Registry Contract
|
|
100
100
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Approval Card
|
|
2
|
+
|
|
3
|
+
Approval cards pause the agent for a human decision. `ApprovalQuestions` walks through up to a few single-choice questions with a free-text "Something else" option, `ApprovalCommand` asks to run a shell command, and `ApprovalPlan` presents a short plan as a pending to-do list with an optional auto-approve countdown. All three compose `ApprovalFrame`, the shared shell: a tinted icon header, the body, and an action row. Compose it yourself for another kind of decision.
|
|
4
|
+
|
|
5
|
+
Questions slide vertically inside a viewport sized to the active one, step badges and countdown seconds roll their digits, and the plan composes Task List parts: a well root, a static header with the step count, and a preview fold.
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import {
|
|
11
|
+
ApprovalCommand,
|
|
12
|
+
ApprovalPlan,
|
|
13
|
+
ApprovalQuestions,
|
|
14
|
+
} from "@/components/ui/approval-card"
|
|
15
|
+
|
|
16
|
+
<ApprovalQuestions
|
|
17
|
+
onApprove={({ answers }) => submit(answers)}
|
|
18
|
+
onReject={skip}
|
|
19
|
+
questions={questions}
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
<ApprovalCommand command="pnpm db:migrate && pnpm build" cwd="~/acme" onApprove={run} onReject={skip} />
|
|
23
|
+
|
|
24
|
+
<ApprovalPlan onApprove={({ source }) => approve(source)} onViewPlan={openPlan} plan={plan} planTitle="Session auth migration" />
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Every card also takes `title` and `approveLabel`, each with its own default, plus native `div` props.
|
|
28
|
+
|
|
29
|
+
### ApprovalQuestions
|
|
30
|
+
|
|
31
|
+
| Prop | Type | Default | Description |
|
|
32
|
+
| --- | --- | --- | --- |
|
|
33
|
+
| `questions` | `readonly ApprovalQuestion[]` | – | `{ id, prompt, options }` answered one at a time. |
|
|
34
|
+
| `onApprove` | `(payload: { answers }) => void` | – | Fires once every question has an answer. |
|
|
35
|
+
| `onReject` / `rejectLabel` | `() => void` / `string` | – / `"Skip"` | The skip action. |
|
|
36
|
+
| `labels` | `Partial<ApprovalQuestionsLabels>` | English | Navigation and free-text copy. |
|
|
37
|
+
|
|
38
|
+
### ApprovalCommand
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| `command` / `cwd` | `string` | – | Command block content and the working directory above it. |
|
|
43
|
+
| `onApprove` / `onReject` | `() => void` | – | Run and Skip actions. |
|
|
44
|
+
| `rejectLabel` | `string` | `"Skip"` | Skip action copy. |
|
|
45
|
+
|
|
46
|
+
### ApprovalPlan
|
|
47
|
+
|
|
48
|
+
| Prop | Type | Default | Description |
|
|
49
|
+
| --- | --- | --- | --- |
|
|
50
|
+
| `plan` | `readonly ApprovalPlanStep[]` | – | Steps as `{ id, title }`, shown as pending to-do rows. Keep step details for the full plan that `onViewPlan` opens. |
|
|
51
|
+
| `planTitle` / `planSummary` | `React.ReactNode` | – | Intro copy above the steps. |
|
|
52
|
+
| `planPreviewCount` | `number` | `3` | Steps shown before the "more" fold. |
|
|
53
|
+
| `autoApproveSeconds` | `number` | `0` | Opt-in countdown. At zero `onApprove` fires with `source: "timeout"`; choosing either action cancels it, and a new value restarts it. |
|
|
54
|
+
| `onApprove` | `(payload: { source }) => void` | – | `source` is `"user"` for a click or `"timeout"` for the countdown. |
|
|
55
|
+
| `onViewPlan` / `viewPlanLabel` | `() => void` / `string` | – / `"View plan"` | Secondary action that opens the full plan. |
|
|
56
|
+
| `onDownload` / `onExpand` | `() => void` | – | Adds header actions. |
|
|
57
|
+
| `labels` | `Partial<ApprovalPlanLabels>` | English | Countdown, fold, and header action copy. |
|
|
58
|
+
|
|
59
|
+
### ApprovalFrame
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import { ApprovalFrame } from "@/components/ui/approval-card"
|
|
63
|
+
|
|
64
|
+
<ApprovalFrame
|
|
65
|
+
approveLabel="Apply"
|
|
66
|
+
icon={<GitCompareIcon />}
|
|
67
|
+
onApprove={apply}
|
|
68
|
+
onSecondary={review}
|
|
69
|
+
secondaryLabel="Review"
|
|
70
|
+
title="Apply this change?"
|
|
71
|
+
tone="warning"
|
|
72
|
+
>
|
|
73
|
+
<DiffSummary files={files} />
|
|
74
|
+
</ApprovalFrame>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
| Prop | Type | Default | Description |
|
|
78
|
+
| --- | --- | --- | --- |
|
|
79
|
+
| `icon` / `tone` | `React.ReactNode` / `"info" \| "warning" \| "success"` | – | Header glyph in a tile tinted by `tone`; the tile sets the glyph's size and stroke. The ready-made cards use info for questions, warning for commands, and success for plans. |
|
|
80
|
+
| `title` | `React.ReactNode` | – | Header copy. |
|
|
81
|
+
| `approveLabel` / `onApprove` / `approveDisabled` | `string` / `() => void` / `boolean` | – / – / `false` | Primary action, disabled until the decision is complete. |
|
|
82
|
+
| `secondaryLabel` / `onSecondary` | `string` / `() => void` | – | Secondary action. |
|
|
83
|
+
| `headerActions` / `footerStart` | `React.ReactNode` | – | Controls at the end of the header, and content at the start of the action row. |
|
|
84
|
+
|
|
85
|
+
## Install
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npx banhaten add approval-card
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Examples
|
|
92
|
+
|
|
93
|
+
Primary registry example: `examples/approval-card-demo.tsx`.
|
|
94
|
+
|
|
95
|
+
## Token Contract
|
|
96
|
+
|
|
97
|
+
The card uses `--bh-bg-raised`, `--bh-radius-2xl-12`, `--elevation-02`, and `--bh-space-xl-12` padding. Icon tiles map the info, warning, and success tones to `--bh-bg-info-subtle`, `--bh-bg-warning-subtle`, and `--bh-bg-success-subtle` with the matching content tokens, and stroke their glyph with `--bh-icon-stroke-200`. Options use `--bh-border-subtle`, `--bh-radius-lg-8`, and lift to `--elevation-02` when selected while their Kbd fills with `--bh-bg-inverse`. The command block uses `--bh-font-family-mono` on `--bh-bg-subtle`. Slides and fades use the `--bh-duration-slow` and `--bh-duration-moderate` foundation tokens with `--bh-easing-emphasized`. The countdown ring drains linearly over each one-second tick, and the countdown unmounts when its fade ends.
|
|
98
|
+
|
|
99
|
+
Covered source files: `components/approval-card.tsx`, the internal `components/approval-frame.tsx` and `components/approval-questions.tsx`, `components/approval-card.css`, and the `button`, `kbd`, `rolling-count`, `task-list`, and `tooltip` registry dependencies.
|
|
100
|
+
|
|
101
|
+
## RTL Rules
|
|
102
|
+
|
|
103
|
+
- Header, options, and actions inherit direction and use logical alignment.
|
|
104
|
+
- The command block and working directory stay LTR; the submit arrow mirrors.
|
|
105
|
+
|
|
106
|
+
## Accessibility
|
|
107
|
+
|
|
108
|
+
In `ApprovalQuestions`, each question is a group of native radio inputs labelled by its prompt: Tab reaches the group once, arrow keys move the choice without skipping ahead, the letter shown on each option picks it, and Enter confirms the answer. "Something else" is its own radio next to the text field, and Enter in the field commits the typed answer unless it is confirming an IME composition; inactive questions are hidden from assistive technology and removed from the tab order. Enter on the last answered question approves. The previous and next controls form a group named by `questionOf`, such as "Question 2 of 3". The countdown is a polite live region whose ring is also a labelled cancel button with a Tooltip. Slides, rolls, and fades collapse to instant changes under `prefers-reduced-motion`.
|
|
109
|
+
|
|
110
|
+
<!-- registry-contract:start -->
|
|
111
|
+
## Registry Contract
|
|
112
|
+
|
|
113
|
+
This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
|
|
114
|
+
`supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
|
|
115
|
+
|
|
116
|
+
| Field | Values |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| `supportedExports` | `components/approval-card.tsx: ApprovalCommand, ApprovalFrame, ApprovalPlan, ApprovalQuestions` |
|
|
119
|
+
| `parts` | `ApprovalQuestions`, `ApprovalCommand`, `ApprovalPlan`, `ApprovalFrame` |
|
|
120
|
+
| `registryDependencies` | `button`, `kbd`, `rolling-count`, `task-list`, `tooltip` |
|
|
121
|
+
| `props.questions` | `readonly ApprovalQuestion[]; default null; ApprovalQuestions: single-choice questions, each with a free-text Something else option.` |
|
|
122
|
+
| `props.command` | `string; default null; ApprovalCommand: shell command shown in the mono block.` |
|
|
123
|
+
| `props.cwd` | `string; default null; ApprovalCommand: working directory shown above the command.` |
|
|
124
|
+
| `props.plan` | `readonly ApprovalPlanStep[]; default null; ApprovalPlan: steps with an id and a title, rendered as a pending to-do list. Step details belong in the full plan.` |
|
|
125
|
+
| `props.planPreviewCount` | `number; default "3"; ApprovalPlan: steps shown before the more fold.` |
|
|
126
|
+
| `props.autoApproveSeconds` | `number; default "0"; ApprovalPlan: opt-in countdown; at zero onApprove fires with source timeout. Either action cancels it. A new value restarts it.` |
|
|
127
|
+
| `props.icon` | `React.ReactNode; default null; ApprovalFrame: header glyph, sized and stroked by the tinted icon tile.` |
|
|
128
|
+
| `props.tone` | `"info" \| "warning" \| "success"; default null; ApprovalFrame: tint of the icon tile. Questions use info, commands warning, and plans success.` |
|
|
129
|
+
| `props.onApprove` | `callback; default null; Primary action. ApprovalQuestions passes { answers }, ApprovalPlan passes { source: user \| timeout }, and ApprovalCommand passes nothing.` |
|
|
130
|
+
| `props.onReject` | `() => void; default null; Skip action on ApprovalQuestions and ApprovalCommand.` |
|
|
131
|
+
| `props.onViewPlan` | `() => void; default null; ApprovalPlan secondary action that opens the full plan; it also stops the countdown.` |
|
|
132
|
+
| `props.labels` | `Partial<ApprovalQuestionsLabels> \| Partial<ApprovalPlanLabels>; default "English"; Localized navigation, countdown, and helper copy for the card that uses them.` |
|
|
133
|
+
| `tokens` | `--bh-bg-info-subtle`, `--bh-bg-inverse`, `--bh-bg-raised`, `--bh-bg-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-information-default`, `--bh-content-inverse`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-warning-default`, `--bh-duration-default`, `--bh-duration-fast`, `--bh-duration-moderate`, `--bh-duration-slow`, `--bh-easing-emphasized`, `--bh-easing-standard`, `--bh-font-family`, `--bh-font-family-mono`, `--bh-icon-stroke-180`, `--bh-icon-stroke-200`, `--bh-icon-stroke-250`, `--bh-opacity-0`, `--bh-opacity-100`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--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-space-xxxs-1`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-regular-font-size`, `--bh-text-body-3xs-regular-line-height`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--elevation-02`, `--elevation-component-focus-ring` |
|
|
134
|
+
<!-- registry-contract:end -->
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# Aspect Ratio
|
|
2
|
-
|
|
3
|
-
Aspect Ratio wraps Radix AspectRatio for fixed-format media, screenshots, and preview surfaces.
|
|
4
|
-
|
|
5
|
-
## API
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
<AspectRatio ratio={16 / 9}>
|
|
9
|
-
<img src="/preview.png" alt="Preview" />
|
|
10
|
-
</AspectRatio>
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
| Prop | Values |
|
|
14
|
-
| --- | --- |
|
|
15
|
-
| `ratio` | any positive number |
|
|
16
|
-
|
|
17
|
-
## Token Contract
|
|
18
|
-
|
|
19
|
-
Aspect Ratio uses Banhaten neutral background and radius tokens by default.
|
|
20
|
-
|
|
21
|
-
## RTL
|
|
22
|
-
|
|
23
|
-
Aspect Ratio is direction-neutral.
|
|
24
|
-
|
|
25
|
-
## Accessibility
|
|
26
|
-
|
|
27
|
-
Provide accessible names for media rendered inside the ratio box.
|
|
28
|
-
|
|
29
|
-
## Install
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
npx banhaten add aspect-ratio
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Examples
|
|
36
|
-
|
|
37
|
-
Primary registry example: `examples/aspect-ratio-demo.tsx`.
|
|
38
|
-
|
|
39
|
-
Open the live component page or run `npx banhaten docs aspect-ratio` to inspect source files, install command, and examples.
|
|
40
|
-
|
|
41
|
-
## RTL Rules
|
|
42
|
-
|
|
43
|
-
- `inheritsDirection`: false
|
|
44
|
-
- `geometry`: Aspect Ratio controls media geometry and does not alter text direction.
|
|
45
|
-
|
|
1
|
+
# Aspect Ratio
|
|
2
|
+
|
|
3
|
+
Aspect Ratio wraps Radix AspectRatio for fixed-format media, screenshots, and preview surfaces.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<AspectRatio ratio={16 / 9}>
|
|
9
|
+
<img src="/preview.png" alt="Preview" />
|
|
10
|
+
</AspectRatio>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
| Prop | Values |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `ratio` | any positive number |
|
|
16
|
+
|
|
17
|
+
## Token Contract
|
|
18
|
+
|
|
19
|
+
Aspect Ratio uses Banhaten neutral background and radius tokens by default.
|
|
20
|
+
|
|
21
|
+
## RTL
|
|
22
|
+
|
|
23
|
+
Aspect Ratio is direction-neutral.
|
|
24
|
+
|
|
25
|
+
## Accessibility
|
|
26
|
+
|
|
27
|
+
Provide accessible names for media rendered inside the ratio box.
|
|
28
|
+
|
|
29
|
+
## Install
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx banhaten add aspect-ratio
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Examples
|
|
36
|
+
|
|
37
|
+
Primary registry example: `examples/aspect-ratio-demo.tsx`.
|
|
38
|
+
|
|
39
|
+
Open the live component page or run `npx banhaten docs aspect-ratio` to inspect source files, install command, and examples.
|
|
40
|
+
|
|
41
|
+
## RTL Rules
|
|
42
|
+
|
|
43
|
+
- `inheritsDirection`: false
|
|
44
|
+
- `geometry`: Aspect Ratio controls media geometry and does not alter text direction.
|
|
45
|
+
|
|
46
46
|
<!-- registry-contract:start -->
|
|
47
47
|
## Registry Contract
|
|
48
48
|
|