1
0
mirror of git://jb55.com/damus synced 2024-10-06 11:43:21 +00:00

Initial redesign

Changelog-Changed: Redesign phase 1 (text, icons)
This commit is contained in:
William Casarin 2023-05-29 15:31:07 -07:00
commit 51c4fa1e32
75 changed files with 2362 additions and 772 deletions

View File

@ -265,18 +265,21 @@
4CFF8F6D29CD022E008DB934 /* WideEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6C29CD022E008DB934 /* WideEventView.swift */; }; 4CFF8F6D29CD022E008DB934 /* WideEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6C29CD022E008DB934 /* WideEventView.swift */; };
4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; }; 4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; };
50088DA129E8271A008A1FDF /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50088DA029E8271A008A1FDF /* WebSocket.swift */; }; 50088DA129E8271A008A1FDF /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50088DA029E8271A008A1FDF /* WebSocket.swift */; };
501F8C802A0220E1001AFC1D /* KeychainStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C7F2A0220E1001AFC1D /* KeychainStorage.swift */; };
501F8C822A0224EB001AFC1D /* KeychainStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C812A0224EB001AFC1D /* KeychainStorageTests.swift */; };
5019CADD2A0FB0A9000069E1 /* ProfileDatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5019CADC2A0FB0A9000069E1 /* ProfileDatabaseTests.swift */; }; 5019CADD2A0FB0A9000069E1 /* ProfileDatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5019CADC2A0FB0A9000069E1 /* ProfileDatabaseTests.swift */; };
501F8C5529FF5EF6001AFC1D /* PersistedProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5429FF5EF6001AFC1D /* PersistedProfile.swift */; }; 501F8C5529FF5EF6001AFC1D /* PersistedProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5429FF5EF6001AFC1D /* PersistedProfile.swift */; };
501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5629FF5FC5001AFC1D /* Damus.xcdatamodeld */; }; 501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5629FF5FC5001AFC1D /* Damus.xcdatamodeld */; };
501F8C5A29FF70F5001AFC1D /* ProfileDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5929FF70F5001AFC1D /* ProfileDatabase.swift */; }; 501F8C5A29FF70F5001AFC1D /* ProfileDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5929FF70F5001AFC1D /* ProfileDatabase.swift */; };
501F8C802A0220E1001AFC1D /* KeychainStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C7F2A0220E1001AFC1D /* KeychainStorage.swift */; };
501F8C822A0224EB001AFC1D /* KeychainStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C812A0224EB001AFC1D /* KeychainStorageTests.swift */; };
50A50A8D29A09E1C00C01BE7 /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A50A8C29A09E1C00C01BE7 /* RequestTests.swift */; }; 50A50A8D29A09E1C00C01BE7 /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A50A8C29A09E1C00C01BE7 /* RequestTests.swift */; };
50B5685329F97CB400A23243 /* CredentialHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B5685229F97CB400A23243 /* CredentialHandler.swift */; }; 50B5685329F97CB400A23243 /* CredentialHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B5685229F97CB400A23243 /* CredentialHandler.swift */; };
50DA11262A16A23F00236234 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50DA11252A16A23F00236234 /* Launch.storyboard */; }; 50DA11262A16A23F00236234 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50DA11252A16A23F00236234 /* Launch.storyboard */; };
5C0707D12A1ECB38004E7B51 /* DamusLogoGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0707D02A1ECB38004E7B51 /* DamusLogoGradient.swift */; };
5C42E78C29DB76D90086AAC1 /* EmptyUserSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C42E78B29DB76D90086AAC1 /* EmptyUserSearchView.swift */; }; 5C42E78C29DB76D90086AAC1 /* EmptyUserSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C42E78B29DB76D90086AAC1 /* EmptyUserSearchView.swift */; };
5C513FBA297F72980072348F /* CustomPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FB9297F72980072348F /* CustomPicker.swift */; }; 5C513FBA297F72980072348F /* CustomPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FB9297F72980072348F /* CustomPicker.swift */; };
5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FCB2984ACA60072348F /* QRCodeView.swift */; }; 5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FCB2984ACA60072348F /* QRCodeView.swift */; };
5C6E1DAD2A193EC2008FC15A /* GradientButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E1DAC2A193EC2008FC15A /* GradientButtonStyle.swift */; };
5C6E1DAF2A194075008FC15A /* PinkGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E1DAE2A194075008FC15A /* PinkGradient.swift */; };
5CF72FC229B9142F00124A13 /* ShareAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF72FC129B9142F00124A13 /* ShareAction.swift */; }; 5CF72FC229B9142F00124A13 /* ShareAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF72FC129B9142F00124A13 /* ShareAction.swift */; };
6439E014296790CF0020672B /* ProfilePicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfilePicImageView.swift */; }; 6439E014296790CF0020672B /* ProfilePicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfilePicImageView.swift */; };
643EA5C8296B764E005081BB /* RelayFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643EA5C7296B764E005081BB /* RelayFilterView.swift */; }; 643EA5C8296B764E005081BB /* RelayFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643EA5C7296B764E005081BB /* RelayFilterView.swift */; };
@ -292,6 +295,14 @@
BA693074295D649800ADDB87 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; }; BA693074295D649800ADDB87 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; };
BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */; }; BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */; };
DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */; }; DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */; };
E4AE2AC92A227E6000680283 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AC82A227E6000680283 /* LICENSE.txt */; };
E4AE2ACA2A227E7800680283 /* Inter-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AC62A227E4200680283 /* Inter-Regular.otf */; };
E4AE2ACB2A227E7E00680283 /* Inter-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AC52A227E3600680283 /* Inter-Bold.otf */; };
E4AE2ACC2A227E8300680283 /* Inter-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AC72A227E5400680283 /* Inter-Light.otf */; };
E4AE2ACE2A2286D000680283 /* FontManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4AE2ACD2A2286D000680283 /* FontManager.swift */; };
E4AE2AD32A228CB400680283 /* Inter-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AD12A228CA000680283 /* Inter-SemiBold.otf */; };
E4AE2AD42A228CB900680283 /* Inter-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2AD22A228CA700680283 /* Inter-Medium.otf */; };
E4AE2AD52A228CC000680283 /* Inter-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = E4AE2ACF2A228C7500680283 /* Inter-Italic.otf */; };
E990020F2955F837003BBC5A /* EditMetadataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E990020E2955F837003BBC5A /* EditMetadataView.swift */; }; E990020F2955F837003BBC5A /* EditMetadataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E990020E2955F837003BBC5A /* EditMetadataView.swift */; };
E9E4ED0B295867B900DD7078 /* ThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadView.swift */; }; E9E4ED0B295867B900DD7078 /* ThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadView.swift */; };
F757933A29D7AECD007DEAC1 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757933929D7AECD007DEAC1 /* ImagePicker.swift */; }; F757933A29D7AECD007DEAC1 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757933929D7AECD007DEAC1 /* ImagePicker.swift */; };
@ -701,18 +712,21 @@
4CFF8F6C29CD022E008DB934 /* WideEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideEventView.swift; sourceTree = "<group>"; }; 4CFF8F6C29CD022E008DB934 /* WideEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideEventView.swift; sourceTree = "<group>"; };
4FE60CDC295E1C5E00105A1F /* Wallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = "<group>"; }; 4FE60CDC295E1C5E00105A1F /* Wallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = "<group>"; };
50088DA029E8271A008A1FDF /* WebSocket.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebSocket.swift; sourceTree = "<group>"; }; 50088DA029E8271A008A1FDF /* WebSocket.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebSocket.swift; sourceTree = "<group>"; };
501F8C7F2A0220E1001AFC1D /* KeychainStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStorage.swift; sourceTree = "<group>"; };
501F8C812A0224EB001AFC1D /* KeychainStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStorageTests.swift; sourceTree = "<group>"; };
5019CADC2A0FB0A9000069E1 /* ProfileDatabaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDatabaseTests.swift; sourceTree = "<group>"; }; 5019CADC2A0FB0A9000069E1 /* ProfileDatabaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDatabaseTests.swift; sourceTree = "<group>"; };
501F8C5429FF5EF6001AFC1D /* PersistedProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistedProfile.swift; sourceTree = "<group>"; }; 501F8C5429FF5EF6001AFC1D /* PersistedProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistedProfile.swift; sourceTree = "<group>"; };
501F8C5729FF5FC5001AFC1D /* Damus.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Damus.xcdatamodel; sourceTree = "<group>"; }; 501F8C5729FF5FC5001AFC1D /* Damus.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Damus.xcdatamodel; sourceTree = "<group>"; };
501F8C5929FF70F5001AFC1D /* ProfileDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDatabase.swift; sourceTree = "<group>"; }; 501F8C5929FF70F5001AFC1D /* ProfileDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDatabase.swift; sourceTree = "<group>"; };
501F8C7F2A0220E1001AFC1D /* KeychainStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStorage.swift; sourceTree = "<group>"; };
501F8C812A0224EB001AFC1D /* KeychainStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStorageTests.swift; sourceTree = "<group>"; };
50A50A8C29A09E1C00C01BE7 /* RequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestTests.swift; sourceTree = "<group>"; }; 50A50A8C29A09E1C00C01BE7 /* RequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestTests.swift; sourceTree = "<group>"; };
50B5685229F97CB400A23243 /* CredentialHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialHandler.swift; sourceTree = "<group>"; }; 50B5685229F97CB400A23243 /* CredentialHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialHandler.swift; sourceTree = "<group>"; };
50DA11252A16A23F00236234 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; }; 50DA11252A16A23F00236234 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
5C0707D02A1ECB38004E7B51 /* DamusLogoGradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DamusLogoGradient.swift; sourceTree = "<group>"; };
5C42E78B29DB76D90086AAC1 /* EmptyUserSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyUserSearchView.swift; sourceTree = "<group>"; }; 5C42E78B29DB76D90086AAC1 /* EmptyUserSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyUserSearchView.swift; sourceTree = "<group>"; };
5C513FB9297F72980072348F /* CustomPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPicker.swift; sourceTree = "<group>"; }; 5C513FB9297F72980072348F /* CustomPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPicker.swift; sourceTree = "<group>"; };
5C513FCB2984ACA60072348F /* QRCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeView.swift; sourceTree = "<group>"; }; 5C513FCB2984ACA60072348F /* QRCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeView.swift; sourceTree = "<group>"; };
5C6E1DAC2A193EC2008FC15A /* GradientButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientButtonStyle.swift; sourceTree = "<group>"; };
5C6E1DAE2A194075008FC15A /* PinkGradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PinkGradient.swift; sourceTree = "<group>"; };
5CF72FC129B9142F00124A13 /* ShareAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareAction.swift; sourceTree = "<group>"; }; 5CF72FC129B9142F00124A13 /* ShareAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareAction.swift; sourceTree = "<group>"; };
6439E013296790CF0020672B /* ProfilePicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfilePicImageView.swift; sourceTree = "<group>"; }; 6439E013296790CF0020672B /* ProfilePicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfilePicImageView.swift; sourceTree = "<group>"; };
643EA5C7296B764E005081BB /* RelayFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayFilterView.swift; sourceTree = "<group>"; }; 643EA5C7296B764E005081BB /* RelayFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayFilterView.swift; sourceTree = "<group>"; };
@ -728,6 +742,14 @@
BA693073295D649800ADDB87 /* UserSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettingsStore.swift; sourceTree = "<group>"; }; BA693073295D649800ADDB87 /* UserSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettingsStore.swift; sourceTree = "<group>"; };
BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectWalletView.swift; sourceTree = "<group>"; }; BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectWalletView.swift; sourceTree = "<group>"; };
DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTests.swift; sourceTree = "<group>"; }; DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTests.swift; sourceTree = "<group>"; };
E4AE2AC52A227E3600680283 /* Inter-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-Bold.otf"; sourceTree = "<group>"; };
E4AE2AC62A227E4200680283 /* Inter-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-Regular.otf"; sourceTree = "<group>"; };
E4AE2AC72A227E5400680283 /* Inter-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-Light.otf"; sourceTree = "<group>"; };
E4AE2AC82A227E6000680283 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = "<group>"; };
E4AE2ACD2A2286D000680283 /* FontManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontManager.swift; sourceTree = "<group>"; };
E4AE2ACF2A228C7500680283 /* Inter-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-Italic.otf"; sourceTree = "<group>"; };
E4AE2AD12A228CA000680283 /* Inter-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-SemiBold.otf"; sourceTree = "<group>"; };
E4AE2AD22A228CA700680283 /* Inter-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inter-Medium.otf"; sourceTree = "<group>"; };
E990020E2955F837003BBC5A /* EditMetadataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMetadataView.swift; sourceTree = "<group>"; }; E990020E2955F837003BBC5A /* EditMetadataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMetadataView.swift; sourceTree = "<group>"; };
E9E4ED0A295867B900DD7078 /* ThreadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadView.swift; sourceTree = "<group>"; }; E9E4ED0A295867B900DD7078 /* ThreadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadView.swift; sourceTree = "<group>"; };
F757933929D7AECD007DEAC1 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = "<group>"; }; F757933929D7AECD007DEAC1 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = "<group>"; };
@ -1059,6 +1081,8 @@
4C7D09712A0AEF5E00943473 /* DamusGradient.swift */, 4C7D09712A0AEF5E00943473 /* DamusGradient.swift */,
4C7D09732A0AEF9000943473 /* AlbyGradient.swift */, 4C7D09732A0AEF9000943473 /* AlbyGradient.swift */,
4C2859612A12A7F0004746F7 /* GoldSupportGradient.swift */, 4C2859612A12A7F0004746F7 /* GoldSupportGradient.swift */,
5C6E1DAE2A194075008FC15A /* PinkGradient.swift */,
5C0707D02A1ECB38004E7B51 /* DamusLogoGradient.swift */,
); );
path = Gradients; path = Gradients;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1110,6 +1134,7 @@
4CA5588229F33F5B00DC6A45 /* StringCodable.swift */, 4CA5588229F33F5B00DC6A45 /* StringCodable.swift */,
50B5685229F97CB400A23243 /* CredentialHandler.swift */, 50B5685229F97CB400A23243 /* CredentialHandler.swift */,
4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */, 4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */,
E4AE2ACD2A2286D000680283 /* FontManager.swift */,
); );
path = Util; path = Util;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1237,6 +1262,7 @@
4C1A9A2229DDDB8100516EAC /* IconLabel.swift */, 4C1A9A2229DDDB8100516EAC /* IconLabel.swift */,
4C8D00C929DF80350036AF10 /* TruncatedText.swift */, 4C8D00C929DF80350036AF10 /* TruncatedText.swift */,
4C28595F2A12A2BE004746F7 /* SupporterBadge.swift */, 4C28595F2A12A2BE004746F7 /* SupporterBadge.swift */,
5C6E1DAC2A193EC2008FC15A /* GradientButtonStyle.swift */,
); );
path = Components; path = Components;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1266,6 +1292,7 @@
4CE6DEE527F7A08100C66700 /* damus */ = { 4CE6DEE527F7A08100C66700 /* damus */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
E40B46262A2272E6005E70FD /* Fonts */,
F7F0BA23297892AE009531F3 /* Modifiers */, F7F0BA23297892AE009531F3 /* Modifiers */,
4C4A3A5A288A1B2200453788 /* damus.entitlements */, 4C4A3A5A288A1B2200453788 /* damus.entitlements */,
4CE4F9DF285287A000C00DD9 /* Components */, 4CE4F9DF285287A000C00DD9 /* Components */,
@ -1422,6 +1449,20 @@
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
E40B46262A2272E6005E70FD /* Fonts */ = {
isa = PBXGroup;
children = (
E4AE2AC52A227E3600680283 /* Inter-Bold.otf */,
E4AE2AC62A227E4200680283 /* Inter-Regular.otf */,
E4AE2AC72A227E5400680283 /* Inter-Light.otf */,
E4AE2AD12A228CA000680283 /* Inter-SemiBold.otf */,
E4AE2AD22A228CA700680283 /* Inter-Medium.otf */,
E4AE2ACF2A228C7500680283 /* Inter-Italic.otf */,
E4AE2AC82A227E6000680283 /* LICENSE.txt */,
);
path = Fonts;
sourceTree = "<group>";
};
F7F0BA23297892AE009531F3 /* Modifiers */ = { F7F0BA23297892AE009531F3 /* Modifiers */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -1578,10 +1619,17 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
E4AE2AD52A228CC000680283 /* Inter-Italic.otf in Resources */,
E4AE2AD42A228CB900680283 /* Inter-Medium.otf in Resources */,
E4AE2AD32A228CB400680283 /* Inter-SemiBold.otf in Resources */,
E4AE2ACC2A227E8300680283 /* Inter-Light.otf in Resources */,
E4AE2ACB2A227E7E00680283 /* Inter-Bold.otf in Resources */,
E4AE2ACA2A227E7800680283 /* Inter-Regular.otf in Resources */,
3ACB685F297633BC00C46468 /* Localizable.strings in Resources */, 3ACB685F297633BC00C46468 /* Localizable.strings in Resources */,
4CE6DEEE27F7A08200C66700 /* Preview Assets.xcassets in Resources */, 4CE6DEEE27F7A08200C66700 /* Preview Assets.xcassets in Resources */,
3ACB685C297633BC00C46468 /* InfoPlist.strings in Resources */, 3ACB685C297633BC00C46468 /* InfoPlist.strings in Resources */,
50DA11262A16A23F00236234 /* Launch.storyboard in Resources */, 50DA11262A16A23F00236234 /* Launch.storyboard in Resources */,
E4AE2AC92A227E6000680283 /* LICENSE.txt in Resources */,
4CE6DEEB27F7A08200C66700 /* Assets.xcassets in Resources */, 4CE6DEEB27F7A08200C66700 /* Assets.xcassets in Resources */,
4C198DF129F88C6B004C165C /* License.txt in Resources */, 4C198DF129F88C6B004C165C /* License.txt in Resources */,
4C198DF029F88C6B004C165C /* Readme.md in Resources */, 4C198DF029F88C6B004C165C /* Readme.md in Resources */,
@ -1702,6 +1750,7 @@
4C75EFB128049D510006080F /* NostrResponse.swift in Sources */, 4C75EFB128049D510006080F /* NostrResponse.swift in Sources */,
4C7D09592A05BEAD00943473 /* KeyboardVisible.swift in Sources */, 4C7D09592A05BEAD00943473 /* KeyboardVisible.swift in Sources */,
4CEE2AF7280B2DEA00AB5EEF /* ProfileName.swift in Sources */, 4CEE2AF7280B2DEA00AB5EEF /* ProfileName.swift in Sources */,
E4AE2ACE2A2286D000680283 /* FontManager.swift in Sources */,
4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */, 4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */,
31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */, 31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */,
F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */, F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */,
@ -1770,6 +1819,7 @@
4C363A9C282838B9006E126D /* EventRef.swift in Sources */, 4C363A9C282838B9006E126D /* EventRef.swift in Sources */,
4C7D095F2A098C5D00943473 /* ConnectWalletView.swift in Sources */, 4C7D095F2A098C5D00943473 /* ConnectWalletView.swift in Sources */,
3AA24802297E3DC20090C62D /* RepostView.swift in Sources */, 3AA24802297E3DC20090C62D /* RepostView.swift in Sources */,
5C6E1DAF2A194075008FC15A /* PinkGradient.swift in Sources */,
4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */, 4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */,
4C3EA66528FF5F6800C48A62 /* mem.c in Sources */, 4C3EA66528FF5F6800C48A62 /* mem.c in Sources */,
4C198DEF29F88C6B004C165C /* BlurHashEncode.swift in Sources */, 4C198DEF29F88C6B004C165C /* BlurHashEncode.swift in Sources */,
@ -1785,6 +1835,7 @@
4CB88396296F7F8B00DC99E7 /* ReactionView.swift in Sources */, 4CB88396296F7F8B00DC99E7 /* ReactionView.swift in Sources */,
4CFF8F6B29CD0079008DB934 /* RepostedEvent.swift in Sources */, 4CFF8F6B29CD0079008DB934 /* RepostedEvent.swift in Sources */,
4C8682872814DE470026224F /* ProfileView.swift in Sources */, 4C8682872814DE470026224F /* ProfileView.swift in Sources */,
5C0707D12A1ECB38004E7B51 /* DamusLogoGradient.swift in Sources */,
4C5F9114283D694D0052CD1C /* FollowTarget.swift in Sources */, 4C5F9114283D694D0052CD1C /* FollowTarget.swift in Sources */,
4CF0ABD629817F5B00D66079 /* ReportView.swift in Sources */, 4CF0ABD629817F5B00D66079 /* ReportView.swift in Sources */,
4C1A9A2729DDE31900516EAC /* TranslationSettingsView.swift in Sources */, 4C1A9A2729DDE31900516EAC /* TranslationSettingsView.swift in Sources */,
@ -1792,6 +1843,7 @@
4CF0ABD82981980C00D66079 /* Lists.swift in Sources */, 4CF0ABD82981980C00D66079 /* Lists.swift in Sources */,
501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */, 501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */,
4C30AC8029A6A53F00E2BD5A /* ProfilePicturesView.swift in Sources */, 4C30AC8029A6A53F00E2BD5A /* ProfilePicturesView.swift in Sources */,
5C6E1DAD2A193EC2008FC15A /* GradientButtonStyle.swift in Sources */,
4C8EC52529D1FA6C0085D9A8 /* DamusColors.swift in Sources */, 4C8EC52529D1FA6C0085D9A8 /* DamusColors.swift in Sources */,
4C5C7E6A284EDE2E00A22DF5 /* SearchResultsView.swift in Sources */, 4C5C7E6A284EDE2E00A22DF5 /* SearchResultsView.swift in Sources */,
4CE1399429F0669900AC6A0B /* BigButton.swift in Sources */, 4CE1399429F0669900AC6A0B /* BigButton.swift in Sources */,

View File

@ -1,15 +1,12 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "shaka-full.pdf", "filename" : "eula-bg.svg",
"idiom" : "universal" "idiom" : "universal"
} }
], ],
"info" : { "info" : {
"author" : "xcode", "author" : "xcode",
"version" : 1 "version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
} }
} }

