mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-10 20:27:15 +01:00
Drop dufs theme twin; dufs-cloud copy gone
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f99b77af89
commit
5d11f97093
@ -1,141 +0,0 @@
|
||||
Wire dufs-cloud's Flutter app to the shared design_system
|
||||
|
||||
## findings (2, ranked by value over effort)
|
||||
|
||||
1. **`app/lib/ui/theme.dart` is a fifth, uncompared palette copy** — hand-copied
|
||||
hexes that `palette_check.py` has never seen, so it can drift silently while
|
||||
CI stays green.
|
||||
2. **The web half of the same repo is wired correctly** — which makes the
|
||||
Flutter half's divergence an accident, not a decision.
|
||||
|
||||
## what
|
||||
|
||||
`~/src/dufs-cloud/app/lib/ui/theme.dart` is a **fifth, uncompared copy of the
|
||||
palette**. Verified 2026-08-16: the Flutter app has no `design_system`
|
||||
dependency at all — it hand-restates every hex (`Color(0xFF211D1B) // ink`,
|
||||
`Color(0xFFB8862E) // accent`, …) with the shared token names appearing only in
|
||||
comments. `palette_check.py` has never seen this file, so it can drift from the
|
||||
frozen table silently and CI will stay green.
|
||||
|
||||
The web half of the same repo is wired correctly (`@kuhyx/web-ui`), which makes
|
||||
the Flutter half's divergence an accident rather than a decision.
|
||||
|
||||
Fix the root cause: add the dependency, replace the hand-copied hexes with token
|
||||
references, and delete the duplicate. This must land **before** prompt 08 adds
|
||||
motion to this app, so that motion tokens arrive through the package instead of
|
||||
becoming a sixth hand-copy.
|
||||
|
||||
## where
|
||||
|
||||
Repo: `~/src/dufs-cloud`. Flutter app: `~/src/dufs-cloud/app` (package `dufs_client`).
|
||||
|
||||
- `app/pubspec.yaml` — current deps: `archive, cupertino_icons, flutter,
|
||||
flutter_secure_storage, http, image_picker, media_kit*, path, path_provider,
|
||||
share_plus, shared_preferences, webview_flutter, xml`. **No `design_system`.**
|
||||
- `app/lib/ui/theme.dart` — the hand-copy to eliminate.
|
||||
- Every file referencing a colour from it — find them with a grep for the theme's
|
||||
exported symbols rather than trusting any list here.
|
||||
|
||||
Source of truth:
|
||||
- `~/src/utils/design_system/lib/src/tokens.dart` — `AppPalette`, `AppSpacing`,
|
||||
`AppRadius`, `AppTextSize` (plus `AppDuration`/`AppCurve` if prompt 01 ran).
|
||||
- `~/src/utils/design_system/lib/src/theme.dart` — `buildLightTheme()`,
|
||||
`buildDarkTheme()`.
|
||||
|
||||
Reference implementation: `~/src/todo` is the only app already on the package. Its
|
||||
`pubspec.yaml` uses a **git ref** (`design_system-v0.1.0`) and it has
|
||||
deliberately **no local `theme.dart`**. Copy that shape.
|
||||
|
||||
## must
|
||||
|
||||
- Add `design_system` to `app/pubspec.yaml` using the **git ref** style matching
|
||||
`~/src/todo` — not a local `path:` dependency. One dependency convention across the
|
||||
fleet. Pin the tag prompt 01 cut (`design_system-v0.2.0` or whatever it
|
||||
printed); if prompt 01 has not run, pin `design_system-v0.1.0` and let prompt
|
||||
08 do the bump.
|
||||
- Replace every hand-copied hex in `app/lib/ui/theme.dart` with the corresponding
|
||||
token reference. **Verify each swap is value-identical before making it** — the
|
||||
survey found the values byte-identical today, but confirm rather than assume;
|
||||
a silent colour change in a live app is a real regression.
|
||||
- Delete the duplicated token declarations once nothing references them. If the
|
||||
app declares helper classes the shared package lacks, keep only those, and say
|
||||
in the session summary which ones survived and why.
|
||||
- Keep the app's visual output **identical**. This is a pure de-duplication: if
|
||||
anything looks different afterwards, a value was wrong and you have found a
|
||||
pre-existing drift — report it rather than papering over it.
|
||||
|
||||
- must not: change any colour, spacing, radius or type **value**. The shared
|
||||
table is a freeze. If a value genuinely disagrees, stop and surface it — that
|
||||
is a finding, and kuhy decides which side is canonical.
|
||||
- must not: add motion/animation here. That is prompt 08. This prompt is
|
||||
dependency plumbing only, so that a visual regression has exactly one possible
|
||||
cause.
|
||||
- must not: touch `~/src/dufs-cloud/web/` — its `@kuhyx/web-ui` wiring is already
|
||||
correct.
|
||||
- must not: leave a partial migration. Either the local theme file is gone (or
|
||||
reduced to app-specific extras) and everything resolves through the package, or
|
||||
the change is not done. A half-migrated theme is worse than the current state
|
||||
because it hides *which* copy is authoritative.
|
||||
|
||||
- optional: once migrated, add `app/lib/ui/theme.dart`'s path to the structural
|
||||
checker from prompt 02 if that is now meaningful. Probably it is not — after
|
||||
this prompt there is nothing left there to compare.
|
||||
|
||||
## done
|
||||
|
||||
1. `app/pubspec.yaml` declares `design_system` at a git ref; `flutter pub get`
|
||||
resolves.
|
||||
2. No hard-coded palette hex remains in `app/lib/`. A grep for `Color(0xFF` in
|
||||
`app/lib/ui/theme.dart` returns nothing (or only app-specific values that are
|
||||
not palette tokens — name them if so).
|
||||
3. `cd ~/src/dufs-cloud/app && flutter analyze` is clean.
|
||||
4. `cd ~/src/dufs-cloud/app && flutter test` passes.
|
||||
5. The app looks **the same** as before on device — verified by screenshot
|
||||
comparison, not by reasoning about the diff.
|
||||
6. `python3 ~/src/utils/unified-design-system/scripts/palette_check.py` still exits 0.
|
||||
|
||||
## verify
|
||||
|
||||
**On the phone**, and with a before/after comparison — a pure refactor is only
|
||||
verified by showing nothing changed.
|
||||
|
||||
```
|
||||
adb devices
|
||||
cd ~/src/dufs-cloud/app
|
||||
flutter build apk --release
|
||||
adb install -r build/app/outputs/flutter-apk/app-release.apk
|
||||
```
|
||||
|
||||
Take a screenshot of the browser screen and the settings screen **before**
|
||||
starting (from the currently installed build) and after, and compare them. Never
|
||||
`adb uninstall` or `pm clear` — the app holds a stored credential
|
||||
(`flutter_secure_storage`) and wiping it means re-authenticating.
|
||||
|
||||
## read first
|
||||
|
||||
- `~/src/dufs-cloud/app/lib/ui/theme.dart` — in full, before touching anything. The
|
||||
comments naming each token are your mapping table.
|
||||
- `~/src/todo/pubspec.yaml` — the git-ref dependency line to copy, and the comment
|
||||
explaining why no local theme exists.
|
||||
- `~/src/utils/design_system/lib/src/tokens.dart` — the canonical names.
|
||||
- `~/src/dufs-cloud/DESIGN_AUDIT_TODO.md` — a prior audit of this repo; check whether
|
||||
it already records theme findings so you do not contradict it.
|
||||
|
||||
## context you would otherwise rediscover
|
||||
|
||||
- The web half consumes `@kuhyx/web-ui` at tag **`web_ui-v0.3.1`**, declared in
|
||||
`~/src/dufs-cloud/web/package.json` as
|
||||
`"github:kuhyx/utils#web_ui-v0.3.1&path:/web_ui"`. It is correctly wired; the
|
||||
only app-local CSS value is `--overlay: rgba(33, 29, 27, 0.82)` in
|
||||
`web/src/index.css`. Prompt 08 bumps that tag — not this prompt.
|
||||
- `@kuhyx/web-ui` is **pnpm-only**; npm cannot install a monorepo subdirectory.
|
||||
Irrelevant here (this prompt is Flutter-only) but fatal if you wander into
|
||||
`web/`.
|
||||
- `palette_check.py` compares four sources and has never included this file, so
|
||||
"CI is green" told you nothing about it. That is the whole reason this prompt
|
||||
exists.
|
||||
- Three other Flutter apps (diet-guard, workout_app, wake_alarm) have the same
|
||||
hand-copy pattern. They are **out of scope** — migrating them is a separate,
|
||||
larger job, and doing one app properly is the point here.
|
||||
|
||||
REMOVE ME AFTER FINISH
|
||||
Loading…
Reference in New Issue
Block a user