Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
705f6d7
docs: frame the package as a growing family of adaptive layouts
chaudharydeepanshu Jul 18, 2026
ed4d13e
feat: adaptive modal — real Material routes with a live dialog-sheet …
chaudharydeepanshu Jul 18, 2026
5ff4960
feat: container transform for the modal — the flight carries the live…
chaudharydeepanshu Jul 18, 2026
11256a7
fix: land the morph on true final geometry and clip both resting forms
chaudharydeepanshu Jul 18, 2026
d9bfa46
feat: the flight becomes the destination — ghost routes until landing
chaudharydeepanshu Jul 18, 2026
04ac579
fix: content reflows with the morphing container instead of being cro…
chaudharydeepanshu Jul 18, 2026
6aebdda
fix: flight paints in lockstep with its lerp — no Material self-tween…
chaudharydeepanshu Jul 18, 2026
c2f99d9
chore: drop leftover diagnostic captures
chaudharydeepanshu Jul 18, 2026
319f5a3
fix: content follows the container both directions; add ModalConfig.b…
chaudharydeepanshu Jul 18, 2026
8fa37c5
fix: sample the natural width invisibly and retake it on retarget
chaudharydeepanshu Jul 18, 2026
7e950db
feat: CompactDetailMode.route — the compact detail as a real page route
chaudharydeepanshu Jul 18, 2026
ffb6cf4
fix: settings changes reach routed subtrees — each layout listens itself
chaudharydeepanshu Jul 18, 2026
99c6eda
fix: route re-show after hidden resize — schedule the frame, trust sa…
chaudharydeepanshu Jul 18, 2026
1789a52
fix: route mode survives hidden-tab breakpoint crossings and live mod…
chaudharydeepanshu Jul 18, 2026
55927d5
docs: per-mode contracts on CompactDetailMode + README mode-picker table
chaudharydeepanshu Jul 18, 2026
5e3d7d2
feat: a11y route parity for inline/overlay details — semantics scopin…
chaudharydeepanshu Jul 18, 2026
07588f9
test: use flagsCollection over deprecated hasFlag
chaudharydeepanshu Jul 18, 2026
14b4c91
feat: crossing motion on discrete breakpoint jumps — pane growth or r…
chaudharydeepanshu Jul 18, 2026
1b77b1b
feat: crossing motion on every breakpoint crossing, both directions
chaudharydeepanshu Jul 18, 2026
e2a7269
feat: reveal-style expand entry (with resize opt-in) + divider positi…
chaudharydeepanshu Jul 18, 2026
cafb835
feat: PaneWidthMemory knob (persist / resetOnReentry) + crossing-logi…
chaudharydeepanshu Jul 18, 2026
1a4e886
fix: crossing morph seeds from the divider's fraction through the cur…
chaudharydeepanshu Jul 18, 2026
47e8d3e
feat: ExpandedEmptyBehavior.listOnly — on-demand detail pane, plus th…
chaudharydeepanshu Jul 18, 2026
4b23020
fix: listOnly divider rides the revealing seam instead of popping in …
chaudharydeepanshu Jul 18, 2026
33ce31d
feat: empty placeholder pane animates its breakpoint crossings both ways
chaudharydeepanshu Jul 18, 2026
5a45d45
feat: native passthroughs on ModalConfig + PaneConfig settle/hit-zone…
chaudharydeepanshu Jul 19, 2026
bfaacde
docs(example): status strip moves to MaterialApp.builder — chrome abo…
chaudharydeepanshu Jul 19, 2026
14c8aa0
feat: pane collapsing — edge anchors to zero + double-tap divider ges…
chaudharydeepanshu Jul 19, 2026
eab3e3d
feat!: snap-collapse panes (VS Code spec) + DividerState contract
chaudharydeepanshu Jul 19, 2026
ef6c058
feat: divider keyboard/a11y (WAI-ARIA splitter) + PaneScope + double-…
chaudharydeepanshu Jul 19, 2026
1435d26
feat: ThreePaneLayout — role-priority pane scaffold (Compose-shaped)
chaudharydeepanshu Jul 19, 2026
d078f4e
feat(example): Workbench tab — ThreePaneLayout demo under Ops
chaudharydeepanshu Jul 19, 2026
4c92042
feat: collapsed icon-rail slots — rail content at real width, pane pa…
chaudharydeepanshu Jul 19, 2026
806b8b0
fix: rail taps navigate without expanding; gate detail affordance; em…
chaudharydeepanshu Jul 19, 2026
ebb979a
fix: min-wins guard on share-percent bounds — clamp throws on inverte…
chaudharydeepanshu Jul 19, 2026
c86c431
feat: parked panes arrive docked — crossings skip the collapse replay
chaudharydeepanshu Jul 19, 2026
7d301a9
feat!: remove ThreePaneLayout — the package grows by extraction, not …
chaudharydeepanshu Jul 19, 2026
1d0fa69
feat!: rename AdaptiveSplit to SplitLayout
chaudharydeepanshu Jul 19, 2026
725b9e6
docs: rewrite README around the three widgets
chaudharydeepanshu Jul 19, 2026
22173b0
docs: fix fossil README block arguing against route mode we now ship
chaudharydeepanshu Jul 19, 2026
5700879
docs: full audit — fleet README structure, fossil claims fixed, docs …
chaudharydeepanshu Jul 19, 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
15 changes: 13 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,20 @@ CONTENT RULES (never change)

