damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 51c4fa1e32eaf39cbaa5068278d34751fa1473b3
parent 297aaf86c6130516953f726ffcf5b1e073d2bbf8
Author: William Casarin <jb55@jb55.com>
Date:   Mon, 29 May 2023 15:31:07 -0700

Initial redesign

Changelog-Changed: Redesign phase 1 (text, icons)

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Adamus/Assets.xcassets/eula-bg.imageset/Contents.json | 12++++++++++++
Adamus/Assets.xcassets/eula-bg.imageset/eula-bg.svg | 28++++++++++++++++++++++++++++
Rdamus/Assets.xcassets/iconography/bookmark.fill.fill.imageset/Contents.json -> damus/Assets.xcassets/iconography/bookmark.fill.imageset/Contents.json | 0
Rdamus/Assets.xcassets/iconography/bookmark.fill.fill.imageset/bookmark.fill.fill.svg -> damus/Assets.xcassets/iconography/bookmark.fill.imageset/bookmark.fill.fill.svg | 0
Rdamus/Assets.xcassets/iconography/home.fill.fill.imageset/Contents.json -> damus/Assets.xcassets/iconography/home.fill.imageset/Contents.json | 0
Rdamus/Assets.xcassets/iconography/home.fill.fill.imageset/home.fill.fill.svg -> damus/Assets.xcassets/iconography/home.fill.imageset/home.fill.fill.svg | 0
Adamus/Assets.xcassets/lightbulb.imageset/Contents.json | 12++++++++++++
Adamus/Assets.xcassets/lightbulb.imageset/lightbulb.svg | 14++++++++++++++
Adamus/Assets.xcassets/login-header.imageset/Contents.json | 12++++++++++++
Adamus/Assets.xcassets/login-header.imageset/header.svg | 1399+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adamus/Assets.xcassets/nostr-logo.imageset/Contents.json | 12++++++++++++
Adamus/Assets.xcassets/nostr-logo.imageset/nostr-logo.svg | 10++++++++++
Ddamus/Assets.xcassets/shaka-full.imageset/Contents.json | 15---------------
Ddamus/Assets.xcassets/shaka-full.imageset/shaka-full.pdf | 89-------------------------------------------------------------------------------
Ddamus/Assets.xcassets/shaka-line.imageset/Contents.json | 15---------------
Ddamus/Assets.xcassets/shaka-line.imageset/shaka-line.pdf | 324-------------------------------------------------------------------------------
Adamus/Components/GradientButtonStyle.swift | 45+++++++++++++++++++++++++++++++++++++++++++++
Adamus/Components/Gradients/DamusLogoGradient.swift | 29+++++++++++++++++++++++++++++
Adamus/Components/Gradients/PinkGradient.swift | 30++++++++++++++++++++++++++++++
Mdamus/Components/IconLabel.swift | 2+-
Mdamus/Components/InvoiceView.swift | 6+++---
Mdamus/Components/NIP05Badge.swift | 4++--
Mdamus/Components/Reposted.swift | 2+-
Mdamus/Components/WebsiteLink.swift | 2+-
Mdamus/Components/ZapButton.swift | 11+++++++----
Mdamus/ContentView.swift | 2+-
Adamus/Fonts/Inter-Bold.otf | 0
Adamus/Fonts/Inter-Italic.otf | 0
Adamus/Fonts/Inter-Light.otf | 0
Adamus/Fonts/Inter-Medium.otf | 0
Adamus/Fonts/Inter-Regular.otf | 0
Adamus/Fonts/Inter-SemiBold.otf | 0
Adamus/Fonts/LICENSE.txt | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdamus/Info.plist | 11+++++++++++
Adamus/Util/FontManager.swift | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdamus/Views/ActionBar/EventActionBar.swift | 22+++++++++++++++-------
Mdamus/Views/ActionBar/RepostAction.swift | 2+-
Mdamus/Views/ActionBar/ShareAction.swift | 4++--
Mdamus/Views/ActionBar/ShareActionButton.swift | 4++--
Mdamus/Views/AddRelayView.swift | 4++--
Mdamus/Views/BookmarksView.swift | 2+-
Mdamus/Views/Buttons/FriendsButton.swift | 8++++----
Mdamus/Views/ConfigView.swift | 23++++++++++++++---------
Mdamus/Views/CreateAccountView.swift | 132++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mdamus/Views/DMChatView.swift | 2+-
Mdamus/Views/EULAView.swift | 110+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Mdamus/Views/Empty Views/EmptyTimelineView.swift | 2+-
Mdamus/Views/Empty Views/EmptyUserSearchView.swift | 2+-
Mdamus/Views/EventView.swift | 2+-
Mdamus/Views/Events/EventMenu.swift | 20++++++++++----------
Mdamus/Views/Events/ZapEvent.swift | 2+-
Mdamus/Views/Images/ImageContextMenuModifier.swift | 8++++----
Mdamus/Views/Images/ProfilePicImageView.swift | 2+-
Mdamus/Views/LoginView.swift | 158+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Mdamus/Views/MainTabView.swift | 12++++++------
Mdamus/Views/Muting/MutelistView.swift | 2+-
Mdamus/Views/Notifications/EventGroupView.swift | 10++++++----
Mdamus/Views/ParticipantsView.swift | 2+-
Mdamus/Views/PostButton.swift | 2+-
Mdamus/Views/PostView.swift | 8++++----
Mdamus/Views/Profile/EditProfilePictureControl.swift | 2+-
Mdamus/Views/Profile/MaybeAnonPfpView.swift | 3++-
Mdamus/Views/Profile/ProfileView.swift | 29+++++++++++++++++------------
Mdamus/Views/QRCodeView.swift | 2+-
Mdamus/Views/Relays/RecommendedRelayView.swift | 17++++++++++-------
Mdamus/Views/Relays/RelayStatus.swift | 15++++++++-------
Mdamus/Views/Relays/RelayType.swift | 4+++-
Mdamus/Views/Relays/RelayView.swift | 21++++++++++++++-------
Mdamus/Views/SaveKeysView.swift | 43+++++++++++++++++++++++++++++--------------
Mdamus/Views/SearchHomeView.swift | 2+-
Mdamus/Views/SelectWalletView.swift | 2+-
Mdamus/Views/Settings/KeySettingsView.swift | 2+-
Mdamus/Views/SetupView.swift | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mdamus/Views/SideMenuView.swift | 27++++++++++++++++-----------
Mdamus/Views/Zaps/CustomizeZapView.swift | 8++++----
Mdamus/Views/Zaps/ZapTypePicker.swift | 17+++++++++++------
77 files changed, 2382 insertions(+), 794 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -265,18 +265,21 @@ 4CFF8F6D29CD022E008DB934 /* WideEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6C29CD022E008DB934 /* WideEventView.swift */; }; 4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.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 */; }; 501F8C5529FF5EF6001AFC1D /* PersistedProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5429FF5EF6001AFC1D /* PersistedProfile.swift */; }; 501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C5629FF5FC5001AFC1D /* Damus.xcdatamodeld */; }; 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 */; }; 50B5685329F97CB400A23243 /* CredentialHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B5685229F97CB400A23243 /* CredentialHandler.swift */; }; 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 */; }; 5C513FBA297F72980072348F /* CustomPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FB9297F72980072348F /* CustomPicker.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 */; }; 6439E014296790CF0020672B /* ProfilePicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfilePicImageView.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 */; }; BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.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 */; }; E9E4ED0B295867B900DD7078 /* ThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadView.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>"; }; 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>"; }; - 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>"; }; 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>"; }; 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>"; }; 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>"; }; + 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>"; }; 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>"; }; + 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>"; }; 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>"; }; @@ -728,6 +742,14 @@ 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>"; }; 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>"; }; 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>"; }; @@ -1059,6 +1081,8 @@ 4C7D09712A0AEF5E00943473 /* DamusGradient.swift */, 4C7D09732A0AEF9000943473 /* AlbyGradient.swift */, 4C2859612A12A7F0004746F7 /* GoldSupportGradient.swift */, + 5C6E1DAE2A194075008FC15A /* PinkGradient.swift */, + 5C0707D02A1ECB38004E7B51 /* DamusLogoGradient.swift */, ); path = Gradients; sourceTree = "<group>"; @@ -1110,6 +1134,7 @@ 4CA5588229F33F5B00DC6A45 /* StringCodable.swift */, 50B5685229F97CB400A23243 /* CredentialHandler.swift */, 4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */, + E4AE2ACD2A2286D000680283 /* FontManager.swift */, ); path = Util; sourceTree = "<group>"; @@ -1237,6 +1262,7 @@ 4C1A9A2229DDDB8100516EAC /* IconLabel.swift */, 4C8D00C929DF80350036AF10 /* TruncatedText.swift */, 4C28595F2A12A2BE004746F7 /* SupporterBadge.swift */, + 5C6E1DAC2A193EC2008FC15A /* GradientButtonStyle.swift */, ); path = Components; sourceTree = "<group>"; @@ -1266,6 +1292,7 @@ 4CE6DEE527F7A08100C66700 /* damus */ = { isa = PBXGroup; children = ( + E40B46262A2272E6005E70FD /* Fonts */, F7F0BA23297892AE009531F3 /* Modifiers */, 4C4A3A5A288A1B2200453788 /* damus.entitlements */, 4CE4F9DF285287A000C00DD9 /* Components */, @@ -1422,6 +1449,20 @@ path = Extensions; 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 */ = { isa = PBXGroup; children = ( @@ -1578,10 +1619,17 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; 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 */, 4CE6DEEE27F7A08200C66700 /* Preview Assets.xcassets in Resources */, 3ACB685C297633BC00C46468 /* InfoPlist.strings in Resources */, 50DA11262A16A23F00236234 /* Launch.storyboard in Resources */, + E4AE2AC92A227E6000680283 /* LICENSE.txt in Resources */, 4CE6DEEB27F7A08200C66700 /* Assets.xcassets in Resources */, 4C198DF129F88C6B004C165C /* License.txt in Resources */, 4C198DF029F88C6B004C165C /* Readme.md in Resources */, @@ -1702,6 +1750,7 @@ 4C75EFB128049D510006080F /* NostrResponse.swift in Sources */, 4C7D09592A05BEAD00943473 /* KeyboardVisible.swift in Sources */, 4CEE2AF7280B2DEA00AB5EEF /* ProfileName.swift in Sources */, + E4AE2ACE2A2286D000680283 /* FontManager.swift in Sources */, 4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */, 31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */, F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */, @@ -1770,6 +1819,7 @@ 4C363A9C282838B9006E126D /* EventRef.swift in Sources */, 4C7D095F2A098C5D00943473 /* ConnectWalletView.swift in Sources */, 3AA24802297E3DC20090C62D /* RepostView.swift in Sources */, + 5C6E1DAF2A194075008FC15A /* PinkGradient.swift in Sources */, 4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */, 4C3EA66528FF5F6800C48A62 /* mem.c in Sources */, 4C198DEF29F88C6B004C165C /* BlurHashEncode.swift in Sources */, @@ -1785,6 +1835,7 @@ 4CB88396296F7F8B00DC99E7 /* ReactionView.swift in Sources */, 4CFF8F6B29CD0079008DB934 /* RepostedEvent.swift in Sources */, 4C8682872814DE470026224F /* ProfileView.swift in Sources */, + 5C0707D12A1ECB38004E7B51 /* DamusLogoGradient.swift in Sources */, 4C5F9114283D694D0052CD1C /* FollowTarget.swift in Sources */, 4CF0ABD629817F5B00D66079 /* ReportView.swift in Sources */, 4C1A9A2729DDE31900516EAC /* TranslationSettingsView.swift in Sources */, @@ -1792,6 +1843,7 @@ 4CF0ABD82981980C00D66079 /* Lists.swift in Sources */, 501F8C5829FF5FC5001AFC1D /* Damus.xcdatamodeld in Sources */, 4C30AC8029A6A53F00E2BD5A /* ProfilePicturesView.swift in Sources */, + 5C6E1DAD2A193EC2008FC15A /* GradientButtonStyle.swift in Sources */, 4C8EC52529D1FA6C0085D9A8 /* DamusColors.swift in Sources */, 4C5C7E6A284EDE2E00A22DF5 /* SearchResultsView.swift in Sources */, 4CE1399429F0669900AC6A0B /* BigButton.swift in Sources */, diff --git a/damus/Assets.xcassets/eula-bg.imageset/Contents.json b/damus/Assets.xcassets/eula-bg.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "eula-bg.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/eula-bg.imageset/eula-bg.svg b/damus/Assets.xcassets/eula-bg.imageset/eula-bg.svg @@ -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> diff --git a/damus/Assets.xcassets/iconography/bookmark.fill.fill.imageset/Contents.json b/damus/Assets.xcassets/iconography/bookmark.fill.imageset/Contents.json diff --git a/damus/Assets.xcassets/iconography/bookmark.fill.fill.imageset/bookmark.fill.fill.svg b/damus/Assets.xcassets/iconography/bookmark.fill.imageset/bookmark.fill.fill.svg diff --git a/damus/Assets.xcassets/iconography/home.fill.fill.imageset/Contents.json b/damus/Assets.xcassets/iconography/home.fill.imageset/Contents.json diff --git a/damus/Assets.xcassets/iconography/home.fill.fill.imageset/home.fill.fill.svg b/damus/Assets.xcassets/iconography/home.fill.imageset/home.fill.fill.svg diff --git a/damus/Assets.xcassets/lightbulb.imageset/Contents.json b/damus/Assets.xcassets/lightbulb.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "lightbulb.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/lightbulb.imageset/lightbulb.svg b/damus/Assets.xcassets/lightbulb.imageset/lightbulb.svg @@ -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> diff --git a/damus/Assets.xcassets/login-header.imageset/Contents.json b/damus/Assets.xcassets/login-header.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "header.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/login-header.imageset/header.svg b/damus/Assets.xcassets/login-header.imageset/header.svg @@ -0,0 +1,1399 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="430" + height="265" + viewBox="0 0 430 265" + fill="none" + version="1.1" + id="svg423" + sodipodi:docname="header.svg" + inkscape:version="1.2.2 (b0a84865, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview425" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="4.1082967" + inkscape:cx="169.90009" + inkscape:cy="189.49459" + inkscape:window-width="2560" + inkscape:window-height="1311" + inkscape:window-x="0" + inkscape:window-y="288" + inkscape:window-maximized="0" + inkscape:current-layer="svg423" /> + <g + opacity="0.7" + id="g116"> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 694 0)" + stroke="url(#paint0_linear_1843_42364)" + stroke-opacity="0.1" + id="line2" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 670 0)" + stroke="url(#paint1_linear_1843_42364)" + stroke-opacity="0.1" + id="line4" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 646 0)" + stroke="url(#paint2_linear_1843_42364)" + stroke-opacity="0.1" + id="line6" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 622 0)" + stroke="url(#paint3_linear_1843_42364)" + stroke-opacity="0.1" + id="line8" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 598 0)" + stroke="url(#paint4_linear_1843_42364)" + stroke-opacity="0.1" + id="line10" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 574 0)" + stroke="url(#paint5_linear_1843_42364)" + stroke-opacity="0.1" + id="line12" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 550 0)" + stroke="url(#paint6_linear_1843_42364)" + stroke-opacity="0.1" + id="line14" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 526 0)" + stroke="url(#paint7_linear_1843_42364)" + stroke-opacity="0.1" + id="line16" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 502 0)" + stroke="url(#paint8_linear_1843_42364)" + stroke-opacity="0.1" + id="line18" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 478 0)" + stroke="url(#paint9_linear_1843_42364)" + stroke-opacity="0.1" + id="line20" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 454 0)" + stroke="url(#paint10_linear_1843_42364)" + stroke-opacity="0.1" + id="line22" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 430 0)" + stroke="url(#paint11_linear_1843_42364)" + stroke-opacity="0.1" + id="line24" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 406 0)" + stroke="url(#paint12_linear_1843_42364)" + stroke-opacity="0.1" + id="line26" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 382 0)" + stroke="url(#paint13_linear_1843_42364)" + stroke-opacity="0.1" + id="line28" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 358 0)" + stroke="url(#paint14_linear_1843_42364)" + stroke-opacity="0.1" + id="line30" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 334 0)" + stroke="url(#paint15_linear_1843_42364)" + stroke-opacity="0.1" + id="line32" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 310 0)" + stroke="url(#paint16_linear_1843_42364)" + stroke-opacity="0.1" + id="line34" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 286 0)" + stroke="url(#paint17_linear_1843_42364)" + stroke-opacity="0.1" + id="line36" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 262 0)" + stroke="url(#paint18_linear_1843_42364)" + stroke-opacity="0.1" + id="line38" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 238 0)" + stroke="url(#paint19_linear_1843_42364)" + stroke-opacity="0.1" + id="line40" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 214 0)" + stroke="url(#paint20_linear_1843_42364)" + stroke-opacity="0.1" + id="line42" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 190 0)" + stroke="url(#paint21_linear_1843_42364)" + stroke-opacity="0.1" + id="line44" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 166 0)" + stroke="url(#paint22_linear_1843_42364)" + stroke-opacity="0.1" + id="line46" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 142 0)" + stroke="url(#paint23_linear_1843_42364)" + stroke-opacity="0.1" + id="line48" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 118 0)" + stroke="url(#paint24_linear_1843_42364)" + stroke-opacity="0.1" + id="line50" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 94 0)" + stroke="url(#paint25_linear_1843_42364)" + stroke-opacity="0.1" + id="line52" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 70 0)" + stroke="url(#paint26_linear_1843_42364)" + stroke-opacity="0.1" + id="line54" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 46 0)" + stroke="url(#paint27_linear_1843_42364)" + stroke-opacity="0.1" + id="line56" /> + <line + y1="-0.5" + x2="373.352" + y2="-0.5" + transform="matrix(-0.707107 0.707107 0.707107 0.707107 22 0)" + stroke="url(#paint28_linear_1843_42364)" + stroke-opacity="0.1" + id="line58" /> + <line + x1="-241.646" + y1="-0.353553" + x2="22.3536" + y2="263.646" + stroke="url(#paint29_linear_1843_42364)" + stroke-opacity="0.1" + id="line60" /> + <line + x1="-217.646" + y1="-0.353553" + x2="46.3536" + y2="263.646" + stroke="url(#paint30_linear_1843_42364)" + stroke-opacity="0.1" + id="line62" /> + <line + x1="-193.646" + y1="-0.353553" + x2="70.3536" + y2="263.646" + stroke="url(#paint31_linear_1843_42364)" + stroke-opacity="0.1" + id="line64" /> + <line + x1="-169.646" + y1="-0.353553" + x2="94.3536" + y2="263.646" + stroke="url(#paint32_linear_1843_42364)" + stroke-opacity="0.1" + id="line66" /> + <line + x1="-145.646" + y1="-0.353553" + x2="118.354" + y2="263.646" + stroke="url(#paint33_linear_1843_42364)" + stroke-opacity="0.1" + id="line68" /> + <line + x1="-121.646" + y1="-0.353553" + x2="142.354" + y2="263.646" + stroke="url(#paint34_linear_1843_42364)" + stroke-opacity="0.1" + id="line70" /> + <line + x1="-97.6464" + y1="-0.353553" + x2="166.354" + y2="263.646" + stroke="url(#paint35_linear_1843_42364)" + stroke-opacity="0.1" + id="line72" /> + <line + x1="-73.6464" + y1="-0.353553" + x2="190.354" + y2="263.646" + stroke="url(#paint36_linear_1843_42364)" + stroke-opacity="0.1" + id="line74" /> + <line + x1="-49.6464" + y1="-0.353553" + x2="214.354" + y2="263.646" + stroke="url(#paint37_linear_1843_42364)" + stroke-opacity="0.1" + id="line76" /> + <line + x1="-25.6464" + y1="-0.353553" + x2="238.354" + y2="263.646" + stroke="url(#paint38_linear_1843_42364)" + stroke-opacity="0.1" + id="line78" /> + <line + x1="-1.64645" + y1="-0.353553" + x2="262.354" + y2="263.646" + stroke="url(#paint39_linear_1843_42364)" + stroke-opacity="0.1" + id="line80" /> + <line + x1="22.3536" + y1="-0.353553" + x2="286.354" + y2="263.646" + stroke="url(#paint40_linear_1843_42364)" + stroke-opacity="0.1" + id="line82" /> + <line + x1="46.3536" + y1="-0.353553" + x2="310.354" + y2="263.646" + stroke="url(#paint41_linear_1843_42364)" + stroke-opacity="0.1" + id="line84" /> + <line + x1="70.3536" + y1="-0.353553" + x2="334.354" + y2="263.646" + stroke="url(#paint42_linear_1843_42364)" + stroke-opacity="0.1" + id="line86" /> + <line + x1="94.3536" + y1="-0.353553" + x2="358.354" + y2="263.646" + stroke="url(#paint43_linear_1843_42364)" + stroke-opacity="0.1" + id="line88" /> + <line + x1="118.354" + y1="-0.353553" + x2="382.354" + y2="263.646" + stroke="url(#paint44_linear_1843_42364)" + stroke-opacity="0.1" + id="line90" /> + <line + x1="142.354" + y1="-0.353553" + x2="406.354" + y2="263.646" + stroke="url(#paint45_linear_1843_42364)" + stroke-opacity="0.1" + id="line92" /> + <line + x1="166.354" + y1="-0.353553" + x2="430.354" + y2="263.646" + stroke="url(#paint46_linear_1843_42364)" + stroke-opacity="0.1" + id="line94" /> + <line + x1="190.354" + y1="-0.353553" + x2="454.354" + y2="263.646" + stroke="url(#paint47_linear_1843_42364)" + stroke-opacity="0.1" + id="line96" /> + <line + x1="214.354" + y1="-0.353553" + x2="478.354" + y2="263.646" + stroke="url(#paint48_linear_1843_42364)" + stroke-opacity="0.1" + id="line98" /> + <line + x1="238.354" + y1="-0.353553" + x2="502.354" + y2="263.646" + stroke="url(#paint49_linear_1843_42364)" + stroke-opacity="0.1" + id="line100" /> + <line + x1="262.354" + y1="-0.353553" + x2="526.354" + y2="263.646" + stroke="url(#paint50_linear_1843_42364)" + stroke-opacity="0.1" + id="line102" /> + <line + x1="286.354" + y1="-0.353553" + x2="550.354" + y2="263.646" + stroke="url(#paint51_linear_1843_42364)" + stroke-opacity="0.1" + id="line104" /> + <line + x1="310.354" + y1="-0.353553" + x2="574.354" + y2="263.646" + stroke="url(#paint52_linear_1843_42364)" + stroke-opacity="0.1" + id="line106" /> + <line + x1="334.354" + y1="-0.353553" + x2="598.354" + y2="263.646" + stroke="url(#paint53_linear_1843_42364)" + stroke-opacity="0.1" + id="line108" /> + <line + x1="358.354" + y1="-0.353553" + x2="622.354" + y2="263.646" + stroke="url(#paint54_linear_1843_42364)" + stroke-opacity="0.1" + id="line110" /> + <line + x1="382.354" + y1="-0.353553" + x2="646.354" + y2="263.646" + stroke="url(#paint55_linear_1843_42364)" + stroke-opacity="0.1" + id="line112" /> + <line + x1="406.354" + y1="-0.353553" + x2="670.354" + y2="263.646" + stroke="url(#paint56_linear_1843_42364)" + stroke-opacity="0.1" + id="line114" /> + </g> + <mask + id="path-58-outside-1_1843_42364" + maskUnits="userSpaceOnUse" + x="0" + y="0" + width="428" + height="265" + fill="black"> + <rect + fill="white" + width="428" + height="265" + id="rect118" /> + <path + d="M0 0H428V264H0V0Z" + id="path120" /> + </mask> + <path + d="M0 0H428V264H0V0Z" + fill="url(#paint57_linear_1843_42364)" + id="path123" /> + <defs + id="defs421"> + <linearGradient + id="paint0_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop127" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop129" /> + </linearGradient> + <linearGradient + id="paint1_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop132" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop134" /> + </linearGradient> + <linearGradient + id="paint2_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop137" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop139" /> + </linearGradient> + <linearGradient + id="paint3_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop142" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop144" /> + </linearGradient> + <linearGradient + id="paint4_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop147" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop149" /> + </linearGradient> + <linearGradient + id="paint5_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop152" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop154" /> + </linearGradient> + <linearGradient + id="paint6_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop157" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop159" /> + </linearGradient> + <linearGradient + id="paint7_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop162" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop164" /> + </linearGradient> + <linearGradient + id="paint8_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop167" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop169" /> + </linearGradient> + <linearGradient + id="paint9_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop172" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop174" /> + </linearGradient> + <linearGradient + id="paint10_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop177" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop179" /> + </linearGradient> + <linearGradient + id="paint11_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop182" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop184" /> + </linearGradient> + <linearGradient + id="paint12_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop187" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop189" /> + </linearGradient> + <linearGradient + id="paint13_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop192" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop194" /> + </linearGradient> + <linearGradient + id="paint14_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop197" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop199" /> + </linearGradient> + <linearGradient + id="paint15_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop202" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop204" /> + </linearGradient> + <linearGradient + id="paint16_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop207" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop209" /> + </linearGradient> + <linearGradient + id="paint17_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop212" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop214" /> + </linearGradient> + <linearGradient + id="paint18_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop217" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop219" /> + </linearGradient> + <linearGradient + id="paint19_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop222" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop224" /> + </linearGradient> + <linearGradient + id="paint20_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop227" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop229" /> + </linearGradient> + <linearGradient + id="paint21_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop232" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop234" /> + </linearGradient> + <linearGradient + id="paint22_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop237" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop239" /> + </linearGradient> + <linearGradient + id="paint23_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop242" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop244" /> + </linearGradient> + <linearGradient + id="paint24_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop247" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop249" /> + </linearGradient> + <linearGradient + id="paint25_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop252" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop254" /> + </linearGradient> + <linearGradient + id="paint26_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop257" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop259" /> + </linearGradient> + <linearGradient + id="paint27_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop262" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop264" /> + </linearGradient> + <linearGradient + id="paint28_linear_1843_42364" + x1="299.326" + y1="0.0948276" + x2="299.323" + y2="1.3952" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop267" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop269" /> + </linearGradient> + <linearGradient + id="paint29_linear_1843_42364" + x1="-30.4119" + y1="211.722" + x2="-31.3334" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop272" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop274" /> + </linearGradient> + <linearGradient + id="paint30_linear_1843_42364" + x1="-6.41188" + y1="211.722" + x2="-7.33341" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop277" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop279" /> + </linearGradient> + <linearGradient + id="paint31_linear_1843_42364" + x1="17.5881" + y1="211.722" + x2="16.6666" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop282" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop284" /> + </linearGradient> + <linearGradient + id="paint32_linear_1843_42364" + x1="41.5881" + y1="211.722" + x2="40.6666" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop287" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop289" /> + </linearGradient> + <linearGradient + id="paint33_linear_1843_42364" + x1="65.5881" + y1="211.722" + x2="64.6666" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop292" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop294" /> + </linearGradient> + <linearGradient + id="paint34_linear_1843_42364" + x1="89.5881" + y1="211.722" + x2="88.6666" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop297" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop299" /> + </linearGradient> + <linearGradient + id="paint35_linear_1843_42364" + x1="113.588" + y1="211.722" + x2="112.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop302" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop304" /> + </linearGradient> + <linearGradient + id="paint36_linear_1843_42364" + x1="137.588" + y1="211.722" + x2="136.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop307" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop309" /> + </linearGradient> + <linearGradient + id="paint37_linear_1843_42364" + x1="161.588" + y1="211.722" + x2="160.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop312" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop314" /> + </linearGradient> + <linearGradient + id="paint38_linear_1843_42364" + x1="185.588" + y1="211.722" + x2="184.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop317" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop319" /> + </linearGradient> + <linearGradient + id="paint39_linear_1843_42364" + x1="209.588" + y1="211.722" + x2="208.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop322" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop324" /> + </linearGradient> + <linearGradient + id="paint40_linear_1843_42364" + x1="233.588" + y1="211.722" + x2="232.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop327" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop329" /> + </linearGradient> + <linearGradient + id="paint41_linear_1843_42364" + x1="257.588" + y1="211.722" + x2="256.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop332" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop334" /> + </linearGradient> + <linearGradient + id="paint42_linear_1843_42364" + x1="281.588" + y1="211.722" + x2="280.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop337" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop339" /> + </linearGradient> + <linearGradient + id="paint43_linear_1843_42364" + x1="305.588" + y1="211.722" + x2="304.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop342" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop344" /> + </linearGradient> + <linearGradient + id="paint44_linear_1843_42364" + x1="329.588" + y1="211.722" + x2="328.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop347" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop349" /> + </linearGradient> + <linearGradient + id="paint45_linear_1843_42364" + x1="353.588" + y1="211.722" + x2="352.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop352" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop354" /> + </linearGradient> + <linearGradient + id="paint46_linear_1843_42364" + x1="377.588" + y1="211.722" + x2="376.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop357" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop359" /> + </linearGradient> + <linearGradient + id="paint47_linear_1843_42364" + x1="401.588" + y1="211.722" + x2="400.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop362" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop364" /> + </linearGradient> + <linearGradient + id="paint48_linear_1843_42364" + x1="425.588" + y1="211.722" + x2="424.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop367" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop369" /> + </linearGradient> + <linearGradient + id="paint49_linear_1843_42364" + x1="449.588" + y1="211.722" + x2="448.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop372" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop374" /> + </linearGradient> + <linearGradient + id="paint50_linear_1843_42364" + x1="473.588" + y1="211.722" + x2="472.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop377" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop379" /> + </linearGradient> + <linearGradient + id="paint51_linear_1843_42364" + x1="497.588" + y1="211.722" + x2="496.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop382" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop384" /> + </linearGradient> + <linearGradient + id="paint52_linear_1843_42364" + x1="521.588" + y1="211.722" + x2="520.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop387" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop389" /> + </linearGradient> + <linearGradient + id="paint53_linear_1843_42364" + x1="545.588" + y1="211.722" + x2="544.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop392" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop394" /> + </linearGradient> + <linearGradient + id="paint54_linear_1843_42364" + x1="569.588" + y1="211.722" + x2="568.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop397" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop399" /> + </linearGradient> + <linearGradient + id="paint55_linear_1843_42364" + x1="593.588" + y1="211.722" + x2="592.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop402" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop404" /> + </linearGradient> + <linearGradient + id="paint56_linear_1843_42364" + x1="617.588" + y1="211.722" + x2="616.667" + y2="212.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#885BFE" + id="stop407" /> + <stop + offset="1" + stop-color="#CA0FFD" + id="stop409" /> + </linearGradient> + <linearGradient + id="paint57_linear_1843_42364" + x1="214" + y1="0" + x2="214" + y2="264" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#1DD6FF" + stop-opacity="0.32" + id="stop412" /> + <stop + offset="0.322917" + stop-color="#7D68FE" + stop-opacity="0.16" + id="stop414" /> + <stop + offset="0.625" + stop-color="#C812FD" + stop-opacity="0.08" + id="stop416" /> + <stop + offset="1" + stop-opacity="0" + id="stop418" /> + </linearGradient> + </defs> +</svg> diff --git a/damus/Assets.xcassets/nostr-logo.imageset/Contents.json b/damus/Assets.xcassets/nostr-logo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "nostr-logo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/nostr-logo.imageset/nostr-logo.svg b/damus/Assets.xcassets/nostr-logo.imageset/nostr-logo.svg @@ -0,0 +1,10 @@ +<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_42338)"/> +<path d="M33.6649 10.5871C33.5711 10.6312 33.4064 10.7231 33.3011 10.7901C33.056 10.9452 32.9756 10.9816 32.876 10.9816C32.8052 10.9816 32.7937 10.9873 32.7937 11.0237C32.7937 11.0448 32.8167 11.0926 32.8435 11.129L32.8933 11.1941L32.855 11.2649C32.6099 11.7398 32.5276 11.9523 32.4491 12.3123C32.3418 12.8139 32.3667 13.5473 32.518 14.3132C32.6099 14.7803 32.7171 15.1767 32.966 15.9694C33.2685 16.9325 33.5021 17.773 33.5787 18.1617C33.6304 18.4298 33.6936 19.0195 33.6936 19.232C33.6936 19.546 33.6189 19.9328 33.5175 20.1473C33.4083 20.3828 33.1805 20.5723 32.9699 20.6049C32.876 20.6202 32.8741 20.6489 32.9603 20.6776C32.9947 20.6891 33.0254 20.7044 33.033 20.7121C33.0579 20.737 32.9852 20.8385 32.8473 20.9687C32.6156 21.1889 32.3361 21.3018 32.0202 21.3018C31.6372 21.3018 31.3941 21.1352 30.6186 20.3311C30.1725 19.8715 29.5827 19.3182 29.4621 19.2454C29.4028 19.211 29.4008 19.211 29.4104 19.2454C29.4162 19.2665 29.4276 19.3144 29.4353 19.3527C29.4506 19.4465 29.4257 19.4465 29.3109 19.3507C29.1672 19.232 28.9892 19.1248 28.8322 19.0635C28.5756 18.9659 28.4224 18.9429 27.9112 18.9295L27.4421 18.918L27.3176 18.8395C27.1262 18.7189 27.0783 18.7093 26.7528 18.7131C26.3967 18.7189 26.2512 18.6997 25.8261 18.5906C25.2919 18.4547 25.1732 18.4623 24.3326 18.7074C23.6931 18.8931 23.4863 18.9333 22.8755 18.9946C22.4926 19.031 22.1767 19.031 21.9258 18.9927C21.8148 18.9755 21.721 18.9659 21.7133 18.9716C21.7076 18.9793 21.7248 19.0138 21.7535 19.0501L21.8052 19.1171L21.7612 19.1267C21.7363 19.1325 21.6444 19.142 21.5582 19.1478C21.3418 19.165 21.2576 19.1976 21.1389 19.3144C21.0432 19.4082 21.0355 19.412 20.8708 19.4369C20.7559 19.4561 20.664 19.4848 20.5779 19.5288C19.9958 19.8294 19.9441 19.8467 19.6761 19.8467C19.5841 19.8467 19.4463 19.8332 19.3697 19.8179C19.2931 19.8007 19.228 19.793 19.2204 19.7988C19.2146 19.8045 19.2204 19.8371 19.2338 19.8696C19.2452 19.9041 19.2529 19.9347 19.2472 19.9386C19.2433 19.9443 19.2012 19.9386 19.1572 19.9252C19.1112 19.9137 18.96 19.8945 18.8202 19.8811C18.5081 19.8524 18.15 19.8792 17.8226 19.9577L17.6043 20.0075L17.702 20.0515C17.8035 20.0956 17.8475 20.1473 17.8284 20.199C17.8226 20.2143 17.7307 20.2717 17.6273 20.3253C17.1467 20.5723 16.6412 21.0606 16.2353 21.6714C16.0247 21.9892 15.8371 22.2936 15.8198 22.3511C15.8083 22.3913 15.8103 22.3932 15.8849 22.3817C15.9539 22.3702 15.9634 22.3741 15.9634 22.4047C15.9634 22.4258 15.9347 22.4909 15.8983 22.5502C15.8103 22.6938 15.7528 22.8585 15.6552 23.2376C15.5058 23.8254 15.3929 24.0877 15.1899 24.3271C15.1171 24.4113 15.0922 24.4553 15.1076 24.4649C15.121 24.4726 15.1842 24.4802 15.2512 24.4802C15.322 24.4802 15.3699 24.4879 15.3699 24.5013C15.3699 24.5128 15.3469 24.5511 15.3182 24.5875C15.2569 24.6698 15.2722 24.6889 15.4101 24.7023C15.6169 24.7234 15.6073 24.7138 15.592 24.8593C15.5843 24.9302 15.5709 25.1044 15.5633 25.2461C15.5537 25.3878 15.5326 25.5601 15.5135 25.6291C15.4714 25.7918 15.3699 25.9929 15.2531 26.1441C15.2014 26.2111 15.1593 26.2724 15.1593 26.282C15.1593 26.2896 15.1918 26.303 15.232 26.3088C15.2703 26.3145 15.3258 26.3241 15.3546 26.3279C15.4771 26.3471 15.9003 26.2686 16.1358 26.1824C16.3291 26.1116 16.6125 25.9584 16.8021 25.8224C16.9055 25.7497 17.0127 25.6788 17.0433 25.6693C17.0721 25.6578 17.1774 25.6482 17.2788 25.6482C17.7901 25.6482 18.3932 25.4606 18.7455 25.1906C18.8106 25.1408 18.8834 25.0891 18.9044 25.0776C18.9523 25.0527 18.9638 25.0623 19.0155 25.1657C19.0557 25.2423 19.0882 25.227 19.1246 25.1159C19.1821 24.9379 19.3103 24.733 19.3946 24.6889C19.4425 24.6621 19.4674 24.6832 19.5822 24.8536C19.6339 24.9264 19.722 25.0355 19.7814 25.0929C19.8407 25.1504 19.8886 25.2136 19.8886 25.2365C19.8886 25.2576 19.8503 25.3514 19.8024 25.4472C19.722 25.608 19.6473 25.8339 19.6684 25.855C19.6741 25.8607 19.7201 25.8244 19.7718 25.7765C19.8675 25.6865 19.9269 25.6635 19.9269 25.7114C19.9269 25.7267 19.9077 25.8052 19.8867 25.8895C19.8369 26.0752 19.8254 26.416 19.8675 26.4888L19.8943 26.5366L19.9633 26.4581C20.0437 26.3662 20.1892 26.2896 20.4439 26.2073C20.6392 26.1441 20.7981 26.1173 21.1044 26.0982C21.2097 26.0905 21.4089 26.0733 21.5448 26.058C22.1039 25.9929 22.0905 25.9909 22.2494 26.1652C22.3758 26.303 22.483 26.3854 22.5749 26.4141C22.6132 26.4256 22.6458 26.4428 22.6458 26.4505C22.6458 26.4734 22.6036 26.5175 22.5022 26.5979C22.4505 26.6381 22.213 26.8526 21.9756 27.0727C21.1638 27.8271 21.091 27.8674 20.3213 28.0033C20.1969 28.0263 20.0437 28.0588 19.9824 28.078C19.6167 28.1929 19.3161 28.4858 18.9217 29.1138C18.7244 29.4298 18.6115 29.5753 18.3626 29.8472C18.0256 30.211 17.7269 30.4848 16.8729 31.2085C15.9213 32.0165 15.4369 32.6196 15.1593 33.3396C15.0367 33.6555 14.9601 33.7283 14.7457 33.7283C14.6729 33.7283 14.5657 33.7149 14.5083 33.6995C14.3666 33.6612 14.0411 33.6612 13.9319 33.6995C13.8802 33.7187 13.8151 33.7627 13.7654 33.8183C13.6869 33.9044 13.683 33.9063 13.5949 33.8929C13.5471 33.8872 13.4667 33.8585 13.4188 33.8297C12.875 33.5157 12.7065 33.4564 12.3351 33.4545C12.0938 33.4525 12 33.5062 12 33.6459C12 33.7302 12.0594 33.8087 12.2336 33.9446C12.3906 34.071 12.4863 34.1801 12.898 34.7182C13.009 34.8637 13.0512 34.902 13.1431 34.9479C13.2484 34.9977 13.2675 35.0015 13.4935 34.9996C13.6256 34.9996 13.7807 34.9881 13.8381 34.9728C13.8956 34.9594 14.0909 34.9116 14.2689 34.8656C14.807 34.7277 14.8587 34.7201 15.2473 34.7048C15.5939 34.6933 15.6207 34.6894 15.7203 34.6397C15.8658 34.5688 15.9826 34.4348 16.1626 34.1284C16.603 33.3779 16.7121 33.2075 16.917 32.9298C17.3363 32.3688 17.815 31.8174 18.3645 31.266C18.9083 30.7222 19.0691 30.6111 19.5918 30.4254C19.9058 30.3124 20.1566 30.1899 20.3768 30.0444C20.5702 29.9142 20.8689 29.6251 20.9417 29.4968C20.9685 29.4508 21.0489 29.3512 21.1197 29.2747C21.3112 29.0717 21.4586 29.0028 21.9565 28.886C22.2724 28.8094 22.3949 28.7673 22.7032 28.6313C23.0689 28.4686 23.1244 28.4513 23.584 28.3575C23.8099 28.3116 24.0416 28.2637 24.0952 28.2503C24.1507 28.2369 24.2024 28.2311 24.2082 28.2388C24.2158 28.2445 24.2369 28.3345 24.2579 28.4379C24.2847 28.5777 24.2982 28.7424 24.3058 29.0717C24.3173 29.5791 24.3001 29.8089 24.2158 30.2301C24.1201 30.703 24.0148 30.9826 23.7908 31.3636C23.6778 31.5512 23.6491 31.6834 23.6797 31.8538C23.7237 32.095 23.7965 32.1927 24.0129 32.298C24.1948 32.388 24.3364 32.3975 24.6964 32.3516C24.9358 32.321 25.1636 32.3095 25.6633 32.3018C26.9404 32.2788 27.5991 32.3688 29.1079 32.7633C29.6383 32.903 29.6976 32.9279 29.8278 33.0715C29.9657 33.2228 30.0442 33.397 30.1629 33.8144C30.1993 33.9408 30.2433 34.0633 30.2586 34.0882C30.339 34.2089 30.5554 34.3027 30.7584 34.3027C30.9671 34.3027 30.9958 34.1935 30.8618 33.9082C30.7699 33.7129 30.7603 33.623 30.8292 33.5923C30.8886 33.5636 30.969 33.6019 31.0245 33.6842C31.0475 33.7187 31.1107 33.8508 31.1681 33.9772C31.2773 34.2299 31.3711 34.3544 31.4994 34.4233C31.5664 34.4578 31.6066 34.4635 31.7598 34.4616C31.8995 34.4578 31.9704 34.4673 32.0642 34.498C32.2346 34.5535 32.7018 34.5592 32.8358 34.5075C33.0541 34.4233 33.1039 34.2299 32.9507 34.0653C32.9067 34.0193 32.7363 33.9274 32.4299 33.7914C32.294 33.7302 32.0489 33.554 31.9512 33.4487C31.8153 33.2994 31.7387 33.1807 31.5223 32.792C31.2696 32.3401 31.193 32.2233 31.0207 32.0433C30.9096 31.9265 30.8407 31.8729 30.7373 31.8231C30.5209 31.7159 30.5746 31.7217 29.0792 31.6604C28.6522 31.6432 27.8997 31.5915 27.8231 31.5742C27.8021 31.5704 27.6585 31.5512 27.5072 31.5359C27.1645 31.4976 26.3679 31.354 26.1439 31.287C25.8663 31.2066 25.5331 31.0209 25.4336 30.8888C25.3723 30.8083 25.3321 30.6935 25.3053 30.5307C25.2632 30.255 25.3972 29.9257 25.805 29.3053C26.0444 28.9415 26.1746 28.6983 26.2454 28.4858C26.3048 28.3039 26.3603 27.9459 26.3603 27.7352C26.3603 27.5897 26.3679 27.5399 26.3909 27.517C26.4292 27.4787 26.4388 27.4825 26.7585 27.7123C26.8983 27.8118 27.0802 27.9305 27.1606 27.9746C27.3196 28.0646 27.4134 28.1316 27.4134 28.1565C27.4134 28.1641 27.3866 28.189 27.3521 28.2101L27.2908 28.2503L27.3464 28.2714C27.5532 28.3499 27.9303 28.3709 28.7001 28.346C29.0562 28.3345 29.3606 28.3288 29.376 28.3365C29.3913 28.3422 29.4047 28.3652 29.4047 28.3882C29.4047 28.4264 29.4104 28.4284 29.5081 28.4169C29.7187 28.392 30.0174 28.2618 30.3237 28.0588C30.4941 27.9478 30.5133 27.9382 30.6492 27.9267C30.9575 27.8999 31.0877 27.7774 31.6506 26.9789C31.8191 26.7415 31.9244 26.6247 31.9742 26.6247C31.978 26.6247 31.978 26.6764 31.9742 26.7396C31.9704 26.8028 31.9742 26.8545 31.9838 26.8545C32.0278 26.8545 32.2518 26.5768 32.3897 26.3509C32.6137 25.9833 32.7056 25.7439 32.9086 24.9876C33.1115 24.2332 33.1211 24.2026 33.1671 24.2026C33.1958 24.2026 33.2092 24.2218 33.2226 24.2792C33.2475 24.3807 33.2456 24.3788 33.303 24.3251C33.3796 24.2562 33.5002 24.0705 33.5979 23.8771C33.6457 23.7814 33.6936 23.7048 33.7032 23.7048C33.7147 23.7048 33.7242 23.7373 33.7281 23.7756C33.7319 23.8158 33.7415 23.8484 33.7511 23.8484C33.7874 23.8484 33.9291 23.655 34.0172 23.4846C34.0727 23.3774 34.1838 23.0902 34.2853 22.7896C34.381 22.5081 34.5035 22.1807 34.5571 22.062C34.8099 21.5105 34.9382 21.0548 35.0282 20.4019C35.076 20.0381 35.076 18.9544 35.0282 18.5351C34.9841 18.1617 34.9267 17.8094 34.8788 17.6064C34.7907 17.235 34.5878 16.6204 34.4327 16.2547C34.1838 15.6688 34.0153 15.1748 33.9349 14.7918C33.843 14.3553 33.843 13.6966 33.9368 13.3175C33.9961 13.0724 34.0938 12.9269 34.2546 12.8465C34.3772 12.7833 34.4806 12.6876 34.6127 12.5133C34.8424 12.2108 34.965 12.1323 35.5758 11.8987C36.0544 11.7149 36.2402 11.6058 36.2402 11.5081C36.2402 11.4296 36.1598 11.399 35.907 11.3779C35.6926 11.3607 35.1698 11.2439 35.0665 11.1884C35.0473 11.1788 35.0148 11.1328 34.9956 11.085C34.9516 10.9835 34.8061 10.8226 34.6912 10.748C34.584 10.681 34.5533 10.679 34.6146 10.7461C34.6605 10.7958 34.6586 10.7958 34.5897 10.7403C34.5495 10.7097 34.5093 10.6618 34.4997 10.6331C34.4825 10.5833 34.4729 10.5795 34.3848 10.5795C34.2891 10.5795 34.1914 10.5488 34.1914 10.5182C34.1914 10.5105 34.111 10.5029 34.0153 10.5048C33.8468 10.5048 33.8276 10.5105 33.6649 10.5871ZM34.718 10.8284C34.7371 10.8495 34.7486 10.8667 34.7429 10.8667C34.7371 10.8667 34.718 10.8495 34.6988 10.8284C34.6797 10.8073 34.6682 10.7901 34.6739 10.7901C34.6797 10.7901 34.6988 10.8073 34.718 10.8284Z" fill="#CC43C5"/> +<defs> +<linearGradient id="paint0_linear_1843_42338" x1="38.4828" y1="4.55172" x2="7.86207" y2="41.7931" gradientUnits="userSpaceOnUse"> +<stop stop-color="#D34CD9"/> +<stop offset="1" stop-color="#F869B6"/> +</linearGradient> +</defs> +</svg> diff --git a/damus/Assets.xcassets/shaka-full.imageset/Contents.json b/damus/Assets.xcassets/shaka-full.imageset/Contents.json @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "shaka-full.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/damus/Assets.xcassets/shaka-full.imageset/shaka-full.pdf b/damus/Assets.xcassets/shaka-full.imageset/shaka-full.pdf @@ -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- \ No newline at end of file diff --git a/damus/Assets.xcassets/shaka-line.imageset/Contents.json b/damus/Assets.xcassets/shaka-line.imageset/Contents.json @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "shaka-line.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/damus/Assets.xcassets/shaka-line.imageset/shaka-line.pdf b/damus/Assets.xcassets/shaka-line.imageset/shaka-line.pdf @@ -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- \ No newline at end of file diff --git a/damus/Components/GradientButtonStyle.swift b/damus/Components/GradientButtonStyle.swift @@ -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() + } + } +} diff --git a/damus/Components/Gradients/DamusLogoGradient.swift b/damus/Components/Gradients/DamusLogoGradient.swift @@ -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() + } +} diff --git a/damus/Components/Gradients/PinkGradient.swift b/damus/Components/Gradients/PinkGradient.swift @@ -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() + } +} + diff --git a/damus/Components/IconLabel.swift b/damus/Components/IconLabel.swift @@ -21,7 +21,7 @@ struct IconLabel: View { var body: some View { HStack(spacing: 0) { - Image(systemName: img_name) + Image(img_name) .foregroundColor(img_color) .frame(width: 20) .padding([.trailing], 20) diff --git a/damus/Components/InvoiceView.swift b/damus/Components/InvoiceView.swift @@ -25,10 +25,10 @@ struct InvoiceView: View { UIPasteboard.general.string = invoice.string } label: { if !copied { - Image(systemName: "doc.on.clipboard") + Image("copy2") .foregroundColor(.gray) } else { - Image(systemName: "checkmark.circle") + Image("check-circle") .foregroundColor(DamusColors.green) } } @@ -63,7 +63,7 @@ struct InvoiceView: View { VStack(alignment: .leading, spacing: 12) { HStack { - Label("", systemImage: "bolt.fill") + Label("", image: "zap.fill") .foregroundColor(.orange) Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.") Spacer() diff --git a/damus/Components/NIP05Badge.swift b/damus/Components/NIP05Badge.swift @@ -32,11 +32,11 @@ struct NIP05Badge: View { Group { if nip05_color { LINEAR_GRADIENT - .mask(Image(systemName: "checkmark.seal.fill") + .mask(Image("check-circle.fill") .resizable() ).frame(width: 14, height: 14) } else if show_domain { - Image(systemName: "checkmark.seal.fill") + Image("check-circle.fill") .font(.footnote) .nip05_colorized(gradient: nip05_color) } diff --git a/damus/Components/Reposted.swift b/damus/Components/Reposted.swift @@ -14,7 +14,7 @@ struct Reposted: View { var body: some View { HStack(alignment: .center) { - Image(systemName: "arrow.2.squarepath") + Image("repost") .foregroundColor(Color.gray) ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_nip5_domain: false) .foregroundColor(Color.gray) diff --git a/damus/Components/WebsiteLink.swift b/damus/Components/WebsiteLink.swift @@ -13,7 +13,7 @@ struct WebsiteLink: View { var body: some View { HStack { - Image(systemName: "link") + Image("link") .foregroundColor(.gray) .font(.footnote) diff --git a/damus/Components/ZapButton.swift b/damus/Components/ZapButton.swift @@ -45,11 +45,11 @@ struct ZapButton: View { var zap_img: String { switch our_zap { case .none: - return "bolt" + return "zap" case .zap: - return "bolt.fill" + return "zap.fill" case .pending: - return "bolt.fill" + return "zap.fill" } } @@ -120,9 +120,12 @@ struct ZapButton: View { HStack(spacing: 4) { Button(action: { }, label: { - Image(systemName: zap_img) + Image(zap_img) + .resizable() .foregroundColor(zap_color) .font(.footnote.weight(.medium)) + .aspectRatio(contentMode: .fit) + .frame(width:20, height: 20) }) if zaps.zap_total > 0 { diff --git a/damus/ContentView.swift b/damus/ContentView.swift @@ -291,7 +291,7 @@ struct ContentView: View { self.active_sheet = .filter }) { // 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) //.contentShape(Rectangle()) } diff --git a/damus/Fonts/Inter-Bold.otf b/damus/Fonts/Inter-Bold.otf Binary files differ. diff --git a/damus/Fonts/Inter-Italic.otf b/damus/Fonts/Inter-Italic.otf Binary files differ. diff --git a/damus/Fonts/Inter-Light.otf b/damus/Fonts/Inter-Light.otf Binary files differ. diff --git a/damus/Fonts/Inter-Medium.otf b/damus/Fonts/Inter-Medium.otf Binary files differ. diff --git a/damus/Fonts/Inter-Regular.otf b/damus/Fonts/Inter-Regular.otf Binary files differ. diff --git a/damus/Fonts/Inter-SemiBold.otf b/damus/Fonts/Inter-SemiBold.otf Binary files differ. diff --git a/damus/Fonts/LICENSE.txt b/damus/Fonts/LICENSE.txt @@ -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. diff --git a/damus/Info.plist b/damus/Info.plist @@ -70,5 +70,16 @@ <string>Damus needs access to your camera if you want to upload photos from it</string> <key>NSMicrophoneUsageDescription</key> <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> </plist> diff --git a/damus/Util/FontManager.swift b/damus/Util/FontManager.swift @@ -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 +} diff --git a/damus/Views/ActionBar/EventActionBar.swift b/damus/Views/ActionBar/EventActionBar.swift @@ -43,7 +43,7 @@ struct EventActionBar: View { HStack { if damus_state.keypair.privkey != nil { 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)) } .accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button")) @@ -55,7 +55,7 @@ struct EventActionBar: View { Spacer() 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 { notify(.delete, bar.our_boost) } else { @@ -92,7 +92,7 @@ struct EventActionBar: View { } Spacer() - EventActionButton(img: "square.and.arrow.up", col: Color.gray) { + EventActionButton(img: "upload", col: Color.gray) { show_share_action = true } .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 { Button(action: action) { - Image(systemName: img) + Image(img) + .resizable() .foregroundColor(col == nil ? Color.gray : col!) .font(.footnote.weight(.medium)) + .aspectRatio(contentMode: .fit) + .frame(width: 20, height: 20) } } @@ -188,11 +191,16 @@ struct LikeButton: View { }) { if liked { LINEAR_GRADIENT - .mask(Image("shaka-full") + .mask(Image("shaka.fill") .resizable() - ).frame(width: 14, height: 14) + .aspectRatio(contentMode: .fit) + ) + .frame(width: 20, height: 20) } else { - Image("shaka-line") + Image("shaka") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 20, height: 20) .foregroundColor(.gray) } } diff --git a/damus/Views/ActionBar/RepostAction.swift b/damus/Views/ActionBar/RepostAction.swift @@ -28,7 +28,7 @@ struct RepostAction: View { damus_state.postbox.send(boost) } 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) } diff --git a/damus/Views/ActionBar/ShareAction.swift b/damus/Views/ActionBar/ShareAction.swift @@ -41,7 +41,7 @@ struct ShareAction: View { 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.") ShareActionButton(img: bookmarkImg, text: bookmarkTxt) { dismiss() @@ -54,7 +54,7 @@ struct ShareAction: View { 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 dismiss() } diff --git a/damus/Views/ActionBar/ShareActionButton.swift b/damus/Views/ActionBar/ShareActionButton.swift @@ -27,7 +27,7 @@ struct ShareActionButton: View { var body: some View { Button(action: action) { VStack() { - Image(systemName: img) + Image(img) .foregroundColor(col) .font(.system(size: 23, weight: .bold)) .overlay { @@ -48,6 +48,6 @@ struct ShareActionButton: View { struct ShareActionButton_Previews: PreviewProvider { static var previews: some View { - ShareActionButton(img: "figure.flexibility", text: "Stretch", action: {}) + ShareActionButton(img: "link", text: "Stretch", action: {}) } } diff --git a/damus/Views/AddRelayView.swift b/damus/Views/AddRelayView.swift @@ -19,7 +19,7 @@ struct AddRelayView: View { .autocorrectionDisabled(true) .textInputAutocapitalization(.never) - Label("", systemImage: "xmark.circle.fill") + Label("", image: "close-circle") .foregroundColor(.accentColor) .padding(.trailing, -25.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) .onTapGesture { if let pastedrelay = UIPasteboard.general.string { diff --git a/damus/Views/BookmarksView.swift b/damus/Views/BookmarksView.swift @@ -29,7 +29,7 @@ struct BookmarksView: View { Group { if bookmarks.isEmpty { VStack { - Image(systemName: "bookmark") + Image("bookmark") .resizable() .scaledToFit() .frame(width: 32.0, height: 32.0) diff --git a/damus/Views/Buttons/FriendsButton.swift b/damus/Views/Buttons/FriendsButton.swift @@ -21,13 +21,13 @@ struct FriendsButton: View { }) { if filter == .friends { LINEAR_GRADIENT - .mask(Image(systemName: "person.2.fill") + .mask(Image("user-added") .resizable() - ).frame(width: 30, height: 20) + ).frame(width: 28, height: 28) } else { - Image(systemName: "person.2.fill") + Image("user-added") .resizable() - .frame(width: 30, height: 20) + .frame(width: 28, height: 28) .foregroundColor(DamusColors.adaptableGrey) } } diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift @@ -37,23 +37,23 @@ struct ConfigView: View { Form { Section { 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)) { - 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)) { - 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)) { - 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)) { - 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 } }, 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()) .frame(maxWidth: .infinity, alignment: .leading) }) } if state.is_privkey_user { - Section(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) { + Section(header: Text(NSLocalizedString("Permanently Delete Account", comment: "Section title for deleting the user"))) { + Button(action: { 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"] { Section(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")) { Text(verbatim: "\(bundleShortVersion) (\(bundleVersion))") diff --git a/damus/Views/CreateAccountView.swift b/damus/Views/CreateAccountView.swift @@ -25,70 +25,63 @@ struct CreateAccountView: View { var body: some View { ZStack(alignment: .top) { - DamusGradient() + NavigationLink(destination: SaveKeysView(account: account), isActive: $is_done) { + EmptyView() + } VStack { - Text("Create Account") - .font(.title.bold()) - .foregroundColor(.white) - - ProfilePictureSelector(pubkey: account.pubkey, viewModel: profileUploadViewModel, callback: uploadedProfilePicture(image_url:)) - - HStack(alignment: .top) { - VStack { - Text(verbatim: " ") - .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() - } + VStack(alignment: .center) { + 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() + .padding() + .onTapGesture { + regen_key() + } + + KeyText($account.pubkey) + .padding(.horizontal, 20) + .onTapGesture { + regen_key() } - } } - - NavigationLink(destination: SaveKeysView(account: account), isActive: $is_done) { - EmptyView() + .frame(minWidth: 300, maxWidth: .infinity, minHeight: 300, alignment: .center) + .background { + RoundedRectangle(cornerRadius: 12) + .fill(DamusColors.adaptableGrey, strokeBorder: .gray.opacity(0.5), lineWidth: 1) } - DamusWhiteButton(NSLocalizedString("Create", comment: "Button to create account.")) { + SignupForm { + 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) + } + .padding(.top, 10) + + Button(action: { 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) .opacity(profileUploadViewModel.isLoading ? 0.5 : 1) + .padding(.top, 20) + + LoginPrompt() } - .padding(.leading, 14.0) - .padding(.trailing, 20.0) - + .padding() } .dismissKeyboardOnTap() + .navigationTitle("Create account") .navigationBarTitleDisplayMode(.inline) .navigationBarBackButtonHidden(true) .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 { @Environment(\.dismiss) var dismiss - var body: some View { - Image(systemName: "chevron.backward") - .foregroundColor(.white) + Image("chevron-left") + .foregroundColor(.white) .onTapGesture { self.dismiss() } @@ -136,20 +144,21 @@ func KeyText(_ text: Binding<String>) -> some View { let bechkey = bech32_encode(hrp: PUBKEY_HRP, decoded) return Text(bechkey) .textSelection(.enabled) + .multilineTextAlignment(.center) .font(.callout.monospaced()) - .foregroundColor(.white) + .foregroundStyle(DamusLogoGradient.gradient) } func FormTextInput(_ title: String, text: Binding<String>) -> some View { return TextField("", text: text) .placeholder(when: text.wrappedValue.isEmpty) { - Text(title).foregroundColor(.white.opacity(0.4)) + Text(title).foregroundColor(.gray.opacity(0.5)) } - .padding() + .padding(15) .background { - RoundedRectangle(cornerRadius: 4.0).opacity(0.2) + RoundedRectangle(cornerRadius: 12) + .stroke(.gray.opacity(0.5), lineWidth: 1) } - .foregroundColor(.white) .font(.body.bold()) } @@ -157,11 +166,10 @@ func FormLabel(_ title: String, optional: Bool = false) -> some View { return HStack { Text(title) .bold() - .foregroundColor(.white) 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) - .foregroundColor(.white.opacity(0.5)) + .foregroundColor(DamusColors.mediumGrey) } } } diff --git a/damus/Views/DMChatView.swift b/damus/Views/DMChatView.swift @@ -115,7 +115,7 @@ struct DMChatView: View, KeyboardReadable { } } ) { - Label("", systemImage: "arrow.right.circle") + Label("", image: "send") .font(.title) } } diff --git a/damus/Views/EULAView.swift b/damus/Views/EULAView.swift @@ -7,28 +7,14 @@ import SwiftUI -struct EULAView: View { - var state: SetupState? - @Environment(\.dismiss) var dismiss - @State var accepted = false - - var body: some View { - 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 +let eula = """ +**End User License Agreement** -## Introduction +**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. -## 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: @@ -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 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 * Impersonates others * Is intended to intimidate or threaten others * 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. -## 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. -## 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. -## Contact Information +**Contact Information** 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. -""")) - .padding() +""" + +struct EULAView: View { + @State private var login = false + @State var accepted = false + @Environment(\.colorScheme) var colorScheme + @Environment(\.dismiss) var dismiss + + var body: some View { + ZStack { + ScrollView { + NavigationLink(destination: LoginView(accepted: $accepted), isActive: $login) { + EmptyView() + } - if state == .create_account { - NavigationLink(destination: CreateAccountView(), isActive: $accepted) { - EmptyView() + Text(Markdown.parse(content: eula)) + .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) + } } - } else { - NavigationLink(destination: LoginView(), isActive: $accepted) { - EmptyView() + + 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()) } - DamusWhiteButton(NSLocalizedString("Accept", comment: "Button to accept the end user license agreement before being allowed into the app.")) { - accepted = true - } - - DamusWhiteButton(NSLocalizedString("Reject", comment: "Button to reject the end user license agreement, which disallows the user from being let into the app.")) { - dismiss() - } + .padding(.trailing, 30) } - .padding() } + .background( + Image("eula-bg") + .resizable() + .blur(radius: 70) + .ignoresSafeArea(), + alignment: .top + ) + .navigationTitle("EULA") .navigationBarTitleDisplayMode(.inline) .navigationBarBackButtonHidden(true) .navigationBarItems(leading: BackNav()) - .foregroundColor(.white) } } diff --git a/damus/Views/Empty Views/EmptyTimelineView.swift b/damus/Views/Empty Views/EmptyTimelineView.swift @@ -10,7 +10,7 @@ import SwiftUI struct EmptyTimelineView: View { var body: some View { VStack { - Image(systemName: "tray.fill") + Image("question") .font(.system(size: 35)) .padding() Text("Nothing to see here. Check back later!", comment: "Indicates that there are no notes in the timeline to view.") diff --git a/damus/Views/Empty Views/EmptyUserSearchView.swift b/damus/Views/Empty Views/EmptyUserSearchView.swift @@ -17,7 +17,7 @@ import SwiftUI struct EmptyUserSearchView: View { var body: some View { VStack { - Image(systemName: "person.fill.questionmark") + Image("question") .font(.system(size: 35)) .padding() Text("Could not find the user you're looking for", comment: "Indicates that there are no users found.") diff --git a/damus/Views/EventView.swift b/damus/Views/EventView.swift @@ -74,7 +74,7 @@ extension View { Button { UIPasteboard.general.string = bech32_pubkey } 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") } } } diff --git a/damus/Views/Events/EventMenu.swift b/damus/Views/Events/EventMenu.swift @@ -60,25 +60,25 @@ struct MenuItems: View { Button { UIPasteboard.general.string = event.get_content(keypair.privkey) } 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 { UIPasteboard.general.string = bech32_pubkey(target_pubkey) } 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 { UIPasteboard.general.string = bech32_note_id(event.id) ?? event.id } 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 { UIPasteboard.general.string = event_to_json(ev: event) } 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 { @@ -88,7 +88,7 @@ struct MenuItems: View { let imageName = isBookmarked ? "bookmark.fill" : "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.") - Label(isBookmarked ? removeBookmarkString : addBookmarkString, systemImage: imageName) + Label(isBookmarked ? removeBookmarkString : addBookmarkString, image: imageName) } if event.known_kind != .dm { @@ -97,17 +97,17 @@ struct MenuItems: View { let muted = self.muted_threads.isMutedThread(event, privkey: self.keypair.privkey) isMutedThread = muted } 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 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 { NotificationCenter.default.post(name: .broadcast_event, object: event) } 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. @@ -116,13 +116,13 @@ struct MenuItems: View { let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id)) notify(.report, target) } 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) { notify(.mute, target_pubkey) } 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") } } } diff --git a/damus/Views/Events/ZapEvent.swift b/damus/Views/Events/ZapEvent.swift @@ -19,7 +19,7 @@ struct ZapEvent: View { .padding([.top], 2) if zap.is_private { - Image(systemName: "lock.fill") + Image("lock") .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.")) } diff --git a/damus/Views/Images/ImageContextMenuModifier.swift b/damus/Views/Images/ImageContextMenuModifier.swift @@ -19,24 +19,24 @@ struct ImageContextMenuModifier: ViewModifier { Button { UIPasteboard.general.url = url } 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 { Button { UIPasteboard.general.image = someImage } 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 { UIImageWriteToSavedPhotosAlbum(someImage, nil, nil, nil) } 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 { showShareSheet = true } 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") } } } diff --git a/damus/Views/Images/ProfilePicImageView.swift b/damus/Views/Images/ProfilePicImageView.swift @@ -49,7 +49,7 @@ struct NavDismissBarView: View { Button(action: { presentationMode.wrappedValue.dismiss() }, label: { - Image(systemName: "xmark") + Image("close") .frame(width: 33, height: 33) .background(.regularMaterial) .clipShape(Circle()) diff --git a/damus/Views/LoginView.swift b/damus/Views/LoginView.swift @@ -33,10 +33,13 @@ enum ParsedKey { } struct LoginView: View { + @State private var create_account = false @State var key: String = "" @State var is_pubkey: Bool = false @State var error: String? = nil @State private var credential_handler = CredentialHandler() + + @Binding var accepted: Bool func get_error(parsed_key: ParsedKey?) -> String? { if self.error != nil { @@ -52,27 +55,22 @@ struct LoginView: View { var body: some View { ZStack(alignment: .top) { - DamusGradient() + if accepted { + NavigationLink(destination: CreateAccountView(), isActive: $create_account) { + EmptyView() + } + } + VStack { - Text("Login", comment: "Title of view to log into an account.") - .foregroundColor(.white) - .font(.title) - .padding() - - Text("Enter your account key to login:", comment: "Prompt for user to enter an account key to login.") - .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) - + SignInHeader() + .padding(.top, 100) + + SignInEntry(key: $key) + let parsed = parse_key(key) - + 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.") - .font(.subheadline.bold()) - .foregroundColor(.white) - PubkeySwitch(isOn: $is_pubkey) - .padding() + // convert to bech32 here } if let error = get_error(parsed_key: parsed) { @@ -83,14 +81,13 @@ struct LoginView: View { 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.") - .foregroundColor(.white) - .padding() + .foregroundColor(Color.orange) + .bold() } - - Spacer() if let p = parsed { - DamusWhiteButton(NSLocalizedString("Login", comment: "Button to log into account.")) { + + Button(action: { Task { do { try await process_login(p, is_pubkey: is_pubkey) @@ -98,11 +95,31 @@ struct LoginView: View { 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() } + .background( + Image("login-header") + .resizable() + .frame(maxWidth: .infinity, maxHeight: 350, alignment: .center) + .ignoresSafeArea(), + alignment: .top + ) .onAppear { 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? { var key = thekey if key.count > 0 && key.first! == "@" { @@ -270,39 +275,90 @@ struct KeyInput: 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) .placeholder(when: key.wrappedValue.isEmpty) { Text(title).foregroundColor(.white.opacity(0.6)) } - .padding() - .padding(.leading, 20) - .background { - RoundedRectangle(cornerRadius: 4.0).opacity(0.2) - } + .padding(10) .autocapitalization(.none) - .foregroundColor(.white) + .autocorrectionDisabled(true) + .textInputAutocapitalization(.never) .font(.body.monospaced()) .textContentType(.password) + } + .padding(.horizontal, 10) + .overlay { + RoundedRectangle(cornerRadius: 12) + .stroke(.gray, lineWidth: 1) + } + } +} - Label("", systemImage: "doc.on.clipboard") - .padding(.leading, 10) - .onTapGesture { - if let pastedkey = UIPasteboard.general.string { - self.key.wrappedValue = pastedkey - } +struct SignInHeader: View { + var body: some View { + VStack { + Image("logo-nobg") + .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 { static var previews: some View { - let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681" +// let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681" + let pubkey = "npub18m76awca3y37hkvuneavuw6pjj4525fw90necxmadrvjg0sdy6qsngq955" let bech32_pubkey = "KeyInput" Group { - LoginView(key: pubkey) - LoginView(key: bech32_pubkey) + LoginView(key: pubkey, accepted: .constant(true)) + LoginView(key: bech32_pubkey, accepted: .constant(true)) } } } diff --git a/damus/Views/MainTabView.swift b/damus/Views/MainTabView.swift @@ -55,11 +55,11 @@ struct TabButton: View { let bits = timeline_to_notification_bits(timeline, ev: nil) new_events = NewEventsBits(rawValue: new_events.rawValue & ~bits.rawValue) }) { - Label("", systemImage: selected == timeline ? "\(img).fill" : img) + Image(selected != timeline ? img : "\(img).fill") .contentShape(Rectangle()) .frame(maxWidth: .infinity, minHeight: 30.0) } - .foregroundColor(selected != timeline ? .gray : .primary) + .foregroundColor(.primary) } } @@ -75,10 +75,10 @@ struct TabBar: View { VStack { Divider() HStack { - TabButton(timeline: .home, img: "house", 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: .search, img: "magnifyingglass.circle", 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: .home, img: "home", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("1") + TabButton(timeline: .dms, img: "messages", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("2") + TabButton(timeline: .search, img: "search", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("3") + TabButton(timeline: .notifications, img: "notification-bell", selected: $selected, new_events: $new_events, settings: settings, action: action).keyboardShortcut("4") } } } diff --git a/damus/Views/Muting/MutelistView.swift b/damus/Views/Muting/MutelistView.swift @@ -29,7 +29,7 @@ struct MutelistView: View { damus_state.postbox.send(new_ev) users = get_mutelist_users(new_ev) } 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) } diff --git a/damus/Views/Notifications/EventGroupView.swift b/damus/Views/Notifications/EventGroupView.swift @@ -168,7 +168,7 @@ struct EventGroupView: View { func ZapIcon(_ zapgrp: ZapGroup) -> some View { let fmt = format_msats_abbrev(zapgrp.msat_total) return VStack(alignment: .center) { - Image(systemName: "bolt.fill") + Image("zap.fill") .foregroundColor(.orange) Text(verbatim: fmt) .foregroundColor(Color.orange) @@ -179,13 +179,15 @@ struct EventGroupView: View { Group { switch group { case .repost: - Image(systemName: "arrow.2.squarepath") + Image("repost") .foregroundColor(DamusColors.green) case .reaction: LINEAR_GRADIENT - .mask(Image("shaka-full") + .mask(Image("shaka.fill") .resizable() - ).frame(width: 24, height: 24) + .aspectRatio(contentMode: .fit) + ) + .frame(width: 20, height: 20) case .profile_zap(let zapgrp): ZapIcon(zapgrp) case .zap(let zapgrp): diff --git a/damus/Views/ParticipantsView.swift b/damus/Views/ParticipantsView.swift @@ -67,7 +67,7 @@ struct ParticipantsView: View { Spacer() - Image(systemName: "checkmark.circle.fill") + Image("check-circle.fill") .font(.system(size: 30)) .foregroundColor(references.contains(participant) ? DamusColors.purple : .gray) } diff --git a/damus/Views/PostButton.swift b/damus/Views/PostButton.swift @@ -26,7 +26,7 @@ func PostButton(action: @escaping () -> ()) -> some View { radius: 3, x: 3, y: 3) - Image(systemName: "plus") + Image("plus") .font(.system(.title2)) .foregroundColor(Color.white) } diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift @@ -114,7 +114,7 @@ struct PostView: View { Button(action: { attach_media = true }, label: { - Image(systemName: "photo") + Image("images") .padding(6) }) } @@ -123,7 +123,7 @@ struct PostView: View { Button(action: { attach_camera = true }, label: { - Image(systemName: "camera") + Image("camera") .padding(6) }) } @@ -477,11 +477,11 @@ struct PVImageCarouselView: View { Button(action: { 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) .padding(20) .shadow(radius: 5) diff --git a/damus/Views/Profile/EditProfilePictureControl.swift b/damus/Views/Profile/EditProfilePictureControl.swift @@ -39,7 +39,7 @@ struct EditProfilePictureControl: View { if viewModel.isLoading { ProgressView() } else { - Image(systemName: "camera") + Image("camera") .resizable() .scaledToFit() .frame(width: 25, height: 25) diff --git a/damus/Views/Profile/MaybeAnonPfpView.swift b/damus/Views/Profile/MaybeAnonPfpView.swift @@ -23,7 +23,8 @@ struct MaybeAnonPfpView: View { var body: some View { Group { if is_anon { - Image(systemName: "person.fill.questionmark") + Image("question") + .resizable() .font(.largeTitle) .frame(width: size, height: size) } else { diff --git a/damus/Views/Profile/ProfileView.swift b/damus/Views/Profile/ProfileView.swift @@ -168,8 +168,8 @@ struct ProfileView: View { } @ViewBuilder - func navImage(systemImage: String) -> some View { - Image(systemName: systemImage) + func navImage(img: String) -> some View { + Image(img) .frame(width: 33, height: 33) .background(Color.black.opacity(0.6)) .clipShape(Circle()) @@ -179,7 +179,7 @@ struct ProfileView: View { Button { presentationMode.wrappedValue.dismiss() } label: { - navImage(systemImage: "chevron.left") + navImage(img: "chevron-left") } } @@ -187,7 +187,7 @@ struct ProfileView: View { Button(action: { 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) { 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 { - let button_img = profile.reactions == false ? "bolt.brakesignal" : "bolt.circle" + let button_img = profile.reactions == false ? "zap.fill" : "zap" return Button(action: { if damus_state.settings.show_wallet_selector { showing_select_wallet = true @@ -250,7 +250,8 @@ struct ProfileView: View { 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) .contextMenu { if profile.reactions == false { @@ -261,13 +262,13 @@ struct ProfileView: View { Button { UIPasteboard.general.string = addr } label: { - Label(addr, systemImage: "doc.on.doc") + Label(addr, image: "copy2") } } else if let lnurl = profile.lnurl { Button { UIPasteboard.general.string = lnurl } 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 dmview = DMChatView(damus_state: damus_state, dms: dm_model) return NavigationLink(destination: dmview) { - Image(systemName: "bubble.left.circle") + Image("messages") .profile_button_style(scheme: colorScheme) } } @@ -353,7 +354,9 @@ struct ProfileView: View { var followersCount: some View { HStack { 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.") .font(.subheadline) .foregroundColor(.gray) @@ -554,7 +557,8 @@ struct KeyView: View { Label { Text("Public key", comment: "Label indicating that the text is a user's public account key.") } icon: { - Image(systemName: "square.on.square.dashed") + Image("copy2") + .resizable() .contentShape(Rectangle()) .foregroundColor(.accentColor) .frame(width: 20, height: 20) @@ -564,7 +568,8 @@ struct KeyView: View { } } else { HStack { - Image(systemName: "checkmark.circle") + Image("check-circle") + .resizable() .frame(width: 20, height: 20) Text(NSLocalizedString("Copied", comment: "Label indicating that a user's key was copied.")) .font(.footnote) diff --git a/damus/Views/QRCodeView.swift b/damus/Views/QRCodeView.swift @@ -30,7 +30,7 @@ struct QRCodeView: View { Button { presentationMode.wrappedValue.dismiss() } label: { - Image(systemName: "xmark") + Image("close") .foregroundColor(.white) .font(.subheadline) .padding(.leading, 20) diff --git a/damus/Views/Relays/RecommendedRelayView.swift b/damus/Views/Relays/RecommendedRelayView.swift @@ -52,14 +52,16 @@ struct RecommendedRelayView: View { Spacer() - Image(systemName: "info.circle") - .font(.system(size: 20, weight: .regular)) + Image("info") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(Color.accentColor) } else { Spacer() - Image(systemName: "questionmark.circle") - .font(.system(size: 20, weight: .regular)) + Image("question") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(.gray) } } @@ -85,7 +87,7 @@ struct RecommendedRelayView: View { Button { UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text") } 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 { Text(NSLocalizedString("Connect", comment: "Button to connect to recommended relay server.")) } - Image(systemName: "plus.circle.fill") - .font(.system(size: 20, weight: .medium)) + Image("plus-circle") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(.accentColor) .padding(.leading, 5) } diff --git a/damus/Views/Relays/RelayStatus.swift b/damus/Views/Relays/RelayStatus.swift @@ -22,12 +22,12 @@ struct RelayStatus: View { if relay.id == self.relay { let c = relay.connection if c.isConnected { - conn_image = "network" + conn_image = "globe" conn_color = .green } else if c.isConnecting { connecting = true } else { - conn_image = "exclamationmark.circle.fill" + conn_image = "warning.fill" conn_color = .red } } @@ -38,13 +38,14 @@ struct RelayStatus: View { HStack { if connecting { ProgressView() - .padding(.trailing, 4) + .frame(width: 20, height: 20) + .padding(.trailing, 5) } else { - Image(systemName: conn_image) - .frame(width: 8.0, height: 8.0) + Image(conn_image) + .resizable() + .frame(width: 20, height: 20) .foregroundColor(conn_color) - .padding(.leading, 5) - .padding(.trailing, 10) + .padding(.trailing, 5) } } .onReceive(timer) { _ in diff --git a/damus/Views/Relays/RelayType.swift b/damus/Views/Relays/RelayType.swift @@ -14,7 +14,9 @@ struct RelayType: View { if is_paid { Image("bitcoin-logo") } else { - Image(systemName: "globe.americas.fill") + Image("globe") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(.gray) } } diff --git a/damus/Views/Relays/RelayView.swift b/damus/Views/Relays/RelayView.swift @@ -33,16 +33,21 @@ struct RelayView: View { NavigationLink("", destination: RelayDetailView(state: state, relay: relay, nip11: meta)).opacity(0.0) .disabled(showActionButtons) ) + Spacer() - Image(systemName: "info.circle") - .font(.system(size: 20, weight: .regular)) + Image("info") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(Color.accentColor) } else { Text(relay) + Spacer() - Image(systemName: "questionmark.circle") - .font(.system(size: 20, weight: .regular)) + + Image("question") + .resizable() + .frame(width: 20, height: 20) .foregroundColor(.gray) } } @@ -66,7 +71,7 @@ struct RelayView: View { Button { UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text") } 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 { 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) .padding(.leading, 5) } diff --git a/damus/Views/SaveKeysView.swift b/damus/Views/SaveKeysView.swift @@ -23,25 +23,19 @@ struct SaveKeysView: View { var body: some View { ZStack(alignment: .top) { - DamusGradient() - VStack(alignment: .center) { Text("Welcome, \(account.rendered_name)!", comment: "Text to welcome user.") .font(.title.bold()) - .foregroundColor(.white) .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.") - .foregroundColor(.white) .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.") .font(.title2.bold()) - .foregroundColor(.white) .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.") - .foregroundColor(.white) .padding(.bottom, 10) SaveKeyView(text: account.pubkey_bech32, textContentType: .username, is_copied: $pub_copied, focus: $pubkey_focused) @@ -50,11 +44,9 @@ struct SaveKeysView: View { 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.") .font(.title2.bold()) - .foregroundColor(.white) .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.") - .foregroundColor(.white) .padding(.bottom, 10) 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 { Text("Error: \(err)", comment: "Error message indicating why saving keys failed.") .foregroundColor(.red) - DamusWhiteButton(NSLocalizedString("Retry", comment: "Button to retry completing account creation after an error occurred.")) { + + Button(action: { 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 { - DamusWhiteButton(NSLocalizedString("Let's go!", comment: "Button to complete account creation and start using the app.")) { + Button(action: { 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) } + .background( + Image("eula-bg") + .resizable() + .blur(radius: 70) + .ignoresSafeArea(), + alignment: .top + ) .navigationBarBackButtonHidden(true) .navigationBarItems(leading: BackNav()) .onAppear { @@ -171,8 +187,8 @@ struct SaveKeyView: View { VStack { spacerBlock(width: 0, height: 0) Button(action: copy_text) { - Label("", systemImage: is_copied ? "checkmark.circle.fill" : "doc.on.doc") - .foregroundColor(is_copied ? .green : .white) + Label("", image: is_copied ? "check-circle.fill" : "copy2") + .foregroundColor(is_copied ? .green : .gray) .background { if is_copied { Circle() @@ -190,11 +206,10 @@ struct SaveKeyView: View { TextField("", text: .constant(text)) .padding(5) .background { - RoundedRectangle(cornerRadius: 4.0).opacity(0.2) + RoundedRectangle(cornerRadius: 4.0).opacity(0.1) } .textSelection(.enabled) .font(.callout.monospaced()) - .foregroundColor(.white) .onTapGesture { 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. diff --git a/damus/Views/SearchHomeView.swift b/damus/Views/SearchHomeView.swift @@ -20,7 +20,7 @@ struct SearchHomeView: View { var SearchInput: some View { HStack { HStack{ - Image(systemName: "magnifyingglass") + Image("search") .foregroundColor(.gray) TextField(NSLocalizedString("Search...", comment: "Placeholder text to prompt entry of search query."), text: $search) .autocorrectionDisabled(true) diff --git a/damus/Views/SelectWalletView.swift b/damus/Views/SelectWalletView.swift @@ -28,7 +28,7 @@ struct SelectWalletView: View { 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 { UIPasteboard.general.string = invoice self.invoice_copied = true diff --git a/damus/Views/Settings/KeySettingsView.swift b/damus/Views/Settings/KeySettingsView.swift @@ -66,7 +66,7 @@ struct KeySettingsView: View { } }) { let copied = is_pk ? self.pubkey_copied : self.privkey_copied - Image(systemName: copied ? "checkmark.circle" : "doc.on.doc") + Image(copied ? "check-circle" : "copy2") } } diff --git a/damus/Views/SetupView.swift b/damus/Views/SetupView.swift @@ -15,71 +15,125 @@ func hex_col(r: UInt8, g: UInt8, b: UInt8) -> Color { opacity: 1.0) } -enum SetupState { - case home - case create_account - case login -} - struct SetupView: View { - @State var state: SetupState? = .home + @State private var eula = false var body: some View { NavigationView { ZStack { - DamusGradient() - VStack(alignment: .center) { - NavigationLink(destination: EULAView(state: state), tag: .create_account, selection: $state ) { - EmptyView() - } - NavigationLink(destination: EULAView(state: state), tag: .login, selection: $state ) { + NavigationLink(destination: EULAView(), isActive: $eula) { EmptyView() } + Spacer() + Image("logo-nobg") .resizable() - .frame(width: 128.0, height: 128.0, alignment: .center) - .padding([.top], 20.0) - Text("Damus", comment: "Name of the app, shown on the first screen when user is not logged in.") - .font(Font.custom("Nunito", size: 50.0)) - .kerning(-2) - .foregroundColor(.white) - - CarouselView() + .shadow(color: DamusColors.purple, radius: 2) + .frame(width: 56, height: 56, alignment: .center) + .padding(.top, 20.0) - DamusWhiteButton(NSLocalizedString("Create Account", comment: "Button to create an account.")) { - self.state = .create_account + HStack { + Text("Welcome to", comment: "Welcome text shown on the first screen when user is not logged in.") + .font(.title) + .fontWeight(.heavy) + Text("Damus") + .font(.title) + .fontWeight(.heavy) + .foregroundStyle(DamusLogoGradient.gradient) } - Button(NSLocalizedString("Login", comment: "Button to log into an account.")) { - self.state = .login + Text("The go-to iOS nostr client", comment: "Quick description of what Damus is") + .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) - .foregroundColor(.white) + .buttonStyle(GradientButtonStyle()) + .padding() } } + .background( + Image("login-header") + .resizable() + .frame(maxWidth: .infinity, maxHeight: 300, alignment: .center) + .ignoresSafeArea(), + alignment: .top + ) } .navigationBarTitleDisplayMode(.inline) .navigationViewStyle(StackNavigationViewStyle()) } } -func DamusWhiteButton(_ title: String, action: @escaping () -> ()) -> some View { - return Button(action: action) { - Text(title) - .frame(width: 300, height: 50) - .font(.body.bold()) - .contentShape(Rectangle()) - .foregroundColor(.white) - .background( - RoundedRectangle(cornerRadius: 4.0) - .stroke(Color.white, lineWidth: 2.0) - .background(Color.white.opacity(0.15)) - ) +struct LearnAboutNostrLink: View { + @Environment(\.openURL) var openURL + var body: some View { + HStack { + Button(action: { + openURL(URL(string: "https://nostr.com")!) + }, label: { + Text("Learn more about nostr") + .foregroundColor(.accentColor) + }) + + 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 { diff --git a/damus/Views/SideMenuView.swift b/damus/Views/SideMenuView.swift @@ -46,36 +46,38 @@ struct SideMenuView: View { func SidemenuItems(profile_model: ProfileModel, followers: FollowersModel) -> some View { return VStack(spacing: verticalSpacing) { 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)) { + navLabel(title: NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."), img: "wallet") + /* HStack { Image("wallet") .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) .foregroundColor(textColor()) .frame(maxWidth: .infinity, alignment: .leading) .dynamicTypeSize(.xSmall) - } + }*/ } 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)) { - 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)) { - 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)) { - 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 } }, 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) .foregroundColor(textColor()) .frame(maxWidth: .infinity, alignment: .leading) @@ -154,7 +156,7 @@ struct SideMenuView: View { Button(action: { showQRCode.toggle() }, label: { - Label("", systemImage: "qrcode") + Image("qr-code") .font(.title) .foregroundColor(textColor()) .dynamicTypeSize(.xSmall) @@ -187,8 +189,11 @@ struct SideMenuView: View { @ViewBuilder - func navLabel(title: String, systemImage: String) -> some View { - Label(title, systemImage: systemImage) + func navLabel(title: String, img: String) -> some View { + Image(img) + .tint(DamusColors.adaptableBlack) + + Text(title) .font(.title2) .foregroundColor(textColor()) .frame(maxWidth: .infinity, alignment: .leading) diff --git a/damus/Views/Zaps/CustomizeZapView.swift b/damus/Views/Zaps/CustomizeZapView.swift @@ -257,16 +257,16 @@ struct CustomizeZapView: View { }) { switch zap_type { case .pub: - Image(systemName: "person.2") + Image("globe") Text("Public", comment: "Button text to indicate that the zap type is a public zap.") case .anon: - Image(systemName: "person.fill.questionmark") + Image("question") Text("Anonymous", comment: "Button text to indicate that the zap type is a anonymous zap.") case .priv: - Image(systemName: "lock") + Image("lock") Text("Private", comment: "Button text to indicate that the zap type is a private zap.") case .non_zap: - Image(systemName: "bolt") + Image("zap") Text("None", comment: "Button text to indicate that the zap type is a private zap.") } } diff --git a/damus/Views/Zaps/ZapTypePicker.swift b/damus/Views/Zaps/ZapTypePicker.swift @@ -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: "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: "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: "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: "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", 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: "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: "zap", action: {zap_type = ZapType.non_zap}, type: ZapType.non_zap) } .padding(.horizontal) } @@ -73,14 +73,19 @@ struct ZapTypePicker: View { Button(action: action) { VStack(alignment: .leading, spacing: 5) { HStack { - Image(systemName: img) + Image(img) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 20, height: 20) .foregroundColor(.gray) - .font(.system(size: 24)) + Text(text, comment: comment) .font(.system(size: 20, weight: .semibold)) + Spacer() } .padding(.horizontal) + Text(zap_type_desc(type: type, profiles: profiles, pubkey: pubkey)) .padding(.horizontal) .foregroundColor(.gray)