Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 0 additions & 28 deletions .changeset/fix-hydration-animation-css-race.md

This file was deleted.

27 changes: 0 additions & 27 deletions .changeset/fix-outlet-animation-config.md

This file was deleted.

9 changes: 9 additions & 0 deletions apps/docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# docs

## 0.0.32

### Patch Changes

- Updated dependencies [30f2c32]
- Updated dependencies [567a41c]
- @effex/dom@1.4.8
- @effex/router@1.3.9

## 0.0.31

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion apps/docs/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "docs",
"version": "0.0.31",
"version": "0.0.32",
"private": true,
"type": "module",
"scripts": {
Expand Down
52 changes: 52 additions & 0 deletions packages/dom/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,57 @@
# @effex/dom

## 1.4.8

### Patch Changes

- 30f2c32: fix(animation): wait one paint before hydration enter animations

On cold first-load (new tab, no cache), the browser can schedule the
hydration fiber before it finishes parsing/applying stylesheets — either
`<link>` sheets that are still being fetched or Vite dev's JS-injected
styles that haven't been evaluated yet.

When that happened, `runEnterAnimation`'s `forceReflow` captured a
"before" state with no `transition-property` set, then the class swap
happened instantly — the transition-triggering moment passed without
transition-\* in effect, `transitionend` never fired, and the animation
system logged the "Animation timeout reached" warning after 5 seconds.
The affected element ended up at its enterTo state with no animation.
Refresh made the problem go away because stylesheets were already cached
and applied synchronously.

`forkSlotEnter` now waits for a single `requestAnimationFrame` on the
hydration path before starting the enter lifecycle. rAF runs just before
the browser's next paint, at which point all pending stylesheet parsing
is complete, so `forceReflow` captures the correct pre-transition state
and the class swap fires a proper transition.

The wait is scoped to hydration only; post-hydration animations (route
changes, list reconciles) don't pay the rAF cost.

- 567a41c: fix(router): Outlet now actually applies its animation configuration

`OutletConfig.animate` was defined in the type but never read in the
implementation — the underlying `reconcile` call passed only
`getTargetKeys` and `renderSlot`, so nothing wired the animation config
through to the control ctx. Consumers configuring `animate` saw abrupt
route transitions regardless of what they set.

`Outlet` now provides `AnimationConfigCtx` (the same tag `when`/`match`/
`each` use) via `Effect.provideService`, matching the pattern those
combinators follow. `provideService` uses `provideContext` internally
rather than `provideSomeLayer`'s `scopedWith` — no scope is created and
no finalizer race is introduced (see #78 for the finalizer-race pattern
we're deliberately avoiding).

Also adds an `intro?: boolean` field to `OutletConfig`, so the initially
matched route can re-animate on hydration in cases like a decorative
opening scene. Same shape as `when`/`match`/`each`/`animated`.

`AnimationConfigCtx` and `ClientControlCtx` are now re-exported from
`@effex/dom`'s package root (they were exported from
`@effex/dom/Control/index.ts` but not lifted).

## 1.4.7

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/dom/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@effex/dom",
"version": "1.4.7",
"version": "1.4.8",
"description": "DOM rendering for Effex - a reactive UI framework built on Effect.ts",
"type": "module",
"license": "MIT",
Expand Down
31 changes: 31 additions & 0 deletions packages/router/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# @effex/router

## 1.3.9

### Patch Changes

- 567a41c: fix(router): Outlet now actually applies its animation configuration

`OutletConfig.animate` was defined in the type but never read in the
implementation — the underlying `reconcile` call passed only
`getTargetKeys` and `renderSlot`, so nothing wired the animation config
through to the control ctx. Consumers configuring `animate` saw abrupt
route transitions regardless of what they set.

`Outlet` now provides `AnimationConfigCtx` (the same tag `when`/`match`/
`each` use) via `Effect.provideService`, matching the pattern those
combinators follow. `provideService` uses `provideContext` internally
rather than `provideSomeLayer`'s `scopedWith` — no scope is created and
no finalizer race is introduced (see #78 for the finalizer-race pattern
we're deliberately avoiding).

Also adds an `intro?: boolean` field to `OutletConfig`, so the initially
matched route can re-animate on hydration in cases like a decorative
opening scene. Same shape as `when`/`match`/`each`/`animated`.

`AnimationConfigCtx` and `ClientControlCtx` are now re-exported from
`@effex/dom`'s package root (they were exported from
`@effex/dom/Control/index.ts` but not lifted).

- Updated dependencies [30f2c32]
- Updated dependencies [567a41c]
- @effex/dom@1.4.8

## 1.3.8

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/router/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@effex/router",
"version": "1.3.8",
"version": "1.3.9",
"description": "Router for Effex applications",
"type": "module",
"license": "MIT",
Expand Down
Loading