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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
-
+
\ 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 @@
+
\ 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''
+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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
+
\ 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;