View File

@ -0,0 +1,28 @@
<svg width="430" height="813" viewBox="0 0 430 813" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_f_1069_29012)">
<path d="M44.0811 256.851L186.315 111L276.203 223.574L244.02 388.295L69.9751 697.084L100.678 498.338L44.0811 256.851Z" fill="url(#paint0_linear_1069_29012)"/>
</g>
<g filter="url(#filter1_f_1069_29012)">
<path d="M116.509 587.348L206.677 479.401L230.746 273.265L266.666 231.183L367.424 396.975L281.292 659.008L266.665 801.413L66.889 763.694L116.509 587.348Z" fill="url(#paint1_linear_1069_29012)"/>
</g>
<defs>
<filter id="filter0_f_1069_29012" x="-66.6248" y="0.294121" width="453.534" height="807.496" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
</filter>
<filter id="filter1_f_1069_29012" x="-43.8172" y="120.477" width="521.947" height="791.642" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
</filter>
<linearGradient id="paint0_linear_1069_29012" x1="230.179" y1="166.577" x2="-67.7956" y2="310.108" gradientUnits="userSpaceOnUse">
<stop stop-color="#D34CD9"/>
<stop offset="1" stop-color="#4E4DF4"/>
</linearGradient>
<linearGradient id="paint1_linear_1069_29012" x1="139.483" y1="462.902" x2="377.854" y2="565.47" gradientUnits="userSpaceOnUse">
<stop stop-color="#0DE8FF"/>
<stop offset="1" stop-color="#641AAE"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,15 +1,12 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "shaka-line.pdf", "filename" : "lightbulb.svg",
"idiom" : "universal" "idiom" : "universal"
} }
], ],
"info" : { "info" : {
"author" : "xcode", "author" : "xcode",
"version" : 1 "version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
} }
} }

View File

@ -0,0 +1,14 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect opacity="0.2" width="48" height="48" rx="24" fill="url(#paint0_linear_1843_42349)"/>
<path d="M19.9993 36.0001H27.9993M28.8095 28.0001C31.5199 26.3669 33.3327 23.3952 33.3327 20.0001C33.3327 14.8454 29.154 10.6667 23.9993 10.6667C18.8447 10.6667 14.666 14.8454 14.666 20.0001C14.666 23.3952 16.4788 26.3669 19.1892 28.0001M28.8095 28.0001C28.5475 28.1579 28.2772 28.3032 27.9993 28.4352V31.3334C27.9993 31.7016 27.7009 32.0001 27.3327 32.0001H20.666C20.2978 32.0001 19.9993 31.7016 19.9993 31.3334V28.4352C19.7215 28.3032 19.4512 28.1579 19.1892 28.0001M28.8095 28.0001H19.1892" stroke="url(#paint1_linear_1843_42349)" stroke-width="2.66667" stroke-linecap="round" stroke-linejoin="round"/>
<defs>
<linearGradient id="paint0_linear_1843_42349" x1="5.41935" y1="0.774194" x2="37.9355" y2="47.2258" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9AD1C"/>
<stop offset="1" stop-color="#DF7E0C"/>
</linearGradient>
<linearGradient id="paint1_linear_1843_42349" x1="16.7735" y1="11.0754" x2="35.0141" y2="30.2759" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9AD1C"/>
<stop offset="1" stop-color="#DF7E0C"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "header.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "nostr-logo.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,88 +0,0 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 -0.073975 cm
1.000000 1.000000 1.000000 scn
1.295334 8.661732 m
3.613694 8.367855 l
4.475733 8.733568 5.268113 9.771931 5.474915 10.327032 c
6.083156 11.959681 5.507567 14.604573 5.474915 15.061715 c
5.448792 15.427428 6.008246 15.693006 6.291239 15.780080 c
7.571236 15.858447 8.508359 14.876789 8.642253 13.984165 c
8.740212 13.331103 8.576948 11.752880 8.381030 10.849482 c
8.979668 10.936556 10.980525 10.901726 11.868687 10.849482 c
12.756847 10.797236 13.474895 10.196423 14.193260 9.412750 c
14.767952 8.237244 13.953805 7.725680 13.474895 7.616838 c
13.834077 7.257654 l
14.781013 5.918882 13.649043 5.178749 13.115711 5.004600 c
13.474895 4.743376 l
14.487136 3.763786 13.246323 2.751544 13.017752 2.882155 c
11.058574 3.176033 l
15.499378 1.673996 l
16.054478 0.400530 15.074889 0.073999 14.781013 0.073999 c
8.576947 1.673996 l
6.291239 1.673996 5.311650 1.869914 4.299407 2.163791 c
4.157911 2.131138 3.659409 1.987464 2.797370 1.673996 c
1.935332 1.360527 1.219143 2.087601 0.968804 2.490320 c
-0.285071 4.083785 -0.467927 7.257655 1.295334 8.661732 c
h
f
n
Q
endstream
endobj
3 0 obj
1149
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 15.666626 15.710510 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001239 00000 n
0000001262 00000 n
0000001435 00000 n
0000001509 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1568
%%EOF

View File

