banhaten 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +139 -73
- package/CONTRIBUTING.md +46 -44
- package/README.md +192 -190
- package/SECURITY.md +15 -15
- package/banhaten.config.example.json +11 -11
- package/docs/design-spacing.md +13 -0
- package/docs/design-system/README.md +22 -20
- package/docs/design-system/adoption-quality-remediation.md +87 -87
- package/docs/design-system/agent-usage.md +13 -13
- package/docs/design-system/appearance-presets.md +189 -189
- package/docs/design-system/appearances/default.md +94 -94
- package/docs/design-system/appearances/rounded.md +95 -95
- package/docs/design-system/appearances/sharp.md +95 -95
- package/docs/design-system/component-docs-pattern.md +81 -81
- package/docs/design-system/component-implementation-ownership-audit.md +245 -244
- package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
- package/docs/design-system/component-showcase-consistency-report.md +219 -219
- package/docs/design-system/component-token-consistency-audit.md +173 -173
- package/docs/design-system/components/README.md +90 -76
- package/docs/design-system/components/accordion.md +53 -53
- package/docs/design-system/components/activity-feed.md +94 -94
- package/docs/design-system/components/activity-heatmap.md +57 -57
- package/docs/design-system/components/agent-input.md +85 -0
- package/docs/design-system/components/alert-dialog.md +72 -72
- package/docs/design-system/components/alert.md +98 -98
- package/docs/design-system/components/approval-card.md +134 -0
- package/docs/design-system/components/aspect-ratio.md +45 -45
- package/docs/design-system/components/attribute.md +89 -89
- package/docs/design-system/components/autocomplete.md +75 -75
- package/docs/design-system/components/avatar.md +54 -54
- package/docs/design-system/components/badge.md +54 -54
- package/docs/design-system/components/banner.md +87 -87
- package/docs/design-system/components/breadcrumbs.md +177 -176
- package/docs/design-system/components/button-group.md +98 -98
- package/docs/design-system/components/button.md +83 -80
- package/docs/design-system/components/card.md +88 -88
- package/docs/design-system/components/carousel.md +46 -46
- package/docs/design-system/components/catalog-components.md +47 -47
- package/docs/design-system/components/chart.md +95 -24
- package/docs/design-system/components/checkbox.md +54 -54
- package/docs/design-system/components/collapsible.md +67 -53
- package/docs/design-system/components/command.md +62 -62
- package/docs/design-system/components/context-menu.md +46 -46
- package/docs/design-system/components/date-picker.md +81 -79
- package/docs/design-system/components/divider.md +102 -102
- package/docs/design-system/components/empty-state.md +56 -56
- package/docs/design-system/components/field.md +70 -70
- package/docs/design-system/components/file-upload.md +187 -187
- package/docs/design-system/components/hover-card.md +48 -48
- package/docs/design-system/components/icons.md +48 -48
- package/docs/design-system/components/inline-citations.md +93 -0
- package/docs/design-system/components/input-group.md +58 -58
- package/docs/design-system/components/input-otp.md +56 -56
- package/docs/design-system/components/input.md +117 -61
- package/docs/design-system/components/item.md +59 -57
- package/docs/design-system/components/kbd.md +54 -49
- package/docs/design-system/components/label.md +49 -49
- package/docs/design-system/components/menu.md +71 -61
- package/docs/design-system/components/menubar.md +47 -47
- package/docs/design-system/components/modal.md +105 -105
- package/docs/design-system/components/native-select.md +54 -54
- package/docs/design-system/components/navigation-menu.md +50 -50
- package/docs/design-system/components/onboarding-step-list-item.md +82 -82
- package/docs/design-system/components/page-header.md +93 -86
- package/docs/design-system/components/pagination.md +57 -57
- package/docs/design-system/components/popover.md +60 -60
- package/docs/design-system/components/progress-slider.md +50 -50
- package/docs/design-system/components/progress.md +76 -76
- package/docs/design-system/components/radio-card.md +51 -51
- package/docs/design-system/components/radio-group.md +57 -57
- package/docs/design-system/components/resizable.md +44 -44
- package/docs/design-system/components/rolling-count.md +61 -0
- package/docs/design-system/components/scroll-area.md +51 -51
- package/docs/design-system/components/segmented-control.md +54 -54
- package/docs/design-system/components/select.md +68 -62
- package/docs/design-system/components/sheet.md +67 -67
- package/docs/design-system/components/shimmer-text.md +67 -0
- package/docs/design-system/components/sidebar.md +127 -76
- package/docs/design-system/components/skeleton.md +75 -75
- package/docs/design-system/components/slideout.md +65 -65
- package/docs/design-system/components/slider.md +63 -63
- package/docs/design-system/components/social-button.md +50 -50
- package/docs/design-system/components/spinner.md +62 -62
- package/docs/design-system/components/steps.md +65 -65
- package/docs/design-system/components/streaming-text.md +82 -0
- package/docs/design-system/components/table.md +419 -414
- package/docs/design-system/components/tabs.md +59 -55
- package/docs/design-system/components/tag.md +80 -80
- package/docs/design-system/components/task-list.md +95 -0
- package/docs/design-system/components/textarea.md +50 -50
- package/docs/design-system/components/thinking-reasoning.md +72 -0
- package/docs/design-system/components/thinking-state.md +67 -0
- package/docs/design-system/components/timeline.md +83 -83
- package/docs/design-system/components/toast.md +58 -58
- package/docs/design-system/components/toggle.md +81 -81
- package/docs/design-system/components/toolbar.md +92 -87
- package/docs/design-system/components/tooltip.md +94 -92
- package/docs/design-system/components/typography.md +18 -18
- package/docs/design-system/density-and-elevation.md +65 -61
- package/docs/design-system/design-system-test-missing-items.md +368 -368
- package/docs/design-system/direction-and-localization.md +23 -23
- package/docs/design-system/form-recipes.md +73 -73
- package/docs/design-system/gap-promotion-policy.md +21 -21
- package/docs/design-system/icons.md +74 -69
- package/docs/design-system/installation.md +70 -68
- package/docs/design-system/launch-comparison-shadcn.md +98 -98
- package/docs/design-system/registry-and-cli.md +64 -64
- package/docs/design-system/release-policy.md +30 -30
- package/docs/design-system/roadmap.md +14 -14
- package/docs/design-system/support-matrix.md +23 -23
- package/docs/design-system/tabs.md +54 -53
- package/docs/design-system/template-gap-audit.md +32 -0
- package/docs/design-system/templates.md +59 -0
- package/docs/design-system/token-governance.md +72 -60
- package/package.json +98 -98
- package/registry/component-contract.json +40 -40
- package/registry/components/accordion.tsx +155 -155
- package/registry/components/agent-input-parts.tsx +552 -0
- package/registry/components/agent-input-state.ts +156 -0
- package/registry/components/agent-input.css +307 -0
- package/registry/components/agent-input.tsx +382 -0
- package/registry/components/alert-dialog.tsx +297 -297
- package/registry/components/alert.tsx +293 -293
- package/registry/components/approval-card.css +409 -0
- package/registry/components/approval-card.tsx +401 -0
- package/registry/components/approval-frame.tsx +108 -0
- package/registry/components/approval-questions.tsx +559 -0
- package/registry/components/aspect-ratio.tsx +30 -30
- package/registry/components/attribute.tsx +454 -448
- package/registry/components/autocomplete.tsx +598 -651
- package/registry/components/avatar.tsx +385 -381
- package/registry/components/badge.tsx +629 -629
- package/registry/components/button-group.tsx +565 -565
- package/registry/components/button.tsx +127 -123
- package/registry/components/card.tsx +638 -638
- package/registry/components/carousel.tsx +296 -296
- package/registry/components/chart-block-data.ts +177 -0
- package/registry/components/chart-block.css +171 -0
- package/registry/components/chart-block.tsx +260 -0
- package/registry/components/chart-interactions.ts +123 -0
- package/registry/components/chart-options.cartesian.ts +162 -0
- package/registry/components/chart-options.paint.ts +99 -0
- package/registry/components/chart-options.parts.ts +72 -0
- package/registry/components/chart-options.radial.ts +109 -0
- package/registry/components/chart-options.ts +44 -0
- package/registry/components/chart-options.types.ts +67 -0
- package/registry/components/chart.tsx +203 -203
- package/registry/components/checkbox.tsx +247 -247
- package/registry/components/collapsible.tsx +109 -69
- package/registry/components/command.tsx +208 -208
- package/registry/components/context-menu.tsx +236 -236
- package/registry/components/data-chart.tsx +40 -0
- package/registry/components/date-picker.tsx +1289 -1277
- package/registry/components/echart-theme.ts +246 -0
- package/registry/components/echart.css +49 -0
- package/registry/components/echart.tsx +178 -0
- package/registry/components/expanded/ActivityFeed.tsx +227 -227
- package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
- package/registry/components/expanded/Banner.tsx +179 -179
- package/registry/components/expanded/Breadcrumbs.tsx +131 -131
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
- package/registry/components/expanded/CatalogDivider.tsx +49 -49
- package/registry/components/expanded/EmptyState.tsx +155 -155
- package/registry/components/expanded/FileUpload.tsx +543 -543
- package/registry/components/expanded/OnboardingStepListItem.tsx +60 -59
- package/registry/components/expanded/PageHeader.tsx +179 -166
- package/registry/components/expanded/Slideout.tsx +108 -108
- package/registry/components/expanded/Steps.tsx +402 -402
- package/registry/components/expanded/Table.tsx +1092 -1071
- package/registry/components/expanded/Timeline.tsx +203 -203
- package/registry/components/expanded/activityFeed.css +248 -248
- package/registry/components/expanded/activityHeatmap.css +66 -66
- package/registry/components/expanded/banner.css +260 -255
- package/registry/components/expanded/breadcrumbs.css +140 -140
- package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
- package/registry/components/expanded/divider.css +75 -75
- package/registry/components/expanded/emptyState.css +111 -111
- package/registry/components/expanded/fileUpload.css +457 -457
- package/registry/components/expanded/onboardingStepListItem.css +135 -126
- package/registry/components/expanded/pageHeader.css +248 -290
- package/registry/components/expanded/slideout.css +276 -276
- package/registry/components/expanded/steps.css +356 -356
- package/registry/components/expanded/table.css +606 -603
- package/registry/components/expanded/timeline.css +286 -286
- package/registry/components/field.tsx +283 -283
- package/registry/components/hover-card.tsx +48 -48
- package/registry/components/inline-citations.css +126 -0
- package/registry/components/inline-citations.tsx +292 -0
- package/registry/components/input-content.ts +107 -107
- package/registry/components/input-group.tsx +130 -130
- package/registry/components/input-otp.tsx +584 -584
- package/registry/components/input.tsx +990 -972
- package/registry/components/item.tsx +189 -189
- package/registry/components/kbd.tsx +246 -151
- package/registry/components/label.tsx +78 -78
- package/registry/components/menu.tsx +978 -986
- package/registry/components/menubar.tsx +226 -226
- package/registry/components/modal.tsx +872 -872
- package/registry/components/native-select.tsx +205 -205
- package/registry/components/navigation-menu.tsx +171 -171
- package/registry/components/pagination.css +36 -36
- package/registry/components/pagination.tsx +560 -555
- package/registry/components/popover.tsx +338 -338
- package/registry/components/progress-slider.tsx +216 -216
- package/registry/components/radio-card.tsx +676 -677
- package/registry/components/radio-group.tsx +570 -570
- package/registry/components/resizable.tsx +108 -108
- package/registry/components/rolling-count.css +37 -0
- package/registry/components/rolling-count.tsx +110 -0
- package/registry/components/scroll-area.tsx +91 -91
- package/registry/components/segmented-control.tsx +87 -87
- package/registry/components/select-content.tsx +218 -218
- package/registry/components/select.tsx +937 -932
- package/registry/components/sheet.tsx +305 -305
- package/registry/components/shimmer-text.css +69 -0
- package/registry/components/shimmer-text.tsx +43 -0
- package/registry/components/sidebar.tsx +1433 -358
- package/registry/components/skeleton.css +54 -54
- package/registry/components/skeleton.tsx +482 -482
- package/registry/components/slider.tsx +380 -380
- package/registry/components/social-button.tsx +387 -387
- package/registry/components/spinner.tsx +78 -78
- package/registry/components/streaming-text.css +45 -0
- package/registry/components/streaming-text.tsx +165 -0
- package/registry/components/table-elements.tsx +128 -128
- package/registry/components/tabs.css +222 -218
- package/registry/components/tabs.tsx +241 -241
- package/registry/components/tag.tsx +423 -423
- package/registry/components/task-list.css +328 -0
- package/registry/components/task-list.tsx +429 -0
- package/registry/components/textarea.tsx +610 -610
- package/registry/components/thinking-reasoning.css +178 -0
- package/registry/components/thinking-reasoning.tsx +253 -0
- package/registry/components/thinking-state.css +8 -0
- package/registry/components/thinking-state.tsx +46 -0
- package/registry/components/toast.tsx +136 -136
- package/registry/components/toggle.tsx +256 -256
- package/registry/components/toolbar.tsx +539 -539
- package/registry/components/tooltip.tsx +433 -431
- package/registry/examples/agent-input-demo.tsx +90 -0
- package/registry/examples/alert-demo.tsx +34 -34
- package/registry/examples/alert-dialog-demo.tsx +42 -42
- package/registry/examples/approval-card-demo.tsx +83 -0
- package/registry/examples/aspect-ratio-demo.tsx +11 -11
- package/registry/examples/attribute-demo.tsx +65 -65
- package/registry/examples/autocomplete-demo.tsx +109 -109
- package/registry/examples/avatar-demo.tsx +132 -132
- package/registry/examples/badge-demo.tsx +69 -69
- package/registry/examples/button-demo.tsx +86 -83
- package/registry/examples/button-group-demo.tsx +63 -63
- package/registry/examples/card-demo.tsx +86 -86
- package/registry/examples/carousel-demo.tsx +43 -43
- package/registry/examples/chart-block-demo.tsx +5 -0
- package/registry/examples/chart-demo.tsx +18 -33
- package/registry/examples/checkbox-demo.tsx +62 -62
- package/registry/examples/collapsible-demo.tsx +16 -16
- package/registry/examples/collection-filter-bar-demo.tsx +135 -135
- package/registry/examples/command-demo.tsx +42 -42
- package/registry/examples/command-palette-demo.tsx +235 -236
- package/registry/examples/context-menu-demo.tsx +29 -29
- package/registry/examples/control-density-contract-demo.tsx +65 -61
- package/registry/examples/date-picker-demo.tsx +127 -127
- package/registry/examples/divider-demo.tsx +17 -17
- package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
- package/registry/examples/expanded/banner-demo.tsx +48 -48
- package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
- package/registry/examples/expanded/empty-state-demo.tsx +39 -39
- package/registry/examples/expanded/file-upload-demo.tsx +60 -60
- package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
- package/registry/examples/expanded/slideout-demo.tsx +15 -15
- package/registry/examples/expanded/steps-demo.tsx +29 -29
- package/registry/examples/expanded/tabs-demo.tsx +13 -13
- package/registry/examples/expanded/timeline-demo.tsx +18 -18
- package/registry/examples/field-demo.tsx +51 -51
- package/registry/examples/hover-card-demo.tsx +23 -23
- package/registry/examples/inline-citations-demo.tsx +31 -0
- package/registry/examples/input-actions-demo.tsx +36 -0
- package/registry/examples/input-demo.tsx +87 -87
- package/registry/examples/input-group-demo.tsx +16 -16
- package/registry/examples/input-otp-demo.tsx +72 -72
- package/registry/examples/item-demo.tsx +46 -46
- package/registry/examples/kbd-demo.tsx +12 -11
- package/registry/examples/label-demo.tsx +20 -20
- package/registry/examples/menu-demo.tsx +122 -122
- package/registry/examples/menubar-demo.tsx +34 -34
- package/registry/examples/modal-demo.tsx +74 -74
- package/registry/examples/native-select-demo.tsx +16 -16
- package/registry/examples/navigation-menu-demo.tsx +29 -29
- package/registry/examples/pagination-demo.tsx +20 -20
- package/registry/examples/popover-demo.tsx +547 -546
- package/registry/examples/progress-demo.tsx +37 -37
- package/registry/examples/progress-slider-demo.tsx +29 -29
- package/registry/examples/radio-card-demo.tsx +51 -51
- package/registry/examples/radio-group-demo.tsx +62 -62
- package/registry/examples/resizable-demo.tsx +22 -22
- package/registry/examples/results-toolbar-demo.tsx +44 -44
- package/registry/examples/rolling-count-demo.tsx +39 -0
- package/registry/examples/scroll-area-demo.tsx +15 -15
- package/registry/examples/segmented-control-demo.tsx +39 -39
- package/registry/examples/select-demo.tsx +87 -87
- package/registry/examples/sheet-demo.tsx +47 -47
- package/registry/examples/shimmer-text-demo.tsx +20 -0
- package/registry/examples/sidebar-demo.tsx +101 -57
- package/registry/examples/slider-demo.tsx +31 -31
- package/registry/examples/social-button-demo.tsx +61 -61
- package/registry/examples/spinner-demo.tsx +59 -59
- package/registry/examples/streaming-text-demo.tsx +28 -0
- package/registry/examples/tabs-demo.tsx +13 -13
- package/registry/examples/tag-demo.tsx +29 -29
- package/registry/examples/task-list-demo.tsx +74 -0
- package/registry/examples/textarea-demo.tsx +79 -79
- package/registry/examples/thinking-reasoning-demo.tsx +74 -0
- package/registry/examples/thinking-state-demo.tsx +13 -0
- package/registry/examples/toast-demo.tsx +35 -35
- package/registry/examples/toggle-demo.tsx +59 -59
- package/registry/examples/tooltip-demo.tsx +115 -115
- package/registry/guidance/USAGE.md +27 -27
- package/registry/guidance/charts.LICENSE.txt +24 -0
- package/registry/hooks/use-controllable-state.ts +33 -0
- package/registry/hooks/use-direction.ts +207 -207
- package/registry/hooks/use-listbox-navigation.ts +73 -0
- package/registry/hooks/use-motion-end.ts +55 -0
- package/registry/hooks/use-reduced-motion.ts +28 -0
- package/registry/index.json +1634 -184
- package/registry/styles/globals.css +1462 -1570
- package/registry.json +364 -10
- package/schema/config.schema.json +51 -51
- package/schema/registry.schema.json +194 -190
- package/schema/tokens.schema.json +167 -163
- package/src/cli/command-line.js +194 -194
- package/src/cli/config-editors.js +9 -9
- package/src/cli/doctor.js +399 -399
- package/src/cli/file-transaction.js +302 -295
- package/src/cli/global-css.js +153 -153
- package/src/cli/index.js +1002 -1009
- package/src/cli/install-plan.js +592 -592
- package/src/cli/install-receipt.js +171 -171
- package/src/cli/jsonc.js +203 -203
- package/src/cli/package-install-state.js +254 -254
- package/src/cli/package-manager.js +238 -238
- package/src/cli/package-plan.js +185 -185
- package/src/cli/package-version.js +97 -97
- package/src/cli/registry-query.js +207 -207
- package/src/cli/reporting.js +55 -55
- package/src/cli/schema-validation.js +19 -19
- package/src/cli/source-scanner.js +686 -686
- package/src/cli/vite-config.js +478 -478
- package/tokens/banhaten.tokens.json +458 -224
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import {
|
|
3
|
+
BotIcon,
|
|
4
|
+
BrainIcon,
|
|
5
|
+
FileSearchIcon,
|
|
6
|
+
GlobeIcon,
|
|
7
|
+
ListCollapseIcon,
|
|
8
|
+
SparklesIcon,
|
|
9
|
+
} from "lucide-react"
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
AgentInput,
|
|
13
|
+
type AgentInputModel,
|
|
14
|
+
type AgentInputPayload,
|
|
15
|
+
type AgentInputSkill,
|
|
16
|
+
} from "@/components/ui/agent-input"
|
|
17
|
+
|
|
18
|
+
const models: AgentInputModel[] = [
|
|
19
|
+
{
|
|
20
|
+
description: "Most capable for complex, multi-step reasoning.",
|
|
21
|
+
icon: <SparklesIcon />,
|
|
22
|
+
id: "reasoning-xl",
|
|
23
|
+
meta: "200k context",
|
|
24
|
+
name: "Reasoning XL",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
description: "Fast all-rounder with strong tool use.",
|
|
28
|
+
icon: <BotIcon />,
|
|
29
|
+
id: "general-pro",
|
|
30
|
+
meta: "400k context",
|
|
31
|
+
name: "General Pro",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
description: "Long-context model for large documents and codebases.",
|
|
35
|
+
icon: <BrainIcon />,
|
|
36
|
+
id: "long-context",
|
|
37
|
+
meta: "1M context",
|
|
38
|
+
name: "Long Context",
|
|
39
|
+
},
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
const skills: AgentInputSkill[] = [
|
|
43
|
+
{ icon: <FileSearchIcon />, id: "deep-research", name: "Deep research" },
|
|
44
|
+
{ icon: <ListCollapseIcon />, id: "code-review", name: "Code review" },
|
|
45
|
+
{ icon: <GlobeIcon />, id: "web-search", name: "Web search" },
|
|
46
|
+
{ icon: <SparklesIcon />, id: "summarize", name: "Summarize" },
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
const enhanced =
|
|
50
|
+
"Rewrite this prompt to be clear and specific: state the goal, add the relevant context and constraints, define the expected output format and tone, and note any assumptions. Ask a clarifying question first if key details are missing."
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Integration seam: replace the timeout with a request to your model API and
|
|
54
|
+
* honour the abort signal so an in-flight enhance can be cancelled.
|
|
55
|
+
*/
|
|
56
|
+
async function mockEnhance(_prompt: string, signal: AbortSignal) {
|
|
57
|
+
await new Promise((resolve) => setTimeout(resolve, 2500))
|
|
58
|
+
if (signal.aborted) throw new DOMException("Aborted", "AbortError")
|
|
59
|
+
return enhanced
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function AgentInputDemo() {
|
|
63
|
+
const [sent, setSent] = React.useState<AgentInputPayload | null>(null)
|
|
64
|
+
// Integration seam: picked attachments carry their File. Upload them here,
|
|
65
|
+
// or as soon as they arrive through onAttachmentsChange.
|
|
66
|
+
const files = sent?.attachments.flatMap((attachment) => attachment.file ?? []) ?? []
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<div className="grid w-full max-w-[var(--bh-space-19xl-384)] gap-[var(--bh-space-xl-12)]">
|
|
70
|
+
<AgentInput
|
|
71
|
+
models={models}
|
|
72
|
+
onEnhance={mockEnhance}
|
|
73
|
+
onSend={setSent}
|
|
74
|
+
skills={skills}
|
|
75
|
+
/>
|
|
76
|
+
|
|
77
|
+
{sent ? (
|
|
78
|
+
<p
|
|
79
|
+
aria-live="polite"
|
|
80
|
+
className="text-[length:var(--bh-text-body-xs-regular-font-size)] leading-[var(--bh-text-body-xs-regular-line-height)] text-[var(--bh-content-subtle)]"
|
|
81
|
+
>
|
|
82
|
+
Sent to {sent.model}: {sent.text}
|
|
83
|
+
{files.length > 0
|
|
84
|
+
? ` (${files.length} ${files.length === 1 ? "file" : "files"} ready to upload)`
|
|
85
|
+
: null}
|
|
86
|
+
</p>
|
|
87
|
+
) : null}
|
|
88
|
+
</div>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { Alert } from "@/components/ui/alert"
|
|
2
|
-
|
|
3
|
-
export function AlertDemo() {
|
|
4
|
-
return (
|
|
5
|
-
<div className="grid gap-[var(--bh-space-3xl-16)]">
|
|
6
|
-
<Alert status="danger" title="Payment failed" />
|
|
7
|
-
<Alert status="success" title="Changes saved" />
|
|
8
|
-
<Alert
|
|
9
|
-
actions={[
|
|
10
|
-
{ label: "Review details", onClick: noop },
|
|
11
|
-
{ label: "Dismiss", onClick: noop },
|
|
12
|
-
]}
|
|
13
|
-
description="Update the payment method before the next billing attempt."
|
|
14
|
-
isExpandable
|
|
15
|
-
status="warning"
|
|
16
|
-
title="Payment method expires soon"
|
|
17
|
-
/>
|
|
18
|
-
<div dir="rtl">
|
|
19
|
-
<Alert
|
|
20
|
-
actions={[
|
|
21
|
-
{ label: "عرض التفاصيل", onClick: noop },
|
|
22
|
-
{ label: "متابعة", onClick: noop },
|
|
23
|
-
]}
|
|
24
|
-
description="يمكنك مراجعة التفاصيل أو المتابعة من لوحة التحكم."
|
|
25
|
-
isExpandable
|
|
26
|
-
status="info"
|
|
27
|
-
title="تم تحديث حسابك"
|
|
28
|
-
/>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function noop() {}
|
|
1
|
+
import { Alert } from "@/components/ui/alert"
|
|
2
|
+
|
|
3
|
+
export function AlertDemo() {
|
|
4
|
+
return (
|
|
5
|
+
<div className="grid gap-[var(--bh-space-3xl-16)]">
|
|
6
|
+
<Alert status="danger" title="Payment failed" />
|
|
7
|
+
<Alert status="success" title="Changes saved" />
|
|
8
|
+
<Alert
|
|
9
|
+
actions={[
|
|
10
|
+
{ label: "Review details", onClick: noop },
|
|
11
|
+
{ label: "Dismiss", onClick: noop },
|
|
12
|
+
]}
|
|
13
|
+
description="Update the payment method before the next billing attempt."
|
|
14
|
+
isExpandable
|
|
15
|
+
status="warning"
|
|
16
|
+
title="Payment method expires soon"
|
|
17
|
+
/>
|
|
18
|
+
<div dir="rtl">
|
|
19
|
+
<Alert
|
|
20
|
+
actions={[
|
|
21
|
+
{ label: "عرض التفاصيل", onClick: noop },
|
|
22
|
+
{ label: "متابعة", onClick: noop },
|
|
23
|
+
]}
|
|
24
|
+
description="يمكنك مراجعة التفاصيل أو المتابعة من لوحة التحكم."
|
|
25
|
+
isExpandable
|
|
26
|
+
status="info"
|
|
27
|
+
title="تم تحديث حسابك"
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function noop() {}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { Button } from "@/components/ui/button"
|
|
2
|
-
import {
|
|
3
|
-
AlertDialog,
|
|
4
|
-
AlertDialogAction,
|
|
5
|
-
AlertDialogBody,
|
|
6
|
-
AlertDialogCancel,
|
|
7
|
-
AlertDialogContent,
|
|
8
|
-
AlertDialogDescription,
|
|
9
|
-
AlertDialogFooter,
|
|
10
|
-
AlertDialogHeader,
|
|
11
|
-
AlertDialogIcon,
|
|
12
|
-
AlertDialogTitle,
|
|
13
|
-
AlertDialogTrigger,
|
|
14
|
-
} from "@/components/ui/alert-dialog"
|
|
15
|
-
|
|
16
|
-
export function AlertDialogDemo() {
|
|
17
|
-
return (
|
|
18
|
-
<AlertDialog>
|
|
19
|
-
<AlertDialogTrigger asChild>
|
|
20
|
-
<Button size="sm" variant="danger">
|
|
21
|
-
Delete project
|
|
22
|
-
</Button>
|
|
23
|
-
</AlertDialogTrigger>
|
|
24
|
-
<AlertDialogContent>
|
|
25
|
-
<AlertDialogHeader>
|
|
26
|
-
<AlertDialogIcon intent="danger" />
|
|
27
|
-
<AlertDialogTitle>Delete project?</AlertDialogTitle>
|
|
28
|
-
</AlertDialogHeader>
|
|
29
|
-
<AlertDialogBody>
|
|
30
|
-
<AlertDialogDescription>
|
|
31
|
-
This action cannot be undone. All environments, deployments, and
|
|
32
|
-
saved settings will be permanently removed.
|
|
33
|
-
</AlertDialogDescription>
|
|
34
|
-
</AlertDialogBody>
|
|
35
|
-
<AlertDialogFooter>
|
|
36
|
-
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
37
|
-
<AlertDialogAction>Delete project</AlertDialogAction>
|
|
38
|
-
</AlertDialogFooter>
|
|
39
|
-
</AlertDialogContent>
|
|
40
|
-
</AlertDialog>
|
|
41
|
-
)
|
|
42
|
-
}
|
|
1
|
+
import { Button } from "@/components/ui/button"
|
|
2
|
+
import {
|
|
3
|
+
AlertDialog,
|
|
4
|
+
AlertDialogAction,
|
|
5
|
+
AlertDialogBody,
|
|
6
|
+
AlertDialogCancel,
|
|
7
|
+
AlertDialogContent,
|
|
8
|
+
AlertDialogDescription,
|
|
9
|
+
AlertDialogFooter,
|
|
10
|
+
AlertDialogHeader,
|
|
11
|
+
AlertDialogIcon,
|
|
12
|
+
AlertDialogTitle,
|
|
13
|
+
AlertDialogTrigger,
|
|
14
|
+
} from "@/components/ui/alert-dialog"
|
|
15
|
+
|
|
16
|
+
export function AlertDialogDemo() {
|
|
17
|
+
return (
|
|
18
|
+
<AlertDialog>
|
|
19
|
+
<AlertDialogTrigger asChild>
|
|
20
|
+
<Button size="sm" variant="danger">
|
|
21
|
+
Delete project
|
|
22
|
+
</Button>
|
|
23
|
+
</AlertDialogTrigger>
|
|
24
|
+
<AlertDialogContent>
|
|
25
|
+
<AlertDialogHeader>
|
|
26
|
+
<AlertDialogIcon intent="danger" />
|
|
27
|
+
<AlertDialogTitle>Delete project?</AlertDialogTitle>
|
|
28
|
+
</AlertDialogHeader>
|
|
29
|
+
<AlertDialogBody>
|
|
30
|
+
<AlertDialogDescription>
|
|
31
|
+
This action cannot be undone. All environments, deployments, and
|
|
32
|
+
saved settings will be permanently removed.
|
|
33
|
+
</AlertDialogDescription>
|
|
34
|
+
</AlertDialogBody>
|
|
35
|
+
<AlertDialogFooter>
|
|
36
|
+
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
37
|
+
<AlertDialogAction>Delete project</AlertDialogAction>
|
|
38
|
+
</AlertDialogFooter>
|
|
39
|
+
</AlertDialogContent>
|
|
40
|
+
</AlertDialog>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ApprovalCommand,
|
|
5
|
+
ApprovalPlan,
|
|
6
|
+
type ApprovalPlanStep,
|
|
7
|
+
type ApprovalQuestion,
|
|
8
|
+
ApprovalQuestions,
|
|
9
|
+
} from "@/components/ui/approval-card"
|
|
10
|
+
|
|
11
|
+
const questions: ApprovalQuestion[] = [
|
|
12
|
+
{
|
|
13
|
+
id: "auth",
|
|
14
|
+
options: ["Session cookies", "JWT bearer", "OAuth only"],
|
|
15
|
+
prompt: "Which auth approach should we use?",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "secrets",
|
|
19
|
+
options: [".env.local", "Vault / secrets manager", "CI only"],
|
|
20
|
+
prompt: "Where should secrets live?",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "flag",
|
|
24
|
+
options: ["Yes, gradual rollout", "No, full release"],
|
|
25
|
+
prompt: "Ship behind a feature flag?",
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const plan: ApprovalPlanStep[] = [
|
|
30
|
+
{ id: "p1", title: "Add migration for sessions table" },
|
|
31
|
+
{ id: "p2", title: "Wire auth middleware" },
|
|
32
|
+
{ id: "p3", title: "Update login flow and tests" },
|
|
33
|
+
{ id: "p4", title: "Add account settings page" },
|
|
34
|
+
{ id: "p5", title: "Tighten CSRF and rate limits" },
|
|
35
|
+
{ id: "p6", title: "Write rollout notes" },
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
export function ApprovalCardDemo() {
|
|
39
|
+
const [status, setStatus] = React.useState<string | null>(null)
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div className="grid w-full max-w-[var(--bh-space-19xl-384)] gap-[var(--bh-space-3xl-16)]">
|
|
43
|
+
<ApprovalQuestions
|
|
44
|
+
onApprove={({ answers }) =>
|
|
45
|
+
setStatus(`Answers: ${JSON.stringify(answers)}`)
|
|
46
|
+
}
|
|
47
|
+
onReject={() => setStatus("Questions skipped")}
|
|
48
|
+
questions={questions}
|
|
49
|
+
/>
|
|
50
|
+
|
|
51
|
+
<ApprovalCommand
|
|
52
|
+
command="pnpm db:migrate && pnpm build"
|
|
53
|
+
cwd="~/acme"
|
|
54
|
+
onApprove={() => setStatus("Command approved")}
|
|
55
|
+
onReject={() => setStatus("Command skipped")}
|
|
56
|
+
/>
|
|
57
|
+
|
|
58
|
+
<ApprovalPlan
|
|
59
|
+
autoApproveSeconds={30}
|
|
60
|
+
onApprove={({ source }) =>
|
|
61
|
+
setStatus(source === "timeout" ? "Plan auto-approved" : "Plan approved")
|
|
62
|
+
}
|
|
63
|
+
onDownload={() => setStatus("Plan downloaded")}
|
|
64
|
+
onExpand={() => setStatus("Plan expanded")}
|
|
65
|
+
onViewPlan={() => setStatus("Plan opened")}
|
|
66
|
+
plan={plan}
|
|
67
|
+
planSummary={
|
|
68
|
+
"Ship cookie-based sessions with middleware and tests.\nIncludes a safe rollout path for production."
|
|
69
|
+
}
|
|
70
|
+
planTitle="Session auth migration"
|
|
71
|
+
/>
|
|
72
|
+
|
|
73
|
+
{status ? (
|
|
74
|
+
<p
|
|
75
|
+
aria-live="polite"
|
|
76
|
+
className="text-[length:var(--bh-text-body-xs-regular-font-size)] leading-[var(--bh-text-body-xs-regular-line-height)] text-[var(--bh-content-subtle)]"
|
|
77
|
+
>
|
|
78
|
+
{status}
|
|
79
|
+
</p>
|
|
80
|
+
) : null}
|
|
81
|
+
</div>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { AspectRatio } from "@/components/ui/aspect-ratio"
|
|
2
|
-
|
|
3
|
-
export function AspectRatioDemo() {
|
|
4
|
-
return (
|
|
5
|
-
<AspectRatio ratio={16 / 9} className="max-w-xl">
|
|
6
|
-
<div className="flex size-full items-center justify-center bg-[var(--bh-bg-neutral-subtle)] text-[var(--bh-content-subtle)]">
|
|
7
|
-
16:9
|
|
8
|
-
</div>
|
|
9
|
-
</AspectRatio>
|
|
10
|
-
)
|
|
11
|
-
}
|
|
1
|
+
import { AspectRatio } from "@/components/ui/aspect-ratio"
|
|
2
|
+
|
|
3
|
+
export function AspectRatioDemo() {
|
|
4
|
+
return (
|
|
5
|
+
<AspectRatio ratio={16 / 9} className="max-w-xl">
|
|
6
|
+
<div className="flex size-full items-center justify-center bg-[var(--bh-bg-neutral-subtle)] text-[var(--bh-content-subtle)]">
|
|
7
|
+
16:9
|
|
8
|
+
</div>
|
|
9
|
+
</AspectRatio>
|
|
10
|
+
)
|
|
11
|
+
}
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
import { CopyIcon, ExternalLinkIcon, PaperclipIcon } from "lucide-react"
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
AttributeCard,
|
|
5
|
-
AttributeHeader,
|
|
6
|
-
AttributeItem,
|
|
7
|
-
AttributeList,
|
|
8
|
-
} from "@/components/ui/attribute"
|
|
9
|
-
import { Badge } from "@/components/ui/badge"
|
|
10
|
-
import { Button } from "@/components/ui/button"
|
|
11
|
-
|
|
12
|
-
export function AttributeDemo() {
|
|
13
|
-
return (
|
|
14
|
-
<div className="grid max-w-5xl gap-[var(--bh-space-3xl-16)] lg:grid-cols-2">
|
|
15
|
-
<AttributeCard>
|
|
16
|
-
<AttributeHeader
|
|
17
|
-
title="Company profile"
|
|
18
|
-
description="Key-value information in a scannable card."
|
|
19
|
-
/>
|
|
20
|
-
<AttributeList>
|
|
21
|
-
<AttributeItem label="Name">Banhaten</AttributeItem>
|
|
22
|
-
<AttributeItem label="Location">Remote</AttributeItem>
|
|
23
|
-
<AttributeItem label="Website">
|
|
24
|
-
<a
|
|
25
|
-
className="inline-flex items-center gap-[var(--bh-space-xxs-2)] text-[var(--bh-content-link)] hover:text-[var(--bh-content-link-hover)]"
|
|
26
|
-
href="https://banhaten.com"
|
|
27
|
-
>
|
|
28
|
-
banhaten.com
|
|
29
|
-
<ExternalLinkIcon className="size-[var(--bh-space-3xl-16)]" />
|
|
30
|
-
</a>
|
|
31
|
-
</AttributeItem>
|
|
32
|
-
<AttributeItem label="Industry">
|
|
33
|
-
<Badge>Design</Badge>
|
|
34
|
-
</AttributeItem>
|
|
35
|
-
</AttributeList>
|
|
36
|
-
</AttributeCard>
|
|
37
|
-
|
|
38
|
-
<AttributeCard>
|
|
39
|
-
<AttributeHeader
|
|
40
|
-
title="Order details"
|
|
41
|
-
description="Rich values with copy actions, files, and status chips."
|
|
42
|
-
/>
|
|
43
|
-
<AttributeList dividers>
|
|
44
|
-
<AttributeItem label="Subscription">
|
|
45
|
-
<Badge color="green" type="dot">
|
|
46
|
-
Active
|
|
47
|
-
</Badge>
|
|
48
|
-
</AttributeItem>
|
|
49
|
-
<AttributeItem label="API key" truncate>
|
|
50
|
-
sk_live_************1234
|
|
51
|
-
<Button aria-label="Copy API key" size="icon-xs" variant="outline">
|
|
52
|
-
<CopyIcon />
|
|
53
|
-
</Button>
|
|
54
|
-
</AttributeItem>
|
|
55
|
-
<AttributeItem label="Invoice">
|
|
56
|
-
<span className="inline-flex min-w-0 items-center gap-[var(--bh-space-md-8)]">
|
|
57
|
-
<PaperclipIcon className="size-[var(--bh-
|
|
58
|
-
INV-2024-00123.pdf
|
|
59
|
-
</span>
|
|
60
|
-
</AttributeItem>
|
|
61
|
-
</AttributeList>
|
|
62
|
-
</AttributeCard>
|
|
63
|
-
</div>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
1
|
+
import { CopyIcon, ExternalLinkIcon, PaperclipIcon } from "lucide-react"
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AttributeCard,
|
|
5
|
+
AttributeHeader,
|
|
6
|
+
AttributeItem,
|
|
7
|
+
AttributeList,
|
|
8
|
+
} from "@/components/ui/attribute"
|
|
9
|
+
import { Badge } from "@/components/ui/badge"
|
|
10
|
+
import { Button } from "@/components/ui/button"
|
|
11
|
+
|
|
12
|
+
export function AttributeDemo() {
|
|
13
|
+
return (
|
|
14
|
+
<div className="grid max-w-5xl gap-[var(--bh-space-3xl-16)] lg:grid-cols-2">
|
|
15
|
+
<AttributeCard>
|
|
16
|
+
<AttributeHeader
|
|
17
|
+
title="Company profile"
|
|
18
|
+
description="Key-value information in a scannable card."
|
|
19
|
+
/>
|
|
20
|
+
<AttributeList>
|
|
21
|
+
<AttributeItem label="Name">Banhaten</AttributeItem>
|
|
22
|
+
<AttributeItem label="Location">Remote</AttributeItem>
|
|
23
|
+
<AttributeItem label="Website">
|
|
24
|
+
<a
|
|
25
|
+
className="inline-flex items-center gap-[var(--bh-space-xxs-2)] text-[var(--bh-content-link)] hover:text-[var(--bh-content-link-hover)]"
|
|
26
|
+
href="https://banhaten.com"
|
|
27
|
+
>
|
|
28
|
+
banhaten.com
|
|
29
|
+
<ExternalLinkIcon className="size-[var(--bh-space-3xl-16)]" />
|
|
30
|
+
</a>
|
|
31
|
+
</AttributeItem>
|
|
32
|
+
<AttributeItem label="Industry">
|
|
33
|
+
<Badge>Design</Badge>
|
|
34
|
+
</AttributeItem>
|
|
35
|
+
</AttributeList>
|
|
36
|
+
</AttributeCard>
|
|
37
|
+
|
|
38
|
+
<AttributeCard>
|
|
39
|
+
<AttributeHeader
|
|
40
|
+
title="Order details"
|
|
41
|
+
description="Rich values with copy actions, files, and status chips."
|
|
42
|
+
/>
|
|
43
|
+
<AttributeList dividers>
|
|
44
|
+
<AttributeItem label="Subscription">
|
|
45
|
+
<Badge color="green" type="dot">
|
|
46
|
+
Active
|
|
47
|
+
</Badge>
|
|
48
|
+
</AttributeItem>
|
|
49
|
+
<AttributeItem label="API key" truncate>
|
|
50
|
+
sk_live_************1234
|
|
51
|
+
<Button aria-label="Copy API key" size="icon-xs" variant="outline">
|
|
52
|
+
<CopyIcon />
|
|
53
|
+
</Button>
|
|
54
|
+
</AttributeItem>
|
|
55
|
+
<AttributeItem label="Invoice">
|
|
56
|
+
<span className="inline-flex min-w-0 items-center gap-[var(--bh-space-md-8)]">
|
|
57
|
+
<PaperclipIcon className="m-[var(--bh-icon-slot-inset-default)] size-[var(--bh-icon-size-default)] shrink-0 text-[var(--bh-content-muted)]" />
|
|
58
|
+
INV-2024-00123.pdf
|
|
59
|
+
</span>
|
|
60
|
+
</AttributeItem>
|
|
61
|
+
</AttributeList>
|
|
62
|
+
</AttributeCard>
|
|
63
|
+
</div>
|
|
64
|
+
)
|
|
65
|
+
}
|