Brand v1: colours, the mark and the logotype come from the huddlie logo (see ../brand/BRANDING.md). Fonts and the icon set are still provisional. Everything below is generated from src/tokens.json and src/icons.mjs: change those, run node build.mjs, and every screen follows.
The mark (two people huddling, an H; two speech bubbles each), the lockup, and the iOS app icon. The mark file is brand/huddlie-mark.svg; the icon set is generated from it by ../brand/build-app-icon.mjs.
TipA quick tip or benefit, said by the mark.
Six drawn headshots, a third way to give a player a picture (Add a photo → Choose an avatar). Built from the mark: rounded and teardrop forms, flat colour, the mark's palette for the gear, a soft brand tint behind each, cropped to a circle. SVG, 200 x 200, in brand/avatars/; source ../brand/avatars/build-avatars.py.
Plays on the launch screen, then holds on the lockup. Each drop is born as a small circle that loops in and grows its tail; the arms reach into the hug; the speech bubbles travel out from their tail tips. About 3.3 s at 60 fps, transparent, mark only (the logotype stays live text). Lottie file: brand/huddlie-reveal.json, plays in lottie-ios, lottie-android and lottie-web. Rebuilt from the prototype's splash by ../brand/build-mark.mjs.
1024 x 1024 masters, square (iOS rounds the corners), no transparency on the default. Drop store/ios/AppIcon.appiconset into the Xcode asset catalogue as is: it carries the default, dark and tinted appearances (iOS 18+).





