feat(icons): every icon fades from cobalt into its app's backdrop; Learn shows its own inside the app; Train's dumbbell (ADR 0031, D5 to D7)
All checks were successful
CI / check (push) Successful in 41m0s
CI / deploy (push) Successful in 4m37s

Each icon now ends in the colour its app's screens wash down from: Learn cobalt into
purple, Todo through violet into strawberry (Learn's former gradient), Train unchanged
into carrot, Meditate's to come through pacific into fern (Todo's former). Train's glyph
is Lucide's dumbbell, Meditate's will be the sprout.

Learn shows its graduation cap atop the rail, on the launch screen and on halkyon_app's
screens, as Todo and Train show theirs; the kingfisher leaves the app and stays the
F-Droid repository's icon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-02 23:09:38 +01:00
commit ac387b5250
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
3 changed files with 85 additions and 27 deletions

View file

@ -5,14 +5,20 @@ import 'package:halkyon_learn_flutter/src/core/theme/learn_theme.dart';
import 'package:halkyon_learn_flutter/src/core/widget/app_launch_screen.dart';
import 'package:material_ui/material_ui.dart';
/// The app's icon: Lucide's `graduation-cap` fading from cobalt into purple
/// (ADR 0031, D5), atop the rail, on the launch screen and on halkyon_app's
/// own screens, as Todo's and Train's show theirs (D6: no longer the
/// kingfisher, which stays Halkyon's emblem).
const learnIcon = AssetImage('assets/icon/halkyon_learn_icon.png');
/// Halkyon Learn as halkyon_app's own screens know it (the first start, the
/// start screen, the account switcher, signing in): its name and word, its
/// kingfisher, its look and languages, and the sentence only it can say,
/// icon, its look and languages, and the sentence only it can say,
/// in its own words, so every text reads as it did before they moved.
const learnFrame = AppFrame(
name: _name,
product: _product,
icon: AssetImage('assets/icon/halkyon_icon.png'),
icon: learnIcon,
exampleAddress: 'learn.example.org',
firstStartSubtitle: _firstStartSubtitle,
theme: learnTheme,

View file

@ -1,12 +1,13 @@
import 'package:go_router/go_router.dart';
import 'package:halkyon_app/halkyon_app.dart';
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/app/learn_frame.dart';
import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:material_ui/material_ui.dart';
/// The frame around the four tabs, every Halkyon app's ([NavigationFrame]):
/// a navigation rail at the side from medium windows on, the kingfisher atop
/// a navigation rail at the side from medium windows on, the app's icon atop
/// it, and a navigation bar floating above the bottom below that. Every tab
/// keeps its own stack of screens, and the navigation stays visible on all
/// of them; screens that need the whole window are routes outside the shell.
@ -45,9 +46,9 @@ class const AppShell({
return WhatsNewOnUpdate(
child: NavigationFrame(
appName: l10n.appTitle,
// The kingfisher has a white background, which the frame's rounded
// tile keeps reading on light and dark rails alike.
icon: const AssetImage('assets/icon/halkyon_icon.png'),
// The icon has a white background, which the frame's rounded tile
// keeps reading on light and dark rails alike.
icon: learnIcon,
selectedIndex: navigationShell.currentIndex,
onSelected: (index) => navigationShell.goBranch(
index,

View file

@ -1,17 +1,18 @@
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/app/learn_frame.dart';
import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:material_ui/material_ui.dart';
/// What shows while the app opens: the instance, the session, the
/// person's data (decided 2026-10-11). halkyon_ui's [LaunchScreen] with
/// Learn's kingfisher, "Learn" beneath "Halkyon", read out as the app's
/// Learn's icon, "Learn" beneath "Halkyon", read out as the app's
/// name.
class const AppLaunchScreen({super.key}) extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return LaunchScreen(
icon: const AssetImage('assets/icon/halkyon_icon.png'),
icon: learnIcon,
product: l10n.launchProduct,
name: l10n.appTitle,
);