From 2031687f536a6ff5605b8732b03a701c3aab22e8 Mon Sep 17 00:00:00 2001 From: Victor Bodinaud Date: Mon, 25 Nov 2024 10:25:11 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=84Add=20business=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlloVoisinsSwiftUI.xcodeproj/project.pbxproj | 28 ++++++ .../xcshareddata/swiftpm/Package.resolved | 15 +++ .../RegulatedProfessionEditProfilModal.swift | 1 + .../Views/Sequoia/Components/SQButton.swift | 58 ++++++------ .../Sequoia/Components/SQColorPicker.swift | 4 +- .../Sequoia/Components/SQTextField.swift | 81 +++++++++++++--- .../{ => Cards}/CardColorSelectionView.swift | 0 .../Views/{ => Cards}/CardFormView.swift | 0 .../Views/{ => Cards}/CardPrintView.swift | 0 .../CardTemplateSelectionView.swift | 0 .../Views/MarketingSupportSelectionView.swift | 87 +++++++++++------- .../for_pro_icon.imageset}/Contents.json | 3 +- .../Images/for_pro_icon.imageset/badge.png | Bin 0 -> 2683 bytes .../Resources/Lottie/av_loader.json | 1 + .../Resources/Lottie/clap_animation.json | 1 + .../Resources/Lottie/hourglass.json | 1 + .../Resources/Lottie/light_animation.json | 1 + .../Resources/Lottie/like_animation_pink.json | 1 + .../Resources/Lottie/like_reaction.json | 1 + .../Resources/Lottie/like_reaction_white.json | 1 + .../Resources/Lottie/location-dot.json | 1 + .../Resources/Lottie/lottie_loading_gray.json | 1 + .../Resources/Lottie/luck_animation.json | 1 + .../Resources/Lottie/no_splash_star.json | 1 + .../Resources/Lottie/post_search_confirm.json | 1 + .../Resources/Lottie/pumpkin.json | 1 + .../Resources/Lottie/splash_star.json | 1 + .../Resources/Lottie/start_screen.json | 1 + .../Lottie/start_screen_without_baseline.json | 1 + .../Resources/Lottie/trash_button.json | 1 + .../Lottie/viewcontroller_loader.json | 1 + 31 files changed, 215 insertions(+), 80 deletions(-) create mode 100644 AlloVoisinsSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved rename AlloVoisinsSwiftUI/Features/Marketing/Views/{ => Cards}/CardColorSelectionView.swift (100%) rename AlloVoisinsSwiftUI/Features/Marketing/Views/{ => Cards}/CardFormView.swift (100%) rename AlloVoisinsSwiftUI/Features/Marketing/Views/{ => Cards}/CardPrintView.swift (100%) rename AlloVoisinsSwiftUI/Features/Marketing/Views/{ => Cards}/CardTemplateSelectionView.swift (100%) rename AlloVoisinsSwiftUI/{Assets.xcassets/AccentColor.colorset => Resources/Assets.xcassets/Images/for_pro_icon.imageset}/Contents.json (69%) create mode 100644 AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/badge.png create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/av_loader.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/clap_animation.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/hourglass.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/light_animation.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/like_animation_pink.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/like_reaction.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/like_reaction_white.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/location-dot.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/lottie_loading_gray.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/luck_animation.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/no_splash_star.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/post_search_confirm.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/pumpkin.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/splash_star.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/start_screen.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/start_screen_without_baseline.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/trash_button.json create mode 100644 AlloVoisinsSwiftUI/Resources/Lottie/viewcontroller_loader.json diff --git a/AlloVoisinsSwiftUI.xcodeproj/project.pbxproj b/AlloVoisinsSwiftUI.xcodeproj/project.pbxproj index 75b38d3..8859b8d 100644 --- a/AlloVoisinsSwiftUI.xcodeproj/project.pbxproj +++ b/AlloVoisinsSwiftUI.xcodeproj/project.pbxproj @@ -6,6 +6,10 @@ objectVersion = 77; objects = { +/* Begin PBXBuildFile section */ + 573DAF242CF0CC54006DF58A /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 573DAF232CF0CC54006DF58A /* Lottie */; }; +/* End PBXBuildFile section */ + /* Begin PBXFileReference section */ 57282ACB2CBD2810000C443E /* AlloVoisinsSwiftUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlloVoisinsSwiftUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -36,6 +40,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 573DAF242CF0CC54006DF58A /* Lottie in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -78,6 +83,7 @@ ); name = AlloVoisinsSwiftUI; packageProductDependencies = ( + 573DAF232CF0CC54006DF58A /* Lottie */, ); productName = AlloVoisinsSwiftUI; productReference = 57282ACB2CBD2810000C443E /* AlloVoisinsSwiftUI.app */; @@ -107,6 +113,9 @@ ); mainGroup = 57282AC22CBD2810000C443E; minimizedProjectReferenceProxies = 1; + packageReferences = ( + 573DAF222CF0CC54006DF58A /* XCRemoteSwiftPackageReference "lottie-spm" */, + ); preferredProjectObjectVersion = 77; productRefGroup = 57282ACC2CBD2810000C443E /* Products */; projectDirPath = ""; @@ -343,6 +352,25 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 573DAF222CF0CC54006DF58A /* XCRemoteSwiftPackageReference "lottie-spm" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-spm.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.5.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 573DAF232CF0CC54006DF58A /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = 573DAF222CF0CC54006DF58A /* XCRemoteSwiftPackageReference "lottie-spm" */; + productName = Lottie; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 57282AC32CBD2810000C443E /* Project object */; } diff --git a/AlloVoisinsSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AlloVoisinsSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..f8c4f5d --- /dev/null +++ b/AlloVoisinsSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "6b3386dc9ff1f3a74f1534de9c41d47137eae0901cfe819ed442f1b241549359", + "pins" : [ + { + "identity" : "lottie-spm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-spm.git", + "state" : { + "revision" : "b842598f1295f3ffa1475b1580672d1fe5b83580", + "version" : "4.5.0" + } + } + ], + "version" : 3 +} diff --git a/AlloVoisinsSwiftUI/Core/Views/Modals/RegulatedProfessionEditProfilModal.swift b/AlloVoisinsSwiftUI/Core/Views/Modals/RegulatedProfessionEditProfilModal.swift index cee9b0e..1fbc2c7 100644 --- a/AlloVoisinsSwiftUI/Core/Views/Modals/RegulatedProfessionEditProfilModal.swift +++ b/AlloVoisinsSwiftUI/Core/Views/Modals/RegulatedProfessionEditProfilModal.swift @@ -49,6 +49,7 @@ struct RegulatedProfessionEditProfilModal: View { VStack { SQButton("fermer", color: .sqNeutral(100), textColor: .white) {} + .disabled(true) } .padding(.horizontal, 16) .padding(.vertical, 24) diff --git a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQButton.swift b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQButton.swift index 3f2726f..096a46c 100644 --- a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQButton.swift +++ b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQButton.swift @@ -5,6 +5,7 @@ // Created by Victor on 12/06/2024. // +import Lottie import SwiftUI struct SQButton: View { @@ -18,6 +19,13 @@ struct SQButton: View { @Binding var isLoading: Bool let action: () -> Void + private var textWidth: CGFloat { + let font = UIFont.systemFont(ofSize: textSize) + let attributes = [NSAttributedString.Key.font: font] + let size = (title as NSString).size(withAttributes: attributes) + return size.width + (icon != nil ? 24 : 0) + } + init(_ title: String, color: Color = .sqNeutral(10), textColor: Color = .black, textSize: CGFloat = 16, font: SQTextFont = .demiBold, icon: SQIcon? = nil, isFull: Bool = true, isLoading: Binding = .constant(false), action: @escaping () -> Void) { self.title = title self.color = color @@ -34,37 +42,30 @@ struct SQButton: View { Button(action: { self.action() }, label: { - if isLoading { - ProgressView() - .padding(.horizontal, 30) - .padding(.vertical, 12) - .frame(height: 40, alignment: .center) - .background(isFull ? color : .clear) - .cornerRadius(100) - .overlay( - RoundedRectangle(cornerRadius: 100) - .inset(by: 0.5) - .stroke(color, lineWidth: 1) - ) - } else { - HStack { - if (icon != nil) { + HStack { + if isLoading { + LottieView(animation: .named("av_loader")) + .looping() + .frame(width: 20) + } else { + if icon != nil { icon } SQText(title, size: textSize, font: font, textColor: textColor) } - .padding(.horizontal, 30) - .padding(.vertical, 12) - .frame(height: 40, alignment: .center) - .background(isFull ? color : .clear) - .cornerRadius(100) - .overlay( - RoundedRectangle(cornerRadius: 100) - .inset(by: 0.5) - .stroke(color, lineWidth: 1) - ) } + .frame(minWidth: textWidth) + .padding(.horizontal, 30) + .padding(.vertical, 12) + .frame(height: 40, alignment: .center) + .background(isFull ? color : .clear) + .cornerRadius(100) + .overlay( + RoundedRectangle(cornerRadius: 100) + .inset(by: 0.5) + .stroke(color.opacity(isFull ? 0 : 1), lineWidth: 1) + ) }) .buttonStyle(PlainButtonStyle()) } @@ -93,11 +94,12 @@ enum SQButtonStyle { #Preview { VStack(spacing: 16) { + SQButton("C'est parti !", color: .sqNeutral(100), isFull: false) {} SQButton("C'est parti !") {} - .sqStyle() SQButton("C'est parti !", color: .sqOrange(50), textColor: .white) {} - .sqStyle() + .disabled(true) SQButton("Imprimer", color: .sqNeutral(100), textColor: .white, icon: SQIcon(.print, color: .white)) {} - .sqStyle() + .disabled(true) + SQButton("C'est parti !", isLoading: .constant(true)) {} } } diff --git a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQColorPicker.swift b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQColorPicker.swift index 4e160c1..89934bc 100644 --- a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQColorPicker.swift +++ b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQColorPicker.swift @@ -37,6 +37,9 @@ struct SQColorPicker: View { VStack(alignment: .leading) { SQText(title, size: 18, font: .bold) SQText(subtitle ?? "") + .lineLimit(2) + .lineSpacing(1) + .fixedSize(horizontal: false, vertical: true) } HStack { ForEach(colors, id: \.self) { color in @@ -76,7 +79,6 @@ struct SQColorPicker: View { private func colorDot(_ color: Color) -> some View { HStack(alignment: .center, spacing: 8) {} - .padding(4) .frame(width: 32, height: 32, alignment: .center) .background(color) .cornerRadius(32) diff --git a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQTextField.swift b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQTextField.swift index 26a4aa9..3275c38 100644 --- a/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQTextField.swift +++ b/AlloVoisinsSwiftUI/Core/Views/Sequoia/Components/SQTextField.swift @@ -7,14 +7,20 @@ import SwiftUI +enum SQTextFieldType { + case text + case phoneNumber +} + struct SQTextField: View { var label: String var placeholder: String + var type: SQTextFieldType = .text var errorText: String var icon: SQIcon? var isDisabled: Bool = false var isOptional: Bool = false - var isInError: Bool = false + @Binding var isInError: Bool var minCharacters: Int? var maxCharacters: Int? @Binding var text: String @@ -24,15 +30,16 @@ struct SQTextField: View { private var accentColor: Color = .sqNeutral(80) - init(_ label: String, placeholder: String, errorText: String = "", text: Binding, icon: SQIcon? = nil, isDisabled: Bool = false, isOptional: Bool = false, isInError: Bool = false, minCharacters: Int? = nil, maxCharacters: Int? = nil, infoAction: (() -> Void)? = nil, iconAction: (() -> Void)? = nil) { + init(_ label: String, placeholder: String, type: SQTextFieldType = .text, errorText: String = "", text: Binding, icon: SQIcon? = nil, isDisabled: Bool = false, isOptional: Bool = false, isInError: Binding = .constant(false), minCharacters: Int? = nil, maxCharacters: Int? = nil, infoAction: (() -> Void)? = nil, iconAction: (() -> Void)? = nil) { self.label = label self.placeholder = placeholder + self.type = type self.errorText = errorText self._text = text self.icon = icon self.isDisabled = isDisabled self.isOptional = isOptional - self.isInError = isInError + self._isInError = isInError self.minCharacters = minCharacters self.maxCharacters = maxCharacters self.infoAction = infoAction @@ -57,17 +64,40 @@ struct SQTextField: View { } // TextField HStack(spacing: 4) { - TextField(placeholder, text: Binding( - get: { self.text }, - set: { self.text = String($0.prefix(self.maxCharacters ?? Int.max)) } - )) - .font(.sq(.medium)) - .tint(accentColor) - if let icon = icon { - Button { - iconAction?() - } label: { - icon + if type == .phoneNumber { + TextField(placeholder, text: Binding( + get: { formatPhoneNumber(self.text) }, + set: { + let filtered = $0.filter { $0.isNumber } + let truncated = String(filtered.prefix(10)) + self.text = truncated + self.isInError = !isValidPhoneNumber(truncated) + } + )) + .onReceive(self.text.publisher.collect()) { + self.text = String($0.prefix(10)) + } + .keyboardType(.numberPad) + .font(.sq(.medium)) + .foregroundStyle(Color.sqNeutral(100)) + .tint(accentColor) + } else { + TextField(placeholder, text: Binding( + get: { self.text }, + set: { self.text = String($0.prefix(self.maxCharacters ?? Int.max)) } + )) + .onChange(of: self.text, perform: { _ in + self.isInError = false + }) + .font(.sq(.medium)) + .foregroundStyle(Color.sqNeutral(100)) + .tint(accentColor) + if let icon = icon { + Button { + iconAction?() + } label: { + icon + } } } } @@ -77,7 +107,7 @@ struct SQTextField: View { .overlay( RoundedRectangle(cornerRadius: 8) .inset(by: 0.5) - .stroke(isFocused ? accentColor : isDisabled ? Color.sqNeutral(20) : Color.sqNeutral(30), lineWidth: 1) + .stroke(isInError ? .sqSemanticRed : isFocused ? accentColor : isDisabled ? Color.sqNeutral(20) : Color.sqNeutral(30), lineWidth: 1) ) .focused($isFocused) .disabled(isDisabled) @@ -106,6 +136,25 @@ struct SQTextField: View { } return "" } + + private func formatPhoneNumber(_ number: String) -> String { + let numbers = number.filter { $0.isNumber } + var result = "" + + for (index, char) in numbers.enumerated() { + if index > 0 && index % 2 == 0 { + result += " " + } + result += String(char) + } + + return result + } + + private func isValidPhoneNumber(_ number: String) -> Bool { + let numbers = number.filter { $0.isNumber } + return numbers.count == 10 && numbers.first == "0" + } } #Preview { @@ -113,6 +162,8 @@ struct SQTextField: View { SQTextField("Label name", placeholder: "Placeholder", text: .constant("Bonjour, "), minCharacters: 20) SQTextField("Label name", placeholder: "Placeholder", text: .constant(""), isOptional: true) SQTextField("Label name", placeholder: "Placeholder", text: .constant(""), isDisabled: true) + SQTextField("Label name", placeholder: "Placeholder", errorText: "Champ invalide", text: .constant(""), isInError: .constant(true)) + SQTextField("Téléphone", placeholder: "01 23 45 67 89", type: .phoneNumber, text: .constant("")) } .padding() } diff --git a/AlloVoisinsSwiftUI/Features/Marketing/Views/CardColorSelectionView.swift b/AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardColorSelectionView.swift similarity index 100% rename from AlloVoisinsSwiftUI/Features/Marketing/Views/CardColorSelectionView.swift rename to AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardColorSelectionView.swift diff --git a/AlloVoisinsSwiftUI/Features/Marketing/Views/CardFormView.swift b/AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardFormView.swift similarity index 100% rename from AlloVoisinsSwiftUI/Features/Marketing/Views/CardFormView.swift rename to AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardFormView.swift diff --git a/AlloVoisinsSwiftUI/Features/Marketing/Views/CardPrintView.swift b/AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardPrintView.swift similarity index 100% rename from AlloVoisinsSwiftUI/Features/Marketing/Views/CardPrintView.swift rename to AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardPrintView.swift diff --git a/AlloVoisinsSwiftUI/Features/Marketing/Views/CardTemplateSelectionView.swift b/AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardTemplateSelectionView.swift similarity index 100% rename from AlloVoisinsSwiftUI/Features/Marketing/Views/CardTemplateSelectionView.swift rename to AlloVoisinsSwiftUI/Features/Marketing/Views/Cards/CardTemplateSelectionView.swift diff --git a/AlloVoisinsSwiftUI/Features/Marketing/Views/MarketingSupportSelectionView.swift b/AlloVoisinsSwiftUI/Features/Marketing/Views/MarketingSupportSelectionView.swift index 4b1ccdd..7d3d0d2 100644 --- a/AlloVoisinsSwiftUI/Features/Marketing/Views/MarketingSupportSelectionView.swift +++ b/AlloVoisinsSwiftUI/Features/Marketing/Views/MarketingSupportSelectionView.swift @@ -12,49 +12,66 @@ struct MarketingSupportSelectionView: View { var body: some View { ScrollView { - Spacer() - .frame(height: 16) - // Visit cards - VStack(alignment: .leading, spacing: 0) { - SQImage("visit_card_new", height: 200) - .cornerRadius(8, corners: [.topLeft, .topRight]) - SQText("Mes cartes de visite", size: 18, font: .bold) + VStack(spacing: 16) { + Spacer() + .frame(height: 16) + // Visit cards + VStack(alignment: .leading, spacing: 0) { + SQImage("visit_card_new", height: 200) + .cornerRadius(8, corners: [.topLeft, .topRight]) + HStack { + SQText("Mes cartes de visite", size: 18, font: .bold) + Spacer() + SQImage("for_pro_icon", height: 13) + } .padding(16) - } - .overlay( - RoundedRectangle(cornerRadius: 8) - .inset(by: 0.5) - .stroke(Color.sqNeutral(20), lineWidth: 1) + } + .overlay( + RoundedRectangle(cornerRadius: 8) + .inset(by: 0.5) + .stroke(Color.sqNeutral(20), lineWidth: 1) ) - .onTapGesture { - self.goToNext.toggle() - } + .onTapGesture { + self.goToNext.toggle() + } + .fixedSize(horizontal: true, vertical: false) - // Flyers - VStack(alignment: .leading, spacing: 0) { - SQImage("flyers", height: 200) - .cornerRadius(8, corners: [.topLeft, .topRight]) - SQText("Mes prospetus", size: 18, font: .bold) + // Flyers + VStack(alignment: .leading, spacing: 0) { + SQImage("flyers", height: 200) + .cornerRadius(8, corners: [.topLeft, .topRight]) + HStack { + SQText("Mes prospetus", size: 18, font: .bold) + Spacer() + SQImage("for_pro_icon", height: 13) + } .padding(16) - } - .overlay( - RoundedRectangle(cornerRadius: 8) - .inset(by: 0.5) - .stroke(Color.sqNeutral(20), lineWidth: 1) + } + .overlay( + RoundedRectangle(cornerRadius: 8) + .inset(by: 0.5) + .stroke(Color.sqNeutral(20), lineWidth: 1) ) + .fixedSize(horizontal: true, vertical: false) - // Quotes - VStack(alignment: .leading, spacing: 0) { - SQImage("quotes", height: 200) - .cornerRadius(8, corners: [.topLeft, .topRight]) - SQText("Mes prospetus", size: 18, font: .bold) + // Quotes + VStack(alignment: .center, spacing: 0) { + SQImage("quotes", height: 200) + .cornerRadius(8, corners: [.topLeft, .topRight]) + HStack { + SQText("Mes prospetus", size: 18, font: .bold) + Spacer() + SQImage("for_pro_icon", height: 13) + } .padding(16) - } - .overlay( - RoundedRectangle(cornerRadius: 8) - .inset(by: 0.5) - .stroke(Color.sqNeutral(20), lineWidth: 1) + } + .overlay( + RoundedRectangle(cornerRadius: 8) + .inset(by: 0.5) + .stroke(Color.sqNeutral(20), lineWidth: 1) ) + .fixedSize(horizontal: true, vertical: false) + } } .scrollIndicators(.hidden) .sqNavigationBar(title: "Mes supports de communication") diff --git a/AlloVoisinsSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json b/AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/Contents.json similarity index 69% rename from AlloVoisinsSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json rename to AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/Contents.json index eb87897..9c472fc 100644 --- a/AlloVoisinsSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/Contents.json @@ -1,6 +1,7 @@ { - "colors" : [ + "images" : [ { + "filename" : "badge.png", "idiom" : "universal" } ], diff --git a/AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/badge.png b/AlloVoisinsSwiftUI/Resources/Assets.xcassets/Images/for_pro_icon.imageset/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..a035e089a510682629dff3a31e0d7e930b83f334 GIT binary patch literal 2683 zcmV->3WW8EP);2xw zS>qV7dV7C6;swQ}E0Z^mj(UG|$gxI9A<)8)S5XQyQwTyFuiQL3hTog011(|%T4*$j z5GY@5&%blY2t4#-O(E`D5?^EZotPZu!bD#5?jzUjBX7c(Ge?_gu5x{}O6!D;DA0_N z_kLKLm2&UI0OxK=%)@~HLIG466YA;4(KFNnly{u`Jty{O;;gTJg!^o12Wi1v=V3Uf zR^%uZCnkv8vPG9Fd%zjYQj?4n$4iWOg*s>%gv_=>W{yc?n2=KO#8B z5i5C8_!ozTeHvw)zoxlNp0DJlr4!ph+aNMp5yC8Ra>v4FSdBR=!wTh!c0b)Kf6u=487*G>N_oDkXB%}t_6Xg*bC2$RdynQX ze<|C4ed`V-!9!agq^A!5in_YD()>raX!h)9q4WLE?2`8cRBfWJ?e*<`?5FZ?Z`_O5 zZqwrDUy18|X*YK66z~=4kd}-88xz6VvF4+K7!R<=*_fxOPN$cME2n|0!D9I582<+UcOI8!z)w7k3ym3H&dzgM< zhAy1`SpEiShDP>Eq5ARCAKw(DyrsP^#yV7bGIq>K#tut>NHfx`h;VU#xFa7miavM_ zS|UgSksDdg%J;AW1Q0~;6OT&aJooOOj3yZbgP^??ZhBuoG3xj2Sv@!W{6L5pvQ7V^ z%Il%+Utazl9ho{{Obq|nJ@hxY1U-NN zyPw`6R``=jfj}Ge?&*o~3)H3oDqaO#3(n((GaokzSg!d0?^l{1w1fW=bePen{|~!_ z*?e5|+tSnr*BSoTAiZ?(P31Vm{QeBz_kH0F69FNrfXRIIukVDS766kzd-j?njBdqZ z@}tNBa_Pq8zYl~PB!nNj`(ylYTveJ5$KZg1G^+k4BbLoN1^@5!R$<%YW12ZsP0rza-5_9CTU(eQn1N2RCS5 zacwVYrh+5~!dC9AoEM_(6Vjsy$fQhRC5uLFl&&5SbLSx85xm77cC?qhc5lT`1x&3`>^JK zIY?U7^`ooXKEaH!tHN$L**d@vZNE_VdoyzAauB995kGVpO_l$G>#Ocz>+9%9{LoJx zBwOh68Ifb!Lg~p--|$1nBR2Z13v?;--M_XgT7eiUa>)9}2RA~;b^eAwHE#mBC*#gi z==kp6*o_}VRn>8HDVKmEe_$TnWWENc89#EZXu-OBfAOU=RS z^_7C^oNo1E7d9pad4i~2SjxU4*@b-{COgD}m_7R`rNxEQSLD61gDXiW?kx-}l8X7g z?>76W{0#`#6D(>QNM4ytbiEdG(YR1I`_`v4ymPSWzDbIFDnMg_;E0}dd6yvIuVDO1 z&00EgxDHb9GyX$7ld5erqP7Z}L<^W`e7xsW{5g@k-!4g^qL1yQVufRMLObEPktEgA zDAYIZyeA2cv18o$cqGTYL41%1+9HiP!&bpm3 zXtoOKqJ<9Zfvtk~O(?5NnO}WBSpup9)K-{VrFMhjsW)AWpLBE2MhCVEI<&kAPo=F_ z8r+9;Rb5qa3(-Ordnh&{M76z|yIgy3Y45}P5c9-8-`BdKR3~p9J#5-~PuD(#(4l8; zp(UU}zFxdT7pFe4+OOF`Gw`}D>5z(&d!<}_G0(|4Mr#c02cgZ(m>Bg=j>wRP-}L9@ z0XnclQzaeGH#_ymMVeAc*lbKWcR-h#&KNav+&R??VB#R(Xz04xbh~hZ^ z2JcZJ`D~EqGVq$LqT`cWk;f|6|5=T`M;k)!n0MR-YBTr*+7KGA3lLBV)C(3Y1ezt< z_Vw1K9pmS9?<&g@i3Pf8+3UBa0?iU_TX