feat(brand): oo logo — app icons, landing, in-app mark (Gemini-generated)

Wybrane logo: interlocked double-o "oo" (off-white ringi + oxblood doty na warm
charcoal). Wygenerowane przez Gemini 3 Pro Image (Nano Banana), wybrane z 8
wariantow przez Jana.

Native icons (wejda przy nast. APK buildzie, nie OTA):
- assets/icon.png, adaptive-icon.png, splash.png, favicon.png — zlozone z mastera
  przez PIL (mark wyciety po alpha-masce, osadzony na dokladnym #15110D, rozne
  fill-ratio per asset).
- app.json: adaptiveIcon + splash backgroundColor #0E1018 (stary navy) -> #15110D.

In-app (OTA):
- GoonMark SVG przerobiony z pojedynczego ring+dot na double-o (2 ringi + doty),
  spojny z app-icon. Login: mark 92 + wordmark 40.

Landing goon-foss.org (osobny deploy na caddy volume):
- /logo.png + /favicon.png upload, <link rel=icon/apple-touch-icon>, hero brand
  block: dot+text -> <img logo> + dwutonowy "g[oo]n".

OTA: a81ea98c-723d-4b39-9dc0-bbe8736c104e.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jtrzupek 2026-05-30 22:38:52 +02:00
parent d87263dde9
commit 732401cef2
7 changed files with 20 additions and 19 deletions

View file

@ -22,12 +22,12 @@
"package": "com.goon.mobile", "package": "com.goon.mobile",
"adaptiveIcon": { "adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png", "foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#0E1018" "backgroundColor": "#15110D"
} }
}, },
"splash": { "splash": {
"image": "./assets/splash.png", "image": "./assets/splash.png",
"backgroundColor": "#0E1018", "backgroundColor": "#15110D",
"resizeMode": "contain" "resizeMode": "contain"
}, },
"web": { "web": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -46,31 +46,32 @@ export function GoonWordmark({ size = 26, color = theme.fg, mono = false }: Word
} }
/** /**
* Monogram koncentryczny ring + wypełniona kropka (oxblood). Czyta się jako * Brand mark double-o ("oo"): dwa ringi obok siebie z oxblood dotem w środku
* "o" z wordmarku, motyw soczewki/oka (watching) bez dosłowności. Czysty SVG * każdego. Czyta się jako "oo" z goon / para soczewek-oczu (watching). Spójny z
* (bez fontu) używany do generowania app-icon / adaptive-icon / splash PNG, * wybranym app-icon (2026-05-30, AI-gen interlocked oo). Czysty SVG (bez fontu)
* gdzie custom font nie jest dostępny. * używany na Login + jako wzór dla raster app-icon.
* *
* <GoonMark size={48} /> * `size` = szerokość; wysokość = size * 0.56 (proporcja 2 ringów obok siebie).
*
* <GoonMark size={88} />
*/ */
export function GoonMark({ export function GoonMark({
size = 48, size = 88,
ringColor = theme.fg, ringColor = theme.fg,
dotColor = theme.accent, dotColor = theme.accent,
bg,
}: { }: {
size?: number; size?: number;
ringColor?: string; ringColor?: string;
dotColor?: string; dotColor?: string;
/** Opcjonalne tło (dla icon — np. theme.bg). Pominięte = przezroczyste. */
bg?: string;
}) { }) {
// viewBox 100×100. Ring: cx50 cy50 r36, stroke 11. Dot: r15 wypełniony. // viewBox 200×112. Dwa ringi: cx 56 i 144, cy 56, r 44, stroke 13. Doty r 16.
const height = size * (112 / 200);
return ( return (
<Svg width={size} height={size} viewBox="0 0 100 100" fill="none"> <Svg width={size} height={height} viewBox="0 0 200 112" fill="none">
{bg ? <Circle cx={50} cy={50} r={50} fill={bg} /> : null} <Circle cx={56} cy={56} r={44} stroke={ringColor} strokeWidth={13} fill="none" />
<Circle cx={50} cy={50} r={36} stroke={ringColor} strokeWidth={11} fill="none" /> <Circle cx={56} cy={56} r={16} fill={dotColor} />
<Circle cx={50} cy={50} r={15} fill={dotColor} /> <Circle cx={144} cy={56} r={44} stroke={ringColor} strokeWidth={13} fill="none" />
<Circle cx={144} cy={56} r={16} fill={dotColor} />
</Svg> </Svg>
); );
} }

View file

@ -58,9 +58,9 @@ export function LoginScreen({ onAuthenticated }: Props) {
keyboardShouldPersistTaps="handled" keyboardShouldPersistTaps="handled"
> >
<View style={styles.brandBlock}> <View style={styles.brandBlock}>
<GoonMark size={44} bg="transparent" /> <GoonMark size={92} />
<View style={{ height: 14 }} /> <View style={{ height: 16 }} />
<GoonWordmark size={44} /> <GoonWordmark size={40} />
<Text style={styles.subtitle}>self-hosted scene catalog</Text> <Text style={styles.subtitle}>self-hosted scene catalog</Text>
</View> </View>