CasinoGames/BRANDING_IMPLEMENTATION_GUIDE.md

695 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Branding Implementation Guide
A step-by-step guide to implementing the CasinoKit branding system (app icon and launch screen) in your casino game app.
## Table of Contents
1. [Overview](#overview)
2. [Prerequisites](#prerequisites)
3. [Step 1: Copy Branding Files](#step-1-copy-branding-files)
4. [Step 2: Create BrandingConfig.swift](#step-2-create-brandingconfigswift)
5. [Step 3: Add Launch Screen to App Entry Point](#step-3-add-launch-screen-to-app-entry-point)
6. [Step 4: Add Branding Tools to Settings (Optional)](#step-4-add-branding-tools-to-settings-optional)
7. [Step 5: Generate Your App Icon](#step-5-generate-your-app-icon)
8. [Step 6: Add Icon to Xcode Assets](#step-6-add-icon-to-xcode-assets)
9. [Complete Example](#complete-example)
10. [Troubleshooting](#troubleshooting)
---
## Overview
The CasinoKit branding system provides:
- **AppIconView**: A customizable icon design with gradient backgrounds, SF Symbols, and text
- **LaunchScreenView**: An animated launch screen that matches your icon
- **AppLaunchView**: A wrapper that seamlessly transitions from launch to app
- **IconGeneratorView**: A development tool to generate and export icon images
- **BrandingPreviewView**: A preview tool to see icons and launch screens side-by-side
**Key Files in CasinoKit:**
- `AppIconView.swift` - Icon design view
- `LaunchScreenView.swift` - Launch screen design view
- `AppLaunchView.swift` - Launch wrapper with animation
- `IconGeneratorView.swift` - Icon export tool
- `IconRenderer.swift` - Rendering utilities
- `BrandingPreviewView.swift` - Preview tool
---
## Prerequisites
### If Using CasinoKit Package
Your app must have `CasinoKit` as a dependency. No additional files needed—everything is available through `import CasinoKit`.
### If You Copied the Branding Folder
If you manually copied the branding views from CasinoKit into your app, ensure you have:
1. All 6 files from `CasinoKit/Sources/CasinoKit/Views/Branding/`:
- `AppIconView.swift`
- `LaunchScreenView.swift`
- `AppLaunchView.swift`
- `IconGeneratorView.swift`
- `IconRenderer.swift`
- `BrandingPreviewView.swift`
2. Dependencies these files require:
- `DiamondPatternView.swift` (used by `AppIconView`)
- `DebugSection.swift` (if using debug tools)
---
## Step 1: Copy Branding Files
**Skip this step if using CasinoKit as a package dependency.**
If copying manually, create a `Theme/` folder in your app target and copy all branding files:
```
YourApp/
YourApp/
Theme/
AppIconView.swift
LaunchScreenView.swift
AppLaunchView.swift
IconGeneratorView.swift
IconRenderer.swift
BrandingPreviewView.swift
BrandingConfig.swift ← You'll create this in Step 2
```
**Important:** Ensure you also have `DiamondPatternView.swift` if `AppIconView` references it, or copy that pattern code inline.
---
## Step 2: Create BrandingConfig.swift
Create a new Swift file in your app's `Theme/` folder called `BrandingConfig.swift`. This file defines your game's branding.
### Template
```swift
//
// BrandingConfig.swift
// YourGame
//
// App-specific branding configurations for icons and launch screens.
//
import SwiftUI
import CasinoKit // Remove this line if not using CasinoKit package
// MARK: - App Icon Configuration
extension AppIconConfig {
/// YourGame app icon configuration.
static let yourGame = AppIconConfig(
title: "YOUR GAME", // App name (uppercase looks best)
subtitle: "21", // Optional: number or short text below icon
iconSymbol: "suit.club.fill", // SF Symbol for the main icon
primaryColor: Color(red: 0.1, green: 0.2, blue: 0.35), // Top gradient color
secondaryColor: Color(red: 0.05, green: 0.12, blue: 0.25), // Bottom gradient color
accentColor: .yellow // Color for icon and text
)
}
// MARK: - Launch Screen Configuration
extension LaunchScreenConfig {
/// YourGame launch screen configuration.
static let yourGame = LaunchScreenConfig(
title: "YOUR GAME", // App name (uppercase looks best)
subtitle: "21", // Optional: appears below icon symbols
tagline: "Beat the Dealer", // Optional: tagline at bottom
iconSymbols: [ // 1-3 SF Symbols for the launch logo
"suit.club.fill",
"suit.diamond.fill"
],
primaryColor: Color(red: 0.1, green: 0.2, blue: 0.35), // Top gradient color
secondaryColor: Color(red: 0.05, green: 0.12, blue: 0.25), // Bottom gradient color
accentColor: .yellow // Color for text and accents
)
}
```
### Customization Tips
**Title:**
- Use uppercase for a casino aesthetic
- Keep it concise (6-9 characters max)
- The view automatically scales longer titles
**Subtitle:**
- Optional, best for short numbers or text ("21", "DELUXE", etc.)
- Appears larger and more prominent than the title
**Icon Symbol:**
- Use SF Symbols names (e.g., `"suit.spade.fill"`, `"diamond.fill"`)
- Browse available symbols in Xcode: Editor → Insert SF Symbol
- Card suits work great: `suit.spade.fill`, `suit.heart.fill`, `suit.diamond.fill`, `suit.club.fill`
**Colors:**
- Use `Color(red:green:blue:)` with values 0.0-1.0
- Primary color = top of gradient
- Secondary color = bottom of gradient (usually darker)
- Accent color = icon symbol and text highlights
**Launch Screen Icon Symbols:**
- Use 1-3 symbols for visual variety
- Hearts and diamonds automatically render red
- Spades and clubs render white
### Real Examples
**Blackjack:**
```swift
extension AppIconConfig {
static let blackjack = AppIconConfig(
title: "BLACKJACK",
subtitle: "21",
iconSymbol: "suit.club.fill",
primaryColor: Color(red: 0.05, green: 0.35, blue: 0.15), // Green felt
secondaryColor: Color(red: 0.03, green: 0.2, blue: 0.1),
accentColor: .yellow
)
}
extension LaunchScreenConfig {
static let blackjack = LaunchScreenConfig(
title: "BLACKJACK",
subtitle: "21",
tagline: "Beat the Dealer",
iconSymbols: ["suit.club.fill", "suit.diamond.fill"],
primaryColor: Color(red: 0.05, green: 0.35, blue: 0.15),
secondaryColor: Color(red: 0.03, green: 0.2, blue: 0.1),
accentColor: .yellow
)
}
```
**Baccarat:**
```swift
extension AppIconConfig {
static let baccarat = AppIconConfig(
title: "BACCARAT",
iconSymbol: "suit.spade.fill",
primaryColor: Color(red: 0.1, green: 0.2, blue: 0.35), // Blue elegant
secondaryColor: Color(red: 0.05, green: 0.12, blue: 0.25)
)
}
extension LaunchScreenConfig {
static let baccarat = LaunchScreenConfig(
title: "BACCARAT",
tagline: "The Classic Casino Card Game",
iconSymbols: ["suit.spade.fill", "suit.heart.fill"]
)
}
```
---
## Step 3: Add Launch Screen to App Entry Point
Update your `@main` App struct to wrap your content with `AppLaunchView`.
### Before
```swift
@main
struct YourGameApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
```
### After
```swift
import SwiftUI
import CasinoKit // If using the package
@main
struct YourGameApp: App {
var body: some Scene {
WindowGroup {
AppLaunchView(config: .yourGame) {
ContentView()
}
}
}
}
```
**What this does:**
- Shows an animated launch screen for ~2 seconds
- Fades smoothly into your main content
- Creates a polished, professional app opening experience
**Note:** Replace `.yourGame` with the static property name you defined in `BrandingConfig.swift` (e.g., `.blackjack`, `.poker`, `.roulette`).
---
## Step 4: Add Branding Tools to Settings (Optional)
Add debug tools to your settings view so you can easily generate and preview icons during development.
### If Using CasinoKit Package
Add this to your settings view inside a `#if DEBUG` block:
```swift
#if DEBUG
SheetSection(title: "DEBUG", icon: "ant.fill") {
BrandingDebugRows(
iconConfig: .yourGame,
launchConfig: .yourGame,
appName: "YourGame"
)
}
#endif
```
### Full Example in Settings
```swift
import SwiftUI
import CasinoKit
struct SettingsView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
SheetContainerView(
title: "Settings",
content: {
// ... your normal settings sections ...
// DEBUG section at the bottom
#if DEBUG
SheetSection(title: "DEBUG", icon: "ant.fill") {
BrandingDebugRows(
iconConfig: .yourGame,
launchConfig: .yourGame,
appName: "YourGame"
)
}
#endif
},
onCancel: nil,
onDone: {
dismiss()
}
)
}
}
```
**What this adds:**
- **Icon Generator** button: Generates and saves a 1024px PNG to the Files app
- **Branding Preview** button: Shows a live preview of your icon and launch screen
**Important:** This only appears in DEBUG builds and will automatically be excluded from App Store releases.
---
## Step 5: Generate Your App Icon
Now it's time to create your actual app icon image.
### Method 1: Using IconGeneratorView (Recommended)
1. **Build and run your app** (simulator or device)
2. **Open Settings** in your app
3. **Scroll to the DEBUG section** (only visible in DEBUG builds)
4. **Tap "Icon Generator"**
5. **Tap "Generate & Save Icon"**
6. **Wait for confirmation**: "✅ Icon saved to Documents folder!"
The icon is now saved as `AppIcon.png` (1024×1024) in your app's Documents folder.
### Method 2: Using Xcode Previews
1. Open `BrandingConfig.swift` in Xcode
2. Add a preview at the bottom:
```swift
#Preview("App Icon") {
AppIconView(config: .yourGame, size: 512)
.clipShape(.rect(cornerRadius: 512 * 0.22))
.padding()
.background(Color.gray)
}
```
3. Open the Canvas (Editor → Canvas)
4. Take a screenshot of the preview
5. Crop and scale to 1024×1024 in an image editor
### Method 3: Programmatic Export
Create a temporary view or function:
```swift
@MainActor
func exportIcon() {
let config = AppIconConfig.yourGame
let view = AppIconView(config: config, size: 1024)
let renderer = ImageRenderer(content: view)
renderer.scale = 1.0
if let image = renderer.uiImage,
let data = image.pngData() {
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appending(path: "AppIcon.png")
try? data.write(to: url)
print("Icon saved to: \(url.path)")
}
}
```
---
## Step 6: Add Icon to Xcode Assets
### Retrieve the Icon from Device/Simulator
**On Simulator:**
1. Open **Finder**
2. Go to: `~/Library/Developer/CoreSimulator/Devices/`
3. Find your simulator device folder
4. Navigate to: `data/Containers/Data/Application/[YourApp]/Documents/`
5. Copy `AppIcon.png` to your Mac desktop
**On Physical Device:**
1. Open the **Files** app on your device
2. Navigate to: **On My iPhone****YourGame**
3. Find `AppIcon.png`
4. **AirDrop** or **share** it to your Mac
**Alternative (Xcode):**
1. In Xcode, go to **Window****Devices and Simulators**
2. Select your device/simulator
3. Find your app in the Installed Apps list
4. Click the **⚙️ gear** icon → **Download Container**
5. Right-click the downloaded `.xcappdata` file → **Show Package Contents**
6. Navigate to `AppData/Documents/` and copy `AppIcon.png`
### Add to Xcode Assets
1. **Open your Xcode project**
2. **Navigate to** `Assets.xcassets` in the Project Navigator
3. **Click on AppIcon** (the app icon asset)
4. **Drag `AppIcon.png`** from Finder into the **1024×1024** slot (labeled "iOS App Store")
5. **Xcode automatically generates** all required sizes from this single image
**Important:** Modern iOS projects only need the 1024×1024 image. Xcode generates all other sizes automatically.
### Verify the Icon
1. **Build and run** your app
2. **Press the Home button** (or swipe up)
3. Check that your new icon appears on the home screen
4. If it doesn't update immediately, **delete the app** and reinstall
---
## Complete Example
Here's a full example for a Poker game:
### File: `Poker/Theme/BrandingConfig.swift`
```swift
//
// BrandingConfig.swift
// Poker
//
import SwiftUI
import CasinoKit
extension AppIconConfig {
static let poker = AppIconConfig(
title: "POKER",
iconSymbol: "suit.diamond.fill",
primaryColor: Color(red: 0.2, green: 0.05, blue: 0.1),
secondaryColor: Color(red: 0.1, green: 0.02, blue: 0.05),
accentColor: Color(red: 1.0, green: 0.85, blue: 0.3) // Gold
)
}
extension LaunchScreenConfig {
static let poker = LaunchScreenConfig(
title: "POKER",
tagline: "All In",
iconSymbols: ["suit.diamond.fill", "suit.heart.fill", "suit.club.fill"],
primaryColor: Color(red: 0.2, green: 0.05, blue: 0.1),
secondaryColor: Color(red: 0.1, green: 0.02, blue: 0.05),
accentColor: Color(red: 1.0, green: 0.85, blue: 0.3)
)
}
```
### File: `Poker/PokerApp.swift`
```swift
import SwiftUI
import CasinoKit
@main
struct PokerApp: App {
var body: some Scene {
WindowGroup {
AppLaunchView(config: .poker) {
ContentView()
}
}
}
}
```
### File: `Poker/Views/SettingsView.swift`
```swift
import SwiftUI
import CasinoKit
struct SettingsView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
SheetContainerView(
title: "Settings",
content: {
// Game settings sections...
SheetSection(title: "SOUND", icon: "speaker.wave.2.fill") {
// Sound settings...
}
#if DEBUG
SheetSection(title: "DEBUG", icon: "ant.fill") {
BrandingDebugRows(
iconConfig: .poker,
launchConfig: .poker,
appName: "Poker"
)
}
#endif
},
onDone: {
dismiss()
}
)
}
}
```
---
## Troubleshooting
### Issue: Can't find `AppIconView` or other branding types
**Solution:**
- If using CasinoKit package: Ensure `import CasinoKit` is at the top of your file
- If copying manually: Ensure all 6 branding files are in your app target
- Check that files are added to your target's "Compile Sources" in Build Phases
### Issue: Launch screen doesn't appear
**Solution:**
- Verify `AppLaunchView` wraps your content in the App struct
- Check that you're using the correct config name (e.g., `.poker` not `.example`)
- Ensure the config extension is defined in `BrandingConfig.swift`
### Issue: Icon looks cut off at the edges
**Explanation:** iOS applies a superellipse mask to all app icons. The branding system accounts for this, but if you see clipping:
**Solution:**
- Don't add rounded corners yourself—iOS does this automatically
- Ensure decorative borders are inset from edges
- The system is designed to work with iOS's mask; trust the 22% corner radius preview
### Issue: "Icon saved" message appears but can't find the file
**Solution:**
- Open the **Files** app on your device/simulator
- Navigate to: **Browse****On My iPhone/iPad****[Your App Name]**
- If folder doesn't exist, try granting Files access in Settings
**Alternative:** Use Xcode's Devices and Simulators window to download the app container (see Step 6).
### Issue: Icon doesn't update after adding to Assets
**Solution:**
1. **Clean build folder**: Product → Clean Build Folder (Cmd+Shift+K)
2. **Delete app** from device/simulator
3. **Rebuild and reinstall**
4. If still not working, check that the 1024×1024 slot is filled in Assets.xcassets
### Issue: `BrandingDebugRows` not showing in settings
**Solution:**
- Ensure you're running a DEBUG build (not Release)
- Wrap the section in `#if DEBUG ... #endif`
- Verify `import CasinoKit` if using the package
- Check that your settings view is inside a `NavigationStack` (required for navigation rows)
### Issue: Colors don't match between icon and launch screen
**Solution:**
- Ensure both configs use identical color values
- Copy-paste color definitions to avoid typos
- Consider extracting colors to a shared constant:
```swift
extension Color {
static let pokerPrimary = Color(red: 0.2, green: 0.05, blue: 0.1)
static let pokerSecondary = Color(red: 0.1, green: 0.02, blue: 0.05)
}
extension AppIconConfig {
static let poker = AppIconConfig(
title: "POKER",
iconSymbol: "suit.diamond.fill",
primaryColor: .pokerPrimary,
secondaryColor: .pokerSecondary
)
}
```
### Issue: Title text is too small or too large
**Solution:** The system automatically scales titles based on length:
- **6 characters or less**: Full size (100%)
- **7 characters**: 95% scale
- **8 characters**: 85% scale
- **9 characters**: 75% scale
- **10+ characters**: 65% scale
If your title is very long, consider:
- Using an abbreviation in the icon
- Using subtitle for additional text
- Manually adjusting the `titleSize` calculation in `AppIconView.swift`
---
## Additional Resources
### Color Palette Ideas
**Classic Casino:**
```swift
primaryColor: Color(red: 0.1, green: 0.2, blue: 0.35) // Deep blue
secondaryColor: Color(red: 0.05, green: 0.12, blue: 0.25)
accentColor: .yellow
```
**Luxury Gold:**
```swift
primaryColor: Color(red: 0.2, green: 0.15, blue: 0.05) // Deep gold
secondaryColor: Color(red: 0.1, green: 0.08, blue: 0.02)
accentColor: Color(red: 1.0, green: 0.85, blue: 0.3) // Bright gold
```
**Green Felt:**
```swift
primaryColor: Color(red: 0.05, green: 0.35, blue: 0.15) // Casino green
secondaryColor: Color(red: 0.03, green: 0.2, blue: 0.1)
accentColor: .yellow
```
**Elegant Red:**
```swift
primaryColor: Color(red: 0.3, green: 0.05, blue: 0.1) // Deep red
secondaryColor: Color(red: 0.15, green: 0.02, blue: 0.05)
accentColor: Color(red: 1.0, green: 0.85, blue: 0.3)
```
### SF Symbol Recommendations
**Card Suits:**
- `suit.spade.fill` - Classic, elegant
- `suit.heart.fill` - Warm, friendly
- `suit.diamond.fill` - Luxurious
- `suit.club.fill` - Traditional
**Other Casino Icons:**
- `diamond.fill` - Luxury, wealth
- `star.fill` - Premium, winning
- `crown.fill` - VIP, royalty
- `dollarsign.circle.fill` - Money, stakes
### Launch Screen Animation Timing
The default timing is:
- **Logo fade-in**: 0.6 seconds
- **Tagline fade-in**: 0.6 seconds (delayed by 0.3s)
- **Total display**: 2.0 seconds
- **Fade-out**: 0.5 seconds
To customize, modify `AppLaunchView.swift`:
```swift
.task {
try? await Task.sleep(for: .seconds(3.0)) // Change display duration
withAnimation(.easeOut(duration: 1.0)) { // Change fade-out duration
showLaunchScreen = false
}
}
```
---
## Summary Checklist
- [ ] Copy branding files from CasinoKit or ensure package dependency is set up
- [ ] Create `BrandingConfig.swift` with your game's configurations
- [ ] Add `AppLaunchView` wrapper to your App entry point
- [ ] (Optional) Add `BrandingDebugRows` to your settings view
- [ ] Build and run app in DEBUG mode
- [ ] Generate icon using Icon Generator tool
- [ ] Retrieve icon PNG from device/simulator
- [ ] Add 1024×1024 PNG to Assets.xcassets AppIcon slot
- [ ] Clean build and reinstall to verify icon appears
- [ ] Test launch screen animation on device
---
**Need Help?**
- Check the `BrandingPreviewView` to see your icon and launch screen side-by-side
- Use Xcode previews to iterate on colors and layout quickly
- Test on multiple device sizes to ensure text scales properly
- Remember: DEBUG tools are automatically excluded from Release builds
**Happy Branding! 🎰✨**