DIVE-3597: kill every remaining bee/Buzz visual (refresh indicator, theme label, iOS icons, dead asset) - #8
Merged
Merged
Conversation
…eme label, iOS icons, dead asset) - pull-to-refresh now renders the 5dive mark: BeeRefreshIndicator -> BrandRefreshIndicator across all 5 call sites, with flapping_bee.dart and tappable_flapping_bee.dart (now unreferenced) deleted, so no bee geometry ships in the APK at all. - theme picker reads '5dive' / '5dive Dark' everywhere, via one override map consumed by both ThemeColors.displayName and pairedThemeLabel. The persisted 'buzz' key is unchanged deliberately: it is a wire value published to the community relay and read back by Buzz Desktop, whose catalog rejects a theme name it does not know. - iOS AppIcon regenerated from app/public/icon-512.png (15 files, all opaque RGB, glyph 9% of pixels). - mobile/assets/images/buzz-icon.png removed from the tree and pubspec. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… style drops the trailing comma when it fits)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes DIVE-3597. The byte-verifiable remainder of the rebrand, spec'd from olivia's disclosed
NOT-DONE list on DIVE-3578 plus quinn's grade. No UX changes beyond this scope.
1. No bee renders anywhere in the app
BeeRefreshIndicator→BrandRefreshIndicator, drawingFiveDiveMark— the same alpha-maskasset the welcome hero uses, so the launcher icon, the onboarding hero and the refresh indicator
are now one mark. All 5 call sites moved (forum, activity ×2, pulse, channels).
flapping_bee.dartandtappable_flapping_bee.dartare now unreferenced and deleted: withthe indicator no longer sharing the painter, the reason the logo pass kept them has expired, and
leaving them compiles ~600 lines of another brand's path geometry into the APK for zero call
sites. Nothing warns about an unreferenced public class in
lib/.The brand-neutral gesture half is carried over verbatim — elastic pull off
BouncingScrollPhysics'negative scroll position, the
OverscrollNotificationfallback for clamping physics, the retained72px loading gap, the reveal ramp,
RefreshIndicator.noSpinner, and the single medium-impact armhaptic. What dies with the bee is the easter egg: wing flap, pupils that grow past the arm
point, and the 👀 swap with its repeating
selectionClickhaptic. Calling that out explicitlyrather than letting a reviewer discover a silently-deleted interaction. It is replaced by a slow
12%-depth breathing pulse while the refresh is in flight, off under
disableAnimations.The test moved with it and keeps a positive assertion (
find.byType(FiveDiveMark)) — the oldone asserted
FlappingBee.flapAmount/eyeProgress, which the mark does not have, so thereduced-motion arm is re-expressed as "the
brand-refresh-scaletransform does not move across apump".
2. Theme label — and why the persisted key is NOT renamed
The picker now reads 5dive / 5dive Dark in every mode, including the System-mode row and
the "default" row. That is the DONE line the ticket asked for.
The ticket said to do the full key rename. I did not, deliberately, because the key is not
mobile-private.
mobile/lib/shared/theme/community_theme_preference.dartpublishes the theme nameto the community relay under d-tag
community-theme, anddesktop/src/shared/theme/theme-loader.tsin this same repo holds the same
"buzz"catalog key. Both ends validate the name againsttheir own catalog and discard a preference naming a theme they do not know — mobile's
CommunityThemePreference.fromJsonthrowsFormatExceptionthe momentfindTheme()returns null.So a mobile-only rename breaks it in both directions at once: mobile drops every stored/remote
preference that still says
'buzz', and Buzz Desktop drops every preference mobile writes saying'5dive'. Nothing errors visibly; the palette just silently reverts on whichever client you arenot looking at. That is a cross-client wire break, not an internal rename — the wiki's §6 framed
this choice as mobile-internal and it is not.
What is here instead is a third shape that carries zero wire risk: one
themeDisplayNameOverridesmap intheme_catalog.dart, consumed by both derivation sites —ThemeColors.displayName(the explicit Light/Dark rows) andpairedThemeLabel(theSystem-mode row) — plus
defaultSchemeDisplayName. Wiring only one of the two would reproduceexactly the two-names-for-one-palette bug §6 warns about. A real key rename is a
mobile + desktop + migration change and wants its own row.
Note
themeGroups()sorts bydisplayName, so the override changes sort position:'5dive'still sorts first (digits precede letters), which is what "Buzz leads the map" wanted, and the
theme_pairs_testarms that assert display-name ordering andpaired.first.namestill hold.3. iOS AppIcon regenerated
All 15 distinct files regenerated from
app/public/icon-512.png. iOS icons are opaque RGB —alpha is rejected — so this inverts the launcher recipe: it is a flatten, not a cut-out. The
source is composited onto its own background colour, sampled inside the rounded square
(
(20, 256)→#1A1A1F) rather than at a corner, which is transparent.Guards, because both failure modes here write a valid PNG and print nothing:
(26,26,31) × 237464and(255,255,255) × 23468on 512²;23820, asserted> 5000— the glyph survived and the square isnot one flat colour;
size == (n, n)andmode == 'RGB'.Contents.jsonhas 19 entries but only 15 distinct filenames (iPhone/iPad share several), so theloop is driven off a filename→size map with each filename asserted to resolve to exactly one size.
4. Dead asset
mobile/assets/images/buzz-icon.pngremoved from the tree and frompubspec.yaml; nothing inlib/referenced it and it was shipping in the APK. Zerobuzz-iconreferences remain anywhere.Checks
Ran on this host:
bash scripts/test-mobile-worktree-overrides.sh→all mobile worktree identity contract checks passed(read the pass line, not$?through a pipe).bee/FlappingBee/BeeRefreshreferences left inmobile/libormobile/test.buzz-iconreferences in the tree.Format checkleavesAnalyze,TestandBuildskipped in the same job and a skipped step reads as "not failing".Not run here:
dart format,flutter analyze,flutter test— there is no Flutter on theagent hosts. CI's
Mobilejob is the check; read its per-step conclusions, not the run's.🤖 Generated with Claude Code