From 35eb193ac5e6f2a1ccdac8c039d1200ccc81c8ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:33:07 +0000 Subject: [PATCH] chore: version packages --- .../fix-hydration-animation-css-race.md | 28 ---------- .changeset/fix-outlet-animation-config.md | 27 ---------- apps/docs/CHANGELOG.md | 9 ++++ apps/docs/package.json | 2 +- packages/dom/CHANGELOG.md | 52 +++++++++++++++++++ packages/dom/package.json | 2 +- packages/router/CHANGELOG.md | 31 +++++++++++ packages/router/package.json | 2 +- 8 files changed, 95 insertions(+), 58 deletions(-) delete mode 100644 .changeset/fix-hydration-animation-css-race.md delete mode 100644 .changeset/fix-outlet-animation-config.md diff --git a/.changeset/fix-hydration-animation-css-race.md b/.changeset/fix-hydration-animation-css-race.md deleted file mode 100644 index 0c050e2..0000000 --- a/.changeset/fix-hydration-animation-css-race.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -"@effex/dom": patch ---- - -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 -`` 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. diff --git a/.changeset/fix-outlet-animation-config.md b/.changeset/fix-outlet-animation-config.md deleted file mode 100644 index 770215f..0000000 --- a/.changeset/fix-outlet-animation-config.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -"@effex/router": patch -"@effex/dom": patch ---- - -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). diff --git a/apps/docs/CHANGELOG.md b/apps/docs/CHANGELOG.md index 865afd3..fd6adcb 100644 --- a/apps/docs/CHANGELOG.md +++ b/apps/docs/CHANGELOG.md @@ -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 diff --git a/apps/docs/package.json b/apps/docs/package.json index 1cbfc55..c8a75d8 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "0.0.31", + "version": "0.0.32", "private": true, "type": "module", "scripts": { diff --git a/packages/dom/CHANGELOG.md b/packages/dom/CHANGELOG.md index c973736..d01c68e 100644 --- a/packages/dom/CHANGELOG.md +++ b/packages/dom/CHANGELOG.md @@ -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 + `` 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 diff --git a/packages/dom/package.json b/packages/dom/package.json index eaf9e1b..141a966 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -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", diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index 3fb1972..f747168 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -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 diff --git a/packages/router/package.json b/packages/router/package.json index 0ab4bef..b74e314 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@effex/router", - "version": "1.3.8", + "version": "1.3.9", "description": "Router for Effex applications", "type": "module", "license": "MIT",