@ -1,323 +0,0 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.474731 -0.563965 cm
1.000000 1.000000 1.000000 scn
3.613694 9.332577 m
3.553993 8.861599 l
3.637261 8.851044 3.721838 8.862753 3.799107 8.895533 c
3.613694 9.332577 l
h
1.295334 9.626453 m
1.355035 10.097433 l
1.227973 10.113539 1.099794 10.077623 0.999601 9.997839 c
1.295334 9.626453 l
h
0.968804 3.455042 m
1.372000 3.705677 l
1.362764 3.720535 1.352713 3.734872 1.341894 3.748621 c
0.968804 3.455042 l
h
4.299407 3.128512 m
4.431771 3.584435 l
4.353942 3.607030 4.271623 3.609325 4.192656 3.591103 c
4.299407 3.128512 l
h
8.576947 2.638718 m
8.695503 3.098424 l
8.656776 3.108411 8.616942 3.113465 8.576947 3.113465 c
8.576947 2.638718 l
h
14.781013 1.038721 m
14.662457 0.579016 l
14.701184 0.569027 14.741018 0.563974 14.781013 0.563974 c
14.781013 1.038721 l
h
15.499378 2.638718 m
15.934578 2.828420 l
15.881091 2.951125 15.778289 3.045548 15.651489 3.088437 c
15.499378 2.638718 l
h
11.058574 4.140755 m
11.128998 4.610250 l
10.885809 4.646729 10.655017 4.491467 10.597156 4.252461 c
10.539293 4.013455 10.673516 3.769826 10.906463 3.691035 c
11.058574 4.140755 l
h
13.017752 3.846877 m
13.253292 4.259073 l
13.202273 4.288227 13.146286 4.307655 13.088176 4.316372 c
13.017752 3.846877 l
h
13.474895 5.708097 m
13.805044 6.049252 l
13.789093 6.064689 13.772079 6.078987 13.754128 6.092043 c
13.474895 5.708097 l
h
13.115711 5.969321 m
12.968349 6.420619 l
12.798800 6.365256 12.674588 6.219535 12.646772 6.043359 c
12.618958 5.867183 12.692234 5.690281 12.836478 5.585376 c
13.115711 5.969321 l
h
13.834077 8.222376 m
14.221668 8.496526 l
14.206144 8.518474 14.188784 8.539063 14.169774 8.558073 c
13.834077 8.222376 l
h
13.474895 8.581559 m
13.369680 9.044500 l
13.201114 9.006190 13.066693 8.879284 13.018762 8.713197 c
12.970830 8.547110 13.016963 8.368095 13.139197 8.245862 c
13.474895 8.581559 l
h
14.193260 10.377472 m
14.619765 10.585986 l
14.599768 10.626891 14.573989 10.664707 14.543221 10.698271 c
14.193260 10.377472 l
h
8.381030 11.814203 m
7.917068 11.914822 l
7.884080 11.762714 7.927746 11.604099 8.033934 11.490305 c
8.140121 11.376513 8.295343 11.321997 8.449365 11.344399 c
8.381030 11.814203 l
h
8.642253 14.948887 m
9.111748 15.019311 l
8.642253 14.948887 l
h
6.291239 16.744801 m
6.262227 17.218662 l
6.224693 17.216364 6.187564 17.209614 6.151623 17.198555 c
6.291239 16.744801 l
h
5.474915 16.026436 m
5.948456 16.060261 l
5.474915 16.026436 l
h
5.474915 11.291754 m
5.030037 11.457493 l
5.474915 11.291754 l
h
3.673396 9.803555 m
1.355035 10.097433 l
1.235632 9.155476 l
3.553993 8.861599 l
3.673396 9.803555 l
h
0.999601 9.997839 m
-0.029049 9.178730 -0.454726 7.875908 -0.474048 6.619066 c
-0.493367 5.362488 -0.110331 4.058727 0.595713 3.161463 c
1.341894 3.748621 l
0.794064 4.444821 0.458734 5.524729 0.475334 6.604470 c
0.491930 7.683949 0.856455 8.670100 1.591066 9.255068 c
0.999601 9.997839 l
h
0.565608 3.204407 m
0.721970 2.952868 1.013515 2.611341 1.407507 2.372385 c
1.811404 2.127421 2.357187 1.973489 2.959612 2.192553 c
2.635129 3.084882 l
2.375515 2.990478 2.132184 3.043347 1.899893 3.184233 c
1.657696 3.331126 1.465977 3.554496 1.372000 3.705677 c
0.565608 3.204407 l
h
2.959612 2.192553 m
3.816493 2.504146 4.293336 2.639887 4.406158 2.665923 c
4.192656 3.591103 l
4.022485 3.551832 3.502325 3.400227 2.635129 3.084882 c
2.959612 2.192553 l
h
4.167043 2.672591 m
5.229115 2.364247 6.254152 2.163970 8.576947 2.163970 c
8.576947 3.113465 l
6.328326 3.113465 5.394184 3.305025 4.431771 3.584435 c
4.167043 2.672591 l
h
8.458392 2.179011 m
14.662457 0.579016 l
14.899569 1.498427 l
8.695503 3.098424 l
8.458392 2.179011 l
h
14.781013 0.563974 m
15.036198 0.563974 15.495326 0.684875 15.814721 1.047266 c
16.180891 1.462728 16.264221 2.072176 15.934578 2.828420 c
15.064179 2.449016 l
15.289635 1.931793 15.160722 1.741243 15.102402 1.675073 c
15.055794 1.622190 14.990156 1.579316 14.916806 1.549556 c
14.881134 1.535082 14.847747 1.525430 14.820526 1.519657 c
14.791491 1.513498 14.777695 1.513469 14.781013 1.513469 c
14.781013 0.563974 l
h
15.651489 3.088437 m
11.210685 4.590474 l
10.906463 3.691035 l
15.347267 2.188998 l
15.651489 3.088437 l
h
10.988150 3.671260 m
12.947328 3.377382 l
13.088176 4.316372 l
11.128998 4.610250 l
10.988150 3.671260 l
h
12.782211 3.434681 m
12.991495 3.315090 13.204453 3.370091 13.288217 3.396689 c
13.400116 3.432221 13.506123 3.490767 13.598186 3.554502 c
13.783985 3.683133 13.977411 3.877748 14.120350 4.119644 c
14.264680 4.363894 14.369576 4.678114 14.335162 5.031647 c
14.300108 5.391746 14.125634 5.739002 13.805044 6.049252 c
13.144745 5.366943 l
13.330275 5.187398 13.380290 5.040778 13.390134 4.939653 c
13.400617 4.831963 13.370820 4.717613 13.302905 4.602680 c
13.233600 4.485394 13.137231 4.390213 13.057724 4.335170 c
13.017135 4.307070 12.996612 4.300308 13.000857 4.301657 c
13.003194 4.302399 13.024761 4.309311 13.061064 4.310122 c
13.095938 4.310902 13.170414 4.306433 13.253292 4.259073 c
12.782211 3.434681 l
h
13.754128 6.092043 m
13.394944 6.353267 l
12.836478 5.585376 l
13.195662 5.324152 l
13.754128 6.092043 l
h
13.263074 5.518023 m
13.593105 5.625790 14.123367 5.907292 14.433812 6.409482 c
14.595931 6.671733 14.696482 6.993351 14.669847 7.364054 c
14.643518 7.730516 14.495621 8.109214 14.221668 8.496526 c
13.446486 7.948226 l
13.646002 7.666152 13.711709 7.450294 13.722795 7.296009 c
13.733575 7.145966 13.695351 7.020646 13.626177 6.908748 c
13.474038 6.662641 13.171650 6.487002 12.968349 6.420619 c
13.263074 5.518023 l
h
14.169774 8.558073 m
13.810592 8.917255 l
13.139197 8.245862 l
13.498380 7.886679 l
14.169774 8.558073 l
h
13.580109 8.118617 m
13.896242 8.190466 14.344993 8.395787 14.624650 8.816864 c
14.929440 9.275781 14.963785 9.882310 14.619765 10.585986 c
13.766754 10.168959 l
13.997427 9.697128 13.912044 9.460121 13.833706 9.342171 c
13.730235 9.186377 13.532457 9.081495 13.369680 9.044500 c
13.580109 8.118617 l
h
14.543221 10.698271 m
13.820906 11.486253 12.989320 12.223852 11.896564 12.288132 c
11.840808 11.340275 l
12.524374 11.300065 13.128883 10.836036 13.843298 10.056674 c
14.543221 10.698271 l
h
11.896564 12.288132 m
11.441970 12.314873 10.711069 12.336796 10.019300 12.341186 c
9.341933 12.345484 8.654247 12.333687 8.312695 12.284006 c
8.449365 11.344399 l
8.706450 11.381794 9.318512 11.396118 10.013274 11.391710 c
10.693633 11.387392 11.407242 11.365778 11.840808 11.340275 c
11.896564 12.288132 l
h
8.844993 11.713585 m
8.948084 12.188952 9.040332 12.829445 9.094679 13.432834 c
9.147870 14.023395 9.169946 14.631327 9.111748 15.019311 c
8.172758 14.878462 l
8.212520 14.613384 8.201942 14.105675 8.149012 13.518009 c
8.097237 12.943172 8.009893 12.342852 7.917068 11.914822 c
8.844993 11.713585 l
h
9.111748 15.019311 m
8.944062 16.137217 7.805658 17.313158 6.262227 17.218662 c
6.320251 16.270941 l
7.336813 16.333179 8.072657 15.545805 8.172758 14.878462 c
9.111748 15.019311 l
h
6.151623 17.198555 m
5.976391 17.144638 5.715709 17.036982 5.490986 16.876261 c
5.292936 16.734617 4.969444 16.439627 5.001374 15.992612 c
5.948456 16.060261 l
5.951383 16.019283 5.934667 15.999795 5.943361 16.012491 c
5.954769 16.029152 5.984430 16.061831 6.043331 16.103956 c
6.162553 16.189222 6.323094 16.257891 6.430855 16.291048 c
6.151623 17.198555 l
h
5.001374 15.992612 m
5.011176 15.855374 5.059216 15.566318 5.104405 15.255149 c
5.152757 14.922197 5.207128 14.509316 5.241940 14.062993 c
5.312967 13.152368 5.295928 12.171200 5.030037 11.457493 c
5.919792 11.126015 l
6.262142 12.044956 6.261431 13.202559 6.188560 14.136827 c
6.151423 14.612950 6.093790 15.049047 6.044043 15.391605 c
5.991133 15.755945 5.954979 15.968927 5.948456 16.060261 c
5.001374 15.992612 l
h
5.030037 11.457493 m
4.953650 11.252455 4.742510 10.903708 4.434547 10.555828 c
4.127778 10.209298 3.769400 9.914337 3.428282 9.769621 c
3.799107 8.895533 l
4.320028 9.116529 4.788858 9.523607 5.145489 9.926461 c
5.500926 10.327968 5.789377 10.775953 5.919792 11.126015 c
5.030037 11.457493 l
h
f
n
Q
endstream
endobj
3 0 obj
7995
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 16.615845 16.660034 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000008085 00000 n
0000008108 00000 n
0000008281 00000 n
0000008355 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
8414
%%EOF

View File

@ -0,0 +1,45 @@
//
// GradientButtonStyle.swift
// damus
//
// Created by eric on 5/20/23.
//
import SwiftUI
struct GradientButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
return configuration.label
.padding()
.foregroundColor(Color.white)
.background {
RoundedRectangle(cornerRadius: 12)
.fill(PinkGradient.gradient)
}
.scaleEffect(configuration.isPressed ? 0.8 : 1)
}
}
struct GradientButtonStyle_Previews: PreviewProvider {
static var previews: some View {
VStack {
Button("Dynamic Size", action: {
print("dynamic size")
})
.buttonStyle(GradientButtonStyle())
Button(action: {
print("infinite width")
}) {
HStack {
Text("Infinite Width")
}
.frame(minWidth: 300, maxWidth: .infinity, alignment: .center)
}
.buttonStyle(GradientButtonStyle())
.padding()
}
}
}

View File

@ -0,0 +1,29 @@
//
// DamusLogoGradient.swift
// damus
//
// Created by eric on 5/24/23.
//
import SwiftUI
fileprivate let damus_logo_grad_c1 = hex_col(r: 0x30, g: 0xb3, b: 0xf1)
fileprivate let damus_logo_grad_c2 = hex_col(r: 0xc5, g: 0x39, b: 0xf9)
fileprivate let damus_logo_grad = [damus_logo_grad_c1, damus_logo_grad_c2]
struct DamusLogoGradient: View {
var body: some View {
DamusLogoGradient.gradient
.edgesIgnoringSafeArea([.top,.bottom])
}
static var gradient: LinearGradient {
LinearGradient(colors: damus_logo_grad, startPoint: .leading, endPoint: .trailing)
}
}
struct DamusLogoGradient_Previews: PreviewProvider {
static var previews: some View {
DamusLogoGradient()
}
}

View File

@ -0,0 +1,30 @@
//
// PinkGradient.swift
// damus
//
// Created by eric on 5/20/23.
//
import SwiftUI
fileprivate let damus_grad_c1 = hex_col(r: 0xd3, g: 0x4c, b: 0xd9)
fileprivate let damus_grad_c2 = hex_col(r: 0xf8, g: 0x69, b: 0xb6)
fileprivate let pink_grad = [damus_grad_c1, damus_grad_c2]
struct PinkGradient: View {
var body: some View {
PinkGradient.gradient
.edgesIgnoringSafeArea([.top,.bottom])
}
static var gradient: LinearGradient {
LinearGradient(colors: pink_grad, startPoint: .topTrailing, endPoint: .bottom)
}
}
struct PinkGradient_Previews: PreviewProvider {
static var previews: some View {
PinkGradient()
}
}

View File

