diff --git a/android/app/src/main/res/drawable/ic_launcher_background.png b/android/app/src/main/res/drawable/ic_launcher_background.png new file mode 100644 index 0000000..e57ada2 Binary files /dev/null and b/android/app/src/main/res/drawable/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c023e50..99e754d 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 2127973..5978480 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index b441f37..ff75d44 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 72905b8..4f8d798 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 8ed0605..9b18c50 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 9502e47..a35abf2 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 4d1e077..5a50ab4 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index df0f158..b6701e8 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 853db04..73f8573 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 6cdf97c..e1b0598 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 2960cbb..c070762 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 8e3093a..bbbc117 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 46de6e2..553b387 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index d2ea9ab..6720d10 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index a40d73e..018db0a 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml index c5d5899..a9067c3 100644 --- a/android/app/src/main/res/values/ic_launcher_background.xml +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #FFFFFF + #101d3c \ No newline at end of file diff --git a/beacon/icon.png b/beacon/icon.png index 6f7e1a8..57849af 100644 Binary files a/beacon/icon.png and b/beacon/icon.png differ diff --git a/beacon/index.html b/beacon/index.html index f52ab25..7f4ae2a 100644 --- a/beacon/index.html +++ b/beacon/index.html @@ -2,7 +2,7 @@ - + diff --git a/beacon/logo.png b/beacon/logo.png index 6f7e1a8..398f98e 100644 Binary files a/beacon/logo.png and b/beacon/logo.png differ diff --git a/beacon/public/manifest.json b/beacon/public/manifest.json index 34a6641..7cb225b 100644 --- a/beacon/public/manifest.json +++ b/beacon/public/manifest.json @@ -5,8 +5,8 @@ "start_url": "/", "display": "standalone", "orientation": "landscape", - "theme_color": "#faf9f6", - "background_color": "#faf9f6", + "theme_color": "#101d3c", + "background_color": "#101d3c", "icons": [ { "src": "/src/assets/beacon-favicon-32.png", @@ -40,10 +40,10 @@ "type": "image/png" }, { - "src": "/src/assets/beacon-icon-512.png", + "src": "/src/assets/beacon-app-icon-512-maskable.png", "sizes": "512x512", "type": "image/png", - "purpose": "any" + "purpose": "maskable" }, { "src": "/src/assets/beacon-app-icon.svg", diff --git a/beacon/src/assets/beacon-app-icon-16.png b/beacon/src/assets/beacon-app-icon-16.png index 1f39bcf..15218ce 100644 Binary files a/beacon/src/assets/beacon-app-icon-16.png and b/beacon/src/assets/beacon-app-icon-16.png differ diff --git a/beacon/src/assets/beacon-app-icon-192-maskable.png b/beacon/src/assets/beacon-app-icon-192-maskable.png index c612586..3858902 100644 Binary files a/beacon/src/assets/beacon-app-icon-192-maskable.png and b/beacon/src/assets/beacon-app-icon-192-maskable.png differ diff --git a/beacon/src/assets/beacon-app-icon-192.png b/beacon/src/assets/beacon-app-icon-192.png index 8e6b6d0..1b51442 100644 Binary files a/beacon/src/assets/beacon-app-icon-192.png and b/beacon/src/assets/beacon-app-icon-192.png differ diff --git a/beacon/src/assets/beacon-app-icon-256.png b/beacon/src/assets/beacon-app-icon-256.png index 172a080..7721e19 100644 Binary files a/beacon/src/assets/beacon-app-icon-256.png and b/beacon/src/assets/beacon-app-icon-256.png differ diff --git a/beacon/src/assets/beacon-app-icon-32.png b/beacon/src/assets/beacon-app-icon-32.png index 692d123..06ff1de 100644 Binary files a/beacon/src/assets/beacon-app-icon-32.png and b/beacon/src/assets/beacon-app-icon-32.png differ diff --git a/beacon/src/assets/beacon-app-icon-512-maskable.png b/beacon/src/assets/beacon-app-icon-512-maskable.png new file mode 100644 index 0000000..4b9a180 Binary files /dev/null and b/beacon/src/assets/beacon-app-icon-512-maskable.png differ diff --git a/beacon/src/assets/beacon-app-icon-512.png b/beacon/src/assets/beacon-app-icon-512.png index 03ff972..5aa62a4 100644 Binary files a/beacon/src/assets/beacon-app-icon-512.png and b/beacon/src/assets/beacon-app-icon-512.png differ diff --git a/beacon/src/assets/beacon-app-icon-64.png b/beacon/src/assets/beacon-app-icon-64.png index 0a5f4e1..8f065ca 100644 Binary files a/beacon/src/assets/beacon-app-icon-64.png and b/beacon/src/assets/beacon-app-icon-64.png differ diff --git a/beacon/src/assets/beacon-app-icon-maskable.svg b/beacon/src/assets/beacon-app-icon-maskable.svg index b0fc363..403ee27 100644 --- a/beacon/src/assets/beacon-app-icon-maskable.svg +++ b/beacon/src/assets/beacon-app-icon-maskable.svg @@ -1,12 +1,38 @@ - - - - - - - - - - - - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beacon/src/assets/beacon-app-icon.svg b/beacon/src/assets/beacon-app-icon.svg index 258b149..b5e5355 100644 --- a/beacon/src/assets/beacon-app-icon.svg +++ b/beacon/src/assets/beacon-app-icon.svg @@ -1,14 +1,38 @@ - - - - - - - - - - - - - - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beacon/src/assets/beacon-favicon-32.png b/beacon/src/assets/beacon-favicon-32.png index 692d123..06ff1de 100644 Binary files a/beacon/src/assets/beacon-favicon-32.png and b/beacon/src/assets/beacon-favicon-32.png differ diff --git a/beacon/src/assets/beacon-icon-256.png b/beacon/src/assets/beacon-icon-256.png index 172a080..7721e19 100644 Binary files a/beacon/src/assets/beacon-icon-256.png and b/beacon/src/assets/beacon-icon-256.png differ diff --git a/beacon/src/assets/beacon-icon-512.png b/beacon/src/assets/beacon-icon-512.png index 03ff972..5aa62a4 100644 Binary files a/beacon/src/assets/beacon-icon-512.png and b/beacon/src/assets/beacon-icon-512.png differ diff --git a/beacon/src/assets/beacon-icon-64.png b/beacon/src/assets/beacon-icon-64.png index 0a5f4e1..8f065ca 100644 Binary files a/beacon/src/assets/beacon-icon-64.png and b/beacon/src/assets/beacon-icon-64.png differ diff --git a/beacon/src/assets/beacon-logo-horizontal.png b/beacon/src/assets/beacon-logo-horizontal.png index c34f910..721f8dc 100644 Binary files a/beacon/src/assets/beacon-logo-horizontal.png and b/beacon/src/assets/beacon-logo-horizontal.png differ diff --git a/beacon/src/assets/beacon-logo-horizontal.svg b/beacon/src/assets/beacon-logo-horizontal.svg index 6f5a22c..dd277a4 100644 --- a/beacon/src/assets/beacon-logo-horizontal.svg +++ b/beacon/src/assets/beacon-logo-horizontal.svg @@ -1,24 +1,38 @@ - - - - - - - - - - - - Beacon - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beacon/src/assets/beacon-logo-main.png b/beacon/src/assets/beacon-logo-main.png index abfc8a7..075d5d7 100644 Binary files a/beacon/src/assets/beacon-logo-main.png and b/beacon/src/assets/beacon-logo-main.png differ diff --git a/beacon/src/assets/beacon-og.png b/beacon/src/assets/beacon-og.png index 58f6613..5a64326 100644 Binary files a/beacon/src/assets/beacon-og.png and b/beacon/src/assets/beacon-og.png differ diff --git a/beacon/src/assets/beacon-og.svg b/beacon/src/assets/beacon-og.svg index d631d68..2ad08e3 100644 --- a/beacon/src/assets/beacon-og.svg +++ b/beacon/src/assets/beacon-og.svg @@ -1,40 +1,38 @@ - - - - - - - - - - - - - - - - - - - - Beacon - - - Your family's daily signal - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beacon/src/assets/beacon-wordmark.svg b/beacon/src/assets/beacon-wordmark.svg index cdbf4f4..4be0d98 100644 --- a/beacon/src/assets/beacon-wordmark.svg +++ b/beacon/src/assets/beacon-wordmark.svg @@ -1,12 +1 @@ - - - Beacon - - - - +Beacon \ No newline at end of file diff --git a/beacon/src/styles/tokens.css b/beacon/src/styles/tokens.css index a64e90b..3fd9609 100644 --- a/beacon/src/styles/tokens.css +++ b/beacon/src/styles/tokens.css @@ -16,7 +16,7 @@ --color-paper: #f8fafc; /* Brand + primary functional accent */ - --color-brand: #f59e0b; + --color-brand: #f7a832; --color-accent: #3b82f6; /* Category colors (4) — used for calendar/family-member color coding */ @@ -27,7 +27,7 @@ /* Semantic state colors — deliberately distinct from brand/category hues */ --color-success: #22c55e; - --color-warning: #d97706; /* NOT #f59e0b — that's brand gold; warning needs + --color-warning: #d97706; /* NOT #f7a832 — that's brand gold; warning needs its own hue so a warning toast is never visually identical to the Beacon brand mark */ --color-error: #ef4444; diff --git a/branding/icon/README.md b/branding/icon/README.md new file mode 100644 index 0000000..9c16c75 --- /dev/null +++ b/branding/icon/README.md @@ -0,0 +1,49 @@ +# Beacon Icon Set + +This directory contains the source artwork and build tools for Beacon's icon set. + +## Regenerating Icons + +The icon set is generated from a single SVG source with the Inter font for text elements. To regenerate all icons: + +1. **Download the Inter Variable Font** from Google Fonts: + ```bash + curl -L -o Inter.ttf "https://github.com/google/fonts/raw/main/ofl/inter/Inter%5Bopsz%2Cwght%5D.ttf" + ``` + + Note: The font file is not committed to the repository. Download it each time you need to rebuild. + +2. **Install Python dependencies**: + ```bash + pip install cairosvg pillow fonttools + ``` + +3. **Run the build script**: + ```bash + INTER_TTF=Inter.ttf python3 scripts/build-icons.py + ``` + + This will: + - Generate SVG source files with text converted to paths in `branding/icon/svg/` + - Export PNG assets for all platforms in `branding/icon/export/` + - Automatically copy all files to their repository destinations per `manifest.json` + +## Generated Assets + +- **Web**: App icons (16-512px), maskable icons, favicon, OG image +- **Home Assistant**: Add-on icon (128x128) and logo (250x100) +- **Android**: All density buckets (mdpi through xxxhdpi) for launcher icons +- **iOS**: 1024x1024 opaque RGB app icon +- **Docs**: Favicon for the documentation site + +## Source Files + +- `svg/*.svg` - SVG source files with text converted to paths +- `export/` - Rasterized PNG exports (not committed to repo) +- `manifest.json` - Maps generated files to their repository paths + +## Platform Notes + +- **Android**: Background color is set to `#101d3c` in `values/ic_launcher_background.xml` +- **iOS**: Icon must be opaque RGB (no alpha channel) per Apple requirements +- **Web**: Includes both standard and maskable icons for PWA support diff --git a/branding/icon/manifest.json b/branding/icon/manifest.json new file mode 100644 index 0000000..8adbadd --- /dev/null +++ b/branding/icon/manifest.json @@ -0,0 +1,138 @@ +{ + "export/web/beacon-app-icon-192.png": [ + "src/assets/beacon-app-icon-192.png", + "beacon/src/assets/beacon-app-icon-192.png" + ], + "export/web/beacon-app-icon-256.png": [ + "src/assets/beacon-app-icon-256.png", + "beacon/src/assets/beacon-app-icon-256.png" + ], + "export/web/beacon-icon-256.png": [ + "src/assets/beacon-icon-256.png", + "beacon/src/assets/beacon-icon-256.png" + ], + "export/web/beacon-app-icon-512.png": [ + "src/assets/beacon-app-icon-512.png", + "beacon/src/assets/beacon-app-icon-512.png" + ], + "export/web/beacon-icon-512.png": [ + "src/assets/beacon-icon-512.png", + "beacon/src/assets/beacon-icon-512.png" + ], + "export/web/beacon-app-icon-16.png": [ + "src/assets/beacon-app-icon-16.png", + "beacon/src/assets/beacon-app-icon-16.png" + ], + "export/web/beacon-app-icon-32.png": [ + "src/assets/beacon-app-icon-32.png", + "beacon/src/assets/beacon-app-icon-32.png" + ], + "export/web/beacon-app-icon-64.png": [ + "src/assets/beacon-app-icon-64.png", + "beacon/src/assets/beacon-app-icon-64.png" + ], + "export/web/beacon-icon-64.png": [ + "src/assets/beacon-icon-64.png", + "beacon/src/assets/beacon-icon-64.png" + ], + "export/web/beacon-favicon-32.png": [ + "src/assets/beacon-favicon-32.png", + "beacon/src/assets/beacon-favicon-32.png" + ], + "export/web/beacon-app-icon-192-maskable.png": [ + "src/assets/beacon-app-icon-192-maskable.png", + "beacon/src/assets/beacon-app-icon-192-maskable.png" + ], + "export/web/beacon-app-icon-512-maskable.png": [ + "NEW: src/assets/beacon-app-icon-512-maskable.png (+beacon/ copy; add to manifest.json purpose:maskable)" + ], + "svg/app-icon-master.svg": [ + "src/assets/beacon-app-icon.svg", + "beacon/src/assets/beacon-app-icon.svg" + ], + "svg/app-icon-maskable.svg": [ + "src/assets/beacon-app-icon-maskable.svg", + "beacon/src/assets/beacon-app-icon-maskable.svg" + ], + "svg/favicon.svg": [ + "docs-site/public/favicon.svg", + "NEW: public/favicon.svg (point index.html here instead of the full app icon)" + ], + "svg/wordmark.svg": [ + "src/assets/beacon-wordmark.svg", + "beacon/src/assets/beacon-wordmark.svg" + ], + "svg/horizontal-lockup.svg": [ + "src/assets/beacon-logo-horizontal.svg", + "beacon/src/assets/beacon-logo-horizontal.svg" + ], + "svg/og.svg": [ + "src/assets/beacon-og.svg", + "beacon/src/assets/beacon-og.svg" + ], + "export/web/beacon-og.png": [ + "src/assets/beacon-og.png", + "beacon/src/assets/beacon-og.png" + ], + "export/web/beacon-logo-horizontal.png": [ + "src/assets/beacon-logo-horizontal.png", + "beacon/src/assets/beacon-logo-horizontal.png" + ], + "export/ha/icon.png": [ + "beacon/icon.png" + ], + "export/ha/logo.png": [ + "beacon/logo.png" + ], + "export/android/app/src/main/res/mipmap-mdpi/ic_launcher.png": [ + "android/app/src/main/res/mipmap-mdpi/ic_launcher.png" + ], + "export/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png": [ + "android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png" + ], + "export/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png": [ + "android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png" + ], + "export/android/app/src/main/res/mipmap-hdpi/ic_launcher.png": [ + "android/app/src/main/res/mipmap-hdpi/ic_launcher.png" + ], + "export/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png": [ + "android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png" + ], + "export/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png": [ + "android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png" + ], + "export/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png": [ + "android/app/src/main/res/mipmap-xhdpi/ic_launcher.png" + ], + "export/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png": [ + "android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png" + ], + "export/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png": [ + "android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png" + ], + "export/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png": [ + "android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png" + ], + "export/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png": [ + "android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png" + ], + "export/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png": [ + "android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png" + ], + "export/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png": [ + "android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" + ], + "export/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png": [ + "android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png" + ], + "export/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png": [ + "android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png" + ], + "export/android/ic_launcher_background.png": [ + "NEW: android/app/src/main/res/drawable/ic_launcher_background.png (or keep values/ic_launcher_background.xml color #101d3c; check mipmap-anydpi-v26/ic_launcher.xml)" + ], + "export/ios/AppIcon-512@2x.png": [ + "ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png" + ] +} \ No newline at end of file diff --git a/branding/icon/svg/app-icon-adaptive-background.svg b/branding/icon/svg/app-icon-adaptive-background.svg new file mode 100644 index 0000000..03221db --- /dev/null +++ b/branding/icon/svg/app-icon-adaptive-background.svg @@ -0,0 +1,13 @@ +Beacon + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/app-icon-adaptive-foreground.svg b/branding/icon/svg/app-icon-adaptive-foreground.svg new file mode 100644 index 0000000..8d0dbf4 --- /dev/null +++ b/branding/icon/svg/app-icon-adaptive-foreground.svg @@ -0,0 +1,38 @@ +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/app-icon-maskable.svg b/branding/icon/svg/app-icon-maskable.svg new file mode 100644 index 0000000..403ee27 --- /dev/null +++ b/branding/icon/svg/app-icon-maskable.svg @@ -0,0 +1,38 @@ +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/app-icon-master.svg b/branding/icon/svg/app-icon-master.svg new file mode 100644 index 0000000..b5e5355 --- /dev/null +++ b/branding/icon/svg/app-icon-master.svg @@ -0,0 +1,38 @@ +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/favicon.svg b/branding/icon/svg/favicon.svg new file mode 100644 index 0000000..aca69f4 --- /dev/null +++ b/branding/icon/svg/favicon.svg @@ -0,0 +1,7 @@ +Beacon + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/horizontal-lockup.svg b/branding/icon/svg/horizontal-lockup.svg new file mode 100644 index 0000000..dd277a4 --- /dev/null +++ b/branding/icon/svg/horizontal-lockup.svg @@ -0,0 +1,38 @@ +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/icon-mono.svg b/branding/icon/svg/icon-mono.svg new file mode 100644 index 0000000..c766510 --- /dev/null +++ b/branding/icon/svg/icon-mono.svg @@ -0,0 +1,7 @@ +Beacon + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/og.svg b/branding/icon/svg/og.svg new file mode 100644 index 0000000..2ad08e3 --- /dev/null +++ b/branding/icon/svg/og.svg @@ -0,0 +1,38 @@ +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branding/icon/svg/wordmark.svg b/branding/icon/svg/wordmark.svg new file mode 100644 index 0000000..4be0d98 --- /dev/null +++ b/branding/icon/svg/wordmark.svg @@ -0,0 +1 @@ +Beacon \ No newline at end of file diff --git a/docs-site/public/favicon.svg b/docs-site/public/favicon.svg index c076acb..aca69f4 100644 --- a/docs-site/public/favicon.svg +++ b/docs-site/public/favicon.svg @@ -1,15 +1,7 @@ - - - - - - - - - - - - - - - +Beacon + + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 7f4ae2a..63a5e61 100644 --- a/index.html +++ b/index.html @@ -3,8 +3,9 @@ - + + @@ -14,7 +15,7 @@ - + Beacon diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png index adf6ba0..f4100ce 100644 Binary files a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..aca69f4 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,7 @@ +Beacon + + + + + + \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json index 34a6641..7cb225b 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -5,8 +5,8 @@ "start_url": "/", "display": "standalone", "orientation": "landscape", - "theme_color": "#faf9f6", - "background_color": "#faf9f6", + "theme_color": "#101d3c", + "background_color": "#101d3c", "icons": [ { "src": "/src/assets/beacon-favicon-32.png", @@ -40,10 +40,10 @@ "type": "image/png" }, { - "src": "/src/assets/beacon-icon-512.png", + "src": "/src/assets/beacon-app-icon-512-maskable.png", "sizes": "512x512", "type": "image/png", - "purpose": "any" + "purpose": "maskable" }, { "src": "/src/assets/beacon-app-icon.svg", diff --git a/scripts/build-icons.py b/scripts/build-icons.py new file mode 100644 index 0000000..d418848 --- /dev/null +++ b/scripts/build-icons.py @@ -0,0 +1,155 @@ +import cairosvg, io, os, json, shutil +from PIL import Image, ImageDraw +from fontTools.ttLib import TTFont +from fontTools.varLib import instancer +from fontTools.pens.svgPathPen import SVGPathPen +from fontTools.pens.transformPen import TransformPen +import sys; O=sys.argv[1] if len(sys.argv)>1 else 'branding/icon'; os.makedirs(O+'/svg',exist_ok=True) +NAVY_T,NAVY_B='#1d3160','#070c1a' +DEFS=''' + + + + + + + + + + + +''' +M='#13224a' # mullion / ironwork +def art(): + rail=''.join(f'' for x in range(388,637,31)) + mull=''.join(f'' for x in (458,512,566)) + tower=f'' + f''' + + + + + +{mull} + + + + + + + + +{rail} + + +''' + return f''' + + + + + + +{tower}''' +def svg(body,vb="0 0 1024 1024",label="Beacon"): + return f'{label}{body}' +BG='' +def w(name,s): open(f'{O}/svg/{name}','w').write(s); return f'{O}/svg/{name}' +master=w('app-icon-master.svg',svg(DEFS+BG+art())) +w('app-icon-maskable.svg',svg(DEFS+BG+f'{art()}')) +w('app-icon-adaptive-foreground.svg',svg(DEFS+f'{art()}')) +w('app-icon-adaptive-background.svg',svg(DEFS+BG)) +# small mark (64 grid) +def small(c=None): + t,d,a,f=('#0f1a33','#3a5eae','#f7a92a','#f7a92a') if not c else (None,c,c,c) + tile=f'' if t else '' + return tile+f''' + + + + + +''' +w('favicon.svg',svg(small(),"0 0 64 64")) +w('icon-mono.svg',svg(small('currentColor'),"0 0 64 64")) +# wordmark via Inter paths +f=TTFont(''+os.environ['INTER_TTF']+'') +f=instancer.instantiateVariableFont(f,{'wght':650,'opsz':32}) +gs=f.getGlyphSet(); cmap=f.getBestCmap(); upm=f['head'].unitsPerEm +def textpath(s,size,x0,base,track=0): + pen=SVGPathPen(gs); x=0; sc=size/upm + for ch in s: + g=cmap.get(ord(ch),cmap[32]); tp=TransformPen(pen,(sc,0,0,-sc,x0+x*sc,base)); gs[g].draw(tp); x+=f['hmtx'][g][0]+track + return pen.getCommands(), x*sc +wm,wl=textpath('Beacon',64,0,64) +w('wordmark.svg',svg(f'',f"0 0 {wl:.0f} 80")) +# HA logo 250x100 lockup (horizontal): small tile icon + wordmark +lk,ll=textpath('Beacon',40,100,64) +w('horizontal-lockup.svg',svg(f'{DEFS}{BG}{art()}',"0 0 250 100")) +# OG +t1,_=textpath('Beacon',120,600,300); t2,_=textpath('Your family command center',40,604,370); t3,_=textpath('Calendar · chores · meals · photos',28,606,430) +w('og.svg',svg(DEFS.replace('','')+''+f'{BG}{art()}',"0 0 1200 630")) +# ---------- raster exports ---------- +def png(src,size,out,h=None): + os.makedirs(os.path.dirname(out),exist_ok=True) + cairosvg.svg2png(url=src,write_to=out,output_width=size,output_height=h or size) +def squircle(src,size,out,r=.2237,circle=False): + os.makedirs(os.path.dirname(out),exist_ok=True); im=Image.open(io.BytesIO(cairosvg.svg2png(url=src,output_width=size*4))).convert('RGBA') + m=Image.new('L',im.size,0);dr=ImageDraw.Draw(m) + (dr.ellipse if circle else (lambda b,fill:dr.rounded_rectangle(b,radius=int(size*4*r),fill=fill)))([0,0,size*4-1,size*4-1],fill=255) + im.putalpha(m);im.resize((size,size),Image.LANCZOS).save(out) +S=O+'/svg/';E=O+'/export/' +MAP={} +def add(local,*repo): MAP[local]=list(repo) +for n in [192,256,512]: + squircle(S+'app-icon-master.svg',n,E+f'web/beacon-app-icon-{n}.png'); add(f'export/web/beacon-app-icon-{n}.png',f'src/assets/beacon-app-icon-{n}.png',f'beacon/src/assets/beacon-app-icon-{n}.png') + squircle(S+'app-icon-master.svg',n,E+f'web/beacon-icon-{n}.png'); add(f'export/web/beacon-icon-{n}.png',f'src/assets/beacon-icon-{n}.png',f'beacon/src/assets/beacon-icon-{n}.png') if n!=192 else None +for n in [16,32,64]: + png(S+'favicon.svg',n,E+f'web/beacon-app-icon-{n}.png'); add(f'export/web/beacon-app-icon-{n}.png',f'src/assets/beacon-app-icon-{n}.png',f'beacon/src/assets/beacon-app-icon-{n}.png') +png(S+'favicon.svg',64,E+'web/beacon-icon-64.png'); add('export/web/beacon-icon-64.png','src/assets/beacon-icon-64.png','beacon/src/assets/beacon-icon-64.png') +png(S+'favicon.svg',32,E+'web/beacon-favicon-32.png'); add('export/web/beacon-favicon-32.png','src/assets/beacon-favicon-32.png','beacon/src/assets/beacon-favicon-32.png') +for n in [192,512]: + png(S+'app-icon-maskable.svg',n,E+f'web/beacon-app-icon-{n}-maskable.png') +add('export/web/beacon-app-icon-192-maskable.png','src/assets/beacon-app-icon-192-maskable.png','beacon/src/assets/beacon-app-icon-192-maskable.png') +add('export/web/beacon-app-icon-512-maskable.png','NEW: src/assets/beacon-app-icon-512-maskable.png (+beacon/ copy; add to manifest.json purpose:maskable)') +add('svg/app-icon-master.svg','src/assets/beacon-app-icon.svg','beacon/src/assets/beacon-app-icon.svg') +add('svg/app-icon-maskable.svg','src/assets/beacon-app-icon-maskable.svg','beacon/src/assets/beacon-app-icon-maskable.svg') +add('svg/favicon.svg','docs-site/public/favicon.svg','NEW: public/favicon.svg (point index.html here instead of the full app icon)') +add('svg/wordmark.svg','src/assets/beacon-wordmark.svg','beacon/src/assets/beacon-wordmark.svg') +add('svg/horizontal-lockup.svg','src/assets/beacon-logo-horizontal.svg','beacon/src/assets/beacon-logo-horizontal.svg') +add('svg/og.svg','src/assets/beacon-og.svg','beacon/src/assets/beacon-og.svg') +png(S+'og.svg',1200,E+'web/beacon-og.png',630); add('export/web/beacon-og.png','src/assets/beacon-og.png','beacon/src/assets/beacon-og.png') +png(S+'horizontal-lockup.svg',1000,E+'web/beacon-logo-horizontal.png',400); add('export/web/beacon-logo-horizontal.png','src/assets/beacon-logo-horizontal.png','beacon/src/assets/beacon-logo-horizontal.png') +# HA +squircle(S+'app-icon-master.svg',128,E+'ha/icon.png'); add('export/ha/icon.png','beacon/icon.png') +png(S+'horizontal-lockup.svg',250,E+'ha/logo.png',100); add('export/ha/logo.png','beacon/logo.png') +# Android +for d,n in dict(mdpi=48,hdpi=72,xhdpi=96,xxhdpi=144,xxxhdpi=192).items(): + b=f'android/app/src/main/res/mipmap-{d}/' + squircle(S+'app-icon-master.svg',n,E+b+'ic_launcher.png',r=.18); add('export/'+b+'ic_launcher.png',b+'ic_launcher.png') + squircle(S+'app-icon-master.svg',n,E+b+'ic_launcher_round.png',circle=True); add('export/'+b+'ic_launcher_round.png',b+'ic_launcher_round.png') + png(S+'app-icon-adaptive-foreground.svg',int(n*2.25),E+b+'ic_launcher_foreground.png'); add('export/'+b+'ic_launcher_foreground.png',b+'ic_launcher_foreground.png') +png(S+'app-icon-adaptive-background.svg',432,E+'android/ic_launcher_background.png'); add('export/android/ic_launcher_background.png','NEW: android/app/src/main/res/drawable/ic_launcher_background.png (or keep values/ic_launcher_background.xml color #101d3c; check mipmap-anydpi-v26/ic_launcher.xml)') +# iOS (opaque, no alpha) +png(S+'app-icon-master.svg',1024,E+'ios/AppIcon-512@2x.png') +Image.open(E+'ios/AppIcon-512@2x.png').convert('RGB').save(E+'ios/AppIcon-512@2x.png') +add('export/ios/AppIcon-512@2x.png','ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png') +json.dump(MAP,open(O+'/manifest.json','w'),indent=1) +# Copy files to repo paths per manifest +print("\nCopying files to repository paths...") +for src_path, repo_paths in MAP.items(): + src_file = os.path.join(O, src_path) if not src_path.startswith(O) else src_path + if not os.path.exists(src_file): + src_file = src_path + if not os.path.exists(src_file): + print(f"WARNING: Source file not found: {src_file}") + continue + for repo_path in repo_paths: + if repo_path.startswith('NEW:'): + print(f" NEW: {repo_path[5:].strip()} (needs review)") + dest = repo_path.split('(')[0].replace('NEW:', '').strip() + else: + dest = repo_path + os.makedirs(os.path.dirname(dest), exist_ok=True) + shutil.copy2(src_file, dest) + print(f" {src_file} -> {dest}") +print("\nIcon build complete! Generated files in", O) diff --git a/src/assets/beacon-app-icon-16.png b/src/assets/beacon-app-icon-16.png index 1f39bcf..15218ce 100644 Binary files a/src/assets/beacon-app-icon-16.png and b/src/assets/beacon-app-icon-16.png differ diff --git a/src/assets/beacon-app-icon-192-maskable.png b/src/assets/beacon-app-icon-192-maskable.png index c612586..3858902 100644 Binary files a/src/assets/beacon-app-icon-192-maskable.png and b/src/assets/beacon-app-icon-192-maskable.png differ diff --git a/src/assets/beacon-app-icon-192.png b/src/assets/beacon-app-icon-192.png index 8e6b6d0..1b51442 100644 Binary files a/src/assets/beacon-app-icon-192.png and b/src/assets/beacon-app-icon-192.png differ diff --git a/src/assets/beacon-app-icon-256.png b/src/assets/beacon-app-icon-256.png index 172a080..7721e19 100644 Binary files a/src/assets/beacon-app-icon-256.png and b/src/assets/beacon-app-icon-256.png differ diff --git a/src/assets/beacon-app-icon-32.png b/src/assets/beacon-app-icon-32.png index 692d123..06ff1de 100644 Binary files a/src/assets/beacon-app-icon-32.png and b/src/assets/beacon-app-icon-32.png differ diff --git a/src/assets/beacon-app-icon-512-maskable.png b/src/assets/beacon-app-icon-512-maskable.png new file mode 100644 index 0000000..4b9a180 Binary files /dev/null and b/src/assets/beacon-app-icon-512-maskable.png differ diff --git a/src/assets/beacon-app-icon-512.png b/src/assets/beacon-app-icon-512.png index 03ff972..5aa62a4 100644 Binary files a/src/assets/beacon-app-icon-512.png and b/src/assets/beacon-app-icon-512.png differ diff --git a/src/assets/beacon-app-icon-64.png b/src/assets/beacon-app-icon-64.png index 0a5f4e1..8f065ca 100644 Binary files a/src/assets/beacon-app-icon-64.png and b/src/assets/beacon-app-icon-64.png differ diff --git a/src/assets/beacon-app-icon-maskable.svg b/src/assets/beacon-app-icon-maskable.svg index b0fc363..403ee27 100644 --- a/src/assets/beacon-app-icon-maskable.svg +++ b/src/assets/beacon-app-icon-maskable.svg @@ -1,12 +1,38 @@ - - - - - - - - - - - - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/beacon-app-icon.svg b/src/assets/beacon-app-icon.svg index 258b149..b5e5355 100644 --- a/src/assets/beacon-app-icon.svg +++ b/src/assets/beacon-app-icon.svg @@ -1,14 +1,38 @@ - - - - - - - - - - - - - - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/beacon-favicon-32.png b/src/assets/beacon-favicon-32.png index 692d123..06ff1de 100644 Binary files a/src/assets/beacon-favicon-32.png and b/src/assets/beacon-favicon-32.png differ diff --git a/src/assets/beacon-icon-256.png b/src/assets/beacon-icon-256.png index 172a080..7721e19 100644 Binary files a/src/assets/beacon-icon-256.png and b/src/assets/beacon-icon-256.png differ diff --git a/src/assets/beacon-icon-512.png b/src/assets/beacon-icon-512.png index 03ff972..5aa62a4 100644 Binary files a/src/assets/beacon-icon-512.png and b/src/assets/beacon-icon-512.png differ diff --git a/src/assets/beacon-icon-64.png b/src/assets/beacon-icon-64.png index 0a5f4e1..8f065ca 100644 Binary files a/src/assets/beacon-icon-64.png and b/src/assets/beacon-icon-64.png differ diff --git a/src/assets/beacon-logo-horizontal.png b/src/assets/beacon-logo-horizontal.png index c34f910..721f8dc 100644 Binary files a/src/assets/beacon-logo-horizontal.png and b/src/assets/beacon-logo-horizontal.png differ diff --git a/src/assets/beacon-logo-horizontal.svg b/src/assets/beacon-logo-horizontal.svg index 6f5a22c..dd277a4 100644 --- a/src/assets/beacon-logo-horizontal.svg +++ b/src/assets/beacon-logo-horizontal.svg @@ -1,24 +1,38 @@ - - - - - - - - - - - - Beacon - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/beacon-logo-main.png b/src/assets/beacon-logo-main.png index abfc8a7..075d5d7 100644 Binary files a/src/assets/beacon-logo-main.png and b/src/assets/beacon-logo-main.png differ diff --git a/src/assets/beacon-og.png b/src/assets/beacon-og.png index 58f6613..5a64326 100644 Binary files a/src/assets/beacon-og.png and b/src/assets/beacon-og.png differ diff --git a/src/assets/beacon-og.svg b/src/assets/beacon-og.svg index d631d68..2ad08e3 100644 --- a/src/assets/beacon-og.svg +++ b/src/assets/beacon-og.svg @@ -1,40 +1,38 @@ - - - - - - - - - - - - - - - - - - - - Beacon - - - Your family's daily signal - +Beacon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/beacon-wordmark.svg b/src/assets/beacon-wordmark.svg index cdbf4f4..4be0d98 100644 --- a/src/assets/beacon-wordmark.svg +++ b/src/assets/beacon-wordmark.svg @@ -1,12 +1 @@ - - - Beacon - - - - +Beacon \ No newline at end of file diff --git a/src/styles/tokens.css b/src/styles/tokens.css index a64e90b..3fd9609 100644 --- a/src/styles/tokens.css +++ b/src/styles/tokens.css @@ -16,7 +16,7 @@ --color-paper: #f8fafc; /* Brand + primary functional accent */ - --color-brand: #f59e0b; + --color-brand: #f7a832; --color-accent: #3b82f6; /* Category colors (4) — used for calendar/family-member color coding */ @@ -27,7 +27,7 @@ /* Semantic state colors — deliberately distinct from brand/category hues */ --color-success: #22c55e; - --color-warning: #d97706; /* NOT #f59e0b — that's brand gold; warning needs + --color-warning: #d97706; /* NOT #f7a832 — that's brand gold; warning needs its own hue so a warning toast is never visually identical to the Beacon brand mark */ --color-error: #ef4444;