diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index f8361d8..63ebf7e 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -137,6 +137,7 @@ 4CEE2AF9280B2EAC00AB5EEF /* PowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */; }; 4CEE2B02280B39E800AB5EEF /* EventActionBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */; }; 4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; }; + 64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FBD06E296255C400D9D3B2 /* Theme.swift */; }; 6C7DE41F2955169800E66263 /* Vault in Frameworks */ = {isa = PBXBuildFile; productRef = 6C7DE41E2955169800E66263 /* Vault */; }; BA693074295D649800ADDB87 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; }; BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */; }; @@ -327,6 +328,7 @@ 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowView.swift; sourceTree = ""; }; 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventActionBar.swift; sourceTree = ""; }; 4FE60CDC295E1C5E00105A1F /* Wallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = ""; }; + 64FBD06E296255C400D9D3B2 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; BA693073295D649800ADDB87 /* UserSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettingsStore.swift; sourceTree = ""; }; BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectWalletView.swift; sourceTree = ""; }; E990020E2955F837003BBC5A /* EditMetadataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMetadataView.swift; sourceTree = ""; }; @@ -463,48 +465,48 @@ 4C75EFA227FA576C0006080F /* Views */ = { isa = PBXGroup; children = ( - 3169CAE4294E699400EE4006 /* Empty Views */, - 4C75EFA327FA577B0006080F /* PostView.swift */, - 4C75EFAC28049CFB0006080F /* PostButton.swift */, - 4C75EFB82804A2740006080F /* EventView.swift */, - 4CEE2AF0280B216B00AB5EEF /* EventDetailView.swift */, - 4CEE2AF2280B25C500AB5EEF /* ProfilePicView.swift */, - 4CEE2AF6280B2DEA00AB5EEF /* ProfileName.swift */, - 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */, - 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */, - 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */, - 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */, - 4C0A3F8B280F5FCA000448DE /* ChatroomView.swift */, - 4C0A3F90280F6528000448DE /* ChatView.swift */, - 4C0A3F94280F6C78000448DE /* ReplyQuoteView.swift */, - 4C0A3F96280F8E02000448DE /* ThreadView.swift */, - 4C8682862814DE470026224F /* ProfileView.swift */, + 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */, 4C363A8728236948006E126D /* BlocksView.swift */, - 4C363A8928236B57006E126D /* MentionView.swift */, - 4C363A8B28236B92006E126D /* PubkeyView.swift */, - 4C363A8D28236FE4006E126D /* NoteContentView.swift */, - 4C363AA128296A7E006E126D /* SearchView.swift */, - 4C3AC79C2833036D00E1F516 /* FollowingView.swift */, - 4C3AC79E2833115300E1F516 /* FollowButtonView.swift */, - 4C3AC7A02835A81400E1F516 /* SetupView.swift */, - 4C3AC7A42836987600E1F516 /* MainTabView.swift */, - 4C3AC7A628369BA200E1F516 /* SearchHomeView.swift */, 4C285C8128385570008A31F1 /* CarouselView.swift */, - 4C285C8328385690008A31F1 /* CreateAccountView.swift */, - 4C285C892838B985008A31F1 /* ProfilePictureSelector.swift */, - 4C285C8D28399BFD008A31F1 /* SaveKeysView.swift */, - 4C90BD17283A9EE5008EE7EF /* LoginView.swift */, - 4C5C7E69284EDE2E00A22DF5 /* SearchResultsView.swift */, + 4C0A3F8B280F5FCA000448DE /* ChatroomView.swift */, + 4C0A3F90280F6528000448DE /* ChatView.swift */, 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */, - 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */, + 4C285C8328385690008A31F1 /* CreateAccountView.swift */, 4C64987B286D03E000EAE2B3 /* DirectMessagesView.swift */, 4C216F31286E388800040376 /* DMChatView.swift */, 4C216F33286F5ACD00040376 /* DMView.swift */, - 4C06670028FC7C5900038D2A /* RelayView.swift */, E990020E2955F837003BBC5A /* EditMetadataView.swift */, + 3169CAE4294E699400EE4006 /* Empty Views */, + 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */, + 4CEE2AF0280B216B00AB5EEF /* EventDetailView.swift */, + 4C75EFB82804A2740006080F /* EventView.swift */, + 4C3AC79E2833115300E1F516 /* FollowButtonView.swift */, + 4C3AC79C2833036D00E1F516 /* FollowingView.swift */, + 4C90BD17283A9EE5008EE7EF /* LoginView.swift */, + 4C3AC7A42836987600E1F516 /* MainTabView.swift */, + 4C363A8928236B57006E126D /* MentionView.swift */, + 4C363A8D28236FE4006E126D /* NoteContentView.swift */, + 4C75EFAC28049CFB0006080F /* PostButton.swift */, + 4C75EFA327FA577B0006080F /* PostView.swift */, + 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */, + 4CEE2AF6280B2DEA00AB5EEF /* ProfileName.swift */, + 4C285C892838B985008A31F1 /* ProfilePictureSelector.swift */, + 4CEE2AF2280B25C500AB5EEF /* ProfilePicView.swift */, + 4C8682862814DE470026224F /* ProfileView.swift */, + 4C363A8B28236B92006E126D /* PubkeyView.swift */, + 4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */, + 4C06670028FC7C5900038D2A /* RelayView.swift */, + 4C0A3F94280F6C78000448DE /* ReplyQuoteView.swift */, + 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */, + 4C285C8D28399BFD008A31F1 /* SaveKeysView.swift */, + 4C3AC7A628369BA200E1F516 /* SearchHomeView.swift */, + 4C5C7E69284EDE2E00A22DF5 /* SearchResultsView.swift */, + 4C363AA128296A7E006E126D /* SearchView.swift */, BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */, + 4C3AC7A02835A81400E1F516 /* SetupView.swift */, E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */, - 4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */, + 4C0A3F96280F8E02000448DE /* ThreadView.swift */, + 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */, 4CB55EF4295E679D007FD187 /* UserRelaysView.swift */, ); path = Views; @@ -545,6 +547,7 @@ 3169CAEC294FCCFC00EE4006 /* Constants.swift */, 3165648A295B70D500C64604 /* LinkView.swift */, 4C3A1D3629637E0500558C0F /* PreviewCache.swift */, + 64FBD06E296255C400D9D3B2 /* Theme.swift */, ); path = Util; sourceTree = ""; @@ -843,6 +846,7 @@ 4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */, BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */, 3169CAE6294E69C000EE4006 /* EmptyTimelineView.swift in Sources */, + 64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */, 4C3EA64928FF597700C48A62 /* bech32.c in Sources */, 4C90BD162839DB54008EE7EF /* NostrMetadata.swift in Sources */, 4C3A1D3729637E0500558C0F /* PreviewCache.swift in Sources */, diff --git a/damus/Assets.xcassets/AccentColor.colorset/Contents.json b/damus/Assets.xcassets/AccentColor.colorset/Contents.json index eb87897..e5d5414 100644 --- a/damus/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/damus/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,6 +1,33 @@ { "colors" : [ { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC5", + "green" : "0x43", + "red" : "0xCC" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC5", + "green" : "0x43", + "red" : "0xCC" + } + }, "idiom" : "universal" } ], diff --git a/damus/Assets.xcassets/Colors/Contents.json b/damus/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/damus/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusBlack.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusBlack.colorset/Contents.json new file mode 100644 index 0000000..be9d677 --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusBlack.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusDarkGrey.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusDarkGrey.colorset/Contents.json new file mode 100644 index 0000000..a4eeeda --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusDarkGrey.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1E", + "green" : "0x1C", + "red" : "0x1C" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1E", + "green" : "0x1C", + "red" : "0x1C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusGreen.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusGreen.colorset/Contents.json new file mode 100644 index 0000000..7ef7462 --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusGreen.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x4F", + "green" : "0xC3", + "red" : "0x66" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x4F", + "green" : "0xC3", + "red" : "0x66" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusLightGrey.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusLightGrey.colorset/Contents.json new file mode 100644 index 0000000..d319207 --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusLightGrey.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF4", + "green" : "0xEE", + "red" : "0xEE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF4", + "green" : "0xEE", + "red" : "0xEE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusMediumGrey.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusMediumGrey.colorset/Contents.json new file mode 100644 index 0000000..a587fb3 --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusMediumGrey.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x5F", + "green" : "0x5F", + "red" : "0x5F" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x5F", + "green" : "0x5F", + "red" : "0x5F" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Colors/DamusWhite.colorset/Contents.json b/damus/Assets.xcassets/Colors/DamusWhite.colorset/Contents.json new file mode 100644 index 0000000..2536dc2 --- /dev/null +++ b/damus/Assets.xcassets/Colors/DamusWhite.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/Contents.json b/damus/Assets.xcassets/Profile/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/damus/Assets.xcassets/Profile/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-copy.imageset/Contents.json b/damus/Assets.xcassets/Profile/ic-copy.imageset/Contents.json new file mode 100644 index 0000000..9d64bae --- /dev/null +++ b/damus/Assets.xcassets/Profile/ic-copy.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-copy.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-copy.imageset/ic-copy.png b/damus/Assets.xcassets/Profile/ic-copy.imageset/ic-copy.png new file mode 100644 index 0000000..ef8c1ac Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-copy.imageset/ic-copy.png differ diff --git a/damus/Assets.xcassets/Profile/ic-key.imageset/Contents.json b/damus/Assets.xcassets/Profile/ic-key.imageset/Contents.json new file mode 100644 index 0000000..b2164bc --- /dev/null +++ b/damus/Assets.xcassets/Profile/ic-key.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-key.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-key.imageset/ic-key.png b/damus/Assets.xcassets/Profile/ic-key.imageset/ic-key.png new file mode 100644 index 0000000..46567a4 Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-key.imageset/ic-key.png differ diff --git a/damus/Assets.xcassets/Profile/ic-message.imageset/Contents.json b/damus/Assets.xcassets/Profile/ic-message.imageset/Contents.json new file mode 100644 index 0000000..5cce875 --- /dev/null +++ b/damus/Assets.xcassets/Profile/ic-message.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "ic-message-black.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "ic-message-white 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-black.png b/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-black.png new file mode 100644 index 0000000..f57dd9f Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-black.png differ diff --git a/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-white 1.png b/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-white 1.png new file mode 100644 index 0000000..33c92d5 Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-message.imageset/ic-message-white 1.png differ diff --git a/damus/Assets.xcassets/Profile/ic-nipverified.imageset/Contents.json b/damus/Assets.xcassets/Profile/ic-nipverified.imageset/Contents.json new file mode 100644 index 0000000..fae9557 --- /dev/null +++ b/damus/Assets.xcassets/Profile/ic-nipverified.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-nipverified.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-nipverified.imageset/ic-nipverified.png b/damus/Assets.xcassets/Profile/ic-nipverified.imageset/ic-nipverified.png new file mode 100644 index 0000000..cd1e662 Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-nipverified.imageset/ic-nipverified.png differ diff --git a/damus/Assets.xcassets/Profile/ic-qr.imageset/Contents.json b/damus/Assets.xcassets/Profile/ic-qr.imageset/Contents.json new file mode 100644 index 0000000..ec29054 --- /dev/null +++ b/damus/Assets.xcassets/Profile/ic-qr.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-qr.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/ic-qr.imageset/ic-qr.png b/damus/Assets.xcassets/Profile/ic-qr.imageset/ic-qr.png new file mode 100644 index 0000000..516c311 Binary files /dev/null and b/damus/Assets.xcassets/Profile/ic-qr.imageset/ic-qr.png differ diff --git a/damus/Assets.xcassets/Profile/profile-banner.imageset/Contents.json b/damus/Assets.xcassets/Profile/profile-banner.imageset/Contents.json new file mode 100644 index 0000000..0a52974 --- /dev/null +++ b/damus/Assets.xcassets/Profile/profile-banner.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "profile-banner.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.jpeg b/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.jpeg new file mode 100644 index 0000000..ee5baff Binary files /dev/null and b/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.jpeg differ diff --git a/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.png b/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.png new file mode 100644 index 0000000..78bc061 Binary files /dev/null and b/damus/Assets.xcassets/Profile/profile-banner.imageset/profile-banner.png differ diff --git a/damus/Assets.xcassets/ic-lightning.imageset/Contents.json b/damus/Assets.xcassets/ic-lightning.imageset/Contents.json new file mode 100644 index 0000000..3d4d54c --- /dev/null +++ b/damus/Assets.xcassets/ic-lightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-lightning.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/ic-lightning.imageset/ic-lightning.png b/damus/Assets.xcassets/ic-lightning.imageset/ic-lightning.png new file mode 100644 index 0000000..d3e35db Binary files /dev/null and b/damus/Assets.xcassets/ic-lightning.imageset/ic-lightning.png differ diff --git a/damus/Assets.xcassets/ic-tick.imageset/Contents.json b/damus/Assets.xcassets/ic-tick.imageset/Contents.json new file mode 100644 index 0000000..30f153b --- /dev/null +++ b/damus/Assets.xcassets/ic-tick.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic-tick.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/ic-tick.imageset/ic-tick.png b/damus/Assets.xcassets/ic-tick.imageset/ic-tick.png new file mode 100644 index 0000000..37bc751 Binary files /dev/null and b/damus/Assets.xcassets/ic-tick.imageset/ic-tick.png differ diff --git a/damus/Util/Theme.swift b/damus/Util/Theme.swift new file mode 100644 index 0000000..1b550c0 --- /dev/null +++ b/damus/Util/Theme.swift @@ -0,0 +1,28 @@ +// +// Theme.swift +// damus +// +// Created by Ben Weeks on 1/1/23. +// + +import Foundation +import UIKit + +class Theme { + static func navigationBarColors(background : UIColor?, + titleColor : UIColor? = nil, tintColor : UIColor? = nil ){ + + let navigationAppearance = UINavigationBarAppearance() + navigationAppearance.configureWithOpaqueBackground() + navigationAppearance.backgroundColor = background ?? .clear + + navigationAppearance.titleTextAttributes = [.foregroundColor: titleColor ?? .black] + navigationAppearance.largeTitleTextAttributes = [.foregroundColor: titleColor ?? .black] + + UINavigationBar.appearance().standardAppearance = navigationAppearance + UINavigationBar.appearance().compactAppearance = navigationAppearance + UINavigationBar.appearance().scrollEdgeAppearance = navigationAppearance + + UINavigationBar.appearance().tintColor = tintColor ?? titleColor ?? .black + } +} diff --git a/damus/Views/FollowButtonView.swift b/damus/Views/FollowButtonView.swift index d7de02d..5e35278 100644 --- a/damus/Views/FollowButtonView.swift +++ b/damus/Views/FollowButtonView.swift @@ -19,10 +19,11 @@ struct FollowButtonView: View { follow_state = perform_follow_btn_action(follow_state, target: target) } label: { Text(follow_btn_txt(follow_state)) + .frame(height: 30) .padding(.horizontal, 25) - .padding(.vertical, 10) + //.padding(.vertical, 10) .font(.caption.weight(.bold)) - .foregroundColor(follow_state == .unfollows ? emptyColor() : fillColor()) + .foregroundColor(follow_state == .unfollows ? filledTextColor() : borderColor()) .background(follow_state == .unfollows ? fillColor() : emptyColor()) .cornerRadius(20) .overlay { @@ -48,16 +49,20 @@ struct FollowButtonView: View { } } + func filledTextColor() -> Color { + colorScheme == .light ? Color("DamusWhite") : Color("DamusBlack") + } + func fillColor() -> Color { - colorScheme == .light ? .black : .white + colorScheme == .light ? Color("DamusBlack") : Color("DamusWhite") } func emptyColor() -> Color { - colorScheme == .light ? .white : .black + Color.black.opacity(0) } func borderColor() -> Color { - colorScheme == .light ? .black.opacity(0.1) : .white.opacity(0.2) + colorScheme == .light ? Color("DamusDarkGrey") : Color("DamusLightGrey") } } diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift index 3716e5a..164326b 100644 --- a/damus/Views/ProfileView.swift +++ b/damus/Views/ProfileView.swift @@ -54,21 +54,18 @@ struct ProfileNameView: View { Group { if let real_name = profile?.display_name { VStack(alignment: .leading) { - HStack { - Text(real_name) - .font(.title3.weight(.bold)) - - KeyView(pubkey: pubkey) - .pubkey_context_menu(bech32_pubkey: pubkey) - } + Text(real_name) + .font(.title3.weight(.bold)) ProfileName(pubkey: pubkey, profile: profile, prefix: "@", contacts: contacts, show_friend_confirmed: true) .font(.callout) .foregroundColor(.gray) + KeyView(pubkey: pubkey) + .pubkey_context_menu(bech32_pubkey: pubkey) } } else { - HStack { + VStack(alignment: .leading) { ProfileName(pubkey: pubkey, profile: profile, contacts: contacts, show_friend_confirmed: true) - + .font(.title3.weight(.bold)) KeyView(pubkey: pubkey) .pubkey_context_menu(bech32_pubkey: pubkey) } @@ -85,29 +82,24 @@ struct EditButton: View { var body: some View { NavigationLink(destination: EditMetadataView(damus_state: damus_state)) { Text("Edit") - .padding(.horizontal, 25) - .padding(.vertical, 10) + .frame(height: 30) + .padding(.horizontal,25) .font(.caption.weight(.bold)) .foregroundColor(fillColor()) - .background(emptyColor()) - .cornerRadius(20) + .cornerRadius(24) .overlay { - RoundedRectangle(cornerRadius: 16) + RoundedRectangle(cornerRadius: 24) .stroke(borderColor(), lineWidth: 1) } } } func fillColor() -> Color { - colorScheme == .light ? .black : .white - } - - func emptyColor() -> Color { - colorScheme == .light ? .white : .black + colorScheme == .light ? Color("DamusBlack") : Color("DamusWhite") } func borderColor() -> Color { - colorScheme == .light ? .black.opacity(0.1) : .white.opacity(0.2) + colorScheme == .light ? Color("DamusBlack") : Color("DamusWhite") } } @@ -128,6 +120,24 @@ struct ProfileView: View { //@EnvironmentObject var profile: ProfileModel + // We just want to have a white "< Home" text here, however, + // setting the initialiser is causing issues, and it's late. + // Ref: https://blog.techchee.com/navigation-bar-title-style-color-and-custom-back-button-in-swiftui/ + /* + init(damus_state: DamusState, zoom_size: CGFloat = 350) { + self.damus_state = damus_state + self.zoom_size = zoom_size + Theme.navigationBarColors(background: nil, titleColor: .white, tintColor: nil) + }*/ + + func fillColor() -> Color { + colorScheme == .light ? Color("DamusLightGrey") : Color("DamusDarkGrey") + } + + func imageBorderColor() -> Color { + colorScheme == .light ? Color("DamusWhite") : Color("DamusBlack") + } + func LNButton(lnurl: String, profile: Profile) -> some View { Button(action: { if user_settings.show_wallet_selector { @@ -136,18 +146,22 @@ struct ProfileView: View { open_with_wallet(wallet: user_settings.default_wallet.model, invoice: lnurl) } }) { - Image(systemName: "bolt.circle") + Image("ic-lightning") + .frame(width:44,height:30) .symbolRenderingMode(.palette) .font(.system(size: 34).weight(.thin)) - .foregroundStyle(colorScheme == .light ? .black : .white, colorScheme == .light ? .black.opacity(0.1) : .white.opacity(0.2)) .contextMenu { Button { UIPasteboard.general.string = profile.lnurl ?? "" } label: { - Label("Copy LNURL", systemImage: "doc.on.doc") + Label("Copy LNUrl", systemImage: "doc.on.doc") } } - }.sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { + + } + .background(fillColor()) + .cornerRadius(24) + .sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { SelectWalletView(showingSelectWallet: $showing_select_wallet, invoice: lnurl) .environmentObject(user_settings) } @@ -160,119 +174,151 @@ struct ProfileView: View { let dmview = DMChatView(damus_state: damus_state, pubkey: profile.pubkey) .environmentObject(dm_model) return NavigationLink(destination: dmview) { - Image(systemName: "bubble.left.circle") - .symbolRenderingMode(.palette) - .font(.system(size: 34).weight(.thin)) - .foregroundStyle(colorScheme == .light ? .black : .white, colorScheme == .light ? .black.opacity(0.1) : .white.opacity(0.2)) + RoundedRectangle(cornerRadius: 24) + .fill(fillColor()) + .frame(width:44,height:30) + .overlay{ + Image("ic-message") + //.background(Color("DamusBlack")) + //.foregroundStyle(Color("DamusBlack")) + .cornerRadius(24) + .frame(width:44,height:30) + .symbolRenderingMode(.palette) + .font(.system(size: 34).weight(.thin)) + } } } var TopSection: some View { - VStack(alignment: .leading) { + ZStack(alignment: .top) { let data = damus_state.profiles.lookup(id: profile.pubkey) - HStack(alignment: .center) { - ProfilePicView(pubkey: profile.pubkey, size: PFP_SIZE, highlight: .none, profiles: damus_state.profiles) - .onTapGesture { - is_zoomed.toggle() - } - .sheet(isPresented: $is_zoomed) { - ProfilePicView(pubkey: profile.pubkey, size: zoom_size, highlight: .none, profiles: damus_state.profiles) - } + GeometryReader { geo in + Image("profile-banner") + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: geo.size.width, height: 150) + .clipped() + } + VStack(alignment: .leading) { + let data = damus_state.profiles.lookup(id: profile.pubkey) - Spacer() - - if let profile = data { - if let lnurl = profile.lnurl { - LNButton(lnurl: lnurl, profile: profile) + HStack(alignment: .center) { + Circle() + .frame(width:60, height: 60) // Increase this to see a frame. + .foregroundColor(imageBorderColor()) + .overlay{ + ProfilePicView(pubkey: profile.pubkey, size: PFP_SIZE, highlight: .none, profiles: damus_state.profiles) + .onTapGesture { + is_zoomed.toggle() + } + .sheet(isPresented: $is_zoomed) { + ProfilePicView(pubkey: profile.pubkey, size: zoom_size, highlight: .none, profiles: damus_state.profiles) + } + } + .offset(y: -30) // Increase if set a frame + + Spacer() + + if let profile = data { + if let lnurl = profile.lnurl { + if lnurl != "" { + LNButton(lnurl: lnurl, profile: profile) + } + } } - } - - DMButton - - if profile.pubkey != damus_state.pubkey { - FollowButtonView( - target: profile.get_follow_target(), - follow_state: damus_state.contacts.follow_state(profile.pubkey) - ) - } else { - if damus_state.keypair.privkey != nil { + + DMButton + + if profile.pubkey != damus_state.pubkey { + FollowButtonView( + target: profile.get_follow_target(), + follow_state: damus_state.contacts.follow_state(profile.pubkey) + ) + } else { NavigationLink(destination: EditMetadataView(damus_state: damus_state)) { EditButton(damus_state: damus_state) } } } - } - - ProfileNameView(pubkey: profile.pubkey, profile: data, contacts: damus_state.contacts) - .padding(.bottom) - - Text(ProfileView.markdown.process(data?.about ?? "")) - .font(.subheadline) - - Divider() + ProfileNameView(pubkey: profile.pubkey, profile: data, contacts: damus_state.contacts) + //.padding(.bottom) + .padding(.top,-25) - HStack { - if let contact = profile.contacts { - let contacts = contact.referenced_pubkeys.map { $0.ref_id } - let following_model = FollowingModel(damus_state: damus_state, contacts: contacts) - NavigationLink(destination: FollowingView(damus_state: damus_state, following: following_model, whos: profile.pubkey)) { - HStack { - Text("\(profile.following)") - .font(.subheadline.weight(.medium)) - Text("Following") - .font(.subheadline) - .foregroundColor(.gray) + Text(ProfileView.markdown.process(data?.about ?? "")) + .font(.subheadline) + + Divider() + + HStack { + if let contact = profile.contacts { + let contacts = contact.referenced_pubkeys.map { $0.ref_id } + let following_model = FollowingModel(damus_state: damus_state, contacts: contacts) + NavigationLink(destination: FollowingView(damus_state: damus_state, following: following_model, whos: profile.pubkey)) { + HStack { + Text("\(profile.following)") + .font(.subheadline.weight(.medium)) + Text("Following") + .font(.subheadline) + .foregroundColor(.gray) + } } + .buttonStyle(PlainButtonStyle()) } - .buttonStyle(PlainButtonStyle()) - } - let fview = FollowersView(damus_state: damus_state, whos: profile.pubkey) - .environmentObject(followers) - if followers.contacts != nil { - NavigationLink(destination: fview) { + let fview = FollowersView(damus_state: damus_state, whos: profile.pubkey) + .environmentObject(followers) + if followers.contacts != nil { + NavigationLink(destination: fview) { + FollowersCount + } + .buttonStyle(PlainButtonStyle()) + } else { FollowersCount + .onTapGesture { + UIImpactFeedbackGenerator(style: .light).impactOccurred() + followers.contacts = [] + followers.subscribe() + } } - .buttonStyle(PlainButtonStyle()) - } else { - FollowersCount - .onTapGesture { - UIImpactFeedbackGenerator(style: .light).impactOccurred() - followers.contacts = [] - followers.subscribe() + + if let relays = profile.relays { + NavigationLink(destination: UserRelaysView(state: damus_state, pubkey: profile.pubkey, relays: Array(relays.keys).sorted())) { + Text("\(relays.keys.count)") + .font(.subheadline.weight(.medium)) + Text("Relays") + .font(.subheadline) + .foregroundColor(.gray) } - } - - if let relays = profile.relays { - NavigationLink(destination: UserRelaysView(state: damus_state, pubkey: profile.pubkey, relays: Array(relays.keys).sorted())) { - Text("\(relays.keys.count)") - .font(.subheadline.weight(.medium)) - Text("Relays") - .font(.subheadline) - .foregroundColor(.gray) + .buttonStyle(PlainButtonStyle()) } - .buttonStyle(PlainButtonStyle()) } } + .padding(.horizontal,18) + //.offset(y:120) + .padding(.top,150) } } var FollowersCount: some View { HStack { - Text("\(followers.count_display)") - .font(.subheadline.weight(.medium)) + if followers.count_display == "?" { + Image(systemName: "square.and.arrow.down") + } else { + Text("\(followers.count_display)") + .font(.subheadline.weight(.medium)) + } Text("Followers") .font(.subheadline) .foregroundColor(.gray) } } - + var body: some View { + VStack(alignment: .leading) { ScrollView { TopSection - .padding(.horizontal) Divider() @@ -293,6 +339,7 @@ struct ProfileView: View { followers.unsubscribe() // our profilemodel needs a bit more help } + .ignoresSafeArea() } } @@ -308,8 +355,9 @@ struct ProfileView_Previews: PreviewProvider { func test_damus_state() -> DamusState { let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681" - let damus: DamusState = .empty - let prof = Profile(name: "damus", display_name: "Damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io") + let damus = DamusState(pool: RelayPool(), keypair: Keypair(pubkey: pubkey, privkey: "privkey"), likes: EventCounter(our_pubkey: pubkey), boosts: EventCounter(our_pubkey: pubkey), contacts: Contacts(), tips: TipCounter(our_pubkey: pubkey), profiles: Profiles(), dms: DirectMessagesModel(), previews: PreviewCache()) + + let prof = Profile(name: "damus", display_name: "damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io") let tsprof = TimestampedProfile(profile: prof, timestamp: 0) damus.profiles.add(id: pubkey, profile: tsprof) return damus @@ -322,20 +370,75 @@ struct KeyView: View { @State private var isCopied = false + func fillColor() -> Color { + colorScheme == .light ? Color("DamusLightGrey") : Color("DamusDarkGrey") + } + + func keyColor() -> Color { + colorScheme == .light ? Color("DamusBlack") : Color("DamusWhite") + } + var body: some View { let col = id_to_color(pubkey) let bech32 = bech32_pubkey(pubkey) ?? pubkey - Button { - UIPasteboard.general.string = bech32 - isCopied = true - } label: { - Label(isCopied ? "Copied" : "", systemImage: "key.fill") - .font(isCopied ? .caption : .system(size: 15).weight(.light)) - .symbolRenderingMode(.hierarchical) - .foregroundColor(isCopied ? .gray : col) + HStack { + RoundedRectangle(cornerRadius: 24) + .frame(width: 275, height:22) + .foregroundColor(fillColor()) + .overlay( + HStack { + Button { + UIPasteboard.general.string = bech32 + isCopied = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + isCopied = false + } + } label: { + Label { + Text("Public key") + } icon: { + Image("ic-key") + .contentShape(Rectangle()) + .frame(width: 16, height: 16) + } + .labelStyle(IconOnlyLabelStyle()) + .symbolRenderingMode(.hierarchical) + } + .padding(.leading,4) + Text(bech32) + .font(.footnote) + .foregroundColor(keyColor()) + .offset(x:-3) // Not sure why this is needed. + } + ) + if isCopied != true { + Button { + UIPasteboard.general.string = bech32 + isCopied = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + isCopied = false + } + } label: { + Label { + Text("Public key") + } icon: { + Image("ic-copy") + .contentShape(Rectangle()) + .frame(width: 20, height: 20) + } + .labelStyle(IconOnlyLabelStyle()) + .symbolRenderingMode(.hierarchical) + } + } else { + HStack { + Image("ic-tick") + .frame(width: 20, height: 20) + Text("Copied") + .font(.footnote) + .foregroundColor(Color("DamusGreen")) + } + } } } } - -