@ -21,7 +21,7 @@ struct IconLabel: View {
var body: some View { var body: some View {
HStack(spacing: 0) { HStack(spacing: 0) {
Image(systemName: img_name) Image(img_name)
.foregroundColor(img_color) .foregroundColor(img_color)
.frame(width: 20) .frame(width: 20)
.padding([.trailing], 20) .padding([.trailing], 20)

View File

@ -25,10 +25,10 @@ struct InvoiceView: View {
UIPasteboard.general.string = invoice.string UIPasteboard.general.string = invoice.string
} label: { } label: {
if !copied { if !copied {
Image(systemName: "doc.on.clipboard") Image("copy2")
.foregroundColor(.gray) .foregroundColor(.gray)
} else { } else {
Image(systemName: "checkmark.circle") Image("check-circle")
.foregroundColor(DamusColors.green) .foregroundColor(DamusColors.green)
} }
} }
@ -63,7 +63,7 @@ struct InvoiceView: View {
VStack(alignment: .leading, spacing: 12) { VStack(alignment: .leading, spacing: 12) {
HStack { HStack {
Label("", systemImage: "bolt.fill") Label("", image: "zap.fill")
.foregroundColor(.orange) .foregroundColor(.orange)
Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.") Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.")
Spacer() Spacer()

View File

@ -32,11 +32,11 @@ struct NIP05Badge: View {
Group { Group {
if nip05_color { if nip05_color {
LINEAR_GRADIENT LINEAR_GRADIENT
.mask(Image(systemName: "checkmark.seal.fill") .mask(Image("check-circle.fill")
.resizable() .resizable()
).frame(width: 14, height: 14) ).frame(width: 14, height: 14)
} else if show_domain { } else if show_domain {
Image(systemName: "checkmark.seal.fill") Image("check-circle.fill")
.font(.footnote) .font(.footnote)
.nip05_colorized(gradient: nip05_color) .nip05_colorized(gradient: nip05_color)
} }

View File

@ -14,7 +14,7 @@ struct Reposted: View {
var body: some View { var body: some View {
HStack(alignment: .center) { HStack(alignment: .center) {
Image(systemName: "arrow.2.squarepath") Image("repost")
.foregroundColor(Color.gray) .foregroundColor(Color.gray)
ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_nip5_domain: false) ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_nip5_domain: false)
.foregroundColor(Color.gray) .foregroundColor(Color.gray)

View File

@ -13,7 +13,7 @@ struct WebsiteLink: View {
var body: some View { var body: some View {
HStack { HStack {
Image(systemName: "link") Image("link")
.foregroundColor(.gray) .foregroundColor(.gray)
.font(.footnote) .font(.footnote)

View File

@ -45,11 +45,11 @@ struct ZapButton: View {
var zap_img: String { var zap_img: String {
switch our_zap { switch our_zap {
case .none: case .none:
return "bolt" return "zap"
case .zap: case .zap:
return "bolt.fill" return "zap.fill"
case .pending: case .pending:
return "bolt.fill" return "zap.fill"
} }
} }
@ -120,9 +120,12 @@ struct ZapButton: View {
HStack(spacing: 4) { HStack(spacing: 4) {
Button(action: { Button(action: {
}, label: { }, label: {
Image(systemName: zap_img) Image(zap_img)
.resizable()
.foregroundColor(zap_color) .foregroundColor(zap_color)
.font(.footnote.weight(.medium)) .font(.footnote.weight(.medium))
.aspectRatio(contentMode: .fit)
.frame(width:20, height: 20)
}) })
if zaps.zap_total > 0 { if zaps.zap_total > 0 {

View File

@ -291,7 +291,7 @@ struct ContentView: View {
self.active_sheet = .filter self.active_sheet = .filter
}) { }) {
// checklist, checklist.checked, lisdt.bullet, list.bullet.circle, line.3.horizontal.decrease..., line.3.horizontail.decrease // checklist, checklist.checked, lisdt.bullet, list.bullet.circle, line.3.horizontal.decrease..., line.3.horizontail.decrease
Label(NSLocalizedString("Filter", comment: "Button label text for filtering relay servers."), systemImage: "line.3.horizontal.decrease") Label(NSLocalizedString("Filter", comment: "Button label text for filtering relay servers."), image: "filter")
.foregroundColor(.gray) .foregroundColor(.gray)
//.contentShape(Rectangle()) //.contentShape(Rectangle())
} }

BIN
damus/Fonts/Inter-Bold.otf Normal file

Binary file not shown.

Binary file not shown.

BIN
damus/Fonts/Inter-Light.otf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

94
damus/Fonts/LICENSE.txt Normal file
View File

@ -0,0 +1,94 @@
Copyright (c) 2016-2020 The Inter Project Authors.
"Inter" is trademark of Rasmus Andersson.
https://github.com/rsms/inter
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION AND CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -70,5 +70,16 @@
<string>Damus needs access to your camera if you want to upload photos from it</string> <string>Damus needs access to your camera if you want to upload photos from it</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>Damus needs access to your microphone if you want to upload recorded videos from it</string> <string>Damus needs access to your microphone if you want to upload recorded videos from it</string>
<key>CFBundleIdentifier</key>
<string></string>
<key>UIAppFonts</key>
<array>
<string>Inter-Regular.otf</string>
<string>Inter-Bold.otf</string>
<string>Inter-Light.otf</string>
<string>Inter-SemiBold.otf</string>
<string>Inter-Medium.otf</string>
<string>Inter-Italic.otf</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@ -0,0 +1,63 @@
//
// FontManager.swift
// damus
//
// Created by Ben Weeks on 27/05/2023.
//
import Foundation
import SwiftUI
struct FontManager {
struct dynamicSize {
public static var largeTitle: CGFloat = UIFont.preferredFont(forTextStyle: .largeTitle).pointSize - 1
public static var title1: CGFloat = UIFont.preferredFont(forTextStyle: .title1).pointSize - 0
public static var title2: CGFloat = UIFont.preferredFont(forTextStyle: .title2).pointSize - 0
public static var title3: CGFloat = UIFont.preferredFont(forTextStyle: .title3).pointSize - 0
public static var body: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize - 1
public static var callout: CGFloat = UIFont.preferredFont(forTextStyle: .callout).pointSize - 1
public static var caption1: CGFloat = UIFont.preferredFont(forTextStyle: .caption1).pointSize - 1
public static var caption2: CGFloat = UIFont.preferredFont(forTextStyle: .caption2).pointSize - 1
public static var footnote: CGFloat = UIFont.preferredFont(forTextStyle: .footnote).pointSize - 1
public static var headline: CGFloat = UIFont.preferredFont(forTextStyle: .headline).pointSize - 1
public static var subheadline: CGFloat = UIFont.preferredFont(forTextStyle: .subheadline).pointSize - 1
// repeat for all the dynamic sizes
}
struct Inter {
static let familyRoot = "Inter"
static let bold = "\(familyRoot)-Bold"
static let regular = "\(familyRoot)-Regular"
static let light = "\(familyRoot)-Light"
static let medium = "\(familyRoot)-Medium"
static let semibold = "\(familyRoot)-SemiBold"
static let italic = "\(familyRoot)-Italic"
static let largeTitle: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.largeTitle)
static let title1: Font = Font.custom(FontManager.Inter.semibold, size: FontManager.dynamicSize.title1)
static let title2: Font = Font.custom(FontManager.Inter.semibold, size: FontManager.dynamicSize.title2)
static let title3: Font = Font.custom(FontManager.Inter.semibold, size: FontManager.dynamicSize.title3)
static let body: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.body)
static let caption1: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.caption1)
static let caption2: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.caption2)
static let footnote: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.footnote)
static let headline: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.headline)
static let subheadline: Font = Font.custom(FontManager.Inter.regular, size: FontManager.dynamicSize.subheadline)
// repeat for other sizes
}
}
extension Font {
public static var largeTitle = FontManager.Inter.largeTitle
public static var title1 = FontManager.Inter.title1
public static var title2 = FontManager.Inter.title2
public static var title3 = FontManager.Inter.title3
public static var body = FontManager.Inter.body
public static var caption1 = FontManager.Inter.caption1
public static var caption2 = FontManager.Inter.caption2
public static var footnote = FontManager.Inter.footnote
public static var headline = FontManager.Inter.headline
public static var subheadline = FontManager.Inter.subheadline
// repeat for the rest of the dynamic sizes
}

View File

@ -43,7 +43,7 @@ struct EventActionBar: View {
HStack { HStack {
if damus_state.keypair.privkey != nil { if damus_state.keypair.privkey != nil {
HStack(spacing: 4) { HStack(spacing: 4) {
EventActionButton(img: "bubble.left", col: bar.replied ? DamusColors.purple : Color.gray) { EventActionButton(img: "bubble2", col: bar.replied ? DamusColors.purple : Color.gray) {
notify(.compose, PostAction.replying_to(event)) notify(.compose, PostAction.replying_to(event))
} }
.accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button")) .accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button"))
@ -55,7 +55,7 @@ struct EventActionBar: View {
Spacer() Spacer()
HStack(spacing: 4) { HStack(spacing: 4) {
EventActionButton(img: "arrow.2.squarepath", col: bar.boosted ? Color.green : nil) { EventActionButton(img: "repost", col: bar.boosted ? Color.green : nil) {
if bar.boosted { if bar.boosted {
notify(.delete, bar.our_boost) notify(.delete, bar.our_boost)
} else { } else {
@ -92,7 +92,7 @@ struct EventActionBar: View {
} }
Spacer() Spacer()
EventActionButton(img: "square.and.arrow.up", col: Color.gray) { EventActionButton(img: "upload", col: Color.gray) {
show_share_action = true show_share_action = true
} }
.accessibilityLabel(NSLocalizedString("Share", comment: "Button to share a post")) .accessibilityLabel(NSLocalizedString("Share", comment: "Button to share a post"))
@ -161,9 +161,12 @@ struct EventActionBar: View {
func EventActionButton(img: String, col: Color?, action: @escaping () -> ()) -> some View { func EventActionButton(img: String, col: Color?, action: @escaping () -> ()) -> some View {
Button(action: action) { Button(action: action) {
Image(systemName: img) Image(img)
.resizable()
.foregroundColor(col == nil ? Color.gray : col!) .foregroundColor(col == nil ? Color.gray : col!)
.font(.footnote.weight(.medium)) .font(.footnote.weight(.medium))
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
} }
} }
@ -188,11 +191,16 @@ struct LikeButton: View {
}) { }) {
if liked { if liked {
LINEAR_GRADIENT LINEAR_GRADIENT
.mask(Image("shaka-full") .mask(Image("shaka.fill")
.resizable() .resizable()
).frame(width: 14, height: 14) .aspectRatio(contentMode: .fit)
)
.frame(width: 20, height: 20)
} else { } else {
Image("shaka-line") Image("shaka")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.foregroundColor(.gray) .foregroundColor(.gray)
} }
} }

View File

@ -28,7 +28,7 @@ struct RepostAction: View {
damus_state.postbox.send(boost) damus_state.postbox.send(boost)
} label: { } label: {
Label(NSLocalizedString("Repost", comment: "Button to repost a note"), systemImage: "arrow.2.squarepath") Label(NSLocalizedString("Repost", comment: "Button to repost a note"), image: "repost")
.frame(maxWidth: .infinity, minHeight: 50, maxHeight: 50, alignment: .leading) .frame(maxWidth: .infinity, minHeight: 50, maxHeight: 50, alignment: .leading)
} }

View File

@ -41,7 +41,7 @@ struct ShareAction: View {
UIPasteboard.general.string = "https://damus.io/" + (bech32_note_id(event.id) ?? event.id) UIPasteboard.general.string = "https://damus.io/" + (bech32_note_id(event.id) ?? event.id)
} }
let bookmarkImg = isBookmarked ? "bookmark.slash" : "bookmark" let bookmarkImg = isBookmarked ? "bookmark.fill" : "bookmark"
let bookmarkTxt = isBookmarked ? NSLocalizedString("Remove Bookmark", comment: "Button text to remove bookmark from a note.") : NSLocalizedString("Add Bookmark", comment: "Button text to add bookmark to a note.") let bookmarkTxt = isBookmarked ? NSLocalizedString("Remove Bookmark", comment: "Button text to remove bookmark from a note.") : NSLocalizedString("Add Bookmark", comment: "Button text to add bookmark to a note.")
ShareActionButton(img: bookmarkImg, text: bookmarkTxt) { ShareActionButton(img: bookmarkImg, text: bookmarkTxt) {
dismiss() dismiss()
@ -54,7 +54,7 @@ struct ShareAction: View {
NotificationCenter.default.post(name: .broadcast_event, object: event) NotificationCenter.default.post(name: .broadcast_event, object: event)
} }
ShareActionButton(img: "square.and.arrow.up", text: NSLocalizedString("Share Via...", comment: "Button to present iOS share sheet")) { ShareActionButton(img: "upload", text: NSLocalizedString("Share Via...", comment: "Button to present iOS share sheet")) {
show_share = true show_share = true
dismiss() dismiss()
} }

View File

@ -27,7 +27,7 @@ struct ShareActionButton: View {
var body: some View { var body: some View {
Button(action: action) { Button(action: action) {
VStack() { VStack() {
Image(systemName: img) Image(img)
.foregroundColor(col) .foregroundColor(col)
.font(.system(size: 23, weight: .bold)) .font(.system(size: 23, weight: .bold))
.overlay { .overlay {
@ -48,6 +48,6 @@ struct ShareActionButton: View {
struct ShareActionButton_Previews: PreviewProvider { struct ShareActionButton_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
ShareActionButton(img: "figure.flexibility", text: "Stretch", action: {}) ShareActionButton(img: "link", text: "Stretch", action: {})
} }
} }

View File

@ -19,7 +19,7 @@ struct AddRelayView: View {
.autocorrectionDisabled(true) .autocorrectionDisabled(true)
.textInputAutocapitalization(.never) .textInputAutocapitalization(.never)
Label("", systemImage: "xmark.circle.fill") Label("", image: "close-circle")
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
.padding(.trailing, -25.0) .padding(.trailing, -25.0)
.opacity((relay == "") ? 0.0 : 1.0) .opacity((relay == "") ? 0.0 : 1.0)
@ -28,7 +28,7 @@ struct AddRelayView: View {
} }
} }
Label("", systemImage: "doc.on.clipboard") Label("", image: "copy2")
.padding(.leading, -10) .padding(.leading, -10)
.onTapGesture { .onTapGesture {
if let pastedrelay = UIPasteboard.general.string { if let pastedrelay = UIPasteboard.general.string {

View File

@ -29,7 +29,7 @@ struct BookmarksView: View {
Group { Group {
if bookmarks.isEmpty { if bookmarks.isEmpty {
VStack { VStack {
Image(systemName: "bookmark") Image("bookmark")
.resizable() .resizable()
.scaledToFit() .scaledToFit()
.frame(width: 32.0, height: 32.0) .frame(width: 32.0, height: 32.0)

View File

@ -21,13 +21,13 @@ struct FriendsButton: View {
}) { }) {
if filter == .friends { if filter == .friends {
LINEAR_GRADIENT LINEAR_GRADIENT
.mask(Image(systemName: "person.2.fill") .mask(Image("user-added")
.resizable() .resizable()
).frame(width: 30, height: 20) ).frame(width: 28, height: 28)
} else { } else {
Image(systemName: "person.2.fill") Image("user-added")
.resizable() .resizable()
.frame(width: 30, height: 20) .frame(width: 28, height: 28)
.foregroundColor(DamusColors.adaptableGrey) .foregroundColor(DamusColors.adaptableGrey)
} }
} }

View File

@ -37,23 +37,23 @@ struct ConfigView: View {
Form { Form {
Section { Section {
NavigationLink(destination: KeySettingsView(keypair: state.keypair)) { NavigationLink(destination: KeySettingsView(keypair: state.keypair)) {
IconLabel(NSLocalizedString("Keys", comment: "Settings section for managing keys"), img_name: "key.fill", color: .purple) IconLabel(NSLocalizedString("Keys", comment: "Settings section for managing keys"), img_name: "key", color: .purple)
} }
NavigationLink(destination: AppearanceSettingsView(settings: settings)) { NavigationLink(destination: AppearanceSettingsView(settings: settings)) {
IconLabel(NSLocalizedString("Appearance", comment: "Section header for text and appearance settings"), img_name: "textformat", color: .red) IconLabel(NSLocalizedString("Appearance", comment: "Section header for text and appearance settings"), img_name: "eye", color: .red)
} }
NavigationLink(destination: NotificationSettingsView(settings: settings)) { NavigationLink(destination: NotificationSettingsView(settings: settings)) {
IconLabel(NSLocalizedString("Notifications", comment: "Section header for Damus notifications"), img_name: "bell.fill", color: .blue) IconLabel(NSLocalizedString("Notifications", comment: "Section header for Damus notifications"), img_name: "notification-bell-on", color: .blue)
} }
NavigationLink(destination: ZapSettingsView(settings: settings)) { NavigationLink(destination: ZapSettingsView(settings: settings)) {
IconLabel(NSLocalizedString("Zaps", comment: "Section header for zap settings"), img_name: "bolt.fill", color: .orange) IconLabel(NSLocalizedString("Zaps", comment: "Section header for zap settings"), img_name: "zap.fill", color: .orange)
} }
NavigationLink(destination: TranslationSettingsView(settings: settings)) { NavigationLink(destination: TranslationSettingsView(settings: settings)) {
IconLabel(NSLocalizedString("Translation", comment: "Section header for text and appearance settings"), img_name: "globe.americas.fill", color: .green) IconLabel(NSLocalizedString("Translation", comment: "Section header for text and appearance settings"), img_name: "globe", color: .green)
} }
} }
@ -66,20 +66,25 @@ struct ConfigView: View {
confirm_logout = true confirm_logout = true
} }
}, label: { }, label: {
Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), systemImage: "pip.exit") Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), image: "logout")
.foregroundColor(textColor()) .foregroundColor(textColor())
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
}) })
} }
if state.is_privkey_user { if state.is_privkey_user {
Section(NSLocalizedString("Permanently Delete Account", comment: "Section title for deleting the user")) { Section(header: Text(NSLocalizedString("Permanently Delete Account", comment: "Section title for deleting the user"))) {
Button(NSLocalizedString("Delete Account", comment: "Button to delete the user's account."), role: .destructive) { Button(action: {
delete_account_warning = true delete_account_warning = true
} }, label: {
Label(NSLocalizedString("Delete Account", comment: "Button to delete the user's account."), image: "delete")
.frame(maxWidth: .infinity, alignment: .leading)
.foregroundColor(.red)
})
} }
} }
if let bundleShortVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"], let bundleVersion = Bundle.main.infoDictionary?["CFBundleVersion"] { if let bundleShortVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"], let bundleVersion = Bundle.main.infoDictionary?["CFBundleVersion"] {
Section(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")) { Section(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")) {
Text(verbatim: "\(bundleShortVersion) (\(bundleVersion))") Text(verbatim: "\(bundleShortVersion) (\(bundleVersion))")

View File

@ -25,70 +25,63 @@ struct CreateAccountView: View {
var body: some View { var body: some View {
ZStack(alignment: .top) { ZStack(alignment: .top) {
DamusGradient() NavigationLink(destination: SaveKeysView(account: account), isActive: $is_done) {
EmptyView()
}
VStack { VStack {
Text("Create Account") VStack(alignment: .center) {
.font(.title.bold()) ProfilePictureSelector(pubkey: account.pubkey, viewModel: profileUploadViewModel, callback: uploadedProfilePicture(image_url:))
.foregroundColor(.white)
ProfilePictureSelector(pubkey: account.pubkey, viewModel: profileUploadViewModel, callback: uploadedProfilePicture(image_url:)) Text(NSLocalizedString("Public Key", comment: "Label to indicate the public key of the account."))
.bold()
HStack(alignment: .top) { .padding()
VStack { .onTapGesture {
Text(verbatim: " ") regen_key()
.foregroundColor(.white)
}
VStack {
SignupForm {
FormLabel(NSLocalizedString("Username", comment: "Label to prompt username entry."))
HStack(spacing: 0.0) {
Text(verbatim: "@")
.foregroundColor(.white)
.padding(.leading, -25.0)
FormTextInput(NSLocalizedString("satoshi", comment: "Example username of Bitcoin creator(s), Satoshi Nakamoto."), text: $account.nick_name)
.autocorrectionDisabled(true)
.textInputAutocapitalization(.never)
}
FormLabel(NSLocalizedString("Display Name", comment: "Label to prompt display name entry."), optional: true)
FormTextInput(NSLocalizedString("Satoshi Nakamoto", comment: "Name of Bitcoin creator(s)."), text: $account.real_name)
.textInputAutocapitalization(.words)
FormLabel(NSLocalizedString("About", comment: "Label to prompt for about text entry for user to describe about themself."), optional: true)
FormTextInput(NSLocalizedString("Creator(s) of Bitcoin. Absolute legend.", comment: "Example description about Bitcoin creator(s), Satoshi Nakamoto."), text: $account.about)
FormLabel(NSLocalizedString("Account ID", comment: "Label to indicate the public ID of the account."))
.onTapGesture {
regen_key()
}
KeyText($account.pubkey)
.onTapGesture {
regen_key()
}
} }
}
KeyText($account.pubkey)
.padding(.horizontal, 20)
.onTapGesture {
regen_key()
}
}
.frame(minWidth: 300, maxWidth: .infinity, minHeight: 300, alignment: .center)
.background {
RoundedRectangle(cornerRadius: 12)
.fill(DamusColors.adaptableGrey, strokeBorder: .gray.opacity(0.5), lineWidth: 1)
} }
NavigationLink(destination: SaveKeysView(account: account), isActive: $is_done) { SignupForm {
EmptyView() FormLabel(NSLocalizedString("Display name", comment: "Label to prompt display name entry."), optional: true)
} FormTextInput(NSLocalizedString("Satoshi Nakamoto", comment: "Name of Bitcoin creator(s)."), text: $account.real_name)
.textInputAutocapitalization(.words)
DamusWhiteButton(NSLocalizedString("Create", comment: "Button to create account.")) { FormLabel(NSLocalizedString("About", comment: "Label to prompt for about text entry for user to describe about themself."), optional: true)
FormTextInput(NSLocalizedString("Creator(s) of Bitcoin. Absolute legend.", comment: "Example description about Bitcoin creator(s), Satoshi Nakamoto."), text: $account.about)
}
.padding(.top, 10)
Button(action: {
self.is_done = true self.is_done = true
}) {
HStack {
Text("Create account now", comment: "Button to create account.")
.fontWeight(.semibold)
}
.frame(minWidth: 300, maxWidth: .infinity, maxHeight: 12, alignment: .center)
} }
.padding() .buttonStyle(GradientButtonStyle())
.disabled(profileUploadViewModel.isLoading) .disabled(profileUploadViewModel.isLoading)
.opacity(profileUploadViewModel.isLoading ? 0.5 : 1) .opacity(profileUploadViewModel.isLoading ? 0.5 : 1)
} .padding(.top, 20)
.padding(.leading, 14.0)
.padding(.trailing, 20.0)
LoginPrompt()
}
.padding()
} }
.dismissKeyboardOnTap() .dismissKeyboardOnTap()
.navigationTitle("Create account")
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true) .navigationBarBackButtonHidden(true)
.navigationBarItems(leading: BackNav()) .navigationBarItems(leading: BackNav())
@ -99,12 +92,27 @@ struct CreateAccountView: View {
} }
} }
struct LoginPrompt: View {
@Environment(\.dismiss) var dismiss
var body: some View {
HStack {
Text("Already on nostr?", comment: "Ask the user if they already have an account on nostr")
.foregroundColor(Color("DamusMediumGrey"))
Button(NSLocalizedString("Login", comment: "Button to navigate to login view.")) {
self.dismiss()
}
Spacer()
}
}
}
struct BackNav: View { struct BackNav: View {
@Environment(\.dismiss) var dismiss @Environment(\.dismiss) var dismiss
var body: some View { var body: some View {
Image(systemName: "chevron.backward") Image("chevron-left")
.foregroundColor(.white) .foregroundColor(.white)
.onTapGesture { .onTapGesture {
self.dismiss() self.dismiss()
} }
@ -136,20 +144,21 @@ func KeyText(_ text: Binding<String>) -> some View {
let bechkey = bech32_encode(hrp: PUBKEY_HRP, decoded) let bechkey = bech32_encode(hrp: PUBKEY_HRP, decoded)
return Text(bechkey) return Text(bechkey)
.textSelection(.enabled) .textSelection(.enabled)
.multilineTextAlignment(.center)
.font(.callout.monospaced()) .font(.callout.monospaced())
.foregroundColor(.white) .foregroundStyle(DamusLogoGradient.gradient)
} }
func FormTextInput(_ title: String, text: Binding<String>) -> some View { func FormTextInput(_ title: String, text: Binding<String>) -> some View {
return TextField("", text: text) return TextField("", text: text)
.placeholder(when: text.wrappedValue.isEmpty) { .placeholder(when: text.wrappedValue.isEmpty) {
Text(title).foregroundColor(.white.opacity(0.4)) Text(title).foregroundColor(.gray.opacity(0.5))
} }
.padding() .padding(15)
.background { .background {
RoundedRectangle(cornerRadius: 4.0).opacity(0.2) RoundedRectangle(cornerRadius: 12)
.stroke(.gray.opacity(0.5), lineWidth: 1)
} }
.foregroundColor(.white)
.font(.body.bold()) .font(.body.bold())
} }
@ -157,11 +166,10 @@ func FormLabel(_ title: String, optional: Bool = false) -> some View {
return HStack { return HStack {
Text(title) Text(title)
.bold() .bold()
.foregroundColor(.white)
if optional { if optional {
Text("optional", comment: "Label indicating that a form input is optional.") Text("- optional", comment: "Label indicating that a form input is optional.")
.font(.callout) .font(.callout)
.foregroundColor(.white.opacity(0.5)) .foregroundColor(DamusColors.mediumGrey)
} }
} }
} }

View File

@ -115,7 +115,7 @@ struct DMChatView: View, KeyboardReadable {
} }
} }
) { ) {
Label("", systemImage: "arrow.right.circle") Label("", image: "send")
.font(.title) .font(.title)
} }
} }

View File

@ -7,28 +7,14 @@
import SwiftUI import SwiftUI
struct EULAView: View { let eula = """
var state: SetupState? **End User License Agreement**
@Environment(\.dismiss) var dismiss
@State var accepted = false
var body: some View { **Introduction**
ZStack {
DamusGradient()
ScrollView {
Text("EULA", comment: "Label indicating that the below text is the EULA, an acronym for End User License Agreement.")
.font(.title.bold())
.foregroundColor(.white)
Text(Markdown.parse(content: """
End User License Agreement
## Introduction
This End User License Agreement ("EULA") is a legal agreement between you and Damus Nostr Inc. for the use of our mobile application Damus. By installing, accessing, or using our application, you agree to be bound by the terms and conditions of this EULA. This End User License Agreement ("EULA") is a legal agreement between you and Damus Nostr Inc. for the use of our mobile application Damus. By installing, accessing, or using our application, you agree to be bound by the terms and conditions of this EULA.
## Prohibited Content and Conduct **Prohibited Content and Conduct**
You agree not to use our application to create, upload, post, send, or store any content that: You agree not to use our application to create, upload, post, send, or store any content that:
@ -40,59 +26,101 @@ You agree not to use our application to create, upload, post, send, or store any
* Is intended to harass or bully others * Is intended to harass or bully others
* Is intended to impersonate others * Is intended to impersonate others
## You also agree not to engage in any conduct that: **You also agree not to engage in any conduct that:**
* Harasses or bullies others * Harasses or bullies others
* Impersonates others * Impersonates others
* Is intended to intimidate or threaten others * Is intended to intimidate or threaten others
* Is intended to promote or incite violence * Is intended to promote or incite violence
## Consequences of Violation **Consequences of Violation**
Any violation of this EULA, including the prohibited content and conduct outlined above, may result in the termination of your access to our application. Any violation of this EULA, including the prohibited content and conduct outlined above, may result in the termination of your access to our application.
## Disclaimer of Warranties and Limitation of Liability **Disclaimer of Warranties and Limitation of Liability**
Our application is provided "as is" and "as available" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. We do not guarantee that our application will be uninterrupted or error-free. In no event shall Damus Nostr Inc. be liable for any damages whatsoever, including but not limited to direct, indirect, special, incidental, or consequential damages, arising out of or in connection with the use or inability to use our application. Our application is provided "as is" and "as available" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. We do not guarantee that our application will be uninterrupted or error-free. In no event shall Damus Nostr Inc. be liable for any damages whatsoever, including but not limited to direct, indirect, special, incidental, or consequential damages, arising out of or in connection with the use or inability to use our application.
## Changes to EULA **Changes to EULA**
We reserve the right to update or modify this EULA at any time and without prior notice. Your continued use of our application following any changes to this EULA will be deemed to be your acceptance of such changes. We reserve the right to update or modify this EULA at any time and without prior notice. Your continued use of our application following any changes to this EULA will be deemed to be your acceptance of such changes.
## Contact Information **Contact Information**
If you have any questions about this EULA, please contact us at damus@jb55.com If you have any questions about this EULA, please contact us at damus@jb55.com
## Acceptance of Terms **Acceptance of Terms**
By using our Application, you signify your acceptance of this EULA. If you do not agree to this EULA, you may not use our Application. By using our Application, you signify your acceptance of this EULA. If you do not agree to this EULA, you may not use our Application.
""")) """
.padding()
if state == .create_account { struct EULAView: View {
NavigationLink(destination: CreateAccountView(), isActive: $accepted) { @State private var login = false
EmptyView() @State var accepted = false
} @Environment(\.colorScheme) var colorScheme
} else { @Environment(\.dismiss) var dismiss
NavigationLink(destination: LoginView(), isActive: $accepted) {
EmptyView() var body: some View {
} ZStack {
} ScrollView {
DamusWhiteButton(NSLocalizedString("Accept", comment: "Button to accept the end user license agreement before being allowed into the app.")) { NavigationLink(destination: LoginView(accepted: $accepted), isActive: $login) {
accepted = true EmptyView()
} }
DamusWhiteButton(NSLocalizedString("Reject", comment: "Button to reject the end user license agreement, which disallows the user from being let into the app.")) { Text(Markdown.parse(content: eula))
dismiss() .padding()
} }
.padding(EdgeInsets(top: 20, leading: 10, bottom: 50, trailing: 10))
VStack {
Spacer()
HStack {
Spacer()
Button(action: {
dismiss()
}) {
HStack {
Text("Reject", comment: "Button to reject the end user license agreement, which disallows the user from being let into the app.")
.fontWeight(.semibold)
}
.frame(minWidth: 75, maxHeight: 12, alignment: .center)
.padding()
.foregroundColor(Color.white)
.background {
RoundedRectangle(cornerRadius: 12)
.fill(DamusColors.darkGrey, strokeBorder: DamusColors.mediumGrey, lineWidth: 1)
}
}
Button(action: {
accepted = true
login.toggle()
}) {
HStack {
Text("Accept", comment: "Button to accept the end user license agreement before being allowed into the app.")
.fontWeight(.semibold)
}
.frame(minWidth: 75, maxHeight: 12, alignment: .center)
}
.buttonStyle(GradientButtonStyle())
}
.padding(.trailing, 30)
} }
.padding()
} }
.background(
Image("eula-bg")
.resizable()
.blur(radius: 70)
.ignoresSafeArea(),
alignment: .top
)
.navigationTitle("EULA")
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true) .navigationBarBackButtonHidden(true)
.navigationBarItems(leading: BackNav()) .navigationBarItems(leading: BackNav())
.foregroundColor(.white)
} }
} }

View File

@ -10,7 +10,7 @@ import SwiftUI
struct EmptyTimelineView: View { struct EmptyTimelineView: View {
var body: some View { var body: some View {
VStack { VStack {
Image(systemName: "tray.fill") Image("question")
.font(.system(size: 35)) .font(.system(size: 35))
.padding() .padding()
Text("Nothing to see here. Check back later!", comment: "Indicates that there are no notes in the timeline to view.") Text("Nothing to see here. Check back later!", comment: "Indicates that there are no notes in the timeline to view.")

View File

@ -17,7 +17,7 @@ import SwiftUI
struct EmptyUserSearchView: View { struct EmptyUserSearchView: View {
var body: some View { var body: some View {
VStack { VStack {
Image(systemName: "person.fill.questionmark") Image("question")
.font(.system(size: 35)) .font(.system(size: 35))
.padding() .padding()
Text("Could not find the user you're looking for", comment: "Indicates that there are no users found.") Text("Could not find the user you're looking for", comment: "Indicates that there are no users found.")

View File

@ -74,7 +74,7 @@ extension View {
Button { Button {
UIPasteboard.general.string = bech32_pubkey UIPasteboard.general.string = bech32_pubkey
} label: { } label: {
Label(NSLocalizedString("Copy Account ID", comment: "Context menu option for copying the ID of the account that created the note."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy Account ID", comment: "Context menu option for copying the ID of the account that created the note."), image: "copy2")
} }
} }
} }

View File

@ -60,25 +60,25 @@ struct MenuItems: View {
Button { Button {
UIPasteboard.general.string = event.get_content(keypair.privkey) UIPasteboard.general.string = event.get_content(keypair.privkey)
} label: { } label: {
Label(NSLocalizedString("Copy text", comment: "Context menu option for copying the text from an note."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy text", comment: "Context menu option for copying the text from an note."), image: "copy2")
} }
Button { Button {
UIPasteboard.general.string = bech32_pubkey(target_pubkey) UIPasteboard.general.string = bech32_pubkey(target_pubkey)
} label: { } label: {
Label(NSLocalizedString("Copy user public key", comment: "Context menu option for copying the ID of the user who created the note."), systemImage: "person") Label(NSLocalizedString("Copy user public key", comment: "Context menu option for copying the ID of the user who created the note."), image: "user")
} }
Button { Button {
UIPasteboard.general.string = bech32_note_id(event.id) ?? event.id UIPasteboard.general.string = bech32_note_id(event.id) ?? event.id
} label: { } label: {
Label(NSLocalizedString("Copy note ID", comment: "Context menu option for copying the ID of the note."), systemImage: "note.text") Label(NSLocalizedString("Copy note ID", comment: "Context menu option for copying the ID of the note."), image: "note-book")
} }
Button { Button {
UIPasteboard.general.string = event_to_json(ev: event) UIPasteboard.general.string = event_to_json(ev: event)
} label: { } label: {
Label(NSLocalizedString("Copy note JSON", comment: "Context menu option for copying the JSON text from the note."), systemImage: "square.on.square") Label(NSLocalizedString("Copy note JSON", comment: "Context menu option for copying the JSON text from the note."), image: "code.on.square")
} }
Button { Button {
@ -88,7 +88,7 @@ struct MenuItems: View {
let imageName = isBookmarked ? "bookmark.fill" : "bookmark" let imageName = isBookmarked ? "bookmark.fill" : "bookmark"
let removeBookmarkString = NSLocalizedString("Remove bookmark", comment: "Context menu option for removing a note bookmark.") let removeBookmarkString = NSLocalizedString("Remove bookmark", comment: "Context menu option for removing a note bookmark.")
let addBookmarkString = NSLocalizedString("Add bookmark", comment: "Context menu option for adding a note bookmark.") let addBookmarkString = NSLocalizedString("Add bookmark", comment: "Context menu option for adding a note bookmark.")
Label(isBookmarked ? removeBookmarkString : addBookmarkString, systemImage: imageName) Label(isBookmarked ? removeBookmarkString : addBookmarkString, image: imageName)
} }
if event.known_kind != .dm { if event.known_kind != .dm {
@ -97,17 +97,17 @@ struct MenuItems: View {
let muted = self.muted_threads.isMutedThread(event, privkey: self.keypair.privkey) let muted = self.muted_threads.isMutedThread(event, privkey: self.keypair.privkey)
isMutedThread = muted isMutedThread = muted
} label: { } label: {
let imageName = isMutedThread ? "speaker" : "speaker.slash" let imageName = isMutedThread ? "mute" : "mute"
let unmuteThreadString = NSLocalizedString("Unmute conversation", comment: "Context menu option for unmuting a conversation.") let unmuteThreadString = NSLocalizedString("Unmute conversation", comment: "Context menu option for unmuting a conversation.")
let muteThreadString = NSLocalizedString("Mute conversation", comment: "Context menu option for muting a conversation.") let muteThreadString = NSLocalizedString("Mute conversation", comment: "Context menu option for muting a conversation.")
Label(isMutedThread ? unmuteThreadString : muteThreadString, systemImage: imageName) Label(isMutedThread ? unmuteThreadString : muteThreadString, image: imageName)
} }
} }
Button { Button {
NotificationCenter.default.post(name: .broadcast_event, object: event) NotificationCenter.default.post(name: .broadcast_event, object: event)
} label: { } label: {
Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), systemImage: "globe") Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), image: "globe")
} }
// Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile. // Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile.
@ -116,13 +116,13 @@ struct MenuItems: View {
let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id)) let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id))
notify(.report, target) notify(.report, target)
} label: { } label: {
Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), systemImage: "exclamationmark.bubble") Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), image: "raising-hand")
} }
Button(role: .destructive) { Button(role: .destructive) {
notify(.mute, target_pubkey) notify(.mute, target_pubkey)
} label: { } label: {
Label(NSLocalizedString("Mute user", comment: "Context menu option for muting users."), systemImage: "exclamationmark.octagon") Label(NSLocalizedString("Mute user", comment: "Context menu option for muting users."), image: "mute")
} }
} }
} }

View File

@ -19,7 +19,7 @@ struct ZapEvent: View {
.padding([.top], 2) .padding([.top], 2)
if zap.is_private { if zap.is_private {
Image(systemName: "lock.fill") Image("lock")
.foregroundColor(DamusColors.green) .foregroundColor(DamusColors.green)
.help(NSLocalizedString("Only you can see this message and who sent it.", comment: "Help text on green lock icon that explains that only the current user can see the message of a zap event and who sent the zap.")) .help(NSLocalizedString("Only you can see this message and who sent it.", comment: "Help text on green lock icon that explains that only the current user can see the message of a zap event and who sent the zap."))
} }

View File

@ -19,24 +19,24 @@ struct ImageContextMenuModifier: ViewModifier {
Button { Button {
UIPasteboard.general.url = url UIPasteboard.general.url = url
} label: { } label: {
Label(NSLocalizedString("Copy Image URL", comment: "Context menu option to copy the URL of an image into clipboard."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy Image URL", comment: "Context menu option to copy the URL of an image into clipboard."), image: "copy2")
} }
if let someImage = image { if let someImage = image {
Button { Button {
UIPasteboard.general.image = someImage UIPasteboard.general.image = someImage
} label: { } label: {
Label(NSLocalizedString("Copy Image", comment: "Context menu option to copy an image into clipboard."), systemImage: "photo.on.rectangle") Label(NSLocalizedString("Copy Image", comment: "Context menu option to copy an image into clipboard."), image: "copy2.fill")
} }
Button { Button {
UIImageWriteToSavedPhotosAlbum(someImage, nil, nil, nil) UIImageWriteToSavedPhotosAlbum(someImage, nil, nil, nil)
} label: { } label: {
Label(NSLocalizedString("Save Image", comment: "Context menu option to save an image."), systemImage: "square.and.arrow.down") Label(NSLocalizedString("Save Image", comment: "Context menu option to save an image."), image: "download")
} }
} }
Button { Button {
showShareSheet = true showShareSheet = true
} label: { } label: {
Label(NSLocalizedString("Share", comment: "Button to share an image."), systemImage: "square.and.arrow.up") Label(NSLocalizedString("Share", comment: "Button to share an image."), image: "upload")
} }
} }
} }

View File

@ -49,7 +49,7 @@ struct NavDismissBarView: View {
Button(action: { Button(action: {
presentationMode.wrappedValue.dismiss() presentationMode.wrappedValue.dismiss()
}, label: { }, label: {
Image(systemName: "xmark") Image("close")
.frame(width: 33, height: 33) .frame(width: 33, height: 33)
.background(.regularMaterial) .background(.regularMaterial)
.clipShape(Circle()) .clipShape(Circle())

View File

@ -33,11 +33,14 @@ enum ParsedKey {
} }
struct LoginView: View { struct LoginView: View {
@State private var create_account = false
@State var key: String = "" @State var key: String = ""
@State var is_pubkey: Bool = false @State var is_pubkey: Bool = false
@State var error: String? = nil @State var error: String? = nil
@State private var credential_handler = CredentialHandler() @State private var credential_handler = CredentialHandler()
@Binding var accepted: Bool
func get_error(parsed_key: ParsedKey?) -> String? { func get_error(parsed_key: ParsedKey?) -> String? {
if self.error != nil { if self.error != nil {
return self.error return self.error
@ -52,27 +55,22 @@ struct LoginView: View {
var body: some View { var body: some View {
ZStack(alignment: .top) { ZStack(alignment: .top) {
DamusGradient() if accepted {
NavigationLink(destination: CreateAccountView(), isActive: $create_account) {
EmptyView()
}
}
VStack { VStack {
Text("Login", comment: "Title of view to log into an account.") SignInHeader()
.foregroundColor(.white) .padding(.top, 100)
.font(.title)
.padding()
Text("Enter your account key to login:", comment: "Prompt for user to enter an account key to login.") SignInEntry(key: $key)
.foregroundColor(.white)
.padding()
KeyInput(NSLocalizedString("nsec1...", comment: "Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key."), key: $key)
let parsed = parse_key(key) let parsed = parse_key(key)
if parsed?.is_hex ?? false { if parsed?.is_hex ?? false {
Text("This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key.", comment: "Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key.") // convert to bech32 here
.font(.subheadline.bold())
.foregroundColor(.white)
PubkeySwitch(isOn: $is_pubkey)
.padding()
} }
if let error = get_error(parsed_key: parsed) { if let error = get_error(parsed_key: parsed) {
@ -83,14 +81,13 @@ struct LoginView: View {
if parsed?.is_pub ?? false { if parsed?.is_pub ?? false {
Text("This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective.", comment: "Warning that the inputted account key is a public key and the result of what happens because of it.") Text("This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective.", comment: "Warning that the inputted account key is a public key and the result of what happens because of it.")
.foregroundColor(.white) .foregroundColor(Color.orange)
.padding() .bold()
} }
Spacer()
if let p = parsed { if let p = parsed {
DamusWhiteButton(NSLocalizedString("Login", comment: "Button to log into account.")) {
Button(action: {
Task { Task {
do { do {
try await process_login(p, is_pubkey: is_pubkey) try await process_login(p, is_pubkey: is_pubkey)
@ -98,11 +95,31 @@ struct LoginView: View {
self.error = error.localizedDescription self.error = error.localizedDescription
} }
} }
}) {
HStack {
Text("Login", comment: "Button to log into account.")
.fontWeight(.semibold)
}
.frame(minWidth: 300, maxWidth: .infinity, maxHeight: 12, alignment: .center)
} }
.buttonStyle(GradientButtonStyle())
.padding(.top, 10)
} }
CreateAccountPrompt(create_account: $create_account)
.padding(.top, 10)
Spacer()
} }
.padding() .padding()
} }
.background(
Image("login-header")
.resizable()
.frame(maxWidth: .infinity, maxHeight: 350, alignment: .center)
.ignoresSafeArea(),
alignment: .top
)
.onAppear { .onAppear {
credential_handler.check_credentials() credential_handler.check_credentials()
} }
@ -111,18 +128,6 @@ struct LoginView: View {
} }
} }
struct PubkeySwitch: View {
@Binding var isOn: Bool
var body: some View {
HStack {
Toggle(isOn: $isOn) {
Text("Public Key?", comment: "Prompt to ask user if the key they entered is a public key.")
.foregroundColor(.white)
}
}
}
}
func parse_key(_ thekey: String) -> ParsedKey? { func parse_key(_ thekey: String) -> ParsedKey? {
var key = thekey var key = thekey
if key.count > 0 && key.first! == "@" { if key.count > 0 && key.first! == "@" {
@ -270,39 +275,90 @@ struct KeyInput: View {
} }
var body: some View { var body: some View {
ZStack(alignment: .leading) { HStack {
Image(systemName: "doc.on.clipboard")
.foregroundColor(.gray)
.onTapGesture {
if let pastedkey = UIPasteboard.general.string {
self.key.wrappedValue = pastedkey
}
}
TextField("", text: key) TextField("", text: key)
.placeholder(when: key.wrappedValue.isEmpty) { .placeholder(when: key.wrappedValue.isEmpty) {
Text(title).foregroundColor(.white.opacity(0.6)) Text(title).foregroundColor(.white.opacity(0.6))
} }
.padding() .padding(10)
.padding(.leading, 20)
.background {
RoundedRectangle(cornerRadius: 4.0).opacity(0.2)
}
.autocapitalization(.none) .autocapitalization(.none)
.foregroundColor(.white) .autocorrectionDisabled(true)
.textInputAutocapitalization(.never)
.font(.body.monospaced()) .font(.body.monospaced())
.textContentType(.password) .textContentType(.password)
}
.padding(.horizontal, 10)
.overlay {
RoundedRectangle(cornerRadius: 12)
.stroke(.gray, lineWidth: 1)
}
}
}
Label("", systemImage: "doc.on.clipboard") struct SignInHeader: View {
.padding(.leading, 10) var body: some View {
.onTapGesture { VStack {
if let pastedkey = UIPasteboard.general.string { Image("logo-nobg")
self.key.wrappedValue = pastedkey .resizable()
} .frame(width: 56, height: 56, alignment: .center)
.shadow(color: DamusColors.purple, radius: 2)
.padding(.bottom)
Text("Sign in", comment: "Title of view to log into an account.")
.font(.system(size: 32, weight: .bold))
.padding(.bottom, 5)
Text("Welcome to the social network you control", comment: "Welcome text")
.foregroundColor(Color("DamusMediumGrey"))
}
}
}
struct SignInEntry: View {
let key: Binding<String>
var body: some View {
VStack(alignment: .leading) {
Text("Enter your account key", comment: "Prompt for user to enter an account key to login.")
.fontWeight(.medium)
.padding(.top, 30)
KeyInput(NSLocalizedString("nsec1...", comment: "Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key."), key: key)
}
}
}
struct CreateAccountPrompt: View {
@Binding var create_account: Bool
var body: some View {
HStack {
Text("New to nostr?", comment: "Ask the user if they are new to nostr")
.foregroundColor(Color("DamusMediumGrey"))
Button(NSLocalizedString("Create account", comment: "Button to navigate to create account view.")) {
create_account.toggle()
} }
Spacer()
} }
} }
} }
struct LoginView_Previews: PreviewProvider { struct LoginView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681" // let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"
let pubkey = "npub18m76awca3y37hkvuneavuw6pjj4525fw90necxmadrvjg0sdy6qsngq955"
let bech32_pubkey = "KeyInput" let bech32_pubkey = "KeyInput"
Group { Group {
LoginView(key: pubkey) LoginView(key: pubkey, accepted: .constant(true))
LoginView(key: bech32_pubkey) LoginView(key: bech32_pubkey, accepted: .constant(true))
} }
} }
} }

View File

@ -55,11 +55,11 @@ struct TabButton: View {
let bits = timeline_to_notification_bits(timeline, ev: nil) let bits = timeline_to_notification_bits(timeline, ev: nil)
new_events = NewEventsBits(rawValue: new_events.rawValue & ~bits.rawValue) new_events = NewEventsBits(rawValue: new_events.rawValue & ~bits.rawValue)
}) { }) {
Label("", systemImage: selected == timeline ? "\(img).fill" : img) Image(selected != timeline ? img : "\(img).fill")
.contentShape(Rectangle()) .contentShape(Rectangle())
.frame(maxWidth: .infinity, minHeight: 30.0) .frame(maxWidth: .infinity, minHeight: 30.0)
} }
.foregroundColor(selected != timeline ? .gray : .primary) .foregroundColor(.primary)
} }
} }
@ -75,10 +75,10 @@ struct TabBar: View {
VStack { VStack {
Divider() Divider()
HStack { HStack {
TabButton(timeline: .home, img: "house", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("1") TabButton(timeline: .home, img: "home", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("1")
TabButton(timeline: .dms, img: "bubble.left.and.bubble.right", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("2") TabButton(timeline: .dms, img: "messages", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("2")
TabButton(timeline: .search, img: "magnifyingglass.circle", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("3") TabButton(timeline: .search, img: "search", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("3")
TabButton(timeline: .notifications, img: "bell", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("4") TabButton(timeline: .notifications, img: "notification-bell", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("4")
} }
} }
} }

View File

@ -29,7 +29,7 @@ struct MutelistView: View {
damus_state.postbox.send(new_ev) damus_state.postbox.send(new_ev)
users = get_mutelist_users(new_ev) users = get_mutelist_users(new_ev)
} label: { } label: {
Label(NSLocalizedString("Delete", comment: "Button to remove a user from their mutelist."), systemImage: "trash") Label(NSLocalizedString("Delete", comment: "Button to remove a user from their mutelist."), image: "delete")
} }
.tint(.red) .tint(.red)
} }

View File

@ -168,7 +168,7 @@ struct EventGroupView: View {
func ZapIcon(_ zapgrp: ZapGroup) -> some View { func ZapIcon(_ zapgrp: ZapGroup) -> some View {
let fmt = format_msats_abbrev(zapgrp.msat_total) let fmt = format_msats_abbrev(zapgrp.msat_total)
return VStack(alignment: .center) { return VStack(alignment: .center) {
Image(systemName: "bolt.fill") Image("zap.fill")
.foregroundColor(.orange) .foregroundColor(.orange)
Text(verbatim: fmt) Text(verbatim: fmt)
.foregroundColor(Color.orange) .foregroundColor(Color.orange)
@ -179,13 +179,15 @@ struct EventGroupView: View {
Group { Group {
switch group { switch group {
case .repost: case .repost:
Image(systemName: "arrow.2.squarepath") Image("repost")
.foregroundColor(DamusColors.green) .foregroundColor(DamusColors.green)
case .reaction: case .reaction:
LINEAR_GRADIENT LINEAR_GRADIENT
.mask(Image("shaka-full") .mask(Image("shaka.fill")
.resizable() .resizable()
).frame(width: 24, height: 24) .aspectRatio(contentMode: .fit)
)
.frame(width: 20, height: 20)
case .profile_zap(let zapgrp): case .profile_zap(let zapgrp):
ZapIcon(zapgrp) ZapIcon(zapgrp)
case .zap(let zapgrp): case .zap(let zapgrp):

View File

@ -67,7 +67,7 @@ struct ParticipantsView: View {
Spacer() Spacer()
Image(systemName: "checkmark.circle.fill") Image("check-circle.fill")
.font(.system(size: 30)) .font(.system(size: 30))
.foregroundColor(references.contains(participant) ? DamusColors.purple : .gray) .foregroundColor(references.contains(participant) ? DamusColors.purple : .gray)
} }

View File

@ -26,7 +26,7 @@ func PostButton(action: @escaping () -> ()) -> some View {
radius: 3, radius: 3,
x: 3, x: 3,
y: 3) y: 3)
Image(systemName: "plus") Image("plus")
.font(.system(.title2)) .font(.system(.title2))
.foregroundColor(Color.white) .foregroundColor(Color.white)
} }

View File

@ -114,7 +114,7 @@ struct PostView: View {
Button(action: { Button(action: {
attach_media = true attach_media = true
}, label: { }, label: {
Image(systemName: "photo") Image("images")
.padding(6) .padding(6)
}) })
} }
@ -123,7 +123,7 @@ struct PostView: View {
Button(action: { Button(action: {
attach_camera = true attach_camera = true
}, label: { }, label: {
Image(systemName: "camera") Image("camera")
.padding(6) .padding(6)
}) })
} }
@ -477,11 +477,11 @@ struct PVImageCarouselView: View {
Button(action: { Button(action: {
UIPasteboard.general.string = uploadedURL.absoluteString UIPasteboard.general.string = uploadedURL.absoluteString
}) { }) {
Label(NSLocalizedString("Copy URL", comment: "Label for button in context menu to copy URL of the selected uploaded media asset."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy URL", comment: "Label for button in context menu to copy URL of the selected uploaded media asset."), image: "copy")
} }
} }
} }
Image(systemName: "xmark.circle.fill") Image("close-circle")
.foregroundColor(.white) .foregroundColor(.white)
.padding(20) .padding(20)
.shadow(radius: 5) .shadow(radius: 5)

View File

@ -39,7 +39,7 @@ struct EditProfilePictureControl: View {
if viewModel.isLoading { if viewModel.isLoading {
ProgressView() ProgressView()
} else { } else {
Image(systemName: "camera") Image("camera")
.resizable() .resizable()
.scaledToFit() .scaledToFit()
.frame(width: 25, height: 25) .frame(width: 25, height: 25)

View File

@ -23,7 +23,8 @@ struct MaybeAnonPfpView: View {
var body: some View { var body: some View {
Group { Group {
if is_anon { if is_anon {
Image(systemName: "person.fill.questionmark") Image("question")
.resizable()
.font(.largeTitle) .font(.largeTitle)
.frame(width: size, height: size) .frame(width: size, height: size)
} else { } else {

View File

@ -168,8 +168,8 @@ struct ProfileView: View {
} }
@ViewBuilder @ViewBuilder
func navImage(systemImage: String) -> some View { func navImage(img: String) -> some View {
Image(systemName: systemImage) Image(img)
.frame(width: 33, height: 33) .frame(width: 33, height: 33)
.background(Color.black.opacity(0.6)) .background(Color.black.opacity(0.6))
.clipShape(Circle()) .clipShape(Circle())
@ -179,7 +179,7 @@ struct ProfileView: View {
Button { Button {
presentationMode.wrappedValue.dismiss() presentationMode.wrappedValue.dismiss()
} label: { } label: {
navImage(systemImage: "chevron.left") navImage(img: "chevron-left")
} }
} }
@ -187,7 +187,7 @@ struct ProfileView: View {
Button(action: { Button(action: {
action_sheet_presented = true action_sheet_presented = true
}) { }) {
navImage(systemImage: "ellipsis") navImage(img: "share3")
} }
.confirmationDialog(NSLocalizedString("Actions", comment: "Title for confirmation dialog to either share, report, or mute a profile."), isPresented: $action_sheet_presented) { .confirmationDialog(NSLocalizedString("Actions", comment: "Title for confirmation dialog to either share, report, or mute a profile."), isPresented: $action_sheet_presented) {
Button(NSLocalizedString("Share", comment: "Button to share the link to a profile.")) { Button(NSLocalizedString("Share", comment: "Button to share the link to a profile.")) {
@ -242,7 +242,7 @@ struct ProfileView: View {
} }
func lnButton(lnurl: String, profile: Profile) -> some View { func lnButton(lnurl: String, profile: Profile) -> some View {
let button_img = profile.reactions == false ? "bolt.brakesignal" : "bolt.circle" let button_img = profile.reactions == false ? "zap.fill" : "zap"
return Button(action: { return Button(action: {
if damus_state.settings.show_wallet_selector { if damus_state.settings.show_wallet_selector {
showing_select_wallet = true showing_select_wallet = true
@ -250,7 +250,8 @@ struct ProfileView: View {
open_with_wallet(wallet: damus_state.settings.default_wallet.model, invoice: lnurl) open_with_wallet(wallet: damus_state.settings.default_wallet.model, invoice: lnurl)
} }
}) { }) {
Image(systemName: button_img) Image(button_img)
.foregroundColor(button_img == "zap.fill" ? .orange : Color.primary)
.profile_button_style(scheme: colorScheme) .profile_button_style(scheme: colorScheme)
.contextMenu { .contextMenu {
if profile.reactions == false { if profile.reactions == false {
@ -261,13 +262,13 @@ struct ProfileView: View {
Button { Button {
UIPasteboard.general.string = addr UIPasteboard.general.string = addr
} label: { } label: {
Label(addr, systemImage: "doc.on.doc") Label(addr, image: "copy2")
} }
} else if let lnurl = profile.lnurl { } else if let lnurl = profile.lnurl {
Button { Button {
UIPasteboard.general.string = lnurl UIPasteboard.general.string = lnurl
} label: { } label: {
Label(NSLocalizedString("Copy LNURL", comment: "Context menu option for copying a user's Lightning URL."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy LNURL", comment: "Context menu option for copying a user's Lightning URL."), image: "copy")
} }
} }
} }
@ -283,7 +284,7 @@ struct ProfileView: View {
let dm_model = damus_state.dms.lookup_or_create(profile.pubkey) let dm_model = damus_state.dms.lookup_or_create(profile.pubkey)
let dmview = DMChatView(damus_state: damus_state, dms: dm_model) let dmview = DMChatView(damus_state: damus_state, dms: dm_model)
return NavigationLink(destination: dmview) { return NavigationLink(destination: dmview) {
Image(systemName: "bubble.left.circle") Image("messages")
.profile_button_style(scheme: colorScheme) .profile_button_style(scheme: colorScheme)
} }
} }
@ -353,7 +354,9 @@ struct ProfileView: View {
var followersCount: some View { var followersCount: some View {
HStack { HStack {
if followers.count == nil { if followers.count == nil {
Image(systemName: "square.and.arrow.down") Image("download")
.resizable()
.frame(width: 20, height: 20)
Text("Followers", comment: "Label describing followers of a user.") Text("Followers", comment: "Label describing followers of a user.")
.font(.subheadline) .font(.subheadline)
.foregroundColor(.gray) .foregroundColor(.gray)
@ -554,7 +557,8 @@ struct KeyView: View {
Label { Label {
Text("Public key", comment: "Label indicating that the text is a user's public account key.") Text("Public key", comment: "Label indicating that the text is a user's public account key.")
} icon: { } icon: {
Image(systemName: "square.on.square.dashed") Image("copy2")
.resizable()
.contentShape(Rectangle()) .contentShape(Rectangle())
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
.frame(width: 20, height: 20) .frame(width: 20, height: 20)
@ -564,7 +568,8 @@ struct KeyView: View {
} }
} else { } else {
HStack { HStack {
Image(systemName: "checkmark.circle") Image("check-circle")
.resizable()
.frame(width: 20, height: 20) .frame(width: 20, height: 20)
Text(NSLocalizedString("Copied", comment: "Label indicating that a user's key was copied.")) Text(NSLocalizedString("Copied", comment: "Label indicating that a user's key was copied."))
.font(.footnote) .font(.footnote)

View File

@ -30,7 +30,7 @@ struct QRCodeView: View {
Button { Button {
presentationMode.wrappedValue.dismiss() presentationMode.wrappedValue.dismiss()
} label: { } label: {
Image(systemName: "xmark") Image("close")
.foregroundColor(.white) .foregroundColor(.white)
.font(.subheadline) .font(.subheadline)
.padding(.leading, 20) .padding(.leading, 20)

View File

@ -52,14 +52,16 @@ struct RecommendedRelayView: View {
Spacer() Spacer()
Image(systemName: "info.circle") Image("info")
.font(.system(size: 20, weight: .regular)) .resizable()
.frame(width: 20, height: 20)
.foregroundColor(Color.accentColor) .foregroundColor(Color.accentColor)
} else { } else {
Spacer() Spacer()
Image(systemName: "questionmark.circle") Image("question")
.font(.system(size: 20, weight: .regular)) .resizable()
.frame(width: 20, height: 20)
.foregroundColor(.gray) .foregroundColor(.gray)
} }
} }
@ -85,7 +87,7 @@ struct RecommendedRelayView: View {
Button { Button {
UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text") UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text")
} label: { } label: {
Label(NSLocalizedString("Copy", comment: "Button to copy a relay server address."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy", comment: "Button to copy a relay server address."), image: "copy")
} }
} }
@ -96,8 +98,9 @@ struct RecommendedRelayView: View {
if showText { if showText {
Text(NSLocalizedString("Connect", comment: "Button to connect to recommended relay server.")) Text(NSLocalizedString("Connect", comment: "Button to connect to recommended relay server."))
} }
Image(systemName: "plus.circle.fill") Image("plus-circle")
.font(.system(size: 20, weight: .medium)) .resizable()
.frame(width: 20, height: 20)
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
.padding(.leading, 5) .padding(.leading, 5)
} }

View File

@ -22,12 +22,12 @@ struct RelayStatus: View {
if relay.id == self.relay { if relay.id == self.relay {
let c = relay.connection let c = relay.connection
if c.isConnected { if c.isConnected {
conn_image = "network" conn_image = "globe"
conn_color = .green conn_color = .green
} else if c.isConnecting { } else if c.isConnecting {
connecting = true connecting = true
} else { } else {
conn_image = "exclamationmark.circle.fill" conn_image = "warning.fill"
conn_color = .red conn_color = .red
} }
} }
@ -38,13 +38,14 @@ struct RelayStatus: View {
HStack { HStack {
if connecting { if connecting {
ProgressView() ProgressView()
.padding(.trailing, 4) .frame(width: 20, height: 20)
.padding(.trailing, 5)
} else { } else {
Image(systemName: conn_image) Image(conn_image)
.frame(width: 8.0, height: 8.0) .resizable()
.frame(width: 20, height: 20)
.foregroundColor(conn_color) .foregroundColor(conn_color)
.padding(.leading, 5) .padding(.trailing, 5)
.padding(.trailing, 10)
} }
} }
.onReceive(timer) { _ in .onReceive(timer) { _ in

View File

@ -14,7 +14,9 @@ struct RelayType: View {
if is_paid { if is_paid {
Image("bitcoin-logo") Image("bitcoin-logo")
} else { } else {
Image(systemName: "globe.americas.fill") Image("globe")
.resizable()
.frame(width: 20, height: 20)
.foregroundColor(.gray) .foregroundColor(.gray)
} }
} }

View File

@ -33,16 +33,21 @@ struct RelayView: View {
NavigationLink("", destination: RelayDetailView(state: state, relay: relay, nip11: meta)).opacity(0.0) NavigationLink("", destination: RelayDetailView(state: state, relay: relay, nip11: meta)).opacity(0.0)
.disabled(showActionButtons) .disabled(showActionButtons)
) )
Spacer() Spacer()
Image(systemName: "info.circle") Image("info")
.font(.system(size: 20, weight: .regular)) .resizable()
.frame(width: 20, height: 20)
.foregroundColor(Color.accentColor) .foregroundColor(Color.accentColor)
} else { } else {
Text(relay) Text(relay)
Spacer() Spacer()
Image(systemName: "questionmark.circle")
.font(.system(size: 20, weight: .regular)) Image("question")
.resizable()
.frame(width: 20, height: 20)
.foregroundColor(.gray) .foregroundColor(.gray)
} }
} }
@ -66,7 +71,7 @@ struct RelayView: View {
Button { Button {
UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text") UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text")
} label: { } label: {
Label(NSLocalizedString("Copy", comment: "Button to copy a relay server address."), systemImage: "doc.on.doc") Label(NSLocalizedString("Copy", comment: "Button to copy a relay server address."), image: "copy2")
} }
} }
@ -87,8 +92,10 @@ struct RelayView: View {
if showText { if showText {
Text(NSLocalizedString("Disconnect", comment: "Button to disconnect from a relay server.")) Text(NSLocalizedString("Disconnect", comment: "Button to disconnect from a relay server."))
} }
Image(systemName: "minus.circle.fill")
.font(.system(size: 20, weight: .medium)) Image("minus-circle")
.resizable()
.frame(width: 20, height: 20)
.foregroundColor(.red) .foregroundColor(.red)
.padding(.leading, 5) .padding(.leading, 5)
} }

View File

@ -23,25 +23,19 @@ struct SaveKeysView: View {
var body: some View { var body: some View {
ZStack(alignment: .top) { ZStack(alignment: .top) {
DamusGradient()
VStack(alignment: .center) { VStack(alignment: .center) {
Text("Welcome, \(account.rendered_name)!", comment: "Text to welcome user.") Text("Welcome, \(account.rendered_name)!", comment: "Text to welcome user.")
.font(.title.bold()) .font(.title.bold())
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
Text("Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus.", comment: "Reminder to user that they should save their account information.") Text("Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus.", comment: "Reminder to user that they should save their account information.")
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
Text("Public Key", comment: "Label to indicate that text below is the user's public key used by others to uniquely refer to the user.") Text("Public Key", comment: "Label to indicate that text below is the user's public key used by others to uniquely refer to the user.")
.font(.title2.bold()) .font(.title2.bold())
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
Text("This is your account ID, you can give this to your friends so that they can follow you. Tap to copy.", comment: "Label to describe that a public key is the user's account ID and what they can do with it.") Text("This is your account ID, you can give this to your friends so that they can follow you. Tap to copy.", comment: "Label to describe that a public key is the user's account ID and what they can do with it.")
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
SaveKeyView(text: account.pubkey_bech32, textContentType: .username, is_copied: $pub_copied, focus: $pubkey_focused) SaveKeyView(text: account.pubkey_bech32, textContentType: .username, is_copied: $pub_copied, focus: $pubkey_focused)
@ -50,11 +44,9 @@ struct SaveKeysView: View {
if pub_copied { if pub_copied {
Text("Private Key", comment: "Label to indicate that the text below is the user's private key used by only the user themself as a secret to login to access their account.") Text("Private Key", comment: "Label to indicate that the text below is the user's private key used by only the user themself as a secret to login to access their account.")
.font(.title2.bold()) .font(.title2.bold())
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
Text("This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!", comment: "Label to describe that a private key is the user's secret account key and what they should do with it.") Text("This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!", comment: "Label to describe that a private key is the user's secret account key and what they should do with it.")
.foregroundColor(.white)
.padding(.bottom, 10) .padding(.bottom, 10)
SaveKeyView(text: account.privkey_bech32, textContentType: .newPassword, is_copied: $priv_copied, focus: $privkey_focused) SaveKeyView(text: account.privkey_bech32, textContentType: .newPassword, is_copied: $priv_copied, focus: $privkey_focused)
@ -68,18 +60,42 @@ struct SaveKeysView: View {
} else if let err = error { } else if let err = error {
Text("Error: \(err)", comment: "Error message indicating why saving keys failed.") Text("Error: \(err)", comment: "Error message indicating why saving keys failed.")
.foregroundColor(.red) .foregroundColor(.red)
DamusWhiteButton(NSLocalizedString("Retry", comment: "Button to retry completing account creation after an error occurred.")) {
Button(action: {
complete_account_creation(account) complete_account_creation(account)
}) {
HStack {
Text("Retry", comment: "Button to retry completing account creation after an error occurred.")
.fontWeight(.semibold)
}
.frame(minWidth: 300, maxWidth: .infinity, maxHeight: 12, alignment: .center)
} }
.buttonStyle(GradientButtonStyle())
.padding(.top, 20)
} else { } else {
DamusWhiteButton(NSLocalizedString("Let's go!", comment: "Button to complete account creation and start using the app.")) { Button(action: {
complete_account_creation(account) complete_account_creation(account)
}) {
HStack {
Text("Let's go!", comment: "Button to complete account creation and start using the app.")
.fontWeight(.semibold)
}
.frame(minWidth: 300, maxWidth: .infinity, maxHeight: 12, alignment: .center)
} }
.buttonStyle(GradientButtonStyle())
.padding(.top, 20)
} }
} }
} }
.padding(20) .padding(20)
} }
.background(
Image("eula-bg")
.resizable()
.blur(radius: 70)
.ignoresSafeArea(),
alignment: .top
)
.navigationBarBackButtonHidden(true) .navigationBarBackButtonHidden(true)
.navigationBarItems(leading: BackNav()) .navigationBarItems(leading: BackNav())
.onAppear { .onAppear {
@ -171,8 +187,8 @@ struct SaveKeyView: View {
VStack { VStack {
spacerBlock(width: 0, height: 0) spacerBlock(width: 0, height: 0)
Button(action: copy_text) { Button(action: copy_text) {
Label("", systemImage: is_copied ? "checkmark.circle.fill" : "doc.on.doc") Label("", image: is_copied ? "check-circle.fill" : "copy2")
.foregroundColor(is_copied ? .green : .white) .foregroundColor(is_copied ? .green : .gray)
.background { .background {
if is_copied { if is_copied {
Circle() Circle()
@ -190,11 +206,10 @@ struct SaveKeyView: View {
TextField("", text: .constant(text)) TextField("", text: .constant(text))
.padding(5) .padding(5)
.background { .background {
RoundedRectangle(cornerRadius: 4.0).opacity(0.2) RoundedRectangle(cornerRadius: 4.0).opacity(0.1)
} }
.textSelection(.enabled) .textSelection(.enabled)
.font(.callout.monospaced()) .font(.callout.monospaced())
.foregroundColor(.white)
.onTapGesture { .onTapGesture {
copy_text() copy_text()
// Hack to force keyboard to hide. Showing keyboard on text field is necessary to register password autofill flow but the text itself should not be modified. // Hack to force keyboard to hide. Showing keyboard on text field is necessary to register password autofill flow but the text itself should not be modified.

View File

@ -20,7 +20,7 @@ struct SearchHomeView: View {
var SearchInput: some View { var SearchInput: some View {
HStack { HStack {
HStack{ HStack{
Image(systemName: "magnifyingglass") Image("search")
.foregroundColor(.gray) .foregroundColor(.gray)
TextField(NSLocalizedString("Search...", comment: "Placeholder text to prompt entry of search query."), text: $search) TextField(NSLocalizedString("Search...", comment: "Placeholder text to prompt entry of search query."), text: $search)
.autocorrectionDisabled(true) .autocorrectionDisabled(true)

View File

@ -28,7 +28,7 @@ struct SelectWalletView: View {
Spacer() Spacer()
Image(systemName: self.invoice_copied ? "checkmark.circle" : "doc.on.doc").foregroundColor(.blue) Image(self.invoice_copied ? "check-circle" : "copy2").foregroundColor(.blue)
}.clipShape(RoundedRectangle(cornerRadius: 5)).onTapGesture { }.clipShape(RoundedRectangle(cornerRadius: 5)).onTapGesture {
UIPasteboard.general.string = invoice UIPasteboard.general.string = invoice
self.invoice_copied = true self.invoice_copied = true

View File

@ -66,7 +66,7 @@ struct KeySettingsView: View {
} }
}) { }) {
let copied = is_pk ? self.pubkey_copied : self.privkey_copied let copied = is_pk ? self.pubkey_copied : self.privkey_copied
Image(systemName: copied ? "checkmark.circle" : "doc.on.doc") Image(copied ? "check-circle" : "copy2")
} }
} }

View File

@ -15,71 +15,125 @@ func hex_col(r: UInt8, g: UInt8, b: UInt8) -> Color {
opacity: 1.0) opacity: 1.0)
} }
enum SetupState {
case home
case create_account
case login
}
struct SetupView: View { struct SetupView: View {
@State var state: SetupState? = .home @State private var eula = false
var body: some View { var body: some View {
NavigationView { NavigationView {
ZStack { ZStack {
DamusGradient()
VStack(alignment: .center) { VStack(alignment: .center) {
NavigationLink(destination: EULAView(state: state), tag: .create_account, selection: $state ) { NavigationLink(destination: EULAView(), isActive: $eula) {
EmptyView()
}
NavigationLink(destination: EULAView(state: state), tag: .login, selection: $state ) {
EmptyView() EmptyView()
} }
Spacer()
Image("logo-nobg") Image("logo-nobg")
.resizable() .resizable()
.frame(width: 128.0, height: 128.0, alignment: .center) .shadow(color: DamusColors.purple, radius: 2)
.padding([.top], 20.0) .frame(width: 56, height: 56, alignment: .center)
Text("Damus", comment: "Name of the app, shown on the first screen when user is not logged in.") .padding(.top, 20.0)
.font(Font.custom("Nunito", size: 50.0))
.kerning(-2)
.foregroundColor(.white)
CarouselView() HStack {
Text("Welcome to", comment: "Welcome text shown on the first screen when user is not logged in.")
DamusWhiteButton(NSLocalizedString("Create Account", comment: "Button to create an account.")) { .font(.title)
self.state = .create_account .fontWeight(.heavy)
Text("Damus")
.font(.title)
.fontWeight(.heavy)
.foregroundStyle(DamusLogoGradient.gradient)
} }
Button(NSLocalizedString("Login", comment: "Button to log into an account.")) { Text("The go-to iOS nostr client", comment: "Quick description of what Damus is")
self.state = .login .foregroundColor(DamusColors.mediumGrey)
.padding(.top, 10)
WhatIsNostr()
.padding()
WhyWeNeedNostr()
.padding()
Spacer()
Button(action: {
eula.toggle()
}) {
HStack {
Text("Let's get started!", comment: "Button to continue to login page.")
.fontWeight(.semibold)
}
.frame(minWidth: 300, maxWidth: .infinity, maxHeight: 12, alignment: .center)
} }
.padding([.top, .bottom], 20) .buttonStyle(GradientButtonStyle())
.foregroundColor(.white) .padding()
} }
} }
.background(
Image("login-header")
.resizable()
.frame(maxWidth: .infinity, maxHeight: 300, alignment: .center)
.ignoresSafeArea(),
alignment: .top
)
} }
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationViewStyle(StackNavigationViewStyle()) .navigationViewStyle(StackNavigationViewStyle())
} }
} }
func DamusWhiteButton(_ title: String, action: @escaping () -> ()) -> some View { struct LearnAboutNostrLink: View {
return Button(action: action) { @Environment(\.openURL) var openURL
Text(title) var body: some View {
.frame(width: 300, height: 50) HStack {
.font(.body.bold()) Button(action: {
.contentShape(Rectangle()) openURL(URL(string: "https://nostr.com")!)
.foregroundColor(.white) }, label: {
.background( Text("Learn more about nostr")
RoundedRectangle(cornerRadius: 4.0) .foregroundColor(.accentColor)
.stroke(Color.white, lineWidth: 2.0) })
.background(Color.white.opacity(0.15))
)
}
Image(systemName: "arrow.up.right")
.font(.footnote)
.foregroundColor(.accentColor)
}
}
}
struct WhatIsNostr: View {
var body: some View {
HStack(alignment: .top) {
Image("nostr-logo")
VStack(alignment: .leading) {
Text("What is nostr?")
.fontWeight(.bold)
.padding(.vertical, 10)
Text("Nostr is a protocol, designed for simplicity, that aims to create a censorship-resistant global social network")
.foregroundColor(DamusColors.mediumGrey)
LearnAboutNostrLink()
.padding(.top, 10)
}
}
}
}
struct WhyWeNeedNostr: View {
var body: some View {
HStack(alignment: .top) {
Image("lightbulb")
VStack(alignment: .leading) {
Text("Why we need nostr?")
.fontWeight(.bold)
.padding(.vertical, 10)
Text("Social media has developed into a key way information flows around the world. Unfortunately, our current social media systems are broken")
.foregroundColor(DamusColors.mediumGrey)
}
}
}
} }
struct SetupView_Previews: PreviewProvider { struct SetupView_Previews: PreviewProvider {

View File

@ -46,36 +46,38 @@ struct SideMenuView: View {
func SidemenuItems(profile_model: ProfileModel, followers: FollowersModel) -> some View { func SidemenuItems(profile_model: ProfileModel, followers: FollowersModel) -> some View {
return VStack(spacing: verticalSpacing) { return VStack(spacing: verticalSpacing) {
NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) { NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) {
navLabel(title: NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), systemImage: "person") navLabel(title: NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), img: "user")
} }
NavigationLink(destination: WalletView(damus_state: damus_state, model: damus_state.wallet)) { NavigationLink(destination: WalletView(damus_state: damus_state, model: damus_state.wallet)) {
navLabel(title: NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."), img: "wallet")
/*
HStack { HStack {
Image("wallet") Image("wallet")
.tint(DamusColors.adaptableBlack) .tint(DamusColors.adaptableBlack)
Text(NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view.")) Text(NSLocalizedString("wallet", comment: "Sidebar menu label for Wallet view."))
.font(.title2) .font(.title2)
.foregroundColor(textColor()) .foregroundColor(textColor())
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
.dynamicTypeSize(.xSmall) .dynamicTypeSize(.xSmall)
} }*/
} }
NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) { NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) {
navLabel(title: NSLocalizedString("Muted", comment: "Sidebar menu label for muted users view."), systemImage: "exclamationmark.octagon") navLabel(title: NSLocalizedString("Muted", comment: "Sidebar menu label for muted users view."), img: "mute")
} }
NavigationLink(destination: RelayConfigView(state: damus_state)) { NavigationLink(destination: RelayConfigView(state: damus_state)) {
navLabel(title: NSLocalizedString("Relays", comment: "Sidebar menu label for Relays view."), systemImage: "network") navLabel(title: NSLocalizedString("Relays", comment: "Sidebar menu label for Relays view."), img: "world-relays")
} }
NavigationLink(destination: BookmarksView(state: damus_state)) { NavigationLink(destination: BookmarksView(state: damus_state)) {
navLabel(title: NSLocalizedString("Bookmarks", comment: "Sidebar menu label for Bookmarks view."), systemImage: "bookmark") navLabel(title: NSLocalizedString("Bookmarks", comment: "Sidebar menu label for Bookmarks view."), img: "bookmark")
} }
NavigationLink(destination: ConfigView(state: damus_state)) { NavigationLink(destination: ConfigView(state: damus_state)) {
navLabel(title: NSLocalizedString("Settings", comment: "Sidebar menu label for accessing the app settings"), systemImage: "gear") navLabel(title: NSLocalizedString("Settings", comment: "Sidebar menu label for accessing the app settings"), img: "settings")
} }
} }
} }
@ -142,7 +144,7 @@ struct SideMenuView: View {
confirm_logout = true confirm_logout = true
} }
}, label: { }, label: {
Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), systemImage: "pip.exit") Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), image: "logout")
.font(.title3) .font(.title3)
.foregroundColor(textColor()) .foregroundColor(textColor())
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
@ -154,7 +156,7 @@ struct SideMenuView: View {
Button(action: { Button(action: {
showQRCode.toggle() showQRCode.toggle()
}, label: { }, label: {
Label("", systemImage: "qrcode") Image("qr-code")
.font(.title) .font(.title)
.foregroundColor(textColor()) .foregroundColor(textColor())
.dynamicTypeSize(.xSmall) .dynamicTypeSize(.xSmall)
@ -187,8 +189,11 @@ struct SideMenuView: View {
@ViewBuilder @ViewBuilder
func navLabel(title: String, systemImage: String) -> some View { func navLabel(title: String, img: String) -> some View {
Label(title, systemImage: systemImage) Image(img)
.tint(DamusColors.adaptableBlack)
Text(title)
.font(.title2) .font(.title2)
.foregroundColor(textColor()) .foregroundColor(textColor())
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)

View File

@ -257,16 +257,16 @@ struct CustomizeZapView: View {
}) { }) {
switch zap_type { switch zap_type {
case .pub: case .pub:
Image(systemName: "person.2") Image("globe")
Text("Public", comment: "Button text to indicate that the zap type is a public zap.") Text("Public", comment: "Button text to indicate that the zap type is a public zap.")
case .anon: case .anon:
Image(systemName: "person.fill.questionmark") Image("question")
Text("Anonymous", comment: "Button text to indicate that the zap type is a anonymous zap.") Text("Anonymous", comment: "Button text to indicate that the zap type is a anonymous zap.")
case .priv: case .priv:
Image(systemName: "lock") Image("lock")
Text("Private", comment: "Button text to indicate that the zap type is a private zap.") Text("Private", comment: "Button text to indicate that the zap type is a private zap.")
case .non_zap: case .non_zap:
Image(systemName: "bolt") Image("zap")
Text("None", comment: "Button text to indicate that the zap type is a private zap.") Text("None", comment: "Button text to indicate that the zap type is a private zap.")
} }
} }

View File

@ -61,10 +61,10 @@ struct ZapTypePicker: View {
} }
} }
} }
ZapTypeSelection(text: "Public", comment: "Picker option to indicate that a zap should be sent publicly and identify the user as who sent it.", img: "person.2.circle.fill", action: {zap_type = ZapType.pub}, type: ZapType.pub) ZapTypeSelection(text: "Public", comment: "Picker option to indicate that a zap should be sent publicly and identify the user as who sent it.", img: "globe", action: {zap_type = ZapType.pub}, type: ZapType.pub)
ZapTypeSelection(text: "Private", comment: "Picker option to indicate that a zap should be sent privately and not identify the user to the public.", img: "lock.circle.fill", action: {zap_type = ZapType.priv}, type: ZapType.priv) ZapTypeSelection(text: "Private", comment: "Picker option to indicate that a zap should be sent privately and not identify the user to the public.", img: "lock", action: {zap_type = ZapType.priv}, type: ZapType.priv)
ZapTypeSelection(text: "Anonymous", comment: "Picker option to indicate that a zap should be sent anonymously and not identify the user as who sent it.", img: "person.crop.circle.fill.badge.questionmark", action: {zap_type = ZapType.anon}, type: ZapType.anon) ZapTypeSelection(text: "Anonymous", comment: "Picker option to indicate that a zap should be sent anonymously and not identify the user as who sent it.", img: "question", action: {zap_type = ZapType.anon}, type: ZapType.anon)
ZapTypeSelection(text: "None", comment: "Picker option to indicate that sats should be sent to the user's wallet as a regular Lightning payment, not as a zap.", img: "bolt.circle.fill", action: {zap_type = ZapType.non_zap}, type: ZapType.non_zap) ZapTypeSelection(text: "None", comment: "Picker option to indicate that sats should be sent to the user's wallet as a regular Lightning payment, not as a zap.", img: "zap", action: {zap_type = ZapType.non_zap}, type: ZapType.non_zap)
} }
.padding(.horizontal) .padding(.horizontal)
} }
@ -73,14 +73,19 @@ struct ZapTypePicker: View {
Button(action: action) { Button(action: action) {
VStack(alignment: .leading, spacing: 5) { VStack(alignment: .leading, spacing: 5) {
HStack { HStack {
Image(systemName: img) Image(img)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.foregroundColor(.gray) .foregroundColor(.gray)
.font(.system(size: 24))
Text(text, comment: comment) Text(text, comment: comment)
.font(.system(size: 20, weight: .semibold)) .font(.system(size: 20, weight: .semibold))
Spacer() Spacer()
} }
.padding(.horizontal) .padding(.horizontal)
Text(zap_type_desc(type: type, profiles: profiles, pubkey: pubkey)) Text(zap_type_desc(type: type, profiles: profiles, pubkey: pubkey))
.padding(.horizontal) .padding(.horizontal)
.foregroundColor(.gray) .foregroundColor(.gray)