banhaten 0.2.0 → 0.4.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 +55 -0
- package/README.md +5 -5
- package/docs/design-system/component-implementation-ownership-audit.md +245 -0
- package/docs/design-system/component-quality-audit-2026-08-20.md +225 -0
- package/docs/design-system/component-showcase-consistency-report.md +2 -0
- package/docs/design-system/components/README.md +1 -0
- package/docs/design-system/components/activity-feed.md +2 -0
- package/docs/design-system/components/activity-heatmap.md +73 -0
- package/docs/design-system/components/alert-dialog.md +1 -1
- package/docs/design-system/components/alert.md +3 -3
- package/docs/design-system/components/attribute.md +1 -1
- package/docs/design-system/components/avatar.md +2 -2
- package/docs/design-system/components/badge.md +1 -1
- package/docs/design-system/components/banner.md +6 -2
- package/docs/design-system/components/breadcrumbs.md +5 -2
- package/docs/design-system/components/button-group.md +3 -2
- package/docs/design-system/components/button.md +2 -2
- package/docs/design-system/components/card.md +11 -3
- package/docs/design-system/components/catalog-components.md +3 -0
- package/docs/design-system/components/date-picker.md +3 -1
- package/docs/design-system/components/file-upload.md +5 -1
- package/docs/design-system/components/input.md +8 -6
- package/docs/design-system/components/item.md +3 -1
- package/docs/design-system/components/kbd.md +11 -8
- package/docs/design-system/components/menu.md +2 -2
- package/docs/design-system/components/modal.md +1 -1
- package/docs/design-system/components/navigation-menu.md +1 -1
- package/docs/design-system/components/onboarding-step-list-item.md +3 -2
- package/docs/design-system/components/page-header.md +3 -1
- package/docs/design-system/components/pagination.md +3 -2
- package/docs/design-system/components/radio-card.md +1 -1
- package/docs/design-system/components/resizable.md +1 -1
- package/docs/design-system/components/scroll-area.md +7 -3
- package/docs/design-system/components/select.md +1 -1
- package/docs/design-system/components/sidebar.md +60 -18
- package/docs/design-system/components/slideout.md +4 -1
- package/docs/design-system/components/steps.md +7 -2
- package/docs/design-system/components/table.md +25 -7
- package/docs/design-system/components/tag.md +3 -3
- package/docs/design-system/components/timeline.md +4 -1
- package/docs/design-system/components/toggle.md +1 -1
- package/docs/design-system/components/toolbar.md +1 -1
- package/docs/design-system/components/tooltip.md +1 -1
- package/docs/design-system/density-and-elevation.md +23 -2
- package/docs/design-system/gap-promotion-report.md +1 -67
- package/docs/design-system/icons.md +6 -1
- package/docs/design-system/installation.md +1 -1
- package/docs/design-system/launch-comparison-shadcn.md +10 -10
- package/docs/design-system/token-governance.md +7 -8
- package/package.json +3 -2
- package/registry/components/alert-dialog.tsx +1 -1
- package/registry/components/alert.tsx +17 -13
- package/registry/components/attribute.tsx +8 -2
- package/registry/components/avatar.tsx +28 -20
- package/registry/components/badge.tsx +17 -17
- package/registry/components/button-group.tsx +4 -2
- package/registry/components/button.tsx +3 -3
- package/registry/components/card.tsx +19 -3
- package/registry/components/carousel.tsx +14 -0
- package/registry/components/command.tsx +37 -3
- package/registry/components/date-picker.tsx +83 -35
- package/registry/components/expanded/ActivityFeed.tsx +3 -7
- package/registry/components/expanded/ActivityHeatmap.tsx +64 -0
- package/registry/components/expanded/Banner.tsx +0 -1
- package/registry/components/expanded/Breadcrumbs.tsx +3 -0
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +3 -4
- package/registry/components/expanded/CatalogDivider.tsx +3 -2
- package/registry/components/expanded/FileUpload.tsx +7 -5
- package/registry/components/expanded/OnboardingStepListItem.tsx +6 -7
- package/registry/components/expanded/PageHeader.tsx +35 -44
- package/registry/components/expanded/Slideout.tsx +18 -13
- package/registry/components/expanded/Steps.tsx +147 -9
- package/registry/components/expanded/Table.tsx +50 -18
- package/registry/components/expanded/Timeline.tsx +11 -24
- package/registry/components/expanded/activityFeed.css +8 -8
- package/registry/components/expanded/activityHeatmap.css +66 -0
- package/registry/components/expanded/banner.css +30 -15
- package/registry/components/expanded/breadcrumbs.css +5 -5
- package/registry/components/expanded/fileUpload.css +4 -4
- package/registry/components/expanded/onboardingStepListItem.css +16 -7
- package/registry/components/expanded/pageHeader.css +14 -11
- package/registry/components/expanded/slideout.css +3 -7
- package/registry/components/expanded/steps.css +75 -12
- package/registry/components/expanded/table.css +63 -69
- package/registry/components/expanded/timeline.css +17 -16
- package/registry/components/field.tsx +61 -8
- package/registry/components/input.tsx +12 -5
- package/registry/components/item.tsx +1 -1
- package/registry/components/kbd.tsx +109 -15
- package/registry/components/menu.tsx +57 -7
- package/registry/components/modal.tsx +1 -1
- package/registry/components/navigation-menu.tsx +1 -1
- package/registry/components/pagination.css +36 -0
- package/registry/components/pagination.tsx +20 -13
- package/registry/components/progress-slider.tsx +1 -1
- package/registry/components/radio-card.tsx +1 -2
- package/registry/components/resizable.tsx +36 -2
- package/registry/components/scroll-area.tsx +30 -6
- package/registry/components/select.tsx +35 -12
- package/registry/components/sidebar.tsx +940 -62
- package/registry/components/social-button.tsx +12 -5
- package/registry/components/table-elements.tsx +128 -0
- package/registry/components/tabs.tsx +5 -10
- package/registry/components/tag.tsx +2 -2
- package/registry/components/toggle.tsx +2 -2
- package/registry/components/toolbar.tsx +6 -6
- package/registry/components/tooltip.tsx +1 -1
- package/registry/examples/attribute-demo.tsx +1 -1
- package/registry/examples/avatar-demo.tsx +7 -4
- package/registry/examples/command-palette-demo.tsx +0 -1
- package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -0
- package/registry/examples/expanded/breadcrumbs-demo.tsx +3 -3
- package/registry/examples/kbd-demo.tsx +2 -1
- package/registry/examples/pagination-demo.tsx +5 -5
- package/registry/examples/sidebar-demo.tsx +59 -13
- package/registry/guidance/USAGE.md +1 -1
- package/registry/index.json +621 -60
- package/registry/styles/globals.css +211 -151
- package/registry.json +44 -6
- package/tokens/banhaten.tokens.json +325 -95
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,61 @@
|
|
|
2
2
|
|
|
3
3
|
All notable Banhaten changes are recorded here. Releases follow the policy in `docs/design-system/release-policy.md`.
|
|
4
4
|
|
|
5
|
+
## 0.4.0 - 2026-08-22
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- A Figma-aligned Sidebar composition with brand and workspace headers, header and group actions, menu badges, nested and tree navigation, user footers, rail tooltips, controlled state, and documented expanded, collapsed, LTR, and RTL variants.
|
|
10
|
+
- `Shortcut`, a compact combined keyboard-chord primitive for inputs and constrained action rows, alongside the existing separated-keycap `KbdShortcut` API.
|
|
11
|
+
- A Test Lab V2 playground with scenario navigation, a focused inspector, state-comparison boards, responsive previews, and browser coverage for the new QA workflow.
|
|
12
|
+
- Noto Sans Arabic as the default Arabic playground font, with the previous Arabic font options retained.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- The default brand theme is now monochrome `gray`; `blue` remains available as an explicit alternate theme.
|
|
17
|
+
- Elevation now publishes the complete seven-level Figma scale as `--shadow-xs` through `--shadow-3xl`, with dedicated reviewed light and dark values and updated token documentation.
|
|
18
|
+
- Shared icon and icon-slot geometry is tokenized across controls, navigation, feedback, and data-display components for more consistent alignment.
|
|
19
|
+
- Sidebar defaults now use a 280px expanded shell and a 48px collapsed rail, with logical placement and spacing throughout.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Sidebar focus, tooltip, collapse, nesting, active-state, narrow-layout, and RTL behavior across both controlled and uncontrolled compositions.
|
|
24
|
+
- Component icon sizing, spacing, and state styling across Alert, Avatar, Button Group, Date Picker, Input, Item, Menu, Pagination, Select, Tag, Toolbar, and expanded compositions.
|
|
25
|
+
- Playground token enforcement now uses explicit Banhaten shadow variables in every Test Lab surface.
|
|
26
|
+
|
|
27
|
+
### Migration
|
|
28
|
+
|
|
29
|
+
- To retain the previous blue default, set `data-theme="blue"` on the themed root; roots without `data-theme` now resolve to gray.
|
|
30
|
+
- Review custom Sidebar shells before updating because the canonical expanded and collapsed widths and the recommended header, menu, and footer composition have changed. Run `npx banhaten diff sidebar` before `npx banhaten update sidebar`, and use `--force` only after reviewing local generated-file changes.
|
|
31
|
+
|
|
32
|
+
## 0.3.0 - 2026-08-21
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- `ActivityHeatmap`, a token-only expanded component with five intensity levels, accessible summary semantics, responsive overflow, inherited RTL behavior, registry metadata, documentation, and an installable example.
|
|
37
|
+
- Public `CardSurface`, semantic table-element exports, and `ProgressSteps` APIs for owned product composition without bypassing Banhaten primitives.
|
|
38
|
+
- An AST-backed component-ownership gate plus route-wide accessibility, inherited-RTL containment, and deterministic visual-regression coverage for every component page.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- Expanded components and all 38 audited playground backgrounds now compose Banhaten-owned controls; Alert, Page Header, and Slideout declare their new Button and Breadcrumbs registry dependencies.
|
|
43
|
+
- Direction inheritance, narrow-layout containment, focus behavior, and machine-readable RTL contracts were completed across the 68-component catalog.
|
|
44
|
+
- Elevation and color-mode sources were consolidated around shared semantic effects, and the canonical contrast audit was expanded to 910 passing scenarios.
|
|
45
|
+
- Page Header accepts `headingLevel`; Timeline labels and captions accept React nodes; horizontal timelines are keyboard-scrollable and standalone `TimelineItem` semantics are now caller-controlled.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- ARIA ownership, naming, focus, landmark, and relationship defects across Date Picker, Select, Command, Tabs, Field, Table, Menu, Carousel, Sidebar, Slideout, Timeline, and composed documentation examples.
|
|
50
|
+
- Contrast failures across component states and themes, including focus indicators, selected states, badges, tags, alerts, banners, toggles, social buttons, and tables.
|
|
51
|
+
- Inherited-RTL and 324px containment defects in activity, navigation, form, data-display, and expanded layout components.
|
|
52
|
+
|
|
53
|
+
### Migration
|
|
54
|
+
|
|
55
|
+
- `SidebarInset` now renders a neutral `div` instead of an implicit `main`. When the inset is the page landmark, render your own `<main>` through `<SidebarInset asChild><main>...</main></SidebarInset>`.
|
|
56
|
+
- `Slideout` is an explicitly named presentational region. Use `Sheet` or `Modal` when the experience requires a portal, overlay, focus trap, Escape dismissal, and focus return.
|
|
57
|
+
- A standalone `TimelineItem` no longer assumes `role="listitem"`; use it inside `Timeline` or pass an explicit role when composing your own list.
|
|
58
|
+
- Run `npx banhaten diff` before `npx banhaten update`, then review locally customized generated files before using `--force`.
|
|
59
|
+
|
|
5
60
|
## 0.2.0 - 2026-08-08
|
|
6
61
|
|
|
7
62
|
### Added
|
package/README.md
CHANGED
|
@@ -109,10 +109,10 @@ Token modes:
|
|
|
109
109
|
- Radius mode: `default`, `rounded`, `sharp`.
|
|
110
110
|
- Direction: inherited LTR or RTL, with component-level `dir` support where needed.
|
|
111
111
|
|
|
112
|
-
The default appearance is the `
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
The default appearance is the monochrome `gray` brand theme. It keeps page,
|
|
113
|
+
card, border, and muted surfaces neutral while applying gray to links, focus
|
|
114
|
+
states, and primary actions as well. `blue` remains available as an alternate
|
|
115
|
+
brand theme.
|
|
116
116
|
|
|
117
117
|
Example:
|
|
118
118
|
|
|
@@ -162,7 +162,7 @@ Markdown docs live in `docs/design-system/components`. They are checked for inst
|
|
|
162
162
|
|
|
163
163
|
Launch guides cover [installation](docs/design-system/installation.md), [direction and localization](docs/design-system/direction-and-localization.md), [form recipes](docs/design-system/form-recipes.md), [density and elevation](docs/design-system/density-and-elevation.md), the [support matrix](docs/design-system/support-matrix.md), and the [release policy](docs/design-system/release-policy.md).
|
|
164
164
|
|
|
165
|
-
The durable [launch comparison with shadcn/ui](docs/design-system/launch-comparison-shadcn.md) records every audited area, remediation, verification gate, contrast
|
|
165
|
+
The durable [launch comparison with shadcn/ui](docs/design-system/launch-comparison-shadcn.md) records every audited area, remediation, verification gate, the closed 910/910 contrast contract, and deliberate non-copying decisions.
|
|
166
166
|
|
|
167
167
|
Useful commands:
|
|
168
168
|
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Component Implementation and Ownership Audit
|
|
2
|
+
|
|
3
|
+
Audit date: 2026-08-20
|
|
4
|
+
|
|
5
|
+
Remediation status: complete for the requested 96 component-ownership gaps
|
|
6
|
+
|
|
7
|
+
## Executive status
|
|
8
|
+
|
|
9
|
+
The requested component-gap remediation is complete.
|
|
10
|
+
|
|
11
|
+
- **96 of 96 requested issues are closed.**
|
|
12
|
+
- All **94 background component-kind gaps** were replaced with Banhaten-owned components or compositions and removed from scenario metadata.
|
|
13
|
+
- The two untracked ownership violations were fixed:
|
|
14
|
+
- Activity Heatmap period controls now use Segmented Control in the live page, copyable example, and customer-activity background.
|
|
15
|
+
- Scroll Area alternatives now use the Banhaten Scroll Area API and no longer import Radix directly.
|
|
16
|
+
- All **38 of 38 audited backgrounds** now pass the enforced component-only consumer rule.
|
|
17
|
+
- Those backgrounds contain **zero native button, input, select, textarea, or table roots**.
|
|
18
|
+
- Playground consumer source contains **zero direct imports from the restricted UI-vendor set**.
|
|
19
|
+
- A new AST-based ownership gate prevents those regressions from returning.
|
|
20
|
+
|
|
21
|
+
This is a pass for the requested component-ownership scope. The subsequent full component-quality audit also closed the five expanded-component primitive-reuse notes, so there are no known visible-control ownership exceptions in the component catalog. It is not a claim that every reference background is visually complete: **100 non-component fidelity gaps remain** and are tracked separately.
|
|
22
|
+
|
|
23
|
+
## Before and after
|
|
24
|
+
|
|
25
|
+
| Measure | Before | Current | Status |
|
|
26
|
+
| --- | ---: | ---: | --- |
|
|
27
|
+
| Requested ownership issues | 96 | 0 open | Pass |
|
|
28
|
+
| Background component-kind gaps | 94 | 0 | Pass |
|
|
29
|
+
| Missing-component gaps | 47 | 0 | Pass |
|
|
30
|
+
| Component approximations | 47 | 0 | Pass |
|
|
31
|
+
| Strict component-only backgrounds | 2 of 38 | 38 of 38 | Pass |
|
|
32
|
+
| Native control/table roots in audited backgrounds | 27 | 0 | Pass |
|
|
33
|
+
| Activity Heatmap raw period-control usages | 3 surfaces | 0 | Pass |
|
|
34
|
+
| Scroll Area direct Radix consumer imports | 1 page | 0 | Pass |
|
|
35
|
+
| Automated ownership boundary | Absent | Enforced in playground test and root check | Pass |
|
|
36
|
+
| Non-component visual gaps | 100 | 100 | Outside this remediation |
|
|
37
|
+
|
|
38
|
+
The remaining visual-gap inventory is:
|
|
39
|
+
|
|
40
|
+
| Gap kind | Count |
|
|
41
|
+
| --- | ---: |
|
|
42
|
+
| Layout/composition fidelity | 47 |
|
|
43
|
+
| Icon assets | 20 |
|
|
44
|
+
| Image assets | 20 |
|
|
45
|
+
| Tokens | 13 |
|
|
46
|
+
| **Total** | **100** |
|
|
47
|
+
|
|
48
|
+
## What changed
|
|
49
|
+
|
|
50
|
+
### Ownership violations
|
|
51
|
+
|
|
52
|
+
- [ActivityHeatmapPage.tsx](../../playground/src/pages/new-components/ActivityHeatmapPage.tsx) now composes SegmentedControl and SegmentedControlItem in both published code and the live example.
|
|
53
|
+
- [customer-activity-dashboard/index.tsx](../../playground/src/app/backgrounds/customer-activity-dashboard/index.tsx) uses the same owned segmented-control contract.
|
|
54
|
+
- [ScrollAreaPage.tsx](../../playground/src/pages/ScrollAreaPage.tsx) no longer imports or assembles Radix primitives.
|
|
55
|
+
- [scroll-area.tsx](../../registry/components/scroll-area.tsx) now exposes vertical, horizontal, and combined orientation behavior through the Banhaten API.
|
|
56
|
+
|
|
57
|
+
### Reusable APIs promoted to close repeated gaps
|
|
58
|
+
|
|
59
|
+
- [table-elements.tsx](../../registry/components/table-elements.tsx) adds Banhaten-owned semantic table and data-surface elements.
|
|
60
|
+
- [card.tsx](../../registry/components/card.tsx) adds CardSurface for product-specific card composition without redrawing a card shell.
|
|
61
|
+
- [sidebar.tsx](../../registry/components/sidebar.tsx) supports standalone owned sidebar surfaces while preserving provider-aware behavior for interactive sidebar parts.
|
|
62
|
+
- [Steps.tsx](../../registry/components/expanded/Steps.tsx) adds ProgressSteps with bar and marker variants.
|
|
63
|
+
- [Timeline.tsx](../../registry/components/expanded/Timeline.tsx) accepts richer label/caption content and local styling hooks needed by migrated flows.
|
|
64
|
+
|
|
65
|
+
### Background migrations
|
|
66
|
+
|
|
67
|
+
The 38 reference backgrounds were audited and migrated as a complete set. The repeated replacements include:
|
|
68
|
+
|
|
69
|
+
- Native buttons to Button, Button Group, Segmented Control, or the relevant owned action component.
|
|
70
|
+
- Handcrafted switches to Toggle.
|
|
71
|
+
- Native inputs/selects/textareas to the matching Banhaten form owner.
|
|
72
|
+
- Native data tables and ARIA table shells to TableRoot or DataTableSurface compositions.
|
|
73
|
+
- Handcrafted cards to CardSurface.
|
|
74
|
+
- Root application sidebars to Sidebar.
|
|
75
|
+
- Custom progress bars, numbered setup flows, and status tracks to ProgressSteps, Steps, or Timeline.
|
|
76
|
+
- Product chips and variables to Tag, Badge, and Avatar composition.
|
|
77
|
+
|
|
78
|
+
Component-gap metadata and component-gap DOM markers were removed only after the corresponding implementations migrated and passed type, unit, build, and browser checks.
|
|
79
|
+
|
|
80
|
+
## Enforced ownership boundary
|
|
81
|
+
|
|
82
|
+
The ownership rule is layer-aware:
|
|
83
|
+
|
|
84
|
+
1. **Registry foundation layer:** Native HTML and declared behavior libraries may be used inside the Banhaten component that owns and publishes that behavior.
|
|
85
|
+
2. **Expanded registry layer:** Higher-level components should compose Banhaten primitives whenever an equivalent owner exists.
|
|
86
|
+
3. **Consumer layer:** Backgrounds, examples, and copyable documentation must use Banhaten components for interactive controls. Passive semantic/layout HTML remains allowed.
|
|
87
|
+
4. **Public integration exceptions:** Recharts remains an intentional extension surface of Chart. No such exception exists for direct Radix, cmdk, Embla, react-resizable-panels, or Sonner imports in playground consumers.
|
|
88
|
+
5. **Test fixtures:** Native elements may be used when a test specifically needs a fixture and does not publish that fixture as product guidance.
|
|
89
|
+
|
|
90
|
+
[component-ownership.test.mjs](../../playground/src/test/component-ownership.test.mjs) now enforces:
|
|
91
|
+
|
|
92
|
+
- No direct playground consumer imports from Radix, cmdk, Embla, react-resizable-panels, or Sonner.
|
|
93
|
+
- No native button, input, select, textarea, or table roots in any background implementation.
|
|
94
|
+
- No component-kind background gap metadata.
|
|
95
|
+
- No raw controls or direct restricted-vendor imports in the copyable Activity Heatmap and Scroll Area pages.
|
|
96
|
+
|
|
97
|
+
The gate runs first in the playground test pipeline and is also available from the repository root as components:ownership:check.
|
|
98
|
+
|
|
99
|
+
## Component-by-component status
|
|
100
|
+
|
|
101
|
+
All 68 catalog components remain owned, buildable, installable, documented, token-validated, and runtime-export validated. The status below focuses on implementation ownership after remediation.
|
|
102
|
+
|
|
103
|
+
| Component | Status | Ownership note |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
| Accordion | Pass | Owned declared Radix wrapper. |
|
|
106
|
+
| Aspect Ratio | Pass | Owned declared Radix wrapper. |
|
|
107
|
+
| Avatar | Pass | Owned declared Radix wrapper. |
|
|
108
|
+
| Badge | Pass | Owned Slot/CVA primitive. |
|
|
109
|
+
| Tag | Pass | Canonical owned tag/chip owner. |
|
|
110
|
+
| Attribute | Pass | Owned structural key/value composition. |
|
|
111
|
+
| Button | Pass | Canonical action owner. |
|
|
112
|
+
| Card | Pass | Owned card family; CardSurface now covers custom card shells. |
|
|
113
|
+
| Chart | Pass — integration | Banhaten owns container, tooltip, legend, and tokens; Recharts children are the documented public extension. |
|
|
114
|
+
| Carousel | Pass — integration | Owned declared Embla behavior with Banhaten controls. |
|
|
115
|
+
| Button Group | Pass | Canonical connected action/toggle owner. |
|
|
116
|
+
| Segmented Control | Pass | Owned mutually exclusive control composed from Button Group. |
|
|
117
|
+
| Toggle | Pass | Owned declared switch behavior. |
|
|
118
|
+
| Menu | Pass | Owned declared Radix menu implementation. |
|
|
119
|
+
| Menubar | Pass | Owned declared Radix menubar implementation. |
|
|
120
|
+
| Command | Pass — integration | Owned cmdk-backed command surface. |
|
|
121
|
+
| Context Menu | Pass | Owned declared Radix context-menu implementation. |
|
|
122
|
+
| Tooltip | Pass | Owned declared Radix tooltip implementation. |
|
|
123
|
+
| Popover | Pass | Owned declared Radix popover implementation. |
|
|
124
|
+
| Hover Card | Pass | Owned declared Radix hover-card implementation. |
|
|
125
|
+
| Modal | Pass | Owned declared dialog behavior and action composition. |
|
|
126
|
+
| Alert Dialog | Pass | Owned declared alert-dialog behavior with Banhaten actions. |
|
|
127
|
+
| Checkbox | Pass | Owned checkbox and checkbox-card behavior. |
|
|
128
|
+
| Collapsible | Pass | Owned declared collapsible implementation. |
|
|
129
|
+
| Radio Group | Pass | Canonical owned radio-group owner. |
|
|
130
|
+
| Radio Card | Pass | Canonical owned radio-card owner. |
|
|
131
|
+
| Divider | Pass | Owned structural separator. |
|
|
132
|
+
| Pagination | Pass | Canonical pagination owner. |
|
|
133
|
+
| Toolbar | Pass | Owned search, action, filter, and select-trigger family. |
|
|
134
|
+
| Social Button | Pass | Owned provider-action primitive. |
|
|
135
|
+
| Input | Pass | Canonical input owner. |
|
|
136
|
+
| Input Group | Pass | Owned grouped input and inline-action surface. |
|
|
137
|
+
| Label | Pass | Owned declared label implementation. |
|
|
138
|
+
| Kbd | Pass | Owned keyboard-hint primitive. |
|
|
139
|
+
| Item | Pass | Owned Slot-based row composition. |
|
|
140
|
+
| Field | Pass | Owned field composition using Label. |
|
|
141
|
+
| Input OTP | Pass | Owned OTP slot and form behavior. |
|
|
142
|
+
| Select | Pass | Owned declared select and rich menu-item surfaces. |
|
|
143
|
+
| Native Select | Pass | Canonical native-select owner. |
|
|
144
|
+
| Sheet | Pass | Owned edge-panel dialog behavior. |
|
|
145
|
+
| Sidebar | Pass | Canonical provider-aware and standalone sidebar owner. |
|
|
146
|
+
| Navigation Menu | Pass | Owned declared navigation-menu implementation. |
|
|
147
|
+
| Scroll Area | Pass | Owned orientation API; direct consumer Radix usage removed. |
|
|
148
|
+
| Resizable | Pass — integration | Owned react-resizable-panels wrapper. |
|
|
149
|
+
| Autocomplete | Pass | Composes Input, Popover, Select, and Tag. |
|
|
150
|
+
| Date Picker | Pass | Owned calendar behavior composed with Banhaten primitives. |
|
|
151
|
+
| Slider | Pass | Owned declared slider implementation. |
|
|
152
|
+
| Progress | Pass | Owned read-only progress primitive. |
|
|
153
|
+
| Progress Slider | Pass | Owned declared interactive progress control. |
|
|
154
|
+
| Textarea | Pass | Canonical textarea owner. |
|
|
155
|
+
| Skeleton | Pass | Owned loading-placeholder family. |
|
|
156
|
+
| Spinner | Pass | Owned loading indicator. |
|
|
157
|
+
| Toast | Pass — integration | Owned Sonner-backed feedback API and token layer. |
|
|
158
|
+
| Activity Feed | Pass | Owned activity composition using Banhaten actions. |
|
|
159
|
+
| Activity Heatmap | Pass | Owned heatmap; period controls now use Segmented Control everywhere published. |
|
|
160
|
+
| Alert | Pass | Canonical alert owner. |
|
|
161
|
+
| Banner | Pass | Composes Banhaten Button and Input. |
|
|
162
|
+
| Catalog Components | Pass | Publishable owned composition; catalog divider actions use Button and the bundle has a dedicated docs page. |
|
|
163
|
+
| Breadcrumbs | Pass | Canonical breadcrumb navigation owner. |
|
|
164
|
+
| File Upload | Pass | Hidden native file input is the valid owned platform hook; all visible browse/retry actions use Button. |
|
|
165
|
+
| Table | Pass | Semantic table surface closes consumer gaps; visible actions use Button and selection/meter semantics are owned. |
|
|
166
|
+
| Empty State | Pass | Uses Banhaten actions, including link composition. |
|
|
167
|
+
| Onboarding Step | Pass | Owned presentational step row. |
|
|
168
|
+
| Page Header | Pass | Composes Breadcrumbs, Tabs, and Button with explicit heading-level and landmark contracts. |
|
|
169
|
+
| Slideout | Pass | Explicitly documented as a named presentational region and composes Button actions; it no longer claims incomplete dialog behavior. |
|
|
170
|
+
| Steps | Pass | Owns standard, horizontal, vertical, and ProgressSteps compositions. |
|
|
171
|
+
| Tabs | Pass | Owned declared tabs implementation. |
|
|
172
|
+
| Timeline | Pass | Owned timeline composition with richer content hooks. |
|
|
173
|
+
|
|
174
|
+
Component summary:
|
|
175
|
+
|
|
176
|
+
- **68 of 68** catalog entries pass build, publication, docs, tokens, and isolated-install validation.
|
|
177
|
+
- **68 of 68** have no open primitive-reuse or visible-control ownership note in this audit.
|
|
178
|
+
- The only native interactive element in the expanded layer is File Upload's hidden `input[type=file]`, which is the owning platform behavior rather than a visible consumer bypass.
|
|
179
|
+
|
|
180
|
+
## Remaining work outside the 96 gaps
|
|
181
|
+
|
|
182
|
+
### Visual fidelity backlog
|
|
183
|
+
|
|
184
|
+
The remaining 100 gaps are non-component concerns. The current promotion report identifies four recurring candidate families:
|
|
185
|
+
|
|
186
|
+
- Workspace shell/layout composition.
|
|
187
|
+
- Icon assets.
|
|
188
|
+
- Elevation treatment.
|
|
189
|
+
- Avatar/image assets.
|
|
190
|
+
|
|
191
|
+
See [gap-promotion-report.md](./gap-promotion-report.md) for the generated detail.
|
|
192
|
+
|
|
193
|
+
### Component-quality closure
|
|
194
|
+
|
|
195
|
+
The former internal primitive-reuse notes are closed: Catalog Divider, File Upload, Table, Page Header, Slideout, and Alert use owned visible actions, while Page Header also composes Breadcrumbs. Slideout is deliberately a named presentational region rather than an incomplete dialog; modal interaction remains owned by Sheet and Modal.
|
|
196
|
+
|
|
197
|
+
The full route audit now covers all component pages with strict Axe, inherited RTL, 324px document containment, and deterministic Chromium base-card screenshots. Contrast is also clean at 910 of 910 scenarios.
|
|
198
|
+
|
|
199
|
+
### Structural hotspots
|
|
200
|
+
|
|
201
|
+
The largest implementation units remain Date Picker, expanded Table, Input, Menu, Select, and Modal. They pass current checks, but splitting helpers/state from public component modules would reduce future change risk.
|
|
202
|
+
|
|
203
|
+
### Test depth
|
|
204
|
+
|
|
205
|
+
Every component route has uniform Axe, inherited-RTL, 324px containment, documentation, and visual-baseline coverage. Deep interaction-specific keyboard and focus assertions remain intentionally component-specific because their behavior contracts differ.
|
|
206
|
+
|
|
207
|
+
## Verification results
|
|
208
|
+
|
|
209
|
+
| Gate | Result | Evidence |
|
|
210
|
+
| --- | --- | --- |
|
|
211
|
+
| Component ownership | Pass | 38 backgrounds; zero component gaps; zero native controls; zero restricted direct consumer UI-vendor imports. |
|
|
212
|
+
| Background metadata | Pass | 38 scenarios and 100 remaining non-component gaps are internally consistent. |
|
|
213
|
+
| Gap promotion report | Pass | Current with 4 candidates across 38 backgrounds. |
|
|
214
|
+
| TypeScript | Pass | Playground typecheck completed with no errors. |
|
|
215
|
+
| Unit/component tests | Pass | 8 Vitest files and 205 tests. |
|
|
216
|
+
| Documentation coverage | Pass | 68 registry-backed pages; zero pending rollout pages and zero aliases. |
|
|
217
|
+
| Production build | Pass | Vite transformed 3,350 modules and bundle budget passed. |
|
|
218
|
+
| Browser suite | Pass | 389 Playwright tests passed across Chromium, Firefox, and WebKit; 4 engine-deduplicated checks skipped by design. |
|
|
219
|
+
| Registry validation | Pass | 68 catalogs and 113 mirrors; all 68 packed component installs compiled and exported correctly. |
|
|
220
|
+
| Token ownership | Pass | 91 owned token sources; 161 component/example files; metadata current for all 68 components. |
|
|
221
|
+
| Package artifact | Pass | 300 packed files; 96-file registry closure; 72 examples; CLI smoke for all 68 installs. |
|
|
222
|
+
| Documentation contracts | Pass | Markdown checks passed for all 68 components. |
|
|
223
|
+
| Accessibility/RTL/containment | Pass | 69 of 69 component UI routes pass strict Axe and inherited-RTL containment at 324px. |
|
|
224
|
+
| Contrast | Pass | 910 of 910 canonical scenarios pass. |
|
|
225
|
+
| Visual regression | Pass | 69 of 69 canonical Chromium base-card baselines reproduce cleanly. |
|
|
226
|
+
| Patch hygiene | Pass | Git diff whitespace/error check is clean. |
|
|
227
|
+
|
|
228
|
+
Registry and package checks used an isolated npm cache under /tmp because the user-level npm cache contains root-owned entries. The user cache was not changed.
|
|
229
|
+
|
|
230
|
+
## Final verdict
|
|
231
|
+
|
|
232
|
+
**Pass for the requested 96 component-ownership gaps.**
|
|
233
|
+
|
|
234
|
+
The audited backgrounds and the two named copyable-documentation violations now use Banhaten-owned components, and the invariant is protected by an automated gate. The remaining 100 tracked gaps are visual/layout/token/asset work, not missing or approximated components.
|
|
235
|
+
|
|
236
|
+
The component catalog is also clean under the broader implementation-quality audit. The remaining 100 tracked gaps are background visual/layout/token/asset fidelity work, not missing, approximated, or bypassed components. This distinction keeps the ownership result reliable without treating the separate background-fidelity backlog as component debt.
|
|
237
|
+
|
|
238
|
+
## Audit scope
|
|
239
|
+
|
|
240
|
+
- Repository: /Users/ahmadgalal/Downloads/Work/Banhaten-design-system
|
|
241
|
+
- Canonical surface: 68 registry catalog entries.
|
|
242
|
+
- Consumer remediation surface: all 38 background implementations and scenario descriptors, plus the Activity Heatmap and Scroll Area copyable pages.
|
|
243
|
+
- Generated artifacts validated: registry indexes, runtime mirrors, token metadata, component docs contracts, background catalog, and gap-promotion report.
|
|
244
|
+
- Verification environments: TypeScript, Vitest, Vite production build, isolated packed installs, and Playwright on Chromium, Firefox, and WebKit.
|
|
245
|
+
- Existing unrelated dirty-tree changes were preserved.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Component Implementation Quality Audit — Final Status
|
|
2
|
+
|
|
3
|
+
Audit date: 2026-08-20
|
|
4
|
+
|
|
5
|
+
Repository: `Banhaten-design-system`
|
|
6
|
+
|
|
7
|
+
Remediation status: complete for the component-library scope
|
|
8
|
+
|
|
9
|
+
## Executive verdict
|
|
10
|
+
|
|
11
|
+
**Pass.** All 68 registry components now pass the repository's implementation, ownership, accessibility, contrast, RTL, responsive-containment, documentation, token, publication, install, unit, build, and browser contracts.
|
|
12
|
+
|
|
13
|
+
The previous 96 component-ownership gaps remain closed. The wider quality review also closed the concrete ARIA, focus, landmark, contrast, inherited-RTL, narrow-layout, primitive-reuse, metadata, and proof-coverage defects found during the audit.
|
|
14
|
+
|
|
15
|
+
Current measured status:
|
|
16
|
+
|
|
17
|
+
- **68 of 68 registry components** are owned, documented on dedicated pages, token-current, packageable, and isolated-install validated.
|
|
18
|
+
- **69 of 69 component UI routes** — the 68 registry pages plus the non-installable Icons explorer — pass the strict route-wide Axe scan and inherited-RTL 324px containment sweep.
|
|
19
|
+
- **69 of 69 routes** have deterministic Chromium base-card visual baselines, and all 69 reproduce without diffs.
|
|
20
|
+
- **910 of 910 contrast scenarios pass**; there are zero known failures in the canonical audit.
|
|
21
|
+
- **38 of 38 audited backgrounds** have zero component-kind gaps, zero native interactive/table roots, and zero restricted direct UI-vendor imports.
|
|
22
|
+
- The final authoritative `npm run check` is green: **389 Playwright tests passed, 4 intentionally browser-deduplicated tests skipped, 205 unit tests passed, and npm reported 0 vulnerabilities.**
|
|
23
|
+
|
|
24
|
+
This is a 100% audit of the repository's declared component catalog and executable contracts. It is not a claim of pixel equivalence to an external Figma source that was not part of this task. The 100 tracked background fidelity gaps for layout, icon assets, image assets, and tokens remain a separate non-component backlog.
|
|
25
|
+
|
|
26
|
+
## Scope and assurance model
|
|
27
|
+
|
|
28
|
+
The audit covered:
|
|
29
|
+
|
|
30
|
+
- all 68 authored catalog entries and their 113 mirrored registry files;
|
|
31
|
+
- all published component source, CSS, exports, examples, token references, generated metadata, and Markdown contracts;
|
|
32
|
+
- all 68 dedicated registry-backed documentation pages and the Icons explorer;
|
|
33
|
+
- Base and Alternatives content, live Anatomy where a single measurable root exists, and documented exemptions for portals, caller-sized canvases, and the Catalog composition bundle;
|
|
34
|
+
- every live route under LTR and inherited RTL, including 324px viewport containment;
|
|
35
|
+
- all live examples on each page through an unsuppressed Axe scan;
|
|
36
|
+
- state/theme/mode contrast through 910 generated scenarios;
|
|
37
|
+
- consumer ownership across all 38 background implementations;
|
|
38
|
+
- package closure, isolated installs, runtime exports, production build, cross-browser behavior, and visual regression output.
|
|
39
|
+
|
|
40
|
+
The assurance layers are intentionally different:
|
|
41
|
+
|
|
42
|
+
1. **Consumer layer:** product backgrounds, copyable examples, and documentation consumers must use Banhaten owners for interactive UI.
|
|
43
|
+
2. **Expanded component layer:** compositions use Banhaten primitives for visible controls. The only native interactive element left in this layer is File Upload's hidden `input[type=file]`, which is the behavior-owning platform input rather than a visible bypass.
|
|
44
|
+
3. **Foundation layer:** Banhaten wrappers may directly use their declared behavior libraries — Radix, cmdk, Embla, react-resizable-panels, Recharts, Sonner — because those wrappers are the owned component boundary.
|
|
45
|
+
4. **Semantic HTML:** elements such as `table`, `nav`, `hr`, headings, and list containers remain correct native structure; ownership does not mean replacing semantics with generic components.
|
|
46
|
+
|
|
47
|
+
Static scans confirm no raw visible `button`, `select`, or `textarea` controls in expanded components and no restricted UI-vendor imports in playground consumers or expanded components.
|
|
48
|
+
|
|
49
|
+
## Before and after
|
|
50
|
+
|
|
51
|
+
| Measure | Audit starting point | Final status |
|
|
52
|
+
| --- | ---: | ---: |
|
|
53
|
+
| Requested component-ownership gaps | 96 open | 0 open |
|
|
54
|
+
| Audited backgrounds using only owned controls | 2 of 38 | 38 of 38 |
|
|
55
|
+
| Missing catalog RTL contracts | 12 | 0 |
|
|
56
|
+
| Dedicated registry-backed component pages | 67 plus 1 alias | 68, no aliases |
|
|
57
|
+
| Canonical contrast audit | 468 pass / 274 fail / 742 total | 910 pass / 0 fail / 910 total |
|
|
58
|
+
| Route-wide automated accessibility | 48 clean / 19 flagged in the initial sweep | 69 clean / 0 flagged |
|
|
59
|
+
| 324px inherited-RTL route containment | Multiple component failures | 69 pass / 0 fail |
|
|
60
|
+
| Per-route component visual baselines | Incomplete | 69 of 69 |
|
|
61
|
+
| Unit/component tests | 187 | 205 passing |
|
|
62
|
+
| Cross-browser Playwright result | 315 passing | 389 passing, 4 intentional skips |
|
|
63
|
+
| Token/example source enforcement | 160 files | 161 files passing |
|
|
64
|
+
|
|
65
|
+
## Remediation completed
|
|
66
|
+
|
|
67
|
+
### Semantics and accessibility
|
|
68
|
+
|
|
69
|
+
- Rebuilt Date Picker's calendar as a valid named ARIA grid with rowgroups, rows, column headers, gridcells, localized labels, and selected-state contrast.
|
|
70
|
+
- Restored Select's Radix-owned combobox state, named standalone listboxes, made internal wrappers presentational, and kept checkbox-styled options valid inside listboxes.
|
|
71
|
+
- Guaranteed a real panel for every Tabs trigger, including Page Header's composed tabs.
|
|
72
|
+
- Corrected Command listbox ownership: separators and internal wrappers are presentational, and empty results are disabled options.
|
|
73
|
+
- Registered only mounted Field descriptions and errors in `aria-describedby`.
|
|
74
|
+
- Made Scroll Area, Button Group, Activity Heatmap, Resizable panel content, horizontal Timeline, and wide Table surfaces keyboard reachable where local scrolling can occur.
|
|
75
|
+
- Added valid Avatar image semantics, named Table progress/rating output, complete header names, and a named Table scroll region.
|
|
76
|
+
- Reframed Slideout as an explicit named presentational region instead of publishing incomplete dialog semantics.
|
|
77
|
+
- Added localized named Carousel landmarks and role descriptions.
|
|
78
|
+
- Corrected Menu switch ownership with `menuitemcheckbox`, hid the visual switch from the accessibility tree, and named Menu progress meters from their visible labels.
|
|
79
|
+
- Removed duplicate page/demo landmarks and IDs; documentation examples now preserve real landmark semantics while scoping repeated valid names to their owning example.
|
|
80
|
+
- Added configurable Page Header heading levels and removed SidebarInset's implicit nested `main`; consumers opt into `main` with `asChild`.
|
|
81
|
+
- Kept standalone TimelineItem neutral while Timeline owns `list`/`listitem` semantics.
|
|
82
|
+
|
|
83
|
+
### Owned-component composition
|
|
84
|
+
|
|
85
|
+
- Replaced visible raw actions in Catalog Divider, File Upload, Table, Page Header, Slideout, and Alert with the owned Button API.
|
|
86
|
+
- Page Header now composes the owned Breadcrumbs component.
|
|
87
|
+
- Expanded components contain no direct imports from restricted behavior vendors.
|
|
88
|
+
- All 38 audited backgrounds contain no native `button`, `input`, `select`, `textarea`, or `table` roots and no restricted direct vendor imports.
|
|
89
|
+
|
|
90
|
+
### RTL and localization
|
|
91
|
+
|
|
92
|
+
- Reworked Activity Feed, Steps, Timeline, Slideout, Activity Heatmap, Banner, Onboarding Step, Breadcrumbs, File Upload, Table, Page Header, and Social Button to inherit the nearest direction boundary instead of requiring a direct prop.
|
|
93
|
+
- Converted physical spacing/position branches to logical CSS where direction changes placement.
|
|
94
|
+
- Fixed Social Button's inline width precedence so provider-specific RTL widths and Arabic labels remain contained.
|
|
95
|
+
- Added or completed machine-readable RTL contracts for all 68 catalog entries.
|
|
96
|
+
- Localized Carousel landmark/control messages without coupling language choice to direction.
|
|
97
|
+
|
|
98
|
+
### Responsive layout and containment
|
|
99
|
+
|
|
100
|
+
- Added narrow rules or local-scroll contracts for Card, Toolbar, Progress Slider, Button Group, Pagination, Table, Banner, Timeline, and the Catalog showcase.
|
|
101
|
+
- Pagination uses a component container query and collapses long numeric runs without losing navigation controls.
|
|
102
|
+
- Table now has keyboard-reachable local scrolling plus paint containment, preventing a 960px data grid from expanding a 324px RTL document.
|
|
103
|
+
- Catalog cards, upload layouts, actions, and table compositions collapse safely at 324px.
|
|
104
|
+
- The complete inherited-RTL route sweep reports zero document overflows at 324px.
|
|
105
|
+
|
|
106
|
+
### Contrast and states
|
|
107
|
+
|
|
108
|
+
- Repaired semantic foreground/background roles across Avatar, Badge, Tag, Button, Date Picker, Alert, Banner, Toggle, Social Button, Table, and shared focus indicators.
|
|
109
|
+
- Expanded the canonical audit from 742 to 910 scenarios so repaired live-only cases are now represented in the durable gate.
|
|
110
|
+
- Final status is **910 pass, 0 fail**, including default, hover, pressed, selected, disabled, warning, success, danger, accent, dark/light, theme, typography, and focus-indicator scenarios covered by the audit data.
|
|
111
|
+
|
|
112
|
+
### Documentation and visual proof
|
|
113
|
+
|
|
114
|
+
- Every registry entry now has a dedicated normalized Markdown contract and a dedicated registry-backed playground page; pending rollout and bundle aliases are both zero.
|
|
115
|
+
- Every page exposes Base and Alternatives. Fifty single-root components also expose a live measured Anatomy inspector; eighteen portal/caller-sized/composition surfaces are explicitly exempt.
|
|
116
|
+
- Fixed percentage-width Anatomy fixtures for Pagination and Progress Slider so their off-screen measurement rack produces real geometry.
|
|
117
|
+
- Added one deterministic canonical screenshot per component UI route under `playground/e2e/__screenshots__`.
|
|
118
|
+
- Added a reviewed aggregate contact sheet at `output/audits/component-visual-baselines-contact-sheet.png` for clipping, collapse, spacing, and base-layout inspection.
|
|
119
|
+
|
|
120
|
+
## Component-by-component final status
|
|
121
|
+
|
|
122
|
+
| Component | Status | Final implementation note |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| Accordion | Pass | Valid disclosure semantics; unique example region names; variants, sizes, states, and RTL documented. |
|
|
125
|
+
| Aspect Ratio | Pass | Owned Radix wrapper; caller-sized surface with explicit Anatomy exemption. |
|
|
126
|
+
| Avatar | Pass | Valid optional image naming and repaired fallback/disabled contrast. |
|
|
127
|
+
| Badge | Pass | State/theme foregrounds remapped to passing contrast roles. |
|
|
128
|
+
| Tag | Pass | Avatar and active/disabled states pass contrast and owned close actions. |
|
|
129
|
+
| Attribute | Pass | Owned semantic key/value composition with complete docs route. |
|
|
130
|
+
| Button | Pass | Owned action primitive; all audited state/theme contrast combinations pass. |
|
|
131
|
+
| Card | Pass | Horizontal layouts now collapse safely in narrow containers. |
|
|
132
|
+
| Chart | Pass — integration | Banhaten owns the chart shell, semantics, legend, tooltip, and tokens around Recharts. |
|
|
133
|
+
| Carousel | Pass — integration | Named/localized region, owned Button controls, Embla behavior, RTL, and containment pass. |
|
|
134
|
+
| Button Group | Pass | Keyboard-reachable local scroll, focus treatment, narrow containment, and RTL pass. |
|
|
135
|
+
| Segmented Control | Pass | Owned Button Group composition with pressed state and direction-aware keyboard behavior. |
|
|
136
|
+
| Toggle | Pass | Repaired supporting-copy contrast and complete state semantics. |
|
|
137
|
+
| Menu | Pass | Switch items, progress meters, separators, static previews, and Radix menus expose valid ownership. |
|
|
138
|
+
| Menubar | Pass | Owned Radix wrapper with cross-browser docs and accessibility coverage. |
|
|
139
|
+
| Command | Pass — integration | cmdk listbox tree, empty state, groups, and separators are now valid. |
|
|
140
|
+
| Context Menu | Pass | Owned portalled Radix behavior with documented exemption and clean route audit. |
|
|
141
|
+
| Tooltip | Pass | Placement, pointer, focus, RTL, and portal behavior pass. |
|
|
142
|
+
| Popover | Pass | Escape dismissal, focus return, portalled RTL, Axe, and visual baseline pass in all engines. |
|
|
143
|
+
| Hover Card | Pass | Owned Radix behavior with clean route and docs contracts. |
|
|
144
|
+
| Modal | Pass | Dialog naming, focus entry/trap/return, actions, and documentation pass. |
|
|
145
|
+
| Alert Dialog | Pass | Alert-dialog semantics, safe default focus, and owned actions pass. |
|
|
146
|
+
| Checkbox | Pass | Control/card states, focus, contrast, and RTL pass. |
|
|
147
|
+
| Collapsible | Pass | Owned Radix trigger/content relationship and docs pass. |
|
|
148
|
+
| Radio Group | Pass | Orientation, state, labeling, and RTL keyboard behavior pass. |
|
|
149
|
+
| Radio Card | Pass | Direction inheritance and card/radio semantics have focused regressions. |
|
|
150
|
+
| Divider | Pass | Structural separator semantics and variants pass. |
|
|
151
|
+
| Pagination | Pass | Named navigation, unique docs landmarks, container-query collapse, local scroll, and RTL pass. |
|
|
152
|
+
| Toolbar | Pass | Sections and children wrap/contain correctly at narrow widths. |
|
|
153
|
+
| Social Button | Pass | RTL width precedence, Arabic containment, provider states, and contrast pass. |
|
|
154
|
+
| Input | Pass | State, variant, size, density, labeling, and token contracts pass. |
|
|
155
|
+
| Input Group | Pass | Owned grouped input/action surface passes. |
|
|
156
|
+
| Label | Pass | Owned Radix label wrapper and association contract pass. |
|
|
157
|
+
| Kbd | Pass | Intentional chord direction and surrounding RTL inheritance pass. |
|
|
158
|
+
| Item | Pass | Slot-based row composition and state coverage pass. |
|
|
159
|
+
| Field | Pass | Only mounted description/error nodes are referenced. |
|
|
160
|
+
| Input OTP | Pass | Slot semantics, sizes, states, and RTL pass. |
|
|
161
|
+
| Select | Pass | Combobox ARIA, named listboxes, option selection semantics, density, and RTL pass. |
|
|
162
|
+
| Native Select | Pass | Native semantics wrapped by Banhaten state/size/variant tokens. |
|
|
163
|
+
| Sheet | Pass | Edge dialog focus, dismissal, overlay, and RTL pass. |
|
|
164
|
+
| Sidebar | Pass | Provider behavior passes; SidebarInset no longer creates accidental nested-main landmarks. |
|
|
165
|
+
| Navigation Menu | Pass | Named/unique landmarks, Radix behavior, portal layout, and RTL pass. |
|
|
166
|
+
| Scroll Area | Pass | Viewport is keyboard reachable and exposes safe viewport props. |
|
|
167
|
+
| Resizable | Pass — integration | Panels expose focusable overflow content and owned handle focus around react-resizable-panels. |
|
|
168
|
+
| Autocomplete | Pass | Owned Input/Popover/Select/Tag composition passes. |
|
|
169
|
+
| Date Picker | Pass | Valid ARIA calendar grid, names, localization, focus, range/single modes, and contrast pass. |
|
|
170
|
+
| Slider | Pass | Intentional thumb geometry, states, labels, and RTL pass. |
|
|
171
|
+
| Progress | Pass | Named meter semantics and tokenized tones pass. |
|
|
172
|
+
| Progress Slider | Pass | Keyboard/ARIA behavior, sizes, tones, ticks, narrow containment, RTL, and live Anatomy pass. |
|
|
173
|
+
| Textarea | Pass | Modes, labels, states, and token ownership pass. |
|
|
174
|
+
| Skeleton | Pass | Loading family and reduced-motion behavior pass. |
|
|
175
|
+
| Spinner | Pass | Named/hidden modes, token ownership, RTL contract, and reduced motion pass. |
|
|
176
|
+
| Toast | Pass — integration | Owned Sonner API, live region behavior, direction, and tokens pass. |
|
|
177
|
+
| Activity Feed | Pass | Inherits direction and composes owned actions; named feed semantics pass. |
|
|
178
|
+
| Activity Heatmap | Pass | Named image semantics, keyboard-reachable overflow, RTL, tokens, and dedicated docs pass. |
|
|
179
|
+
| Alert | Pass | Owned actions, wrapping/padding invariants, state semantics, and contrast pass. |
|
|
180
|
+
| Banner | Pass | Owned controls, inherited RTL, narrow wrapping, state metadata, and contrast pass. |
|
|
181
|
+
| Catalog Components | Pass — composition | Dedicated page and baseline; Breadcrumbs, Divider, Tag, File Upload, Table, and owned actions compose cleanly. |
|
|
182
|
+
| Breadcrumbs | Pass | Unique named navigation, logical spacing, RTL, truncation, and owned Page Header composition pass. |
|
|
183
|
+
| File Upload | Pass | Visible actions use Button; status text is valid; hidden native file input remains the correct owned platform hook. |
|
|
184
|
+
| Table | Pass | Named meters/ratings/headers, owned actions, focusable local scroll, narrow paint containment, states, and RTL pass. |
|
|
185
|
+
| Empty State | Pass | Sizes, semantics, RTL, and owned actions pass. |
|
|
186
|
+
| Onboarding Step | Pass | Inherited RTL, state metadata, marker geometry, and docs pass. |
|
|
187
|
+
| Page Header | Pass | Composes Breadcrumbs/Tabs/Button, exposes heading level, avoids landmark collisions, and contains narrowly. |
|
|
188
|
+
| Slideout | Pass | Explicit named presentational region, owned actions, unique IDs, logical RTL, and narrow layout pass. |
|
|
189
|
+
| Steps | Pass | Standard/horizontal/vertical/progress modes inherit RTL and preserve marker/connector geometry. |
|
|
190
|
+
| Tabs | Pass | Every trigger owns an existing panel; keyboard, selected state, and docs contracts pass. |
|
|
191
|
+
| Timeline | Pass | Owned list semantics, standalone item neutrality, inherited RTL, connector alignment, and narrow scrolling pass. |
|
|
192
|
+
|
|
193
|
+
## Final verification evidence
|
|
194
|
+
|
|
195
|
+
| Gate | Final result |
|
|
196
|
+
| --- | --- |
|
|
197
|
+
| Authoritative repository gate | `npm run check` exited 0 |
|
|
198
|
+
| Contract schemas | 3 canonical contracts passed |
|
|
199
|
+
| CLI | Argument, dependency, install-plan, integration, and doctor tests passed |
|
|
200
|
+
| Token graph | 91 deterministic owned sources; catalog/CSS generation and clean-room reproduction passed |
|
|
201
|
+
| Component token ownership | 161 component/example files passed; metadata current for all 68 entries |
|
|
202
|
+
| Consumer ownership | 38 backgrounds; zero component gaps, native controls, or restricted direct vendor imports |
|
|
203
|
+
| Registry | 68 catalogs, 113 mirrors, current shadcn export, all 68 isolated packed installs passed |
|
|
204
|
+
| Documentation | 68 normalized Markdown contracts and 68 dedicated registry-backed pages; zero pending/aliases |
|
|
205
|
+
| Unit/component suite | 8 Vitest files, 205 tests passed |
|
|
206
|
+
| Production build | TypeScript passed; Vite transformed 3,350 modules; bundle budget passed |
|
|
207
|
+
| Package artifact | 300 files; 96-file registry closure; 72 examples; 68 CLI install smokes passed |
|
|
208
|
+
| Contrast | 910 pass, 0 fail |
|
|
209
|
+
| Catalog accessibility | 69 of 69 routes pass Axe with all violation impacts enabled |
|
|
210
|
+
| RTL/containment | 69 of 69 routes inherit RTL and keep the 324px document contained |
|
|
211
|
+
| Visual regression | 69 of 69 Chromium base-card baselines reproduce cleanly |
|
|
212
|
+
| Cross-browser suite | 389 passed; 4 intentional Chromium-only deduplication skips |
|
|
213
|
+
| Dependency audit | 0 vulnerabilities |
|
|
214
|
+
|
|
215
|
+
## Residual risk and separate backlog
|
|
216
|
+
|
|
217
|
+
No open component-specific defect was reproduced by the final source, unit, build, package, accessibility, contrast, direction, containment, documentation, or browser gates.
|
|
218
|
+
|
|
219
|
+
Three limitations remain important:
|
|
220
|
+
|
|
221
|
+
1. The visual baselines make future drift detectable; they do not independently prove parity with a design file that was not supplied as a comparison oracle.
|
|
222
|
+
2. Automated Axe and browser tests do not replace periodic manual assistive-technology and usability review on representative real devices.
|
|
223
|
+
3. The background audit still tracks 100 non-component fidelity gaps: 47 layout/composition, 20 icon assets, 20 image assets, and 13 token applications. Those are explicitly outside the 96 component-ownership gaps and outside this component-library remediation.
|
|
224
|
+
|
|
225
|
+
Within the declared component scope, the completion verdict is **Pass: 68 of 68 components, zero known open component gaps.**
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Date: 2026-06-16
|
|
4
4
|
|
|
5
|
+
> **Status refresh — 2026-08-20:** This file preserves the June baseline and its recommendations. The rollout described below is now complete: all 68 registry entries have dedicated pages using the shared component-doc shell, Base and Alternatives coverage, normalized Markdown contracts, and either live Anatomy or an explicit no-single-root exemption. `catalog-components` now has a dedicated public page; there are zero pending pages and zero bundle aliases. See [Component Implementation Quality Audit — Final Status](./component-quality-audit-2026-08-20.md) for the current component-by-component verdict and verification results.
|
|
6
|
+
|
|
5
7
|
## Purpose
|
|
6
8
|
|
|
7
9
|
This report audits how registry-backed Banhaten components are presented across the playground and docs. The immediate question was whether `Button` is the most complete example and whether the rest of the components should be made consistent with it.
|
|
@@ -6,6 +6,7 @@ Design-system components use semantic props and tokens. Appearance presets may c
|
|
|
6
6
|
|
|
7
7
|
- [Accordion](./accordion.md): Radix-backed disclosure primitive with variants, size scale, animation, and RTL-safe text alignment.
|
|
8
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.
|
|
9
10
|
- [Alert](./alert.md): compact and expandable contextual feedback with semantic status colors, action links, close control, and RTL support.
|
|
10
11
|
- [Alert Dialog](./alert-dialog.md): Radix AlertDialog-backed confirmation surface for destructive or consequential actions with semantic intent styling.
|
|
11
12
|
- [Aspect Ratio](./aspect-ratio.md): Radix AspectRatio wrapper for fixed-format media, previews, and product surfaces.
|
|
@@ -102,5 +102,7 @@ This table is generated from `registry/index.json`; edit the component-owned sou
|
|
|
102
102
|
| `supportedExports` | `components/expanded/ActivityFeed.tsx: ActivityFeed, ActivityFeedItem` |
|
|
103
103
|
| `parts` | `ActivityFeed`, `ActivityFeedItem` |
|
|
104
104
|
| `registryDependencies` | `button` |
|
|
105
|
+
| `states` | `default`, `with-status`, `with-link`, `with-actions` |
|
|
105
106
|
| `tokens` | `--bh-activity-feed-compact-width`, `--bh-bg-accent-purple-subtle`, `--bh-bg-raised`, `--bh-bg-success-default`, `--bh-border-accent-purple-strong`, `--bh-border-default`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-link`, `--bh-content-on-brand`, `--bh-content-subtle`, `--bh-control-default`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-font-weight-semibold`, `--bh-interactive-brand-default`, `--bh-interactive-secondary-default`, `--bh-radius-full`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-line-height`, `--bh-text-body-xs-regular-font-size`, `--shadow-button-raised`, `--shadow-component-default` |
|
|
107
|
+
| `variants` | `caption`, `slot` |
|
|
106
108
|
<!-- registry-contract:end -->
|