Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
5b0abfb
feat(core): useAnimatedLayout, one module that glides the layout shif…
cixzhang Oct 26, 2026
b476220
feat(core): useAnimatedLayout({containerRef}) returns a handle that C…
cixzhang Oct 26, 2026
52c08dc
fix(core): the layout glide corrects only a real ancestor scale, not …
cixzhang Oct 26, 2026
7cfe5e0
chore(storybook): the Animated layout story's tags row is narrow, so …
cixzhang Oct 26, 2026
e2afc61
Merge 8ba53b45a4 (main, AST-105 current) into the animated layout draft
cixzhang Oct 26, 2026
dc023f3
wip(core): animated layout follows AST-105 (springs.settle, Reduce Mo…
cixzhang Oct 26, 2026
b60f171
feat(core): useAnimatedLayout follows AST-105
cixzhang Oct 26, 2026
ac58ce3
chore(storybook): the story's internal-reporting demos say they are s…
cixzhang Oct 26, 2026
427f850
chore(docsite): the ShadCN route lock lists the useAnimatedLayout hoo…
cixzhang Oct 26, 2026
1bccf04
fix(core): the animated layout reads springs.settle from the internal…
cixzhang Oct 26, 2026
b894315
test(core): the animated-layout browser proofs settle between changes…
cixzhang Oct 26, 2026
ea01d0c
fix(core): animated layout measures every grouped change, drops refus…
cixzhang Oct 26, 2026
186526e
fix(core): a retargeted glide keeps its motion and adds the new move
cixzhang Oct 26, 2026
5bcb797
docs(architecture): INV12 plays the glide through the shared rectangl…
cixzhang Oct 26, 2026
7bad709
docs(architecture): rewrap INV12
cixzhang Oct 26, 2026
3a5f9ae
refactor(core): useAnimatedLayout lands alone; Collapsible and TreeLi…
cixzhang Oct 26, 2026
7e13143
feat(core): Collapsible and TreeList adopt useAnimatedLayout
cixzhang Oct 26, 2026
b3826b7
feat(core): the changed element's exit, held out of flow on the same …
cixzhang Oct 26, 2026
f8c2db7
Merge the module's exit (feat/animated-layout) into the adoption
cixzhang Oct 26, 2026
044b865
feat(core): a Collapsible's or TreeList row's close plays the content…
cixzhang Oct 26, 2026
52863fc
test(core): the exiting group's rows leave the tree's keyboard order
cixzhang Oct 26, 2026
1c44863
chore(changeset): Collapsible and TreeList adopt animatedLayout
cixzhang Oct 26, 2026
a09ce74
fix(core): the internal module alone; a displaced changed element mov…
cixzhang Oct 26, 2026
980ff13
Merge feat/animated-layout into the adoption; the public hook and the…
cixzhang Oct 26, 2026
2f7cedb
fix(core): the exit frees exactly its space and is inert; elements th…
cixzhang Oct 26, 2026
f97811a
Merge feat/animated-layout (an exact, inert exit; app-moved followers…
cixzhang Oct 26, 2026
52841d7
fix(core): the exit measures the content after it, holds only a measu…
cixzhang Oct 26, 2026
86a458b
Merge feat/animated-layout (the exit measures the content after it an…
cixzhang Oct 26, 2026
bc32d66
fix(core): nested changes compose in any order; the exit finds the re…
cixzhang Oct 26, 2026
ac812d7
Merge feat/animated-layout (nested changes in any order; the exit's n…
cixzhang Oct 26, 2026
e4b19b0
fix(core): the exit's correction follows a scaled ancestor, and its m…
cixzhang Oct 26, 2026
731af79
Merge feat/animated-layout (scale-corrected exit; measured out of flo…
cixzhang Oct 26, 2026
c08d59b
fix(core): Collapsible and TreeList report every change, whatever cau…
cixzhang Oct 26, 2026
7c96972
test(core): the adopters' browser spec serves Storybook through a11y-…
cixzhang Oct 26, 2026
7ca7a04
fix(core): a TreeList row collapsing with an expanded child moves wha…
cixzhang Oct 26, 2026
5695f69
docs(core): Collapsible FR10 and TreeList FR8 cite AST-108 FR4a for t…
cixzhang Oct 26, 2026
8338da9
Merge main (#8482 landed as 7a530cc) into the adopters
cixzhang Oct 27, 2026
4c4ac7b
feat(core): the animated-layout module's in-place swap (spec:AST-105 …
cixzhang Oct 27, 2026
600302f
fix(core): an opaque swap copy paints the background it shows
cixzhang Oct 27, 2026
7a86690
feat(core): a swap's copy can ride the glide of the element it sat in
cixzhang Oct 27, 2026
f7d0850
fix(core): a swap copy keeps its old rect, its canvas pixels and its …
cixzhang Oct 27, 2026
007f414
docs(spec): Collapsible FR10 and TreeList FR8 cite AST-105 for the sh…
cixzhang Oct 27, 2026
0d2c364
Merge remote-tracking branch 'origin/feat/animated-layout-adopters' i…
cixzhang Oct 27, 2026
f2f3d64
fix(core): a swap copy labels no live control, keeps nested scroll, a…
cixzhang Oct 27, 2026
36c6fd8
Merge main: TreeList's animatedLayout row is FR9 beside main's FR8; a…
cixzhang Oct 27, 2026
5da9a6b
Merge remote-tracking branch 'origin/feat/animated-layout-adopters' i…
cixzhang Oct 27, 2026
d771226
fix(core): the glide moves an element by its inline-start edge, so a …
cixzhang Oct 27, 2026
9fbc118
fix(core): swap copies land scroll at once, keep their size under a s…
cixzhang Oct 27, 2026
72a67c3
fix(core): a swap copy reads its canvases at full size and its scale …
cixzhang Oct 27, 2026
2f074f8
fix(core): a ridden copy starts where it was laid; a fractional copy …
cixzhang Oct 27, 2026
8148cfe
fix(core): playLayoutFrames releases its frames when the motion ends
cixzhang Oct 27, 2026
b150c15
feat(core): a new change can take a swap's copy over mid-swap (handOff)
cixzhang Oct 28, 2026
013de65
feat(core): a swap calls onEnd when it ends
cixzhang Oct 28, 2026
30453d8
Merge remote-tracking branch 'origin/main' into feat/animated-layout-…
cixzhang Oct 28, 2026
f6c8eab
fix(core): a handed-off swap copy keeps its travel, clip and text fad…
cixzhang Oct 28, 2026
179b3bf
feat(core): every part of a ridden swap plays over the ridden glide a…
cixzhang Oct 28, 2026
a234c3c
fix(core): a swap copy laid outside its ancestors keeps what it inher…
cixzhang Oct 28, 2026
9b6ad1c
fix(core): a swap copy carries a unitless line-height as its factor
cixzhang Oct 28, 2026
81388fd
fix(core): without a typed style map, a swap copy carries its line-he…
cixzhang Oct 28, 2026
3e3322e
fix(core): a swap copy keeps a length line-height as its pixels
cixzhang Oct 28, 2026
1cf5eab
Merge origin/main into feat/animated-layout-swap; a swap copy always …
cixzhang Oct 28, 2026
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
7 changes: 7 additions & 0 deletions .changeset/animated-layout-swap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[fix] The animated-layout module gains its internal in-place swap: old content held as one inert, transient copy while new content enters in its place, on the shared motion. Nothing uses it yet and nothing public changes. In right-to-left containers, content after a Collapsible or TreeList size change (with an `animatedLayout` handle) now glides by its inline-start edge instead of jumping.

@cixzhang
13 changes: 13 additions & 0 deletions packages/core/src/motion/animatedLayout.boundary.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ describe('architecture:react-component-runtime INV12 source boundary', () => {
'playLayoutChange',
'applyLayoutChangeTransition',
'createAnimatedLayout',
'holdLayoutSwap',
'playLayoutSwap',
'playLayoutFrames',
]) {
expect(
source,
Expand All @@ -120,6 +123,16 @@ describe('architecture:react-component-runtime INV12 source boundary', () => {
}
});

it("keeps the swap's copy mechanism private to the module", () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional: the public-entry check above names only the four reporting functions. Adding holdLayoutSwap, playLayoutSwap and playLayoutFrames to its list would make spec:AST-105 FR8's "a public export fails" mechanical; none of them is exported today.

const users = sourceFiles(coreSrc)
.filter(path =>
/from '[./]+(motion\/)?transientCopy'/.test(readFileSync(path, 'utf8')),
)
.map(path => relative(coreSrc, path))
.sort();
expect(users).toEqual(['motion/animatedLayout.ts']);
});

it('is used only by the hook and the components that adopt it', () => {
const users = sourceFiles(coreSrc)
.filter(path => path !== join(here, 'animatedLayout.ts'))
Expand Down
Loading
Loading