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
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
|
|
3
|
-
import { Toggle, ToggleField } from "@/components/ui/toggle"
|
|
4
|
-
|
|
5
|
-
export function ToggleDemo() {
|
|
6
|
-
const [checked, setChecked] = React.useState(true)
|
|
7
|
-
|
|
8
|
-
return (
|
|
9
|
-
<div className="grid gap-[var(--bh-space-5xl-24)]">
|
|
10
|
-
<div className="flex flex-wrap items-center gap-[var(--bh-space-3xl-16)]">
|
|
11
|
-
<Toggle
|
|
12
|
-
checked={checked}
|
|
13
|
-
onCheckedChange={setChecked}
|
|
14
|
-
aria-label="Toggle notifications"
|
|
15
|
-
/>
|
|
16
|
-
<Toggle aria-label="Small toggle" size="sm" />
|
|
17
|
-
<Toggle aria-label="Icon toggle" showIcon defaultChecked />
|
|
18
|
-
<Toggle aria-label="Disabled toggle" disabled />
|
|
19
|
-
</div>
|
|
20
|
-
|
|
21
|
-
<div className="grid gap-[var(--bh-space-3xl-16)] sm:grid-cols-2">
|
|
22
|
-
<ToggleField
|
|
23
|
-
defaultChecked
|
|
24
|
-
label="Label"
|
|
25
|
-
description="Supporting text"
|
|
26
|
-
/>
|
|
27
|
-
<ToggleField
|
|
28
|
-
className="w-[var(--bh-space-15xl-224)]"
|
|
29
|
-
controlPosition="end"
|
|
30
|
-
label="Label"
|
|
31
|
-
/>
|
|
32
|
-
<ToggleField
|
|
33
|
-
disabled
|
|
34
|
-
label="Label"
|
|
35
|
-
description="Supporting text"
|
|
36
|
-
/>
|
|
37
|
-
<ToggleField
|
|
38
|
-
defaultChecked
|
|
39
|
-
showIcon
|
|
40
|
-
size="sm"
|
|
41
|
-
label="Label"
|
|
42
|
-
/>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
<div dir="rtl" className="grid gap-[var(--bh-space-3xl-16)] sm:grid-cols-2">
|
|
46
|
-
<ToggleField
|
|
47
|
-
defaultChecked
|
|
48
|
-
label={"\u0627\u0644\u062a\u0633\u0645\u064a\u0629"}
|
|
49
|
-
description={"\u0646\u0635 \u0645\u0633\u0627\u0639\u062f"}
|
|
50
|
-
/>
|
|
51
|
-
<ToggleField
|
|
52
|
-
className="w-[var(--bh-space-15xl-224)]"
|
|
53
|
-
controlPosition="end"
|
|
54
|
-
label={"\u0627\u0644\u062a\u0633\u0645\u064a\u0629"}
|
|
55
|
-
/>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
)
|
|
59
|
-
}
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import { Toggle, ToggleField } from "@/components/ui/toggle"
|
|
4
|
+
|
|
5
|
+
export function ToggleDemo() {
|
|
6
|
+
const [checked, setChecked] = React.useState(true)
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="grid gap-[var(--bh-space-5xl-24)]">
|
|
10
|
+
<div className="flex flex-wrap items-center gap-[var(--bh-space-3xl-16)]">
|
|
11
|
+
<Toggle
|
|
12
|
+
checked={checked}
|
|
13
|
+
onCheckedChange={setChecked}
|
|
14
|
+
aria-label="Toggle notifications"
|
|
15
|
+
/>
|
|
16
|
+
<Toggle aria-label="Small toggle" size="sm" />
|
|
17
|
+
<Toggle aria-label="Icon toggle" showIcon defaultChecked />
|
|
18
|
+
<Toggle aria-label="Disabled toggle" disabled />
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div className="grid gap-[var(--bh-space-3xl-16)] sm:grid-cols-2">
|
|
22
|
+
<ToggleField
|
|
23
|
+
defaultChecked
|
|
24
|
+
label="Label"
|
|
25
|
+
description="Supporting text"
|
|
26
|
+
/>
|
|
27
|
+
<ToggleField
|
|
28
|
+
className="w-[var(--bh-space-15xl-224)]"
|
|
29
|
+
controlPosition="end"
|
|
30
|
+
label="Label"
|
|
31
|
+
/>
|
|
32
|
+
<ToggleField
|
|
33
|
+
disabled
|
|
34
|
+
label="Label"
|
|
35
|
+
description="Supporting text"
|
|
36
|
+
/>
|
|
37
|
+
<ToggleField
|
|
38
|
+
defaultChecked
|
|
39
|
+
showIcon
|
|
40
|
+
size="sm"
|
|
41
|
+
label="Label"
|
|
42
|
+
/>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div dir="rtl" className="grid gap-[var(--bh-space-3xl-16)] sm:grid-cols-2">
|
|
46
|
+
<ToggleField
|
|
47
|
+
defaultChecked
|
|
48
|
+
label={"\u0627\u0644\u062a\u0633\u0645\u064a\u0629"}
|
|
49
|
+
description={"\u0646\u0635 \u0645\u0633\u0627\u0639\u062f"}
|
|
50
|
+
/>
|
|
51
|
+
<ToggleField
|
|
52
|
+
className="w-[var(--bh-space-15xl-224)]"
|
|
53
|
+
controlPosition="end"
|
|
54
|
+
label={"\u0627\u0644\u062a\u0633\u0645\u064a\u0629"}
|
|
55
|
+
/>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import { InfoIcon, SettingsIcon } from "lucide-react"
|
|
2
|
-
|
|
3
|
-
import { Button } from "@/components/ui/button"
|
|
4
|
-
import {
|
|
5
|
-
Tooltip,
|
|
6
|
-
TooltipContent,
|
|
7
|
-
TooltipProvider,
|
|
8
|
-
TooltipTrigger,
|
|
9
|
-
} from "@/components/ui/tooltip"
|
|
10
|
-
|
|
11
|
-
const supportText =
|
|
12
|
-
"You may notice that we've made some updates to our look and feel."
|
|
13
|
-
const rtlLabel = "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0643\u062b\u0631"
|
|
14
|
-
const rtlSupportText =
|
|
15
|
-
"\u0642\u062f \u062a\u0644\u0627\u062d\u0638 \u0623\u0646\u0646\u0627 \u0623\u062c\u0631\u064a\u0646\u0627 \u0628\u0639\u0636 \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0639\u0644\u0649 \u0634\u0643\u0644\u0646\u0627 \u0648\u0645\u0638\u0647\u0631\u0646\u0627."
|
|
16
|
-
|
|
17
|
-
export function TooltipDemo() {
|
|
18
|
-
return (
|
|
19
|
-
<TooltipProvider delayDuration={0}>
|
|
20
|
-
<div className="grid gap-[var(--bh-space-6xl-32)]">
|
|
21
|
-
<div className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
22
|
-
<Tooltip defaultOpen>
|
|
23
|
-
<TooltipTrigger asChild>
|
|
24
|
-
<Button size="icon" variant="secondary" aria-label="More information">
|
|
25
|
-
<InfoIcon />
|
|
26
|
-
</Button>
|
|
27
|
-
</TooltipTrigger>
|
|
28
|
-
<TooltipContent pointerPosition="top-left">
|
|
29
|
-
More information
|
|
30
|
-
</TooltipContent>
|
|
31
|
-
</Tooltip>
|
|
32
|
-
|
|
33
|
-
<Tooltip defaultOpen>
|
|
34
|
-
<TooltipTrigger asChild>
|
|
35
|
-
<Button size="icon" variant="outline" aria-label="Settings help">
|
|
36
|
-
<SettingsIcon />
|
|
37
|
-
</Button>
|
|
38
|
-
</TooltipTrigger>
|
|
39
|
-
<TooltipContent pointerPosition="bottom-center" variant="default">
|
|
40
|
-
More information
|
|
41
|
-
</TooltipContent>
|
|
42
|
-
</Tooltip>
|
|
43
|
-
|
|
44
|
-
<Tooltip defaultOpen>
|
|
45
|
-
<TooltipTrigger asChild>
|
|
46
|
-
<Button size="icon" variant="ghost-primary" aria-label="No pointer help">
|
|
47
|
-
<InfoIcon />
|
|
48
|
-
</Button>
|
|
49
|
-
</TooltipTrigger>
|
|
50
|
-
<TooltipContent pointerPosition="none" showPointer={false}>
|
|
51
|
-
More information
|
|
52
|
-
</TooltipContent>
|
|
53
|
-
</Tooltip>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<div className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
57
|
-
<Tooltip defaultOpen>
|
|
58
|
-
<TooltipTrigger asChild>
|
|
59
|
-
<Button variant="secondary">Dark large</Button>
|
|
60
|
-
</TooltipTrigger>
|
|
61
|
-
<TooltipContent
|
|
62
|
-
pointerPosition="center-right"
|
|
63
|
-
size="lg"
|
|
64
|
-
supportText={supportText}
|
|
65
|
-
>
|
|
66
|
-
More information
|
|
67
|
-
</TooltipContent>
|
|
68
|
-
</Tooltip>
|
|
69
|
-
|
|
70
|
-
<Tooltip defaultOpen>
|
|
71
|
-
<TooltipTrigger asChild>
|
|
72
|
-
<Button variant="outline">Default large</Button>
|
|
73
|
-
</TooltipTrigger>
|
|
74
|
-
<TooltipContent
|
|
75
|
-
pointerPosition="top-center"
|
|
76
|
-
size="lg"
|
|
77
|
-
supportText={supportText}
|
|
78
|
-
variant="default"
|
|
79
|
-
>
|
|
80
|
-
More information
|
|
81
|
-
</TooltipContent>
|
|
82
|
-
</Tooltip>
|
|
83
|
-
</div>
|
|
84
|
-
|
|
85
|
-
<div dir="rtl" className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
86
|
-
<Tooltip defaultOpen>
|
|
87
|
-
<TooltipTrigger asChild>
|
|
88
|
-
<Button size="icon" variant="secondary" aria-label={rtlLabel}>
|
|
89
|
-
<InfoIcon />
|
|
90
|
-
</Button>
|
|
91
|
-
</TooltipTrigger>
|
|
92
|
-
<TooltipContent dir="rtl" pointerPosition="top-left">
|
|
93
|
-
{rtlLabel}
|
|
94
|
-
</TooltipContent>
|
|
95
|
-
</Tooltip>
|
|
96
|
-
|
|
97
|
-
<Tooltip defaultOpen>
|
|
98
|
-
<TooltipTrigger asChild>
|
|
99
|
-
<Button variant="outline">{rtlLabel}</Button>
|
|
100
|
-
</TooltipTrigger>
|
|
101
|
-
<TooltipContent
|
|
102
|
-
dir="rtl"
|
|
103
|
-
pointerPosition="top-left"
|
|
104
|
-
size="lg"
|
|
105
|
-
supportText={rtlSupportText}
|
|
106
|
-
variant="default"
|
|
107
|
-
>
|
|
108
|
-
{rtlLabel}
|
|
109
|
-
</TooltipContent>
|
|
110
|
-
</Tooltip>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
|
-
</TooltipProvider>
|
|
114
|
-
)
|
|
115
|
-
}
|
|
1
|
+
import { InfoIcon, SettingsIcon } from "lucide-react"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import {
|
|
5
|
+
Tooltip,
|
|
6
|
+
TooltipContent,
|
|
7
|
+
TooltipProvider,
|
|
8
|
+
TooltipTrigger,
|
|
9
|
+
} from "@/components/ui/tooltip"
|
|
10
|
+
|
|
11
|
+
const supportText =
|
|
12
|
+
"You may notice that we've made some updates to our look and feel."
|
|
13
|
+
const rtlLabel = "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0643\u062b\u0631"
|
|
14
|
+
const rtlSupportText =
|
|
15
|
+
"\u0642\u062f \u062a\u0644\u0627\u062d\u0638 \u0623\u0646\u0646\u0627 \u0623\u062c\u0631\u064a\u0646\u0627 \u0628\u0639\u0636 \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0639\u0644\u0649 \u0634\u0643\u0644\u0646\u0627 \u0648\u0645\u0638\u0647\u0631\u0646\u0627."
|
|
16
|
+
|
|
17
|
+
export function TooltipDemo() {
|
|
18
|
+
return (
|
|
19
|
+
<TooltipProvider delayDuration={0}>
|
|
20
|
+
<div className="grid gap-[var(--bh-space-6xl-32)]">
|
|
21
|
+
<div className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
22
|
+
<Tooltip defaultOpen>
|
|
23
|
+
<TooltipTrigger asChild>
|
|
24
|
+
<Button size="icon" variant="secondary" aria-label="More information">
|
|
25
|
+
<InfoIcon />
|
|
26
|
+
</Button>
|
|
27
|
+
</TooltipTrigger>
|
|
28
|
+
<TooltipContent pointerPosition="top-left">
|
|
29
|
+
More information
|
|
30
|
+
</TooltipContent>
|
|
31
|
+
</Tooltip>
|
|
32
|
+
|
|
33
|
+
<Tooltip defaultOpen>
|
|
34
|
+
<TooltipTrigger asChild>
|
|
35
|
+
<Button size="icon" variant="outline" aria-label="Settings help">
|
|
36
|
+
<SettingsIcon />
|
|
37
|
+
</Button>
|
|
38
|
+
</TooltipTrigger>
|
|
39
|
+
<TooltipContent pointerPosition="bottom-center" variant="default">
|
|
40
|
+
More information
|
|
41
|
+
</TooltipContent>
|
|
42
|
+
</Tooltip>
|
|
43
|
+
|
|
44
|
+
<Tooltip defaultOpen>
|
|
45
|
+
<TooltipTrigger asChild>
|
|
46
|
+
<Button size="icon" variant="ghost-primary" aria-label="No pointer help">
|
|
47
|
+
<InfoIcon />
|
|
48
|
+
</Button>
|
|
49
|
+
</TooltipTrigger>
|
|
50
|
+
<TooltipContent pointerPosition="none" showPointer={false}>
|
|
51
|
+
More information
|
|
52
|
+
</TooltipContent>
|
|
53
|
+
</Tooltip>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
57
|
+
<Tooltip defaultOpen>
|
|
58
|
+
<TooltipTrigger asChild>
|
|
59
|
+
<Button variant="secondary">Dark large</Button>
|
|
60
|
+
</TooltipTrigger>
|
|
61
|
+
<TooltipContent
|
|
62
|
+
pointerPosition="center-right"
|
|
63
|
+
size="lg"
|
|
64
|
+
supportText={supportText}
|
|
65
|
+
>
|
|
66
|
+
More information
|
|
67
|
+
</TooltipContent>
|
|
68
|
+
</Tooltip>
|
|
69
|
+
|
|
70
|
+
<Tooltip defaultOpen>
|
|
71
|
+
<TooltipTrigger asChild>
|
|
72
|
+
<Button variant="outline">Default large</Button>
|
|
73
|
+
</TooltipTrigger>
|
|
74
|
+
<TooltipContent
|
|
75
|
+
pointerPosition="top-center"
|
|
76
|
+
size="lg"
|
|
77
|
+
supportText={supportText}
|
|
78
|
+
variant="default"
|
|
79
|
+
>
|
|
80
|
+
More information
|
|
81
|
+
</TooltipContent>
|
|
82
|
+
</Tooltip>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div dir="rtl" className="flex flex-wrap items-center gap-[var(--bh-space-6xl-32)]">
|
|
86
|
+
<Tooltip defaultOpen>
|
|
87
|
+
<TooltipTrigger asChild>
|
|
88
|
+
<Button size="icon" variant="secondary" aria-label={rtlLabel}>
|
|
89
|
+
<InfoIcon />
|
|
90
|
+
</Button>
|
|
91
|
+
</TooltipTrigger>
|
|
92
|
+
<TooltipContent dir="rtl" pointerPosition="top-left">
|
|
93
|
+
{rtlLabel}
|
|
94
|
+
</TooltipContent>
|
|
95
|
+
</Tooltip>
|
|
96
|
+
|
|
97
|
+
<Tooltip defaultOpen>
|
|
98
|
+
<TooltipTrigger asChild>
|
|
99
|
+
<Button variant="outline">{rtlLabel}</Button>
|
|
100
|
+
</TooltipTrigger>
|
|
101
|
+
<TooltipContent
|
|
102
|
+
dir="rtl"
|
|
103
|
+
pointerPosition="top-left"
|
|
104
|
+
size="lg"
|
|
105
|
+
supportText={rtlSupportText}
|
|
106
|
+
variant="default"
|
|
107
|
+
>
|
|
108
|
+
{rtlLabel}
|
|
109
|
+
</TooltipContent>
|
|
110
|
+
</Tooltip>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</TooltipProvider>
|
|
114
|
+
)
|
|
115
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
# Banhaten implementation rules
|
|
2
|
-
|
|
3
|
-
This project uses the Banhaten design system. Treat the installed component API and registry metadata as the source of truth; do not redraw controls from memory or infer defaults from the first documented variant.
|
|
4
|
-
|
|
5
|
-
## Before changing UI
|
|
6
|
-
|
|
7
|
-
1. Run `npx banhaten search <need>` to find the intended component.
|
|
8
|
-
2. Run `npx banhaten docs <component>` to inspect explicit defaults, recommended uses, avoid rules, and recipes.
|
|
9
|
-
3. Run `npx banhaten view <component>` before wrapping or extending its internals.
|
|
10
|
-
4. Prefer the documented golden recipe when the screen resembles a collection filter bar or results toolbar.
|
|
11
|
-
|
|
12
|
-
## Composition rules
|
|
13
|
-
|
|
14
|
-
- Use one semantic `density` across controls in the same row: `compact` is 32px, `default` is 36px, and `comfortable` is 40px.
|
|
15
|
-
- Do not align Banhaten controls with raw height, padding, radius, or font-size utilities. Width and responsive layout utilities are allowed.
|
|
16
|
-
- Use `DatePicker` or `DateRangePicker` for dates. Do not simulate calendar fields with `Input` or native date inputs.
|
|
17
|
-
- Pass explicit `leadingIcon` and `trailingIcon` nodes. Use `showAtSign` or `showInfo` only for those exact semantic affordances. The legacy `hasLeadingIcon` and `hasInformationIcon` flags are deprecated.
|
|
18
|
-
- Use `shortcutKeys={["Mod", "K"]}` or `KbdShortcut`
|
|
19
|
-
- Use `SegmentedControl` for small mutually exclusive view, density, period, or numeric choices. Do not rebuild joined numeric buttons locally.
|
|
20
|
-
- Use functional `Select` for option menus. `ToolbarSelect` is only a trigger-shaped toolbar primitive.
|
|
21
|
-
- Preserve inherited `dir`; use logical spacing and alignment utilities for RTL-safe composition.
|
|
22
|
-
|
|
23
|
-
## Before finishing
|
|
24
|
-
|
|
25
|
-
Run `npx banhaten doctor` and inspect every diagnostic. Run `npx banhaten diff` before updating installed components, then execute the product's type, behavior, accessibility, and visual tests.
|
|
26
|
-
|
|
27
|
-
Canonical recipes live in `docs/design-system/form-recipes.md` in the Banhaten package.
|
|
1
|
+
# Banhaten implementation rules
|
|
2
|
+
|
|
3
|
+
This project uses the Banhaten design system. Treat the installed component API and registry metadata as the source of truth; do not redraw controls from memory or infer defaults from the first documented variant.
|
|
4
|
+
|
|
5
|
+
## Before changing UI
|
|
6
|
+
|
|
7
|
+
1. Run `npx banhaten search <need>` to find the intended component.
|
|
8
|
+
2. Run `npx banhaten docs <component>` to inspect explicit defaults, recommended uses, avoid rules, and recipes.
|
|
9
|
+
3. Run `npx banhaten view <component>` before wrapping or extending its internals.
|
|
10
|
+
4. Prefer the documented golden recipe when the screen resembles a collection filter bar or results toolbar.
|
|
11
|
+
|
|
12
|
+
## Composition rules
|
|
13
|
+
|
|
14
|
+
- Use one semantic `density` across controls in the same row: `compact` is 32px, `default` is 36px, and `comfortable` is 40px.
|
|
15
|
+
- Do not align Banhaten controls with raw height, padding, radius, or font-size utilities. Width and responsive layout utilities are allowed.
|
|
16
|
+
- Use `DatePicker` or `DateRangePicker` for dates. Do not simulate calendar fields with `Input` or native date inputs.
|
|
17
|
+
- Pass explicit `leadingIcon` and `trailingIcon` nodes. Use `showAtSign` or `showInfo` only for those exact semantic affordances. The legacy `hasLeadingIcon` and `hasInformationIcon` flags are deprecated.
|
|
18
|
+
- Use `shortcutKeys={["Mod", "K"]}` on search inputs, `Shortcut` for one compact combined hint, or `KbdShortcut` when each physical key needs its own keycap. Never hard-code a single Command glyph for every platform.
|
|
19
|
+
- Use `SegmentedControl` for small mutually exclusive view, density, period, or numeric choices. Do not rebuild joined numeric buttons locally.
|
|
20
|
+
- Use functional `Select` for option menus. `ToolbarSelect` is only a trigger-shaped toolbar primitive.
|
|
21
|
+
- Preserve inherited `dir`; use logical spacing and alignment utilities for RTL-safe composition.
|
|
22
|
+
|
|
23
|
+
## Before finishing
|
|
24
|
+
|
|
25
|
+
Run `npx banhaten doctor` and inspect every diagnostic. Run `npx banhaten diff` before updating installed components, then execute the product's type, behavior, accessibility, and visual tests.
|
|
26
|
+
|
|
27
|
+
Canonical recipes live in `docs/design-system/form-recipes.md` in the Banhaten package.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Banhaten chart designs and illustrative block datasets are adapted from EvilCharts:
|
|
2
|
+
https://github.com/legions-developer/evilcharts
|
|
3
|
+
|
|
4
|
+
MIT License
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2026 Gurbinder
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in all
|
|
16
|
+
copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
+
SOFTWARE.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* State a parent may control. While `value` is undefined the hook keeps its
|
|
7
|
+
* own copy, seeded from `defaultValue`; either way `onChange` hears every
|
|
8
|
+
* change made through the returned setter.
|
|
9
|
+
*/
|
|
10
|
+
export function useControllableState<T>({
|
|
11
|
+
defaultValue,
|
|
12
|
+
onChange,
|
|
13
|
+
value,
|
|
14
|
+
}: {
|
|
15
|
+
defaultValue: T
|
|
16
|
+
onChange?: (value: T) => void
|
|
17
|
+
value?: T
|
|
18
|
+
}) {
|
|
19
|
+
const [uncontrolled, setUncontrolled] = React.useState(defaultValue)
|
|
20
|
+
const controlled = value !== undefined
|
|
21
|
+
const onChangeRef = React.useRef(onChange)
|
|
22
|
+
onChangeRef.current = onChange
|
|
23
|
+
|
|
24
|
+
const setValue = React.useCallback(
|
|
25
|
+
(next: T) => {
|
|
26
|
+
if (!controlled) setUncontrolled(next)
|
|
27
|
+
onChangeRef.current?.(next)
|
|
28
|
+
},
|
|
29
|
+
[controlled]
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return [controlled ? value : uncontrolled, setValue] as const
|
|
33
|
+
}
|