better app icon

This commit is contained in:
Stefan Lange-Hegermann
2025-10-01 11:25:34 +02:00
parent ab5e3e14ac
commit 2f0cebceed
17 changed files with 144 additions and 130 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

View File

@@ -1,39 +0,0 @@
{
"fill" : {
"linear-gradient" : [
"srgb:0.66422,0.66424,0.66423,1.00000",
"extended-gray:1.00000,1.00000"
]
},
"groups" : [
{
"layers" : [
{
"image-name" : "cablebyvoltplan-logomark copy.png",
"name" : "cablebyvoltplan-logomark copy",
"position" : {
"scale" : 1,
"translation-in-points" : [
-483.8671875,
391.375
]
}
}
],
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"translucency" : {
"enabled" : true,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}

View File

@@ -6,10 +6,6 @@
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
3E4BC9B82E7F5E9E0052324A /* Cable.icon in Resources */ = {isa = PBXBuildFile; fileRef = 3E4BC9B72E7F5E9E0052324A /* Cable.icon */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
3E5C0BDE2E72C0FE00247EC8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@@ -28,7 +24,6 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
3E4BC9B72E7F5E9E0052324A /* Cable.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = Cable.icon; sourceTree = "<group>"; };
3E5C0BCC2E72C0FD00247EC8 /* Cable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cable.app; sourceTree = BUILT_PRODUCTS_DIR; };
3E5C0BDD2E72C0FE00247EC8 /* CableTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CableTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3E5C0BE72E72C0FE00247EC8 /* CableUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -97,7 +92,6 @@
3E5C0BE02E72C0FE00247EC8 /* CableTests */,
3E5C0BEA2E72C0FE00247EC8 /* CableUITests */,
3E5C0BCD2E72C0FD00247EC8 /* Products */,
3E4BC9B72E7F5E9E0052324A /* Cable.icon */,
);
sourceTree = "<group>";
};
@@ -231,7 +225,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3E4BC9B82E7F5E9E0052324A /* Cable.icon in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,73 @@
{
"fill" : {
"automatic-gradient" : "display-p3:0.50588,0.79216,0.56471,1.00000"
},
"groups" : [
{
"layers" : [
{
"blend-mode" : "normal",
"glass" : false,
"hidden" : false,
"image-name" : "voltplan-lines.png",
"name" : "voltplan-lines",
"position" : {
"scale" : 1,
"translation-in-points" : [
0,
80.8265625
]
}
},
{
"fill" : {
"linear-gradient" : [
"srgb:1.00000,1.00000,1.00000,1.00000",
"srgb:1.00000,1.00000,1.00000,0.63382"
]
},
"image-name" : "voltplan-logo 2 2.png",
"name" : "voltplan-logo 2 2",
"position" : {
"scale" : 1,
"translation-in-points" : [
-3,
77.55625
]
}
},
{
"fill" : {
"linear-gradient" : [
"srgb:1.00000,1.00000,1.00000,1.00000",
"srgb:1.00000,1.00000,1.00000,0.50000"
]
},
"image-name" : "box-2.png",
"name" : "Layer",
"position" : {
"scale" : 1,
"translation-in-points" : [
0,
-91.0703125
]
}
}
],
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"translucency" : {
"enabled" : true,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "Icon1024_opaque.png",
"filename" : "Cable-iOS-Default-1024x1024@1x.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "coffee-ob.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "fridge-ob.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "light-ob.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

View File

@@ -390,11 +390,11 @@ struct LoadsView: View {
var body: some View {
VStack(spacing: 0) {
librarySection
if savedLoads.isEmpty {
emptyStateView
} else {
librarySection
List {
ForEach(savedLoads) { load in
NavigationLink(destination: CalculatorView(savedLoad: load)) {
@@ -607,54 +607,10 @@ struct LoadsView: View {
}
private var emptyStateView: some View {
VStack(spacing: 0) {
Spacer()
VStack(spacing: 20) {
ZStack {
Circle()
.fill(Color.blue.opacity(0.1))
.frame(width: 72, height: 72)
Image(systemName: "bolt.circle")
.font(.system(size: 34))
.foregroundColor(.blue)
}
VStack(spacing: 6) {
Text("No Components Yet")
.font(.title3)
.fontWeight(.semibold)
.foregroundColor(.primary)
Text("Add a component to this system to see cable and fuse recommendations.")
.font(.body)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 32)
}
Button(action: {
createNewLoad()
}) {
HStack(spacing: 8) {
Image(systemName: "plus.circle.fill")
.font(.system(size: 16))
Text("Create Component")
.fontWeight(.medium)
}
.foregroundColor(.white)
.frame(maxWidth: .infinity)
.frame(height: 48)
.background(Color.blue)
.cornerRadius(12)
}
.buttonStyle(.plain)
.padding(.horizontal, 32)
}
Spacer()
}
ComponentsOnboardingView(
onCreate: { createNewLoad() },
onBrowse: { showingComponentLibrary = true }
)
}
private func deleteLoads(offsets: IndexSet) {

View File

@@ -24,7 +24,7 @@ struct SystemsOnboardingView: View {
VStack() {
Spacer(minLength: 32)
SystemsOnboardingCarousel(images: loopingImages, step: carouselStep)
OnboardingCarouselView(images: loopingImages, step: carouselStep)
.frame(minHeight: 80, maxHeight: 240)
.padding(.horizontal, 0)
@@ -126,35 +126,3 @@ struct SystemsOnboardingView: View {
#Preview {
SystemsOnboardingView { _ in }
}
private struct SystemsOnboardingCarousel: View {
let images: [String]
let step: Int
var body: some View {
GeometryReader { geometry in
let width = geometry.size.width
let height = geometry.size.height
ZStack {
if images.isEmpty {
Image(systemName: "photo")
.font(.largeTitle)
.foregroundColor(.secondary)
} else {
HStack(spacing: 0) {
ForEach(Array(images.enumerated()), id: \.offset) { _, name in
Image(name)
.resizable()
.scaledToFit()
.frame(width: width, height: height)
}
}
.offset(x: -CGFloat(step) * width)
}
}
.clipped()
}
}
}