FindMyETH · look & feel

Making the app feel more techy and exciting

The app is clean and calm today. These changes make it feel like a live campus system: data that moves, a map that glows, and motion that explains what is happening. Most are small SwiftUI changes on top of what exists. Pills mark effort and where the design spec (idea1) would need an update.

Direction

"Campus OS"

Dark-first, teal glowsDark becomes the hero mode. The teal turns into light: glowing routes, live dots, focus rings. Light mode stays as is.
Data looks like dataRoom codes, ETAs, floors and counts in a monospace face with tabular numbers, like an instrument readout.
Everything is liveNumbers tick, routes flow, presence pulses. The app shows it is working right now, not a static screen.
Start here

Six quick wins, in order

  1. Monospace for all dataRoom codes, ETAs, floors, prices, counts.
    Small
  2. Flowing, glowing route lineThe single biggest "wow" on the map.
    Small
  3. Rolling numbersETAs, vote counts and free seats animate when they change.
    Small
  4. Glass floating controlsSearch bar, chips and route sheet float over the map.
    Small
  5. Live presence everywherePulsing dots and "3/4 swiping now" rings.
    Small
  6. Route HUD sheetTurn-by-turn as an instrument panel with progress.
    Medium
01 · Colour & surfaces

Give the dark mode depth and light

Teal as light, not paint

In dark mode, active things glow: the route, the "me" dot, the selected chip and the primary button get a soft teal halo. Inactive things stay flat and grey. The eye goes straight to what matters.

.shadow(color: tint.opacity(0.45), radius: 10) on active elements, dark only

SmallSpec: add "glow" token
Guide me there

Glass floating controls

The search bar, filter chips, floor pill and bottom sheets use a frosted material, so the map stays visible underneath. It feels layered and native to iOS.

.background(.ultraThinMaterial, in: Capsule()) + 0.5 pt white hairline

Small
Next HG F 33.1 · 4 min

A blueprint layer for indoor maps

When you zoom into a building, a faint technical grid and room outlines fade in, like an architectural plan. Room labels use the monospace face. It makes "we map the inside of ETH" visible at a glance.

MapPolygon room outlines with a thin tint stroke + a Canvas grid overlay with allowsHitTesting(false), opacity tied to zoom

MediumSpec: indoor style
02 · Typography & data

Make numbers and codes look like instruments

Monospace for room codes and readouts

"HG F 33.1" becomes segmented chips: building, floor, room. ETAs, floors, prices and counts use a monospace face with tabular digits. Titles stay in Plus Jakarta Sans.

.font(.system(.body, design: .monospaced)).monospacedDigit()

SmallSpec: add data font role
HG›F›33.1

Rolling numbers

When an ETA, a vote count or the number of free seats changes, the digits roll instead of jumping. Small detail, strong "live system" feeling.

.contentTransition(.numericText()) + withAnimation on the value change

Small
4min · arrive 12:24

Short, precise microcopy

Write like a system that knows: "Leave in 3 min", "Free until 14:00", "3/4 swiped", "Synced 2 s ago". Fewer words, more numbers.

Small
03 · Map & navigation

Let the map feel alive

Flowing route line

The route has a soft base line and a brighter dash pattern flowing toward the destination, with a faint glow. It reads as "go this way" without words.

Two MapPolylines; the top one with StrokeStyle(dash:) and a dashPhase driven by TimelineView

Small

Route fly-through

After "Guide me there", the camera tilts to 3D and sweeps along the route for about three seconds, then settles at the start. Tap to skip.

.mapCameraKeyframeAnimator(trigger:) over route points, pitch 0 → 55 → 0

Medium
3D · tilt 55°
HG → CAB

Route HUD sheet

The route sheet becomes an instrument panel: next step with a big direction glyph, distance and floor as readouts, a progress bar that fills as you walk, arrival time.

Grid of monospaced readouts + ProgressView tied to routeProgress, SF Symbols with .symbolEffect(.bounce) on step change

Medium
NEXTStairs ↑ Floor F
DIST40 m
ETA12:24 · 4 min

Scan sweep while searching

While results load or the floor plan appears, a thin teal sweep passes over the map once, like a scanner. Use it only for real loading moments.

LinearGradient band animated over the map with an offset, allowsHitTesting(false), runs once

Small
locating HG F 33.1…
04 · Motion & feedback

Motion that explains, haptics that confirm

Live presence signals

A pulsing dot next to anything live: friends on campus, a group session, occupancy data. In Socials, each member avatar gets a progress ring while they swipe.

Circle().trim(from:to:) ring per avatar, .symbolEffect(.pulse) on live dots

Small
5 friends live

One haptic language

Selection tick for chips and tabs, a firm tick when you change floors, a light tap when a swipe passes the "counts" line, a success buzz on a group match and on arrival. Consistent haptics make the app feel engineered.

.sensoryFeedback(.selection / .levelChange / .impact(weight: .light) / .success, trigger:)

Small

Smooth transitions between screens

Cards expand into their detail sheet, the dish card flies into the top-pick slot, the lecture card zooms into its sheet. Elements keep their identity instead of popping.

matchedGeometryEffect; iOS 18: .navigationTransition(.zoom(sourceID:in:))

Medium

Animated SF Symbols

The mic waves while listening, the locate arrow bounces when it centres, toggles morph between symbols. Built into iOS 17, almost free.

.symbolEffect(.variableColor.iterative), .bounce, .contentTransition(.symbolEffect(.replace))

Small
05 · Screen by screen

Where each screen can level up

Navigate

Glass search bar, segmented room-code results, flowing route, blueprint indoor layer, HUD route sheet. Default to a slight 3D tilt when a building is selected.

Mostly small

Socials

Progress rings on member avatars, rolling vote counts, cards physically reordering when the ranking changes, a "match" moment with a burst of teal and a success haptic.

SmallReorder: medium

Schedule

A "Leave in 3 min" readout on the next lecture that counts down live, in green, amber or red. The next card gets a thin glowing border instead of only a fill.

Small

Profile & stats

Interactive charts you can scrub (Swift Charts selection), stats as large monospaced readouts, a "Computed on this iPhone" line with a lock symbol for the privacy story.

Small
Guardrails

Exciting without becoming noisy