feat(apple/tvOS): parallax app icon + top shelf images from the brand layers
ci / rust (push) Has been cancelled

Icon Composer doesn't cover tvOS — tvOS app icons are the older parallax format:
flat layers in an asset-catalog "App Icon & Top Shelf Image" brand asset. Generated
from the same Affinity layer exports the Icon Composer .icon uses, mirroring its
composition (violet automatic-gradient background → light circle → dark circle →
blob in front), via scripts/render-tvos-icon.swift (checked in for regeneration):

- App Icon.imagestack 400×240 @1x/@2x + App Icon - App Store.imagestack 1280×768,
  four layers each so the focus engine gets real parallax depth.
- Top Shelf Image (1920×720) + Wide (2320×720) @1x/@2x as flat composites.
- ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image" on the tvOS
  configs; verified on the Apple TV simulator home screen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 13:19:06 +02:00
parent 4781933507
commit 75396c20c2
39 changed files with 384 additions and 9 deletions
@@ -0,0 +1,13 @@
{
"images": [
{
"filename": "back@1x.png",
"idiom": "tv",
"scale": "1x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,13 @@
{
"images": [
{
"filename": "circle1@1x.png",
"idiom": "tv",
"scale": "1x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,13 @@
{
"images": [
{
"filename": "circle2@1x.png",
"idiom": "tv",
"scale": "1x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,20 @@
{
"layers": [
{
"filename": "Front.imagestacklayer"
},
{
"filename": "Circle2.imagestacklayer"
},
{
"filename": "Circle1.imagestacklayer"
},
{
"filename": "Back.imagestacklayer"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,13 @@
{
"images": [
{
"filename": "front@1x.png",
"idiom": "tv",
"scale": "1x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "back@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "back@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,6 @@
{
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "circle1@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "circle1@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,6 @@
{
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "circle2@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "circle2@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,6 @@
{
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,20 @@
{
"layers": [
{
"filename": "Front.imagestacklayer"
},
{
"filename": "Circle2.imagestacklayer"
},
{
"filename": "Circle1.imagestacklayer"
},
{
"filename": "Back.imagestacklayer"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "front@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "front@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,6 @@
{
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,32 @@
{
"assets": [
{
"filename": "App Icon - App Store.imagestack",
"idiom": "tv",
"role": "primary-app-icon",
"size": "1280x768"
},
{
"filename": "App Icon.imagestack",
"idiom": "tv",
"role": "primary-app-icon",
"size": "400x240"
},
{
"filename": "Top Shelf Image Wide.imageset",
"idiom": "tv",
"role": "top-shelf-image-wide",
"size": "2320x720"
},
{
"filename": "Top Shelf Image.imageset",
"idiom": "tv",
"role": "top-shelf-image",
"size": "1920x720"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "shelf-wide@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "shelf-wide@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 KiB

@@ -0,0 +1,18 @@
{
"images": [
{
"filename": "shelf@1x.png",
"idiom": "tv",
"scale": "1x"
},
{
"filename": "shelf@2x.png",
"idiom": "tv",
"scale": "2x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

@@ -489,6 +489,7 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = F4H37KF6WC;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Punktfunkempfänger";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
@@ -501,6 +502,7 @@
MARKETING_VERSION = 0.1;
PRODUCT_BUNDLE_IDENTIFIER = io.unom.punktfunk.tvos;
PRODUCT_NAME = "$(TARGET_NAME)";
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
SDKROOT = appletvos;
SUPPORTED_PLATFORMS = "appletvos appletvsimulator";
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -515,6 +517,7 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = F4H37KF6WC;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Punktfunkempfänger";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
@@ -527,6 +530,7 @@
MARKETING_VERSION = 0.1;
PRODUCT_BUNDLE_IDENTIFIER = io.unom.punktfunk.tvos;
PRODUCT_NAME = "$(TARGET_NAME)";
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
SDKROOT = appletvos;
SUPPORTED_PLATFORMS = "appletvos appletvsimulator";
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -539,15 +543,6 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
CC000000000000000000000A /* Build configuration list for PBXNativeTarget "Punktfunk-tvOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CC0000000000000000000012 /* Debug */,
CC0000000000000000000013 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
AA000000000000000000000A /* Build configuration list for PBXNativeTarget "Punktfunk" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -575,6 +570,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CC000000000000000000000A /* Build configuration list for PBXNativeTarget "Punktfunk-tvOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CC0000000000000000000012 /* Debug */,
CC0000000000000000000013 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCLocalSwiftPackageReference section */