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",
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#0E1018"
"backgroundColor": "#15110D"
}
},
"splash": {
"image": "./assets/splash.png",
"backgroundColor": "#0E1018",
"backgroundColor": "#15110D",
"resizeMode": "contain"
},
"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
* "o" z wordmarku, motyw soczewki/oka (watching) bez dosłowności. Czysty SVG
* (bez fontu) używany do generowania app-icon / adaptive-icon / splash PNG,
* gdzie custom font nie jest dostępny.
* Brand mark double-o ("oo"): dwa ringi obok siebie z oxblood dotem w środku
* każdego. Czyta się jako "oo" z goon / para soczewek-oczu (watching). Spójny z
* wybranym app-icon (2026-05-30, AI-gen interlocked oo). Czysty SVG (bez fontu)
* 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({
size = 48,
size = 88,
ringColor = theme.fg,
dotColor = theme.accent,
bg,
}: {
size?: number;
ringColor?: 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 (
<Svg width={size} height={size} viewBox="0 0 100 100" fill="none">
{bg ? <Circle cx={50} cy={50} r={50} fill={bg} /> : null}
<Circle cx={50} cy={50} r={36} stroke={ringColor} strokeWidth={11} fill="none" />
<Circle cx={50} cy={50} r={15} fill={dotColor} />
<Svg width={size} height={height} viewBox="0 0 200 112" fill="none">
<Circle cx={56} cy={56} r={44} stroke={ringColor} strokeWidth={13} fill="none" />
<Circle cx={56} cy={56} r={16} 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>
);
}

View file

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