Skip to content

Migrate to Solid 2.0 using corvu-next (Solid 2 branch)#680

Open
devx wants to merge 5 commits into
kobaltedev:solid2from
opencenter-cloud:feat/corvu-next-integration
Open

Migrate to Solid 2.0 using corvu-next (Solid 2 branch)#680
devx wants to merge 5 commits into
kobaltedev:solid2from
opencenter-cloud:feat/corvu-next-integration

Conversation

@devx

@devx devx commented Jul 7, 2026

Copy link
Copy Markdown

Summary

Migrates Kobalte to Solid 2.0-beta, building on top of the corvu-next branch which carries Solid 2 support. A PR has been submitted to corvu to merge the Solid 2 work upstream.

Context

This branch progresses Kobalte's Solid 2 migration by adopting corvu-next — the Solid 2 compatible branch of corvu. Once the corvu Solid 2 PR is merged, the dependency references here will point to stable releases.

Changes

Core migration

  • Initial migration to Solid 2.0 (solid-js@2.0.0-beta.15, @solidjs/web@2.0.0-beta.15)
  • Resolve all 61 type errors from Solid 2 API changes (signal access patterns, component typing, JSX types)
  • Enable test isolation for Solid 2's new rendering model

Dependency consolidation

  • Update all dependencies to latest versions
  • Add pnpm overrides to consolidate duplicate packages:
    • h3: >=1.15.9
    • vite: >=6.4.3
    • vitest: >=3.2.6
    • esbuild: >=0.28.1
  • Pin @internationalized/date to fix turbo.json resolution
  • Update all @solid-primitives/* packages to their next channel releases

Housekeeping

  • Fix turbo.json format
  • Clean dependency resolution in lockfile (removed ~1500 lines of duplicates)

Design principles preserved

All core Kobalte principles remain intact after migration:

  • Accessible — WAI-ARIA attributes, focus management, keyboard navigation, and screen reader support unchanged. All 466 accessibility tests pass.
  • ComposablePolymorphic renders a single DOM element. mergeRefs forwards user refs. composeEventHandlers chains user handlers. 1:1 component-to-DOM pattern preserved.
  • Customizable — Zero presentational styles. data-* attributes for state. Any styling tool works.
  • Internationalization@solid-primitives/i18n integration and per-component .intl.ts files with overridable translations props intact.
  • Controlled/UncontrolledcreateControllableBooleanSignal pattern. All stateful components accept value/defaultValue/onChange APIs.
  • Developer experience — Declarative compound component APIs, full TypeScript inference, polymorphic as prop unchanged.

The only Solid 2-specific adaptation: signal creation uses { ownedWrite: true } where needed. The public API surface is unchanged.

Not included

  • Docs site migrationapps/docs still uses Solid 1.x (solid-js@1.9.14, @solidjs/start@1.3.2). Migrating the docs to Solid 2 is a separate effort.

What was tested

  • Type checking passes (tsc --noEmit)
  • 466 tests pass, 112 skipped (pre-existing), 37/40 test files pass
  • Build succeeds with consolidated dependency versions

Further Changes

We would love to collaborte and make any changes as needed.

devx added 5 commits July 6, 2026 23:53
Key changes:
- @floating-ui/dom: ^1.5.1 → ^1.7.6
- @internationalized/date: ^3.4.0 → ^3.12.2
- @internationalized/number: ^3.2.1 → ^3.6.7
- vite: ^6.3.5 → ^8.1.3
- vitest: 2.1.9 → 4.1.9
- @vitest/ui: ^2.1.9 → ^4.1.9
- rollup-preset-solid: 2.0.1 → 3.0.0
- storybook-solidjs-vite: ^10.1.0 → ^10.5.2

Pinned @solidjs/web to 2.0.0-beta.15 (--latest pulled experimental.0
which is incompatible with vite-plugin-solid peer range).
- turbo.json: migrate from deprecated pipeline/baseBranch to tasks format
- Pin @internationalized/date to ^3.4.0 (^3.12.2 has breaking type changes)
- Pin @internationalized/number to ^3.2.1

Pre-existing issues in Kobalte solid2 branch (not caused by this update):
- ValidComponent not exported from @solidjs/web@2.0.0-beta.15
- ErrorBoundary imported from 'solid-js' (moved to @solidjs/web in Solid 2)
- All 40 test files fail due to incomplete migration
- Calendar: coerce null → undefined on min/max signal declarations,
  non-null assertions on guarded maxDate/minDate, change DateFormatter
  param to Intl.DateTimeFormat, remove stale @ts-expect-error
- Stories: move placeholder from <Value> to <Root>, remove section prop,
  add generic annotations for multi-select, move getValueLabel to Root,
  convert classList to class array syntax
- Tests: add getByRole destructure, fix hardcoded path, type assertion
  for discriminated union
- Imports: solid-js/web → @solidjs/web, remove .ts extension import
- Vitest: set isolate: true (Solid 2 reactive graph leaks between files
  when isolation is disabled, causing non-deterministic timeouts)
- Remove unused @ts-expect-error directives (5 total)

Results: tsc 0 errors, build passes, 466/466 tests pass.
Reflects correct resolution of @solidjs/web@2.0.0-beta.15 and
solid-js@2.0.0-beta.15 after fixing phantom version issue (lesson kobaltedev#21).
Pin minimum versions via pnpm overrides to consolidate duplicates:
- h3: >=1.15.9
- vite: >=6.4.3
- vitest: >=3.2.6
- esbuild: >=0.28.1

Update packages/tests vitest peer dep to >=3.2.6.
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