Initial commit
This commit is contained in:
216
scripts/update-icons.sh
Normal file
216
scripts/update-icons.sh
Normal file
@@ -0,0 +1,216 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Complete Icon Update Script
|
||||
# Updates both Liquid Glass icon bundle AND all platform fallback icons from exports
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
EXPORTS_DIR="tauri/assets/voicebox_exports"
|
||||
ICON_BUNDLE="tauri/assets/voicebox.icon"
|
||||
ASSETS_DIR="$ICON_BUNDLE/Assets"
|
||||
ICONS_DIR="tauri/src-tauri/icons"
|
||||
LANDING_LOGO="landing/public/voicebox-logo.png"
|
||||
LANDING_PUBLIC="landing/public"
|
||||
SOURCE_ICON="$EXPORTS_DIR/voicebox-iOS-Dark-1024x1024@1x.png"
|
||||
|
||||
echo "🎨 Updating all Voicebox icons from exports..."
|
||||
echo ""
|
||||
|
||||
# Check if source exists
|
||||
if [ ! -f "$SOURCE_ICON" ]; then
|
||||
echo "Error: Source icon not found at $SOURCE_ICON"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# PART 1: Compile Liquid Glass Icon Bundle
|
||||
# ============================================
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Part 1: Compiling Liquid Glass Icon Bundle"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
echo "Compiling voicebox.icon with actool..."
|
||||
# Remove old generated icons to force rebuild
|
||||
rm -rf tauri/src-tauri/gen/*.icns tauri/src-tauri/gen/Assets.car 2>/dev/null
|
||||
|
||||
cd tauri/src-tauri
|
||||
cargo build 2>/dev/null || echo " ⚠ Cargo build had warnings (this is normal)"
|
||||
cd ../..
|
||||
|
||||
if [ -f "tauri/src-tauri/gen/voicebox.icns" ]; then
|
||||
echo " ✓ voicebox.icns generated"
|
||||
else
|
||||
echo " ⚠ Warning: voicebox.icns not generated (will use fallback)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ============================================
|
||||
# PART 2: Generate Platform Fallback Icons
|
||||
# ============================================
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🖼️ Part 2: Generating Platform Fallback Icons"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
mkdir -p "$ICONS_DIR"
|
||||
|
||||
# macOS & Desktop Icons
|
||||
echo "Generating macOS/Desktop icons..."
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out "$ICONS_DIR/32x32.png" 2>/dev/null
|
||||
sips -s format png -z 64 64 "$SOURCE_ICON" --out "$ICONS_DIR/64x64.png" 2>/dev/null
|
||||
sips -s format png -z 128 128 "$SOURCE_ICON" --out "$ICONS_DIR/128x128.png" 2>/dev/null
|
||||
sips -s format png -z 256 256 "$SOURCE_ICON" --out "$ICONS_DIR/128x128@2x.png" 2>/dev/null
|
||||
sips -s format png -z 512 512 "$SOURCE_ICON" --out "$ICONS_DIR/icon.png" 2>/dev/null
|
||||
|
||||
# Copy Liquid Glass compiled ICNS or generate fallback
|
||||
echo "Copying icon.icns..."
|
||||
if [ -f "tauri/src-tauri/gen/voicebox.icns" ]; then
|
||||
cp tauri/src-tauri/gen/voicebox.icns "$ICONS_DIR/icon.icns"
|
||||
echo " ✓ Copied Liquid Glass compiled icon.icns"
|
||||
else
|
||||
echo " ⚠ Liquid Glass icon not found, generating fallback icon.icns..."
|
||||
mkdir -p /tmp/voicebox-iconset.iconset
|
||||
sips -s format png -z 16 16 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_16x16.png 2>/dev/null
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_16x16@2x.png 2>/dev/null
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_32x32.png 2>/dev/null
|
||||
sips -s format png -z 64 64 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_32x32@2x.png 2>/dev/null
|
||||
sips -s format png -z 128 128 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_128x128.png 2>/dev/null
|
||||
sips -s format png -z 256 256 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_128x128@2x.png 2>/dev/null
|
||||
sips -s format png -z 256 256 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_256x256.png 2>/dev/null
|
||||
sips -s format png -z 512 512 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_256x256@2x.png 2>/dev/null
|
||||
sips -s format png -z 512 512 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_512x512.png 2>/dev/null
|
||||
sips -s format png -z 1024 1024 "$SOURCE_ICON" --out /tmp/voicebox-iconset.iconset/icon_512x512@2x.png 2>/dev/null
|
||||
iconutil -c icns /tmp/voicebox-iconset.iconset -o "$ICONS_DIR/icon.icns"
|
||||
rm -rf /tmp/voicebox-iconset.iconset
|
||||
echo " ✓ Generated fallback icon.icns"
|
||||
fi
|
||||
|
||||
# Windows Square Logos
|
||||
echo "Generating Windows icons..."
|
||||
for size in 30 44 71 89 107 142 150 284 310; do
|
||||
sips -s format png -z $size $size "$SOURCE_ICON" --out "$ICONS_DIR/Square${size}x${size}Logo.png" 2>/dev/null
|
||||
done
|
||||
sips -s format png -z 50 50 "$SOURCE_ICON" --out "$ICONS_DIR/StoreLogo.png" 2>/dev/null
|
||||
|
||||
# Windows icon.ico (multi-size ICO file)
|
||||
echo "Generating Windows icon.ico..."
|
||||
if command -v convert &> /dev/null; then
|
||||
# Create temporary PNG files at different sizes for ICO
|
||||
# Windows typically uses: 16x16, 32x32, 48x48, 256x256
|
||||
sips -s format png -z 16 16 "$SOURCE_ICON" --out /tmp/icon-16.png 2>/dev/null
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out /tmp/icon-32.png 2>/dev/null
|
||||
sips -s format png -z 48 48 "$SOURCE_ICON" --out /tmp/icon-48.png 2>/dev/null
|
||||
sips -s format png -z 256 256 "$SOURCE_ICON" --out /tmp/icon-256.png 2>/dev/null
|
||||
# Combine into proper multi-size ICO file
|
||||
convert /tmp/icon-16.png /tmp/icon-32.png /tmp/icon-48.png /tmp/icon-256.png "$ICONS_DIR/icon.ico" 2>/dev/null
|
||||
rm -f /tmp/icon-16.png /tmp/icon-32.png /tmp/icon-48.png /tmp/icon-256.png 2>/dev/null
|
||||
echo " ✓ Generated Windows icon.ico"
|
||||
else
|
||||
# Fallback: use sips to create a basic ICO (single size)
|
||||
echo " ⚠ ImageMagick not found - generating basic icon.ico (single size)"
|
||||
sips -s format ico -z 256 256 "$SOURCE_ICON" --out "$ICONS_DIR/icon.ico" 2>/dev/null || echo " ⚠ Failed to generate icon.ico (sips may not support ICO format)"
|
||||
fi
|
||||
|
||||
# iOS Icons
|
||||
echo "Generating iOS icons..."
|
||||
mkdir -p "$ICONS_DIR/ios"
|
||||
|
||||
declare -A ios_sizes=(
|
||||
["AppIcon-20x20@1x.png"]="20"
|
||||
["AppIcon-20x20@2x.png"]="40"
|
||||
["AppIcon-20x20@2x-1.png"]="40"
|
||||
["AppIcon-20x20@3x.png"]="60"
|
||||
["AppIcon-29x29@1x.png"]="29"
|
||||
["AppIcon-29x29@2x.png"]="58"
|
||||
["AppIcon-29x29@2x-1.png"]="58"
|
||||
["AppIcon-29x29@3x.png"]="87"
|
||||
["AppIcon-40x40@1x.png"]="40"
|
||||
["AppIcon-40x40@2x.png"]="80"
|
||||
["AppIcon-40x40@2x-1.png"]="80"
|
||||
["AppIcon-40x40@3x.png"]="120"
|
||||
["AppIcon-60x60@2x.png"]="120"
|
||||
["AppIcon-60x60@3x.png"]="180"
|
||||
["AppIcon-76x76@1x.png"]="76"
|
||||
["AppIcon-76x76@2x.png"]="152"
|
||||
["AppIcon-83.5x83.5@2x.png"]="167"
|
||||
["AppIcon-512@2x.png"]="1024"
|
||||
)
|
||||
|
||||
for filename in "${!ios_sizes[@]}"; do
|
||||
size="${ios_sizes[$filename]}"
|
||||
sips -s format png -z $size $size "$SOURCE_ICON" --out "$ICONS_DIR/ios/$filename" 2>/dev/null
|
||||
done
|
||||
|
||||
# Android Icons
|
||||
echo "Generating Android icons..."
|
||||
mkdir -p "$ICONS_DIR/android/mipmap-mdpi"
|
||||
mkdir -p "$ICONS_DIR/android/mipmap-hdpi"
|
||||
mkdir -p "$ICONS_DIR/android/mipmap-xhdpi"
|
||||
mkdir -p "$ICONS_DIR/android/mipmap-xxhdpi"
|
||||
mkdir -p "$ICONS_DIR/android/mipmap-xxxhdpi"
|
||||
|
||||
sips -s format png -z 48 48 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-mdpi/ic_launcher.png" 2>/dev/null
|
||||
sips -s format png -z 48 48 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-mdpi/ic_launcher_round.png" 2>/dev/null
|
||||
sips -s format png -z 48 48 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-mdpi/ic_launcher_foreground.png" 2>/dev/null
|
||||
|
||||
sips -s format png -z 72 72 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-hdpi/ic_launcher.png" 2>/dev/null
|
||||
sips -s format png -z 72 72 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-hdpi/ic_launcher_round.png" 2>/dev/null
|
||||
sips -s format png -z 72 72 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-hdpi/ic_launcher_foreground.png" 2>/dev/null
|
||||
|
||||
sips -s format png -z 96 96 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xhdpi/ic_launcher.png" 2>/dev/null
|
||||
sips -s format png -z 96 96 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xhdpi/ic_launcher_round.png" 2>/dev/null
|
||||
sips -s format png -z 96 96 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xhdpi/ic_launcher_foreground.png" 2>/dev/null
|
||||
|
||||
sips -s format png -z 144 144 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxhdpi/ic_launcher.png" 2>/dev/null
|
||||
sips -s format png -z 144 144 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxhdpi/ic_launcher_round.png" 2>/dev/null
|
||||
sips -s format png -z 144 144 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxhdpi/ic_launcher_foreground.png" 2>/dev/null
|
||||
|
||||
sips -s format png -z 192 192 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxxhdpi/ic_launcher.png" 2>/dev/null
|
||||
sips -s format png -z 192 192 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxxhdpi/ic_launcher_round.png" 2>/dev/null
|
||||
sips -s format png -z 192 192 "$SOURCE_ICON" --out "$ICONS_DIR/android/mipmap-xxxhdpi/ic_launcher_foreground.png" 2>/dev/null
|
||||
|
||||
# Landing Page Logo & Favicon
|
||||
echo "Generating landing page logo..."
|
||||
mkdir -p "$LANDING_PUBLIC"
|
||||
sips -s format png -z 1024 1024 "$SOURCE_ICON" --out "$LANDING_LOGO" 2>/dev/null
|
||||
|
||||
echo "Generating landing page favicon..."
|
||||
# Generate favicon.png (32x32 is standard for favicons)
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out "$LANDING_PUBLIC/favicon.png" 2>/dev/null
|
||||
|
||||
# Generate proper multi-size favicon.ico using ImageMagick if available
|
||||
if command -v convert &> /dev/null; then
|
||||
# Create temporary PNG files at different sizes for ICO
|
||||
sips -s format png -z 16 16 "$SOURCE_ICON" --out /tmp/favicon-16.png 2>/dev/null
|
||||
sips -s format png -z 32 32 "$SOURCE_ICON" --out /tmp/favicon-32.png 2>/dev/null
|
||||
# Combine into proper multi-size ICO file
|
||||
convert /tmp/favicon-16.png /tmp/favicon-32.png "$LANDING_PUBLIC/favicon.ico" 2>/dev/null
|
||||
rm -f /tmp/favicon-16.png /tmp/favicon-32.png 2>/dev/null
|
||||
echo " ✓ Generated proper multi-size favicon.ico"
|
||||
else
|
||||
# Fallback: skip ICO if ImageMagick not available (PNG will be used)
|
||||
echo " ⚠ ImageMagick not found - skipping favicon.ico (using favicon.png instead)"
|
||||
fi
|
||||
|
||||
# Also generate apple-touch-icon (180x180 for iOS)
|
||||
sips -s format png -z 180 180 "$SOURCE_ICON" --out "$LANDING_PUBLIC/apple-touch-icon.png" 2>/dev/null
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✅ All icons updated successfully!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "Updated:"
|
||||
echo " ✓ Liquid Glass icon bundle with all appearance variants"
|
||||
echo " ✓ macOS/Desktop fallback icons"
|
||||
echo " ✓ Windows Square logos"
|
||||
echo " ✓ Windows icon.ico (multi-size)"
|
||||
echo " ✓ iOS AppIcons (18 sizes)"
|
||||
echo " ✓ Android mipmap icons (5 densities)"
|
||||
echo " ✓ Landing page logo"
|
||||
echo " ✓ Landing page favicon"
|
||||
echo ""
|
||||
echo "Next: Rebuild the app with 'cd tauri && bun run tauri build'"
|
||||
Reference in New Issue
Block a user