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
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# Order matters — last match wins (gitignore rules).

# Default: maintainers team owns everything
* @whuppi/adaptive_layouts-maintainers
* @whuppi/morph_kit-maintainers

# Release files: repo owner only (contributors don't write changelogs or versions)
/CHANGELOG.md @chaudharydeepanshu
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ body:
- type: input
id: version
attributes:
label: adaptive_layouts version
label: morph_kit version
placeholder: e.g. 0.1.0
validations:
required: true
2 changes: 1 addition & 1 deletion .github/workflows/auto-close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ jobs:
with:
# Team slug, not a hardcoded person — membership is managed in the org
# (the same team CODEOWNERS uses), so a maintainer change never edits this.
maintainers-mention: '@whuppi/adaptive_layouts-maintainers'
maintainers-mention: '@whuppi/morph_kit-maintainers'
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ from:

To change content:
- Workspace-wide: edit AGENTS.template.md, then re-run the stamper.
- One repo only: edit the `repo_data` case for "adaptive_layouts" in stamp-agents.sh,
- One repo only: edit the `repo_data` case for "morph_kit" in stamp-agents.sh,
then re-run the stamper.
Manual edits to this file will be overwritten on the next stamp.
============================================================================
-->

# adaptive_layouts
# morph_kit

> **Public AI agent contract** for adaptive_layouts — read by Cursor, OpenAI Codex, Aider, Devin, JetBrains Junie, and any AI tool that follows the [agents.md](https://agents.md) convention.
> **Public AI agent contract** for morph_kit — read by Cursor, OpenAI Codex, Aider, Devin, JetBrains Junie, and any AI tool that follows the [agents.md](https://agents.md) convention.
>
> Claude Code reads the deeper workspace config at `whuppi/.claude/rules/` and `whuppi/.claude/memory/` automatically — this AGENTS.md exists for every *other* AI tool.
>
Expand All @@ -28,7 +28,7 @@ Manual edits to this file will be overwritten on the next stamp.

## What this tool does

**adaptive_layouts** is adaptive layout widgets for Flutter — `ListDetailLayout` (list + selected detail: slide-over with swipe-to-dismiss on phones, covering nav bars via an always-mounted OverlayPortal; side-by-side with a draggable, anchor-snapping divider on wide windows) and `AdaptiveSplit` (two always-present panes). Pane widget instances survive the compact ↔ expanded morph (GlobalKey reparenting), and a paint-visibility probe suppresses the overlay detail of inactive kept-alive tabs. Router-agnostic and state-management-agnostic — a ChangeNotifier controller is the whole integration surface.
**morph_kit** is adaptive layout widgets for Flutter — `ListDetailLayout` (list + selected detail: slide-over with swipe-to-dismiss on phones, covering nav bars via an always-mounted OverlayPortal; side-by-side with a draggable, anchor-snapping divider on wide windows) and `AdaptiveSplit` (two always-present panes). Pane widget instances survive the compact ↔ expanded morph (GlobalKey reparenting), and a paint-visibility probe suppresses the overlay detail of inactive kept-alive tabs. Router-agnostic and state-management-agnostic — a ChangeNotifier controller is the whole integration surface.

This repo is one tool inside the **whuppi** workspace — a multi-tool monorepo. The workspace ships shared engineering standards, code conventions, brand identity, and build patterns that apply across every tool. They're documented in three layers:

Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ CONTENT RULES (never change)
• NEVER link a living doc (README, docs/*) from an entry — it rots when
the doc moves on.
• Links point only at IMMUTABLE targets — a PR, commit, or issue:
([#N](https://github.com/whuppi/adaptive_layouts/issues/N) reported by
[@user](https://github.com/user), [PR #N](https://github.com/whuppi/adaptive_layouts/pull/N)).
([#N](https://github.com/whuppi/morph_kit/issues/N) reported by
[@user](https://github.com/user), [PR #N](https://github.com/whuppi/morph_kit/pull/N)).
Credit the issue + reporter when a reported issue drove the fix; the PR
(or commit) link alone otherwise.
• No capability inventories — "what's shipped" lives in README +
Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.pre.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ CONTENT RULES (never change)
• NEVER link a living doc (README, docs/*) from an entry — it rots when
the doc moves on.
• Links point only at IMMUTABLE targets — a PR, commit, or issue:
([#N](https://github.com/whuppi/adaptive_layouts/issues/N) reported by
[@user](https://github.com/user), [PR #N](https://github.com/whuppi/adaptive_layouts/pull/N)).
([#N](https://github.com/whuppi/morph_kit/issues/N) reported by
[@user](https://github.com/user), [PR #N](https://github.com/whuppi/morph_kit/pull/N)).
Credit the issue + reporter when a reported issue drove the fix; the PR
(or commit) link alone otherwise.
• No capability inventories — "what's shipped" lives in README +
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ Contributions are welcome.
## Setup

```bash
git clone https://github.com/whuppi/adaptive_layouts.git
cd adaptive_layouts
git clone https://github.com/whuppi/morph_kit.git
cd morph_kit
make hooks # activates commit-msg + pre-commit (run once)
fvm install # downloads the SDK version pinned in .fvmrc
fvm flutter pub get
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#
# Uses fvm by default. Contributors without fvm can override:
# make check DART=dart FLUTTER=flutter
# adaptive_layouts is a Flutter package — the suite runs on flutter_test
# morph_kit is a Flutter package — the suite runs on flutter_test
# (host VM, no device, no browser). example/ is its own Flutter app
# package, resolved / analyzed from its OWN root (analyze_core gives it
# a `flutter analyze` pass; the journeys drive its real UI).
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<h1 align="center">adaptive_layouts</h1>
<h1 align="center">morph_kit</h1>

<p align="center">
<a href="https://pub.dev/packages/adaptive_layouts"><img src="https://img.shields.io/pub/v/adaptive_layouts.svg" alt="pub package"></a>
<a href="https://pub.dev/packages/adaptive_layouts/score"><img src="https://img.shields.io/pub/likes/adaptive_layouts" alt="likes"></a>
<a href="https://pub.dev/packages/adaptive_layouts/score"><img src="https://img.shields.io/pub/points/adaptive_layouts" alt="pub points"></a>
<a href="https://github.com/whuppi/adaptive_layouts"><img src="https://img.shields.io/github/stars/whuppi/adaptive_layouts?style=flat&logo=github" alt="GitHub stars"></a>
<a href="https://pub.dev/packages/morph_kit"><img src="https://img.shields.io/pub/v/morph_kit.svg" alt="pub package"></a>
<a href="https://pub.dev/packages/morph_kit/score"><img src="https://img.shields.io/pub/likes/morph_kit" alt="likes"></a>
<a href="https://pub.dev/packages/morph_kit/score"><img src="https://img.shields.io/pub/points/morph_kit" alt="pub points"></a>
<a href="https://github.com/whuppi/morph_kit"><img src="https://img.shields.io/github/stars/whuppi/morph_kit?style=flat&logo=github" alt="GitHub stars"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license: MIT"></a>
</p>

Expand All @@ -14,7 +14,7 @@ Layout widgets that morph between phone and desktop forms. On a phone, the detai

> **Status:** 0.x. Pre-1.0 the minor version is the breaking axis — pin `^0.N.0` and read the changelog on minor bumps.

> like it? a [⭐ star](https://github.com/whuppi/adaptive_layouts) or [👍 like](https://pub.dev/packages/adaptive_layouts) is the entire marketing budget. [Bugs & features →](https://github.com/whuppi/adaptive_layouts/issues)
> like it? a [⭐ star](https://github.com/whuppi/morph_kit) or [👍 like](https://pub.dev/packages/morph_kit) is the entire marketing budget. [Bugs & features →](https://github.com/whuppi/morph_kit/issues)

---

Expand Down Expand Up @@ -46,7 +46,7 @@ Layout widgets that morph between phone and desktop forms. On a phone, the detai

```yaml
dependencies:
adaptive_layouts:
morph_kit:
```

Nothing else to do, on any platform. Pure Flutter: no native code, no assets, no setup.
Expand All @@ -58,7 +58,7 @@ Nothing else to do, on any platform. Pure Flutter: no native code, no assets, no
Two builders, and the layout handles the rest — breakpoint switching, slide animation, swipe-to-dismiss, back gestures, state preservation:

```dart
import 'package:adaptive_layouts/adaptive_layouts.dart';
import 'package:morph_kit/morph_kit.dart';

ListDetailLayout<String>(
listBuilder: (context, selectedId, onSelect) => ChatList(
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Reporting a vulnerability

Report privately via [GitHub Security Advisories](https://github.com/whuppi/adaptive_layouts/security/advisories/new). Do not open a public issue.
Report privately via [GitHub Security Advisories](https://github.com/whuppi/morph_kit/security/advisories/new). Do not open a public issue.

## What's in scope

Expand Down
10 changes: 5 additions & 5 deletions deploy/.deploy/secrets.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#!/bin/bash
# ============================================================================
# adaptive_layouts secrets manager
# morph_kit secrets manager
#
# Manages secrets for whuppi/adaptive_layouts ONLY.
# Manages secrets for whuppi/morph_kit ONLY.
# Bitwarden Secrets Manager is the source of truth.
# GitHub Environments are CI-accessible copies.
#
Expand All @@ -16,9 +16,9 @@
# ============================================================================
set -e

REPO="whuppi/adaptive_layouts"
REPO="whuppi/morph_kit"
BWS="${HOME}/bin/bws --color no"
BW_PREFIX="adaptive_layouts"
BW_PREFIX="morph_kit"
export BWS_SERVER_URL="${BWS_SERVER_URL:-https://vault.bitwarden.eu}"

# ── Auth ─────────────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -281,7 +281,7 @@ case "${1:-}" in
upload) cmd_upload "$2" ;;
rm) cmd_rm "$2" ;;
*)
echo "adaptive_layouts secrets manager"
echo "morph_kit secrets manager"
echo ""
echo "Usage:"
echo " ./secrets.sh set <env>/<KEY> <value> Store in Bitwarden + GitHub"
Expand Down
6 changes: 3 additions & 3 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# adaptive_layouts — Architecture
# morph_kit — Architecture

> **Type:** architecture · **Scope:** adaptive_layouts · **Status:** SHIPPED · **Last verified:** 2026-07-19
> **Type:** architecture · **Scope:** morph_kit · **Status:** SHIPPED · **Last verified:** 2026-07-19
> **Companion docs:** [`CAPABILITY_ROADMAP.md`](CAPABILITY_ROADMAP.md) · [`UPDATING.md`](UPDATING.md)

Adaptive layout widgets that morph between compact (mobile) and expanded
Expand All @@ -17,7 +17,7 @@ URL sync, and modals).

```
lib/
├── adaptive_layouts.dart # public barrel
├── morph_kit.dart # public barrel
└── src/
├── components/ # GROWING LIBRARY — convenience widgets
│ ├── dividers/
Expand Down
4 changes: 2 additions & 2 deletions docs/CAPABILITY_ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# adaptive_layouts — Capability Roadmap
# morph_kit — Capability Roadmap

> **Type:** roadmap · **Scope:** adaptive_layouts · **Last verified:** 2026-07-19
> **Type:** roadmap · **Scope:** morph_kit · **Last verified:** 2026-07-19
> **Companion docs:** [`ARCHITECTURE.md`](ARCHITECTURE.md) · [`UPDATING.md`](UPDATING.md)

Every capability the package offers or plans, with status. Nothing ships
Expand Down
6 changes: 3 additions & 3 deletions docs/UPDATING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# adaptive_layouts — Updating
# morph_kit — Updating

> **Type:** maintenance · **Scope:** adaptive_layouts · **Last verified:** 2026-07-19
> **Type:** maintenance · **Scope:** morph_kit · **Last verified:** 2026-07-19
> **Companion docs:** [`ARCHITECTURE.md`](ARCHITECTURE.md) · [`CAPABILITY_ROADMAP.md`](CAPABILITY_ROADMAP.md)

Maintenance recipes and the invariants that must not break. When code and
Expand Down Expand Up @@ -359,7 +359,7 @@ change and say so in the changelog. Workspace consumers use `path:`
dependencies, so breaks surface at their next analyze. After any signature
change: run the check sequence here, then
`fvm flutter analyze` in each consuming app (the workspace grep for
`adaptive_layouts` finds them). Update the example's usage in the same
`morph_kit` finds them). Update the example's usage in the same
session — it is the reference consumers copy from.

---
Expand Down
2 changes: 1 addition & 1 deletion example/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# adaptive_layouts example
# morph_kit example

A full app in one file (`lib/main.dart`) — not a toy. It is a small
project-tracker app that runs the package inside the hardest topology it has
Expand Down
4 changes: 2 additions & 2 deletions example/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {
}

android {
namespace = "com.whuppi.adaptive_layouts_example"
namespace = "com.whuppi.morph_kit_example"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion

Expand All @@ -16,7 +16,7 @@ android {

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.whuppi.adaptive_layouts_example"
applicationId = "com.whuppi.morph_kit_example"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
Expand Down
2 changes: 1 addition & 1 deletion example/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="adaptive_layouts_example"
android:label="morph_kit_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.whuppi.adaptive_layouts_example
package com.whuppi.morph_kit_example

import io.flutter.embedding.android.FlutterActivity

Expand Down
12 changes: 6 additions & 6 deletions example/ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
Expand All @@ -399,7 +399,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Expand All @@ -416,7 +416,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
Expand All @@ -431,7 +431,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
Expand Down Expand Up @@ -563,7 +563,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Expand All @@ -586,7 +586,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.adaptiveLayoutsExample;
PRODUCT_BUNDLE_IDENTIFIER = com.whuppi.morphKitExample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
Expand Down
4 changes: 2 additions & 2 deletions example/ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Adaptive Layouts Example</string>
<string>Morph Kit Example</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>adaptive_layouts_example</string>
<string>morph_kit_example</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
Expand Down
6 changes: 3 additions & 3 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// adaptive_layouts — full-app example
// morph_kit — full-app example
//
// One file, one real app topology. This is deliberately NOT a toy: it is a
// small project-tracker app ("tickets / ops / admin") built on the hardest
Expand Down Expand Up @@ -30,7 +30,7 @@
// resize across the breakpoint with widget-state preservation (type a comment
// draft in a ticket, resize, the draft survives).

import 'package:adaptive_layouts/adaptive_layouts.dart';
import 'package:morph_kit/morph_kit.dart';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide ModalRoute;
Expand Down Expand Up @@ -59,7 +59,7 @@ class _ExampleAppState extends State<ExampleApp> {
builder: (context, _) => AdaptiveLayoutConfig(
expandedBreakpoint: PackageSettings.instance.expandedBreakpoint,
child: MaterialApp.router(
title: 'adaptive_layouts example',
title: 'morph_kit example',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
Expand Down
Loading