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,173 +1,173 @@
|
|
|
1
|
-
# Component Token Consistency Audit
|
|
2
|
-
|
|
3
|
-
Date: 2026-06-13
|
|
4
|
-
|
|
5
|
-
## Scope
|
|
6
|
-
|
|
7
|
-
Reviewed the distributable component surface in `registry/components`, expanded component files in `registry/components/expanded`, generated/global token CSS in `registry/styles/globals.css`, token generation and contract scripts, and the playground mirrors.
|
|
8
|
-
|
|
9
|
-
This audit is focused on whether component color, spacing, sizing, radius, typography, opacity, focus, z-index, shadow, and motion values are driven by Banhaten tokens or documented component aliases.
|
|
10
|
-
|
|
11
|
-
## Checks Run
|
|
12
|
-
|
|
13
|
-
- `npm run tokens:check` passed.
|
|
14
|
-
- `npm run registry:check` passed.
|
|
15
|
-
- `npm --prefix playground run test:components` passed with 97 component tests.
|
|
16
|
-
|
|
17
|
-
Current automated coverage:
|
|
18
|
-
|
|
19
|
-
- The token catalog compiler merges the owned `tokens/source/` fragments into
|
|
20
|
-
`tokens/banhaten.tokens.json`; `scripts/generate-token-css.mjs` combines that
|
|
21
|
-
compiled contract with `tokens/banhaten.utilities.css` and emits
|
|
22
|
-
`registry/styles/globals.css` without reading either generated output as an
|
|
23
|
-
authored input.
|
|
24
|
-
- `scripts/check-token-css-reproducibility.mjs` runs the generator in a clean temporary tree with no previous `globals.css` and verifies equivalent generated content after line-ending normalization.
|
|
25
|
-
- `scripts/check-token-contract.mjs` verifies those component aliases exist in the generated CSS.
|
|
26
|
-
- `scripts/check-component-token-usage.mjs` scans `registry/components` for raw component-source values.
|
|
27
|
-
- `scripts/check-registry-mirrors.mjs` verifies playground mirrors stay in sync with registry files.
|
|
28
|
-
|
|
29
|
-
## Current Status
|
|
30
|
-
|
|
31
|
-
The component library is mostly token-consistent now. The major items from the previous audit have been completed:
|
|
32
|
-
|
|
33
|
-
- Component aliases have explicit owners under `tokens/source/` and compile into
|
|
34
|
-
one publication artifact; JavaScript no longer carries a second token source.
|
|
35
|
-
- Tailwind mappings, keyframes, global rules, accessibility rules, and typography utilities are authored in `tokens/banhaten.utilities.css`; generated CSS is output-only.
|
|
36
|
-
- Generated CSS is current.
|
|
37
|
-
- Component aliases are contract-checked.
|
|
38
|
-
- Registry component source passes the token-usage check.
|
|
39
|
-
- Registry and playground mirrors match.
|
|
40
|
-
- Core focus, z-index, duration, spacing, radius, typography, icon sizing, and common opacity patterns are now tokenized.
|
|
41
|
-
|
|
42
|
-
The remaining changes are smaller consistency and governance items.
|
|
43
|
-
|
|
44
|
-
## Required Changes
|
|
45
|
-
|
|
46
|
-
### P1: Replace Remaining Raw `opacity-0` Utilities
|
|
47
|
-
|
|
48
|
-
`--bh-opacity-0` already exists, and most components use tokenized opacity. Replace the remaining Tailwind raw zero-opacity utilities with token-backed forms:
|
|
49
|
-
|
|
50
|
-
- `registry/components/date-picker.tsx`: replace `disabled:opacity-0` with `disabled:opacity-[var(--bh-opacity-0)]`.
|
|
51
|
-
- `registry/components/radio-group.tsx`: replace the hidden input `opacity-0` with `opacity-[var(--bh-opacity-0)]`.
|
|
52
|
-
- `registry/components/textarea.tsx`: replace `after:opacity-0` with `after:opacity-[var(--bh-opacity-0)]`.
|
|
53
|
-
- Sync mirrors through `npm run registry:sync` or the existing mirror workflow.
|
|
54
|
-
|
|
55
|
-
This is not a visual bug, but it is a token-discipline cleanup.
|
|
56
|
-
|
|
57
|
-
### P1: Tighten The Token-Usage Check For Zero And Full Opacity
|
|
58
|
-
|
|
59
|
-
`scripts/check-component-token-usage.mjs` currently flags raw Tailwind opacity only for `50`, `55`, `60`, and `70`. Extend that rule so component source also flags raw `opacity-0` and `opacity-100`, unless an explicit exception is added.
|
|
60
|
-
|
|
61
|
-
Recommended pattern target:
|
|
62
|
-
|
|
63
|
-
- Flag: `opacity-0`, `opacity-100`, `disabled:opacity-0`, `after:opacity-0`, grouped/state-prefixed variants.
|
|
64
|
-
- Allow: `opacity-[var(--bh-opacity-0)]`, `opacity-[var(--bh-opacity-100)]`.
|
|
65
|
-
|
|
66
|
-
### P2: Create A Formal Exception Ledger For Non-Token Literals In Alias Source
|
|
67
|
-
|
|
68
|
-
Raw contract values in the authored token fragments are no longer leaking into
|
|
69
|
-
component source. Intentional external or Figma-specific values carry a type and
|
|
70
|
-
stay reviewable under their canonical owner so future cleanup does not
|
|
71
|
-
accidentally erase brand/media fidelity.
|
|
72
|
-
|
|
73
|
-
Document as approved exceptions or promote into a clearer token group:
|
|
74
|
-
|
|
75
|
-
- Social provider colors: Facebook, Google, LinkedIn, WhatsApp.
|
|
76
|
-
- Radio-card illustrative/payment colors and dimensions.
|
|
77
|
-
- Fractional icon/media geometry such as `28.333px`, `13.333px`, and `6.364px`.
|
|
78
|
-
- Effect/shadow color stops, since the supplied token zips do not include effect tokens.
|
|
79
|
-
- Expanded layout widths and breakpoints for showcase/product-sized components.
|
|
80
|
-
- `--bh-activity-feed-completed-brightness: 0.99`, or replace it with a semantic completed-state color if the visual can be expressed without a brightness filter.
|
|
81
|
-
|
|
82
|
-
### P2: Keep JS Numeric Offsets Paired With CSS Tokens
|
|
83
|
-
|
|
84
|
-
Radix APIs require numeric `sideOffset` values, so these cannot directly consume CSS variables:
|
|
85
|
-
|
|
86
|
-
- `registry/components/select.tsx` uses `SELECT_MENU_SIDE_OFFSET_PX = 4`, mirroring `--bh-select-menu-offset`.
|
|
87
|
-
- `registry/components/tooltip.tsx` uses pointer and pointerless numeric offsets, mirroring tooltip spacing aliases.
|
|
88
|
-
|
|
89
|
-
The comments are already present. The remaining change is to add these cases to the exception ledger or add a small assertion/test that keeps the JS numbers aligned with their matching aliases.
|
|
90
|
-
|
|
91
|
-
### P3: Clarify Expanded Component Contract
|
|
92
|
-
|
|
93
|
-
Expanded components are registered with `status: "expanded"` and have many layout aliases, especially Icon Explorer, Table, Timeline, Steps, Catalog Components, and File Upload. Decide whether these are production component contracts or documentation/showcase layouts.
|
|
94
|
-
|
|
95
|
-
If production:
|
|
96
|
-
|
|
97
|
-
- Keep the `--bh-*` layout aliases as public component tokens.
|
|
98
|
-
- Add docs for which layout aliases are safe to override.
|
|
99
|
-
- Add them to any token documentation tables.
|
|
100
|
-
|
|
101
|
-
If documentation/showcase only:
|
|
102
|
-
|
|
103
|
-
- Mark them as documentation-level layout tokens.
|
|
104
|
-
- Keep them under the static token check, but document that their large fixed widths are layout constraints rather than primitive spacing tokens.
|
|
105
|
-
|
|
106
|
-
## Component Matrix
|
|
107
|
-
|
|
108
|
-
### Core Components
|
|
109
|
-
|
|
110
|
-
Needs token cleanup:
|
|
111
|
-
|
|
112
|
-
- Date Picker: raw `disabled:opacity-0`.
|
|
113
|
-
- Radio Group: raw hidden-input `opacity-0`.
|
|
114
|
-
- Textarea: raw focus-ring pseudo-element `after:opacity-0`.
|
|
115
|
-
|
|
116
|
-
Token-clean under current checks:
|
|
117
|
-
|
|
118
|
-
- Accordion
|
|
119
|
-
- Alert
|
|
120
|
-
- Attribute
|
|
121
|
-
- Avatar
|
|
122
|
-
- Badge
|
|
123
|
-
- Button
|
|
124
|
-
- Button Group
|
|
125
|
-
- Card
|
|
126
|
-
- Checkbox
|
|
127
|
-
- Divider
|
|
128
|
-
- Input
|
|
129
|
-
- Menu
|
|
130
|
-
- Modal
|
|
131
|
-
- Pagination
|
|
132
|
-
- Progress
|
|
133
|
-
- Progress Slider
|
|
134
|
-
- Radio Card
|
|
135
|
-
- Select
|
|
136
|
-
- Select Content
|
|
137
|
-
- Slider
|
|
138
|
-
- Social Button
|
|
139
|
-
- Spinner
|
|
140
|
-
- Tag
|
|
141
|
-
- Toggle
|
|
142
|
-
- Toolbar
|
|
143
|
-
- Tooltip
|
|
144
|
-
|
|
145
|
-
### Expanded Components
|
|
146
|
-
|
|
147
|
-
No direct component-source token violations remain under the current static check. Their remaining work is contract clarity and exception documentation:
|
|
148
|
-
|
|
149
|
-
- Activity Feed
|
|
150
|
-
- Banner
|
|
151
|
-
- Breadcrumbs
|
|
152
|
-
- Catalog Components Showcase
|
|
153
|
-
- Command Bar
|
|
154
|
-
- Expanded Divider
|
|
155
|
-
- File Upload
|
|
156
|
-
- Icon Explorer
|
|
157
|
-
- Onboarding Step List Item
|
|
158
|
-
- Page Header
|
|
159
|
-
- Slideout
|
|
160
|
-
- Steps
|
|
161
|
-
- Table
|
|
162
|
-
- Tabs
|
|
163
|
-
- Timeline
|
|
164
|
-
|
|
165
|
-
Approved literal media-query breakpoints remain in CSS `@media` conditions because CSS custom properties are not reliable media-query operands. Geometry inside those media query blocks should continue using Banhaten tokens or component aliases.
|
|
166
|
-
|
|
167
|
-
## Suggested Implementation Order
|
|
168
|
-
|
|
169
|
-
1. Replace the three raw `opacity-0` utilities in registry components and sync mirrors.
|
|
170
|
-
2. Extend `scripts/check-component-token-usage.mjs` to catch raw `opacity-0` and `opacity-100`.
|
|
171
|
-
3. Add an exception ledger for alias-source literals and Radix numeric offsets.
|
|
172
|
-
4. Decide and document the expanded-component token contract.
|
|
173
|
-
5. Re-run `npm run tokens:check`, `npm run registry:check`, and `npm --prefix playground run test:components`.
|
|
1
|
+
# Component Token Consistency Audit
|
|
2
|
+
|
|
3
|
+
Date: 2026-06-13
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
Reviewed the distributable component surface in `registry/components`, expanded component files in `registry/components/expanded`, generated/global token CSS in `registry/styles/globals.css`, token generation and contract scripts, and the playground mirrors.
|
|
8
|
+
|
|
9
|
+
This audit is focused on whether component color, spacing, sizing, radius, typography, opacity, focus, z-index, shadow, and motion values are driven by Banhaten tokens or documented component aliases.
|
|
10
|
+
|
|
11
|
+
## Checks Run
|
|
12
|
+
|
|
13
|
+
- `npm run tokens:check` passed.
|
|
14
|
+
- `npm run registry:check` passed.
|
|
15
|
+
- `npm --prefix playground run test:components` passed with 97 component tests.
|
|
16
|
+
|
|
17
|
+
Current automated coverage:
|
|
18
|
+
|
|
19
|
+
- The token catalog compiler merges the owned `tokens/source/` fragments into
|
|
20
|
+
`tokens/banhaten.tokens.json`; `scripts/generate-token-css.mjs` combines that
|
|
21
|
+
compiled contract with `tokens/banhaten.utilities.css` and emits
|
|
22
|
+
`registry/styles/globals.css` without reading either generated output as an
|
|
23
|
+
authored input.
|
|
24
|
+
- `scripts/check-token-css-reproducibility.mjs` runs the generator in a clean temporary tree with no previous `globals.css` and verifies equivalent generated content after line-ending normalization.
|
|
25
|
+
- `scripts/check-token-contract.mjs` verifies those component aliases exist in the generated CSS.
|
|
26
|
+
- `scripts/check-component-token-usage.mjs` scans `registry/components` for raw component-source values.
|
|
27
|
+
- `scripts/check-registry-mirrors.mjs` verifies playground mirrors stay in sync with registry files.
|
|
28
|
+
|
|
29
|
+
## Current Status
|
|
30
|
+
|
|
31
|
+
The component library is mostly token-consistent now. The major items from the previous audit have been completed:
|
|
32
|
+
|
|
33
|
+
- Component aliases have explicit owners under `tokens/source/` and compile into
|
|
34
|
+
one publication artifact; JavaScript no longer carries a second token source.
|
|
35
|
+
- Tailwind mappings, keyframes, global rules, accessibility rules, and typography utilities are authored in `tokens/banhaten.utilities.css`; generated CSS is output-only.
|
|
36
|
+
- Generated CSS is current.
|
|
37
|
+
- Component aliases are contract-checked.
|
|
38
|
+
- Registry component source passes the token-usage check.
|
|
39
|
+
- Registry and playground mirrors match.
|
|
40
|
+
- Core focus, z-index, duration, spacing, radius, typography, icon sizing, and common opacity patterns are now tokenized.
|
|
41
|
+
|
|
42
|
+
The remaining changes are smaller consistency and governance items.
|
|
43
|
+
|
|
44
|
+
## Required Changes
|
|
45
|
+
|
|
46
|
+
### P1: Replace Remaining Raw `opacity-0` Utilities
|
|
47
|
+
|
|
48
|
+
`--bh-opacity-0` already exists, and most components use tokenized opacity. Replace the remaining Tailwind raw zero-opacity utilities with token-backed forms:
|
|
49
|
+
|
|
50
|
+
- `registry/components/date-picker.tsx`: replace `disabled:opacity-0` with `disabled:opacity-[var(--bh-opacity-0)]`.
|
|
51
|
+
- `registry/components/radio-group.tsx`: replace the hidden input `opacity-0` with `opacity-[var(--bh-opacity-0)]`.
|
|
52
|
+
- `registry/components/textarea.tsx`: replace `after:opacity-0` with `after:opacity-[var(--bh-opacity-0)]`.
|
|
53
|
+
- Sync mirrors through `npm run registry:sync` or the existing mirror workflow.
|
|
54
|
+
|
|
55
|
+
This is not a visual bug, but it is a token-discipline cleanup.
|
|
56
|
+
|
|
57
|
+
### P1: Tighten The Token-Usage Check For Zero And Full Opacity
|
|
58
|
+
|
|
59
|
+
`scripts/check-component-token-usage.mjs` currently flags raw Tailwind opacity only for `50`, `55`, `60`, and `70`. Extend that rule so component source also flags raw `opacity-0` and `opacity-100`, unless an explicit exception is added.
|
|
60
|
+
|
|
61
|
+
Recommended pattern target:
|
|
62
|
+
|
|
63
|
+
- Flag: `opacity-0`, `opacity-100`, `disabled:opacity-0`, `after:opacity-0`, grouped/state-prefixed variants.
|
|
64
|
+
- Allow: `opacity-[var(--bh-opacity-0)]`, `opacity-[var(--bh-opacity-100)]`.
|
|
65
|
+
|
|
66
|
+
### P2: Create A Formal Exception Ledger For Non-Token Literals In Alias Source
|
|
67
|
+
|
|
68
|
+
Raw contract values in the authored token fragments are no longer leaking into
|
|
69
|
+
component source. Intentional external or Figma-specific values carry a type and
|
|
70
|
+
stay reviewable under their canonical owner so future cleanup does not
|
|
71
|
+
accidentally erase brand/media fidelity.
|
|
72
|
+
|
|
73
|
+
Document as approved exceptions or promote into a clearer token group:
|
|
74
|
+
|
|
75
|
+
- Social provider colors: Facebook, Google, LinkedIn, WhatsApp.
|
|
76
|
+
- Radio-card illustrative/payment colors and dimensions.
|
|
77
|
+
- Fractional icon/media geometry such as `28.333px`, `13.333px`, and `6.364px`.
|
|
78
|
+
- Effect/shadow color stops, since the supplied token zips do not include effect tokens.
|
|
79
|
+
- Expanded layout widths and breakpoints for showcase/product-sized components.
|
|
80
|
+
- `--bh-activity-feed-completed-brightness: 0.99`, or replace it with a semantic completed-state color if the visual can be expressed without a brightness filter.
|
|
81
|
+
|
|
82
|
+
### P2: Keep JS Numeric Offsets Paired With CSS Tokens
|
|
83
|
+
|
|
84
|
+
Radix APIs require numeric `sideOffset` values, so these cannot directly consume CSS variables:
|
|
85
|
+
|
|
86
|
+
- `registry/components/select.tsx` uses `SELECT_MENU_SIDE_OFFSET_PX = 4`, mirroring `--bh-select-menu-offset`.
|
|
87
|
+
- `registry/components/tooltip.tsx` uses pointer and pointerless numeric offsets, mirroring tooltip spacing aliases.
|
|
88
|
+
|
|
89
|
+
The comments are already present. The remaining change is to add these cases to the exception ledger or add a small assertion/test that keeps the JS numbers aligned with their matching aliases.
|
|
90
|
+
|
|
91
|
+
### P3: Clarify Expanded Component Contract
|
|
92
|
+
|
|
93
|
+
Expanded components are registered with `status: "expanded"` and have many layout aliases, especially Icon Explorer, Table, Timeline, Steps, Catalog Components, and File Upload. Decide whether these are production component contracts or documentation/showcase layouts.
|
|
94
|
+
|
|
95
|
+
If production:
|
|
96
|
+
|
|
97
|
+
- Keep the `--bh-*` layout aliases as public component tokens.
|
|
98
|
+
- Add docs for which layout aliases are safe to override.
|
|
99
|
+
- Add them to any token documentation tables.
|
|
100
|
+
|
|
101
|
+
If documentation/showcase only:
|
|
102
|
+
|
|
103
|
+
- Mark them as documentation-level layout tokens.
|
|
104
|
+
- Keep them under the static token check, but document that their large fixed widths are layout constraints rather than primitive spacing tokens.
|
|
105
|
+
|
|
106
|
+
## Component Matrix
|
|
107
|
+
|
|
108
|
+
### Core Components
|
|
109
|
+
|
|
110
|
+
Needs token cleanup:
|
|
111
|
+
|
|
112
|
+
- Date Picker: raw `disabled:opacity-0`.
|
|
113
|
+
- Radio Group: raw hidden-input `opacity-0`.
|
|
114
|
+
- Textarea: raw focus-ring pseudo-element `after:opacity-0`.
|
|
115
|
+
|
|
116
|
+
Token-clean under current checks:
|
|
117
|
+
|
|
118
|
+
- Accordion
|
|
119
|
+
- Alert
|
|
120
|
+
- Attribute
|
|
121
|
+
- Avatar
|
|
122
|
+
- Badge
|
|
123
|
+
- Button
|
|
124
|
+
- Button Group
|
|
125
|
+
- Card
|
|
126
|
+
- Checkbox
|
|
127
|
+
- Divider
|
|
128
|
+
- Input
|
|
129
|
+
- Menu
|
|
130
|
+
- Modal
|
|
131
|
+
- Pagination
|
|
132
|
+
- Progress
|
|
133
|
+
- Progress Slider
|
|
134
|
+
- Radio Card
|
|
135
|
+
- Select
|
|
136
|
+
- Select Content
|
|
137
|
+
- Slider
|
|
138
|
+
- Social Button
|
|
139
|
+
- Spinner
|
|
140
|
+
- Tag
|
|
141
|
+
- Toggle
|
|
142
|
+
- Toolbar
|
|
143
|
+
- Tooltip
|
|
144
|
+
|
|
145
|
+
### Expanded Components
|
|
146
|
+
|
|
147
|
+
No direct component-source token violations remain under the current static check. Their remaining work is contract clarity and exception documentation:
|
|
148
|
+
|
|
149
|
+
- Activity Feed
|
|
150
|
+
- Banner
|
|
151
|
+
- Breadcrumbs
|
|
152
|
+
- Catalog Components Showcase
|
|
153
|
+
- Command Bar
|
|
154
|
+
- Expanded Divider
|
|
155
|
+
- File Upload
|
|
156
|
+
- Icon Explorer
|
|
157
|
+
- Onboarding Step List Item
|
|
158
|
+
- Page Header
|
|
159
|
+
- Slideout
|
|
160
|
+
- Steps
|
|
161
|
+
- Table
|
|
162
|
+
- Tabs
|
|
163
|
+
- Timeline
|
|
164
|
+
|
|
165
|
+
Approved literal media-query breakpoints remain in CSS `@media` conditions because CSS custom properties are not reliable media-query operands. Geometry inside those media query blocks should continue using Banhaten tokens or component aliases.
|
|
166
|
+
|
|
167
|
+
## Suggested Implementation Order
|
|
168
|
+
|
|
169
|
+
1. Replace the three raw `opacity-0` utilities in registry components and sync mirrors.
|
|
170
|
+
2. Extend `scripts/check-component-token-usage.mjs` to catch raw `opacity-0` and `opacity-100`.
|
|
171
|
+
3. Add an exception ledger for alias-source literals and Radix numeric offsets.
|
|
172
|
+
4. Decide and document the expanded-component token contract.
|
|
173
|
+
5. Re-run `npm run tokens:check`, `npm run registry:check`, and `npm --prefix playground run test:components`.
|
|
@@ -1,76 +1,90 @@
|
|
|
1
|
-
# Components
|
|
2
|
-
|
|
3
|
-
Design-system components use semantic props and tokens. Appearance presets may change their visual treatment, but they should not change component APIs.
|
|
4
|
-
|
|
5
|
-
## Component Catalog
|
|
6
|
-
|
|
7
|
-
- [Accordion](./accordion.md): Radix-backed disclosure primitive with variants, size scale, animation, and RTL-safe text alignment.
|
|
8
|
-
- [Activity Feed](./activity-feed.md): vertical activity timeline with avatars, status dots, captions or slot content, actions, and RTL support.
|
|
9
|
-
- [Activity Heatmap](./activity-heatmap.md): token-only seven-day activity grid with five intensity levels, responsive overflow, and RTL support.
|
|
10
|
-
- [Alert](./alert.md): compact and expandable contextual feedback with semantic status colors, action links, close control, and RTL support.
|
|
11
|
-
- [Alert Dialog](./alert-dialog.md): Radix AlertDialog-backed confirmation surface for destructive or consequential actions with semantic intent styling.
|
|
12
|
-
- [Aspect Ratio](./aspect-ratio.md): Radix AspectRatio wrapper for fixed-format media, previews, and product surfaces.
|
|
13
|
-
- [Attribute](./attribute.md): semantic key-value description lists with alignment variants, density, bordered rows, rich value slots, and RTL support.
|
|
14
|
-
- [Autocomplete](./autocomplete.md): searchable combobox field composed from Input, Select menu rows, and Tag chips for single or multiple selection.
|
|
15
|
-
- [Avatar](./avatar.md): user avatar primitive with image, fallback, status, action overlays, groups, and RTL-safe overlap.
|
|
16
|
-
- [Badge](./badge.md): compact status and metadata primitive with semantic colors, icons, dots, flags, counts, and RTL support.
|
|
17
|
-
- [Banner](./banner.md): announcement and notice strip with slim, action, inline-action, input, color, size, content, and RTL variants.
|
|
18
|
-
- [Button](./button.md): semantic action primitive with variants, text and icon sizes, loading composition, link composition, and Arabic/RTL-safe icon behavior.
|
|
19
|
-
- [Button Group](./button-group.md): connected action groups with text and icon-only modes, md/sm/xs sizes, RTL widths, dividers, native interaction styling, and active/disabled states.
|
|
20
|
-
- [Breadcrumbs](./breadcrumbs.md): hierarchical page navigation with slash or chevron separators, raised or inline styles, and RTL support.
|
|
21
|
-
- [Card](./card.md): token-built content surface with image placements, footer actions, desktop/mobile spacing, and RTL-safe copy.
|
|
22
|
-
- [Carousel](./carousel.md): Embla-backed carousel with content, item, previous, and next controls.
|
|
23
|
-
- [Catalog Components](./catalog-components.md): expanded catalog showcase bundle for breadcrumbs, dividers, tags, file upload states, and table previews.
|
|
24
|
-
- [Chart](./chart.md): Recharts wrapper with Banhaten chart tokens, responsive container, tooltip content, and legend content.
|
|
25
|
-
- [Checkbox](./checkbox.md): Radix checkbox primitive plus checkbox-card composition with selected, disabled, hover, and RTL states.
|
|
26
|
-
- [Collapsible](./collapsible.md): Radix Collapsible wrapper for disclosure sections with tokenized trigger and content slots.
|
|
27
|
-
- [Command](./command.md): cmdk-backed command menu with search, groups, shortcuts, separators, and empty state.
|
|
28
|
-
- [Context Menu](./context-menu.md): Radix ContextMenu-backed right-click menu with labels, separators, submenus, checks, radios, and shortcuts.
|
|
29
|
-
- [Date Picker](./date-picker.md): calendar and range-picker suite with presets, open states, triggers, time rows, and RTL support.
|
|
30
|
-
- [Divider](./divider.md): horizontal and vertical separator with solid or dotted rules.
|
|
31
|
-
- [Empty State](./empty-state.md): no-results and first-run state with a neutral icon halo, title, supporting copy, actions, and RTL support.
|
|
32
|
-
- [File Upload](./file-upload.md): drag-and-drop upload target with queued file rows, status feedback, and LTR/RTL size variants.
|
|
33
|
-
- [Field](./field.md): accessible form-row composition for labels, controls, descriptions, errors, grouped fields, and validation state.
|
|
34
|
-
- [Hover Card](./hover-card.md): Radix HoverCard-backed preview surface for rich hover and focus context.
|
|
35
|
-
- [Icons](./icons.md): expanded icon explorer for pack review, semantic mapping, shortlist comparison, and Iconify inspection.
|
|
36
|
-
- [Input](./input.md): text-entry field with labels, helper and error text, add-ons, tags, shortcuts, adornments, and RTL states.
|
|
37
|
-
- [Input Group](./input-group.md): grouped input shell for protocol add-ons, inline actions, prefixes, suffixes, and compact rows.
|
|
38
|
-
- [Input OTP](./input-otp.md): one-time-code field with grouped slots, paste distribution, masked values, hidden form value, and RTL keyboard behavior.
|
|
39
|
-
- [Item](./item.md): composable list and action row with media, content, title, description, actions, separators, variants, sizes, and token-only styling.
|
|
40
|
-
- [Kbd](./kbd.md): keyboard hint primitive for shortcuts, command rows, and form help text.
|
|
41
|
-
- [Label](./label.md): Radix-backed accessible label primitive with required, optional, tone, disabled, and RTL-safe text behavior.
|
|
42
|
-
- [Menu](./menu.md): Radix DropdownMenu-backed command surface with rich item slots, submenus, progress rows, labels, captions, and RTL layout.
|
|
43
|
-
- [Menubar](./menubar.md): Radix Menubar-backed application menu with keyboard navigation and menu item slots.
|
|
44
|
-
- [Modal](./modal.md): Radix Dialog-backed modal surface with size variants, header/body/footer slots, ConfirmModal guardrails, Button actions, Checkbox opt-out, and RTL support.
|
|
45
|
-
- [Native Select](./native-select.md): tokenized native select field for platform forms, mobile fallback, and lightweight option sets.
|
|
46
|
-
- [Navigation Menu](./navigation-menu.md): Radix NavigationMenu-backed top navigation with trigger, content, link, viewport, and indicator parts.
|
|
47
|
-
- [Onboarding Step List Item](./onboarding-step-list-item.md): vertical progress-list row with finished, active, and inactive states plus RTL support.
|
|
48
|
-
- [Page Header](./page-header.md): page hierarchy, title metadata, actions, description, and local tabs.
|
|
49
|
-
- [Pagination](./pagination.md): numeric, simple, and summary pagination layouts with soft or ghost styling, captions, RTL layout, and explicit localized messages.
|
|
50
|
-
- [Popover](./popover.md): contextual overlay primitive with click, focus, hover, positioning, arrows, close affordance, and RTL-safe composition.
|
|
51
|
-
- [Progress](./progress.md): read-only progress meter with value fill, labels, helper text, indicator, spinner, and RTL support.
|
|
52
|
-
- [Progress Slider](./progress-slider.md): Radix Slider-based progress control with start-anchored fill, semantic tones, ticks, and RTL keyboard behavior.
|
|
53
|
-
- [Radio Card](./radio-card.md): rich single-choice option card with Figma content types, active/disabled states, and explicit RTL variants.
|
|
54
|
-
- [Radio Group](./radio-group.md): native-input radio group with labels, descriptions, errors, controlled/uncontrolled values, and RTL-safe field rows.
|
|
55
|
-
- [Select](./select.md): Radix Select-backed field and menu item system with item media, selection styles, validation states, and RTL layout.
|
|
56
|
-
- [Segmented Control](./segmented-control.md): content-width single or multiple selection control with semantic density, an optional label segment, keyboard navigation, and RTL support.
|
|
57
|
-
- [Resizable](./resizable.md): react-resizable-panels-backed split pane primitive with tokenized resize handle.
|
|
58
|
-
- [
|
|
59
|
-
- [
|
|
60
|
-
- [
|
|
61
|
-
- [
|
|
62
|
-
- [
|
|
63
|
-
- [
|
|
64
|
-
- [
|
|
65
|
-
- [
|
|
66
|
-
- [
|
|
67
|
-
- [
|
|
68
|
-
- [
|
|
69
|
-
- [
|
|
70
|
-
- [
|
|
71
|
-
- [
|
|
72
|
-
- [
|
|
73
|
-
- [
|
|
74
|
-
- [
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
1
|
+
# Components
|
|
2
|
+
|
|
3
|
+
Design-system components use semantic props and tokens. Appearance presets may change their visual treatment, but they should not change component APIs.
|
|
4
|
+
|
|
5
|
+
## Component Catalog
|
|
6
|
+
|
|
7
|
+
- [Accordion](./accordion.md): Radix-backed disclosure primitive with variants, size scale, animation, and RTL-safe text alignment.
|
|
8
|
+
- [Activity Feed](./activity-feed.md): vertical activity timeline with avatars, status dots, captions or slot content, actions, and RTL support.
|
|
9
|
+
- [Activity Heatmap](./activity-heatmap.md): token-only seven-day activity grid with five intensity levels, responsive overflow, and RTL support.
|
|
10
|
+
- [Alert](./alert.md): compact and expandable contextual feedback with semantic status colors, action links, close control, and RTL support.
|
|
11
|
+
- [Alert Dialog](./alert-dialog.md): Radix AlertDialog-backed confirmation surface for destructive or consequential actions with semantic intent styling.
|
|
12
|
+
- [Aspect Ratio](./aspect-ratio.md): Radix AspectRatio wrapper for fixed-format media, previews, and product surfaces.
|
|
13
|
+
- [Attribute](./attribute.md): semantic key-value description lists with alignment variants, density, bordered rows, rich value slots, and RTL support.
|
|
14
|
+
- [Autocomplete](./autocomplete.md): searchable combobox field composed from Input, Select menu rows, and Tag chips for single or multiple selection.
|
|
15
|
+
- [Avatar](./avatar.md): user avatar primitive with image, fallback, status, action overlays, groups, and RTL-safe overlap.
|
|
16
|
+
- [Badge](./badge.md): compact status and metadata primitive with semantic colors, icons, dots, flags, counts, and RTL support.
|
|
17
|
+
- [Banner](./banner.md): announcement and notice strip with slim, action, inline-action, input, color, size, content, and RTL variants.
|
|
18
|
+
- [Button](./button.md): semantic action primitive with variants, text and icon sizes, loading composition, link composition, and Arabic/RTL-safe icon behavior.
|
|
19
|
+
- [Button Group](./button-group.md): connected action groups with text and icon-only modes, md/sm/xs sizes, RTL widths, dividers, native interaction styling, and active/disabled states.
|
|
20
|
+
- [Breadcrumbs](./breadcrumbs.md): hierarchical page navigation with slash or chevron separators, raised or inline styles, and RTL support.
|
|
21
|
+
- [Card](./card.md): token-built content surface with image placements, footer actions, desktop/mobile spacing, and RTL-safe copy.
|
|
22
|
+
- [Carousel](./carousel.md): Embla-backed carousel with content, item, previous, and next controls.
|
|
23
|
+
- [Catalog Components](./catalog-components.md): expanded catalog showcase bundle for breadcrumbs, dividers, tags, file upload states, and table previews.
|
|
24
|
+
- [Chart](./chart.md): Recharts wrapper with Banhaten chart tokens, responsive container, tooltip content, and legend content.
|
|
25
|
+
- [Checkbox](./checkbox.md): Radix checkbox primitive plus checkbox-card composition with selected, disabled, hover, and RTL states.
|
|
26
|
+
- [Collapsible](./collapsible.md): Radix Collapsible wrapper for disclosure sections with tokenized trigger and content slots.
|
|
27
|
+
- [Command](./command.md): cmdk-backed command menu with search, groups, shortcuts, separators, and empty state.
|
|
28
|
+
- [Context Menu](./context-menu.md): Radix ContextMenu-backed right-click menu with labels, separators, submenus, checks, radios, and shortcuts.
|
|
29
|
+
- [Date Picker](./date-picker.md): calendar and range-picker suite with presets, open states, triggers, time rows, and RTL support.
|
|
30
|
+
- [Divider](./divider.md): horizontal and vertical separator with solid or dotted rules.
|
|
31
|
+
- [Empty State](./empty-state.md): no-results and first-run state with a neutral icon halo, title, supporting copy, actions, and RTL support.
|
|
32
|
+
- [File Upload](./file-upload.md): drag-and-drop upload target with queued file rows, status feedback, and LTR/RTL size variants.
|
|
33
|
+
- [Field](./field.md): accessible form-row composition for labels, controls, descriptions, errors, grouped fields, and validation state.
|
|
34
|
+
- [Hover Card](./hover-card.md): Radix HoverCard-backed preview surface for rich hover and focus context.
|
|
35
|
+
- [Icons](./icons.md): expanded icon explorer for pack review, semantic mapping, shortlist comparison, and Iconify inspection.
|
|
36
|
+
- [Input](./input.md): text-entry field with labels, helper and error text, add-ons, tags, shortcuts, adornments, and RTL states.
|
|
37
|
+
- [Input Group](./input-group.md): grouped input shell for protocol add-ons, inline actions, prefixes, suffixes, and compact rows.
|
|
38
|
+
- [Input OTP](./input-otp.md): one-time-code field with grouped slots, paste distribution, masked values, hidden form value, and RTL keyboard behavior.
|
|
39
|
+
- [Item](./item.md): composable list and action row with media, content, title, description, actions, separators, variants, sizes, and token-only styling.
|
|
40
|
+
- [Kbd](./kbd.md): keyboard hint primitive for shortcuts, command rows, and form help text.
|
|
41
|
+
- [Label](./label.md): Radix-backed accessible label primitive with required, optional, tone, disabled, and RTL-safe text behavior.
|
|
42
|
+
- [Menu](./menu.md): Radix DropdownMenu-backed command surface with rich item slots, submenus, progress rows, labels, captions, and RTL layout.
|
|
43
|
+
- [Menubar](./menubar.md): Radix Menubar-backed application menu with keyboard navigation and menu item slots.
|
|
44
|
+
- [Modal](./modal.md): Radix Dialog-backed modal surface with size variants, header/body/footer slots, ConfirmModal guardrails, Button actions, Checkbox opt-out, and RTL support.
|
|
45
|
+
- [Native Select](./native-select.md): tokenized native select field for platform forms, mobile fallback, and lightweight option sets.
|
|
46
|
+
- [Navigation Menu](./navigation-menu.md): Radix NavigationMenu-backed top navigation with trigger, content, link, viewport, and indicator parts.
|
|
47
|
+
- [Onboarding Step List Item](./onboarding-step-list-item.md): vertical progress-list row with finished, active, and inactive states plus RTL support.
|
|
48
|
+
- [Page Header](./page-header.md): page hierarchy, title metadata, actions, description, and local tabs.
|
|
49
|
+
- [Pagination](./pagination.md): numeric, simple, and summary pagination layouts with soft or ghost styling, captions, RTL layout, and explicit localized messages.
|
|
50
|
+
- [Popover](./popover.md): contextual overlay primitive with click, focus, hover, positioning, arrows, close affordance, and RTL-safe composition.
|
|
51
|
+
- [Progress](./progress.md): read-only progress meter with value fill, labels, helper text, indicator, spinner, and RTL support.
|
|
52
|
+
- [Progress Slider](./progress-slider.md): Radix Slider-based progress control with start-anchored fill, semantic tones, ticks, and RTL keyboard behavior.
|
|
53
|
+
- [Radio Card](./radio-card.md): rich single-choice option card with Figma content types, active/disabled states, and explicit RTL variants.
|
|
54
|
+
- [Radio Group](./radio-group.md): native-input radio group with labels, descriptions, errors, controlled/uncontrolled values, and RTL-safe field rows.
|
|
55
|
+
- [Select](./select.md): Radix Select-backed field and menu item system with item media, selection styles, validation states, and RTL layout.
|
|
56
|
+
- [Segmented Control](./segmented-control.md): content-width single or multiple selection control with semantic density, an optional label segment, keyboard navigation, and RTL support.
|
|
57
|
+
- [Resizable](./resizable.md): react-resizable-panels-backed split pane primitive with tokenized resize handle.
|
|
58
|
+
- [Rolling Count](./rolling-count.md): tabular figures that roll each changed digit into place like an odometer while assistive technology reads the plain value.
|
|
59
|
+
- [Sheet](./sheet.md): Radix Dialog-based edge panel with logical start/end placement, top/bottom placement, size variants, and RTL support.
|
|
60
|
+
- [Shimmer Text](./shimmer-text.md): text with a brightness sweep in reading direction for labels of work in progress.
|
|
61
|
+
- [Sidebar](./sidebar.md): composable app sidebar with collapse state, grouped menu items, logical placement, and sidebar tokens.
|
|
62
|
+
- [Slideout](./slideout.md): desktop and mobile side panel with header/footer actions, scrollable slots, example content, and RTL support.
|
|
63
|
+
- [Scroll Area](./scroll-area.md): Radix ScrollArea wrapper with tokenized viewport, scrollbar, thumb, and corner styling.
|
|
64
|
+
- [Slider](./slider.md): accessible value and range control with single, range, multi-thumb, vertical, ticked, pill, tone, size, disabled, and RTL variants.
|
|
65
|
+
- [Skeleton](./skeleton.md): token-built loading placeholders for text, avatars, actions, forms, cards, lists, tables, shimmer motion, and RTL surfaces.
|
|
66
|
+
- [Social Button](./social-button.md): sign-in action primitive for supported providers with solid, outline, icon-only, focus, and RTL states.
|
|
67
|
+
- [Spinner](./spinner.md): compact steady and dynamic loading spinners with inherited color and tokenized sizing.
|
|
68
|
+
- [Steps](./steps.md): horizontal and vertical progress indicators with icon or number markers, item-level slots/actions, and RTL support.
|
|
69
|
+
- [Table](./table.md): composable table and data-table workflow with selectable rows, sortable headers, search, filters, pagination, row states, RTL support, and reusable cell item variants.
|
|
70
|
+
- [Tabs](./tabs.md): Radix Tabs-backed local navigation with underline, segmented, and rounded treatments across LTR and RTL.
|
|
71
|
+
- [Textarea](./textarea.md): multiline field with labels, helper and error text, default and tags modes, placeholder, filled, disabled, and RTL states.
|
|
72
|
+
- [Timeline](./timeline.md): vertical and horizontal progress/event sequences with default or icon markers, states, dates, captions, and RTL support.
|
|
73
|
+
- [Toast](./toast.md): Sonner-style feedback primitive with semantic intents, action support, Banhaten token styling, and logical RTL placement.
|
|
74
|
+
- [Tag](./tag.md): compact metadata, filter, and removable-selection chip with type, state, size, close-button, and RTL variants.
|
|
75
|
+
- [Toggle](./toggle.md): switch-style boolean control with sm/md sizes, optional handle icons, labeled leading/trailing rows, supporting text, and RTL support.
|
|
76
|
+
- [Toolbar](./toolbar.md): filter and action toolbar with search, select triggers, icon buttons, chips, summaries, desktop/mobile styles, and RTL support.
|
|
77
|
+
- [Tooltip](./tooltip.md): Radix Tooltip-backed help surface with dark/default variants, pointer positions, shortcut/close slots, and RTL support.
|
|
78
|
+
- [Typography](./typography.md): documentation for existing `.bh-text-*` token utility classes.
|
|
79
|
+
|
|
80
|
+
## AI Conversation
|
|
81
|
+
|
|
82
|
+
Components for agent conversations: thinking states, streaming responses, citations, task progress, the prompt composer, and human-in-the-loop approvals. They compose the core components above, including Rolling Count and Shimmer Text, and move on the shared `--bh-duration-*` and `--bh-easing-*` foundation tokens.
|
|
83
|
+
|
|
84
|
+
- [Agent Input](./agent-input.md): AI prompt composer with an auto-growing editor, slash-command skill palette, skill and attachment chips, add menu, prompt enhancement, and send action.
|
|
85
|
+
- [Approval Card](./approval-card.md): human-in-the-loop decision cards for questions, shell command approval, and plan sign-off with an opt-in auto-approve countdown.
|
|
86
|
+
- [Inline Citations](./inline-citations.md): prose with linked superscript citation chips, hover reference names, and a compact source list.
|
|
87
|
+
- [Streaming Text](./streaming-text.md): token-by-token text reveal with a slim caret that stays solid while streaming and blinks when complete.
|
|
88
|
+
- [Task List](./task-list.md): collapsible agent progress tracker with pending, active, and done rows, a list-to-pie-to-check header icon, and rolling counters.
|
|
89
|
+
- [Thinking Reasoning](./thinking-reasoning.md): animated, collapsible reasoning block that reveals sentences as they arrive and folds into a Thought for Ns summary.
|
|
90
|
+
- [Thinking State](./thinking-state.md): shimmering status label for the pre-response beat.
|