better app icon
|
Before Width: | Height: | Size: 146 KiB |
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,10 +6,6 @@
|
|||||||
objectVersion = 77;
|
objectVersion = 77;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
3E4BC9B82E7F5E9E0052324A /* Cable.icon in Resources */ = {isa = PBXBuildFile; fileRef = 3E4BC9B72E7F5E9E0052324A /* Cable.icon */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
3E5C0BDE2E72C0FE00247EC8 /* PBXContainerItemProxy */ = {
|
3E5C0BDE2E72C0FE00247EC8 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
@@ -28,7 +24,6 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference 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; };
|
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; };
|
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; };
|
3E5C0BE72E72C0FE00247EC8 /* CableUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
@@ -97,7 +92,6 @@
|
|||||||
3E5C0BE02E72C0FE00247EC8 /* CableTests */,
|
3E5C0BE02E72C0FE00247EC8 /* CableTests */,
|
||||||
3E5C0BEA2E72C0FE00247EC8 /* CableUITests */,
|
3E5C0BEA2E72C0FE00247EC8 /* CableUITests */,
|
||||||
3E5C0BCD2E72C0FD00247EC8 /* Products */,
|
3E5C0BCD2E72C0FD00247EC8 /* Products */,
|
||||||
3E4BC9B72E7F5E9E0052324A /* Cable.icon */,
|
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -231,7 +225,6 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
3E4BC9B82E7F5E9E0052324A /* Cable.icon in Resources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
BIN
Cable/AppIcon.icon/Assets/voltplan-lines.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Cable/AppIcon.icon/Assets/voltplan-logo 2 2.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
73
Cable/AppIcon.icon/icon.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 1.8 MiB |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "Icon1024_opaque.png",
|
"filename" : "Cable-iOS-Default-1024x1024@1x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"platform" : "ios",
|
"platform" : "ios",
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.2 MiB |
21
Cable/Assets.xcassets/coffee-onboarding.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Cable/Assets.xcassets/coffee-onboarding.imageset/coffee-ob.png
vendored
Normal file
|
After Width: | Height: | Size: 331 KiB |
21
Cable/Assets.xcassets/fridge-onboarding.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Cable/Assets.xcassets/fridge-onboarding.imageset/fridge-ob.png
vendored
Normal file
|
After Width: | Height: | Size: 230 KiB |
21
Cable/Assets.xcassets/light-onboarding.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Cable/Assets.xcassets/light-onboarding.imageset/light-ob.png
vendored
Normal file
|
After Width: | Height: | Size: 306 KiB |
@@ -390,11 +390,11 @@ struct LoadsView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
librarySection
|
|
||||||
|
|
||||||
if savedLoads.isEmpty {
|
if savedLoads.isEmpty {
|
||||||
emptyStateView
|
emptyStateView
|
||||||
} else {
|
} else {
|
||||||
|
librarySection
|
||||||
|
|
||||||
List {
|
List {
|
||||||
ForEach(savedLoads) { load in
|
ForEach(savedLoads) { load in
|
||||||
NavigationLink(destination: CalculatorView(savedLoad: load)) {
|
NavigationLink(destination: CalculatorView(savedLoad: load)) {
|
||||||
@@ -607,54 +607,10 @@ struct LoadsView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var emptyStateView: some View {
|
private var emptyStateView: some View {
|
||||||
VStack(spacing: 0) {
|
ComponentsOnboardingView(
|
||||||
Spacer()
|
onCreate: { createNewLoad() },
|
||||||
|
onBrowse: { showingComponentLibrary = true }
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteLoads(offsets: IndexSet) {
|
private func deleteLoads(offsets: IndexSet) {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct SystemsOnboardingView: View {
|
|||||||
VStack() {
|
VStack() {
|
||||||
Spacer(minLength: 32)
|
Spacer(minLength: 32)
|
||||||
|
|
||||||
SystemsOnboardingCarousel(images: loopingImages, step: carouselStep)
|
OnboardingCarouselView(images: loopingImages, step: carouselStep)
|
||||||
.frame(minHeight: 80, maxHeight: 240)
|
.frame(minHeight: 80, maxHeight: 240)
|
||||||
.padding(.horizontal, 0)
|
.padding(.horizontal, 0)
|
||||||
|
|
||||||
@@ -126,35 +126,3 @@ struct SystemsOnboardingView: View {
|
|||||||
#Preview {
|
#Preview {
|
||||||
SystemsOnboardingView { _ in }
|
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||