Skip to content

Feat 2026 Rebrand - #244

Draft
NewtonMutugi wants to merge 26 commits into
mainfrom
feat/2026_rebrand
Draft

NewtonMutugi wants to merge 26 commits into
mainfrom
feat/2026_rebrand

Conversation

@NewtonMutugi

@NewtonMutugi NewtonMutugi commented Jul 15, 2026

Copy link
Copy Markdown
Member

Description

This pull request introduces a major visual and branding update across the application, shifting the color palette and assets from the previous Droidcon theme to the new Fluttercon branding. It also updates some dependencies and improves navigation and asset handling. Below are the most important changes:

Branding and Visual Redesign:

  • Replaced Droidcon-related colors (blueDroidconColor, orangeDroidconColor, etc.) with new Fluttercon colors (flutterconBlue, flutterconMagenta) throughout the codebase, affecting app bars, buttons, icons, backgrounds, and text styles. (lib/core/theme/theme_colors.dart [1] lib/core/theme/theme_data.dart [2] [3] lib/common/widgets/app_bar/app_bar.dart [4] [5] [6] lib/common/widgets/app_bar/feedback_button.dart [7] [8] lib/common/widgets/app_bar/user_profile_icon.dart [9] lib/common/widgets/bottom_nav/bottom_nav_bar.dart [10] lib/common/widgets/personnel_widget.dart [11] lib/features/about/ui/organising_team_details.dart [12] lib/features/home/ui/speaker_details/speaker_details.dart [13] lib/features/home/widgets/search_bar.dart [14] [15] lib/features/home/widgets/sessions_card.dart [16]
  • Updated asset references: removed flutterConKeLogo and replaced with new SVG assets flutterConLogoLight and flutterConLogoDark for light/dark theme support. Updated all logo usages to use these SVGs. (lib/common/utils/constants/app_assets.dart [1] lib/common/widgets/app_bar/app_bar.dart [2] lib/features/auth/ui/sign_in.dart [3]
  • Updated various widget backgrounds and surfaces to use scaffoldBackgroundColor from the theme for better consistency. (lib/common/widgets/app_bar/app_bar.dart [1] lib/common/widgets/bottom_nav/bottom_nav_bar.dart [2] lib/features/about/ui/about_screen.dart [3] lib/features/auth/ui/sign_in.dart [4]

Navigation Improvements:

  • Changed navigation to use pushNamed instead of goNamed for sign-in routes, ensuring proper navigation stack behavior. (lib/common/widgets/app_bar/feedback_button.dart [1] lib/common/widgets/app_bar/user_profile_icon.dart [2]
  • Added a custom back button to the sign-in screen for improved user experience. (lib/features/auth/ui/sign_in.dart lib/features/auth/ui/sign_in.dartL48-R60)

Dependency and Build System Updates:

Code and Dependency Injection Maintenance:

  • Removed the generateForDir: ['lib'] argument from the @InjectableInit annotation in the dependency injection setup. (lib/core/di/injectable.dart lib/core/di/injectable.dartL9-R9)

These changes collectively modernize the app’s appearance and branding, improve navigation, and keep dependencies up to date

Type of Change

  • ✨ New feature (non-breaking change which adds functionality)
  • 🛠️ Bug fix (non-breaking change which fixes an issue)
  • ❌ Breaking change (fix or feature that would cause existing functionality to change)
  • 🧹 Code refactor
  • ✅ Build configuration change
  • 📝 Documentation
  • 🗑️ Chore

Issues

Test Changes on Device

You can download your APK from Firebase App Distribution once this PR builds successfully via the following link: https://appdistribution.firebase.dev/i/c796669942f8a811

Screenshots

image image image

NewtonMutugi and others added 26 commits July 15, 2026 13:55
Android Studio now bundles JDK 25, which Gradle 8.14 cannot run
(it failed with 'Error resolving plugin dev.flutter.flutter-plugin-loader
> 25.0.3'). Gradle 9.1+ supports Java 25; pinned to 9.5.1 because
AGP 8.13.0 relies on a Gradle internal API removed in 9.6.0.

Verified: flutter build apk --flavor development succeeds.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
chore(android): upgrade Gradle wrapper to 9.5.1 for JDK 25 support
…le 3.3.2

- flutter upgrade: 3.44.6 -> 3.47.3 (Dart 3.12.2 -> 3.13.3)
- Moved isar_community/isar_community_flutter_libs/isar_community_generator
  off the 3.3.0-dev.3 prerelease pin onto stable 3.3.2. That prerelease
  transitively capped analyzer at <9.0.0, which crashed
  'dart run build_runner build' on Dart 3.13's dot-shorthand syntax
  (Exception: Missing implementation of visitDotShorthandPropertyAccess).
  Stable 3.3.2 allows analyzer <11.0.0, letting freezed resolve to 3.2.5
  and analyzer to 10.2.0, which understands the new syntax. This is the
  actual fix for the pr-check/release-apk 'build_runner' CI failures.
- Regenerated pubspec.lock, analysis_options.yaml, and
  macos/Flutter/GeneratedPluginRegistrant.swift via flutter pub get /
  code generation under the new SDK.

Verified:
- dart run build_runner build --delete-conflicting-outputs: succeeds
  (was crashing before)
- dart format --set-exit-if-changed lib test: clean
- flutter analyze lib: 1 pre-existing warning, no errors
- flutter build apk --flavor development --debug: succeeds

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
chore: upgrade Flutter SDK to 3.47.3, fix build_runner CI crash
- AGP 8.13.0 -> 9.4.0 and Kotlin Gradle plugin 2.2.20 -> 2.4.20, per
  Flutter's deprecation warning that support for the old versions will
  soon be dropped.
- AGP 9.4.0 requires Gradle >=9.6.0, so the wrapper is bumped
  8.13.0-era 9.5.1 -> 9.7.1 to match (9.5.1 was previously the ceiling
  because it was the last version AGP 8.13.0 tolerated).
- AGP 9.4.0 also removes support for getDefaultProguardFile('proguard-android.txt')
  (it hardcodes -dontoptimize, which blocks R8 optimizations); switched
  the release buildType to the '...-optimize.txt' variant it now requires.

Verified:
- flutter build apk --flavor development --debug: succeeds
- dart format --set-exit-if-changed lib test: clean
- flutter analyze lib: 1 pre-existing warning, no errors

Not included: migrating to Flutter's Built-in Kotlin (still warns that
several plugins - firebase_analytics, firebase_auth, firebase_core,
firebase_crashlytics, firebase_remote_config, share_plus - apply their
own Kotlin Gradle Plugin). That depends on upstream plugin releases,
not something this repo controls alone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
chore(android): upgrade AGP to 9.4.0, Kotlin to 2.4.20, Gradle to 9.7.1
flutter analyze treats warnings as fatal by default, so this warning
was failing CI. It was previously masked by a build_runner crash (see
#251) that aborted the pipeline before the analyze step's exit code
mattered; once that crash was fixed, this became the new blocker.

signInWithGoogle() returned Future.value(authResult.credential?.accessToken)
from inside a try block without awaiting it, tripping
unawaited_return_in_try_block. Removing the unneeded Future.value
wrapper exposed a real, pre-existing type mismatch: the method's
declared return type is Future<String> (non-nullable) but
accessToken can be null. Fixed by throwing a Failure in that case,
consistent with how the rest of the method already handles invalid
auth states.

Verified:
- flutter analyze lib: no issues found (was 1 fatal warning)
- dart format --set-exit-if-changed lib test: clean
- No existing tests cover this method; project has no test/ files yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix(auth): resolve unawaited_return_in_try_block analyzer warning breaking CI
Initializes Claude Code project guidance (CLAUDE.md) and a docs/
directory aimed at AI coding agents: deeper reference material with
file:line citations covering DI/state management, the Isar+Hive data
layer and cache-first fetch pattern, per-feature breakdown, routing
(including the missing auth guard and a stale globalNavigatorKey
getter), the full auth flow (including the reviewer-bypass ghost
sign-in), networking/error-mapping/flavor config (including a
60000-second Dio timeout typo and the fact all three flavors hit the
same API domain), notifications, and exactly what each GitHub Actions
workflow triggers on and does.

docs/README.md asks agents to keep these files updated as the code
they describe changes, rather than letting them go stale.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs/README.md already asked for this, but CLAUDE.md is the file
guaranteed to load into every Claude Code session's context, so the
instruction needed to live there too, stated as a requirement rather
than a suggestion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs: add CLAUDE.md and AI-agent architecture docs
Analyzed the flutterconKE web redesign (flutterconKE2024Web#23, and
its dev branch design tokens/components) to ground a phased plan for
porting the same rebrand to this app. Documents what's already
aligned (primary/accent colors, the app-bar logo, bottom-nav accents
all already match the web's tokens) versus the real gap (color ramps,
rounded-card system, pill badges, stat-card color inversion, the
licensed Rauschen B display font, halftone/duotone imagery, pill
button language), plus the phase breakdown that will become GitHub
sub-issues under #243.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…256)

Foundation tokens for the 2026 flutterconKE rebrand
(docs/design/REBRAND-PLAN.md), ported from the flutterconKE web
repo's tailwind.config.js / globals.css on its dev branch. Nothing
here is wired into an existing screen yet — this is deliberately
inert until Phase 1+ adopts it.

- AppColorRamps: full blue50-900/magenta50-900 ramps, matching the
  web's Figma-export values exactly.
- Corners: extended with the rebrand's rounded-card scale
  (s16/s24/s32/s40) plus a pill/pillBorder/pillRadius trio for
  pill buttons and badges.
- PillBadge: level (magenta) / format (blue) chip widget, matching
  SessionListCard.tsx's levelPill/formatPill exactly.
- AppButtonStyles: primary/accent/outline pill ButtonStyle builders,
  matching .btn-primary/.btn-accent/.btn-outline. Opt-in — not wired
  into ThemeData's elevatedButtonTheme/outlinedButtonTheme defaults,
  since that would restyle every existing button as a side effect.
- AppTextStyles.display: Montserrat Black stand-in for the licensed
  Rauschen B display font, pending the Phase 0b decision
  (flutterconKEApp#257).
- InvertedPanelColors: a ThemeExtension encoding the two documented
  light/dark color-inversion panels (e.g. the About stat block),
  registered on both AppTheme.lightTheme()/darkTheme().

Verified: flutter analyze (clean), dart format (clean), full debug
APK build succeeds.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…kens

feat(theme): rebrand Phase 0 — design tokens
…258) (#264)

Confirmed the app-bar/sign-in logo assets already pixel-match the web
repo's new rebrand mark (rendered both to PNG and compared directly,
light and dark variants) and that there are no stray pre-rebrand
hardcoded colors anywhere in lib/ — every color reference already
goes through ThemeColors. No asset or color-usage changes needed.

sign_in.dart's only visible button is the auth_buttons package's
GoogleAuthButton, which shouldn't be restyled (Google's own brand
guidelines govern its shape); the ghost sign-in path is a hidden
long-press gesture, not a visible button. So there was no real
apply-pill-styles work available on that screen specifically.

Applied Phase 0's pill language where a real opportunity existed
instead:
- FeedbackButton (app bar, visible on most screens): fixed 10px
  radius -> Corners.pillBorder
- LogOutDialog: confirm button -> Corners.pillBorder (kept red;
  that's destructive-action semantics, not a rebrand color); cancel
  button -> AppButtonStyles.outline

Left session_filter.dart's SegmentedButton/filter-panel buttons
alone — that's session-filtering UI, not global chrome, and belongs
with Phase 3's more thorough Sessions pass.

Verified: flutter analyze (clean), dart format (clean), full debug
APK build succeeds.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…utterconKEApp#257)

Checked the droidconKE/private-fonts repo's own README for the actual
license terms rather than assuming the web's build-time-fetch pattern
would transfer cleanly. It doesn't: the license explicitly permits
serving Rauschen B as a web font from droidcon's own infrastructure,
and explicitly forbids committing it to a public repo or sharing it
externally — but says nothing about bundling the file inside a
distributed app binary. A compiled mobile app ships the font file
inside every installed APK/IPA, trivially extractable by unzipping —
a materially different distribution than serving over HTTPS from a
server droidcon controls, and not something covered by the existing
grant.

Decision (confirmed with the repo owner): don't port this. Montserrat
Black (AppTextStyles.display, shipped in Phase 0) is the permanent
display font for this app, not a placeholder pending resolution.
Revisiting this would need an explicit confirmation from whoever
actually holds the Rauschen B license/usage rights (Out of the Dark
or droidcon's brand team) that app-binary embedding is covered — not
an inference from the web's existing, web-scoped grant.

Updated docs/design/REBRAND-PLAN.md and the AppTextStyles doc comment
accordingly; no functional code change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ision

docs: rebrand Phase 0b — decide against porting Rauschen B
* feat(about): rebrand Phase 2 — home/about stat panel (closes flutterconKEApp#259)

Ported the web's About-section 2x2 stat block
(components/home/About.tsx on flutterconKE2024Web's dev branch) —
same four values (3RD Fluttercon edition, 7th Droidcon edition, 230+
sessions delivered, 3,000+ attendees since 2018), same deliberate
light/dark color inversion (black+magenta figures in light, magenta+
white figures in dark).

Placement decision: the About screen, not Home. about_screen.dart
already had an About headline + description paragraph structurally
identical to the web's About section intro, so the stat block reads
as a natural continuation of that content rather than a dashboard
summary that fits Home. Left Home's hero-style header treatment out
of scope — that's a distinct, larger visual question from the web's
own Hero component, better handled on its own rather than folded
into this stat-panel port.

AboutStatsPanel (lib/features/about/widgets/about_stats_panel.dart)
reads Phase 0's InvertedPanelColors extension and AppTextStyles.display
rather than hardcoding the light/dark swap. Wired into about_screen.dart
right after the existing intro text, before Organising Team.

Verified visually, not just via analyze/build: ran the app on an
emulator, navigated to the About screen, and confirmed both
color-inversion states directly (toggled via
adb shell cmd uimode night yes/no) — matches the web's design
exactly in both modes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(localization): update aboutFluttercon description for rebranding

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Flutter app redesign / 2026 rebrand — design language + implementation plan

1 participant