Skip to content

Fix/cli consumer validation - #71

Merged
Andersseen merged 6 commits into
mainfrom
fix/cli-consumer-validation
Aug 6, 2026
Merged

Fix/cli consumer validation#71
Andersseen merged 6 commits into
mainfrom
fix/cli-consumer-validation

Conversation

@Andersseen

Copy link
Copy Markdown
Owner

Summary

Verification

  • pnpm lint
  • pnpm typecheck
  • pnpm check:ai-docs
  • pnpm test:coverage
  • Relevant E2E tests
  • Docs/snippets/manifest updated when public APIs changed

Accessibility

Andersseen and others added 6 commits August 5, 2026 15:04
volt add silently shipped broken consumer code: utils.ts and
form-control-state.ts (imported by 14 of 41 components) were never
copied or import-rewritten, and sidebar's relative import to tooltip
pointed outside the consumer's project after copy. Both are fixed in
cli/lib/core.js's transformContent/copyComponent.

Adds e2e/consumer-cli/, a new fixture that runs volt init + volt add
for every component and builds/boots the result (pnpm
test:e2e:consumer-cli), which is what caught these bugs — the
existing e2e/consumer/ fixture only exercised the npm-import path.
Wired into CI and test:all. volt init also now prints Tailwind v4
setup guidance when none is detected. Completes v0.9 Phase 1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…bugs

Adds VoltRangeSlider (dual-thumb, ng-primitives/slider) with full ripple
effects. Rewrites VoltNativeSelect as a @directive with an attribute
selector directly on <select>, matching ng-primitives' own reference
pattern: it existed in source and was already copied by volt add select,
but wrapping <select> in a component template meant Angular's built-in
native-select ControlValueAccessor could never attach, so it had zero
forms support. Documented, tested, and given a COMPONENT_STATUS.md entry
for the first time.

A background a11y-reviewer sweep of the ng-primitives-wrapped components
found two more real bugs, both fixed with regression tests that fail
without the fix: VoltDropdownMenuItem had no disabled input at all
(hostDirectives had no inputs mapping for ngpMenuItemDisabled), and
VoltInputOtp's disabled input never reached NgpInputOtp's own state (dead
isDisabled alias, so the primitive's disabled-aware slot click guard never
engaged even though the native input was separately disabled correctly).

Also corrects a stale hardcoded test-count stat on the homepage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bumps root, @voltui/components, and @voltui/cli to 0.8.4, finalizes the
CHANGELOG [Unreleased] section, and updates every hardcoded version/stat
string across README, the docs header, and the homepage. pnpm release:check
green (lint, typecheck, check:ai-docs, coverage, pack:lib/cli/mcp); docs
e2e, npm-path consumer fixture, and CLI-driven consumer fixture all pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…und fixing it

Phase 2 (bundle & performance audit): confirmed tree-shaking works correctly
on the flat FESM bundle (button-only fixture excludes every unrelated
component's identifiers), confirmed themes.css already ships a single
preset by default (249 bytes, not all 25), and a Lighthouse pass on 3 docs
pages found nothing to fix (LCP 113-143ms, CLS 0.00 across the board).
Budget baselines recorded in specs/plans/v0.9.md for v1.0 to compare against.

Phase 3 (API freeze): generated specs/api-freeze-0.9.md (41 components, 87
directives, 301 inputs, 42 outputs) via a new scripts/generate-api-freeze.mjs,
sharing its extraction logic with scripts/generate-api-reference.mjs through
a new scripts/lib/api-extract.mjs module. Reviewing the inventory for naming
consistency surfaced and fixed 4 real issues, not just naming nits:

- The variant-options parser matched Tailwind pseudo-class prefixes
  (hover:, focus-visible:) embedded inside class-string values as if they
  were CVA option keys, corrupting the live docs site's API Reference panel
  for toggle/pagination/toggle-group/textarea.
- VoltNavigationMenuLink's selector was kebab-case, the only attribute
  selector in the library not using camelCase (had an unexplained lint
  suppression). Renamed with a deprecated multi-selector + dev-mode warning;
  fixing it surfaced a test that silently never exercised the directive
  (wrong selector case) and a usage snippet with markup that never worked
  (open/close tags on an attribute-only selector).
- VoltResizableHandle.resizing and VoltFileUpload/VoltFileDropzone.dragOver
  renamed to resizingChange/dragOverChange for consistency with every other
  boolean-state output. Discovered hostDirectives.outputs cannot map one
  primitive output to two public aliases (both silently go dead) -- fixed by
  injecting the host directive and bridging its real output manually.

All four changes ship with regression tests that fail without the fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bumps root, @voltui/components, and @voltui/cli to 0.9.0 and finalizes the
CHANGELOG with a dedicated "Upgrade to 1.0" section listing the three
deprecated aliases from Phase 3 (all still working, all removed in 1.0.0).

Adds MIGRATION.md, the full 0.x -> 1.0 upgrade guide: the same three
renames plus explicit confirmation that no components were removed, v0.7
was purely additive, and every other input/selector/CVA key was reviewed
against specs/api-freeze-0.9.md and found already consistent.

Updates every hardcoded version/stat string across README, the docs
header, and the homepage (including the component/test counts, which had
drifted to 41/264 instead of 42/268), and announces in README that the
public API is frozen for 1.0.

pnpm release:check green (lint, typecheck, check:ai-docs, coverage,
pack:lib/cli/mcp); full docs e2e (20 tests), npm-path consumer fixture, and
CLI-driven consumer fixture all pass.

Not included: publishing to npm. That's handled automatically by
.github/workflows/release.yml (scripts/release.mjs) once this merges to
main -- it diffs each package's version against what's already published
and publishes only what's new, so it doesn't need to run locally or
separately for the 0.8.4 vs 0.9.0 versions that were never actually
released as intermediates.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Andersseen
Andersseen merged commit d2b22a1 into main Aug 6, 2026
1 check passed
@Andersseen
Andersseen deleted the fix/cli-consumer-validation branch August 6, 2026 06:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant