mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-10 19:47:12 +01:00
Also bumps the 16 meta/requirements pins the freshness gate flagged (anthropic 1.5.0, numpy 2.5.3, pytest-randomly 5, flake8-bugbear 26.9.9, ruff 0.16.7, pyright 1.1.414, selenium 4.49.0, hypothesis 6.168.0, lxml 6.1.3, pipdeptree 4.2.5, the two types-* stubs) and Flutter 3.47.3 in meta/.fvmrc. One test still expected the pre-move ~/mcp-servers path. The pre-commit hook fed .zsh files to shfmt and shellcheck, neither of which parses zsh (SC2148/SC1071), so no zsh file could be committed since the hook was tightened on 2026-08-22; those now get `zsh -n` instead. The hook's own shfmt pass also staged its reformat of 8 shell files. CI_GREEN_SKIP because main is red on exactly the dependency-freshness finding this commit fixes, which is the documented use of that flag. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwtowrowDXx6ccmWVPkCaF
68 lines
2.8 KiB
Markdown
68 lines
2.8 KiB
Markdown
# app_icons — shared launcher icons for the Flutter apps
|
|
|
|
One icon family across every Flutter/Dart app: a charcoal `#211D1B` field with
|
|
a single glyph in the shared `unified-design-system` accent (`#B8862E`),
|
|
drawn at one stroke weight and optically centred so a row of them lines up.
|
|
|
|
## Commands
|
|
|
|
```bash
|
|
# what is registered
|
|
PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons list
|
|
|
|
# contact sheet for visual review: full size / circle-masked / 48dp
|
|
PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons preview -o /tmp/sheet.png
|
|
|
|
# write assets into every app repo and rebuild the Android mipmaps
|
|
PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons generate --android
|
|
|
|
# one app, plus the hicolor PNGs for a Linux desktop target
|
|
PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons \
|
|
generate --app todo --android --linux-out ~/src/todo/linux/icons
|
|
```
|
|
|
|
## What gets written
|
|
|
|
Per app, into `<repo>/assets/icon/`:
|
|
|
|
| Layer | Purpose |
|
|
| ----------------- | ------------------------------------------------------------------- |
|
|
| `icon` | Charcoal field + glyph. Legacy square launcher icon and Linux icon. |
|
|
| `icon_foreground` | Glyph only, transparent. Adaptive-icon foreground layer. |
|
|
| `icon_monochrome` | Glyph only, white. Android 13+ themed icons. |
|
|
|
|
Both an `.svg` source and a 1024px `.png` are written for each, so a build
|
|
never needs `rsvg-convert`. `flutter_launcher_icons` then turns the PNGs into
|
|
the density buckets and `mipmap-anydpi-v26/ic_launcher.xml`.
|
|
|
|
## Design constraints that bite
|
|
|
|
- **Negative space ≥ half the stroke weight.** Strokes closer than that merge
|
|
into a solid blob at launcher size. A fork whose tines sat exactly one stroke
|
|
width apart rendered as a tulip.
|
|
- **Ink must stay inside the 560px safe box.** Android masks adaptive icons to
|
|
roughly the inner 66% of the canvas. `generate` warns when a glyph overflows.
|
|
- **Stroked outlines can read wrong.** A stroked three-tine fork reads as a
|
|
trident; a filled fork-and-knife pair reads as cutlery. Prefer a filled
|
|
silhouette when the outline is ambiguous.
|
|
- Glyph positioning inside the fragment is irrelevant — `render.centre_offset`
|
|
measures the rendered ink and recentres it. Only the extents matter.
|
|
|
|
## Adding an app
|
|
|
|
See the `app-icon` skill (`~/.claude/skills/app-icon/SKILL.md`) for the full
|
|
procedure. In short: add a glyph to `glyphs.py`, register the app in
|
|
`apps.py`, wire `flutter_launcher_icons` into its `pubspec.yaml`, generate,
|
|
review the contact sheet, then verify on the phone.
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
cd ~/src/testsAndMisc
|
|
python3 -m pytest python_pkg/app_icons --cov=python_pkg.app_icons \
|
|
--cov-report=term-missing
|
|
```
|
|
|
|
External tools (`rsvg-convert`, `magick`, `dart`) are mocked; the suite needs
|
|
none of them installed.
|