diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..497788d
--- /dev/null
+++ b/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images": [
+ {
+ "size": "16x16",
+ "idiom": "mac",
+ "filename": "icon_16x16.png",
+ "scale": "1x"
+ },
+ {
+ "size": "16x16",
+ "idiom": "mac",
+ "filename": "icon_16x16-2x.png",
+ "scale": "2x"
+ },
+ {
+ "size": "32x32",
+ "idiom": "mac",
+ "filename": "icon_32x32.png",
+ "scale": "1x"
+ },
+ {
+ "size": "32x32",
+ "idiom": "mac",
+ "filename": "icon_32x32-2x.png",
+ "scale": "2x"
+ },
+ {
+ "size": "128x128",
+ "idiom": "mac",
+ "filename": "icon_128x128.png",
+ "scale": "1x"
+ },
+ {
+ "size": "128x128",
+ "idiom": "mac",
+ "filename": "icon_128x128-2x.png",
+ "scale": "2x"
+ },
+ {
+ "size": "256x256",
+ "idiom": "mac",
+ "filename": "icon_256x256.png",
+ "scale": "1x"
+ },
+ {
+ "size": "256x256",
+ "idiom": "mac",
+ "filename": "icon_256x256-2x.png",
+ "scale": "2x"
+ },
+ {
+ "size": "512x512",
+ "idiom": "mac",
+ "filename": "icon_512x512.png",
+ "scale": "1x"
+ },
+ {
+ "size": "512x512",
+ "idiom": "mac",
+ "filename": "icon_512x512-2x.png",
+ "scale": "2x"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128-2x.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128-2x.png
new file mode 100644
index 0000000..1c31682
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128-2x.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
new file mode 100644
index 0000000..7ecffea
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16-2x.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16-2x.png
new file mode 100644
index 0000000..ccf08dc
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16-2x.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
new file mode 100644
index 0000000..b643518
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256-2x.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256-2x.png
new file mode 100644
index 0000000..8d9e772
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256-2x.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
new file mode 100644
index 0000000..ba924ab
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32-2x.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32-2x.png
new file mode 100644
index 0000000..c2a0b6d
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32-2x.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
new file mode 100644
index 0000000..3f2baf4
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512-2x.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512-2x.png
new file mode 100644
index 0000000..b948b53
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512-2x.png differ
diff --git a/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
new file mode 100644
index 0000000..466ce00
Binary files /dev/null and b/App/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png differ
diff --git a/App/Resources/Assets.xcassets/Contents.json b/App/Resources/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/App/Resources/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/Contents.json b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/Contents.json
new file mode 100644
index 0000000..7020482
--- /dev/null
+++ b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "guerkchen-128.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "guerkchen-256@2x.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-128.png b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-128.png
new file mode 100644
index 0000000..daba764
Binary files /dev/null and b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-128.png differ
diff --git a/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-256@2x.png b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-256@2x.png
new file mode 100644
index 0000000..76268d0
Binary files /dev/null and b/App/Resources/Assets.xcassets/GuerkchenIcon.imageset/guerkchen-256@2x.png differ
diff --git a/App/UI/Editor/EditorView.swift b/App/UI/Editor/EditorView.swift
index b80ffb5..18c6210 100644
--- a/App/UI/Editor/EditorView.swift
+++ b/App/UI/Editor/EditorView.swift
@@ -23,8 +23,17 @@ struct EditorView: View {
}
}
} else {
- ContentUnavailableView("Keine Datei ausgewählt", systemImage: "doc.text",
- description: Text("Wähle links eine .feature-Datei."))
+ ContentUnavailableView {
+ VStack(spacing: 12) {
+ Image("GuerkchenIcon")
+ .resizable()
+ .frame(width: 96, height: 96)
+ .accessibilityHidden(true)
+ Text("Keine Datei ausgewählt")
+ }
+ } description: {
+ Text("Wähle links eine .feature-Datei.")
+ }
}
}
}
diff --git a/Config/Info.plist b/Config/Info.plist
index 28a960d..835e4ef 100644
--- a/Config/Info.plist
+++ b/Config/Info.plist
@@ -8,6 +8,8 @@
guerkchen
CFBundleExecutable
$(EXECUTABLE_NAME)
+ CFBundleIconName
+ AppIcon
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
@@ -17,9 +19,9 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.0
+ $(MARKETING_VERSION)
CFBundleVersion
- 1
+ $(CURRENT_PROJECT_VERSION)
LSApplicationCategoryType
public.app-category.developer-tools
LSMinimumSystemVersion
diff --git a/Design/AppIcon/AppIcon-iOS.appiconset/Contents.json b/Design/AppIcon/AppIcon-iOS.appiconset/Contents.json
new file mode 100644
index 0000000..edc8fa5
--- /dev/null
+++ b/Design/AppIcon/AppIcon-iOS.appiconset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images": [
+ {
+ "size": "1024x1024",
+ "idiom": "universal",
+ "filename": "icon_1024.png",
+ "scale": "1x",
+ "platform": "ios"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Design/AppIcon/AppIcon-iOS.appiconset/icon_1024.png b/Design/AppIcon/AppIcon-iOS.appiconset/icon_1024.png
new file mode 100644
index 0000000..e8c136d
Binary files /dev/null and b/Design/AppIcon/AppIcon-iOS.appiconset/icon_1024.png differ
diff --git a/Design/AppIcon/README.md b/Design/AppIcon/README.md
new file mode 100644
index 0000000..cfe8ef2
--- /dev/null
+++ b/Design/AppIcon/README.md
@@ -0,0 +1,54 @@
+# Guerkchen App-Icon
+
+Quelle: `Guerkchen App Icon.dc.html` (Vektor). Alle PNGs daraus gerendert.
+Ab 32 px wird eine vereinfachte Variante verwendet (kein Stiel, keine Strukturlinien, größeres Gesicht).
+
+## Im Projekt eingebaut
+
+Das macOS-Set liegt als `App/Resources/Assets.xcassets/AppIcon.appiconset` im Asset-Katalog
+des Targets. Verdrahtet über `project.yml`:
+
+- `settings.base.ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon`
+- `info.properties.CFBundleIconName: AppIcon`
+
+Fürs UI liegt daneben `GuerkchenIcon.imageset` (128 px @1x, 256 px @2x) — gedacht für
+Darstellung bis 128 pt. Verwendet im leeren Editor-Zustand (`App/UI/Editor/EditorView.swift`):
+
+ Image("GuerkchenIcon")
+ .resizable()
+ .frame(width: 96, height: 96)
+
+Größere Darstellung braucht größere Slots — dann `png/guerkchen-512.png` als @2x nachlegen.
+
+Nach Änderungen am Icon `xcodegen generate` laufen lassen — der Asset-Katalog wird über
+`sources: App` automatisch mitgenommen.
+
+## Quelldateien in diesem Ordner
+
+- `guerkchen-icon.svg` — abgerundetes Icon mit Gelb-Verlauf (Web, Docs, Dock)
+- `guerkchen-icon-square.svg` — randabfallend, für Systeme die selbst maskieren (iOS, Android)
+- `guerkchen-icon-small*.svg` — vereinfachte Kleinvariante
+- `png/guerkchen-.png` — 1024 · 512 · 256 · 128 · 64 · 32 · 16
+- `AppIcon-iOS.appiconset/` — iOS/iPadOS Single-Size 1024 (aktuell kein iOS-Target)
+- `android/ic_launcher-*.png` — 432 (adaptive foreground) · 192 · 144 · 96 · 72 · 48
+- `web/favicon-16.png`, `web/favicon-32.png`, `web/apple-touch-icon.png`
+
+## Weitere Verwendung
+
+Fenster-Icon zur Laufzeit setzen (AppKit):
+
+ NSApplication.shared.applicationIconImage = NSImage(named: "AppIcon")
+
+Web / README:
+
+
+
+
+
+
+
+## Farben
+
+- Verlauf Hintergrund: #FFE36B → #FFC61A → #E89A00
+- Gurke: #7FC23F, Struktur #5D9C2C, Warzen #4F8A24
+- Kontur: #1C2E10 · Mund #8E1026 / Zunge #E4436A · Augen #10213A
diff --git a/Design/AppIcon/android/ic_launcher-144.png b/Design/AppIcon/android/ic_launcher-144.png
new file mode 100644
index 0000000..c19e561
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-144.png differ
diff --git a/Design/AppIcon/android/ic_launcher-192.png b/Design/AppIcon/android/ic_launcher-192.png
new file mode 100644
index 0000000..a4afd11
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-192.png differ
diff --git a/Design/AppIcon/android/ic_launcher-432.png b/Design/AppIcon/android/ic_launcher-432.png
new file mode 100644
index 0000000..a0db8b1
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-432.png differ
diff --git a/Design/AppIcon/android/ic_launcher-48.png b/Design/AppIcon/android/ic_launcher-48.png
new file mode 100644
index 0000000..fc3f70b
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-48.png differ
diff --git a/Design/AppIcon/android/ic_launcher-72.png b/Design/AppIcon/android/ic_launcher-72.png
new file mode 100644
index 0000000..83ca127
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-72.png differ
diff --git a/Design/AppIcon/android/ic_launcher-96.png b/Design/AppIcon/android/ic_launcher-96.png
new file mode 100644
index 0000000..78dc4ac
Binary files /dev/null and b/Design/AppIcon/android/ic_launcher-96.png differ
diff --git a/Design/AppIcon/guerkchen-icon-small-square.svg b/Design/AppIcon/guerkchen-icon-small-square.svg
new file mode 100644
index 0000000..77ae9a1
--- /dev/null
+++ b/Design/AppIcon/guerkchen-icon-small-square.svg
@@ -0,0 +1,23 @@
+
\ No newline at end of file
diff --git a/Design/AppIcon/guerkchen-icon-small.svg b/Design/AppIcon/guerkchen-icon-small.svg
new file mode 100644
index 0000000..d3e6c78
--- /dev/null
+++ b/Design/AppIcon/guerkchen-icon-small.svg
@@ -0,0 +1,23 @@
+
\ No newline at end of file
diff --git a/Design/AppIcon/guerkchen-icon-square.svg b/Design/AppIcon/guerkchen-icon-square.svg
new file mode 100644
index 0000000..9930c8f
--- /dev/null
+++ b/Design/AppIcon/guerkchen-icon-square.svg
@@ -0,0 +1,41 @@
+
\ No newline at end of file
diff --git a/Design/AppIcon/guerkchen-icon.svg b/Design/AppIcon/guerkchen-icon.svg
new file mode 100644
index 0000000..d1cbaf5
--- /dev/null
+++ b/Design/AppIcon/guerkchen-icon.svg
@@ -0,0 +1,41 @@
+
\ No newline at end of file
diff --git a/Design/AppIcon/png/guerkchen-1024.png b/Design/AppIcon/png/guerkchen-1024.png
new file mode 100644
index 0000000..47fabc0
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-1024.png differ
diff --git a/Design/AppIcon/png/guerkchen-128.png b/Design/AppIcon/png/guerkchen-128.png
new file mode 100644
index 0000000..daba764
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-128.png differ
diff --git a/Design/AppIcon/png/guerkchen-16.png b/Design/AppIcon/png/guerkchen-16.png
new file mode 100644
index 0000000..65515ac
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-16.png differ
diff --git a/Design/AppIcon/png/guerkchen-256.png b/Design/AppIcon/png/guerkchen-256.png
new file mode 100644
index 0000000..76268d0
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-256.png differ
diff --git a/Design/AppIcon/png/guerkchen-32.png b/Design/AppIcon/png/guerkchen-32.png
new file mode 100644
index 0000000..a2260d0
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-32.png differ
diff --git a/Design/AppIcon/png/guerkchen-512.png b/Design/AppIcon/png/guerkchen-512.png
new file mode 100644
index 0000000..887c221
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-512.png differ
diff --git a/Design/AppIcon/png/guerkchen-64.png b/Design/AppIcon/png/guerkchen-64.png
new file mode 100644
index 0000000..e2a3e53
Binary files /dev/null and b/Design/AppIcon/png/guerkchen-64.png differ
diff --git a/Design/AppIcon/web/apple-touch-icon.png b/Design/AppIcon/web/apple-touch-icon.png
new file mode 100644
index 0000000..0b9607e
Binary files /dev/null and b/Design/AppIcon/web/apple-touch-icon.png differ
diff --git a/Design/AppIcon/web/favicon-16.png b/Design/AppIcon/web/favicon-16.png
new file mode 100644
index 0000000..c18096b
Binary files /dev/null and b/Design/AppIcon/web/favicon-16.png differ
diff --git a/Design/AppIcon/web/favicon-32.png b/Design/AppIcon/web/favicon-32.png
new file mode 100644
index 0000000..e81c029
Binary files /dev/null and b/Design/AppIcon/web/favicon-32.png differ
diff --git a/project.yml b/project.yml
index 676a63a..db093ff 100644
--- a/project.yml
+++ b/project.yml
@@ -27,6 +27,7 @@ targets:
LSMinimumSystemVersion: $(MACOSX_DEPLOYMENT_TARGET)
LSApplicationCategoryType: public.app-category.developer-tools
NSHumanReadableCopyright: "© 2026 René Fürstenberg"
+ CFBundleIconName: AppIcon
CFBundleShortVersionString: $(MARKETING_VERSION)
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
scheme:
@@ -40,6 +41,7 @@ targets:
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: de.fuerstenberg.guerkchen
+ ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
SWIFT_VERSION: "5.0"
SWIFT_STRICT_CONCURRENCY: minimal
MARKETING_VERSION: "0.1.0"