First release — adaptive layout widgets that morph between phone and desktop forms.

- **Widgets:** `ListDetailLayout` (list + selected detail) and `AdaptiveSplit` (two always-present panes) switch between slide-over (compact) and side-by-side (expanded) at a configurable breakpoint.
- **Widgets:** `ListDetailLayout` (list + selected detail) and `SplitLayout` (two always-present panes) switch between slide-over (compact) and side-by-side (expanded) at a configurable breakpoint.
- **State preservation:** pane widget instances survive the compact ↔ expanded morph — drafts, scroll positions, and in-flight animations carry across a window resize.
- **Adaptive modal:** `showAdaptiveModal` presents a real Material dialog on expanded widths and a real Material bottom sheet on compact — and swaps between the two real routes on resize with a container transform that carries the live content, preserving state and the awaited result.
- **Overlay mode:** the compact detail can render in the Navigator's overlay, covering bottom navs and tab bars; inactive kept-alive tabs suppress their overlays automatically.
- **Divider:** draggable with min/max clamps, optional anchor snap points with a settle animation, and ratio or fixed-pixel resize modes; `HandleDivider` and `MaterialDivider` ship as ready-made visuals.
- **Route mode:** `CompactDetailMode.route` hosts the compact detail in a real page route — the app's `PageTransitionsTheme` (platform transitions, predictive back, edge swipes) applies natively, and the detail element still reparents into the side-by-side pane on resize.
- **Accessibility:** in inline and overlay modes the open detail scopes as a route for screen readers, covered content leaves the semantics tree, and `DismissIntent` (Escape) dismisses when focus is inside the detail — route parity without a route.
- **Crossing motion:** breakpoint crossings animate in both directions — including the empty placeholder pane, which reveals and retreats at the end edge. With an open detail — into compact the detail grows out of its pane (inline/overlay) or plays the route's real entrance (route mode); into expanded the list slides in beside the full-width detail, laid out at its final width so content never reflows (`ExpandedEntryStyle.resize` opts into live reflow). Pane geometry keeps tracking window drags without motion.
- **Empty-pane behaviors:** `ExpandedEmptyBehavior.listOnly` gives the list the full expanded width until a selection reveals the detail pane from the end edge (the Material "supporting pane" shape); the default keeps the persistent placeholder pane. The auto-select-first school is documented as an app-side controller recipe.
- **Divider memory:** a dragged divider position survives compact spells and rebuilds — `PaneConfig` and `PaneAnchor` compare by value, so configs constructed inline in `build` never reset the width model. `PaneWidthMemory.resetOnReentry` opts into a fresh divider on every return to expanded.
- **Native passthroughs:** `ModalConfig` forwards Flutter's route parameters under Flutter's own names (barrier label, sheet constraints, max-height ratio, anchor points, focus/traversal behavior, entrance `AnimationStyle`s); visual styling stays on `DialogThemeData`/`BottomSheetThemeData`. Pane snap-settle duration/curve and the divider hit-zone width are `PaneConfig` knobs.
- **Divider:** draggable with min/max clamps, optional anchor snap points with a settle animation, and ratio or fixed-pixel resize modes; `HandleDivider` and `MaterialDivider` ship as ready-made visuals. The full interaction contract rides on `DividerState` (dragging / settling / at-limit / collapsed / focused).
- **Snap-collapse:** force the divider past a pane's minimum and it snaps shut (VS Code mechanics: half-minimum threshold, remembered width, spring-back short of it). `PaneCollapsible` opts in per side; `collapsedSize` keeps an icon rail or hides fully; collapsed content stays laid out at its minimum inside a clip. `HandleDivider` parks as a pull tab. Directional API holds for `SplitLayout`'s end-positioned primary.
- **Divider keyboard + screen readers:** the WAI-ARIA window-splitter pattern — Tab focus, arrows resize, Enter collapses/restores, Home/End jump to the limits, double-click resets to the default width; screen readers see an adjustable element announcing the pane's share.
- **Icon-rail slots:** `collapsedListBuilder` / `collapsedDetailBuilder` (and `SplitLayout`'s primary/secondary equivalents) give a collapsed pane purpose-built content laid out at the real `collapsedSize` — the VS Code activity-bar shape — while the pane parks offstage with its state alive. Both panes reparent via GlobalKey, so collapse, restore, and mode switches move the live element instead of rebuilding it.
- **PaneScope:** descendants of either pane read the collapse state (including `collapsedSize`, so a pane can tell a fully-hidden neighbor from a visible rail) and call `collapse`/`restore` — the hamburger-in-the-surviving-pane recipe, without threading callbacks.
- **Controller:** `ListDetailController` with an animation-aware `isDetailVisible` for app-shell timing; router-agnostic — the example ships full URL-sync reference wiring.
- **Platforms:** pure Flutter, no platform code — every platform.
10 changes: 8 additions & 2 deletions CHANGELOG.pre.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,15 @@ CONTENT RULES (never change)

First prerelease — adaptive layout widgets that morph between phone and desktop forms.

- **Widgets:** `ListDetailLayout` (list + selected detail) and `AdaptiveSplit` (two always-present panes) switch between slide-over (compact) and side-by-side (expanded) at a configurable breakpoint.
- **Widgets:** `ListDetailLayout` (list + selected detail) and `SplitLayout` (two always-present panes) switch between slide-over (compact) and side-by-side (expanded) at a configurable breakpoint.
- **State preservation:** pane widget instances survive the compact ↔ expanded morph — drafts, scroll positions, and in-flight animations carry across a window resize.
- **Adaptive modal:** `showAdaptiveModal` presents a real Material dialog on expanded widths and a real Material bottom sheet on compact — and swaps between the two real routes on resize with a container transform that carries the live content, preserving state and the awaited result.
- **Overlay mode:** the compact detail can render in the Navigator's overlay, covering bottom navs and tab bars; inactive kept-alive tabs suppress their overlays automatically.
- **Divider:** draggable with min/max clamps, optional anchor snap points with a settle animation, and ratio or fixed-pixel resize modes; `HandleDivider` and `MaterialDivider` ship as ready-made visuals.
- **Route mode:** `CompactDetailMode.route` hosts the compact detail in a real page route — the app's `PageTransitionsTheme` (platform transitions, predictive back, edge swipes) applies natively, and the detail element still reparents into the side-by-side pane on resize.
- **Divider:** draggable with min/max clamps, optional anchor snap points with a settle animation, and ratio or fixed-pixel resize modes; `HandleDivider` and `MaterialDivider` ship as ready-made visuals. The full interaction contract rides on `DividerState` (dragging / settling / at-limit / collapsed / focused).
- **Snap-collapse:** force the divider past a pane's minimum and it snaps shut (VS Code mechanics: half-minimum threshold, remembered width, spring-back short of it). `PaneCollapsible` opts in per side; `collapsedSize` keeps an icon rail or hides fully; collapsed content stays laid out at its minimum inside a clip. `HandleDivider` parks as a pull tab. Directional API holds for `SplitLayout`'s end-positioned primary.
- **Divider keyboard + screen readers:** the WAI-ARIA window-splitter pattern — Tab focus, arrows resize, Enter collapses/restores, Home/End jump to the limits, double-click resets to the default width; screen readers see an adjustable element announcing the pane's share.
- **Icon-rail slots:** `collapsedListBuilder` / `collapsedDetailBuilder` (and `SplitLayout`'s primary/secondary equivalents) give a collapsed pane purpose-built content laid out at the real `collapsedSize` — the VS Code activity-bar shape — while the pane parks offstage with its state alive. Both panes reparent via GlobalKey, so collapse, restore, and mode switches move the live element instead of rebuilding it.
- **PaneScope:** descendants of either pane read the collapse state (including `collapsedSize`, so a pane can tell a fully-hidden neighbor from a visible rail) and call `collapse`/`restore` — the hamburger-in-the-surviving-pane recipe, without threading callbacks.
- **Controller:** `ListDetailController` with an animation-aware `isDetailVisible` for app-shell timing; router-agnostic — the example ships full URL-sync reference wiring.
- **Platforms:** pure Flutter, no platform code — every platform.
Loading