Each swatch shows light, then dark. From the mark: lilac-white paper, plum ink and logotype, magenta (the hug) as the one accent, blue for the second person, violet for the speech bubbles, a warm gradient for the primary action.
--c-paper#F9F6FA / #15111DApp background: lilac-white paper.--c-surface#FFFFFF / #211B2CCards, list groups, inputs.--c-surface-sunk#F0EBF4 / #0E0B14Segmented tracks, search fields, info lines.--c-ink#2B2438 / #F4EFF8Primary text and icons (plum-black).--c-ink-2#625A70 / #BDB3CBSecondary text. 6:1 on paper, safe for body copy.--c-ink-3#8C849A / #8E8599Tertiary text and inactive icons. Large text or non-essential only.--c-line#E8E2EE / #2E2739Hairlines and row dividers.--c-line-strong#D8D0E2 / #3F364DCard and input borders.--c-brand#3B2D5C / #EDE4F8Plum: the logotype colour. Logotype and screen titles.--c-brand-bar#2A1F45 / #261C3CThe dark brand bar (hub header) behind the colour logo.--c-on-brand-bar#FFFFFF / #FFFFFFText and icons on the brand bar.--c-actionlinear-gradient(115deg,#F2562B 0%,#E03599 52%,#A24FE0 100%) / linear-gradient(115deg,#F2562B 0%,#E03599 52%,#A24FE0 100%)Primary action fill: warm gradient from the mark (coral, the hug magenta, bubble violet).--c-on-action#FFFFFF / #FFFFFFText on the action gradient.--c-accent#E03599 / #F05BAEThe hug magenta: toggles, steps, focus, the one highlight.--c-accent-pressed#C92C88 / #F77DC0Accent, pressed.--c-accent-soft#FBE4F1 / #3A1830Selected chips, badges, soft highlights.--c-accent-ink#B8287A / #F58CC8Accent used as TEXT (links, nav actions). 5.3:1 on paper.--c-on-accent#FFFFFF / #FFFFFFText on an accent fill.--c-calm#2D7FF9 / #6FA3FFBlue, the second person: practice colour, info.--c-calm-soft#E6EEFD / #17233D--c-calm-ink#1C47BC / #9DBEFFCalm used as text.--c-tip#F1E9FF / #2A2140Speech-bubble tip background (the mark's bubbles).--c-tip-ink#3B2D5C / #EDE6F8Tip text.--c-tip-label#6D42D6 / #B79BFFTip label (small caps).--c-danger#C23B24 / #F08A70Destructive text and borders.--c-danger-soft#F8E1DC / #3A1E19--c-success#2E8A6A / #5FC19APresent / dressing states.--c-scrimrgba(26,18,40,.46) / rgba(0,0,0,.6)Behind sheets and alerts.--c-toastrgba(42,31,69,.95) / rgba(244,239,248,.96)Toast and banner background.--c-on-toast#FFFFFF / #15111D--c-event-game#E03599 / #F05BAEEvent type ring: game.--c-event-practice#2D7FF9 / #6FA3FFEvent type ring: practice.--c-event-tournament#8B5CF6 / #A98BFAEvent type ring: tournament.--c-event-personal#F2562B / #F7825EEvent type ring: personal (non-team) event.Display serif (Fraunces) for the logotype, names, dates and a moment's caption: the keepsake voice. Team names, event titles and scores use Instrument Sans at 85% width (--f-team). Inter for everything you operate. Sizes in points.
displaydisplay · 34/37 · 600Celebration beats, splash.title-1display · 28/31 · 600Screen identity: the player's name, the event.title-2display · 22/26 · 600Month chapters, section heroes.title-3display · 19/23 · 600Lens name in the hub bar, sheet titles.headlinetext · 16/22 · 600Row titles that lead, event titles.bodytext · 16/24 · 400Reading text.callouttext · 15/22 · 500Row titles, buttons, inputs.subheadtext · 14/21 · 400Explanations, callout body.footnotetext · 13/19 · 400Row subtitles, footers.captiontext · 12/16 · 500Meta lines, badges.microtext · 10.5/13 · 600Tab bar labels only.caption-serifdisplay · 17/24 · 400A moment's caption, set like a photo-book caption.A 4pt grid. Screen gutter is 20. Radius steps up with the size of the surface.
--s-00px--s-14px--s-28px--s-312px--s-416px--s-520px--s-624px--s-732px--s-840px--s-956px--s-gutter20px--r-sm8px--r-md12px--r-lg16px--r-xl22px--r-pill999px--r-photo10pxProvisional 24pt line set, 1.75 stroke. Each is a named slot: the final icon set replaces the drawing, never the name. Individual SVGs are in assets/icons/.
scheduleTab: Schedule hubseasonTab: Season hub (the keepsake timeline)teamTab: Team hubgearSettings (hub bar)chevron-leftBackchevron-rightRow disclosurechevron-downLens switchercloseDismiss, remove mediacheckSelected, doneplusAddsearchSearch fieldmoreOverflow / manageplayerA player (the child)huddleThe huddle: family and friends who followcoparentCo-parent (equal owner)inviteInvite someonegameEvent type: game (a pennant, deliberately not sport-specific)practiceEvent type: practicetournamentEvent type: tournamentpersonalEvent type: personal (non-team) milestonemilestoneA milestone (rationed celebration)calendarDate fieldclockTime fieldpinArena / place (opens maps)liveHappening nowscoreScore entrymomentA moment (the keepsake unit)photoAdd photovideoAdd videoplayPlay videonotePrivate note / text momenttagTag a moment to an eventprivateScope: privatescope-huddleScope: the huddlescope-teamScope: the teamhiddenHidden from the timelinevisibleUnhideeditEdittrashDeletelinkCopy invite linkshareSharerefreshRefresh a subscribed schedulebellNotificationsbell-offMutedmailEmail fieldlockPassword fieldinfoInformation calloutalertError / warningofflineNo connectioncameraCamera roll accesssparkleCelebration mark (rationed)Every screen is built from these. Class names in assets/kit.css.
One primary per screen. Secondary for supporting actions, quiet for the way out, danger outlined, never filled.
Jersey 10 is already taken on this team.
The left stripe is the event type token.
A photo mounted on a paper mat, the caption set like a photo-book caption.
Team huddle before the final.
Asked to stay late for extra shooting drills tonight. First time asking on their own.
Onboarding only: name, team, schedule.
Calm tint for players you own, warm for players you follow, numbered for roster entries. Real photos replace the letter.