From 732dc21dc0469c04e75313643763d4f94fc2adb9 Mon Sep 17 00:00:00 2001 From: Nolan Waite Date: Sun, 12 Jun 2022 20:25:59 -0300 Subject: [PATCH] Initial commit for release build. Cloned from main and porting changes over Critical changes in this commit for the new SpankyKong theme, new model for additional fields, updated stencils and adding lotties Adding updates to scraping and views. Adding Chidori menu Updating post view images and adding bookmark colour picker view Slight cleanup and navigation bar changes Fix lotties Small fixes Final cleanup pass 1 Cleanup More cleanup Fixed platinum-member.png and ghost.json locations. Removed my account from SmileyKeyboard signing settings Changing posted toot back to 100x100 --- .../ComposeTextViewController.swift | 7 +- App/Data Sources/ForumListDataSource.swift | 8 +- App/Data Sources/MessageListDataSource.swift | 36 +- App/Data Sources/ThreadListDataSource.swift | 15 +- App/Extensions/UIKit.swift | 120 ++- App/Main/RootViewControllerStack.swift | 12 + App/Misc/HTMLRenderingHelpers.swift | 25 + .../Thread+Presentation.swift | 2 +- App/Navigation/NavigationBar.swift | 26 +- App/Navigation/NavigationController.swift | 39 + App/Posts/ReplyWorkspace.swift | 12 +- .../Assets.xcassets/Colors/Contents.json | 6 + .../Colors/SpankyKongLightTheme/Contents.json | 6 + .../backgroundColor.colorset}/Contents.json | 12 +- .../tintColor.colorset}/Contents.json | 12 +- .../Assets.xcassets/Empty Tags/Contents.json | 6 +- .../empty-pm-tag.imageset/Contents.json | 8 +- .../empty-pm-tag.imageset/empty-pm-tag@2x.png | Bin 429 -> 0 bytes .../empty-pm-tag@3x(1).png | Bin 0 -> 1258 bytes .../empty-thread-tag.imageset/Contents.json | 10 +- .../EmptyThreadTag@3x(1)-1.png | Bin 0 -> 1841 bytes .../EmptyThreadTag@3x(1)-2.png | Bin 0 -> 1841 bytes .../EmptyThreadTag@3x(1).png | Bin 0 -> 1841 bytes .../empty-thread-tag@2x.png | Bin 318 -> 0 bytes .../Contents.json | 21 + .../SquareBG@3x(1).png | Bin 0 -> 1425 bytes .../thread-tag-border.imageset/Contents.json | 21 + .../thread-tag-border.imageset/border.png | Bin 0 -> 1570 bytes .../Assets.xcassets/Forum Lists/Contents.json | 6 + .../forum-arrow-down.imageset/Contents.json | 11 +- .../forum-arrow-down@1x.png | Bin 0 -> 248 bytes .../forum-arrow-down@2x.png | Bin 200 -> 375 bytes .../forum-arrow-down@3x.png | Bin 260 -> 591 bytes .../forum-arrow-right.imageset/Contents.json | 18 +- .../forum-arrow-right@1x.png | Bin 93 -> 229 bytes .../forum-arrow-right@2x.png | Bin 109 -> 392 bytes .../forum-arrow-right@3x.png | Bin 122 -> 640 bytes .../star-off.imageset/Contents.json | 11 +- .../star-off.imageset/star-off@1x.png | Bin 0 -> 368 bytes .../star-off.imageset/star-off@2x.png | Bin 434 -> 625 bytes .../star-off.imageset/star-off@3x.png | Bin 591 -> 967 bytes .../star-on.imageset/Contents.json | 11 +- .../star-on.imageset/star-on@1x.png | Bin 0 -> 361 bytes .../star-on.imageset/star-on@2x.png | Bin 340 -> 581 bytes .../star-on.imageset/star-on@3x.png | Bin 429 -> 780 bytes .../copy.imageset/Contents.json | 22 + .../rainbow.imageset/Contents.json | 23 + .../rainbow.imageset/rainbow@1x.png | Bin 0 -> 421 bytes .../rainbow.imageset/rainbow@2x.png | Bin 0 -> 803 bytes .../rainbow.imageset/rainbow@3x.png | Bin 0 -> 1317 bytes .../LaunchBackground.imageset/Contents.json | 83 ++ .../LaunchBackgroundDark.png | Bin 0 -> 82 bytes .../LaunchBackgroundLight-1.png | Bin 0 -> 82 bytes .../LaunchBackgroundLight.png | Bin 0 -> 82 bytes .../title-probation.imageset/Contents.json | 10 +- .../title-probation.png | Bin 25855 -> 26247 bytes .../no-filter-icon.imageset/Contents.json | 12 +- .../no-filter-icon@1x.png | Bin 0 -> 649 bytes .../no-filter-icon@2x.png | Bin 1183 -> 1264 bytes .../no-filter-icon@3x.png | Bin 0 -> 1840 bytes .../BlueCheckSelected@2x.png | Bin 1077 -> 0 bytes .../selected-tick-icon.imageset/Contents.json | 12 +- .../mini_tick@1x.png | Bin 0 -> 399 bytes .../mini_tick@2x.png | Bin 0 -> 803 bytes .../mini_tick@3x.png | Bin 0 -> 1097 bytes .../Assets.xcassets/Posts View/Contents.json | 6 + .../Posts View/Vote0.imageset/Contents.json | 23 + .../Posts View/Vote0.imageset/Vote0@1x.png | Bin 0 -> 238 bytes .../Posts View/Vote0.imageset/Vote0@2x.png | Bin 0 -> 380 bytes .../Posts View/Vote0.imageset/Vote0@3x.png | Bin 0 -> 1491 bytes .../Posts View/Vote1.imageset/Contents.json | 23 + .../Posts View/Vote1.imageset/Vote1@1x.png | Bin 0 -> 179 bytes .../Posts View/Vote1.imageset/Vote1@2x.png | Bin 0 -> 259 bytes .../Posts View/Vote1.imageset/Vote1@3x.png | Bin 0 -> 1902 bytes .../Posts View/Vote2.imageset/Contents.json | 23 + .../Posts View/Vote2.imageset/Vote2@1x.png | Bin 0 -> 216 bytes .../Posts View/Vote2.imageset/Vote2@2x.png | Bin 0 -> 313 bytes .../Posts View/Vote2.imageset/Vote2@3x.png | Bin 0 -> 1986 bytes .../Posts View/Vote3.imageset/Contents.json | 23 + .../Posts View/Vote3.imageset/Vote3@1x.png | Bin 0 -> 254 bytes .../Posts View/Vote3.imageset/Vote3@2x.png | Bin 0 -> 344 bytes .../Posts View/Vote3.imageset/Vote3@3x.png | Bin 0 -> 2043 bytes .../Posts View/Vote4.imageset/Contents.json | 23 + .../Posts View/Vote4.imageset/Vote4@1x.png | Bin 0 -> 253 bytes .../Posts View/Vote4.imageset/Vote4@2x.png | Bin 0 -> 346 bytes .../Posts View/Vote4.imageset/Vote4@3x.png | Bin 0 -> 2085 bytes .../Posts View/Vote5.imageset/Contents.json | 23 + .../Posts View/Vote5.imageset/Vote5@1x.png | Bin 0 -> 586 bytes .../Posts View/Vote5.imageset/Vote5@2x.png | Bin 0 -> 850 bytes .../Posts View/Vote5.imageset/Vote5@3x.png | Bin 0 -> 2495 bytes .../newpm.imageset/Contents.json | 11 +- .../newpm.imageset/newpm@2x.png | Bin 597 -> 1097 bytes .../newpm.imageset/newpm@3x.png | Bin 819 -> 1431 bytes .../newpm.imageset/pm-icon@1x.png | Bin 0 -> 412 bytes .../pmforwarded.imageset/Contents.json | 11 +- .../pmforwarded.imageset/pmforwarded@1x.png | Bin 0 -> 741 bytes .../pmforwarded.imageset/pmforwarded@2x.png | Bin 460 -> 1083 bytes .../pmforwarded.imageset/pmforwarded@3x.png | Bin 624 -> 1123 bytes .../pmreplied.imageset/Contents.json | 11 +- .../pmreplied.imageset/pmreplied@1x.png | Bin 0 -> 851 bytes .../pmreplied.imageset/pmreplied@2x.png | Bin 597 -> 1329 bytes .../pmreplied.imageset/pmreplied@3x.png | Bin 853 -> 1326 bytes .../Template Images/Contents.json | 6 +- .../action.imageset/Contents.json | 10 +- .../arrowleft.imageset/Contents.json | 11 +- .../arrowleft.imageset/arrowleft@1x.png | Bin 0 -> 265 bytes .../arrowleft.imageset/arrowleft@2x.png | Bin 181 -> 498 bytes .../arrowleft.imageset/arrowleft@3x.png | Bin 237 -> 844 bytes .../arrowright.imageset/Contents.json | 14 +- .../arrowright.imageset/Untitled-1@1x.png | Bin 0 -> 331 bytes .../arrowright.imageset/Untitled-1@2x.png | Bin 0 -> 699 bytes .../arrowright.imageset/arrowright@2x.png | Bin 179 -> 0 bytes .../arrowright.imageset/arrowright@3x.png | Bin 238 -> 2264 bytes .../back.imageset/Contents.json | 11 +- .../back.imageset/main-back@1x.png | Bin 0 -> 297 bytes .../back.imageset/main-back@2x.png | Bin 207 -> 541 bytes .../back.imageset/main-back@3x.png | Bin 238 -> 832 bytes .../bookmarks-filled.imageset/Contents.json | 11 +- .../bookmarks-filled@1x.png | Bin 0 -> 304 bytes .../bookmarks-filled@2x.png | Bin 315 -> 464 bytes .../bookmarks-filled@3x.png | Bin 404 -> 718 bytes .../bookmarks.imageset/Contents.json | 11 +- .../bookmarks.imageset/bookmarks@1x.png | Bin 0 -> 387 bytes .../bookmarks.imageset/bookmarks@2x.png | Bin 407 -> 631 bytes .../bookmarks.imageset/bookmarks@3x.png | Bin 554 -> 986 bytes .../brightness-down.imageset/Contents.json | 10 +- .../brightness-up.imageset/Contents.json | 10 +- .../cog-filled.imageset/Contents.json | 11 +- .../cog-filled.imageset/cog-filled@1x.png | Bin 0 -> 378 bytes .../cog-filled.imageset/cog-filled@2x.png | Bin 389 -> 754 bytes .../cog-filled.imageset/cog-filled@3x.png | Bin 574 -> 961 bytes .../cog.imageset/Contents.json | 11 +- .../Template Images/cog.imageset/cog@1x.png | Bin 0 -> 563 bytes .../Template Images/cog.imageset/cog@2x.png | Bin 483 -> 970 bytes .../compose.imageset/Contents.json | 11 +- .../compose.imageset/compose@1x.png | Bin 0 -> 353 bytes .../compose.imageset/compose@2x.png | Bin 333 -> 597 bytes .../compose.imageset/compose@3x.png | Bin 417 -> 841 bytes .../forum-list-filled.imageset/Contents.json | 11 +- .../list_icon-filled@1x.png | Bin 0 -> 403 bytes .../list_icon-filled@2x.png | Bin 231 -> 526 bytes .../forum-list.imageset/Contents.json | 11 +- .../forum-list.imageset/list_icon@1x.png | Bin 0 -> 339 bytes .../forum-list.imageset/list_icon@2x.png | Bin 238 -> 470 bytes .../lepers-filled.imageset/Contents.json | 11 +- .../lepers_filled@1x.png | Bin 0 -> 320 bytes .../lepers_filled@2x.png | Bin 323 -> 531 bytes .../lepers_filled@3x.png | Bin 411 -> 793 bytes .../lepers.imageset/Contents.json | 11 +- .../lepers.imageset/lepers_icon@1x.png | Bin 0 -> 441 bytes .../lepers.imageset/lepers_icon@2x.png | Bin 399 -> 732 bytes .../lepers.imageset/lepers_icon@3x.png | Bin 546 -> 1034 bytes .../page-settings.imageset/Contents.json | 11 +- .../page-settings@2x.png | Bin 254 -> 0 bytes .../page-settings@3x.png | Bin 541 -> 0 bytes .../page_settings@1x.png | Bin 0 -> 444 bytes .../page_settings@2x.png | Bin 0 -> 785 bytes .../page_settings@3x.png | Bin 0 -> 1199 bytes .../pm-icon-filled.imageset/Contents.json | 11 +- .../pm-icon-filled@1x.png | Bin 0 -> 348 bytes .../pm-icon-filled@2x.png | Bin 351 -> 525 bytes .../pm-icon-filled@3x.png | Bin 454 -> 823 bytes .../pm-icon.imageset/Contents.json | 11 +- .../pm-icon.imageset/pm-icon@1x.png | Bin 0 -> 423 bytes .../pm-icon.imageset/pm-icon@2x.png | Bin 380 -> 650 bytes .../pm-icon.imageset/pm-icon@3x.png | Bin 494 -> 1092 bytes .../pull-to-refresh.imageset/Contents.json | 10 +- .../pull-to-refresh@2x.png | Bin 561 -> 2662 bytes .../pull-to-refresh@3x.png | Bin 743 -> 3341 bytes .../reply.imageset/Contents.json | 11 +- .../reply.imageset/reply@1x.png | Bin 0 -> 393 bytes .../reply.imageset/reply@2x.png | Bin 299 -> 716 bytes .../reply.imageset/reply@3x.png | Bin 453 -> 1158 bytes .../steamed-ham.imageset/Contents.json | 4 +- .../steamed-ham.imageset/steamed-ham@1x.png | Bin 0 -> 382 bytes .../steamed-ham.imageset/steamed-ham@2x.png | Bin 621 -> 664 bytes .../steamed-ham.imageset/steamed-ham@3x.png | Bin 929 -> 987 bytes .../Thread Lists/Contents.json | 6 + .../Thread Lists/page.imageset/Contents.json | 23 + .../Thread Lists/page.imageset/page@1x.png | Bin 0 -> 221 bytes .../Thread Lists/page.imageset/page@2x.png | Bin 0 -> 300 bytes .../Thread Lists/page.imageset/page@3x(1).png | Bin 0 -> 350 bytes .../onepassword-button.imageset/Contents.json | 56 + App/Resources/Lotties/GhostAnim.json | 1 + App/Resources/Lotties/MainThrobberX120.json | 1 + App/Resources/Lotties/TootX120.json | 1 + App/Resources/Lotties/getout_v3_120.json | 1 + App/Resources/Lotties/getout_vP2_120.json | 1 + App/Resources/Lotties/getout_vP3_120.json | 1 + App/Resources/Lotties/getout_vP_120.json | 1 + App/Resources/Lotties/getout_vZ_120.json | 1 + App/Resources/Lotties/niggly120.json | 1 + App/Resources/Lotties/niggly3x120.json | 1 + App/Resources/Lotties2/GhostAnim.json | 1 + App/Resources/Lotties2/MainThrobberX120.json | 1 + App/Resources/Lotties2/TootX120.json | 1 + App/Resources/Lotties2/getout_v3_120.json | 1 + App/Resources/Lotties2/getout_vP2_120.json | 1 + App/Resources/Lotties2/getout_vP3_120.json | 1 + App/Resources/Lotties2/getout_vP_120.json | 1 + App/Resources/Lotties2/getout_vZ_120.json | 1 + App/Resources/Lotties2/niggly120.json | 1 + App/Resources/Lotties2/niggly3x120.json | 1 + App/Resources/RenderView.js | 74 +- App/Resources/Theming/ghost.json | 1 + .../Theming/platinum-member-white@2x.png | Bin 281 -> 0 bytes .../Theming/platinum-member-white@3x.png | Bin 383 -> 0 bytes App/Resources/Theming/platinum-member.png | Bin 0 -> 620 bytes App/Resources/Theming/platinum-member@2x.png | Bin 279 -> 0 bytes App/Resources/Theming/platinum-member@3x.png | Bin 373 -> 0 bytes App/Resources/Theming/post-dots.png | Bin 1180 -> 364 bytes App/Resources/Theming/post-dots@2x.png | Bin 203 -> 0 bytes App/Resources/Theming/post-dots@3x.png | Bin 289 -> 0 bytes App/Resources/Theming/quote-post.png | Bin 1025 -> 2809 bytes App/Templates/PostsView.html.stencil | 4 +- App/Templates/PrivateMessage.html.stencil | 7 +- App/Theming/Themes.plist | 395 +++++++ App/Theming/Themes.swift | 4 + App/Theming/ViewController.swift | 6 +- App/Theming/posts-view-alternate-dark.css | 183 ++++ App/Theming/posts-view-alternate.css | 183 ++++ App/Theming/posts-view-bright-light.css | 183 ++++ App/Theming/posts-view-byob.css | 183 ++++ App/Theming/posts-view-dark.css | 183 ++++ App/Theming/posts-view-fyad.css | 183 ++++ App/Theming/posts-view-gas-chamber.css | 183 ++++ App/Theming/posts-view-macinyos.css | 183 ++++ App/Theming/posts-view-oled-dark.css | 88 ++ App/Theming/posts-view-spankykong-light.css | 937 +++++++++++++++++ App/Theming/posts-view-spankykong-light.less | 564 ++++++++++ .../posts-view-spankykong-oled-dark.css | 991 ++++++++++++++++++ .../posts-view-spankykong-oled-dark.less | 566 ++++++++++ App/Theming/posts-view-yospos.css | 206 ++++ App/Thread Tags/ThreadTagLoader.swift | 44 +- .../AnnouncementViewController.swift | 3 +- .../Forums/ForumListCell.swift | 25 +- .../Forums/ForumsTableViewController.swift | 32 +- .../Messages/MessageListCell.swift | 45 +- .../Messages/MessageListViewController.swift | 16 +- .../Messages/MessageViewController.swift | 21 +- .../Posts/PostViewModel.swift | 23 +- .../Posts/PostsPageRefreshArrowView.swift | 1 + .../Posts/PostsPageRefreshSpinnerView.swift | 154 +-- .../Posts/PostsPageView.swift | 25 +- .../Posts/PostsPageViewController.swift | 79 +- .../ProfileViewController.swift | 2 +- .../Rap Sheet/RapSheetViewController.swift | 15 +- .../RootTabBarController.swift | 37 +- .../Settings/AppIconPickerCell.swift | 4 +- .../Settings/SettingsViewController.swift | 16 +- .../ThreadTagPickerViewController.swift | 10 +- .../BookmarksTableViewController.swift | 18 +- .../Threads/ThreadListCell.swift | 28 +- .../Threads/ThreadsTableViewController.swift | 1 + ...textMenuConfiguration+ThreadListItem.swift | 21 +- App/Views/BookmarkColorPicker.swift | 282 +++++ App/Views/LoadingView.swift | 90 +- App/Views/NigglyRefreshLottieView.swift | 95 ++ App/Views/RenderView.swift | 8 + .../xcshareddata/swiftpm/Package.resolved | 9 + .../Awful 6.1.xcdatamodel/contents | 1 + AwfulCore/Sources/AwfulCore/Model/User.swift | 17 +- .../AwfulCore/Networking/ForumsClient.swift | 23 + .../Persistence/AuthorPersistence.swift | 1 + .../Persistence/PostPersistence.swift | 4 +- .../Scraping/AuthorSidebarScrapeResult.swift | 6 +- .../Sources/AwfulCore/Scraping/Helpers.swift | 20 +- Xcode/Awful.xcodeproj/project.pbxproj | 125 ++- 268 files changed, 7267 insertions(+), 475 deletions(-) create mode 100644 App/Resources/Assets.xcassets/Colors/Contents.json create mode 100644 App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/Contents.json rename App/Resources/Assets.xcassets/{Launch Screen/LaunchNavigationBar.colorset => Colors/SpankyKongLightTheme/backgroundColor.colorset}/Contents.json (76%) rename App/Resources/Assets.xcassets/{Launch Screen/LaunchBackground.colorset => Colors/SpankyKongLightTheme/tintColor.colorset}/Contents.json (76%) delete mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@2x.png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@3x(1).png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1)-1.png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1)-2.png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1).png delete mode 100644 App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/empty-thread-tag@2x.png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/thread-tag-background.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Empty Tags/thread-tag-background.imageset/SquareBG@3x(1).png create mode 100644 App/Resources/Assets.xcassets/Empty Tags/thread-tag-border.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Empty Tags/thread-tag-border.imageset/border.png create mode 100644 App/Resources/Assets.xcassets/Forum Lists/Contents.json create mode 100644 App/Resources/Assets.xcassets/Forum Lists/forum-arrow-down.imageset/forum-arrow-down@1x.png create mode 100644 App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/star-off@1x.png create mode 100644 App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/star-on@1x.png create mode 100644 App/Resources/Assets.xcassets/Icon Action Items/copy.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/rainbow@1x.png create mode 100644 App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/rainbow@2x.png create mode 100644 App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/rainbow@3x.png create mode 100644 App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/LaunchBackgroundDark.png create mode 100644 App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/LaunchBackgroundLight-1.png create mode 100644 App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/LaunchBackgroundLight.png create mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@1x.png create mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@3x.png delete mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/BlueCheckSelected@2x.png create mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@1x.png create mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@2x.png create mode 100644 App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@3x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@1x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@2x.png create mode 100644 App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@3x.png create mode 100644 App/Resources/Assets.xcassets/Private Messages/newpm.imageset/pm-icon@1x.png create mode 100644 App/Resources/Assets.xcassets/Private Messages/pmforwarded.imageset/pmforwarded@1x.png create mode 100644 App/Resources/Assets.xcassets/Private Messages/pmreplied.imageset/pmreplied@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/arrowleft@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@2x.png delete mode 100644 App/Resources/Assets.xcassets/Template Images/arrowright.imageset/arrowright@2x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/back.imageset/main-back@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/bookmarks-filled.imageset/bookmarks-filled@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/cog-filled.imageset/cog-filled@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/cog.imageset/cog@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/compose.imageset/compose@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/list_icon-filled@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/forum-list.imageset/list_icon@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/lepers-filled.imageset/lepers_filled@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@1x.png delete mode 100644 App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@2x.png delete mode 100644 App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@3x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@2x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@3x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/pm-icon-filled.imageset/pm-icon-filled@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/pm-icon.imageset/pm-icon@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/reply.imageset/reply@1x.png create mode 100644 App/Resources/Assets.xcassets/Template Images/steamed-ham.imageset/steamed-ham@1x.png create mode 100644 App/Resources/Assets.xcassets/Thread Lists/Contents.json create mode 100644 App/Resources/Assets.xcassets/Thread Lists/page.imageset/Contents.json create mode 100644 App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@1x.png create mode 100644 App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@2x.png create mode 100644 App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@3x(1).png create mode 100644 App/Resources/Assets.xcassets/onepassword-button.imageset/Contents.json create mode 100755 App/Resources/Lotties/GhostAnim.json create mode 100644 App/Resources/Lotties/MainThrobberX120.json create mode 100644 App/Resources/Lotties/TootX120.json create mode 100755 App/Resources/Lotties/getout_v3_120.json create mode 100755 App/Resources/Lotties/getout_vP2_120.json create mode 100755 App/Resources/Lotties/getout_vP3_120.json create mode 100755 App/Resources/Lotties/getout_vP_120.json create mode 100755 App/Resources/Lotties/getout_vZ_120.json create mode 100755 App/Resources/Lotties/niggly120.json create mode 100755 App/Resources/Lotties/niggly3x120.json create mode 100755 App/Resources/Lotties2/GhostAnim.json create mode 100644 App/Resources/Lotties2/MainThrobberX120.json create mode 100644 App/Resources/Lotties2/TootX120.json create mode 100755 App/Resources/Lotties2/getout_v3_120.json create mode 100755 App/Resources/Lotties2/getout_vP2_120.json create mode 100755 App/Resources/Lotties2/getout_vP3_120.json create mode 100755 App/Resources/Lotties2/getout_vP_120.json create mode 100755 App/Resources/Lotties2/getout_vZ_120.json create mode 100755 App/Resources/Lotties2/niggly120.json create mode 100755 App/Resources/Lotties2/niggly3x120.json create mode 100644 App/Resources/Theming/ghost.json delete mode 100644 App/Resources/Theming/platinum-member-white@2x.png delete mode 100644 App/Resources/Theming/platinum-member-white@3x.png create mode 100644 App/Resources/Theming/platinum-member.png delete mode 100644 App/Resources/Theming/platinum-member@2x.png delete mode 100644 App/Resources/Theming/platinum-member@3x.png delete mode 100644 App/Resources/Theming/post-dots@2x.png delete mode 100644 App/Resources/Theming/post-dots@3x.png create mode 100644 App/Theming/posts-view-spankykong-light.css create mode 100644 App/Theming/posts-view-spankykong-light.less create mode 100644 App/Theming/posts-view-spankykong-oled-dark.css create mode 100644 App/Theming/posts-view-spankykong-oled-dark.less create mode 100644 App/Views/BookmarkColorPicker.swift create mode 100644 App/Views/NigglyRefreshLottieView.swift diff --git a/App/Composition/ComposeTextViewController.swift b/App/Composition/ComposeTextViewController.swift index 868bccf34..8bca7defd 100644 --- a/App/Composition/ComposeTextViewController.swift +++ b/App/Composition/ComposeTextViewController.swift @@ -179,12 +179,13 @@ class ComposeTextViewController: ViewController { fileprivate var imageUploadProgress: Progress? fileprivate func submit() { - let overlay = MRProgressOverlayView.showOverlayAdded(to: viewToOverlay, title: submissionInProgressTitle, mode: .indeterminate, animated: true) - overlay?.tintColor = theme["tintColor"] + let loadingView = PostedTootLoadingView() + loadingView.backgroundColor = theme["backgroundColor"] + + view.addSubview(loadingView) imageUploadProgress = uploadImages(attachedTo: textView.attributedText, completion: { [weak self] (plainText, error) in if let error = error { - overlay?.dismiss(false) self?.enableEverything() diff --git a/App/Data Sources/ForumListDataSource.swift b/App/Data Sources/ForumListDataSource.swift index d93768de6..c5c4b7598 100644 --- a/App/Data Sources/ForumListDataSource.swift +++ b/App/Data Sources/ForumListDataSource.swift @@ -432,9 +432,9 @@ extension ForumListDataSource: UITableViewDataSource { return ForumListCell.ViewModel( backgroundColor: theme["listBackgroundColor"]!, expansion: .none, - expansionTintColor: theme["tintColor"]!, + expansionTintColor: theme["expansionTintColor"]!, favoriteStar: .isFavorite, - favoriteStarTintColor: theme["tintColor"]!, + favoriteStarTintColor: theme["favoriteStarTintColor"]!, forumName: NSAttributedString(string: forum.name ?? "", attributes: [ .font: UIFont.preferredFont(forTextStyle: .body), .foregroundColor: theme[color: "listTextColor"]!]), @@ -455,9 +455,9 @@ extension ForumListDataSource: UITableViewDataSource { return .canExpand } }(), - expansionTintColor: theme["tintColor"]!, + expansionTintColor: theme["expansionTintColor"]!, favoriteStar: forum.metadata.favorite ? .hidden : .canFavorite, - favoriteStarTintColor: theme["tintColor"]!, + favoriteStarTintColor: theme["favoriteStarTintColor"]!, forumName: NSAttributedString(string: forum.name ?? "", attributes: [ .font: UIFont.preferredFont(forTextStyle: .body), .foregroundColor: theme[color: "listTextColor"]!]), diff --git a/App/Data Sources/MessageListDataSource.swift b/App/Data Sources/MessageListDataSource.swift index 8f450f8b9..694f68b52 100644 --- a/App/Data Sources/MessageListDataSource.swift +++ b/App/Data Sources/MessageListDataSource.swift @@ -5,6 +5,7 @@ import AwfulCore import CoreData import UIKit +import HTMLReader private let Log = Logger.get() @@ -97,7 +98,9 @@ extension MessageListDataSource: UITableViewDataSource { let message = self.message(at: indexPath) let theme = Theme.defaultTheme() + // Create Date Formatter let dateFormatter = DateFormatter() + // Set Date/Time Style dateFormatter.dateFormat = "d MMM" var sentDateRawFont: UIFont @@ -113,15 +116,18 @@ extension MessageListDataSource: UITableViewDataSource { senderFont = UIFont.systemFont(ofSize: 15, weight: .regular) subjectFont = UIFont.systemFont(ofSize: 15, weight: .regular) } + return MessageListCell.ViewModel( backgroundColor: theme["listBackgroundColor"]!, selectedBackgroundColor: theme["listSelectedBackgroundColor"]!, sender: NSAttributedString(string: message.fromUsername ?? "", attributes: [ - .foregroundColor: theme[color: "listTextColor"]!]), .font: senderFont, + .foregroundColor: theme[color: "listSecondaryTextColor"]!]), sentDate: message.sentDate ?? .distantPast, - sentDateAttributes: [ - .foregroundColor: theme[color: "listTextColor"]!], + sentDateAttributes: [: +// .font: UIFont.preferredFontForTextStyle(.body, fontName: nil, sizeAdjustment: -2), +// .foregroundColor: theme[color: "listTextColor"]! + ], sentDateRaw: NSAttributedString(string: dateFormatter.string(from: message.sentDate!), attributes: [ .font: sentDateRawFont, .foregroundColor: theme[color: "listSecondaryTextColor"]!]), @@ -129,13 +135,31 @@ extension MessageListDataSource: UITableViewDataSource { .font: subjectFont, .foregroundColor: theme[color: "listTextColor"]!]), tagImage: .image(name: message.threadTag?.imageName, placeholder: .privateMessage), + tagOverlayImage: { if message.replied { - return UIImage(named: "pmreplied") + let image = UIImage(named: "pmreplied")? + .stroked(with: theme["listBackgroundColor"]!, thickness: 3, quality: 1) + .withRenderingMode(.alwaysTemplate) + + let imageView = UIImageView(image: image) + imageView.tintColor = theme["listBackgroundColor"]! + + return imageView } else if message.forwarded { - return UIImage(named: "pmforwarded") + let image = UIImage(named: "pmforwarded")? + .stroked(with: theme["listBackgroundColor"]!, thickness: 3, quality: 1) + .withRenderingMode(.alwaysTemplate) + + let imageView = UIImageView(image: image) + imageView.tintColor = theme["listBackgroundColor"]! + + return imageView } else if !message.seen { - return UIImage(named: "newpm") + let image = UIImage(named: "newpm") + let imageView = UIImageView(image: image) + + return imageView } else { return nil } diff --git a/App/Data Sources/ThreadListDataSource.swift b/App/Data Sources/ThreadListDataSource.swift index c702c9b23..5c2c0f7f9 100644 --- a/App/Data Sources/ThreadListDataSource.swift +++ b/App/Data Sources/ThreadListDataSource.swift @@ -169,13 +169,16 @@ extension ThreadListDataSource: UITableViewDataSource { } else { text = String(format: LocalizedString("thread-list.posted-by"), thread.author?.username ?? "") + }/* killed by text */ var killedByFont: UIFont + if Theme.defaultTheme().roundedFonts { killedByFont = roundedFont(ofSize: 13, weight: .semibold) } else { killedByFont = UIFont.systemFont(ofSize: 13, weight: .medium) } + return NSAttributedString(string: text, attributes: [ .font: killedByFont, .foregroundColor: theme[color: "listSecondaryTextColor"]!]) @@ -188,8 +191,16 @@ extension ThreadListDataSource: UITableViewDataSource { if let tweaks = tweaks, tweaks.showRatingsAsThreadTags { return nil } - - return thread.ratingImageName.flatMap { UIImage(named: $0) } + + return thread.ratingImageName.flatMap { + if $0 != "Vote0.0" { + return UIImage(named: "Vote0")! + .withTintColor(Theme.defaultTheme()["ratingIconEmptyColor"]!) + .mergeWith(topImage: UIImage(named: $0)!) + } + return UIImage(named: "Vote0")! + .withTintColor(Theme.defaultTheme()["ratingIconEmptyColor"]!) + } }(), secondaryTagImageName: { if !showsTagAndRating { diff --git a/App/Extensions/UIKit.swift b/App/Extensions/UIKit.swift index 6c63a971c..05debc27a 100644 --- a/App/Extensions/UIKit.swift +++ b/App/Extensions/UIKit.swift @@ -181,15 +181,15 @@ extension UIImage { return UIImage(cgImage: imageBitmapContext, scale: self.scale, orientation: UIImage.Orientation.up) } } - +// THREAD TITLE extension UINavigationItem { /// A replacement label for the title that shows two lines on iPhone. var titleLabel: UILabel { if let label = titleView as? UILabel { return label } - let label = UILabel(frame: CGRect(x: 0, y: 0, width: 375, height: 44)) - label.autoresizingMask = [.flexibleWidth, .flexibleHeight] + let label = UILabel(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.minY, height: 44)) + // label.autoresizingMask = [.flexibleWidth, .flexibleHeight] label.textAlignment = .center - label.textColor = .white + label.textColor = Theme.defaultTheme()["navigationBarTextColor"]! label.accessibilityTraits.insert(UIAccessibilityTraits.header) var font: UIFont @@ -200,10 +200,13 @@ extension UINavigationItem { } switch UIDevice.current.userInterfaceIdiom { + /* thread title posts view text */ case .pad: label.font = font +// label.font = UIFont.systemFont(ofSize: 17) default: label.font = font +// label.font = UIFont.systemFont(ofSize: 13) label.numberOfLines = 2 } titleView = label @@ -403,3 +406,112 @@ extension UIViewController { return nil } } + +public extension UIImage { + + /** + Returns the flat colorized version of the image, or self when something was wrong + - Parameters: + - color: The colors to user. By defaut, uses the ``UIColor.white` + - Returns: the flat colorized version of the image, or the self if something was wrong + */ + func colorized(with color: UIColor = .white) -> UIImage { + UIGraphicsBeginImageContextWithOptions(size, false, scale) + + defer { + UIGraphicsEndImageContext() + } + + guard let context = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return self } + + + let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) + + color.setFill() + context.translateBy(x: 0, y: size.height) + context.scaleBy(x: 1.0, y: -1.0) + context.clip(to: rect, mask: cgImage) + context.fill(rect) + + guard let colored = UIGraphicsGetImageFromCurrentImageContext() else { return self } + + return colored + } + + /** + Returns the stroked version of the fransparent image with the given stroke color and the thickness. + - Parameters: + - color: The colors to user. By defaut, uses the ``UIColor.white` + - thickness: the thickness of the border. Default to `2` + - quality: The number of degrees (out of 360): the smaller the best, but the slower. Defaults to `10`. + - Returns: the stroked version of the image, or self if something was wrong + */ + + func stroked(with color: UIColor = .white, thickness: CGFloat = 2, quality: CGFloat = 10) -> UIImage { + + guard let cgImage = cgImage else { return self } + + // Colorize the stroke image to reflect border color + let strokeImage = colorized(with: color) + + guard let strokeCGImage = strokeImage.cgImage else { return self } + + /// Rendering quality of the stroke + let step = quality == 0 ? 10 : abs(quality) + + let oldRect = CGRect(x: thickness, y: thickness, width: size.width, height: size.height).integral + let newSize = CGSize(width: size.width + 2 * thickness, height: size.height + 2 * thickness) + let translationVector = CGPoint(x: thickness, y: 0) + + + UIGraphicsBeginImageContextWithOptions(newSize, false, scale) + + guard let context = UIGraphicsGetCurrentContext() else { return self } + + defer { + UIGraphicsEndImageContext() + } + context.translateBy(x: 0, y: newSize.height) + context.scaleBy(x: 1.0, y: -1.0) + context.interpolationQuality = .high + + for angle: CGFloat in stride(from: 0, to: 360, by: step) { + let vector = translationVector.rotated(around: .zero, byDegrees: angle) + let transform = CGAffineTransform(translationX: vector.x, y: vector.y) + + context.concatenate(transform) + + context.draw(strokeCGImage, in: oldRect) + + let resetTransform = CGAffineTransform(translationX: -vector.x, y: -vector.y) + context.concatenate(resetTransform) + } + + context.draw(cgImage, in: oldRect) + + guard let stroked = UIGraphicsGetImageFromCurrentImageContext() else { return self } + + return stroked + } +} + + +extension CGPoint { + /** + Rotates the point from the center `origin` by `byDegrees` degrees along the Z axis. + - Parameters: + - origin: The center of he rotation; + - byDegrees: Amount of degrees to rotate around the Z axis. + - Returns: The rotated point. + */ + func rotated(around origin: CGPoint, byDegrees: CGFloat) -> CGPoint { + let dx = x - origin.x + let dy = y - origin.y + let radius = sqrt(dx * dx + dy * dy) + let azimuth = atan2(dy, dx) // in radians + let newAzimuth = azimuth + byDegrees * .pi / 180.0 // to radians + let x = origin.x + radius * cos(newAzimuth) + let y = origin.y + radius * sin(newAzimuth) + return CGPoint(x: x, y: y) + } +} diff --git a/App/Main/RootViewControllerStack.swift b/App/Main/RootViewControllerStack.swift index a61698dfe..784254800 100644 --- a/App/Main/RootViewControllerStack.swift +++ b/App/Main/RootViewControllerStack.swift @@ -236,6 +236,18 @@ extension RootViewControllerStack { // This ugliness fixes the resulting navigation controller's toolbar appearing empty despite having the correct items. (i.e. none of the items' views are in the toolbar's view hierarchy.) Presumably if some fix is discovered for the grey screen mentioned atop kindaFixReallyAnnoyingSplitViewHideSidebarInLandscapeBehavior, I think this will be fixed too. Or at least it's worth testing out. let toolbar = primaryNavigationController.toolbar + + if #available(iOS 14.0, *) { + let barAppearance = UIToolbarAppearance() + barAppearance.backgroundColor = .clear + + // below two lines prevent weird unwanted grey bar from appearing. can be confused with "hairline" border! + barAppearance.shadowImage = UIImage() + barAppearance.backgroundImage = UIImage() + + toolbar?.standardAppearance = barAppearance + } + let items = toolbar?.items toolbar?.items = nil toolbar?.items = items diff --git a/App/Misc/HTMLRenderingHelpers.swift b/App/Misc/HTMLRenderingHelpers.swift index 919f445c4..48c1aa026 100644 --- a/App/Misc/HTMLRenderingHelpers.swift +++ b/App/Misc/HTMLRenderingHelpers.swift @@ -30,6 +30,31 @@ extension HTMLDocument { } } + /** + Modifies the document in place, adding an additional element to quote blocks for quote-post.png. + This has been done to facilitate more styling than is possible with background-image in css, namely color changes. + The regular CSS files contain the styling required for this feature, applied against this injected element. + */ + func addQuoteIcons() { + for div in nodes(matchingSelector: ".bbc-block") { + let quoteposticon = HTMLElement( + tagName: "span", + attributes: [ + "class": "quotepost-span" + ]) + div.addChild(quoteposticon) + + let quoteHeaderSpan = HTMLElement(tagName: "span", attributes: [ + "class": "quoteheader"]) + + for quoteheaderLink in div.nodes(matchingSelector: ".quote_link") { + let link = HTMLDocument(string: quoteheaderLink.parentElement!.innerHTML) + quoteHeaderSpan.addChild(link) + div.replace(child: quoteheaderLink.parent!, with: quoteHeaderSpan) + } + } + } + /** Modifies the document in place, adding an additional class to quote blocks if the quoted post ID ends in 420. The regular CSS files contain the styling required for this feature, applied against this injected class. diff --git a/App/Model Presentation/Thread+Presentation.swift b/App/Model Presentation/Thread+Presentation.swift index eeed9b9f1..d6fd7ac7c 100644 --- a/App/Model Presentation/Thread+Presentation.swift +++ b/App/Model Presentation/Thread+Presentation.swift @@ -14,7 +14,7 @@ extension AwfulThread { var ratingImageName: String? { let scanner = Scanner(string: ratingImageBasename ?? "") _ = scanner.scanUpToCharacters(from: .decimalDigits) - return scanner.scanCharacters(from: .decimalDigits).map { "rating\($0)" } + return scanner.scanCharacters(from: .decimalDigits).map { "Vote\($0)" } } /// Name of an image suitable for showing the rating as the thread tag itself. diff --git a/App/Navigation/NavigationBar.swift b/App/Navigation/NavigationBar.swift index 073d86601..81901b85c 100644 --- a/App/Navigation/NavigationBar.swift +++ b/App/Navigation/NavigationBar.swift @@ -7,8 +7,11 @@ import UIKit /// Long-tapping the back button of an AwfulNavigationBar will pop its navigation controller to its root view controller. final class NavigationBar: UINavigationBar { - private lazy var bottomBorder: HairlineView = { + let theme = Theme.defaultTheme() + + lazy var bottomBorder: HairlineView = { let bottomBorder = HairlineView() + bottomBorder.backgroundColor = theme["navigationBarTintColor"] bottomBorder.translatesAutoresizingMaskIntoConstraints = false addSubview(bottomBorder, constrainEdges: [.bottom, .left, .right]) return bottomBorder @@ -24,6 +27,9 @@ final class NavigationBar: UINavigationBar { // For whatever reason, translucent navbars with a barTintColor do not necessarily blur their backgrounds. An iPad 3, for example, blurs a bar without a barTintColor but is simply semitransparent with a barTintColor. The semitransparent, non-blur effect looks awful, so just turn it off. isTranslucent = false + + let textColor: UIColor = Theme.defaultTheme()["navigationBarTextColor"]! + var font: UIFont if Theme.defaultTheme().roundedFonts { font = roundedFont(ofSize: 17, weight: .medium) @@ -31,25 +37,13 @@ final class NavigationBar: UINavigationBar { font = UIFont.systemFont(ofSize: 17, weight: .medium) } - // Setting the barStyle to UIBarStyleBlack results in an appropriate status bar style. - barStyle = .black - - backIndicatorImage = UIImage(named: "back") - backIndicatorTransitionMaskImage = UIImage(named: "back") - titleTextAttributes = [ .font: font, + NSAttributedString.Key.foregroundColor: textColor ] + addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(didLongPress))) - - if #available(iOS 15.0, *) { - // Fix odd grey navigation bar background when scrolled to top on iOS 15. - scrollEdgeAppearance = standardAppearance - - //Set the status bar to use white text - //TODO: We should compute this or save it in the theme plist, but currently there isn't a single theme where the statusbar shouldn't be white. - overrideUserInterfaceStyle = .dark - } + } required init?(coder: NSCoder) { diff --git a/App/Navigation/NavigationController.swift b/App/Navigation/NavigationController.swift index 4b6496713..daf89612d 100644 --- a/App/Navigation/NavigationController.swift +++ b/App/Navigation/NavigationController.swift @@ -104,6 +104,7 @@ final class NavigationController: UINavigationController, Themeable { font = UIFont.systemFont(ofSize: 17, weight: .medium) } + // Fix odd grey navigation bar background when scrolled to top on iOS 15. let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() @@ -115,9 +116,17 @@ final class NavigationController: UINavigationController, Themeable { appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor!, NSAttributedString.Key.font: font ] + + if theme["keyboardAppearance"] == "Light" { + overrideUserInterfaceStyle = .light + } else { + overrideUserInterfaceStyle = .dark + } + navigationBar.compactAppearance = appearance navigationBar.standardAppearance = appearance navigationBar.scrollEdgeAppearance = appearance + } override func encodeRestorableState(with coder: NSCoder) { @@ -247,3 +256,33 @@ extension NavigationController: UIViewControllerRestoration { return nav } } + + +extension UIViewController { + + func addBackButton() { + let btnLeftMenu: UIButton = UIButton() + let image = UIImage(named: "back")! + .withRenderingMode(.alwaysTemplate) + btnLeftMenu.setImage(image, for: .normal) + btnLeftMenu.setTitle("", for: .normal); + btnLeftMenu.imageEdgeInsets = UIEdgeInsets(top: 0, left: -2, bottom: 0, right: 0) + btnLeftMenu.titleEdgeInsets = UIEdgeInsets(top: 0, left: -2, bottom: 0, right: 0) + btnLeftMenu.sizeToFit() + + btnLeftMenu.addTarget(self, action: #selector(backButtonClick(sender:)), for: .touchUpInside) + let barButton = UIBarButtonItem(customView: btnLeftMenu) + + self.navigationItem.leftBarButtonItem = barButton + + } + + @objc func backButtonClick(sender : UIButton) { + if UserDefaults.standard.enableHaptics { + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + } + print("bzzt back button pressed") + self.navigationController?.popViewController(animated: true); + } +} + diff --git a/App/Posts/ReplyWorkspace.swift b/App/Posts/ReplyWorkspace.swift index 69cef00ba..07b515846 100644 --- a/App/Posts/ReplyWorkspace.swift +++ b/App/Posts/ReplyWorkspace.swift @@ -220,13 +220,11 @@ final class ReplyWorkspace: NSObject { @objc fileprivate func didTapPost(_ sender: UIBarButtonItem) { saveTextToDraft() - let progressView = MRProgressOverlayView.showOverlayAdded(to: viewController.view.window, animated: true) - progressView?.tintColor = viewController.view.tintColor - progressView?.titleLabelText = draft.progressViewTitle + let loadingView = PostedTootLoadingView() + + viewController.view.addSubview(loadingView) let submitProgress = draft.submit { [unowned self] error in - progressView?.dismiss(true) - if let error = error { if (error as? CocoaError)?.code != .userCancelled { let alert: UIAlertController @@ -249,14 +247,10 @@ final class ReplyWorkspace: NSObject { } } self.submitProgress = submitProgress - - progressView?.stopBlock = { _ in - submitProgress.cancel() } var progressObservations: [NSKeyValueObservation] = [] let changeHandler: (Progress) -> Void = { progress in if progress.fractionCompleted >= 1 || progress.isCancelled { - progressView?.stopBlock = nil progressObservations.forEach { $0.invalidate() } progressObservations.removeAll() } diff --git a/App/Resources/Assets.xcassets/Colors/Contents.json b/App/Resources/Assets.xcassets/Colors/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/App/Resources/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/Contents.json b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Launch Screen/LaunchNavigationBar.colorset/Contents.json b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/backgroundColor.colorset/Contents.json similarity index 76% rename from App/Resources/Assets.xcassets/Launch Screen/LaunchNavigationBar.colorset/Contents.json rename to App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/backgroundColor.colorset/Contents.json index 9c179b1e8..03486b9f6 100644 --- a/App/Resources/Assets.xcassets/Launch Screen/LaunchNavigationBar.colorset/Contents.json +++ b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/backgroundColor.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xB1", - "green" : "0x83", - "red" : "0x14" + "blue" : "0.902", + "green" : "0.902", + "red" : "0.902" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x70", - "green" : "0x4F", - "red" : "0x0F" + "blue" : "0.902", + "green" : "0.902", + "red" : "0.902" } }, "idiom" : "universal" diff --git a/App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.colorset/Contents.json b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/tintColor.colorset/Contents.json similarity index 76% rename from App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.colorset/Contents.json rename to App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/tintColor.colorset/Contents.json index 460f528c9..cc85922b2 100644 --- a/App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.colorset/Contents.json +++ b/App/Resources/Assets.xcassets/Colors/SpankyKongLightTheme/tintColor.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xF3", - "green" : "0xF3", - "red" : "0xF4" + "blue" : "0xFF", + "green" : "0x66", + "red" : "0x00" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x06", - "green" : "0x06", - "red" : "0x06" + "blue" : "0xFF", + "green" : "0x66", + "red" : "0x00" } }, "idiom" : "universal" diff --git a/App/Resources/Assets.xcassets/Empty Tags/Contents.json b/App/Resources/Assets.xcassets/Empty Tags/Contents.json index da4a164c9..73c00596a 100644 --- a/App/Resources/Assets.xcassets/Empty Tags/Contents.json +++ b/App/Resources/Assets.xcassets/Empty Tags/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/Contents.json b/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/Contents.json index 5e80c128c..8651056be 100644 --- a/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/Contents.json @@ -6,19 +6,19 @@ }, { "idiom" : "universal", - "filename" : "empty-pm-tag@2x.png", "scale" : "2x" }, { + "filename" : "empty-pm-tag@3x(1).png", "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "original" } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@2x.png b/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@2x.png deleted file mode 100644 index f950269f1d142585a15d52ef07fc805ad0cd2a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmV;e0aE^nP)#Zm`UUz0~;o z{L13&HIcVGl)C!-{iV*|jltI=hq02x*x&B-*Xi*pi?hby>okzJ)#&g>n!P}lyW{Zn z?)LdsqQf|nxKE$JW%u zGY%wucR#~qdJ)n{BaQUKW6u-yJ-<9I^Qx8}c%z>84_-wx{rSZP(`nE5ApP^p{P!<% zs^T*JboP%qmnU(;X{W$k{3HwMQknUqLKe~wRc5b77ScWS2H8nhn?!cfev32#0049V XJyaI47)S{?00000NkvXXu0mjfH^kxJ diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@3x(1).png b/App/Resources/Assets.xcassets/Empty Tags/empty-pm-tag.imageset/empty-pm-tag@3x(1).png new file mode 100644 index 0000000000000000000000000000000000000000..cac06bd47fc81a3b81d5971cfec240d1dd8a157c GIT binary patch literal 1258 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 MA~c$NDtKq!-^yyeY5)KL literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1)-2.png b/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1)-2.png new file mode 100644 index 0000000000000000000000000000000000000000..addf9334b756fd2842844c39bbcfe25046767979 GIT binary patch literal 1841 zcmaJ?2~ZPP7!GPxRFDc)C_&e#5ems}E@1=V4B?O>KJJ2Q43PJ8Kq)JtAYna83hjpbXu{s8z4wKr8~3x_J8|*-~Ye&e{Z%h zCOXV++55`~1cF^eI5!R-^DXz%#rV^2IMVXL1q&5o@u&>T5NQxXkQ5aoK!j41gv22t zsUfWk@gooxk`)3WCgex4C8&}rvS6rsr5b1BG68zENRonJfEY0(ett6bS@DfHzE)io_y`SnLJRAvz6&m>`Wwfgm;mW;2<<%tgY} zX{0iC9G5qf439V@Ifkj(AefPnLCs)LQB4v^gJBqi=pda=!4VX#L4}F*6qR;^Re_6W zB^reqQ=lrqq9_uhI*dcYOPyYWQavlH($4G?zGI+Xqy}kJ$g(CYkk9{rs8TtL)?#tU z+j{>~SSv875ikzXqB@NP@0@IdC6$^TqCrF$su7@Qs&yM<om@0n;IGx;Ha~MhguI4hn*}-VnqHW-(bl zK3l9@E-KL}5fx_TO5bvQ=H*)Kpj6|Txrj!Qj!1bLR0&M2nyr|>7S_CaGhFHXwQQM} z3*yCqmfp_kwRH+NkmYsOx_B^aenf>kUV~e^{wbD)pO~5mZjeBKYjnUj#VOY5;@A$` zqLc3a%N(BvU1aj!@l{5BC0{T6?QzoSSOGWGb^N`FEP9K;YnM=)II#C8Uz2n3q-pckBzo6ajriuB${zpg zyNzoexNr6h=noQg#-{d#6wcaRPTU(abRdjctV9msr zHT4GjabhjIH+HRgh&7%k{$l77nMdv$D5H!QS2S;wwLO#VPkZd==z(4+E0j#`xT$z7A5t`hJ6E}t0b*ct1Qzy0Mob4=x)*GWeI z>?m~(^Mq?oc3;*nPLpY@mqSf``vM+?DSkdKf6A+md?n*JWc9Co;)}2JRcz&HhROM0 z19~ly%}B1Z4Q-gDn24cwtGnUFRoWvS)$|JIZwovtH1>72`x_p@ou<}dxRh)TRxBuQ zN9sJ&1eJltWSHjyFELLWhk$$P`6urDz-^`EjjbybD{=Ut+Bo|&quQ<-rp+I{#HN4%j&t1tQG8;m(_Js$k< zPx}^m9qfrr7(B_$C8`r`X3TE&@T}P_HP1N*ctrT;IhcxK+EAOt1e+1pO}c{Iddp8N MA~c$NDtKq!-^yyeY5)KL literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1).png b/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/EmptyThreadTag@3x(1).png new file mode 100644 index 0000000000000000000000000000000000000000..addf9334b756fd2842844c39bbcfe25046767979 GIT binary patch literal 1841 zcmaJ?2~ZPP7!GPxRFDc)C_&e#5ems}E@1=V4B?O>KJJ2Q43PJ8Kq)JtAYna83hjpbXu{s8z4wKr8~3x_J8|*-~Ye&e{Z%h zCOXV++55`~1cF^eI5!R-^DXz%#rV^2IMVXL1q&5o@u&>T5NQxXkQ5aoK!j41gv22t zsUfWk@gooxk`)3WCgex4C8&}rvS6rsr5b1BG68zENRonJfEY0(ett6bS@DfHzE)io_y`SnLJRAvz6&m>`Wwfgm;mW;2<<%tgY} zX{0iC9G5qf439V@Ifkj(AefPnLCs)LQB4v^gJBqi=pda=!4VX#L4}F*6qR;^Re_6W zB^reqQ=lrqq9_uhI*dcYOPyYWQavlH($4G?zGI+Xqy}kJ$g(CYkk9{rs8TtL)?#tU z+j{>~SSv875ikzXqB@NP@0@IdC6$^TqCrF$su7@Qs&yM<om@0n;IGx;Ha~MhguI4hn*}-VnqHW-(bl zK3l9@E-KL}5fx_TO5bvQ=H*)Kpj6|Txrj!Qj!1bLR0&M2nyr|>7S_CaGhFHXwQQM} z3*yCqmfp_kwRH+NkmYsOx_B^aenf>kUV~e^{wbD)pO~5mZjeBKYjnUj#VOY5;@A$` zqLc3a%N(BvU1aj!@l{5BC0{T6?QzoSSOGWGb^N`FEP9K;YnM=)II#C8Uz2n3q-pckBzo6ajriuB${zpg zyNzoexNr6h=noQg#-{d#6wcaRPTU(abRdjctV9msr zHT4GjabhjIH+HRgh&7%k{$l77nMdv$D5H!QS2S;wwLO#VPkZd==z(4+E0j#`xT$z7A5t`hJ6E}t0b*ct1Qzy0Mob4=x)*GWeI z>?m~(^Mq?oc3;*nPLpY@mqSf``vM+?DSkdKf6A+md?n*JWc9Co;)}2JRcz&HhROM0 z19~ly%}B1Z4Q-gDn24cwtGnUFRoWvS)$|JIZwovtH1>72`x_p@ou<}dxRh)TRxBuQ zN9sJ&1eJltWSHjyFELLWhk$$P`6urDz-^`EjjbybD{=Ut+Bo|&quQ<-rp+I{#HN4%j&t1tQG8;m(_Js$k< zPx}^m9qfrr7(B_$C8`r`X3TE&@T}P_HP1N*ctrT;IhcxK+EAOt1e+1pO}c{Iddp8N MA~c$NDtKq!-^yyeY5)KL literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/empty-thread-tag@2x.png b/App/Resources/Assets.xcassets/Empty Tags/empty-thread-tag.imageset/empty-thread-tag@2x.png deleted file mode 100644 index 0b6ecdb5fdf9596b24a4d642dc991a37ccab04a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmV-E0m1%>P)D|2sL$Xki?g-X<^BHtE{(N3l)62Y zx{JWpq|M)@&fiv|!}j|8)aUT}{QZr=*Qd|mm&V#p)NKL)005#%L_t(|0qxh-0mCp1 z1kejJbK3paEdDEuzBho`0uT`q5z%~_ZkRv#GsiP@3liHjrJ-dGB<_--T}ZqoL;H{f zONI_1iQ;7L&`BIYmS#Wr%f?HgAfmh|t1tXjqm@MtQQgdsAx#ZQyCgidkaSCi?v7gZ zhG&hupZh}k97-WtUWaU0J#AO>Js|Nns8qMFub)eXcDCzfG@KC;5fKr+0e4v+?WPLr5I=vCwv0CfY6v9BmdOwLX%QAkQn z&&;z`dcS+Wl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3a#eP+Wr~u$oq|n;70`g()RIJn zirk#MVyg;UC9t_xKsHENUr7P1q$Jx`3F4>--v9;Y{GwC^b3H@dWCH^O1#?Til*FXO zxvsKC{DJihh*Do(G z*DE*H%P&gTH?*|0)Hg8FH!{)%s?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=v0Uwatq+b<`qN32^eDf6^RAh|?|lK*#8V;ua~cVM4$J1Y*LIE|3FH{Hb}s6kh~P+NnQy zN*EZJ7(HDaLn>~)xqep5rBLSB$C)3Cc<(SuYpa};ox|%CcB=K}&5E--Sr(?K>Q8To zPB`)T`UR7|O=k1`ZTn_iJ#X%|+jPOIRTpipZ91D{Hv5EI)F1P^Z!E3P^KD+dYu)a@ z`WgH!8z&skGkaR*{9N(2r^0mmM;;PSw;zo&d*GgUCO8APD6Z8 zXLEcfbD;v?kwyyv_D2pf9Uu;Z1rcT-q`*N2&4eS2FtcC=qbq2%fLaDq(7}vgLF~g& zP}qRvNU-XTX8YqGU-6h!XcyY-WagdcB_saMp}AY=_&)0k4;CCLoO5?4YpvX-#eT8Z z-~UXxEgf9t#eVzcqTfH)=h*E$m#kY|ID27O-M`l_AHI4We=|&f!eyIjo1)F7yuRNo zvaLr5I=vCwv0CfY6v9BmdOwLX%QAkQn z&&;z`dcS+Wl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3a#eP+Wr~u$oq|n;70`g()RIJn zirk#MVyg;UC9t_xKsHENUr7P1q$Jx`3F4>--v9;Y{GwC^b3H@dWCH^O1#?Til*FXO zxvsKC{DJihh*Do(G z*DE*H%P&gTH?*|0)Hg8FH!{)%s?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=v0Uwatq+b<`qN32^eDf6^RA~)x#5@<94ON8P|dfL*=cw4HevT51Fm%nO`(DpJqu$md0Gq15}PE-ajVHfWY)R^ zulQ6rEAn*s7UFYr20* z824Dp_8;H;r|n#j#P`QV5}R}1&nlMutj4tShjJgsR_4?Def#@rd%|g<_RN=ReRWY5n|ysw zKfnL}+I>SYwQtKafBxCND|`R{15cwpZ`Uo^Z@%kWbG;z@BL|rd=0XL&BaIdUAP#~B z5oRQ$pwR-&gbrqySule!6cjc%gEHSt5JiU9Vdf2U?Llu&VJmT@G`9}^#YO2*9xiD>Y)o}?uF{}EWcfqN{u0}Vw>Dn? zQf-P-lliLZ)>{X7W7ySpPUul-77y#MoZh{{-s2tvn=JDU#+G{9&#a$c951-Yz3?Q{ zZRQH&^ChdpS)NPhmhtOxvU!BdZoWAq?CXru1G|nhJFr}ccAqW!{e2Vfyo98`wnt8f s+Rj$7-xj_$)P>Ld^1a7w|8yDDqZ(}`HpN>v0$t7E>FVdQ&MBb@0R3)PTmS$7 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-down.imageset/forum-arrow-down@2x.png b/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-down.imageset/forum-arrow-down@2x.png index 7f39e71e54057600b2ef9bf5f62641f9ab25c9ce..11ef782a6fab4d2102a908f67128b0a042cc9b5c 100644 GIT binary patch delta 359 zcmX@X_?>BjWIY=L1A|;k6eE!0EbxddW?*1X1YyRhhj(maU|`hrba4!cXni~5A!myL zPwVB`2Lxpff>0iddm)Sa4ndiPi+4EoIq`daSm$|5hNE(VeS784jL8oq1q9zMIleYS z_6L7aLbm0Gtui;F_;PgFw@qV??q-#7Iv^9BKkrHX&yVSS~Gcp8Mt?5YDZI?dT zUEv=p$M%7NVWWYq<*_r(7Totkk~7%OJySNcw|q9$c|o1Bc6f!-)2~O_9%$sU8h)5Q z@3!cM>eD_Me(B1r;g0XTip&dZpH7uq^5M*hnV#nsu3F0?mdp3n?FE}oG$DG@Mk5bh<}9|J>#Mcm-b8)m+QPD|*2~#8MeP8q$=mQV`%4>rFa9mg z=14qsc*Yl}BR8(@H{Y=JkNzZN550~%!0>@BfctOVe+S!EU|2GEy85}Sb4q9e07K`M ASO5S3 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+=>VS)SD(y6Sy^eUh-25!1fVj` zk|4iehW`sL2s}7oP_W`;C`fOxr;B4q#jUreH2D||c$g0^`TjpXCX|t_GbQ9%>uSTL zQ>s^&6|XONk>Y*FIsG=bjZ?aHPe$6povnV;vLn_d?reKn2BR01_mZZ zPZ!6KiaBp*-!434AmCbl+2M}k3x??r_!h8uEoAXpz%t!|Q?F6TiS?AmPWc{X>CI6m z|LsV3lYfx-y=a5#$4dfD0u%YIel#mFxH5Dxh%jm}1+XmOa1d<3BQV2d#jABL68vj! zu1P=Q8OnUD*4J>OxzV3zoi}w#*C@@K|6_W`msPhUvS&J;my-;-DfU=VX_NTG?4Qg3 z^=nt1PmOK~b(z28{eo5L$$Pguu0MPzXMN}W+9UFSUKEq}W+K6!`h zp{?ZZE{7j;-G7J&mA~7$mz!<*<()@T!(v@#%zvQAEmysAZ?>+QlEm~qQr?B7f)CH; zR;+ycIm|`pme}=s>-ycN#@}0&)&2J4^A{H$zs&ty_^4uzO#356@7Z-#N0+bryEE{Q zZtYg@WR>JB>9~^Ldn^SL>r_{6bINgINs&Eaw>6UNXI$#Q6@O1TaS?83{1OSl~@B{z= literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdr)B}7%TzxVNWo4xaqOA+1OMqH< zOM?7@84?-_4*XwW@L_|(1A*prRa;#x& zG*#HZ#&WIUfRsQ4GgG!h0$9+f@3W1909%uTgn-23B-WDi;WNq~dv|Zh@zPvs_l_~} X6kDB+$xeTuQy4s5{an^LB{Ts5c&J#L diff --git a/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/Contents.json b/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/Contents.json index 16136161b..b28f76c21 100644 --- a/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/Contents.json @@ -1,23 +1,23 @@ { "images" : [ { + "filename" : "forum-arrow-right@1x.png", "idiom" : "universal", - "scale" : "1x", - "filename" : "forum-arrow-right@1x.png" + "scale" : "1x" }, { + "filename" : "forum-arrow-right@2x.png", "idiom" : "universal", - "scale" : "2x", - "filename" : "forum-arrow-right@2x.png" + "scale" : "2x" }, { + "filename" : "forum-arrow-right@3x.png", "idiom" : "universal", - "scale" : "3x", - "filename" : "forum-arrow-right@3x.png" + "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/forum-arrow-right@1x.png b/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/forum-arrow-right@1x.png index d0264a50e44350be7dd226a9416e8311dba31504..42ca47eb14e907d30e1a175855fc737f2303b0ca 100644 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9G08$g&*{RsbBpx|^* z7sn8b-sC_3|JyU`G6?(n$j)OkHZn3ZFfy{5kYl9r=|dtLTN}SZDi042XUmmEFO&}@ zFakxm0}hJ^oJ~+UEbhR|9;xIY+B{K5qe1FlLu2E?hAcK`UjBwQYYuIok`)ix0;c;P zSlX6mnP0%ddR4h!?PPD7WXm0$vraC5{1OrpEI$1I|DSn@O4miHmSb$j1_lfaibpDr UeD&3;1Uiwy)78&qol`;+09X=9V*mgE literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!2%?e&t2yRQYxMvqMUv)!(>KQy;{an^LB{Ts5eLNRt diff --git a/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/forum-arrow-right@2x.png b/App/Resources/Assets.xcassets/Forum Lists/forum-arrow-right.imageset/forum-arrow-right@2x.png index 8bc2f5eb975411932ca845bd2e13d98f0454365a..f383403ec25855212e33a86abb40068013e2116c 100644 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!1|;QLq8Nb`XMsm#F#`j8A_y~1J-lNZ0|TR# zr;B4qMC;ody`6^~1Xv$@&v~G8kk5y6S^^Mh-fC2hXp)^%R-l@}s?4mdSH06g&p46& z`@x2;9J@pRe4GRwm*_ZUN>{X*Y$%tyVXc-hN%mwahk>VUu0=ezi%sDt^J%Zy@@z@p}K@XIr%`7Vfrx_I3Y-cL|mH$BK70 zhj5>J(9UFA^?kVR*)zM}nVX&4Cidz9N2y7B zW}Va4=?kTP1oV5@{%yQ=j(PRhiTyv<-?{Xt=6`2R}#-3)fNsp?2 kIhXC5A9J<3n8X3$iodzix{+GTfkDgQ>FVdQ&MBb@039};v;Y7A literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eM!2%?Oe~QckQYM}*jv*C{$qLdw2_6U3Vh((e z=h*1MX%Mqu^A&c5Ue{O5KKzNCErBdL%VTB~C@3|}bz)$ck*9rgFXu8@pne8VS3j3^ HP62BR01_mZ0 zPZ!6KiaBp*-OfGaAmEz5=udkHgX|I234B3JFI$9OFuZ8sE8x7qSmK~HBjb^D=Yp-x z6Tdg^aR1~llREeD*Ee6+Ts_m$VRO-u*_EM-L4;9*DS%}Ghl5~)5(7kFUh==f(77Ea zd|cEl%+j`XSUy|pQvW;T>S@MnX=dG4FL<8_JbdGtl9jf6Me}zB*Io;@x^HSq?4fIg zdg?_rU3?6g^(qA?MuncP@cDDGqqgJ33GSu**Ne^s$GBggSY|M>vYkiVw2DJ;!o&VU zD_xJBn|@P9X_HBQph_)U5A*W8}hc{Szw6xGOCGw=UgwYVcMSo~s+;BDiUnLB$* zPp{VrEuH$Rs_Vw}19#)M&G8f3*H!V-$aw$f_bd3PSNynjlrR41p4vqg+gjHbe)%vp z`|i7lxXmr=AGyroj4U}3VcWy;+rFlj$1?2W?uQzaOg|m9tk&6oxF>iQM`lXJT?>|! zJ$zf&+;crI^#6@oLDmMzgU@syEN1MQFQ_q1k@L4=a`{E22`bLoZ3|8s%kYG>vT3=! zadT=di}h%@-W<7RNVN4`)yl$Ck&p zb_MVAk6L;|>ddzc1(mBW99n<4JlEokblEWXzqv}Q%Aae^ON8n?_So2cnzhdzg?Ix1fkU-dkA-dfHvdpkV-P$RU!<%u-Q8qttV Tw>F*wCMgC_S3j3^P6@g)Bf|gy diff --git a/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/Contents.json b/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/Contents.json index bac35e0b8..9266c409c 100644 --- a/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/Contents.json @@ -1,25 +1,26 @@ { "images" : [ { + "filename" : "star-off@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "star-off@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "star-off@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/star-off@1x.png b/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/star-off@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..759682f6078ab4726f8b41d74b4a32c87fbd3859 GIT binary patch literal 368 zcmV-$0gwKPP)*Rf~r1*lDF z&WUDz`wZX%!8)4xhpoOlxsgZDux!MI_Ubf9S~G^VY=n`b`D@4QuZvo-59Uac%qDL(GFzse+41a}C7+ zRYA2_ZTR!;%v5Utj z`3CUM*sq8L2RwfiH6(!ZuS&6G zm6F(8v3FNr#AM0Qe$PxA6H+=H8rh_u93zimoN&n{&>11%U6!JH?^} zxFKU&WTQ4{=*8YMIF6 zVKZkZcBRp-@C>GDN?2lM-}}@KRtooRqwX?ucv5X-ehZQ}OvxPH5-RS{=T@r#whg}Y zSb~7Q3e`MRfEE31iC*oFM5!#{r>}`vZO$e0E#hNhHGlDN*rYV8mk51=CR_Bh_t+vO z%@6Gz4hgOnIhJ*ASxl1)*zr(?@Jpwmbc!uD7yAC5fM*73kowuc z*HWKw7hED?_XNyODXx8iP1b3d1=z*=fH_s|p|_U)YGvOD72W(GVngmC#_;cWi=81% xj#YU^H{L%ajf5 z8!os=RXcEhv)E|y`NZX(^V$$EZ(-WDM8*W`$y?pJyOV=*1estQPI?YZ$_Pbg2 z75`X7jpt5lVV9i6=aRMUbnlfjSLcXr65+I&&?;fRo%7Ac=$8AkntvV^ z@^)vr-M)C|%EQ9OM~3EKRz)4pD0*Lgp4((uY27wYTh^m{C#>&T|2g^n+P8nF&t?y2 n3b{V(@_CotWjnp>r7am4x_o%+pYC)n1O>aNtDnm{r-UW|sFtHj diff --git a/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/star-off@3x.png b/App/Resources/Assets.xcassets/Forum Lists/star-off.imageset/star-off@3x.png index eb4b2f2d323ef3b4edd283df7c921a4dee896517..4c80f125ce53b59fd48556b62084ecb00198cf64 100644 GIT binary patch delta 956 zcmV;t14I1J1jh%E8Gi-<0084u0O$Y!010qNS#tmY3labT3lag+-G2N400VhRL_t(| zob6icaoaEq2737)cY?YT)ZHK(#2eHjWP@k~cLQ$_cLQ%wd4jkTRGk1lI&k99pa_Z} zoge(}aPd)mKwpRlK_L-A1Hh-o!3!D@j79{b5y5CgFd7kzMt=mO5y5CgFd7kzs}O;R zb41)A;(&<6GH~1c8ajbHYt$3~SOLJ`mJWz}wyLdH)k7B|E&$-Svio-;>IT zOe0_x|A=Vj^?!2_j(oIm^FwRJB2j;zxY(GckqMrtYw0Pf{G062`K$uU`u%)iW-_rSW%lHY3r z34Mm5$FqcDow2isM*37TQi;eVfiwpyHmBTm`XWRaDS!8nu--!r(vwf0i0GWyz1RGQ zomHb@Di28^LJDi2vplsSID-B4W(;q_c<=B6dRCJtFR|R%d*xf9?eT1p%F9BzW=pNPHj0 zlB80?4u5h?r+KM7A{Ii|Q?j~L;V7}T3Z2PBDEW<7+tc#GLwo%1eV?N4Bmo>l9Rt=p*H-G=2cO6ql3&yO=Am<|J4aZ?%=`sVG|EHZzUV zMc33Ka4Jl81mAM|BX4g()C^@{FY z-9S<27?bSkm{rtBeF3pjuimauSnTsRR?mFZXY@+SxbuVGgGqS{~Hel=vYuk#s=2u34<(THF)A{dPbMk9jJh+s4# e7>x)A0Qe7Qyrn{LWV%-X0000t<74`h-AJ~sI905u4f z1o;Is2qZN8Ul4FXVMD=(0}~t!9u(~Rw}63xahIoyV@L(#+wk_J*9tr}IsDiD|9>Mb zVf#I(!{BA!dgFp7a zV#4zxtt6vS|5<5|)k~Xq~eaCwE@S=D%n>?a~0nV6Xn=B<5-*1xn*mUdK}hVD9Lyw=PvPx&zChfd3oO} zS-nj`yIVgxhYRQB%ycoV?mu|RXQd?Hl!Y&@P5i=E#&t1K!XrfF{M#yB*P|XgXM0^v zxEz#c@Ak#=V=n*Qt@{EMEuZ{$GV*pfZ}?_U-+?1(r2%ciRuXmFUTL-*DdT>aFmHx; zkYG`Xa=7#ikxP&CY?d5uFmC9U2s-p)!vn_$2HQS-w7MX9!8Jm4BHy7Y{`P9y&vvfk zoVfVJR+T3_Pn4E&%v|ho+@YM$(qYOw1@AMT)EbOcIKCVYJ{qm2bLN9OH>+=stjV9S xtvi=ocyT+ai_5yGzJFsm#}SV!_CId@VD4)XRr{4Q?LH_?c)I$ztaD0e0sz79@zMYQ diff --git a/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/Contents.json b/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/Contents.json index 73cd7fca7..9db3041b4 100644 --- a/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "star-on@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "star-on@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "star-on@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/star-on@1x.png b/App/Resources/Assets.xcassets/Forum Lists/star-on.imageset/star-on@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..37a260fad5e6e73e88f3b665ca8877760abd70e2 GIT binary patch literal 361 zcmV-v0ha!WP)*mBC5_F%X8oSiBb7qf!xk0U^Eh;@z7M;>lBAqCSRD zj|#qkx2A~qLQxP;>bX*;>?X(>Cf!(Dus;lJCNm$CNj5Pe!X~t{5$gW{J9ARnTEWg- z0^`#Bcdha^&zX0i6-FOeY5%=qzx-y!)68i}PAdjLqcUy;-%|Z-g)@7=6VRz7eF3`> zB=${!E>=EM6<uQ78Gi-<0016@S^)q6010qNS#tmY2VVdH2VVi|cEuI|00H+&L_t(o zh3%P3PQx$|hW{YeC>#K_M*wBX0=PkMKyLu-*m45e8^8?$7oaRF6hRSt-~^x|u{H9e zQqcsQK9nT|8gb-+xwpvBo0XLuyIJQ~`ynoF)TalyyMgaQen~6Hl z#5b1-USJ>xa8x>%$H(TwBEG~?BogYuGJ1eayl|M|^x=VHY{+G#DPY$aNj$(svJar= zxT0sS`6s}BKRL@Pa{>FnumJl-2^|4kAZMQT#wPTwS0*O)fVJP<1K9Hfs;f`60FDr7 z2i93jPO#Gu?0-UYwMi}6(dEN~4ZyefqA#kE3X$A`y27095Hx2D;2#xRfh*5BNiIfxk&;%7&s2Z62v1UlrItw+EvLwYy;sxs4$VWAn}V5nNbgM-k~mV+ z)~BY(&oI3W>U#&q4dgvH)Wp&KDHB^AaBOwJvDGeM0Dt#KlU04~hl~IK002ovPDHLk FV1lI!|BCLH)^N0YJ(9o-U3d6^w7Mm{&0y^0+)qlt_|%`a3?% zk~`|rX6@U*ypM%5*0+AXcTmH{i0y{TJJlH+{VZbK{bJdzJDn@kwsBRvKZ-O8onc+{ zF!baFk4LLicAT0hZ1{Ll(W<)F8*Cr1@bhy&C>y?Gk%diG&FY7)z9CDwT;GL!;fW1D z_h|02@BjWh^>J-G7yM9HbaJ0h=)BOLh2AL_t(| zob8+8Q5!K3h2LfJA5sBM1-ZEfVk!t7Kq`O|NC&tBy91{K+`vs-0l0$rDiEX78a#mU zO4?g-GyBajV{_7JdEVXAu1w{eg8_Uo4FV}^Q zHGnC-yGP^xl`^Hw7CQ(q2k_(7l{J8?5`yRp(N+@x{trDlFroucqj8U#W|hbhw;zZA zx^}B*PmiugwACqq|IE?f(75fu7Cocw5f=lE&BlZv^g<&pEOw}cho(nN8Dk{oB%vup zimR)IhY3OG2!GL57f1FEhd80RgQMjUSB2)XNqcI%6icU!(SF>|OgmS7QFfedYVj5) zL=a#J;4F3_Wj1|&i4cS@L=fRVG1g1a_1?%7BPK`OjYtHLt#{nPJdX&a^FyX#rTES% z>A4;;8KndPmhINFBw~`~c4RpMeZp)U=Mf*BEXRg$vVYvsR=(kSITA4zXdHW28kZx& zjepZK`m@sYHb#hm%q{kN?fB9p9|z=hsM^ZM;PodFVTQ)tq)yIn)rB&7Uhs+1krym; zZX(mO4E@NZK$RKGii)f3zNT#RwynGvzvOQCA%D?0v8Ijm&T=k%Kee@_h0v@?MAwoQ zLZz)X#D7|HIigId&ML7vNP2|o5uNm!l0s;Ph4`9M`-qYqERpb#@`w^)A-cAd5GBGw zbZv=RBjvb%pEbSCsbsUiJ|N){b>h5T-=OY)^7&b@4t!|Qs_LsXFv zBDM)KBQJQH>HY75cgzO1;SKphgxFj#MtZkDXLvPF!kBYrs4OJPaH-I^IpWf*zDQ~u z=R`XY#!hJNA=b2ZHZnqlPsAVp|9SN(ZYUv6lRh;+$IlIkbhCG*qqWlR`wsT+j)Wcg x5hes-LJ%edVL}il1YtrDCIn$Z5GI5Nz!T=f;e!UxargiL002ovPDHLkV1mlbU(5gi literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrj01c^T>k^XSq73&$>NqxK<$Dh zL4Lsu0T=#HXi#`yP~af2AmPJ?1Eu$lnJ_RgN_e_BhEy=Vx#qs@u!4Zg#imUz$KKR$ zwr4;2wmDPcR{6RQB2php;(Aoq9&F;?pEG0I=i~dTgrBf(mZ`V!`Sj;;xb-t{ng2VE zemDH@$HdQ+79n@zWZ%_E2PPX_-xwiOsr+c6$hKx5#e8-}M~$gkTTlEBo0J;9Dz-3e zWmw@cPK)f2YzyNMhnqB5Fd}>8v}`nHzyh{+O+tUHH-26g_?zLin`W2eN4@8Kks^1(IVGRlBvi7cGlO25~+UzpES&%G!Z}pVfsZKg3to%RkM0xBu k{v_M8qO$7!VsQqBjhP}lE!@1{0|Su3)78&qol`;+00G{?eEKR#ANRVY!GtIp0Teo2JPCS~Y(jVx^SzEr@Jg z%>eWYR^FJz^e?eOC(r>{6+rA>R~yv=hZF6)fS{hqeS&^g*?EU6AaSA&TpWe7~Z&U6V3%a4;J#GMiL9 z2D!bT+MYj8x+s$lmd|X1)_ZeRJbyOx{ks9!7p->fT@CO0&u|f)Oa$NuABAdGdW3Aybc2rI5i){D$Os-G zBe)xQ1094=1xu5%6dMO!AOc1Wn7uEdqQs zddl)vAo7~XcKc5NQAI2u{`o*UUBpI5I>U;s?26@9WmFu`6xi`$n%w(tAY0P@m{YA( zhn?bV-a?HPDr>&Xie~{LYRIhl20rWsMDckr2F)r3bHU7eOri{6XQf(E|G8iu?vo9m zjya$#Bb_jCOQjgmB}_1Fh>UC!=GeRmJ8Dm9i(8SAImIz0K?AUMjVTRJpk!Q&fut?G z=Fp5BJpx3lTr_bC{jO0!08YZm=ZXWZX#++3aHbRBJ9;N6lr(gFOk&L`28i$4NSSJ8`4uq98(*aVWTj0|RB3hUS=H%RXeQ~k`Lsa8NYc!p$`*<4? zz@*SyGQ#R>p6LFCs1f95{Pb{Q_g~JrQB!J~#wX{U>jL-y@Q1DsdKToJ)+~g4aNU!p zCt^Oz(pp^Q`;NLlD9t>mXRW&)ucA3z68-W@j*^4wE-ye^LxUelrq~1|P<-E0k65DV z)xM>wd?&|K?lsiQIcHIh%WORF*uBrDr3ZRxo#L3Yaz5`Bhp7IfveL&sIZop9gtzWuSK&49sRJv3^rAq}= hx>P`=%X0w&@E6PfNY4dJ>cId2002ovPDHLkV1lWDX{Z1I literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/rainbow@3x.png b/App/Resources/Assets.xcassets/Icon Action Items/rainbow.imageset/rainbow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c887abb64ad5496353d9a49d6cd288f472a0c0 GIT binary patch literal 1317 zcmZ{kYdF&j0LK5b%*Ot68-jl%oc_T+noq_*f0R*tqR>5vnXWzAKmJCcpS|qr? z*Qf@8b?|ZT@O~rUI4}lC$66+BE>sMJh}@RG-!%F%N6=nah*a7#Xq(F&AQoSSVpf}vNSEZa7-~S;sjc8%C(3f=~-c^zP2*02X z-?`;{=glwa_Gy>Gc-vmU`3Vd@I2neKfu+_rTLUHQk#tR%MPgh0O6)R~@F+CfG0YxN z3D*hE9K?vy*#{%qU$AB-Cm^;E!ER&DT!<)cV`--GMfwED5*%wEYTkv$_yoXOll9`;F)(fg#LqJ6-6P)&KzceZ;RDO`dV84iN6uQIqUY1 z&RRpdDqFnh66e+$=rY^gBu`%^HyJ930d%3}8yxD32=kmmE=b%4jLuu2)jl=cZ z`GT_P_gX!nglv+@>S&~ZHSDPh#jze*mqx}O&ysK(sO7cWR(poTs_JF)Np=q0Zgc8h z#73o%|1>jb*@NXD3c6$$O(A(n3+0+)p+m4b!|##z8w08G0uxrg}pwSA1fRy@$H`2&_4jn5#i!YY}%Um)A7E ze604Ls;T1aGrn>=Xw*EKTN+mw6FAEnGO!>_u=5*OdN7uT~+{Ky%O@j@| zT^;Eyqqvl{6unViLzUXGkzrD19Q^6?8b@8Kza8u<<&f=pIMom08W-sT<4Qf93 z1bQlXMXnvB#?{*xKJ%nBGK$tfG?e8rgyJ(h-eo&qWrL3muY}xfdy`}7wo9V-9F>{Y z&LpK7IF5lpG(_rgEiBFdgXYtsoICl6zP7oKV)hg>h#qIMtT46tsVb=B45adiE_2F9 zSu~QC@iGA(B**mbUz?G~zTrgNOaWdI98mk+l_-Z31hlTZ+?T9!vKUqCZ^C-AgLQRq zG7oUn)0vB(gphh5s-d~e!Y(0!=xB+9kw|5gej8+)s zJ-~!`OZ^lwyXc^UXvH6MM;6z7Q%5-B~G+P90@mQD31 zb1}2wUum1zywPD4X9nAZ+$U#LM`xMq4bDv@GvA_Oc-3JNVrv+{k`iztxBG-sXdg)a zDYLSBW@NACFTGMV;L^(zw^y_6ba4!+ cxRsm$WHT`^K2^W>2gqXZboFyt=akR{0JFps*8l(j literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/LaunchBackgroundLight.png b/App/Resources/Assets.xcassets/Launch Screen/LaunchBackground.imageset/LaunchBackgroundLight.png new file mode 100644 index 0000000000000000000000000000000000000000..f514b1179b37d6a0bd66f7dcd920c21484fd2b80 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju3tWX=9~1L56I>6ba4!+ cxRsm$WHT`^K2^W>2gqXZboFyt=akR{0JFps*8l(j literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/Contents.json b/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/Contents.json index 1bb27e2f2..8fae7a5e0 100644 --- a/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/Contents.json @@ -1,9 +1,9 @@ { "images" : [ { + "filename" : "title-probation.png", "idiom" : "universal", - "scale" : "1x", - "filename" : "title-probation.png" + "scale" : "1x" }, { "idiom" : "universal", @@ -15,7 +15,7 @@ } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/title-probation.png b/App/Resources/Assets.xcassets/Leper's Colony/title-probation.imageset/title-probation.png index 87966a951c5e92d63826ca1c234a1f97cb67a12d..34c5f907819f519e5e1546a6dd68ee819333b589 100644 GIT binary patch literal 26247 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 T0Vjsa00000NkvXXu0mjf1^vjR literal 25855 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

kQZPmi2VcN|VP;xYUEiQ10f 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 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@2x.png b/App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@2x.png index fa971646b70eb66c06ee8382571350d9a38a583d..c9243d1e978388604ff309d5a824150cf6392fcd 100644 GIT binary patch literal 1264 zcmaKs{XY|U0LQ=iLe`o2PCoA;dUSw7L&8Vkyu z=RFyjnatbt-qyu)w?Wyr^O5L_(@sVKFVH3m7np!ZI9UBGbK&p2Gx+7Z$pn-c!#xlv z6@)$ZsVZRN^I3`84ukd*o{G8OJB6gkJ_`IHQ$(;#Ldo|@kO#)B)?2; zW6N3ia1mJpQZHb+u0M*Y@TfD_J}VW z2xY8xTzr9_SkYe(W-p&!Bb;`+CV)H9LydTOd)>_6uT113v3xEzFo&X8Pm5(AB6tk` z2$U+|aABZj`BDOcHHCJYkmzY#|)`a zMVlFYRI-{a`*CM|L%aKwRZMCayk{KwGyW=6IvP?AI!@LgOiEf7abQ{U?>?`mF|cj1 zdc0`b73#1aoW+RXng`Xk`!tj4x+g&3_+l=RcKMZ%oZ@usQae(3h%aAaMb$hgk4mlG=!r56wO=fB zl0Lo^6mRxO$0%8RWYT7+TGNv~Qd-KKAVyy(o~|;c^p;cp*mORZbf!(_rzItGI8U*+ zMh_ZsV>?bMbEl#Q9Cy(&I(8elZSX{CCn5(14?h#sr+r9FNH6p4nRPYlB6-l(YaXLJ zp5Lqc{>_&s%l87tW{pSUrf`w6#p+$}y)5O0FW=m^3WnHxGjTAG4YHe~8M{`T!?!LB N_}~ei+@q0s{{w}-J0}1D literal 1183 zcmV;Q1YrA#P)h_BnjA z>2~Is-A`xd-%gt$_#D*1uiya;K}^R7I$sB6N*^pLi+E9cpb7p3@u*Px7Uf@3(PnnQ zHA$P4Yl^3$8Oz`V{Ffw+&iAO6H^6svY=S>5`Az`htLP8FjX}~SH~_1b7;E4Vv<=d4 zsGQu2{si15i1`I0=n>>i#79G|T$(?o09*T~3$7j(?3FG9i!MX$4`y&4D zK8xNHH+wK<* zw^*#dd=t&r9Zo?oN7+BJIFG)Gjv3#BV2-kX;BkDe(LaG;j(TzdVcB;i`wMaY%J+AMJ7V#D2sRwZmhTKd&Es3}Tk!6TWphsQvfW@M zVP8ideC$B>4V9nkol1|>YO^WMKlYtUy7w;a&~Fo*>)yNZc9UMvOm1z2$a4MRy3tB1u!}3h|KGQ!7jYkN| zpbk3VZ}z6(w0wx;kq~#c0G$NnyARfP>7bbwP7hIq3sv3?4paJ88Q(Q zg)E5X5+f-(#iQDuTr`zGI;E_LF7QWn!9-W>WT!^UHn@@?r)KHU3~g&F(L7I>-3g05 zO*cVKWrQ~INC-+Tnq9+@rQ_{qQ8aHtxEy)&U0Kt_WTXay2}M^d6O$-Q!#i^mLYQRI zu|er0u`(D=Dw=4BF?f~e^RhB2n&_J3@Y$STz++D?nqXoD4JO&KX!n$eqJy%EtUULf xp`xNyw4$O_w2D?#w2D?#w2D^Iii*w{{{x!>%Ep?IUfTcw002ovPDHLkV1lliI9LDx diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@3x.png b/App/Resources/Assets.xcassets/Post Icon Picker/no-filter-icon.imageset/no-filter-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..29cf772ee769cdcdd892fc3115bb1724ec8e3f8a GIT binary patch literal 1840 zcmb7F={MVn0{unoYN<7(OiS#wq_(lnh}c>TYD?{c&Z7uUY^iB%olEw!XYr=I=??|r!Uo_o)^pYDg7?doDLDy$$30D!2Y1JeCmlfFZc z|C~)jjTz@6gmFN{1AvI+cYqixzkLM&evTv3+9Rp_!&7H>Z4-$J^TwSuehj#8I9|6Z z>FL#qRpo6=#%*pRuZx6FXiS~fc8Qe5DL+@VL@LicK-ULJ= zYkBf@ddzl?26jn@s`I?l{q>WY&ubSCGY0E%3jewEbPkTc8_FF#US*wDUUxu6{ve@ z1*T^3y}_=Cyfp1 z&@>V4Kf(*>Wgxd)jX~x=z{0(yW?$Br=&Aoka8?GPjlb#-vvI`|!S08;?IXX!p|EJV z?7;t+FcBeK9Wnis51W~U{*%45$&REN9W~}@FJlmOA?UEe6A^xgf~A+viCy~~mhQcr zi_?7`EenEJh8cwnDisg~Xg5wPbKxRRCm~7{`xoOj37_h&XAUT(;bID^7?{>Q1>H|X z1St%KX5}+?&|d!6?0FJzlk zB=kx4QihGhxHvX;5|Ha?d4|kCv{P@+=p2vOgijA`n=uBAi{q$@laQ_hSeYfa@X71F zLM01vNL|if~YNOtuE-6yY9d6Df1i?^W?m^F#U)$N@le*iijM5=LO3#m>=U zRqwN1UyxPI0%hUUtOueFBZe~U(oIV1Ity^ZfTB8%F72~+esu$V8$PI5v=i0s10Ua6 z>tfAKiv4)aB8#GDXv@b&ypWZ)!D(15LL*?tH)PYHUAA0(XV7A?sFhUtrbbb^dETrV z%iv$a)FFKpEwUsa$79^6jI6}HkplY&`Ux(M-5#hxf)-yfcUXVbjPbTFbUlL>E%TyMNL>Y>>Pn;$8CfP8+t&CQ1lq?2Tk?SV&d8#V?rEj%?zAU7vDRwBj|jv zBhF&EPu4$VlZ(5aos*A$sZ5QJ?H(TA&*WA$;EEKJ4miuywcmpqyaYd62AA5FRax{E1?Rn;XhG1{KpSU(Gfm&iZV|V$i zPU2(Bn6lwG*I5BB$Rwpka=5+YJ=z)+_yQ!fb07tAqT6Wuxmv>v%O~mW?e|Js0nN#t%i)h`z}B=`XM2z znfU6UL1FKieljtbu`XHPSxZ+9Gr!v!x%4E;sR@|KM3J{2t}sdPSDj|^)cU3ZpXU9- rc|hA6+~OzN5obi5{GUyvEbtZFYDTQkXHtmg7YI1ox**#SLFxYm1z=|# literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/BlueCheckSelected@2x.png b/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/BlueCheckSelected@2x.png deleted file mode 100644 index e5cab91cc6c93ed0960e4e5bd8b124316ceedcff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmbtT`%jYx6fMsp$YW9i8&sk=WSPP=K@dg}yNr!Tp$MZZv_%$qL##r{ zkVWQD=wz0#CbX=Kss%)9fP#X>RH$E}P@wc_OX=h5x3Yg>C%O0B^TR#KJ;`mph)MBu z|HK^zgL$IQC#KsOwO4LV_MRA&MS{T`94}tDlw_Cx6I?ELd3jl>ROWi6Dt^6`%Volcj_V3F z_0PIJf&^kZCc_?zle3E}+-;w`$9_*QZ=a72_#zI*m;TCIR9a9qPfZZIQ@(eQ9pTOE z|4mm$?L?GAP^}SytcH-soiLbVH##x?Ql&%hLhWm8ypIc@Vn*a%o!~*|oa^6`MBGly zY*#`0;CV2grrzn?JS)9XO^0N+;7;RH)q$An8jMFXb$Q|@p&wo$PKqm*hX$NH^laGw z%k9P!T`xyNTLSYZC(?5DhaH1f`1n;pgVbf|k5eKKbkjK|ZMAPx_InoRi%iC4O)NG0 z^CHUh!B4Ll=-;)KF;2QlNYtf4z+wu2o*tBSA; zNIKvZ6PEP?wB@J?LBoN{oBLt`o4cWYI>T?e@qjwcvRfl3Gi{lY@)Y z%)*ZFa-u|=NPZ#`U!Jdel76iwrHvHJd~?r&&+ZoulO+C=xl@D5xwx;VekdUu8W&&Z zfyN~)G z&-&>8_IenFjH*BK9OV?3pny47 Vt8!lS?Gx=iKROAMIFRsd&A)l1GJpU8 diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/Contents.json b/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/Contents.json index 86e314aec..629379256 100644 --- a/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/Contents.json @@ -1,21 +1,23 @@ { "images" : [ { + "filename" : "mini_tick@1x.png", "idiom" : "universal", "scale" : "1x" }, { + "filename" : "mini_tick@2x.png", "idiom" : "universal", - "scale" : "2x", - "filename" : "BlueCheckSelected@2x.png" + "scale" : "2x" }, { + "filename" : "mini_tick@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@1x.png b/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4618fdd7230eb96a41d689fb6f1e65051c5d5fc GIT binary patch literal 399 zcmV;A0dW3_P)g-(E&fNqekzy`z< zbc6Jy%E2-A^_;l8yZ%V*e9w|)xw~nakW*vv1jw%g&_>fn07n1^M>ymdNrT1;kP^_G z*vvW-!-Y%&{tjR$fJ5gF`fWaf#>%Su0&q&7j$r-!IRbUx3TO3UBocwXj-`Rs}eZt+4rKKOu5b`E8wFeJlyGn%``hs7c`9}aL@d`546R`CvmOzT8aO7 t;owp=_R1l z;03@lU6oXyqZDj_p#^|z03QP(-T-U?+*cC&kOsUBF!&vSFCh=KXh-e(_KLHCT&STT zBY?N{L_J$cyt;fjbNNy()KJ+cfG2&Wd6Ek?GzT?kAQ!j?@GxSWhlrl_$j`RQI)rke zhRh}*xJhLt)d(=Ew+9viPuehxQAPvYbxVNPA`^F}e{_ZrPuPcqa6bB0Nwsg74e(OA zPds6LL>phxTw>cpNG=#2%yu##>K@=7_Salwp1RUIcC!bJlVqW)Syc}#=-2*)=_!!}HfinPq2JXGg zIFp)7Hh7o3;CfC2L-6MgZCqrW!=~00@T4NMB;c_$6+G$ODI=RuQ^G5yG%z_l5*mmC z4@UzOIIZZSb(ce0A4P+AHBgI-PiqeoQQ^S`4n8+{n1~Kf&&aq|X;UZAb1;ztp7fGA zY}v-DfW<^Ac+%d*06a{jgePrvLi6gF3mc0}xxfWgm?^kQ2!E&~3Z2kw9qT~U6KI=g z^u&oG!fWPw86B)aHe{`oX+?&IW>yCH7u6?ZAye++Cqc3JYOeTLQv=D7O%GobO< z@VBM|z}^#@1s!m}c1qJ5PV)_AR4g}z9Wmj*i68TDE8W`Q;d)NY6FcSE!5ha_gMp?~ zM#dAn2-qh=RPs{kbYlO0UNvZoL+G24FMCirt6%mQ$_$N~>UA43Lq_P6hFaflObHKx hQt-G9eM6-dfWP?OPfSbytOEc5002ovPDHLkV1jpAU;Y39 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@3x.png b/App/Resources/Assets.xcassets/Post Icon Picker/selected-tick-icon.imageset/mini_tick@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6460690b3efc37fccad3ae9afd8083f84391e007 GIT binary patch literal 1097 zcmV-P1h)H$P)4ZxN@n?tI<_d@4_;soCT{aG+%a8c4W0A3C$Ub-xQCxR$a9snc&uD##joD4t; z;Hitq@+v4!bd)GD_uejQ$1922_`0AMK@>5M0G3`#)t#!k}VlU z(_@>9I18evQ4QpshllBsoq9>QMpNYSCwen&1CRqMkm~LS3w8vJM2=!f&%%NwXhd>y*peCrQN10LoSY@6O)|DY)bc-f zP&i5aFpcMG1yMg|8`#^*1=XRP*Y%T3RZLkOyByFn)<#gJAgY@obOL>GSJxh0RIv|K zwaQdhwWf(Da=00a#xNAbz=e|sAEeWosX7vs3W<-k$U+1hrTXh|E-ll&s& zz@dum$_xKAjj(W-xvN8r95@K7oKNv6Nt7IrAnq)i5f75Y$x&`1O48<%P@7Xp3rP~? zDBdDkB;=xc-A|_9I!KZ#N3pdP1Ws;^g(S&xkPC82y7nPSx*WwOq9qZRhPsWU5ajHY zoBTEJn!4{IDFivlo#cYr?3l5U^g9qa$eo;$7ve-eM4K^{ReEh5LgZwJ^j~+T*pp_b z#@1k!UR#9_IVid)3NrR@m^e!kBnL$oCqeW!d-ZT}Ye~Z7ycV;}%7axOQ3M-F!sMXr z;7kx@R;@kVs8NzYIqULn#kw5D%+n2PB?*+1RplsN2%`GutE!<&l0Z4A+Z1fdwD-MX zPWO|9%Gpt>-UX&P>3mnAuL=1j<^I{Ep!7jz%8#m@a;0$dot7s}jv_JbXEn}AQzGQ5 zlVZtW)pT+LYfI(`H`IYUc4Vz;(1m>Uk0ihzShJUXMkJ}5O}+RpDdaY3WjiI~bn*h_ z5T^m3Ez5rURB5n2zXbU^?Wjf$5k)69E1KWkdiQbl$)8 P00000NkvXXu0mjfg6aGd literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Contents.json b/App/Resources/Assets.xcassets/Posts View/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/App/Resources/Assets.xcassets/Posts View/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Contents.json b/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Contents.json new file mode 100644 index 000000000..d023ee6bf --- /dev/null +++ b/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Vote0@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vote0@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vote0@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@1x.png b/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bef3c1cff4a7b44cce00376e6f15a268bcd7ad1b GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^x@3L?&frWmiEN-mWCg^@R`f z@9utduCuuBhR2p`suvh)UH+8^EzQwoxjh<&10vT;A7VN0$9ZVK*D@vHxF6p2+@fkmYHa$koR5Mn=Ck|uCi>2u_%XY1 j?eCMDK0W#!(;#_AL$RxH%PlRSTNylE{an^LB{Ts5pW#$i literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@2x.png b/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b182abef832a25f3c76f4d2724ceed10b91f62c9 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^Q9vxh!3Glfr6mWXI14-?iy0W$<3X75RoPK71_nkw zPZ!6Kh}O3=5BeT<5OB5E<~mW!H-$lU39}395zz@kPVDa(f*CJ3dKst|{3tI^Fu6Fx zrOmmlwSDT0^5~PFzrX)pm9k#{SfR@Xo9Xsv6_j2Zr^$JI+q_G(VK&os+mngQmRha$ znJZ;e`*}gl+YG^*3^y2eoHDpP;Y~rz1-S#IZhwzhH+k1q+l9=)9SF8+ literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote0.imageset/Vote0@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ff5a7a7ae233ba0ae4421e0b6bb821e738327d GIT binary patch literal 1491 zcmaJ>Yfuwc6pp-+hci+uMTBLUTI!hWBY|WW0u37?aT;VoEKEny-OYuhA=&L_(}agu zf#KmO+B!m?R_z~0oGP}{AGFk3>bup{GPPQq%9Ju4$BM6Us4}!SKxltZcV_qAd+zzp z`Oa&*%FEU!ElyjkP$-hjrA8}UJK&oU7X!aB-AUWw@|;{!C07VFvY(ZJ!eAFTfSBEE zEwBRCUjO=eP@qsmdYrZ@xyte~%?oZ78`4n)+#*CP6a_^Ak>y=LMmSLG^ytxvFHWL} z)2>G=b1k?1ZZf$4P+Jxxa&M#I-o~q?9y-_5@RSb zqawTX=q#x!OF6;_5Bo#j}b@rRNsl^YS)?({@As?xYLy_>VgyA|7*1j&se~FzZ@oum14@rKJ8Z!Syu9QT zWvAdlLKaz0@X2}v6K?j$yQ6 ztl8t0Sq~4wzMatb9F}@2mS!Zt%7SDQgt~AWlsg1j@Hzw$AxTv(l4D_crza$NF;u15 zpp8Isz5(neNpK@GX{MbEP$*#-b#V!Z${D=* zbCzvIV$6~=la)s@uZvA_bM$?(*p9}0>ayLbPYFwkCk zrp#?iGfuId8t2deW5?yYutl$V;FjcG)-LFFDoNspI~el~<-N1vM!T^E)|Pps|CYdySiQhH$SG@tI>5TCWGWOGkn+dE@Zsh5d! zuk9UAv63n6t#~?&G%=Rd#SIyz1s&S6y{gludwevqKUg^$R~5@;m5)05lfNy#*t@mW z{ZotMvkj_Mefw4q154-F0eaJg3+-392z9BWDRWiR7Qr>Xd|*FeOP;R7_eVw1r_V;n z34>=hj!%F2-U0tPS7g$Jzi-er+!w#x^y}b=xI4XZmwhDvIt`3Kw% B8GZl& literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Contents.json b/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Contents.json new file mode 100644 index 000000000..68b3b6d44 --- /dev/null +++ b/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Vote1@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vote1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vote1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@1x.png b/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1e690a2456bb5cb8e3f1b21522a447f3fe4218 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^xlfGJD1$ zJm$d~Kkv!jq_0m;mnpVfSbMuwhewx%%XiTQ6$D}VrB+m1)+fGAW#62Av0)o;HO5t! wbWP)*#?%n~cxg+0*Tu>IHcWW2wwdvOu!p@Oe`-j%3(x}$p00i_>zopr0Ayom7ytkO literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote1.imageset/Vote1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0dcefee8df912d7e56e60fc5a4e6307aa0a8e9 GIT binary patch literal 1902 zcma)7TWl0n7@ig(3N1=7hLDQG)S!T~bKRYtfwkSv?y^hRw%Kl^Mq@a0=Irjs?#wzf zWw*r#OJW)gVh9+BL6AawlY(c8VLb@9r@1VOYW;*k`7kKkw3gNyL*qCKs{`1MdR{=7pFOO|_26Y=h$ z6$G(x+DP}i{mCr~vacPB7obGOKK=mY(z>vj)pADl9KGxfd-(aJwx&=&oQjXa3amJiXbbZNY*Y2o3r(dl8VG?#_(5& z%DHY)VVF{>KEXxebGdxdY1nmr(E-2Hc(_UAIAP3q;(KRfS^b~<+4Y(l+ zZ?)<}p_oiIgiWUwDI7DV42lfrW0^w1bF6}P+!UJG#++y;Jy=9c3OUw*4H1U7&yb@# zu;rQ$^B_leAk%HoaqRz_T(_gc2Cg_@=PO~-A%pU$fb|^g6W4I4n6q5V$yxW2ZY);< z;TgcuQhICyR}IKVEI8mvCL$pUulRIBSGbHH%0PoOt4WX+xj>NCG$7Lm0$vcU>_4=6r1I&i`Nf_125EV}@3 z0T~65MNHAmQe-1PifZL88ym*E6K2mRRJGT(GDaRRIH^rtWFo2tI5`lYc^~JUk!ngK z$ToH$J!V@4vQp%VF-L%-sw#9vSpg?U@{$t{2Bk13NV3fPW07Els&Vx>3Zupq@5^Nx zn~56^PR?Mh1@xg;YNNb?_3;@}0Q8PCb_n1-dq%y=Iu?d zFHG6mwa5C+3qRbwd3*o2kLP%f`|#DBE$_+F@i+Old+)`QTd%K4 zj}gDx(ouflpF7*m$BCC5JbryFv*42}X5@;zW&JmkYqIU@dWhW1w{PB2QWN3tKELI5 zojrVP{G#N4d-Cz$nqRfQKX|G6%VVeeo_l9PUH3)n_-M<>=%-C5w6)Q|xt_H5kC=#d KM^1HZ+x0iJE_bm2 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Contents.json b/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Contents.json new file mode 100644 index 000000000..f3f73d1f3 --- /dev/null +++ b/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Vote2@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vote2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vote2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@1x.png b/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f18d20c68f5795581bded78e60c212d8a7d84165 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^x^aLMf3mw literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@2x.png b/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..451cd39fe4cadca9d1c7e4c566a5ef68bc0066c3 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^Q9vxh!3Glfr6mWXI14-?iy0W$<3X75RoPK7px|py z7srr@*0(bc@-`WWwAD+qKR9z#u!Kd3P0*~MrSAdTBL!a>M)wbwjHR!b*j$m|-*!Ox z+V|KUAD-LpGvl=hJ7>x9dGo&z$LW7T0X%eLr!J{8Z9 z!}MvZ*|vkhpI8r=E$Y{9P)fbYwO2*|wTOn~6v+%F)#jr16L0(%WT?Ma&oJ|jyb>WI zE6&vX;=*I64iQ}gg+((3F8Xw2sJWO3E6w5*Jli5(`@35`R^q2oiqpj}Z*3fRE;&9Y z`Q`HRW4{gt`93}+@M?PX>W)7R=Visq47ESCw{lj#e!y@*Hmur^|K#^LJ)pN4JYD@< J);T3K0RXE&dx8J} literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote2.imageset/Vote2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..233e1e574cc1b9e7eaf3b4e650894d110700ff4b GIT binary patch literal 1986 zcma)7du$VR9KRtihnomKrkQx$V7zv{SG)Gkm9gEmtdW*68XU&N-Q(Bxvi7dr-Do!- z0b&3d83U4L^2jpA!_FD`T}(*O|JL5`+Yv2 z@ALP)ml{JWONt*UMi8VV&>%Fy`!;yZn>ii+Pwy((3~zTQ8`hf$GHb4V6(QX{We75D zTn#r{&B0ZitS20zqD#P$P9z~3L27E#Nl|VE7Ak?Ls(G=o{y_{?6)*OrD@X>DJcy|c z9R^t25emy4tum`%wad|(GzSF|z!K4PBCeTS+KXj$Ik>i86BwF-Sgl^H&NhfP2OCjd zHvsB(P`FHzBrpjehANSdH&93pVDU9-eAu9+2i1p%0{p(ZU=*HBwgl=L>si$Pbj zF(i_~U_n?jbD4rUBhq4$pd2KTNZ5g8(5BS{Zn`lk+6=cR0nr3Zz0HsTgjd`o`!+($ zxft$%?Ar)5t3Zdj|8H{Mjv^Ou$u=XNNs}TIAPy2x&xA2ig@BSV-O|mNejDk+b|w+F z0hldrwV}eU5#xd`x7m^b!HdBihoUMR6>-U|D9Jb}xnckhiTu+X^eWDByDAOoUQ! zr^2{#Ps9bFD-sDr(yb_zoZ)l40YpnT!nz*Mw`yZP6DUnPTP-whi8ZrW&1e8fJErCZPb1_nZtM15m|mJ2B2i2wEwPG z7G~-ZDno#kD_d3M79DqgU;;TGPd$?I1BA%VG6^C z!W;)0ls4d$o_C_`G=dbR0zzFlw)x7rw?fAo%ZA4%H2;>*s}?-5yKHL5^@TM>pKTi6 z9r$D9(EbH;-wdRu*FVM4n6B`!%VbFa zC2ShJ`$7&>*t+sOnZe7$!}BTPOWl`c%l+WH4S1C^k5}V)083hrT)s5n0)W;}7K* vesN`bRs%F*heM0hDu#-uMkx%;%*+foMAbQ)uLsNlx}Cw()z4*}Q$iB}$Glh* literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@2x.png b/App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a48599df6a3e3278cb46a6ba267d83d4ed64ca8 GIT binary patch literal 344 zcmV-e0jK_nP)ZJW^MQHjUM* z>k~QldCL?E!;Y?tI0JA5uyM$iC)$)4C0_w-J=S&ukoK}E%h}V>kSQb-Ev%%4xk!d3 zqx6&vsykrZ$-a{9Ou?XN_v~i~Cy93e literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote3.imageset/Vote3@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b0bf07991627489036cef647b96a1e162e6505 GIT binary patch literal 2043 zcma)7eQXnD96l`DuxtYzA_~FFq0up}_tAFkohz_i+qFn%Qz}Cvk?Y;t_OkY_ySuI3 z!q@mVF@q_J9|R3SvOkc(A1H#t00S`*6^V-AGC&O&K4eOSpakFR*HDMjPmETv%M! zQ!GKG(`ifEYEje}K`{(NkTgNlI7HxDhph7%T-K%(6x=`)R4JuPii{eHd_-x}T^MvV z7eg`?2o!~7EuSfvGa|#M2+Bed$)pij7Om+aFyzLtXf5240z?RCN}DPG2%j=U_OwIG z`55kk>}dzGUZlg^|2Mf{M-+;h(o|_RIL+_M0f@V0#945q%+Dm zq6M8{`6NYq?OrcMG7Lp|IL2mW7|!POk__$SI7fl&mo=T21yHapLEBNQ)n=`w7@TAr z5!}Y`4xABqfIBI>XeX_rLx@!jyw0?JQaQHz+(dBCqrR3l;@7 zs;EgGHjtF$V}MA>F$^u%hvk%nqC&&aI~e28x}W2MsuGnFa6=0ryI+2#bFvF z&$Zo=OB9{)Ng6CpM}7p%0j>F`gaq~B8De?CIL_&Wj~)ct=ZdscENIs*|Klxb)-E4`bXl!GfS2n zB+gv+&APexk)Hh%1}c2J$5rl}`cv6+yL!!&khl71at42?GPw4YtJ9lrmG_!PSADZf zGM#FDdEZM%ca5q;ChlG|wzIEl$1~Exh0L~z>yK5me7*VIx%i%vOCfwO!$EOrdLZC?z5KiMB&?(~o?SZoX!4%)zKK0o%F{KCGmpon z+&|eg_Hk*$#l4l^D(jjq-#FfS^P}c3emlDU7}L0MOTW{f?rJ-2&Io&w^6HBZuIM?S zn9lWG8`qXR+2@xpu1Xx}*Xo*;;I)%5p!HXu+;Zalim>6yjgl*e0%I1>bYaHl+3#s` JZ*N$z>@RTrxDx;X literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Contents.json b/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Contents.json new file mode 100644 index 000000000..8e05f0772 --- /dev/null +++ b/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Vote4@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vote4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vote4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@1x.png b/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..069bad76bff732df6d5253e70db8c3b72ef2a0b8 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^xhT}FCYXR-cB?*j{Yh>5Rrf7GlxVhZ$5pd!8 zp~rmk!}Ey_MxXBq8?IuVw#R6}+lIizy{S^|+iFkUNUL(Vz1iToWB)e2*%N0hpCG(p z)(!c~4F&~seGRji-!$yKP~6eZ;C}EpL#*d6!4~H3kk5z8m&~r%zT88Z;BWf2*H7uu1B;pjXv3`S2H~UUg4pm$+?RYT2N4pp-wE-97u#N!!v(Rb3DE zF5bO~t$<;}#|ha9IlD7nFeOMQJm*?aWolM!$+~Uov0xQR$*h%z^CvuPxyWY5vg-Ea z=}JmZOy)_P$oT$7VoObbWtOa;|HYJ&SPdq}-*Mtz2^YE;q_zm4q2LSK_rLgZ{KfQz z0+PPF&heZs>=n7`Hu+3c;FsE=s5 fu$_;S;SOVAh&#U-Yqk|IuoygD{an^LB{Ts5!^(#E literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote4.imageset/Vote4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e03af7b0abb635c40850f51362ea0488c3ee7bfa GIT binary patch literal 2085 zcma)7du$VR9Pbzo2Fxu=#$Y^d#~>r_dXL`L-bumH2dmJzlWD;cfyS_l3N|WpT?tY)o z=llG9Z(DWM@|-ENrWg!{99N~?1MgemHFt6r{Lk8+vk~61!<8?p2E)`R^(({B(OFIf@zQ9R;~Rj6c!6J(tmv)o9uyG;D_UFTCfs2g z2#A%f3Ru-zRl~P7@Qi>iU4kr*vQQudG!BV|f|ANct!P}Ag=_sajv{f0)?h^|bc0Bp zyBe{{3P8+865|PiK+KF$;Jh5~^_C(OL6JB?<0Op{1Z!egnnsd86q-{6AM3F@lg8ka z6%A-wn8oo(Bw~!1jI!d#Nrqu?g2E{Zg9uD*ku)xfN$UKRf*q*5B8D|lmJnT$^U6({ z6@{)QVhDxZ?zFI^CNl+dhDW(DP8tb36w(8WqgBlV9=I_sTCHgb1Ka~txk=#xgwKCK zb~HoF$rv7i>}Up(mZrnp|2H{hN8r=AaFY^@r%B*(5CkEpr^1-XbU@*NtjTIX{uk-= zc03Wf0hlfJIYoqB!v*a!-=s^r>{b-+7zI&aNnaVya9$oGyk;Jw$#M(k^>Pdbc#ble z2#b#~`%*gN@(Gf1mJ=qDU>K5g*cjTxFgDuaBpAwKvzb#|m!xW(#DkP=5!z;GGfkTb zfB`Q9Fj^o4%;NRY7$ukp6X7klcsUT~vo-~Anyl2waxm4Z)u~J%6lE+!O57YTN_uV< zJwyR^P6Jj{Z(NLEFw#;(nOLfvrJ1KliY15y)GZ65ujOx0riL`L1kIKae}TedBXAn` zzhHr9eXcca{a=d<=VL%-8SvRV`9M9oL>xcwD z5&%##UD|)vD*;nwpBCX1P~nH2|0vCqpz#4t@&h-uR&Weejto|c&`oT-57uNH;8;UpQopO_F&XL3P z@Qo2=Y{_?3w+H#r5z6#s$NrMMmTgD74WhAZYw@1wzQDVO`tVNbgWV z-pv7DzqIxU(%ioJVnJ*{*Is5Us9AS2>u%gD{G#^IVBtr(rENt+r*=Dc?mh1LxRd{J z%-cJ$Yg6Bcy*mcaJS)7pptRPprEc}fS9WC|oa1qM)XMe_Tl+V&+YembQ4FIy#1!{U zxc`fBSx4W5x0_}ZeI;ZMTkKovzVEt;9@ulFaV*Pnv^!7SJNVj9lftX~MVA)m$1L~l zmVtNfPQA44*nMI9yu0_#{`&mko(o*(dg}c8tR)$fVwuNZzS=yw2l;JRPtJ`ewqF@; z&J8Z-&uz+%nAKy_%+ZorLyNBWj?BDVc7EuEyr=uFMJiqWj~~*#`FZJ_Fh`P|FHO}y O*l`(JAKp2J}`z|Cl3Q(X(ov1(p7NjCGf`FBcp(+D^ zfC+{UZ2STwegXp>n99UTg*w(!$3l?+RV87F8YQV?$F&dLB~?pum(0A9btiw1U%&U+ zXM0L1jAHLGaD#ufMWi-~y{o_z>}n9H4bAsBf zNu;}Rd|^Pi1meOZlWc<@T%+h-M_z{N;v|#(gz|8~bXesWuW=P^NWY&&)bEowJn9c8 znRG{Tbg(8-nPC38ec|1WlX-B*9Y~(nPeGV^{gK7!Gvv*hnU<-Y(LVVfLFGz7-mo+J z-0#<7_)6GTH7?y9TZh`~AT94O6#4AX^zI5Q|_ld_Ge|1=q(mHs>!KQ_sO>~nK>U)AP_*s!sKR44?Czo zR#gjA0t4d_8h%P9pNx{81L&U`3kQ>$P$3!8+{~uj1PaWNI+(&VKpL;UgXtNjlvG%y z!y67PpP1v$<`gtdAMKi>MM0Ym0WAkpXMoQx9d6TcFf|l{*eq<%QWq%Bv3l}z`CkP5 Y1z7Q-DPM$sX8-^I07*qoM6N<$g2pTW)&Kwi literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@2x.png b/App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a30954e53d58adb5d1b8d9147d627ee339fa346 GIT binary patch literal 850 zcmV-Y1FigtP)k`~en%HM=bql-dcy!+ea?~kVx)NGrfbs*P+sS0p5G8SsN*8>j;(xlrzqM+u861|fD zNKhFMuS*b_gK5+*5I{i*6Ti)EqN>Njw$edQ5OT@d=t6 zcTASgd#sH;H%S&AWX?e5WIQe974W~cVv)|Fs*sz2)Y15!G>7JrgJC7f!BhAfb2wkG1YbO+hUoKW)QtGNRP$msc+c!`KBp* z%!UK+f+T6u_j#jGdJQUg;1QHlhG6)*n<@lc>p}Mc_K(-KKh*J7B9e9$Ysa?kq@0n5$L!zr{lqKdHavXi9{88c^Yne!<%&yu*oHd8%4JCdSFw;y7GE9y3TzDFP8pTd2l c58)2r7sfe(Xx{O1a{vGU07*qoM6N<$f?|l0VE_OC literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@3x.png b/App/Resources/Assets.xcassets/Posts View/Vote5.imageset/Vote5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6e51dcac5d00240837dd0820eeec28f58d486743 GIT binary patch literal 2495 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 F0syj(_b>ne literal 597 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~aez;V>;M1%857Qugyf2Y_W`vF zmIV0)GbkiXIPlNBeUuCjMNQGf~-dR`P@`AE)sueN=mC9bOS!_~ZV$ z+hv&xew+O@Xzo9~$McxOQ}NJ0+cqVC5uLuO|ILm^;>Y`TCVHKI^WsBrg1EHW))RUU zmLEEoJS#n%?`WW*`)-ZQ`^j;a1qHUQeZQq_ik))u(J4|t4;}PBf8_9^FB~DinZ@O- zLk}Ek{&eKR<_`&uPo%RCuiW;jmt&vD)2y$r_dnp~e083iH-F28`;{_Rq8024K6LCA z)o=dgmSp|<%iTmJkAD|VG9Pm^%Ikh_x$ndcdG<`zwZ2xi=4aSE&7X&4pR&^FbNr~n zk^AuAr2-+5r7mqt6_zTi3aNN>6$hLN+7j0s_oF^=cl(6QBbgHl>V6-z=HM)HxUwM9 z=&DjQOX}vQC$bt%qBos26Exp$>bu=EObP0 Hl+XkKe>4vR diff --git a/App/Resources/Assets.xcassets/Private Messages/newpm.imageset/newpm@3x.png b/App/Resources/Assets.xcassets/Private Messages/newpm.imageset/newpm@3x.png index e70ac8786c641160043ee71a49ddc99973c1c96d..249efff3a67cd749624548ad085aae2a8b9982df 100644 GIT binary patch literal 1431 zcmbVMX;=~l7)B#AOTn!J$r%`G=229-5;X)x7~Yykc`y}B%)%#Ag3{*sXgU=y@FGhk zF|;i3Ov@)Q^Pns(REX4i+PrOQ9@*Ib?#G_($9w#FpYQwgz8M~F&e~c~EdT(ZO~5;P zsq~5pbWIHv57z`ut7JP3A8-i(*zw(8P#csdYybdT2?R$6A9~qL`8UroJUDf|el`)c zW!aGQ!!N~v8h>Y!zS;?O8Zb?>{ny7+C4eKkkcfNX0A1Qp2hXNl5MqtGou^pmALOH9 zk)7q7S&qTX{+yf~g7=>*YQw~t9&3L?#XWOSHXL~=SMWFM|=Y;@Jk(qtosQ zw>X`4oxW+C6dH2e3L!pwm~UU-efOdnywx5Ar`HAVp;<7utW4Yh^TI-irltkk;341w z7lS|CLN00e1x@a3ukV|_;`}o=K4K1;Q0{^}h^0WU}rgXOXMzSU=ntKDzHnn!Nc2+W!n$Hh+k%sxw;UVd0s z8{~F;??tALofH3bxJO#$2a$=@;_$k$q}d=!6KXY|iDWPqZdEI4ySxPr)zxQ&uRqgPLAqk<+yQ&=#r7ZM2d^Dv%h{FQa}m!0G7WWQ3yRFbdebed0;OKV^xi#5~f`$z&5JGld|W;JvS zuN?rLdnCpUVA)sYR!Lm4yT>wWte`@5uhF7KNBypm;Y3KZ;MBNaCG=35hzt@cTl2&g>jgZ=4C7dK_WWqTXe@W^mb}3Hb1R z_CI?)x$tcHq<#QbkF^l!4I92LXrtP4l#lnf*O=NSE4tO7+@2E7;-#9+7%ZmOjP5S-i`>oKIHKLKh>i{JnN literal 819 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz3?z5#SpFYK83*`;xc>kDpE2PqNl30Zcpp%^ zU`dc)FoQxs!-4}3{$DUC*zjS3LxRAuV=o^uFfh&Yba4!+VBB*(oawWM0CPg1EBD90 z`n&f=S2!R0xBt4x#l#HHam^pds=x zxb$O2nuN=5hcderkK@(kO^?2+@Y$4WcsT8}jdre8PVr{Zd8xL^pKR0WSUGE)^^QFmY+LIdXuB^rV>mwb;YU{c9giOD{ARV`WkumxSg-&6lr|0({VnG*2xyUX|F;)DD70vJUZia+Ql zKkEAR&F#j{wL41W+UFV=az_Li?-5+accra$8Q+J$1`2D;8>2oj8ni4-D~))y*dYAI zp=+}pbSs=^Wc@i}e3l_x6^b-2r;GiCZxFM1WsI#72fS0tTMwQ6_rEwO9}#U6G@H*j%4YxTey-K_yHcu_NR+Hj`tUsI?ExkRfv!a>K4?1q z_P@>GzhF+3;)nOvug-jB-{UK+w(G^5C(btyvsmzPPB`W}GdFX>wUu}KITGY19_F9B zbP0l+XkK{9c1k diff --git a/App/Resources/Assets.xcassets/Private Messages/newpm.imageset/pm-icon@1x.png b/App/Resources/Assets.xcassets/Private Messages/newpm.imageset/pm-icon@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..048be6e1de26002126e633f6f7a7e5ba4d60e24b GIT binary patch literal 412 zcmV;N0b~A&P)4R?%^TFbsX_^}me32F(Z=ff3pbG6Ey8LD?XTzy?h> zV1#r6^+cXH!6lRgA0N@34`ZbFWb~rA!J)|iFWM!tPeM0 zmlK8cZ>}6q&D?*CM59CXmT~hHRHDnjQPssq)gmG{0@wG%xNTlx`z7FJOJV`*g3U7F zGPPsUHwm zTEluN&Mv`X3ac1qay3ggU@B?fofW^E!JAz~bp>&SQ=-HZpur$`M;uK|N&^fF7Pg_= zD~v0g6eVVL;C~!VM1WK|ftu!eXNdcSwY(s+My)9E7_jK9E*1;Yy)cf;W=1X7x0Vu~Yq!Tb{SYMNd>_+}bJi8+Ik1EC0^ zyg*jCP{Gq;H!4xnT#PF;nwB%1GYGF#vVS7RU{!rj?mck4LW!27By!&CB9mFe+!^BK zY8FRP&u2~W6|inqY-V0NnwbNB8<9*6@PL0$qPcY#1!yj8&|dxO!h$xkVBu$_<7l_b zOe7klU$F3_uwL@3VlhQ+ zD8h)E<|=ULKj2xvn>&3Syef6Q>}QLX zKAy{3*X2I2Dh0nzO#oYScpX>*=1m9yYo5!^uFDN6SZn%nBLf_t!@vsg zOw%8#iI38db4_08)Ojd~INo!qKjfo2M z`kYZ~bsNZ&sc|KUCa?NV^J@I8`( zqrfABZr|>6&gpu}Fs=ZoP6ZGduBLBt(kw>ftW)lYD|&pX8%7L+&@L^_1g$Q3x!(hmD^8%hik zj^)?d3uR%#mIY!FG7Y&{?9RYDJxW8KQx~0VbY5+dJS`}(kZrVd;)DahvsUSDMH_2E z$4P1p9JJ4OENm+AlH;@V)DQFLP6FO+`13Sy`1&e;NI^V&qwA6YKgCI-wK%5~*l(X_ zC2T42nlj*p+4HxyCKl8P?5TKY-E%qLb@?9nb2`3b@pst`Wke8ZBQC+HN=3}Qcyi-s zwM9>O=9M(myY$SVj+a$VrcnQ;M=kr zj?demH`$5URfE)goNzu)EK}cvEHgmGNWkZHI#5%{D77~wl=qR>mierVd=S+mul5V2 zz>nKtzz3G1)7u>>bdq&eur=~ILZv|CgsK5-jl9Ay%Efm)m+uVoHg#Zo&VH&b;xM3uQ7L#6r*2hwjoBXN0Sh$n&4C zQnIPUniL$$3f!|$LsjmN)-8DN_)7i%>%S631Q82C#Ih={HC!WVD&AHl*fbo?kv4^q z0Xeb~m6~4aFs>H;V##AFSX4309Vu9m!hFXE_!m)*vdk`=B%1&L002ovPDHLkV1hb( B{rLa@ literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~aez;V>;M1%857Qugyf2Y_W`vF zmIV0)GbkiXIPlAVnYyi1P-cSZ$Mz+XyH8~OXIu%iOd$yQx^`-K7ugPyM7W6ndRvzOr-vdRUn+O4JZ8ew zck!2>9DLKX+pg3?w)DX?k@Z}$q7qZM;zE9vgsiGidvbHqgOjH&FBSFgS?+CSFVh^v zwtz=Nv*AcX5K~K!2B%ot6tOitnrm-J1l^h-5#*(i>}Bs1{W&(y%Z$g=XQx~1sk5!? z{@31QJTL!E@vxgpPKJEcMrKA}Xs{*zyEb{ok@&5WnTMw>E9?8eb8+c}x0|G0bk<}p z*m`08!54=fbH0gJoOQ+KY}KRhAzw~@y!=&MAnsDdMAfwU;)|T5xHsxOaqjbvU%z?z S_9H+O89ZJ6T-G@yGywpL@5Mp@ diff --git a/App/Resources/Assets.xcassets/Private Messages/pmforwarded.imageset/pmforwarded@3x.png b/App/Resources/Assets.xcassets/Private Messages/pmforwarded.imageset/pmforwarded@3x.png index 20c91497d995e4dbf9f1a83cd86686f8e8ee52f4..fb2f275ec1a25aa79a8bb7b0a63f2c403bdab60c 100644 GIT binary patch literal 1123 zcmV-p1f2VcP)U64M-&`dy2>N7RAWm&TIBvXIxxE#F_E1x{+>Gy}1mltr63w#8y0&q#M>i4DP z@h1R#0MGQgEu?;BA-JGiXc>Zp*ktrYN!tS0sGmaOcc}6Q5k!%qq}&2HAN>JM9stNf zYH6b~s-Rrp0>F0wYXFO}3)_POfV)CMj`fD42%?C&rJopL>g?1PHAX}Y7L*GeEq6>+ z$rV-gZilo{-hwDRnAFJE_CYt$?!o!qB7m8ucY2p?48H~bym03hFa+*h*8dwQgmo~OR@^eg&rb= zmZLJw=R)G5kotL_sJ#ful7=dsbhbg%Gu|^a$k&Bz7B&|;8HCQ1_l49Q+*WK6v|*5Q zYLlZVq^{ZzfuDavnYk6Cpj_xq;8>&YE;_RblO##Cr9rD8YIkk|7pmmkRJalbNek-R zH84fcUBJS$v9V^1R=5{ z9WZ4C8N1pE5KGd!Drl9kAViX+d-zikgh-NB8I6NdT(W6{Thc0{jRaGIQ_|%W1%Xl0 zQVHsuYDgFsNoNBE?P%Z5^MLml%E~sktRzued*%A9Gta`EXl;pYBhv`1>5Ft4jC(CT z(^~hG25e zl?i_3B8fD=H!VEY@LB{tqYvlYKOn9K{OuSV`YbZg61G=4z1pBe=(W#h==y#}n-gX^ zhUZLC5SJXqJ}acIV#k4R#094u#kNfIQ|K9U%fXZc#gKDUwW}25Jcwf?h8&bmv>vAti3^1V#_&J&zsc+Nt#ZL zMQk~!H#LoY(h-jwq##E{&zm`;#(WTk*C9{=Or#(OZ5zl;6K32y&DIIX*|p6pwF;t1 z`TKx{sdA+8pb-W+C({NpVsAWBI zNGljmAxc)^M13%IIlwbzQo%5tyQAY*MtU8|WKR7jroGy|GH35ItMBMYCS1;~_FfmG z{?WI=MT<|EL%sMX={oXoWC)Kga^QRO0W>Lz^nRaXE2002ovPDHLkV1l>(0aXA1 literal 624 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz3?z5#SpFYK83*`;xc>kDpE2PqNl30Zcpp%^ zU`dc)FoQxs!-4}3{$DUC*zjS3LxRAuV=o^uFfiWsba4!+V7zmseW8pZPs>9=cAlAU z_eVaTv-MHR?^@nJEQ}&5Hc6-cELrk{qv>t=hCs?`=6N6y5bGJL=>b7sAQf8$lJ zKgpQ~lhRi`dAmvb@w+9Tr|AV`H=Fme$$FZ2Ftyrd7>P6+Wtx3VUw4T4Qmef}tGmd- z{Hq6@-L7tVW9oZ4?sN7;XOZHJFugxM4+~HJoA!2n^=D19ItR915$8!OjC8JFTOlMm z`F2mcMB{nWua0H8-odYboVv8FWNWLwYN~gn_xJe`JFjf*J#REW=5&|z=IhfQ9XqqN zg}UEK!HW!D|^`l&mUcX!hI6 z$ni2%m}S>hCb^Q;wgNB1x;;u(tBUNpYINfA)-&^eX0FkZJ?I`P@4Z8}>R40ynyO>h zx^0jBSl_enzIfA{>s5DG%idyOU@{b8E%a3V?ccq|VUkVTgIoXPe+k|ecJ5!^!)o&3 zhDN%xR`2~S5f@ISoK{%7bH#zjnTPuIO8hoCOU`9@yTda*+S=pt%DYZ1UG6$RHhOd) zvT9cR&Bhqk-*??D;LhVZZKDX+!za{h)8~XGw<@l2iadGxRd&Rg&8HNnX>L^OVvShy j%_{Tf)s3GQCdYRj{IqG+^r$DmG{E5L>gTe~DWM4fgyQ|Zc#44BiA8uq`bm*tA%6ZJq*B&#Zz<2hK`Q+|mJ>P!!&6&qI@wxBpFHHt zB$8nfdXcv3ovLaRY7^J2gGI;#A;y3c=9;&ZA!$NPLU}=kMUE#(vN8DzdPlfbeU~qq z!6i#-V&Qf=%I2eG1J3Wc3R4(&mlLl4d1!GmA~4~rBc zzn8ahb~1n7Om-8f-{b7O-~0aFZ+?H@PVDXN(G0luv{Eq19)x}3=Po-t|S3r z)$64ec)QDWVDp&Cqxaj?`K>1!SaxI`WHznV1+kE6XoN3#< z1N=T>1(wS!amWJto8L4PF5hY=33!lNe*u)kj~bWqd}7D~+WR+5$;*kS$qPJ(Xbj{9 z8+p-b$O1Z4UN8`L=;Tu})_`jxAe@J-B;eKb^8*X$BxMqRb5EXq-&q+WdBK9_c>tw= zlm|M)R+R^3IJ}D)!t||-Bwz+z1^)PuqRORz|s8xW8`EB6z5fnJ*huEG&Jn`A) zp5uq5asOTt7)7R9(D}j#)kide%Fr!oMk*G6F>3OHBw*|7RXU!-6*z2N11$O>QQ~> z(tGQ?P-e|1o`b3&T6#XeeS-Y|(iQ0ebZJsn1#e3;!ypgHeEv9?<{^b}-wSV^H zdoeSYyZoSg<~)e6UQJ(uG@Z=Vg6F8#v2x^SxhfQA>!LJ@Cv)s?^s!+Ase@0d$jiwa zknd}LLpbVm+61{%<z6Q09sy1^KC z%_Q=-WIq$~JPkMX|F8c_WFaGNKU7`VqQP`8ja^;OcL!BvQyfWw0c1)n!!4Or>Wh-R nNV6lAvb2GE1k+@gFbv>d4b|3A4w9Sp00000NkvXXu0mjfB?xq} literal 597 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~aez;V>;M1%857Qugyf2Y_W`vF zmIV0)GbkiXIPlRSE!p$g>3+-;8!j;L8Fto95MjP7{zR$D*-K4a##esBi7j5aR!c&o8oT{8 zeS&wrWV)8gBfsm!K@)}9ddZan({@$xtY0zt(T57(I)1Z`Ab&BY5UK7$t3-0 z&5`UHLD?J5CjIXmICoXXJ@XQteY?3?JCEOv`Rc>QkgCfvavr}^PCP!iXS2v$Ifo_o zKKeek49rI_a(-U5b$jAM5rKEY>D!+RD^xWen-eQoRG;o6T<~oM(~3EU&lz1B7rlBE zy?L6wnlrmXhf^th6I>BEPcfUpPgx^zDQ50V$H%;{cFB% zwUYle-72^7@C%ocZx5H;6?c8!?~^Ckp0w_BV3m%oz#Q@9ij^NH|GggIali88?F21p z{o}vazy2-G@o(y}f2ybdZSAiY+*)tCtv+&lZtV~5My2Sa8SW~9z=&q>boFyt=akR{ E0BLOf$p8QV diff --git a/App/Resources/Assets.xcassets/Private Messages/pmreplied.imageset/pmreplied@3x.png b/App/Resources/Assets.xcassets/Private Messages/pmreplied.imageset/pmreplied@3x.png index f1ecc9c64995af7a6520ba89ec57981a20e31d9a..7ff4d1aa14f46a7249ac52d707a6549f132bf744 100644 GIT binary patch literal 1326 zcmV+}1=0G6P)KKY+Cz(Oj(9pF?zs31!PgbJ`LARVx& zAfW)D`INEd9$j+`FqmkD!zUTM{4{N2*qtR$a+82+HkJy!p60ZSF0F3!D ze}3h8{1U(efCWGERn`1?C&~_}C~*lipGg3WP#I`*0Qaj3_c{BY1rROe8bAr)RQ&;) zssU60ZgN(=x~!=jP_6=ehFdIwV} zRyD0@n$n0E5Us{I$Ttdu$*Esvk&s%`Nb)7FOp9j#2khg5eU4T%AWo^fJ)BZ5nZDk! z?@@}HVnx|3r~BfFrMg{JP52R{U<*1BI7U|-OOS#9DZ(+!?|T3}|Ve+%631=x4q#zzK++|1Pl;PvBVXo5=fnV*9Cj@7mAx0%DxANL;OY z;aJbvT{@v#rjO&kILYOM4AtCl&Jx5Gw`OfiM2 z6$Ga!n^@#);=nZ3In}x>X!;+*0muBriZ(1LaaDQFaBN-J`J`rsIaL$zLAxZ;)>Q!s|feLKY_kzdYQtP7D@ikbL2XSqjP z4U-oyuO20<*M(;7NkeoKmGaa(9|^1ntf}vnIOWHzVrXeHVxzH=K+P`3E)zvaV<{k$ zvXp!;yH*wcC_)+=AM_wRbrBi|-2nI~@8ibv+7lh#d@_H)d7@8R8bB!-y--Nn6%mv0 zzxIV1McG8eUs4_rI+!semvbB+wW7VzQ*H zr3N4j4Cx*HT;DV2DK$7PKo}U(M{Yg()CheR9XDvsr0AgOn<=~!!ZkSDc zBJR^-7KFOZHQAAL@X^>kRP6~FVynh$7B(R5m}Hl_bXd=spfI{-u?ED|EJpz@w?24k zbg?&)zS&!#?ak_QvZ5smn7yvSy7?HR4F(&4_)BQ#X|z@Ir2aUdx_c98J-6F!o^<@D zX{K#}L`&aiI%z91zD#_9LD1FA;5(}WL0WF*ctT!=5~ARH ztH(>d9!1r~*zgcONlUXBIFP=1A=81$oT|B6MJEQ2ucq+m_;M4Ej<3h@==g#qkB+bC k^62=IH;<0533Lg-Uuowa_SY^I&;S4c07*qoM6N<$f)mVYkDpE2PqNl30Zcpp%^ zU`dc)FoQxs!-4}3{$DUC*zjS3LxRAuV=o^uFfbkPba4!+VB9+^z3H9;kBh6Uc+QUh zsh6uCIZCvCFTNc;dzpU^&x4u{&ByG~T?eflsM7xy0b)d!~Zh+Rmow>yzCr8Zb5TRmR9D(a2A34gxz35z>nE;0K{zCE1z z>Wi8BzW6hroGjayZK>p(v2`KKU4ORD8QT@#&pM>()zr!x8YrZ8Ga=`63O{2{PWAsD zfry)4ukB_XI3u>ZUv0zYo%#01Qr))Q(0KD5QoJ2!@;*>M+3ek+ zYcH)hzHFPv{UYSXq_1Z0UY$1cym0GXlV#*24(A;@UJ>ftj}qM<8tL^XX-B!( z48a$EF*mlIRD8a?UN4A0V&c#C(~mzkANBdKIQjXxWBl7T=eyr{P#G$7v!YMPdM~?v z(l6Q&i1UGpnl9UC)qa;s61bg|Eg7>!r21^>!aa@^6- znk=qw^yl2vOW!`-+x%#Mz;k8R&x*|~#g}SY4nBGnap#ct$F0}@W;gR>D@%QQDD3C` zZR4!3jSIg9uK23B{_DrBUk~p2I??&J!P8$eUi@Ns^DE>1uM0)`eS3Y6Y_w-Gy8k?p US;~n8n9vzKUHx3vIVCg!0H%DJ_5c6? diff --git a/App/Resources/Assets.xcassets/Template Images/Contents.json b/App/Resources/Assets.xcassets/Template Images/Contents.json index da4a164c9..73c00596a 100644 --- a/App/Resources/Assets.xcassets/Template Images/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/action.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/action.imageset/Contents.json index 1011e5d43..b5e25faf4 100644 --- a/App/Resources/Assets.xcassets/Template Images/action.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/action.imageset/Contents.json @@ -5,21 +5,21 @@ "scale" : "1x" }, { - "idiom" : "universal", "filename" : "action@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "action@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/Contents.json index 7f4c45091..d796a64b6 100644 --- a/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "arrowleft@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "arrowleft@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "arrowleft@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/arrowleft@1x.png b/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/arrowleft@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4571c3e70b051981e055ad8171114431f873171d GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%oCO|{#S9G08$g&*{RsbBpx|y# z7sn8f&bQO2Fj?Om%bJ$f@M!0Ls%f*_~Trj8SDxHhaiZJNMzEhF8(hVx0*Pey))9gmF|lneR= zCTE}Vy1;39M0`fE_N3d4mPeyz7*BODa|~Qpe(~UPBz0004`Nkl}Nj%SEbucX1*= z$&&Gp*dONk?i`4ju_nE(ilzZAKn+e=o#~y`Na$<_$6oly(f$c(2HQ% zdBYR~1(?(?SAP%lTLGoV@_8Jkm_!cCEiW+@+-Sv>U_4XM2&n)RO~L?l18hw3xu1hP=8SZh}Us$C7Jb~T`? a1>hHQ738c|dII7A0000VS)SD(y6Sy^eUh-25!1fVj` zk|4ie27?d(8x90GJm@WNnE(`Y@N{tusbEZ&V0BX4ks>j*(2G-2`_YvYm4^7sE7Zc~ z%#vv76)x};jW(E|)oL(dgRz0E|E%fmTLsU#%!tefy5jT{KEG0y-1 diff --git a/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/arrowleft@3x.png b/App/Resources/Assets.xcassets/Template Images/arrowleft.imageset/arrowleft@3x.png index 0903e504b6b9bfbca6e24f2a6d779b235b3477a0..d156cd9682d050cbba8043f31de0a9b86c9c743f 100644 GIT binary patch literal 844 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT&H|6fVg?3oArNM~bhqvg0|V1P zPZ!6KiaBrRT1e zrH)S8)ff97eUvz>{_%k1#%H^?rk7odOG;z8Tq%C8q{Tv2(a*CZSm@Cd?939~zK&@w zTQUmY=p7Zj*wYcmAj4=QEU4Z&t@efAoH>b}x13Mcm8kZ0Tm$;SE_GJC&hJaT7D~66 zDp)=!UjB3B%=%@rUQ3J5>oXWLv|qV;DEs!J|L=YOdkZTr+UarnYycBx~WrN{ItGYB9?jgOuA*( zyu#OK?w_+g2V}CfKa5?zy?SEXsYlP6zb~(z$o4q<>dc25R|N;(nSbzi>yR&L6spp{OS?uxd)+;&;=6`{13XfO+1#C8=?Gi`Jb!p8jQm&hFZG9y+O^N(T?*ZhBKS|8VH0KT|UIshqye z7W>&cq`hN7e(SR>jz_layMA@^)Rc^OT%Yf`pKiE#HBK+me0tlv`#zg9E%)ud+ib3- zlUDLq!o)K&E_#XT$3GUT8`b0Sr9p7YWNxUpm}zb*;39Avm^~OgUHx3vIVCg!0Eb_P ANB{r; literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jznDgizru0ENCva-_nk&e2XHBdcw zNswPKgTaS{0}dM|2m~nj9Df=M6wdW@aSW-r_4fL1-Ub66hCpkThmZe$cYUd;v94)1 z<2;d@nlfo=>rdaSE{a;csxiwnV6D(qGgDL3t?M({SGl@x6~3CJm&?Cu+Yau>)6AHk zy*Pep@dEMIxa1#`9hc6VH}Bs5y(xPc=O6#_F)!`g4c_cl?!AvLRR#ksX7F_Nb6Mw< G&;$Szxl)k; diff --git a/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Contents.json index 961feb05c..e79c71649 100644 --- a/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Contents.json @@ -1,25 +1,23 @@ { "images" : [ { + "filename" : "Untitled-1@1x.png", "idiom" : "universal", "scale" : "1x" }, { + "filename" : "Untitled-1@2x.png", "idiom" : "universal", - "filename" : "arrowright@2x.png", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "arrowright@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@1x.png b/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..fce401fafb164f6efb710cc1fdbc9cb2bb0e5d0c GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%oCO|{#S9GG!XV7ZFl&wkQ1Gv( zi(`mK=i6)6`YeGGY!A`{SLPhyzi??+xDc1h<*cx`Lc0H*wDnB6-inA!c^CDsF(_xL z>`}?5eU?vhM1HFU&(*K|^lVPeOt(OhT@&}M)3AM^FS){aO6pC?whck1)1Ox!-@L2W zZbQ#>p&q~34C!cz!`5lRjs+c(B0G*&X>rIIG=6;{> zdZ_Wo`)C3Kg2B_(&t;ucLK6U+n|)va literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@2x.png b/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/Untitled-1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb35c0a73436c67c24ed4ae66bb06e3716bab9f GIT binary patch literal 699 zcmV;s0!00ZP)V_lnpW=zh*lG*(bWWMbTxq*T}_}yS8KHaIyyR*V6F7yT&O12 z;NW1jk5fGmda=LMUW0CY4Tw7>MZ9uPvvwzjFgGCXloSDUAJ?*e8=j#(Aa=!y0Q!a= z9Lv1<(nxI!h+mN+SGhCTiC?9DD{kRHV2()@y=?bmJ-%e#d0Y(6GogyuhlZtj^gQ!= z@c?rQ$XBMKHr6-N5`Hi9)=5x{3d)IMD~0dagiD#X9FMWOsHC+heR^>u>(7&*b{CPX zR<+z&Y{rjLzZI8pJUUS=i_-zA=6j!cCvhb*Nv*5x5ee#L=JnuuRDyaOAKqb=wCRqk z3tJ-V3S3d0SM{qF%Yhc%&R=NV;z*42EKW z+NG*`MdtNMFrN#^SEgv7F6rK2cIF+#zTi9)Dsm1T#p$d+Dpdlv19MEO2%uTgSBLJ* z`yh?ha6tTu6alnBIn0Q(iGB)*U9lqO(8{bmAl<*!1%{Xr>ceXRAG{*e()_PagR2SD h=xPErx|%?ZuD`9wUJ1&+h8X|=002ovPDHLkV1n&bJwpHh literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/arrowright@2x.png b/App/Resources/Assets.xcassets/Template Images/arrowright.imageset/arrowright@2x.png deleted file mode 100644 index 7236d6fa05e35e28c9d0db231e2643556239c031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkh3?$9N*lqwR=>VS)SD(y6Sy^eUh-25!1fVj` zk|4iehKBzi3=RZ5a4_j?mjepgdAc};R4^t>oOC$BvVF=XWw8Yv2jniPo-nE6##3~nxx4qh_x=69e((SP ze{OY#IW=$O5BTe8!9d@3I}xonW}xowk6NNXAVRAF1TEz+{PJ#D}7EkKuaVKB>LPWRX_`nm9{f3t^DG?gK~(mY31|dOsL7Nr}LS# zB^*6(iP=IeDWEhqdE$f613m&MaMA(^`J4_HPx!R*0lfs6i_3@{8h{7|TDeX%2<4bE zAU(^`kXnht6pE^$*%~FLR;g9-3J6DW3_&pj!(l9rh{Fk70}WkrV2!io5m|;gL$<(| zR-P{iZURBPUa!&{t7JJlf@w4w1jP{?hXDfS{Vsv@!7hIKum%IoQyk+K7}f=e8c8eb z5wvpP>0k&>cUY~9AEF5mhWJP~f+6QK>HKx^gVxxp9;V=4=#A;8h8)Uz;* zK+!>{iM26#{y#z07EDc`7=dGdfP$p4kpg)`u#F<}Sk6g;kQpawrxCZyE{DQI5_;Cb za=hr+7#^Iff2ero(S<`Z2LlZx3_((2A!y~4m;p41U~rlF-wX`Od-G|a^dItK z5XQ54f|ulIogJ|CFES4S?jvH+4n~6fImm&%>k51r4!VXo4Yw=s5pH<23v@XSw6pY% z5FwF7*o+39#TV!eoXb3ePF@+kchJJO0`RCn%x^ny9~ zw(ec&+@$5pWYycFN>(JMYqY<;{atWr%Yu_LPB$O^;DdyrOBYK|eR<^by9x@&we0aG zjjms>D{8U?O4_8e-`J|}xGlcnlilOa>$4484=IAnM&(AloEgZUv*Ala*R*))ciQ6{ zgOv$&>Gj$zuuP7p&bMrQuXXc@S4W0k$ef>j>w-<*Pj_wWp8zj>be{pSf6I-iU%B(? zok>66i_SjUXU&?>uzBQxQK7OE{eTtaX5si|v?^~8e8*6gRrfEGDtsNV$Jkr#6 zN?|IFYC7D0dz?kF+}>r?WEXBKJrecPr2NE)^UZsY&TL7nQn;F8&RP2>_XPNf$C933 z6(8iPNPS(~#veA6m&OPEY;t4HuU`cUcD>(qk4*TY;PVVcLihPeI&R|V``@DVb&k7{ z)WTWH;+7GUBD>rApRedv$S!?bdpPl8MdaSld8Nzq{>hG4K9jYwmpeOtNIP)uH}cFa zt=)@Co=NqW?m6~i<<&D&3$@-y?(ALL_*6^i&4r6(t?i3SzNz-~$U0-rW;~gP)V6Oa z>UqOc(Vy`P(DzVIXs%(s-V@l}IPX#t|D^Ax+#g$9qp6oZd#|V}x#6*op1wTmR%Vr~ z{Po5)-v>v;e;qB1H=8@3xHfA>Pg&*H4UgZ~g@3f?+3K@5?WtCMtZy56Rn@+4%qDN> zBtD@Eu1#LI_P~gcJ?YHF%;QE++0GN4tqo(^w&<^f6l+&SHO19LwFj@QowR@4Zk04^ z>W*zaI~P94B%VkpB=49p_aSdvATkABy?@3lD;n3>*F1XLvP74q@L{t$Ii>d{>AICg zWWA<#`Gqg)Dr@e|WY8BHf8AiOsoAfa|7rEY&AnLkj^@1umtI~L9gFv;eRy?xeFXyIjtvS20?pS%>>95i!l$#B*;_-*dOHSElMs{qv_Ehe)?Y-H% hD@#hNZgh8zA2a&U>QlR3OBMe;j45VAZSvw3zXKNBVN3u3 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jznDgizru0ENCva-_nk&e2XHBdcI zNswPKgTVoZ{~ri)QZk2 diff --git a/App/Resources/Assets.xcassets/Template Images/back.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/back.imageset/Contents.json index 64d18e8b8..2d18f54c3 100644 --- a/App/Resources/Assets.xcassets/Template Images/back.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/back.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "main-back@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "main-back@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "main-back@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/back.imageset/main-back@1x.png b/App/Resources/Assets.xcassets/Template Images/back.imageset/main-back@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1ba8face3353bde5b0bc38e2e93b93005d5861 GIT binary patch literal 297 zcmV+^0oMMBP)HDgL$-QB_*3OB2c&AQ2fvq^kz9!$o8Pp1@QTm`Bk7>;`X>``(w% z*aPW-)gdo~ZqfxIqXR7FkTw9B6UZ3O#0Eg;DN;{a(T_05{YXvU5l9L2 zamaK8@Dr3&*ZmBLMYCD=-_$iN25nW|39Np@X27~5D1+4>s+n(fpNY)3(8IT@VO4eY v@_ztV;8xNc{%+al#BSyAdZ4YV&8!2ya~O@Odbq--00000NkvXXu0mjfuEKcd literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/back.imageset/main-back@2x.png b/App/Resources/Assets.xcassets/Template Images/back.imageset/main-back@2x.png index 840ad5099b9ca8b68a9909010c4936360aedcca1..018610f62785ee444a20a1c1a1885c8c5d009832 100644 GIT binary patch literal 541 zcmV+&0^__qW&0Wj@Xl-`4I-(6~LAFY$d+z}-b4x@`I0tZ+ z@aYQ0%ts=6A77I2>jK5h;mLGF^s3?C94Z2ZY4(&feTsDw#MkN|q7Xmdq1)u>B*$P0 zbeMn%fCurujDWffP^;3PGRzP^DbOXfsr9P})W*T5K)w3RPy*U#7KEcVkP1{7cqV?H zEr3L!V*K=(_)%F9RG}i!RQ#MY7X&pZD?v4bvJ_MkC~HAgh4Kp<>wmSDsI2AqWnn=Y6O?d zboYyeLIpJm6)5~uJ+h87S!b1`B|1)>6G%PB)2TizQhiQHbHY7?jt zoQY7ILcvI=UG^r$9IQ{j`vMU8I`6jOD&}UPXtNuxNkO^oqZo3txR;`l^u2A3TZ(N^ fOR)`V5k^G6ku%Pt`K<$B00000NkvXXu0mjf3WDo4 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkh3?$9N*lqwRl>na*SD(y6AQL~RuZT(os^BRJ z@(X4Va8S7Lzu|*H!hr`d{ptlkaX(KN$B+ufWQipX9+J~}7H3Q7X->RgFlUyNc0m?b z{(^nW0)2UQm=->|c0^RFMZ4^#v-t$AR)Yx}j16S{cTJakxhOXzTEerHd69=?3__c0KYWe z!<9HhyaIp+0Qi`Avp93pZ(yUjdu1b|Z_denFy^WwOkAtKka>&#<60boN! z&sy(gTAb7~mVb7cdF(3@U1>^VPBcHP1Vr2dz<#Bkv9S9Q?`N{bai|4=yNtA>bj=~s zz*>vTgxc3|+}LV&&9|5lw-#!JA4H@QH`XvA?$scW>YB_KBHAmyR+iy4?wz6b!jd!? zEzVk~En$c_tD&|8b#azMZ3(J_gY{5bf?A975Nb>4-hbjeh1wFjit`p~OXw!fW2h~m zOO5jyYD;J?&U2_Op_#ZDLTw4nejXHQYoYe0^%odLlfgkUT1uLmP+LNi7Kez>iGkoK z(p=ZGCH}j`$uue@ZHjufM2o>;X`jZ+%+jEvxWmlSAT}1((?Z-*;ooR)^wXx7I36qx zGs}xOQh!OS8uu;n_cLjE+pgbY05RpNq~)l(UD*x!9TE4l)V=0=fMr=Jw?Z<-jH1it zX<5k3t;zkHS-2fEx&&ZZ*}V`!OYjK%Ac9@eZRQ}Y=~TLAid*U0?&vz@k~+4LmERQC zJR*A=G`i1KSsrg^;5d?b>{9Zc%5kC=sGh8eEq@S|h>%UD?y=B2S&BE!kh5G;&+b=d z8eA85R`cG_LvWtM^6=AxUc>V66=1Jn*~HSh$FOYXHwSNF+0>6Up2D)(qvdf3t`h5E z+5BY&R>QKJTOh23Wmnf{SPIMT?j3o@rtG+|B}H7=QprkKjtg6IB*OA yZ!N?T2gJt0N~)y>Xkf!9alZ;@u-Zy#D{yy4|GQaYm#- zA!UEwjJ+Xx)+@GJRyWU+SpgHibfn}wsVuc3NDXQxxoLQmm! zKd&EOI{lAuXlh@?S*Mx8TjaF6JeWir-YsQY5xQ0O;BBlP^35%geT_-#FP|U$`aVO~_;UO7#P3sA@-JSpyVUN2 z=VI$XBk_z+5f0oLjJgZt8D>7b+w_a`#)?&YCmq?>xH#KtwjFbL0{@bA-nFvds&4%M zyi-+a>FwghtFEfo>nqLtJz-~)Wa{tq_f`-1D*b24v2nZ41^Sl3)78&qol`;+0A@9K AvH$=8 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/bookmarks-filled.imageset/bookmarks-filled@2x.png b/App/Resources/Assets.xcassets/Template Images/bookmarks-filled.imageset/bookmarks-filled@2x.png index 402817fe076e67a122e81b77d6f39ce26dbb3a28..22895e6288e3c1cdf7bdae853dc78625761462c3 100644 GIT binary patch delta 449 zcmdnZbb)z-WIY=L1H;h@>DNGtv%n*=n1O*k5ri419^SEyfq}8f)5S3)qw(#mhq;Fp z1X|y(;(H*t$xw$&vu(0?G7+pu=COa#RXCOuB6$0x1XQuvP8G=>|d|Fk>Td|<6HkZ zKlV(ByLHZd!`-aB&ieoNioUTcZhU%f9j|~ApD*K91=dM=gwVQ0JyT!4G?EGm*W76F zPO?KGnEi3L_k&#r6ziY=nikR)eA2ioLf%V0>13>delJVfvCj`*9=_}Sz^5@?XL{`S zh6*+>X8xVbn_ux+?fJCv`OJCE-6nrUZ;Pl_?Bx-x7FQ8G6H@g4!QD&0i!Lp7Sj5T@ Z|NgJ$oEZK}d0;Ftc)I$ztaD0e0szg;!507k literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83g!*xc>kDAIKyg=-*vX4OA^q z666=mAdoQOKtq7Sf)D=-95!5dP{bC*0hC+i>EaktaqI2X(_DuY1X>gI-H!)e-t+&q znXJ(gE#1<~P9NFD<$fHPoA&kan$Hy?Nyf(&R+pElOtHv*;~D;ci`pxn6TUGix_8bk ztduO8Z=YtrW`np_CCBleLO-|FKa;1dUX;s}+f~7|agj~qr_2m7Pj1~U7o50jnGG4j zmVDp-BFuyBxO$R$xz_e@j;k4E;#;B@hn8dn7lpEx27g{D*pP9nYtA-~hBNhL?8)WU UVQAiYF-iSUk1B^n$( zjqSZ%74uUxb0@z4@kn6Blk_!Pot}MmNtX~|cPdmsBhIf>GduP~Y0~R{^X#{}Pdh7K z&7Xb!+O6y_Ka*{WB$NA;f;u{~ukE$tk@=;pw6&vVXX4tu`g;FX)L*={{J_HdQU7=C z*eBf1BY4tfNzv+)zRY~;ANHL5m2i38!{1G9yAQ8zcpUcXyx4Mi*6ml4P4CD~pZF{C z(XY^w!Yba*pL+bgN*A2HGT&aE?kc$aQjqzbp4;{>7RpUFcfD14v~Bjq-S=L!)|{1F zr>K8WIw9F-8Si@EXDgroj`i|8HX|$J-$wOztpfjT>|T2(&e!t`zkR!JX{X+-OW)fs zbnRa9Iz70;w&jRuwfQocTj%%kDi$6Wopp=LR$Q^L`d`qCOTXQo|9|YD!PoMLri6-X z&9Qv#%!OwooLqEfEom={abLGJK3TL=^IfpAX4CIz(^reG>`mIJVioy5d7{Lw)=d|F z>33_fmAU!f^?c*<)M1i~aQ(yCo5eF1YTww-D${#^#$>|_+?E`^Hexab{H*+EEE@MH zFO{=c_u`74@|AOHd6Dmz1}~`on4L1!_r~w|7AKZ3R-tMuV$a>3ZEu$N&~wty8AAFS zw=T?&`CepDv2OCFsb8Ary*#erC3opsBA)?AeuE=CPy}3_@Y^u5J`|m~r2v>f89ZJ6 KT-G@yGywoUR6Icd literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMduK)l42Qo0v&e|IhL{ z`#7JrwqlKm{v{%j%rEHVac5DBfE53PV^&rL*L*TE<&|WQPPlT`y>?j>w^VD&N)Z;f zJ&Uhd%`n=!#;w2S%2S)ZElcg1uRY07kug(|={>_G>S)gKCPHenhUWK$F}C>&`k#6v zyIyuLX4F32Uc970)PCOV0$2I-GxblujQ?SMZmPv`%X5W&#d99ZJO?qK-h6XIZF;j| z+D8AU&z2M{@tN4oq+WEg|LLaih>7oJaYqP0tkY8uSz`U1Nz3X>@w%R=e>A6y8t_%c z%zTs-bozMA*O1EC!lTj01X)|{6#3^LIWVPj&5`mdKI;Vst E0E^+30{{R3 diff --git a/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/Contents.json index ed5c8cd76..8f77ae27f 100644 --- a/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "bookmarks@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "bookmarks@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "bookmarks@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@1x.png b/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..1adccd422eb0245dd71cae5130bbace99f67469c GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%oCO|{#S9G08$g&*{RsbB1_nk` zPZ!4!kIuJYr+J$VcuYgt6Ik35nvIy04Zx^`h3!S7Gf42kjoI3Zr@s(i1KY*$xBu&IG`~== z>Zr?ieAxVA=Oz6WM|$J$D^&4KU(m8Opdr(8an|Y!liHRna8}@s>U}?_pRIQ-u-EX fyKNL)pKyjO2>z*dtZo-DR2e*7{an^LB{Ts5-*TfS literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@2x.png b/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@2x.png index ff715d1057afdd5bb527a9be969e08cde27e09ef..71b5297cbe95996748aacdc6567540057f9f9ddb 100644 GIT binary patch delta 617 zcmV-v0+#)k1NQ`w8Gi-<006~!8|wf7010qNS#tmY2VnpJ2Vnt~!??Bp00JpVL_t(& zf$duDZNfkdwX6PbHYgkPHfTm*1V*3}lo1#qBhU@f3Cai=0VcT0$P{Co+~uR_i0(<2 zP?CGT=a^h{FX+98IpJwmYO_~KwGa~6GGNBF!m>lLNO2#S#Es)b-zV{M<5#NCo;dQhuG=OK>h&{F^Zcx?B6`mSb{R z9TKn_*ha)vaDUtCij%-1!0EV%avT-NMYWvKW>qMu8gETr|Nr*Zgd&P{#Ss+5laa}* zK1l-;xVmE#ab9(eHDImUY*6ABzENTXr@Z^SkRaKs>oJK1rxY|wjK3@+f1L81^`=mW z-?vYZk%(R(JK()<_(^vHBAyrchko^u#h!&A6IoE|$bW)TM;4SivY^zF1*MKGD0O5( zsUr(Y9a&K7$bwQwHoV|sP)T#@WOxlRyC&x}b|q`ED_N@D%58+Nb7M@k?Q)LfwC5QT z#5<|mfyR`x1Wm+g3JSHH|*<#sp+9~VpMD*}br{XNS1UXg3rmxc`{wLbjly_+;r!IK6;UxwxV{G(@3FsCc zB*u6;E-g3wF5k=X#~LgCfTH@>T=x)kPvm#GqyYfG+a+$IrfY7G00000NkvXXu0mjf DDHkDAIKyLd~ERH0csE| z3GxeO5J;GCpdmnE!H54B9vC=mDDY1?YsSF9$mHqb7*fIbb}H+%W7ZM!2bod@HCxKt)`%y#Q^d~-(WG#i7{ z!RKLux`{!PJBto6?WsCy^t)%vC%=s;%h&$Q5I7i@d#TL*^&*~MHZ3+wZtXtl6=2_g zV`WE$OXk$AeN}b4m2B^?K6QmN^Y|l~Ew5^{%G`}@4gEh9{t^0@^3ucI>e9qp3=M&j zVQX%;E~)EFg>eRpk5l361&M}4dv!-5Qn-`YawfT6*_ N;OXk;vd$@?2>|*UohASP diff --git a/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@3x.png b/App/Resources/Assets.xcassets/Template Images/bookmarks.imageset/bookmarks@3x.png index 17414649e733099b18bb32c1190748425ce1321b..16b79dc865ab8f51ebe33325f5d24eaacde43530 100644 GIT binary patch literal 986 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT&H|6fVg?3oArNM~bhqvg0|Rr9 zr;B4q#hkZu&i39m5NK_8d{@Z+n(q2k{%WPl*LJ>)c23nK~S* z=WINfXc>0IUQgox#%a!9lU2_u=cU+*`F$7MY~FS-T8F6rceZ?V|Ld#wKWESV9InbQt4gmOvln@^d*8ZU)3exSaqn~g zwB%a#2?ohMk+ZCyUl6RH&sg!2Y5K`b|D}PMGtMsOnIW>}a?i)$@MkIKR?oZ^n6a0) z??{&CucO@@0`{!>yZ%f(mDc|3=WV-2CK~iI<+= z+55`u)7{50+dVZSv+u5`@0aw0RI{TuzTJo76@7{b}dSBk` z*qW;k9^HG*%UgMO)@?;wt10%beck(}*jO#`FFqLJQTJ!}gC9RWR`%?l;cS((#8#b0 zR8>7;-JB%0+cRu6FCNQ1#vZ1%_;EqfzZI{nx%`?JP5ZQA4)g3(u{q~f?UcFX{DL={ zWsaHE^VqkV$AxyV%3hjY_#x|n=~Ij3p3jlBx^tdcPtl+EzU0oz#7X~cYOlpu7G5*4 zSTg_XopQcvO-sSdwf}4AqLQ(3R(~5gnOYG^a z-Fs!>71sw%=Qi~o4P{b=`dMKBYMB#=<}QWiM6hyYlX=WskdCwyjnB z`{7Gz_oMdinq9+Myk2^FPtpAM@!Tfrc?)>D`lrJ3N{7o6{+hZD?W_07kQN8F)F zduBYy+gkTNL(tIXlahLi?G5v7;VWE^SBUI7Wjq&-S>!Ceeek-~v-p?G@?IgMEw?t5&;50@X0frVx>Z5;ixROP)=hQGwYBH2 zc(~a3r_hIQ`g2*`%|ETX?8I_-^0~BM)1ut0m}_rwNmuBfXL#`Yy=UjHE4i|1&(UEKj}t zD6ra!TPD!V|M#nk`@B;*zJ8LMdZO~PahoEG8zV!#x9*v9HB} zH*$)9XT6Y>sMTH&k@gXDORoo@1JK73`S^SQFes%9c*eM65*Kot+1Uw6Q#kNbc#Y`v zLy{3r8V38Q+HLAzN;DMmUjWVk_7OKjd_O%chT)ni!*;2SLb(rOkCNoOkaX3As0>hN z5$r|q^@4A-=hDH<_oYuFIto5flyTRswnNy9tKjNAGU#ZCF>OTdqsDkA5ncWu*j5^b zl8(NywT`Oox*u)tG*{l|xBel}_lN*oPeI{DB1U Y25+EC+i|7RT>t<807*qoM6N<$f(tX7)&Kwi literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/cog-filled.imageset/cog-filled@2x.png b/App/Resources/Assets.xcassets/Template Images/cog-filled.imageset/cog-filled@2x.png index a55a78ce6ced4164f480e8dc3a847a8553cc8a83..c1b358c6bfdc2461c3f6223fad3a1d45cbbd2ffc 100644 GIT binary patch delta 741 zcmVIC%$^#*k(XgWci4b%-hf=6&S@CfP#&IZl~&IIV;0``0gDS{H1 zDmvp1=lIM3d=&5ik|JitlH|jp(A)sM1E~Uth#DeliKru@3x5%@s(e2X(W=_g2q}0f zfCj)xOb_SzkdOo^=|?Fc|xE(>p}$zZIz1${-^+BjOP{r{3=ml3N&^*Ui+Sz7_UYl#6mI{|tE@C(2<0H5^p0l*(8 z`*G^7L<;+%BB)L5n64sA3Mq$;J}Fm9bu10Zc4^3Aqkq-A#8Fq&cfGVTMfP($U288l zdF2Kc%^G?~lTD-J+!+DCq@x|om2GQN`>G)}71o3t4P(Z#SGv)>vdzpU_FY^ZvWA6; z@#YY67KiO3NMR&xp9%q$()LL=cx8YloDYZ|j9@k+?Tc$-4E5);{DKS=76GvkSnZnJ!l*(-gl{# zVCGhjgMUVT?jPOCmio(t^y=G79W6iQF3GZ2l0>xC35Tl>NydG@ohKq`GQSrB36or3 zUrp*l2ERd$O4Wl`m~MBhI*D`QkbOvgFtcU9WnL1uI;1PNFZ{PhPcWFl2G8{d92Ee$ zPq0+H0dKJREdc%k X25Q}rR9z_+00000NkvXXu0mjfq+w7x literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83g!*xc>kDAIKyg=-*vX4OA^q z666=mkZ|Guf`$(c1_vGl2y9R&Fy^!f1Im5zba4!+xb<|}Yp%lv9Icb*T)Fb)+rND4 zs9P_kqUIQAy!pM-W71>Qw*87~YnDj7Ns&n@_F-SRnN5(z=$J^xsoWS`!uLoB|s_xmQ!auTt6+jB}#@xspD^j#TYsq+udWM!8z>1lqt z?(4Gd1wwb!f8Ku*uJ7!uMybOg8n}CFVwB~rn~J}HZlF(PPH}p w(|*_U{{H{vg8lW)?mx`M{^vcpf9TI122E3;=!3hD7J@?3)78&qol`;+06gHBkpKVy diff --git a/App/Resources/Assets.xcassets/Template Images/cog-filled.imageset/cog-filled@3x.png b/App/Resources/Assets.xcassets/Template Images/cog-filled.imageset/cog-filled@3x.png index 72f383c95766e3de7a8e24470fcbf872f5bf066a..5a8ca516e78283f2e9ccf90e775ab2a67f053254 100644 GIT binary patch delta 950 zcmV;n14;b81i=T88Gi-<0054vARPbz010qNS#tmY3labT3lag+-G2N400VPLL_t(| zob8Z4}j|iileP*awOReBGY!Q$=mY@l4w% zRPkMN=4lG&_N~W+D$YdIw;vWkWvTLPOA*cS$n~h8wZ}cpte$A>94Ewt6Jo*%u{};m z@#6@)SEqxXscCIBhM>?K)rx4phe}7d&!#?-S1NSqGfF)WNT4r-8 zb(W=?A&PNt1Vvp&mntGQ3lj}E>eBcw^6hbIVH;(<{T^MahR zgC#_SWB>Op)h@3&cZ0XzK3~t~kQHd^l$8Qm;txv)Q3d2Fcy z{LWm(>wkWQ9Dt{C%!%E&CHf11>9D0v$TfyL64$*FG*=Y=* zD9gq1{qWe;zvO;UMq1x4CCQVL9+WnkJ0qoHhkqrcg_v+cQiK}~yG(H3tn3g8#|d6< zlyrdH!BJ^_4fjKao#P6eGXVSqfM@p#H~_pw+?&E1xA)BLpCjtpgo^f#z`E2p^&=VH<@yob=rF%{wiJDr%ibOoQanA#oy_Htv|3-j(aNhHXI4)%mXH==!U-|q zgxDS@#J;U0M02UexNuY4pM;uld}4nQ-Y@>5{qa5fVxf>(e0kcwk+~r394EwtlK=pJ Y0Di@&BSEEnZ2$lO07*qoM6N<$f^^)qumAu6 literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMduK)l42QowGx7R$X8B>f4TA*N=sICMVuC6?O0T-ts&! z@p+_-Pjb-&wX8=6tX99ZZz`Spb?5)Qzu&&T>Ec`8lpek#ac=DE$um~$UccE*xTV*O z*U5N#=&a0%g%2_W3WLr@M`k_^wHA5meQ(>9SvQQsKjt>P`)h7@;%1~5uYb&+BB$3k zvwOB`9u4n$=5+VfBLkga!~5@<+A2z=_Un8)^KjF$v$AZnjW$Z|aLH`){Pu0jy?v+N hZ_r-2@6?Z{a*X#_Oajx|(rZCUz|+;wWt~$(697zW`3wL6 diff --git a/App/Resources/Assets.xcassets/Template Images/cog.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/cog.imageset/Contents.json index 43f9a8c70..92f62dc87 100644 --- a/App/Resources/Assets.xcassets/Template Images/cog.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/cog.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "cog@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "cog@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "cog@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/cog.imageset/cog@1x.png b/App/Resources/Assets.xcassets/Template Images/cog.imageset/cog@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..025874d8d481d49120f293fccec7f27dae602bd2 GIT binary patch literal 563 zcmV-30?hr1P)8o>j&&<6Gh zD$_;jT{u90vhiE`abr#i2y>scYNd{d6GEi@E^z1zpy+)BqFVdj3VM_y@!D=*#YZ7gOUFyzSDvhts8qTdz>jmTqY5K{j*`|7OUFn%M!%zE zKATkndthcBcc9I)(gA1yjI@qtUzc4*(k8(5v}lc8wBw@6M68Zxcj_16j0&?9(WRpb z8e;)qT0pKBZHlO;zEx(izCRn8j!K%ru83(;L^WSVWJY&&z5(z~(sP)dA?dPnWCpVh zo~y%S#^E-QY-C_nmWbfB9YoedFE$D63BXsP2_pGZ1FIeMVea2}ezqVHnF5#q_%@FR z)a1Ih=G8Gi-<006~!8|wf7010qNS#tmY2VVdH2VVi|cEuI|00VqUL_t(& zf$dt|joUB`7K;LXDbQ??jBo?ogGX?m`g$XH1dremvcY)--vr4B?o%G?hay0c2Ni1N zf?+6;l9jtOH~|9g6pB9*`B9<_)>?BM)JkLKUfsGuBT{xx6?Xso@qaWoYmhPKfvo-}K)2D*<@S=G zutI;oSZl{X%)0RxG_)zG!#ixpS}qiqg>Xe&Y>hD!3iQs6Gr^AIq7(RT2|dTp$(aFU z@^i#^iwS)aAb+>_G*me;(3u6Wo{!66Lqz5z~@KwrMovcsvBp} zgeDcu;!8V;?UCd65koitxCvj-(6l5a0KnQ9^A!y}TYqc6FJOsJA8VF^*&*zwZDvfk zIQS6=b~oN+^6fA$t;{-<2Z=^-8`iGgpUl zmOq+^h{xPiodJ&w4K*z4et|p{oD*YIlM7q)6hLCeDZLKRt%*^Gghd*;yr?qBGh7j) zc)$ItB!3qCDDXW~G(v|@2&&ty#(!&tL0G|~GA>S%3z3`{-I=*-?n9}$=$Df2r-Ejm zs)xp)m4XJhPfEJa3L1Pp*XfZML%lMFB;?A9A*WAv4Ea;{L==5(l%psADGTKa=Ank6 zp?T<=z&A-33DxFRQJuX4Cxw&Wy%Y1>vyyMicz+AKQ{3c{7?X5`5NZO+#vs15K*{DM z4g~O|C8zB}z>tIFX2MQI!Q|{o(%*-62mwI_m5~Mj4dT}=e>9N1wB7?N^V>eooHpYUAS9hm63+E)*?(keJ9SX@z>p2d_av!?k_-lyG~iC&|=H zqrMe%Io0bn6K~?BElH1}%r3uEsLAiNG&rUzG`^)l_w^--O?zs*{cnAcQ4b`4;p34i hpXB!Y`b5(h^Ba|NMtJh9Yy1EJ002ovPDHLkV1ji8%jf_A literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83g!*xc>kDAIKyg=-*vX4OA^q z666=mkZ|Guf`$(Y4h9DvYzQb2SiJs~0RsbLkf)1dNX4zEVHf+3C~!>Cx^^k*|Nngd z*t0XX%`V6``(E(5MMyx>;p~1!-E9eqi`zHL`sE%LOISN``?bqiVOmX>)SfUisq76D z-k-8Xv0QF@@r8Q=D%E#a7EEbf{8lbvH#)*vHW{qmP@ELHv6 zf38tV%kqzZ+Ev%p|MyGabHB43K8s%*Ioh7-vN!EVc(H!cJ71rOzdG|PO~1UqJl}Ty r=k?bA1UtJ7ekNc1-@B|X@$(PH^^W}dza3;RgW}24)z4*}Q$iB}KiCR?!iHFbsY1{Ff0Jp>EO<7zrm(H(&%tU<5~SgLu)1 zSPHZhxbu8>`DkqV(%6?k%#1Ct+k|CJA|kRxWLk%mZfOHh$k71q0P?5LB>^B=G`exh zYEOL8iMhP}d*`~j1ncso8I7TG;)Ud_%PTV%-qJ}1nu&=m=g>{s-<{31uN_BoU2~0La9Wi6;N}*K4f0zOUyUsCbb;>3zZuV(wka9_nyY`$fV$jQ)00000NkvXXu0mjf$7+{> literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/compose.imageset/compose@2x.png b/App/Resources/Assets.xcassets/Template Images/compose.imageset/compose@2x.png index 26c5f9c843f2a8a450f0ebeda6607a4c50e7d5ca..99295da20bdc9e22c4be983eda6c8245901dbfc4 100644 GIT binary patch delta 583 zcmV-N0=WIn0@VbN8Gi-<006~!8|wf7010qNS#tmY2VnpJ2Vnt~!??Bp00IX|L_t(& zf$f^naf2`nhNWKL%Lr^xHYlB-9U&uRgpAN^KsU$+WrU1CHy{(Jr#q$RI$)e&3zPc4 z(_H{#`?CbGWsr#Ap7d~6G#O|GdR$|t5wQS(jT|;a)Ss`d4u42sS^#*KQ#Am*|6X6y zTW$b`bt0nTd~lP85U~!>zmAByE7}}_VSW5LVh{P4#O#r831l4im1o<wN}GKyXm zr2yjul6U*LB7X)eQiox4O?@ik_rd%(j-{KP8B4x%xw$WZNrixcR3@jPU?2sckT9?` zP-qxf5-0`?ECmz`29^Mt1A~Yao2!f}&|Da~w{=0O0R;#%p1C}Uy^j^r^iUJynX#n; zgoxbfH|un87|;Mh#PVX946u&@14>z+M&cf1VYnfpHh)%QQ9Xo+{P4cW;a+kG(O^Kq zL$!uiOhxq&5p9X6)PjMWtY3jLQ0mG+sVf7eu73q&W=fsQUL~1*7|-H5a?F*LTUOb1 z80kxC^<{LUY^tKpsN|@Xu%AfYcdqizO=HYVI)jF7$Q zwWRGP`#|gI_KmgqrER^esV4jC{hfmG^+qjmt)X7RyYbzh%Ac2|t_+mA?h6P2egK|` VjBGtlq!0iA002ovPDHLkV1kjB5vKqE literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83*`;xc>kDAIKyLd~ERH0csE| z3GxeOFlZQ!_&nvq=ND7`Np(k4k9iOZ=OASGH=t# z`QPhrJ>p{B)f_gFS;DTTZtM1-*Ftigq6yj4UZ$KiU&(X%d#z{cj0snQBA*4$tDKS^ zl>1OJlTqw)2K%Z^p-Q#wkEFxyUwAA(ooEtv6)X;tQx27_L^f*o$^ zA=hILw@*55b<>Nb6Mw<&;$VclY6TG diff --git a/App/Resources/Assets.xcassets/Template Images/compose.imageset/compose@3x.png b/App/Resources/Assets.xcassets/Template Images/compose.imageset/compose@3x.png index d650da3b66a8352c272f4b24f1844b836d21fd2e..6470942db629e7ac5f395c324c2427a600bffd9f 100644 GIT binary patch delta 829 zcmZ3;e3ET~WIY=L14G{`1z8})S>O>_%)r1c1j3A$?$-TbU|{;~>EaktG3V`^hq<>6 z1l;y(|FXZg;4RBHj#DgW*?i4ja@<|;j_nl7TaJ?~rDg@{JDNC}SDBn(x7kS1VB?-@*-{gcnV(NGy zcOaj^{%-vLpI@rWTJ; zlbko>r^QzV&P#HOcw4#)gM}E%AKjD9diZ2XDeI>?z5Cx6@1I+6>74k(rLDZd@y@d% zVh(wRcF)%GRq>l>QXd$qt9W+ln%@>mum1EV_M|gZi*LE?{8?p_bo-IEg!v^K&ioJ4 zS?0@k$$LqVs_yPpeRFPj-j1EUC8ls=bl+<2OrgSuob%U(&hqw*)w{3E;mN&ds>Uq= z7mv5AkL?Qd-a7B*8C~A&H&65xd9#JLPcd2Jd1un44Pu4f-iM`*T%FKXf9>eiNo~`P zUY*hwcJ%7BHnF3b6WXpFIjeZK*H9?%eem=@hmV{q3a?H{nYM7@^>t4SCDd+$ z?bxfAZ2Ea@^Yi~~>s}$gTyhtvZ(uUe1g^z$LP+_YhOG+xXgav zl&_+jMO~virNb_|n+pdmHqj9Ie)agK=(K&>hJ^)sA)%r7qgK_${cbzUCv+S~d zqndl$9oHSomQi(&$$7J1KC*Oi?5(^vRg?H9S?aF3nL7R8l8toSUCXI3uE*R!@i zuD51h{+%@2?Q;{G;=42VeO;wJ&HR1U)rk>-zrRWbUrO}K(G$$c-n+qd)-O%&8rR;# zs%Bz!t^s=PX?oWRZf0L-iBOM+Bu=OoCNn(HUpM7~*V>PvZ-F_4!PC{xWt~$(695-~ Bgk1mt literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMduK)l42Qo*{^9{j%$AaG#8hk^+k8mywP<}ffY@_4#9hE&{od;RpP76XBnhkoj1?-sxR zzeV^^!ofLnH7&YN?iaQ9P+YO;_TMzWtCu$v+|W?tn$}&ribwZW?9+@77E(5C*Cu7P zZ(n68$y&j}E9c&P{NjT`lL`^uxTK5^j~2E4+VjYB){8w$M0jO9C$}6HGP#~p5@5<5 zvNmArjP2XDuKl}MEoN=dR==x7$yq@wXU#V+X=;0_*u%q znQh5>F*~Syt^MUYdv5Mq6*+I|x8*nX+MKNqTt6jsX;JXgph&&%hu6$qFfCYp_ucc~ Y+5SwB_^1&Sbp#a3p00i_>zopr0GXMl&Hw-a diff --git a/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/Contents.json index 809208a63..4a4107746 100644 --- a/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "list_icon-filled@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "list_icon-filled@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "list_icon-filled@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/list_icon-filled@1x.png b/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/list_icon-filled@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e58f4858b4b775ae28f1cacc6e7a90fa8e418e3c GIT binary patch literal 403 zcmV;E0c`$>P)4RoiXDFbw1c`HwefM$iZzp(D5xG$UjLjo=YFLPqcg zRX1=aV8P~O$cAbskevV}AixrjK8oT4sw$6=-9uQON(A7zDG>k%Ac)8(00rPnehi=* z?PD^KK8a%K)(IfjpU z<7R=xymrJo?rqcLhKg#vOz3)5^~9doN!-Z6By^?-(_&p~J#X;Ydrdp^-wBsBld5Oyyn*$He7^ xG4Vm{xnxYFMYvS3RWiRe9}`CQpT~rV`~Z}^5*)8Ot$F|e002ovPDHLkV1nxJvMm4r literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/list_icon-filled@2x.png b/App/Resources/Assets.xcassets/Template Images/forum-list-filled.imageset/list_icon-filled@2x.png index ea2d4953ed59968f6dadb01fba11f31d74c0a7f0..d02fb87e041ce5a9c6e7b6d0c2e8bcd04a56d18c 100644 GIT binary patch delta 512 zcmV+b0{{Kz0geQa7=H)`0002RcpK{g000SaNLh0L00&UPBz0005NNkl#g2VCgoyd$O<4v`hY+zq#D4}6xlw)dv;SU1?GZOt zDFATgpFDE1>8&9Eko(p#ZVG(_z5@2*oro$qh=>^gyiMHSmWW!%J5K=cIT*eWQE9xv z5}jrwIyY&A9xqx4>iVRz*mQQxH!{WMQ1IeHuUx>Ho0MXsT=P0<|6Nf)#Hp#mSh84T zgU>#jUgf}@Lw`in%rL?@PczUBRDCx68Y45#Q2n4YbY1!k6@d$T%jeP}oa$Vy!_|jQ zBhDPR>O*7VoWK#Vq+h*uWd18k!DGk%9O8Qv(}(^(6+K4j0|5Lmec)%x^x?c&S>Av? z901@jaetLQ7;`Pk!HWw$r4Jq?M<0ggXdC*_>sAY-n|V<|=boWFMfz||l|INatn^`R zD1C?>yQ2^7Ug(4I-`PsNDC?_l7F^{brVrd$KL*23LmzBcDp$ss*CdN_@Zv&G>4OL9 z(gz}{J@b@4_+$(E&?$Wok&-D?DScQON*|&I0Q>>|m0={zG(3+00000na**Z=?j1DW{2aW%VCpbDOn zAirRSfD8W{CJ1aeP@u3NzINYNpm>_6i(^OyW3t3ChZ8qE7G^%*Cace#0nY@Y3Tlc_n?nH5G upH&Pw;&S3je_Rbr*zAJblv7QB1S`Wa(Lg=t#ia=#w|ctzxvXKl{;<%K@5h!KcdgxAh|)PQz4N)Il>+xxdBJmj+PTd zh?0sUa0HG(x^#{#c_s4_kFZl9ELk)5?CkI7SY}2EdMJW&+dz^kNef9PX)UR~Dv}pN z6vV;8Z lE$^UPBz0004qNkllt2iCGFTWa5Ih9h`Oe+>QaN?kZI)gAoi3Ny zO7fB|>xr4s5}ul3V}vSz5z-DLq#a2@M6@TOiHIB#ak!5DxqoU-{$O1jfWZ%K*dY07 zu!~M1WZ*p`7O%`a|5czR5Rngb2Vi05QJf@XXNof80QBK`AMVd%<9}rYzz)E?S}`Ya zuHYR1biW$wW3qzpcx9>P*hQcKye0e&IfT9)644UJGxpsrHmu%#O!yw}&CsDxhEl=G z%251M?(7uE6o1)6;rr`7G)eRBsd6vOy!=M>%0*P=W@es5w?s6mJ%_eZ+=b=mqUGoB zJFR5IC09GF+t!YUln)%)Wb&bOmD4I8h-eqOm1gC`oOQ68e8}H-CLc0_)s%b?zb{oe zUqwEy6rE21`&Q(GYehaRCLapGx^3-vDEZKve9&0sltIgfA#~n9mJf@`2a^vbA8yW2 ylk&kkKW`MBD&>Pqq`7+eu$X)(2S8)5S5Qf-za*n8S%19t^vAx;Jjz$XTYDn5^J% zRqUAKmi-NaFc8Jxa{@+S0~vu0=mt818^{Pcfo>q9=mw0y z24`wo0<=_6${)s;Tmr`(zuqw=01AlL$4Ad-0`h*pY~_PT5>kTXY7^#}by z4ycaEs9KPSXwZ2O(2OL`@jvW|(7SG#tw>uVA}8Zhc6HD6*CNs$J3n@>1MmbhZ=(hW Sp230u0000K}2gJs??<{N8P@@qurT^O7D0A2-S`t?-6Q_!Y7^(L+&lWHQMZa zI{)7)2Ve`JmYaGqq{tk{{@?Rh8M#+pvfGxKi@nO0w@@T9 z4N9tTHE;?6D1V7)^N7ei_>x<|h*d~BeMTnJU>$m{42`ZVGqAA@J)@AkTZMjLhNd*V zQ=%5ZDwOb$CjL1&KB z(Rs+~8CuT}kT0+8{wWAiyD+3O!Anl)Miz>lEEGFgD1COaQ0!!(*vUe%lf2MrrZ{}K zFmv7X?+7uo+9tUy$wuGWF%7xFJ(!5N=xcL5A<5E*BUAdY9LngU+W)8(A7=h-pR|6B zCG+$`TU9wRbD_1{Iu`aH)xKh8;|@gryexLIQ0$~7L_~kS@kE-_e%zh_0000{%CD@8a-^ifL_S8K}xrxz<0_sw$)Y)x|VYyITDg)8NJzI3a` cu7^v1GHA5wNXP8xx&aCYPgg&ebxsLQ06KPXt^fc4 diff --git a/App/Resources/Assets.xcassets/Template Images/lepers-filled.imageset/lepers_filled@3x.png b/App/Resources/Assets.xcassets/Template Images/lepers-filled.imageset/lepers_filled@3x.png index a39475003e6e70456e5986a62eb13899e84798db..aca96b63050aa994890848943862465b93ed005d 100644 GIT binary patch literal 793 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT&H|6fVg?3oArNM~bhqvg0|V1( zPZ!6KiaBrRJj}gqAmCORt8i1{9gC;=2M$R^<%*V`1%h*UjhxI@n0wedzU5q};K1tY z5_J5$i0;Yz%wLXA@Z0lT*!9*Fmrz;F=j?M617tXkHX?{KZgVMlUP?Xsm1~|FH`)J_>yhvSu_p~z zX-%|P%4@s&RZ496)JjC%f)1lH--qBPv1Cos?^)P5pz1;9KMlNpSeaXB>R19 z`I)~g<%g#gemmQ)e1EBKh>XtqSzB1Uo1Z9N`m-fdkMnv@ut}`8)bY*}lZ)S#FWWyS z=g(D*bNZpS5w{|$!efuj{mgXc=ggy>9rIV%oB1sY>=rcV_!l172?e-?`t2FhQb{O0vB zt#@Io*Q(F_A91wuHvhHFYc@RUTP5|EQ!BDCaazK(Z9#HP?7M;f|J>{Sy0hv;=WV}R zbDj!(o$%(d*gbP!IrXSQr9)Z2`)BlDS-NY5eY}*x2ggFQGmmbq|2NZ|Szfd7;>Odw z#vcyWe{$5|YkA~A5)t&sZ*zWSG@D(}BfGFECA=WUz4ZBBK#@g{4(+xv->>Edzq`$;yHq)$ literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMdu0ENCKqg7xX??^~pay}G zAirRS1s6657$i6xXn61;Kw&~b-{BVl3=E9yo-U3d6>)E`NB138;Ay+a_@==3)BF0Z zie$K5-nPl%=g&R3RW8Ei7bj}p%3Z$B=i!^V-N6<$Z0UAY zH;(G&6?RA8c~rsm{K%vAk8UkHBWz**HavP=uj*@y@U3D;P0sCHRbRL|o^8qwm95+U QEdhnEr>mdKI;Vst09Kcu>Hq)$ diff --git a/App/Resources/Assets.xcassets/Template Images/lepers.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/lepers.imageset/Contents.json index d0d77e979..2d137b390 100644 --- a/App/Resources/Assets.xcassets/Template Images/lepers.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/lepers.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "lepers_icon@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "lepers_icon@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "lepers_icon@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@1x.png b/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..1975339228eb0bd4bd215967fcd662a7ccaef801 GIT binary patch literal 441 zcmV;q0Y?6bP)KmfuaoKn%ve5AjYnXg44mBqMYK+6_8Fc;k@?P}u-B zC>w+g(hZ8lyU`b%aJkUx)IWKurIUKD7KO%uvQQUeI0Yx54^9>9j=B(&*)NUmClnJtoDa$l6q62P68 zbO`dUQdvHagtXbIB98!alAWJ0qtYWe8WO-W1ZXw!3v{AB~s1*G;@GT!NZ1zka!p|23s%n!-ua}h{p zeiJl@K=&0yQi@!sw_nfj{WiLj6y?;XK9txt_iS_t)?Mk$tnlM~7d*U;_VB&*vBb8z jI2%YWqf5&;?G4}ui8S&`9ieW#00000NkvXXu0mjf%Iv~} literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@2x.png b/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@2x.png index fc24b5095858b3e45cd9f335734fb4e42b5cc7e6..4a3f4232d6bfcc66122eac565c7de3970567d2d6 100644 GIT binary patch delta 719 zcmV;=0xLzgo}ftc8V9VMLi90D=-|77@B7eYz={3Frgp=78>oz9BPzA%CK;L{$6?>4>%?qP>Vb z4>kdpLBOhKcRqF=zFq>fgf% zD@;7*Q3tjf1qhRTjX>1G1_0$X5#y{PaLxeps{z5P{)hf?lWqyiD3EvU&xp6OL4lmr zVXa_zby#P8u7CAgC#cqah?x_F(@b?A21~PXxzBh}|NX_xS=*p48*A>tY_QO;Ef;EY z&v>m+jX=!o7V9?+BOOwQoSElm17XmE>iRtET6x&LvkcaeI*}iwE`4W+}=Ow+isz8Xzh3X0}JOk1RtCFmI z59t@O1G0;CpoI>*CLk+`pe7jlr25N^)(6r%@OIp3o-J+g(h)w8-h1}8=3kRu4&{Cn zeNwQN-G2ho9;yQ|vtB=^$W6>E<{_)utyNRy)Vd}h>zaV9YXY*a3COzs8=xf8Z(b#k zSE`!%)f9uO)#O4R(lunO1(M=KM9;5$yY_){_4{{bHdB);1ejda4oL%5j`dy53lPPt z_#-o?7@%Ltb?qVXUJiW?b!~#$L56x z&AsvKWvHa42!&u)8CiR@Xo-6IzMOSUK&C}Re*tgKqpqHN0xAFi002ovPDHLkV1oL$ BR%HMH literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83*`;xcX!k0+}R%r}Ys}ff@u# zg8YIR1RN9s4t!`xc(9x<62!nOb2-10S+`63~k<~()sZu}~+e04=;kce(O+aU>o%X5A# zNKj_U;9$rMmiTid;J=SThUTk4dC`|^JugY$ex9oDdxpn%$}AJtmvgILJQR6(;duAK zJ7-y6X+1W+H7jw4%K_iqcs=oiMuj=zGST~8>U!EXCPyeG%v~!wv4gE8a0$39 zYR9X_vWXFU854Vzb}LPK@3LUyjbw?7c`DWi?cWNsTIeOrY&oa{3R6#4KbLh*2~7Zj Cl$I_4 diff --git a/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@3x.png b/App/Resources/Assets.xcassets/Template Images/lepers.imageset/lepers_icon@3x.png index 4ff6827dfec56ecb154aa8de94823818aa19e8f3..1ecf5ac21b18066a21554f36c92fd53e2a9a3be4 100644 GIT binary patch delta 1023 zcmZ3)(#0`BvYw5BfuV1ef-I2YEbxddW?kWF6QSGGB7MO|>-cI^Wq1;z`RXPn$^wCna6iOSTqWwDdepMQLQ%`FqpM!{Q*n-{(J>u{1jjj5+pq28 z4^W+S@L8co1~0?vTOYeWUNvS2*}7Q9DP#Sk9z#DrMuzVU2K$pPx-(QTH_Y9-ZCBFH z#5p_k_!(v_)DfTX_Th>TRh#`DzgqL)|Dkz|53Wo$_;2y>tF_<_&tTJIA`zK+#WvS| z=^R+LXU$yugy5E_`uZ6`-!^Y8n=arqM>~Dy>kr;(W^bH)yEGQ_q?9y1E!cEx>Q0H+ z;G+sjj5|(=_iS49i0OL&-^+e;UVm5P`~Nyu^xxxI;ZBt&A7$N-efag(tIg6OGG^lE zGIsjugzNC_-=B76<*#!G6!$$fI(Ek3fa>G($2(S+cNVHB3yDwsR=#A>iu$U~r>foE z9=~}RZeKB~PU`;pS@7iKlsVEI8kyDEYiHNj@~EgCW51T~|L3mIibStR#JubkHrJbB_b*X}*)J;q$#GTZ94rt$|*{>FOkx5J!U zg}0Svj?(0v@4v4=#tuSPH<=yze{_&O!sMT=i*0uKR9(>?pge}H!Y_5&T>V&ITf0P|2Q7q zZ@a@)cSk(VLehLz=mgu#Qrp)tib0cLJunR-B}cqWnZmW%iN7{`K1)vQe(U^J(rDUakz3vkn+*@FJ;m*n zoSWA0>DR4$={oMBx3?;#rnlOCcb9s#V#n`ED*1vf`LotAaSJRzwf}8r(6->qwGFK= qeD?{6s=FNJ3@mgCnZv^HgC%%o&Bdtq6Y79@oWax8&t;ucLK6V7tm}*b literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMdu0ENCKqg7xX??^~pay}G zAirP+gM zzOvoZ5`tTvEq%DpQZfD8xzhKJn6 zH4zpkd)`ET<#r1?#waq!g-ieZ))}uXI@ev$+9Aci(@|8sLjSY>tp8U;LJHs6)JvX~ zx>EGUb=RdUN1|+x&)feWNr>x?lLzOt=)HU8^4+3R zckRw?MOSCfx$;$ z1yh6hb8X9WA1--2D?Z3t{M6OxjOSZEe7f_~&2OG2%eg}p!s<0={Pb;O?zHyIuC}OA zd>(Hg`=#JvzUB9AcOI~r?>HF9FCO>TH_ggoYRhEp>t|NZIN#i!-uw8C%r4`KACvwx z96ui4r}b4We%iZhN}~1tB}W8O6w|FYNd7B#vt#)DIGru)dw(k^nmt|pT-G@yGywpJ Cvg2z2 diff --git a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/Contents.json index 1601dd85c..45b8c8465 100644 --- a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/Contents.json @@ -1,22 +1,23 @@ { "images" : [ { + "filename" : "page_settings@1x.png", "idiom" : "universal", "scale" : "1x" }, { + "filename" : "page_settings@2x.png", "idiom" : "universal", - "filename" : "page-settings@2x.png", "scale" : "2x" }, { + "filename" : "page_settings@3x.png", "idiom" : "universal", - "filename" : "page-settings@3x.png", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@2x.png b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@2x.png deleted file mode 100644 index 17ced86ce25502e647f8e1405931ca635aed2a0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~$p!d?xcX!k0-3mg*Pg$oKsnBm zAirRS2_Fm`7FJS>mJPyYGO|2<%7?<;3n6~47L z>JuV#*{Zicd%hvS;qW%AL!DDho6R4$^>^*=p0<}q;#&;gf{^frdF;N5T1u=t<3hES z4#Z2h`+T$8*L@>>4wvcLs=a^wv#pfA-uabh2 bfgTe~DWM4fMnhNx diff --git a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@3x.png b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page-settings@3x.png deleted file mode 100644 index 38232f5529a456fc64acb85f801bb4ea5c55a8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn#sNMdu0ENCKqg7xX??^~pa#K` zAirP+hXoJ*A1Dx*U~nN}!v}?ifF`AR&lwmPJ3L(+Ln;{GUcY#5t^o&oLB_(+?Cksh zGtK!srQNUc?71=h$L=po|EDZb+EcgdI=Ax@(d9gO8e5M%(6yK#xK=yCeDaJL zJ11>;?j59H5;0ZdZ`y{;`3|DnuQi`JY}}@GmUCr#&v(x0S27maY&vk>voYv}Ia~Kr zg-(??zlXk-EWIzID!0klN9)B*f4#uh{GrqwP4@h3qug#c?Z3Me)*C#$dsFFT<*X_1 z56iCJ7=G|qMQ~}$WNlZbG8dnTZ^XM^Y%y+hUccn5q>a?&_$;RNhoUzwJjfgsIQ{(p zS5qhV*s-x}x49sHF}k2<3D1MT7q_R#-t-7bo9A&RVd~P$5eZkDu6XY|Ym)PJVNT3h ziM;QLva6G2GPm2DTKwwAB$0qeXOFW?51#Zy;UiP}Df>K&ir7Bhr+R6E^K`H0J@Q>p znt9D(*$uv3nh6WHYwj(Pd{OH4KIU28>lL59)_?Ft y$tUXVgGsOc*&kTU8||p~V3FR&OAo$Q-TlqFNJh+3OC&W96vLjbelF{r5}E*(x8VK& diff --git a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@1x.png b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5845ef86f2e602562bdf5dbf376bc20f675a6e8 GIT binary patch literal 444 zcmV;t0Ym4R?AJqKn#5kQ9wE%2kxWYCrLI)`! zB`kLiDIru~WXU52XCR-6770s^BF|)=J@47O6cL=mF3y7Tr$8hNk}b)Rq?mUks~n(j z94QEZ9>5KNR{#S5jn%g0RzyylkQ695fL23#u#0OoqXNhAHSR0Y!+H@pOiCw@0G#7YzHym~WiWJs69)=u{iRxk_S%wNX_fCA?9z)fpMqwNd$xS)eq1PGl7rggkN^-Ok zB=A?8aGFR=jypMn}boqz>e}IG&mewav68mL@(C zp8$!-Gs!tQUjulFdd{21Km5Tt9F2)_RU1d`qK2I_>zzBDD&CJhfr*%d+ma{aO{LTSz!&GyCjsVuy>rK_HU^W064-j8FIPlp50jl#pcj~5PPJp^8 zv^QT6SdV!SsajB+5>fY$J7#XI#es<2Dt(o&j{trqC@+<@W9Ui0KIOs7{+~E36hEXL zE%*LN(x)V%b*z&~`Vi4-puFkc_&0#30b@h4Go^h`+SFs|SJ8c$3(FmpDlk=k(R;78 zYfdmRK$?D|o6=FV8e^vW$pNvSt*Vfs_VhKcYRVQhNr=eFnQ!XnU!n-wm2_I}w)6jA zrvsU}K92`RgmGUS2GomYZgpTzIR$FtQPe&qzSz5vDdluXaoea`Q<Ks( zSc^;9YIUfei4 zJP#sht1SUYpKA2FNdo5CO82t^;`c``t)ebfAGc?GO1xKjF9m27InE5J@Th~k2%ruq ztDDqV--#9jq*Ch`c*(29S~fdLS(zjvZwm3mN12pY*C+S50?Iuu3lM;R)F3UPY^P6c P00000NkvXXu0mjfObB3- literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@3x.png b/App/Resources/Assets.xcassets/Template Images/page-settings.imageset/page_settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a88848d99d6113cf348524fb2e1c77868694054 GIT binary patch literal 1199 zcmV;g1W@~lP)F?ga4$^$6|;>IU7Q?grie}$oqUkB7%Z=yepj9P>3_45NAXo&WJ*s z5rsG-3UNlfPrV=_&H!N1dDIe7bM1}X8c70RL|g(u1pw~nQ{d0`0I&ssnurdMOo|GQ zIO|}dc5a!-;Ru|K`R;ptNw8A=v zsS+o7&&KqnVe)!U?IR79b3nv70Q~kIp8#M^M6Ja{AfmH*KfT9CBAQ#)yEU{a*H`J8 zl{ENgTb&bm^&USV;vz8Rp`ayh>3u#W@`4-T*($-hSBEwndGJahdg(;N_ zPi};R^#BYK#{sX8l(}Z(#f2`{{g!b3UO4+rMC;gjnyV_=oGDd1d^4nihB(OqWa0Ug zFgdtE;sUia>H1oca;;b#Ih%=wHjZmO1HLDs(P2X%KKwyM)!4PK4Q)8G^FBZGrpH1e z$p5Z~gqAod{E%WWHP~BAfpwBl=jw>aFO%k$Opw3cc8W=Us3a6!#pRlwwAOrb#PNok zz=qe#`Ln=Db7PYWX%^x_1GML3EC!{l#b_8P}9<*`sFTJwqdz2ADI6 zWv3l@M$5*(;i~T>P{h+l6q%P1g*YP$aYiH;7TyyaoS&Ujw?NwP*d^2Ece$iol4fp`pa?4UbyfPjT!@ntMWcm{oPO;U-*o{~ zuF5@!S`i;z3;TrcgVkP4sOqCwPu%*Bq=8kMrCm#-L$(rkPiaoYTxA;^BtM%*rzjDJA_Edr*1nOyW2xO-l00rclRIrCzy&BU0r;iov3Qh?U?) zRc0ugvJ#sH-;>9egWlGgv19Ow`=|+Za%$E{BIoUhSC}O2%d0v*%)!QW?2%MYi>jp! z)b#Z0WJcVwr-!f}O8VJ5hnhO-k`m?Eb6|u168QD0^J;sybbfxdJ(TVIBBHpL?{YeE z-pR3cx6IY!Y_Frsr( zwI`{MKR?!iHFbsY1{Fe=61KB`EUX`D0xZVgF?)V7+6GMnI+NE4-ioXAQ_vOnHxUYEeXcxaEx(CU4c=sU%C0C4rIZS6eC0K!GU}uJI zJptfE)$9af=zo^1qq5Xjkw9t=t^b#C-I96Fj+#ankiN*3iCeeTS?#}$Zr*MS5R$9N zac;H5oxsy#wThu^asXng)=_ISwZg;h+cpU@bO5>aOM+1>=`NFjv z#|9$ZvV~fXZy|Di8VJ?==^Q7Gpih_P*DnuAxT^qhSN1?tq&oI!QL_m&B!RHhvS!P@ zM?SApX6LFrUU(T!CHYFSe2v9j1&F%}5NiRzAJEm?VQH}My8r+H07*qoM6N<$f*zva AJOBUy literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83*`;xc>kDAIKyLd~ERH0csE| z3GxeO2)OXSLE%Gzfxw0d4;&68EI50wXCF}Vl&6bhNCo5Dsl41R3Oo+Ems6w4{{O!& zXI5sYm&3`<{^N&QJinTexkQWs`MI3-#_NHLVc6ePv4&ZQsE&%)@*@t6DG~t z7^5!0Fm;Jt-O(2kU;HXGPrAN{xKw}XQfbe(ss!a653OZvcc-YBO%J*>v9p2K^EgX> zrN2C8do zeXLlTOgFb(R!8HExGi^~$XlJq6l-^}6`nm!4_uEc>!+``f)0eFs# zQKp`)HZP5jHrl0*#LUz8u*}f0ZSNLxy)TSMX}WBXUVnR^SNhUrMtBi7OWgg2$@9QW z(${tvgGt=n(|1ml8ASA&=yxY^b4*|KU>98e>@03B>67<;P4utPqBm!My@{K0`l4lq z_Ny)2XRqQ)I=UMvebISlpvC4$)NtrQOaV6<%A_70PU#Z%0sGEhViOWjMRUfu0 zvPlVd-O7wvh|5l2NgHW~;)$zqUG+uM!OZ(EJ7MMxGs{7Et8sT#tqamJ&^H-4GdCq0 zs<4Be_g;qUVw|6~-dK@=|7GTrmJc7!xnt-bRe$hKmw>9@zgJt_h2Q#-6G8Il-_>hU z`Twffxe!wkcTcsCU@o}n#t6h2fjA=&X9VJmK%9|~xL^Ugay%z^Bq>eaBS}hIy}Q#P z>>{$pg~u)9|u17d8*ZBY2m7m2PP@(ZVr1Gk#o{kyZO)Nmkh_8^okC6r7N&4c{Jyx zLDzn+j@QYiTaw=;>|@&@y!5TeW3PtCA36Sp^e~(Ka?Cg9;;6O}t1#Ydt02!GA0K`| zKtZQk?a^$vmyACvb{rEES(kH`rHeh=J@)bI=M^dY>?#jDdzo!eW~0!nQSkH}bC6Bm zn{^Ku70W*+ysbJAKR_$%XAPlvu4satdLN@4)kP*5;86hL28{7tEgzE+! zAtPi1SEkP=heLO1g6>CEODF{Jdl-KJiwHeJo*u&TCyAcR0cJk702YyRIY0=Aj)-O* zYSa{~GyEKN%zPlC3Ea{3w@M(Q5xPM{X0s;3ilgmdZ&NH_M*X*7I8@KIjgK<+BI8SeTYmIJS4FiZBBICBBN8qAQ!XtlWfhSLfKR^*`X4DPL)ZdRlPfIegG>B3 zD5yRkyUR5JYcz`9!2h|^pcj1KMI>f?{|dtG`ilJ6BU&L&{xkenzz4hZ1E2&@Zx&p-r2ujOZ|v?j z5oI^M#ptBM3#B%!dp7G_t}%6noakJK2E%mLE~m?mE$f&C43sgQt#b|;V~B;K*?g9a zFqhV&QV89gK!3)VEL81YZDO*?#jA9!$U7y2NJ-n|%W~R^+|^A<05FNwa;I@DP~VCj zVG5tNM}f45boEobAxP|~D~r)UY?$Q(yT$jk0nAA(^u0q9P3uEIVt@T|Uwn^*am~|w;D5^j(Le?o z0W&$1E)Fyxs`iPp&ZuWPV;vwCHgXkj?Yu}tzq1mqqpOisfoR@I(WHd3IuLtC=Bl}r zQJI|bHv?kN%5B=^;nmt}-V8Pe=-7gXZvScv9&Ib-ar0@DKo|Bq*fRy8jcdLG;^)^z zh@)gR6?N>=?U}nsg|SGpjaItv)$A6g5z9dAOxxB2-TLt*9CNXM-qX5~c^B{hB%;ze zLTseGhZ2D_wUG6##Hphq-n-SlX)yTllAVOf&f(TuLqy)tKfcBa-43A8?Enhe0Q>?c WD>2pLmjDj{0000 literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~83g!*xc>kDAIKyg=-*vX4OA^q z666=m5OCpt!-oO|gAD=>6AmOiXqG>+87TMK)5S5Q;?~=#xBCt&@US)>yc2cn|Nq-l zS49Z=2CezBa`hbZB|Ln|EqAACTYqE>Zi=7TVHqgN|1D!J!=z2K)zlj|=rla>@jS4J zaYAkY<2A2yGvb??PP*_hx2QB1B(^NrcHU$4hDL$^ogWWbmk2jhTk90FPq@vXd(`=6 zx>p3Bfm79)9miclzp||isJhqjE+cr`gm*tAX14!3$oS+`@YDW9^N-3ptyYa)ef8ws z&%bW&YMmc{;~L|VV-fK+`FVURYXUBcd8lSHKbw%W@q66kW$FL_^=6o|gi~U|DKX)cn166eOgJSboDvgGi3z8~ zgi~U|DKX)ce9k!y5yt>91pxm0txJZ~U;_XJ0K5=Ukz5U@m8yyewdTVwys(YqBux@T zn_hunZkg5+?n*^Fl&E;Y3@{?z0>EpahkpRT0swZW8;V+C2moy7mq6urM6~dJ6Y#VF z0PHlqOjeVRCA0^rrbb081rv$aI3aJ=ML2EO~w2~A0Sb{c8pPTK5a>04f@g(IRp z5%EPIB7ffZiioo=dY^dNOfuRbFMD7c+18{=Q<9j@_k2f+NUna@rG%$sHg=KrvModB zoXTWo_T)fBJ0jx7JOvKnDSg|8utnOijf5FbYzy0zU3sp@)xDc1^0HdJq7{#GL@z`< zH*0!eBrA?-o$KTv*D4}m##}_Jm(i}{an51)m26Bzi^|@`giFLK> zan21`NEg`z4mpG^jjwm5&RCeSks+h8Om?GbB?((56=BP&sj%fJ%ve=~8I$BNBbBDQ zYGC4s4bVlMu%*rVPuf*oc<`+VTSgMLWUqJSoNZ(RID{GPJ<@E;~eTGGU}>mN~TyT0JtBeuSTjW!{~HedYc z-!B))4%jP66|W@OOK?rT1n1m|rt)TeE76{n>c%Eou5e_pmU~OqPd(a?8T`Y3BQsNp ztyPtna7s)#B_^B_6HbW^ZicT8Y? zSbOeo?(-eNhhE$}`uoC4&Zc_~;$L@Ftd)Mkdg=8sm-oAvX1z0i{b$9wPX8B2BIcfz z@_gyiq;yKe#mLI=;|g6V&ld+u&X{$olqQt@PR*OPhVQ;^buM?+gbNFwTPqt^o$*&Y zw(rL;Fco5cyH_C2j9~? zj~!mHwRTsZfaI>Jf{z^8zwOQtn3-bZW3#PRiIcgsf$hlS4|#hOjLJVon9Tld@z_ct z{y=Gw+|+bdZ>DSVw(F)#SA`c%QZ(vte|XTsk1hJY$u*1gyNC33*2QYgTK8s^Z+sL- zh+eRkc%ZB5JonD<{S0g4<*w`BJ1wtkBK5yLed7elG==Fe-hiUa)78&qol`;+0LG@q AX8-^I diff --git a/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/Contents.json b/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/Contents.json index 277d02b18..b16657812 100644 --- a/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/Contents.json +++ b/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/Contents.json @@ -5,21 +5,21 @@ "scale" : "1x" }, { - "idiom" : "universal", "filename" : "pull-to-refresh@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "pull-to-refresh@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/pull-to-refresh@2x.png b/App/Resources/Assets.xcassets/Template Images/pull-to-refresh.imageset/pull-to-refresh@2x.png index 673a1ac7988e11eebb58a456088364f28cd551bc..0277672eeaa25c807be0f8a574234417ddd150bf 100644 GIT binary patch literal 2662 zcmbVO2UHW;8jgr7WwC;wD;lCmC}~4W211dRprM2Wu|#*6OkfU4CS-yMqP!6ki+!QyZ@3?{$;02+ay;ps{Zq@yYEIU@|A2o9@Jl?KI>WD_Hl zh^1+`6hhM>6BMdZS|vX0CcF2`py+nvQE7DG@0CPiiGzk_;;ZWwPQ*2RxOn1_)ZvvJB@ZSH2*IX8;8I{y1|U+(@HYB~ zJupP8O-2aP|Bx3$FdUOa_$ z#K&mELzG09QxolM$M*B~B$9a_KQvgRGxQodQxCFjH`ey_)O4Il8!vOWc*AXe6+cNB zeA-T4ouzZPsQCJCd;h$^Eung>a(r1w((ohKcz-Cy;P{l=zA zd_m;4#%G@3%ANOn*2G`0pVGd+zh&=jvlH=;mOEyQdF{4+`H~y;6%x6nKWW_azZ9`0 ztK+Jzkc>xXWG>&%3|?9`R`T@a#PM&=`?XqDRr&Nyt9!PDTf^F1m1?y%zUjHIpE)J6 zq%U_&HBkTbi%mAStnbD;c79pq=g>*74h~=E+Uow?Zn~x4*|d@vWGwRJTGNVyr+nwg zwfEwR9p2`iTJRwVoGP4cb8f3^(F(Dno%OX1?Tf;U<~jQ8xbEotH(LF#T@EjQtnA5uYaZLXFqIZXCAz%vJG%~A=xwL2 zj&57pIwvYD9N!w1?|zp`f3eu3^r_N%o>x}+{H$ej-L8LQ*g_YR^J|{WK0DBMt;yM1 zB&?migqdh7IT}QMsn0z3Lu0C~RQa2N~l%~*CrO;yM5VkKeAzq zK)+I9_b1ZY>JAs7ORQ}pPgk~q9<#89ZP}s<=GXAP*X7*jOo^M=E~e0q!~0@oVg)s| z*|-rce6T$z_$SNl>^0jq@!lD{5d93zCVWRZIswQsE2K+v;v9Ziwa@vA9e>YPJIPKgco1Hf{ zw&X1J|G*3AR4X#Ff$l20{QHMi_%1=D}3e} z-TFSf`)QWt>0MpxQ_4I!efc#rpp1PN9$dJ7T>tUF<2zf9bewlJUZdu3P@`6=O^8diGh&aDcj{wK1xnkfGZ8mob<=O&5`$SNSvm2=Z-I8T(~a$ zna*wRxnF8zd+0B3V^&53ie)Vy2ih)v>~d}`{Y={#>PK(wr~Sx0^xDd$!1O1`4~q&t JJpb#ge*sc&7RCSo literal 561 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 literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/reply.imageset/reply@2x.png b/App/Resources/Assets.xcassets/Template Images/reply.imageset/reply@2x.png index 4c15fa4021bd2875e8fd145ef7a247dfdba7ddc1..9c32bfcf47370b63a5685cedc1e33dca871bcb3e 100644 GIT binary patch delta 703 zcmV;w0zmz%0?Y-F8Gi-<006~!8|wf7010qNS#tmY2VVdH2VVi|cEuI|00MqVL_t(& zf$f^naoaEqhJW<>UT;u!f_j5`gltfC1C8Kr;1QG!+zIMTP-lW96T};!#}-L=I*6h~ zP@;0i9q(kB2K0#l34$hO#(Rm$oFBXdnQM5-&|j zAkjcF3f*|QDSr`W5J=q2hj}a|`1@LLKSV@sf&7+vZGV!9#o0PC^J9{>!01#;+|1FO zi&wc^?z9lpfjWSu7EyAMzRd=YbNuiOMFU;&l>ejpc*=;kd z^h*-^Pl#yO*VnXi%FNC+epu@CBq|Fxt(@XNR7*t8&(GGnV^Pr~$;5$$du?Q04%!PLrDWK`A1JeM0IvS3z{mETB) z?#rDV4D@COi@01*8EmLcDwE9x)ZM0sT2gI$mN*lgRGxOq=d*2))#>-Ye1T*1X1dCmlKs z0>1G~DPrEM-ri<8(dv+5`|B0opDl4bd@f_M-v63Ob-mr+Wxf^)BwY6VxD@1HPgg&e IbxsLQ0N_$>jQ{`u diff --git a/App/Resources/Assets.xcassets/Template Images/reply.imageset/reply@3x.png b/App/Resources/Assets.xcassets/Template Images/reply.imageset/reply@3x.png index 24c0a2dbcc877ad4cc737a477d8bde41ca953467..fb5c887972ce052717737e60aedabab2094e4c1e 100644 GIT binary patch delta 1148 zcmV-?1cUp<1BMBZ8Gi-<0054vARPbz010qNS#tmY3labT3lag+-G2N400cNmL_t(| zob6o8aoaEu-Oc14br7Y3sDmgKL>*YJASywrAaVtkE3jOFs0yr95c!r{q+?E-*~xmW zK>!*6@e_$R!xK&M`2kq$4@4q@3U|Dzn)#s$=ZPwuC#rCs$bT*zB2E!;lADJsvI&QX zBSdTfU<&|`h)9Sy&&9_TS%i}r#-e>vZXI&)@j-Io5OF4=eN6rCkVq;VA}#>n9su5H zZtsYwNy(=Rk_m^1YXJCexP3=N(^OnS;BD*|@Fwue(!3_3b!;A?5mmUeO+dFaPXI6_ zqJ5J8G%%tqRey0UOrre&fXStb2C;-g#1#PC8brI3nRYR*hZdYx3UvVh+p`V-tl?UQ zd|%Ehq-bo<_6EU@05I>1XnY0P95~*TnWkHsPXI8xWP7GVXB#J*z_zcOfC-(16Q}mp zaGRZ47VQ{}Z9(u_s(p28UEnO7IJIog-fM23#GYMD%zx<%r=@z9+0cphY|nZx8pFCg zD9iI;*aRNL-RPw~)4^q_&JCh5z5u{)M2y3-9Xs(8d8RkXc5nv=w`qw8O1gMeaL6}~ z=>Ye!%Ek8gD**gtcL@>4F<#;#+$9F(R~!Z+;xhCPyKD|qi4au$0RZ;deuXAyfw5d_ z(MN}!xPMAvHZaFPzAf{SHHc?XWB`vX9FO8Mb$_2Dxsi}F5nJUH?~LQJMZh59`I1|- zh{wC{r~m=SEuKJU@wyP3wT$XM)RG7w;L^bH&}D$Tl6oz9IV(iGxq;&*i*WQ}Q`(&4 zMd9Lk4Q@zcZJWlr5WBZBtPE#vsYdnL?v)^(&VRHx7m;ERo5Xen0`U8fS9am(#T6*F z;$<)^PMl(rE7n<-f$g-zrXXqZqew!yEOyV}30QMUMY1?&*|3pWyCzBUaYV#3YbwQQ z6R#Qy4r|!6L+#irlhndQq)nwDfw-zq@#h)K{JrngO@Y|%(*ZwQcK5@4#|WQ zsDH`Xk?n(7Qs+d(_T@UqyA`N~9qWef=&h_KaHSs+4`;cv9Q`HU+2Cx#!9VdD7rRmt z>RB#N3|%hx+x7xC{ar%uR&Nzu!)UMJGE`O(e1~=oRb4e9#=XykHP%};%zaKTXKD+iV z4`#+m53|mWJ@_#%d2yir1vxKmBTFFo$|dFPNIW@L9`pGg?OQt!pX;A zRxO9~_?+3I%R90rGDAa(J#%S%G@Z$~lhl1DT(oc^)L62}GmDzRHzEqsfnKC=XLYWF zO*gp>f*;N+)y6FXigqI|N6^E0r7qR3_0^Ni*k!D*O%&+>%kj>8$Hz|MuWh9BDC$YZ zVj~Cf!E8#0jWh-(t;^QW*?MB=#Tsu^;XF}=^F$TS6ID1*RN;I80Dl2=x>zz^bAd4c O0000ZSIsjJaDA9Hz zS_K2Adnz{tX1_isv*EAlj*l*x&i3DKe=ketuIpSAJ@xdw()TyG#7`};u9SbRxjpIa z%J%KckENbnckj&7Q@5>i_6jdZiOy%wDEg|_pcI|YJR^56UqI?>R)=k0(;A%D#j$5d zy$ih?-FTrupUv*xx`%N+Ic;rEqze0Fbc%j7#ISbdFmc>u$SLw<=#KGg@YG|C*c*N? zSWnww`?-P>DUT*SnHb*iYSmi?RqJe-O&+ZGCp;0(xqU0T@M=|-wY{nBW|4hiljgm= zW3gGzt7d6V?D@6zc~>o8$3I#6_t*!AA60)DrZNdHIqxlL0E!7uS3j3^P64Rc(#KFbsX~bO6fW0wE9v;TUWb#^4y-paeq4pb&Zt z!oX8BPyL7!tzFfVX30NV+s}z(KT|}ohkWdk1;A&`NYVlL2H*iW)h{*w0q9jb06|3h zB3LTjToo`R^GqXvRy7*-6yr=xBgtt5((1Rjg4N%vPmAF&r)nY%imHbacqQp!bVy%I z6fCEO$^4^?wM3c2%4FgG{KG%1y&Xxvwv9E`Rl5$r#ptB9dKqJ9%s}!nH?K%1B4L8N z7X_Kjpp1~$`8kOq(q*0nRk>mN5vZCUz!2;hG;e-)k!tp cY+wQ00KJhqgO3_+j{pDw07*qoM6N<$g7z+?+W-In literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Template Images/steamed-ham.imageset/steamed-ham@2x.png b/App/Resources/Assets.xcassets/Template Images/steamed-ham.imageset/steamed-ham@2x.png index 64d7ab5617a7ed225b1d95e49ddbb2ae8083f0c8..d3f3391af414eb12b46808c408f4936880e42f4e 100644 GIT binary patch delta 632 zcmV-;0*C$W1egVoD}M)J000MJ0hPnJwg3PEN=ZaPRA_8_k9xhXNuRgMZfmV2C^nv}F$fhFD2N zm12B5451L=6*nYm^Y@9QW*v)A`+_`#h&cdk0pQLv>`QE^nnfaG0p5}~p1BSHupy$| zs2*akln!qg;|tz)!7IvhuXv8ip`+B!tyO3%YS>d*C;^4OjOR8w?1k$jrBSf6$n5%f zqNnHn=pIDK?0;Wt!p+n~hT71zLelNUsmTai3TwMNcZhan>R4oiJ+;P5zSJid-wXAz zIUS@8xl4;P4k4oa;g*P+m~0TyJOZD`Ya+tdaT-FdKc5;Jn|xbtFUXY%kdZd*odZ1& z;d;VcZK$k+PdO&#N_S#P>9e^rIprEB7d1{SRGcYzYk#M?Ns>BdLa8IDNx}z23{>h& zB_KJBd4#KqyUsWy$gC2GKlx~c6385!nL%)1JvYq9cIuc3B@e~vR!rQ-)=I7EJav(= z8+|E=x7q0HDVVtPB5u95G~Q1I(;j{jx}J%sy)EGJj_hZv1KU($1@@|she(jVh_26B z;$IOu9C5!ytb=}F*>G@;^AVEWl`SG>p0SgHb#EQE{U+`?6wD+a*6sI5oF1*~dm?HN zAqm$&y=o(EVQ0VZj3JFC9;ymFewC4n*YT%D%_&c3qhzjFQ^!mwbzBx90Qd%qazew8 SEX0cd00001?>coD}M_T000XT0n*)m`~Uy~A4x<(RA_Klh?oID&SHMQDj#hCpaX!j5hChtcE+Ub5Mk#lc7KK@k~8bfgZ&!)0Kjo# z5-u?|j${2(7gj|4J&}XwwhKGbviPuLF?ydo_k99DNkr$#LXJ-i_mwHg2lG{*8CBdyjzAi*Qsut^QRTOnjj*kyB(5w=aXtj3ZWQrcJw%ejg4_)uCt zG(m*;bfltsX@4@pm)i2hc}l)cp|G-7sme0*pkyEVe7k~=P%eH?Q^fCR+e7l0Pup*+V4PWAtIr4W!!JGpo#P&k(8xb|Vb_QNXJ8i}w-sGgoFegX# zURqSeJS|CLM3-=Fk>6^DeOAmM%4|vbw+KX$G>T7-E7laED?WXf_ zG)hEl1*yU{hO3t(>v8#mjEtZq$=XX1ADq7Zt2z`zm`SMCSiYnnWA=cEmH33XBy#@T zvUm7)jYfePD28p1EuHUM)KFn9A|&PQ76!)$-k_fN*w;kMU4pl;r+FxLBto$x5sDq# bA_M?GvJlrHz7QDP00000NkvXXu0mjfNCFiG diff --git a/App/Resources/Assets.xcassets/Template Images/steamed-ham.imageset/steamed-ham@3x.png b/App/Resources/Assets.xcassets/Template Images/steamed-ham.imageset/steamed-ham@3x.png index 900d3b78d1c1cada61ded9c54d35bcc743f49b50..6dee11ae2fa606d00adcb4d92b2da8315cbe1bfc 100644 GIT binary patch delta 944 zcmV;h15f;+2ipgbIe(2wL_t(|ob8(j zC>wZ#DihS+z?lF&Ug1{9>H`ExnR4*l@oXou2)q(MK!HXg0wbIcrkM^CPKgPp#Dr5~ z!YTQ9YXcB*)A_g=In;5yz9FLH_@Q~3Z90O8YXI=eL*!}S0DqwE79wgBnLJ8X;Sli& z0InrgBq>hJ#uXxJven{*OIZM51po&CxVY2bxLnwlRdPR*o#>BX#{$F}DosiOqnj!s zRsgUAfUkjHedRl%weN;vND-IaWtIP}bS<1t4E z-Whl{TqO29MSs~5(KPFce(VGQd*@K<{zYKhn(ID|*yn7oXYJ!yv@yZd24xVjo)A!F ztHu!56o#(gwiLm7?B0&FkWE(Mc;xJ>yv;G>XAp12w)S20Ap1ir?wf8nL#on6>-bO& zh?M7fWTGIhA$siPIfazE~=2=2X@sl@&@>;r!dVUZO$+_`Zmm zu76ZGf8=>Y#Dmt-QeYqaNw93jAe`$|12Jl|#Eo$LFx{V@$Okwcac zeog&q#CIavNlp~>lnW7C#m`kNg;ye4OKlAuRX6;5A$KR5bo1L^lzqhRPS)iv+Qka> z18H7rs`*NZ;=6*l@aTEaZXdNL`AY0zjVTfnPKgPp#Dr5~!YMJ~l$dZD0N^(O0Nlca St@Jnm0000s delta 885 zcmV-*1B(3H2cZX$Ie$}0L_t(|ob8+8joUB`g~g)(d!3-^1a&94Y|xBwBV>ehgl>=# zk`3Gmnwy}>1kFvrLI?xoe6mA6IkueR0|Wz3Y)hXdN~CCF=HRmHgEPbA;6OPzP!0~1 zg9GK@Ksh*24i41EQYu134p7sof^z@xBxQ`A%Dy+$`|mKhY-U4qSQlz zy%{(G6(KF;hyt?eAP_h4cr%a@T%ScCt>di=DX}i|-rL#RjZVPof`Bzk-6z28p-MzE zd8?1cOV2iH7eY7>r~1k@b2*;vC1N9ghY+5ad2hV#wK99zlQdfM#-q(y-elOEfG*`3 znz|eX-ta?JX@AFJLl%95Qq*msgt#6QoB~?>eKs_(L_KGkx()(PhG&-n9vxT@ipLSrJaKwERcPS^XfIyG zE48%sjdB8+yNqi~(KQ#ZRUQEbrLu7nTl?2I{UWo_BzqnaRnp@=HGcZ6iQ!o$hd8VL zXq-NXO9OZLku;a}Tr;u~?e;=dCByW+7%+A=R#68etZSbxKXvNGIc)&fO_ z;RvuSAb)4&nJ<&}=vveh3qkoh4wQof<={X$I8fP1H{!ZHjMV^8$81+IGZ?7d$1Jg^ zgO+`-<6=+y(^nT5N#D_)=Qa)$3{KwEcI*aZXq#i_`bfHYmy?6LT%g>>fpT!592_VI z2MTt%-g_VuakDhZdQ&QEYl;`LS<{xWo1l+-=-si-PR(z1>_Cel97dXv3fxT==6 zylybFZX3Yha&>(NbuUHzJ(_9HfrxeqH|1Vr@`S9DL$nLO?hx8f>qG(Va!C+#bq|3| z8J^}~rf&~|@&zy`2M5Z*fpT!592_VI2g<>La&Vv=94H5eD1`7IL_6E8zywL|00000 LNkvXXu0mjfD}f4aTa()7Bes~ZvbIN^&|Xifr9;> zE{-7*Q`cTdN@c2`jMM|@^Y7=m R#R8qi;OXk;vd$@?2>`1wQV#$C literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@2x.png b/App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a8bef7a7d29d055cd750935d57bfd537ea94ee GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?5Gco1fMRd!SiD0t7) z#WBR9_wAI2yiEoIt@GRd?`l*&!Qm57%2degc7Rvrpx_zb2W*enteS)!*6o}%or$rh z-lxWs`HNnBy!ZRG(pcxGbG#X27}i|4b~^lXkXK8U|7KD@YcRbe8xRPpidb*UHx3vIVCg!0L%k+=l}o! literal 0 HcmV?d00001 diff --git a/App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@3x(1).png b/App/Resources/Assets.xcassets/Thread Lists/page.imageset/page@3x(1).png new file mode 100644 index 0000000000000000000000000000000000000000..44b8e6319b99e8fd2eb6bdc90394222e89157923 GIT binary patch literal 350 zcmV-k0iphhP)KmeCQxKoEw1Mgi%74zwT*?C1a$P=XSufD+8#03}cX zI?zGPMVPyryUP-J%lDSt?tZhET(Z5QC}1NZ695|kW7Km2uqJs>#FjY1N_NyHTP#TK zHGzHaT9p)FCn9rA;HN_o83DL@>stViK%R-61@6~&I`E1(GLoxUqKJfqrcegw{1T_8BP4kOkXIvoQ%sG#s`&!I6O`Ld-T1e +

+ + DEAD TWEET + @${tweeter} + `; + + return html; +}; + + /** Sets the "dark" class on the `` element. diff --git a/App/Resources/Theming/ghost.json b/App/Resources/Theming/ghost.json new file mode 100644 index 000000000..341e9059d --- /dev/null +++ b/App/Resources/Theming/ghost.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":120,"ip":0,"op":7201,"w":300,"h":300,"nm":"_GhostAnim 120","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"outline","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":500,"ix":3},"y":{"a":0,"k":500,"ix":4}},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.67,-0.02],[0,-35.64],[0,0],[-0.698,0.774],[0,0],[-1.447,-1.604],[0,0],[-1.447,1.604],[0,0],[-1.447,-1.604],[0,0],[-1.447,1.604],[0,0],[-1.447,-1.604],[0,0],[0.005,1.045],[0,0],[1.636,0.388],[0,0],[-1.502,0.776],[0,0],[1.169,2.261],[25.815,0]],"o":[[-35.625,1.044],[0,0],[0,1.043],[0,0],[1.447,-1.604],[0,0],[1.447,1.604],[0,0],[1.447,-1.604],[0,0],[1.447,1.604],[0,0],[1.447,-1.604],[0,0],[0.7,0.777],[0,0],[-0.008,-1.681],[0,0],[-1.645,-0.391],[0,0],[2.261,-1.168],[-11.09,-21.453],[-0.666,0]],"v":[[1.12,-83.333],[-63.586,-15.021],[-63.585,81.796],[-61.602,82.559],[-46.88,66.238],[-41.469,66.238],[-27.469,81.758],[-22.058,81.758],[-8.057,66.238],[-2.646,66.238],[11.354,81.758],[16.765,81.758],[30.765,66.238],[36.176,66.238],[50.883,82.541],[52.866,81.774],[52.605,30.958],[49.803,27.439],[-28.921,8.747],[-29.336,5.355],[60.48,-41.031],[62.417,-47.244],[3.124,-83.363]],"c":true},"ix":2},"nm":"path","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.301960796118,0.301960796118,0.301960796118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":".ghost-stroke","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"ghost-stroke"},{"ty":"tr","p":{"a":0,"k":[501.556,501.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ghost-outline","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":8727,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"eyes","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":500,"ix":3},"y":{"a":0,"k":500,"ix":4}},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,5.559],[-5.559,0],[0,-5.559],[5.559,0]],"o":[[0,-5.559],[5.559,0],[0,5.559],[-5.559,0]],"v":[[-31.057,-29.424],[-20.992,-39.489],[-10.928,-29.424],[-20.992,-19.359]],"c":true},"ix":2},"nm":"eye-pathA","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,5.559],[-5.559,0],[0,-5.559],[5.558,0]],"o":[[0,-5.559],[5.559,0],[0,5.559],[-5.558,0]],"v":[[8.759,-49.973],[18.823,-60.038],[28.888,-49.973],[18.823,-39.908]],"c":true},"ix":2},"nm":"eye-pathB","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960796118,0.301960796118,0.301960796118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".ghost-eyes","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"ghost-eyes"},{"ty":"tr","p":{"a":0,"k":[501.556,501.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ghost-eyes","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":8727,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"glow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":200,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":400,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":600,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":800,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":1000,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":1200,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":1400,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":1600,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":1800,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":2000,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":2200,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":2400,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":2600,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":2800,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":3000,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":3200,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":3400,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":3600,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":3800,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":4000,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":4200,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":4400,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":4600,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":4800,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":5000,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":5200,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":5400,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":5600,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":5800,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":6000,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":6200,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":6400,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":6600,"s":[25]},{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":6800,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.611],"y":[0]},"t":7000,"s":[25]},{"t":7200,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.604],"y":[1]},"o":{"x":[0.311],"y":[0.452]},"t":0,"s":[-0.519]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":116,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":316,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":516,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":716,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":916,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":1116,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":1316,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":1516,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":1716,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":1916,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":2116,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":2316,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":2516,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":2716,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":2916,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":3116,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":3316,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":3516,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":3716,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":3916,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":4116,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":4316,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":4516,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":4716,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":4916,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":5116,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":5316,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":5516,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":5716,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":5916,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":6116,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":6316,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":6516,"s":[2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":6716,"s":[-2]},{"i":{"x":[0.609],"y":[1]},"o":{"x":[0.391],"y":[0]},"t":6916,"s":[2]},{"i":{"x":[0.698],"y":[0.46]},"o":{"x":[0.384],"y":[0]},"t":7116,"s":[-2]},{"t":7200,"s":[-0.519]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":150,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":0,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":195,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":205,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":400,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":595,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":605,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":800,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":995,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":1005,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":1200,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":1395,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":1405,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":1600,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":1795,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":1805,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":2000,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":2195,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":2205,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":2400,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":2595,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":2605,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":2800,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":2995,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":3005,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":3200,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":3395,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":3405,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":3600,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":3795,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":3805,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":4000,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":4195,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":4205,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":4400,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":4595,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":4605,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":4800,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":4995,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":5005,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":5200,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":5395,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":5405,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":5600,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":5795,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":5805,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":6000,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":6195,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":6205,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":6400,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":6595,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":6605,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":6800,"s":[150.18]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":6995,"s":[135]},{"i":{"x":[0.47],"y":[1]},"o":{"x":[0.461],"y":[0]},"t":7005,"s":[135]},{"t":7200,"s":[150.18]}],"ix":4}},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.67,-0.02],[0,-35.64],[0,0],[-0.698,0.774],[0,0],[-1.447,-1.604],[0,0],[-1.447,1.604],[0,0],[-1.447,-1.604],[0,0],[-1.447,1.604],[0,0],[-1.447,-1.604],[0,0],[0.005,1.045],[0,0],[1.636,0.388],[0,0],[-1.502,0.776],[0,0],[1.169,2.261],[25.815,0]],"o":[[-35.625,1.044],[0,0],[0,1.043],[0,0],[1.447,-1.604],[0,0],[1.447,1.604],[0,0],[1.447,-1.604],[0,0],[1.447,1.604],[0,0],[1.447,-1.604],[0,0],[0.7,0.777],[0,0],[-0.008,-1.681],[0,0],[-1.645,-0.391],[0,0],[2.261,-1.168],[-11.09,-21.453],[-0.666,0]],"v":[[1.12,-83.333],[-63.586,-15.021],[-63.585,81.796],[-61.602,82.559],[-46.88,66.238],[-41.469,66.238],[-27.469,81.758],[-22.058,81.758],[-8.057,66.238],[-2.646,66.238],[11.354,81.758],[16.765,81.758],[30.765,66.238],[36.176,66.238],[50.883,82.541],[52.866,81.774],[52.605,30.958],[49.803,27.439],[-28.921,8.747],[-29.336,5.355],[60.48,-41.031],[62.417,-47.244],[3.124,-83.363]],"c":true},"ix":2},"nm":"Path","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[501.556,501.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ghost-outline","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960796118,0.301960796118,0.301960796118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".ghost-fill","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"ghost-fill"}],"ip":0,"op":8727,"st":0,"bm":0}],"markers":[]} diff --git a/App/Resources/Theming/platinum-member-white@2x.png b/App/Resources/Theming/platinum-member-white@2x.png deleted file mode 100644 index 39782ebad60275a869e8e0f21de5ef6825dd998d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmV+!0p|XRP)#{JX|e0 zZcwrVDrwIp%?zrKxj}~fsZjOi?kr*ShOOmB6vMiZbf$rcCH=j>G7i%$w!7*j(2Ahl z7PcJdMbPIn;CEOAB`bagod~*?2Ci>rOd>dyx{+9n%57|A7r%o8dsl~=r{jFhNidyN f-EDDIYHi~QjQ^2)&v+v`00000NkvXXu0mjfADnaT diff --git a/App/Resources/Theming/platinum-member-white@3x.png b/App/Resources/Theming/platinum-member-white@3x.png deleted file mode 100644 index c0d9321dac3a2f9a11350469d30b3f7d64e4e4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)itkC1we^Ep$s16Q1F*GRw`nab96|VP*G-^NLJYW*EDtR2U&AS dAF1Wbu3xU5alwK-x(xsT002ovPDHLkV1kXfwC4Z- diff --git a/App/Resources/Theming/platinum-member.png b/App/Resources/Theming/platinum-member.png new file mode 100644 index 0000000000000000000000000000000000000000..580386458d4a9bfe4ae8beb494f48e0cff101647 GIT binary patch literal 620 zcmV-y0+aoTP)qJdk%$ZtZHTBRB9`do znyI3LRkS1kECIaQrY6GPTNd|I2-ySx$I+DZRpe13+5@<9F1-QR%I_6`bLZXzGdJ0N zX+epok!c>v1%MkD1VGEouTtN7vl|WMnwj@mqzTg;@*xZ4_?dQ8=Wce7#yqHe?gPO3 zsGt*yt|#hROPIMpw-He5J>%539({_WEp;ZyNl8XlbU)GgMk40vB-kutJHXG%9QqF6 zF#sF2K{lwsu9T`R9nbod?&bzH0l;1?U`Ee0;^%SwU^XZP4ZT7qy(a@4!v-yo3)o7E ziA{UwOIy;$!efKmYM?Tmng!&>CNSV{s#XD28#*dsSLJSMbo2Cw}W=K^N%B6EJpsDcsFcg|oXq&YouiR$zC}NMk zB}7w&nJJ}ym2>?eN)VKY7QY4bf9h+OKLvU}L%+#wYC!uumbz_fK)XDax@~G!y?qD2 zlu&ufB{L_f8dX$2dhIGg?ouHKkfZNMRSXF`{2F`G==r?{sPEL66871}?4bO0j?aNj z`XE*e>L{CHgRVr$Y)}WdmEFHjVSCNq%UU?TIE_EV0DJ;hBiBlO*fNCx0000jt2 zM?iqb*oK8oj%AYyGL-tUp+_^h(nBQSbxeF@NLd=;4B3=6Xj3XixiG5wQ9H?1P zuM2Amv@B@XGr)f!E(Q$?nwAD`Xy$tcT dgSh&o#~X7}Qk`E(Rwe)d002ovPDHLkV1hN8b(R1C diff --git a/App/Resources/Theming/platinum-member@3x.png b/App/Resources/Theming/platinum-member@3x.png deleted file mode 100644 index c0b9e471c80cae0ca2c8a4c75de5b5678825c913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmV-*0gC>KP)+>-MdJd@gwZ<%Z z)H0|IK&KpaZDjlI2if|*p~DBhg9nv}4OQvvpBOwLjI=?2Hb`@OGdi(OhV365&9Fu% zi3E*Tv1c5D^{i8X_suuXn%b#bhS8=b?^~r^37QzP4FDH!cUE?>GoK<*_h6P-{}?(% zkh2e)S~huk`nehov}GV&U6&>p<$wF||6g5qHbIqy&Vs2}N6Dedm)*aCDkfA(pfwXJ zyi0iGkKMmbv*&*D=8!Q}%V)I;c;*p;(oo$*J}K(u)SVUU3^$UqomAPic9h`aza>>gnr(+u$d0000< KMNUMnLSTZ%EQ|C2 literal 1180 zcmZ`&Uu)A)6u((@)@omrL76^;2r`7`Ch448Oe4Cet=L*>mDC4m)}}7lBqh0{8TjOb zGV}{Le3*#rMSSuL=$miis|cb9`s7E@bCayivh9X*&&fIGcmCXa?na}2J)fJ+A%ybP ziq-^P0Lo^kVgLE+QWw~!saN~88ahV}Xqq{JG9WSVA!ZgG4rPSyGN;D!eP%B9nF1dX z!H#Bt`cEx%DE5B@oURHGM2dLB3e16R5Z7ZHp36$Sz%PPrYHMnYD{N)Pau#f;-ZApP zjt(nrAE9F>DKTjCCG?T$TP>aFwVQI+wRxlGu9$pa4=D;MfefN;5`zuwf#b_TnF~E+ zkf|DTZ0JHBmN~uFV3%FbWEY?!fm3rV%PL;4FE_PoF&zHN+$teM8ROAt#E(k6>pj5Y z($W$ZBrHiq@F@E04l#nFoF;z*B#G-J%SQ1;} zyj)t8OVYh4!Y;Q&2znH<-ZXu8utqOXy&ws&ut;|W?=h#L6XYGoBB~TaQtC9SJ+beX zFlkOhZ+VspV;I&d#@Uj(*k8eP5)+ddjeV$vxmR;=EIV&V&HdQ;{uZ9qLRGumnw#l% z3UxN~`^DeJ@s-z^8^1n0`FCV9_mO?}nW;SQt)C^gS3hmfXS08{-+Z-J7tpsar!N-X RH%s(oRbf3SXkfZ4Q$5C#i|NlQ!yayLHXR~mF6S^~=EzoNFjGd-kfJhXj+v>MImcX@p;AgAmA(gU z3GGTrB)fc@uM0y(C68}Y+a@jAeBD!aYt@GDjO3~B+3&XJdEWEB=Y4=7r5SM(;V_y(gwr4@-DJ`*P$C}1;X1WqShz$?LlvkJRcSQ@78=Fk zGE9qUWZ1u<9zFg{0O4AJU{uB*>Y`MRiqL2SHxg!yIOGq}8et-i(!x;S2O zt|n`6gri19T1+j(FvZ6}g?&_+48v5IJXatR%T*>LJU_XDaz$FyA2h{{LT6FDAt4MS z-Z0`rpAXRyI{gDwfJx->iJwB*6gn(~=?LVDFrd$%MAAq^TG4+6OTey(pllX}70*T~bRvhvzTPlX46#1m=VD@= zDG5H_m;9gim#O7M5sDOln#WX{rtCp@at#sJ#F64zfhLTs6ms%#!XP5CsSx}@u_*&k z2{^JX|I;4$K&zLb1nGasiw`gj7O&Nd)aYU<;jRB6^Js+nG*i)ju!Q!nMh>5SQs5uq zMAtAaN81(gG1~A@718C?L_3R=Z;d9pb6b{FZpY$dgOzNQkq(JL|9XE4p8Eer8(uOfcFlZY9cvB-Je z+DaVAD+ub%7`Sc${5E4@UP01eLum<0dd8 zQq6I1AH4Nh^hRTc5(`EWi+HZsllq*MUCU!)zS>i^`5Yeg zZb0?O!eyn*w%9K_t^2{QSJqdhQ`_3*IiC6pAJwXz(IaiCXj_0gzpJ^9)&1m+*uaa+=PCir} zzU;^8Jn5pA;w?w((!7S|l}u|cFWBv2wXbH(a=)BJ*JRKAJ3Oo^wE72><@%+Ut1?|v z%NAT?TE28M^XRx#e9KPR-!a3}ri;IQFTShoxf3Tj=w?g3nA1`$NZMXn_9Q4dD@vwv zxmUj#$nvd;g{^#Hxi0n`r|8>KgW^PW-PWpO%+vOgj>Atl6sWxMLT70BtEl$aw@k!2 zb?MnzX+1rOt@6hW1-qqbb@8lCxl+eahX)&Z?O{i!NHcq0%fjC;KE0&W;Ix(qP?*%~ zi-v@Iy4{Qy*TQTU1)u86-}&>K+Aj)?(yD0)}gFFqA+WJzAd&}h_)FlxfSiLWBPMl$aBT~N`ss#87i(yOkK$6fQxj(i{?Q^l3H(`p z8=B6JyPo;x`-{6C+J^?_QS-Fr(Z=&t-u2>?!6^-;#8lskE<9BgLm{918WZJ3&Dokr&gB9j85^x zzml4bovT4bO9Z#w!0%q)cqd@~iu=7o4$!Hq+Ux1>E74nn7kks2+rI91cuO8~EsFjw z^XAHQ7TWaFr7rUf>rGpy6;Rz`96h6sa4K`R+@2EZEIsV3vyO64zYpAF1Om7|N{( Hh~55A^7%*# literal 1025 zcmV+c1pfPpP)iJ|0btDmV9fzw%>iJ|0btDmV9fzw%>iJ|0btDmV9fzw%>iJ|0btD@b5p(m z000qmQchCVO5000AQNkl+qGDM3>!W?`3;;H~tAtZD!#CRKq2e9v2Dm z6}9XWFJF8GZ9rk2RQlvdEs1r?WDrxczp`K;)hI~V9uh>&!^gV~D`ZIRx6h0dt7F_D zmM1UWwb-L#Ch0R2`&YII})dF^syQ&}QR#_Llww3bmn;Cym zB3_TL5zCp0DoVt@Tf+ShI95q6)#Jdv^egQ2kVvjQ|5&=nSQigd61>? zn-?~(F2jfwr6rE5&H>rZL)oD;uPCQQJfkd+WSAep@gd`w5Crk^X%5G5&}B3lt#YD2 z_SshRFf+p_V;-ZF=f`n?meymUoH}5m+&pO_ob?>!+QVT72g6Py_?Q^Yo=mZQWJHL9 zo0O%E=VbqqPE7v+HKIQ!XJwdGy8R40Uyz9d86UrraYPxruVnsS#)>R_B?}X>6J@j^ z{#I7slZ9KEyeB&}*~BA8$yvCKKHbZTCW}~&?zS2QWQjjWcVGA7FiOYF0Lge(z0(># z7kVB~kcRK05oA%Hs_A1k{%t#kvoYd-92jt$N{d9X{TZo1*Hd4xg}wg0ZD(g3PEP;c zwsU9^69!V>>?CbmR7RrR<<;yIRw!m!RsYYOHJZ`oSf7LG7dC9)gunli&0W=jXPscr znDPpcSf_s70q6D4cn;&u6p|S@^Z?thFaskFAE`)g-98nW2|}zRvAHL%p2y=h@ePSW z2<7}_*INup_WOgm7dU8I;;$%^_a20e@fh(6TB0JzpIpSX2vHPn|b46R>(@lrFTk!}?OngL4C~n0u#Wu~WVNj+zHuyO00000NkvXXu0mjfM#Juw diff --git a/App/Templates/PostsView.html.stencil b/App/Templates/PostsView.html.stencil index e23e63ef8..4ad262937 100644 --- a/App/Templates/PostsView.html.stencil +++ b/App/Templates/PostsView.html.stencil @@ -38,8 +38,8 @@ {% if endMessage %} -
- End of the thread +
+
{% endif %} diff --git a/App/Templates/PrivateMessage.html.stencil b/App/Templates/PrivateMessage.html.stencil index 682dfdae5..251a93c4f 100644 --- a/App/Templates/PrivateMessage.html.stencil +++ b/App/Templates/PrivateMessage.html.stencil @@ -30,7 +30,12 @@ {% if hiddenAvatarURL %}data-awful-avatar="{{ hiddenAvatarURL|htmlEscape }}"{% endif %}> {% if visibleAvatarURL %} - + + {% endif %} + {% if ipadPostsViewTemplate %} +
+ {{ customTitleHTML }} +
{% endif %}
diff --git a/App/Theming/Themes.plist b/App/Theming/Themes.plist index 5ac4e60e4..516e352a5 100755 --- a/App/Theming/Themes.plist +++ b/App/Theming/Themes.plist @@ -4,6 +4,8 @@ BYOB + keyboardAppearance + Light relevantForumID 268 description @@ -55,6 +57,10 @@ default + favoriteStarTintColor + #1e84af + settingsSwitchColor + #1e84af roundedFonts description @@ -75,6 +81,10 @@ #999999 Lists + expansionTintColor + #808080 + ratingIconEmptyColor + #cccccc listHeaderTextColor #838383 listHeaderBackgroundColor @@ -92,8 +102,23 @@ threadListPageIconColor #808080e5 + Lotties + + getOutFrogColor + #1e84af + nigglyColor + #000000 + Navbar, tab bar, toolbar + showRootTabBarLabel + + tabBarTintColor + #1e84af + tabBarIconNormalColor + #cccccc + tabBarIconSelectedColor + #1e84af tabBarBackgroundColor #f7f7f7 navigationBarTextColor @@ -655,6 +680,8 @@ FYAD + keyboardAppearance + Light relevantForumID 666 description @@ -775,6 +802,356 @@ postsViewCSS posts-view-macinyos.css + spankykongDark + + roundedFonts + + Lotties + + getOutFrogColor + #4d4d4d + nigglyColor + #4d4d4d + + Action icons + + addBookmarkIconColor + #FFFFFF + copyURLIconColor + #FFFFFF + editPostIconColor + #FFFFFF + ignoreUserIconColor + #FFFFFF + jumpToFirstPageIconColor + #FFFFFF + jumpToLastPageIconColor + #FFFFFF + markUnreadIconColor + #FFFFFF + markReadUpToHereIconColor + #FFFFFF + profileIconColor + #FFFFFF + quoteIconColor + #FFFFFF + rapSheetIconColor + #FFFFFF + removeBookmarkIconColor + #FFFFFF + sendPMIconColor + #FFFFFF + singleUserIconColor + #FFFFFF + unignoreUserIconColor + #FFFFFF + voteIconColor + #FFFFFF + + description + SpankyKong Dark Theme + descriptiveColor + #000000 + descriptiveName + SpankyKong OLED Dark + favoriteStarTintColor + #4d4d4d + tintColor + #0066ff + backgroundColor + #000000 + scrollIndicatorStyle + Light + keyboardAppearance + Dark + actionIconTintColor + #0066ff + placeholderTextColor + #666666 + settingsSwitchColor + #0066ff + Lists + + ratingIconEmptyColor + #4d4d4d + expansionTintColor + #4d4d4d + listHeaderTextColor + #4d4d4d + listHeaderBackgroundColor + #000000 + listTextColor + #dddddd + listSecondaryTextColor + #4d4d4d + listBackgroundColor + #000000 + listSelectedBackgroundColor + #333333 + listSeparatorColor + #000000 + threadListPageIconColor + #4d4d4d + + Navbar, tab bar, toolbar + + showRootTabBarLabel + + tabBarIconSelectedColor + #0066ff + tabBarIconNormalColor + #4d4d4d + tabBarTintColor + #ff0000 + bottomBarTopBorderColor + #000000 + navigationBarShadowOpacity + 0 + navigationBarTextColor + #ffffff + navigationBarTintColor + #000000 + tabBarBackgroundColor + #000000 + tabBarIsTranslucent + + toolbarTextColor + #ffffff + toolbarTintColor + #000000 + topBarBottomBorderColor + #000000 + + Posts + + postsLoadingViewTintColor + #000000 + postsPullForNextColor + #4d4d4d + postsTopBarTextColor + #eeeeee + postsTopBarBackgroundColor + #000000 + postsTweetTheme + dark + postsViewCSS + posts-view-spankykong-oled-dark.css + + Sheets + + sheetBackgroundColor + #000000 + sheetTitleColor + #ffffff + sheetTitleBackgroundColor + #0c0c0c + sheetTextColor + #ffffff + sheetDimColor + #202020f2 + + Tag picker + + tagPickerBackgroundColor + #151515 + tagPickerTextColor + #dddddd + + Unread badges + + unreadBadgeBlueColor + #4d4d4d + unreadBadgeGrayColor + #4d4d4d + unreadBadgeOrangeColor + #DB5800 + unreadBadgeRedColor + #DD1000 + unreadBadgeYellowColor + #FFCD00 + unreadBadgeGreenColor + #5AA000 + unreadBadgePurpleColor + #9337FD + unreadBadgeTealColor + #0066FF + + + spankykongLight + + roundedFonts + + Lotties + + getOutFrogColor + #999999 + nigglyColor + #999999 + + Action icons + + addBookmarkIconColor + #000000 + copyURLIconColor + #000000 + editPostIconColor + #000000 + ignoreUserIconColor + #000000 + jumpToFirstPageIconColor + #000000 + jumpToLastPageIconColor + #000000 + markUnreadIconColor + #000000 + markReadUpToHereIconColor + #000000 + profileIconColor + #000000 + quoteIconColor + #000000 + rapSheetIconColor + #000000 + removeBookmarkIconColor + #000000 + sendPMIconColor + #000000 + singleUserIconColor + #000000 + unignoreUserIconColor + #000000 + voteIconColor + #000000 + + description + SpankyKong Light Theme + descriptiveColor + #000000 + descriptiveName + SpankyKong Light Theme + favoriteStarTintColor + #999999 + tintColor + #0066ff + backgroundColor + #e6e6e6 + scrollIndicatorStyle + Dark + keyboardAppearance + Light + actionIconTintColor + #0066ff + placeholderTextColor + #999999 + settingsSwitchColor + #0066ff + Lists + + ratingIconEmptyColor + #cccccc + expansionTintColor + #999999 + listHeaderTextColor + #999999 + listHeaderBackgroundColor + #e6e6e6 + listTextColor + #000000 + listSecondaryTextColor + #999999 + listBackgroundColor + #e6e6e6 + listSelectedBackgroundColor + #999999 + listSeparatorColor + #e6e6e6 + threadListPageIconColor + #999999 + + Navbar, tab bar, toolbar + + showRootTabBarLabel + + tabBarIconNormalColor + #000000 + tabBarIconSelectedColor + #0066ff + tabBarTintColor + #999999 + bottomBarTopBorderColor + #e6e6e6 + navigationBarShadowOpacity + 0 + navigationBarTextColor + #000000 + navigationBarTintColor + #e6e6e6 + tabBarBackgroundColor + #e6e6e6 + tabBarIsTranslucent + + toolbarTextColor + #000000 + toolbarTintColor + #e6e6e6 + topBarBottomBorderColor + #e6e6e6 + + Posts + + postsLoadingViewTintColor + #e6e6e6 + postsPullForNextColor + #999999 + postsTopBarTextColor + #000000 + postsTopBarBackgroundColor + #e6e6e6 + postsTweetTheme + light + postsViewCSS + posts-view-spankykong-light.css + + Sheets + + sheetBackgroundColor + #e6e6e6 + sheetTitleColor + #000000 + sheetTitleBackgroundColor + #e6e6e6 + sheetTextColor + #000000 + sheetDimColor + #999999 + + Tag picker + + tagPickerBackgroundColor + #151515 + tagPickerTextColor + #dddddd + + Unread badges + + unreadBadgeBlueColor + #999999 + unreadBadgeGrayColor + #999999 + unreadBadgeOrangeColor + #DB5800 + unreadBadgeRedColor + #DD1000 + unreadBadgeYellowColor + #FFCD00 + unreadBadgeGreenColor + #5AA000 + unreadBadgePurpleColor + #9337FD + unreadBadgeTealColor + #0066FF + + Winpos 95 relevantForumID @@ -817,6 +1194,15 @@ YOSPOS + keyboardAppearance + Dark + Lotties + + nigglyColor + #57ff57 + getOutFrogColor + #57ff57 + relevantForumID 219 parent @@ -909,6 +1295,15 @@ YOSPOS (amber) + keyboardAppearance + Dark + Lotties + + nigglyColor + #ebd04b + getOutFrogColor + #ebd04b + relevantForumID 219 parent diff --git a/App/Theming/Themes.swift b/App/Theming/Themes.swift index fd83b86ee..cd5a1ff2e 100644 --- a/App/Theming/Themes.swift +++ b/App/Theming/Themes.swift @@ -73,6 +73,10 @@ extension Theme { return dictionary["roundedFonts"] as? Bool ?? false } + var showRootTabBarLabel: Bool { + return dictionary["showRootTabBarLabel"] as? Bool ?? true + } + /// The desired appearance for the keyboard. If unspecified by the theme and its ancestors, returns .Default. var keyboardAppearance: UIKeyboardAppearance { let appearance = dictionary["keyboardAppearance"] as? String diff --git a/App/Theming/ViewController.swift b/App/Theming/ViewController.swift index 8ab8b0b4f..525bc2bc1 100644 --- a/App/Theming/ViewController.swift +++ b/App/Theming/ViewController.swift @@ -139,14 +139,16 @@ class TableViewController: UITableViewController, Themeable { private func createRefreshControl() { guard tableView.topPullToRefresh == nil else { return } - let niggly = NigglyRefreshView() + + let niggly = NigglyRefreshLottieView() let targetSize = CGSize(width: tableView.bounds.width, height: 0) + niggly.bounds.size = niggly.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel) niggly.autoresizingMask = .flexibleWidth niggly.backgroundColor = view.backgroundColor pullToRefreshView = niggly - let animator = NigglyRefreshView.RefreshAnimator(view: niggly) + let animator = NigglyRefreshLottieView.RefreshAnimator(view: niggly) let pullToRefresh = PullToRefresh(refreshView: niggly, animator: animator, height: niggly.bounds.height, position: .top) pullToRefresh.animationDuration = 0.3 pullToRefresh.initialSpringVelocity = 0 diff --git a/App/Theming/posts-view-alternate-dark.css b/App/Theming/posts-view-alternate-dark.css index da6feab37..905ad0d2f 100644 --- a/App/Theming/posts-view-alternate-dark.css +++ b/App/Theming/posts-view-alternate-dark.css @@ -658,3 +658,186 @@ footer { .ghost-stroke { stroke: rgba(255, 255, 255, 0.3); } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-alternate.css b/App/Theming/posts-view-alternate.css index b3b47883e..bdf08d9da 100644 --- a/App/Theming/posts-view-alternate.css +++ b/App/Theming/posts-view-alternate.css @@ -588,3 +588,186 @@ footer { .ghost-stroke { stroke: rgba(0, 0, 0, 0.3); } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-bright-light.css b/App/Theming/posts-view-bright-light.css index 7d6fa65a0..fbe186d99 100644 --- a/App/Theming/posts-view-bright-light.css +++ b/App/Theming/posts-view-bright-light.css @@ -625,3 +625,186 @@ footer { .ghost-stroke { stroke: rgba(0, 0, 0, 0.3); } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-byob.css b/App/Theming/posts-view-byob.css index 056bdb681..7647b3cdd 100644 --- a/App/Theming/posts-view-byob.css +++ b/App/Theming/posts-view-byob.css @@ -571,3 +571,186 @@ time.regdate { .ghost-stroke { stroke: #b9e7e7; } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-dark.css b/App/Theming/posts-view-dark.css index 79c2f1f65..62544452f 100644 --- a/App/Theming/posts-view-dark.css +++ b/App/Theming/posts-view-dark.css @@ -655,3 +655,186 @@ footer { .ghost-stroke { stroke: rgba(255, 255, 255, 0.3); } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-fyad.css b/App/Theming/posts-view-fyad.css index 0cce3b99a..5b5b96bed 100644 --- a/App/Theming/posts-view-fyad.css +++ b/App/Theming/posts-view-fyad.css @@ -615,3 +615,186 @@ header { .ghost-stroke { stroke: #f39; } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-gas-chamber.css b/App/Theming/posts-view-gas-chamber.css index de028b8ea..50fbaf69a 100644 --- a/App/Theming/posts-view-gas-chamber.css +++ b/App/Theming/posts-view-gas-chamber.css @@ -572,3 +572,186 @@ header { .ghost-stroke { stroke: #3e7d00; } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-macinyos.css b/App/Theming/posts-view-macinyos.css index 1894c9ed6..5d85e9660 100644 --- a/App/Theming/posts-view-macinyos.css +++ b/App/Theming/posts-view-macinyos.css @@ -636,3 +636,186 @@ blockquote { .ghost-stroke { stroke: #000; } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Theming/posts-view-oled-dark.css b/App/Theming/posts-view-oled-dark.css index da4c8ab8c..1de5964d4 100644 --- a/App/Theming/posts-view-oled-dark.css +++ b/App/Theming/posts-view-oled-dark.css @@ -54,6 +54,29 @@ post { post:first-child { margin-top: 0; } +* { + box-sizing: border-box; +} +header:after { + content: ""; + display: block; + clear: both; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-bottom: 6px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + vertical-align: middle; +} +.ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; +} header { padding-top: 0.75em; padding-bottom: 0.7em; @@ -680,3 +703,68 @@ footer { .ghost-stroke { stroke: #fff; } + + +.ipad post { + display: grid; + grid-template-columns: 210px 1fr 1fr; + grid-template-rows: 200px 1fr 1fr 40px; +} + +.ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + min-height: 200px; + margin-top: 10px; +} + +.ipad footer { + grid-row: 5 / 6; + grid-column: 1 / 4; +} + +.ipad header { + grid-row: 1 / 2; + grid-column: 1 / 5; + min-width: 200px; +} + +.ipad .avatar { + grid-row: 4 / 5; + grid-column: 1 / 5; + height: 100%; + overflow: auto; + display: grid; + margin-top: 4px; + margin-left: 4px; +} + +.ipad .customTitle > img { + display: none; +} + +.ipad .bbc-center > img { + display: none; +} + +.ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + width: 210px; + height: 130px; + overflow: auto; +} + +.ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + width: 100%; + height: 130px; + overflow: auto; +} + +.ipad .customTitle { + transform-origin: top left; + -webkit-transform: scale(0.7); + margin-left: 8px; +} diff --git a/App/Theming/posts-view-spankykong-light.css b/App/Theming/posts-view-spankykong-light.css new file mode 100644 index 000000000..bdc01fd62 --- /dev/null +++ b/App/Theming/posts-view-spankykong-light.css @@ -0,0 +1,937 @@ +/* + posts-view-spankykong-light.css + Awful + + Copyright 2022 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app + */ +body { + min-height: 100vh; + font: -apple-system-body; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; +} +body { + word-wrap: break-word; +} +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody div.code pre { + white-space: break-spaces; +} +post { + display: block; + border-top: 1px solid; + border-bottom: 1px solid; + margin-top: 0.5em; +} +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.ipad post header, +.ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; +} +.ipad post footer { + padding-left: 1.07em; +} +.ipad post .action-button { + padding-right: 1.07em; +} +post:first-child { + margin-top: 0; +} +header { + padding-top: 0.75em; + padding-bottom: 0.7em; +} +.ipad header { + padding-top: 1.22em; +} +header:after { + content: ""; + display: block; + clear: both; +} +.avatar { + display: inline-block; + vertical-align: middle; +} +.iphone .avatar { + max-width: 2.5em; + max-height: 2.5em; +} +.ipad .avatar { + max-width: 4em; + max-height: 4em; +} +.nameanddate { + display: inline-block; + vertical-align: middle; +} +.username { + margin: 0 0 2px; + word-break: break-all; +} +.postdate { + font-size: 0.8em; + font-weight: lighter; + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; +} +.regdate { + display: block; + font-size: 0.8em; + font-weight: medium; + margin: -0.4em 0 0; +} +.username { + display: inline-block; + font-size: 1.1em; + font-weight: 500; + /* Platinum users */ +} +.role-admin .username:before { + color: #990011; +} +.role-mod .username:before { + color: #006699; +} +.role-supermod .username:before { + color: #f3a5aa; +} +.role-ik .username:before { + color: #787373; +} +.role-coder .username:before { + color: #eacf4c; +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: #199ed7; +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.action-button { + margin: 0; + padding: 0.6em; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.bbc-block { + border-left: 2px solid #999; + font-size: 82%; + margin: 5px 0; + padding: 0 10px 5px; +} +.ipad .bbc-block { + margin: 0 10px 1em 10px; +} +.bbc-block h4 { + margin: 0; + padding: 1px 0px 2px; + font-weight: bold; +} +.bbc-block h4 span.mention.highlight { + color: #7409a0; + border-color: #7409a0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #7409a0; + border-color: #7409a0; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #7409a0; +} +.quote_link { + text-decoration: none; +} +[data-awful-linkified-image] { + cursor: pointer; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; +} +.postbody a { + -webkit-tap-highlight-color: transparent; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.bbc-block.code pre { + margin: 0; +} +.editedby { + margin-bottom: 0; + font-size: 90%; + font-style: italic; +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} +.ipad #fyad-flag img { + display: block; + margin: 0 auto; +} +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} +.ipad #ad { + padding: 1.07em; + padding-bottom: 0; +} +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +:root { + font-family: ui-rounded; + --username-font-size: 1.1em; + --username-color: #000000; + --regdate-font-size: 0.75em; + --regdate-color: #999999; + --postbody-font-size: 1.05em; + --postbody-color: #000000; + --link-font-size: 1.05em; + --link-color: #0066ff; + --editedby-font-size: 0.75em; + --editedby-color: #999999; + --postdate-font-size: 0.75em; + --postdate-color: #999999; + --quoteheader-font-size: 0.98em; + --quoteheader-color: #000000; + --quotebody-font-size: 0.85em; + --quotebody-color: #000000; + --quotelink-font-size: 0.85em; + --quotelink-color: #0066ff; +} +* { + box-sizing: border-box; + font-family: ui-rounded !important; +} +body { + min-height: 100vh; + font: -apple-system-caption1; + font-size: var(--postbody-font-size); + font-family: ui-rounded; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; + word-wrap: break-word; +} +post:first-child { + margin-top: 3px; +} +post { + background-color: #e6e6e6; + border-bottom: none; + border-top: none; + padding-bottom: 0.25em; +} +header { + border-bottom: none; +} +.iphone post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + padding-bottom: 7px; +} +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-right: 12px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + vertical-align: middle; + grid-column: 1 / 2; +} +.iphone .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; +} +.username { + word-break: break-word; +} +.postdate { + font-size: var(--postdate-font-size); + font: -apple-system-footnote; + font-weight: 600; + font-family: ui-rounded; + color: var(--postdate-color); + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; + text-align: right; + position: relative; +} +.regdate { + display: block; + color: var(--regdate-color); + font: -apple-system-caption1; + font-weight: 600; + font-family: ui-rounded; + font-size: var(--regdate-font-size); + margin: 0 0 2px 0px; +} +.username { + display: inline-block; + font: -apple-system-caption1; + font-weight: 600; + font-family: ui-rounded; + font-size: var(--username-font-size); + color: var(--username-color); +} +.role-admin .username:before { + color: #DD1000; + /* red */ +} +.role-mod .username:before { + color: #0066FF; + /* blue */ +} +.role-supermod .username:before { + color: #f3a5aa; + /* pink? never seen a supermod */ +} +.role-ik .username:before { + color: #999999; + /* grey */ +} +.role-coder .username:before { + color: #FFCD00; + /* yellow */ +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: var(--link-color); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + background-position: -100% 0; + -webkit-filter: invert(66%) sepia(11%) saturate(0%) hue-rotate(239deg) brightness(90%) contrast(92%); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); +} +.op .username { + color: var(--link-color); +} +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.postbody div.code pre { + white-space: break-spaces; +} +.postbody a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; + font-weight: 450; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.postbody > img { + border-radius: 3px !important; +} +.postbody > iframe { + border-radius: 3px !important; +} +.postbody a, +[data-awful-linkified-image] { + color: var(--link-color); +} +.iphone .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; +} +.bbc-block { + border-left: 2px solid #999; + font-size: var(--quotebody-font-size); + padding: 0 6px 5px 3px; + margin: 7px 0px; +} +.bbc-block h4 { + margin: 0; + font: -apple-system-headline; + font-weight: 700 !important; + font-size: var(--quoteheader-font-size); + font-family: ui-rounded; + text-align: top; +} +.bbc-block h4 span.mention.highlight { + color: #9337fd; + border-color: #7409a0; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; + border-radius: 3px !important; +} +.bbc-block.code pre { + margin: 0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #7409a0; +} +.ipad .bbc-block { + margin: 0 6px 1em 6px; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #9337fd; +} +.quote_link { + text-decoration: none; + font-family: ui-rounded; + color: var(--quotelink-color); +} +[data-awful-linkified-image] { + cursor: pointer; + font-family: ui-rounded; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +.bbc-spoiler:not(.spoiled) { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) .bbc-block, +.bbc-spoiler:not(.spoiled) .bbc-block h4, +.bbc-spoiler:not(.spoiled) .bbc-block h5, +.bbc-spoiler:not(.spoiled) li, +.bbc-spoiler:not(.spoiled) a:link, +.bbc-spoiler:not(.spoiled) a:visited, +.bbc-spoiler:not(.spoiled) a:active, +.bbc-spoiler:not(.spoiled) [data-awful-linkified-image] { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) li { + list-style: none; +} +.bbc-spoiler:not(.spoiled) img { + opacity: 0; + height: 0; + width: 100%; +} +.bbc-block h4, +.bbc-block h5 { + font-size: var(--quoteheader-font-size); + margin-bottom: 6px; +} +.bbc-block h4 a, +.bbc-block h5 a { + color: var(--quoteheader-color); +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #b837ed; +} +.bbc-block.mention.highlight h4 span.mention.highlight { + color: #9337fd; +} +.bbc-block.mention > .quoteheader > a { + color: #9337fd; +} +.bbc-block { + border: none; + background-color: #cccccc; + font-size: var(quote-font-size); + font-family: ui-rounded; + padding: 10px; + padding-left: 40px; + padding-bottom: 20px; + border-radius: 1em; + position: relative; +} +.quotepost-span { + height: 25px; + width: 25px; + display: block; + position: absolute; + top: 8px; + left: 8px; + background-color: var(--quotelink-color); + -webkit-mask-box-image: url("awful-resource://quote-post.png"); +} +.bbc-block a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; +} +footer { + white-space: nowrap; +} +.divider { + background-color: #cccccc; + content: ""; + border-radius: 0.3em; + display: inline-block; + height: 0.2em; + position: relative; + vertical-align: middle; + overflow: auto; + width: 100%; +} +.divider { + margin-right: 0.8em; + left: 1px; + overflow: auto; +} +.divider-seen { + background-color: #0066FF; + height: 0.15em; +} +.quoteheader > a { + margin-bottom: 8px; + color: var(--quoteheader-color); + font-family: ui-rounded; + font: -apple-system-headline; + font-weight: 600 !important; + font-size: var(--quoteheader-font-size); + text-align: top; +} +.quote_link { + color: var(--username-color); + margin-bottom: 8px; + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--quotelink-font-size); + display: inline-block; +} +img.awful-smile { + border-radius: 0px; +} +.editedby { + margin-top: 2em; + margin-bottom: 0; + font: -apple-system-caption1; + font-style: italic; + font-weight: 600; + font-size: var(--editedby-font-size); + color: var(--editedby-color); +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +.iphone footer { + grid-column: 1 / span 2; + grid-row: 5 / 6; + align-items: center; + justify-content: start; +} +footer { + margin-top: 1em; + margin-bottom: 0.5em; +} +.action-button { + margin: 0; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; + /* determine (close enough to) #999999 from black using https://codepen.io/sosuke/pen/Pjoqqp */ + -webkit-filter: invert(66%) sepia(11%) saturate(0%) hue-rotate(239deg) brightness(90%) contrast(92%); +} +.editedby span.mention.highlight { + color: #9337fd; +} +#end { + color: rgba(255, 255, 255, 0.3); + line-height: 3em; +} +body { + color: #000000; + background-color: #e6e6e6; +} +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em; + background: #e6e6e6; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: #999999; + font: -apple-system-headline; + font-weight: 600; +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: #0066FF; + font: -apple-system-headline; + font-weight: 450; +} +.ghost-fill { + fill: #999999; +} +.ghost-eyes { + fill: #999999; +} +.ghost-stroke { + stroke: #999999; +} diff --git a/App/Theming/posts-view-spankykong-light.less b/App/Theming/posts-view-spankykong-light.less new file mode 100644 index 000000000..841137585 --- /dev/null +++ b/App/Theming/posts-view-spankykong-light.less @@ -0,0 +1,564 @@ +/* + posts-view-spankykong-light.css + Awful + + Copyright 2022 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app + */ + + @import "base.less"; + + :root { + font-family: ui-rounded; + --username-font-size: 1.1em; + --username-color: #000000; + + --regdate-font-size: 0.75em; + --regdate-color: #999999; + + --postbody-font-size: 1.05em; + --postbody-color: #000000; + + --link-font-size: 1.05em; + --link-color: #0066ff; + + --editedby-font-size: 0.75em; + --editedby-color: #999999; + + --postdate-font-size: 0.75em; + --postdate-color: #999999; + + --quoteheader-font-size: .98em; + --quoteheader-color: #000000; + + --quotebody-font-size: 0.85em; + --quotebody-color: #000000; + + --quotelink-font-size: 0.85em; + --quotelink-color: #0066ff; +} +* { + box-sizing: border-box; + font-family: ui-rounded !important; +} + +body { + min-height: 100vh; + font: -apple-system-caption1; + font-size: var(--postbody-font-size); + font-family: ui-rounded; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; + word-wrap: break-word; +} + +post:first-child { + margin-top: 3px; +} +post { + background-color: #e6e6e6; + border-bottom: none; + border-top: none; + padding-bottom: 0.25em; +} +header { + border-bottom: none; +} +.iphone post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + padding-bottom: 7px; +} + +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-right: 12px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + vertical-align: middle; + grid-column: 1 / 2; +} +.iphone .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; +} +.username { + word-break: break-word; +} +.postdate { + font-size: var(--postdate-font-size); + font: -apple-system-footnote; + font-weight: 600; + font-family: ui-rounded; + color: var(--postdate-color); + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; + text-align: right; + position: relative; +} +.regdate { + display: block; + color: var(--regdate-color); + font: -apple-system-caption1; + font-weight: 600; + font-family: ui-rounded; + font-size: var(--regdate-font-size); + margin: 0 0 2px 0px; +} +.username { + display: inline-block; + font: -apple-system-caption1; + font-weight: 600; + font-family: ui-rounded; + font-size: var(--username-font-size); + color: var(--username-color); +} +.role-admin .username:before { + color: #DD1000; /* red */ +} +.role-mod .username:before { + color: #0066FF; /* blue */ +} +.role-supermod .username:before { + color: #f3a5aa; /* pink? never seen a supermod */ +} +.role-ik .username:before { + color: #999999; /* grey */ +} +.role-coder .username:before { + color: #FFCD00; /* yellow */ +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: var(--link-color); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + background-position: -100% 0; + -webkit-filter: invert(66%) sepia(11%) saturate(0%) hue-rotate(239deg) brightness(90%) contrast(92%); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); +} +.op .username { + color: var(--link-color); +} + +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.postbody div.code pre { + white-space: break-spaces; +} +.postbody a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; + font-weight: 450; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.postbody > img { + border-radius: 3px !important; +} + +.postbody > iframe { + border-radius: 3px !important; +} +.postbody a, +[data-awful-linkified-image] { + color: var(--link-color); +} +.iphone .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; +} +.bbc-block { + border-left: 2px solid #999; + font-size: var(--quotebody-font-size); + padding: 0 6px 5px 3px; + margin: 7px 0px; +} + +.bbc-block h4 { + margin: 0; + font: -apple-system-headline; + font-weight: 700 !important; + font-size: var(--quoteheader-font-size); + font-family: ui-rounded; + text-align: top; +} +.bbc-block h4 span.mention.highlight { + color: #9337fd; + border-color: #7409a0; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; + border-radius: 3px !important; +} +.bbc-block.code pre { + margin: 0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #7409a0; +} +.ipad .bbc-block { + margin: 0 6px 1em 6px; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #9337fd; +} +.quote_link { + text-decoration: none; + font-family: ui-rounded; + color: var(--quotelink-color); +} +[data-awful-linkified-image] { + cursor: pointer; + font-family: ui-rounded; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} + +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +.bbc-spoiler:not(.spoiled) { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) .bbc-block, +.bbc-spoiler:not(.spoiled) .bbc-block h4, +.bbc-spoiler:not(.spoiled) .bbc-block h5, +.bbc-spoiler:not(.spoiled) li, +.bbc-spoiler:not(.spoiled) a:link, +.bbc-spoiler:not(.spoiled) a:visited, +.bbc-spoiler:not(.spoiled) a:active, +.bbc-spoiler:not(.spoiled) [data-awful-linkified-image] { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) li { + list-style: none; +} +.bbc-spoiler:not(.spoiled) img { + opacity: 0; + height: 0; + width: 100%; +} +.bbc-block h4, +.bbc-block h5 { + font-size: var(--quoteheader-font-size); + margin-bottom: 6px; +} +.bbc-block h4 a, +.bbc-block h5 a { + color: var(--quoteheader-color); +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #b837ed; +} +.bbc-block.mention.highlight h4 span.mention.highlight { + color: #9337fd; +} +.bbc-block.mention > .quoteheader > a { + color: #9337fd; +} +.bbc-block { + border: none; + background-color: #cccccc; + font-size: var(quote-font-size); + font-family: ui-rounded; + padding: 10px; + padding-left: 40px; + padding-bottom: 20px; + border-radius: 1em; + position: relative; +} +.quotepost-span { + height: 25px; + width: 25px; + display: block; + position: absolute; + top: 8px; + left: 8px; + background-color: var(--quotelink-color); + -webkit-mask-box-image: url("awful-resource://quote-post.png"); +} +.bbc-block a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; +} +footer { + white-space: nowrap; +} +.divider { + background-color: #cccccc; + content: ""; + border-radius: 0.3em; + display: inline-block; + height: 0.2em; + position: relative; + vertical-align: middle; + overflow: auto; + width: 100%; +} +.divider { + margin-right: 0.8em; + left: 1px; + overflow: auto; +} +.divider-seen { + background-color: #0066FF; + height: 0.15em; +} +.quoteheader > a { + margin-bottom: 8px; + color: var(--quoteheader-color); + font-family: ui-rounded; + font: -apple-system-headline; + font-weight: 600 !important; + font-size: var(--quoteheader-font-size); + text-align: top; +} +.quote_link { + color: var(--username-color); + margin-bottom: 8px; + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--quotelink-font-size); + display: inline-block; +} +img.awful-smile { + border-radius: 0px; +} +.editedby { + margin-top: 2em; + margin-bottom: 0; + font: -apple-system-caption1; + font-style: italic; + font-weight: 600; + font-size: var(--editedby-font-size); + color: var(--editedby-color); +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +.iphone footer { + grid-column: 1 / span 2; + grid-row: 5 / 6; + align-items: center; + justify-content: start; +} +footer { + margin-top: 1em; + margin-bottom: 0.5em; +} +.action-button { + margin: 0; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; + /* determine (close enough to) #999999 from black using https://codepen.io/sosuke/pen/Pjoqqp */ + -webkit-filter: invert(66%) sepia(11%) saturate(0%) hue-rotate(239deg) brightness(90%) contrast(92%); +} +.editedby span.mention.highlight { + color: #9337fd; +} +#end { + color: rgba(255, 255, 255, 0.3); + line-height: 3em; +} +body { + color: #000000; + background-color: #e6e6e6; +} + +@import "dead-tweet-ghost.less"; +.dead-tweet(#0066FF, #e6e6e6, #999999); //@tweetLinkColor, @backgroundColor, @ghostColor \ No newline at end of file diff --git a/App/Theming/posts-view-spankykong-oled-dark.css b/App/Theming/posts-view-spankykong-oled-dark.css new file mode 100644 index 000000000..1cc28f8ac --- /dev/null +++ b/App/Theming/posts-view-spankykong-oled-dark.css @@ -0,0 +1,991 @@ +/* + posts-view-spankykong-oled-dark.css + Awful + + Copyright 2022 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app +*/ +body { + min-height: 100vh; + font: -apple-system-body; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; +} +body { + word-wrap: break-word; +} +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody div.code pre { + white-space: break-spaces; +} +post { + display: block; + border-top: 1px solid; + border-bottom: 1px solid; + margin-top: 0.5em; +} +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.ipad post header, +.ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; +} +.ipad post footer { + padding-left: 1.07em; +} +.ipad post .action-button { + padding-right: 1.07em; +} +post:first-child { + margin-top: 0; +} +header { + padding-top: 0.75em; + padding-bottom: 0.7em; +} +.ipad header { + padding-top: 1.22em; +} +header:after { + content: ""; + display: block; + clear: both; +} +.avatar { + display: inline-block; + vertical-align: middle; +} +.iphone .avatar { + max-width: 2.5em; + max-height: 2.5em; +} +.ipad .avatar { + max-width: 4em; + max-height: 4em; +} +.nameanddate { + display: inline-block; + vertical-align: middle; +} +.username { + margin: 0 0 2px; + word-break: break-all; +} +.postdate { + font-size: 0.8em; + font-weight: lighter; + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; +} +.regdate { + display: block; + font-size: 0.8em; + font-weight: medium; + margin: -0.4em 0 0; +} +.username { + display: inline-block; + font-size: 1.1em; + font-weight: 500; + /* Platinum users */ +} +.role-admin .username:before { + color: #990011; +} +.role-mod .username:before { + color: #006699; +} +.role-supermod .username:before { + color: #f3a5aa; +} +.role-ik .username:before { + color: #787373; +} +.role-coder .username:before { + color: #eacf4c; +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: #199ed7; +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.action-button { + margin: 0; + padding: 0.6em; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.bbc-block { + border-left: 2px solid #999; + font-size: 82%; + margin: 5px 0; + padding: 0 10px 5px; +} +.ipad .bbc-block { + margin: 0 10px 1em 10px; +} +.bbc-block h4 { + margin: 0; + padding: 1px 0px 2px; + font-weight: bold; +} +.bbc-block h4 span.mention.highlight { + color: #7409a0; + border-color: #7409a0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #7409a0; + border-color: #7409a0; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #7409a0; +} +.quote_link { + text-decoration: none; +} +[data-awful-linkified-image] { + cursor: pointer; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; +} +.postbody a { + -webkit-tap-highlight-color: transparent; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.bbc-block.code pre { + margin: 0; +} +.editedby { + margin-bottom: 0; + font-size: 90%; + font-style: italic; +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} +.ipad #fyad-flag img { + display: block; + margin: 0 auto; +} +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} +.ipad #ad { + padding: 1.07em; + padding-bottom: 0; +} +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +:root { + font-family: ui-rounded; + --username-font-size: 1.1em; + --username-color: #fffefe; + --regdate-font-size: 0.75em; + --regdate-color: #4d4d4d; + --postbody-font-size: 1.05em; + --postbody-color: #fffefe; + --link-font-size: 1.05em; + --link-color: #0066ff; + --editedby-font-size: 0.75em; + --editedby-color: #4d4d4d; + --postdate-font-size: 0.75em; + --postdate-color: #4d4d4d; + --quoteheader-font-size: 0.98em; + --quoteheader-color: #fffefe; + --quotebody-font-size: 0.85em; + --quotebody-color: #fffefe; + --quotelink-font-size: 0.85em; + --quotelink-color: #0066ff; +} +* { + box-sizing: border-box; + font-family: ui-rounded !important; +} +body { + min-height: 100vh; + font: -apple-system-caption1; + font-size: var(--postbody-font-size); + font-family: ui-rounded; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; + word-wrap: break-word; +} +post:first-child { + margin-top: 3px; +} +post { + background-color: #000000; + border-bottom: none; + border-top: none; + padding-bottom: 0.25em; +} +header { + border-bottom: none; +} +.iphone post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + padding-bottom: 7px; +} +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-right: 12px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + vertical-align: middle; + grid-column: 1 / 2; +} +.iphone .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; +} +.username { + word-break: break-word; +} +.postdate { + font-size: var(--postdate-font-size); + font: -apple-system-footnote; + font-weight: 600 !important; + font-family: ui-rounded; + color: var(--postdate-color); + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; + text-align: right; + position: relative; +} +.regdate { + display: block; + color: var(--regdate-color); + font: -apple-system-caption1; + font-weight: 600 !important; + font-family: ui-rounded; + font-size: var(--regdate-font-size); + margin: 0 0 2px 0px; +} +.username { + display: inline-block; + font: -apple-system-caption1; + font-weight: 600 !important; + font-family: ui-rounded; + font-size: var(--username-font-size); + color: var(--username-color); +} +.role-admin .username:before { + color: #DD1000; + /* red */ +} +.role-mod .username:before { + color: #0066FF; + /* blue */ +} +.role-supermod .username:before { + color: #f3a5aa; + /* pink? never seen a supermod */ +} +.role-ik .username:before { + color: #4d4d4d; + /* grey */ +} +.role-coder .username:before { + color: #FFCD00; + /* yellow */ +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: var(--link-color); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + background-position: -100% 0; + /* determine (close enough to) #4d4d4d from black using https://codepen.io/sosuke/pen/Pjoqqp */ + -webkit-filter: invert(27%) sepia(44%) saturate(0%) hue-rotate(257deg) brightness(90%) contrast(86%); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); +} +.op .username { + color: var(--link-color); +} +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.postbody div.code pre { + white-space: break-spaces; +} +.postbody a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; + font-weight: 450; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.postbody > img { + border-radius: 3px !important; +} +.postbody > iframe { + border-radius: 3px !important; +} +.postbody a, +[data-awful-linkified-image] { + color: var(--link-color); +} +.iphone .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; +} +.bbc-block { + border-left: 2px solid #999; + font-size: var(--quotebody-font-size); + padding: 0 6px 5px 3px; + margin: 7px 0px; +} +.bbc-block h4 { + margin: 0; + font: -apple-system-headline; + font-weight: 700 !important; + font-size: var(--quoteheader-font-size); + font-family: ui-rounded; + text-align: top; +} +.bbc-block h4 span.mention.highlight { + color: #9337fd; + border-color: #7409a0; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; + border-radius: 3px !important; +} +.bbc-block.code pre { + margin: 0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #7409a0; +} +.ipad .bbc-block { + margin: 0 6px 1em 6px; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #9337fd; +} +.quote_link { + text-decoration: none; + font-family: ui-rounded; + color: var(--quotelink-color); +} +[data-awful-linkified-image] { + cursor: pointer; + font-family: ui-rounded; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +.bbc-spoiler:not(.spoiled) { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) .bbc-block, +.bbc-spoiler:not(.spoiled) .bbc-block h4, +.bbc-spoiler:not(.spoiled) .bbc-block h5, +.bbc-spoiler:not(.spoiled) li, +.bbc-spoiler:not(.spoiled) a:link, +.bbc-spoiler:not(.spoiled) a:visited, +.bbc-spoiler:not(.spoiled) a:active, +.bbc-spoiler:not(.spoiled) [data-awful-linkified-image] { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) li { + list-style: none; +} +.bbc-spoiler:not(.spoiled) img { + opacity: 0; + height: 0; + width: 100%; +} +.bbc-block h4, +.bbc-block h5 { + font-size: var(--quoteheader-font-size); + margin-bottom: 6px; +} +.bbc-block h4 a, +.bbc-block h5 a { + color: var(--quoteheader-color); +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #b837ed; +} +.bbc-block.mention.highlight h4 span.mention.highlight { + color: #9337fd; +} +.bbc-block.mention > .quoteheader > a { + color: #9337fd; +} +.bbc-block { + border: none; + background-color: #1a1a1a; + font-size: var(quote-font-size); + font-family: ui-rounded; + padding: 10px; + padding-left: 40px; + padding-bottom: 20px; + border-radius: 1em; + position: relative; +} +.quotepost-span { + height: 25px; + width: 25px; + display: block; + position: absolute; + top: 8px; + left: 8px; + background-color: var(--quotelink-color); + -webkit-mask-box-image: url("awful-resource://quote-post.png"); +} +.bbc-block a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; +} +/* + posts-view-dark-emoticons.css + Awful + + Copyright 2013 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app +*/ +[title~=":bustem:"], +[title~=":effort:"], +[title~=":dealwithit:"], +[title~=":filez:"], +[title~=":fireman:"], +[title~=":firstpost:"], +[title~=":frogon:"], +[title~=":FYH:"], +[title~=":gb2gbs:"], +[title~=":goof:"], +[title~=":qq:"], +[title~=":regd04:"], +[title~=":regd05:"], +[title~=":regd06:"], +[title~=":regd07:"], +[title~=":rice:"], +[title~=":sicknasty:"], +[title~=":vick:"], +[title~=":woop:"], +[title~=":words:"], +[title~=":wtc:"], +[title~=":zerg:"] { + background: #fff; +} +[title~=":byobear:"], +[title~=":chiyo:"], +[title~=":coal:"], +[title~=":derp:"], +[title~=":dice:"], +[title~=":edi:"], +[title~=":fedora:"], +[title~=":hf:"], +[title~=":iia:"], +[title~=":iiam:"], +[title~=":iiapa:"], +[title~=":laffo:"], +[title~=":lol:"], +[title~=":ms:"], +[title~=":nms:"], +[title~=":nws:"], +[title~=":tbear:"], +[title~=":their:"], +[title~=":whoptc:"], +[title~=":wom:"], +[title~=":wtf:"], +[title~=":yohoho:"] { + -webkit-filter: invert(100%); +} +footer { + white-space: nowrap; +} +.divider { + background-color: #1a1a1a; + content: ""; + border-radius: 0.3em; + display: inline-block; + height: 0.2em; + position: relative; + vertical-align: middle; + overflow: auto; + width: 100%; +} +.divider { + margin-right: 0.8em; + left: 1px; + overflow: auto; +} +.divider-seen { + background-color: #0066FF; + height: 0.15em; +} +.quoteheader > a { + margin-bottom: 8px; + color: var(--quoteheader-color); + font-family: ui-rounded; + font: -apple-system-headline; + font-weight: 600 !important; + font-size: var(--quoteheader-font-size); + text-align: top; +} +.quote_link { + color: var(--username-color); + margin-bottom: 8px; + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--quotelink-font-size); + display: inline-block; +} +img.awful-smile { + border-radius: 0px; +} +.editedby { + margin-top: 2em; + margin-bottom: 0; + font: -apple-system-caption1; + font-style: italic; + font-weight: 600; + font-size: var(--editedby-font-size); + color: var(--editedby-color); +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +.iphone footer { + grid-column: 1 / span 2; + grid-row: 5 / 6; + align-items: center; + justify-content: start; +} +footer { + margin-top: 1em; + margin-bottom: 0.5em; +} +.action-button { + margin: 0; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; + -webkit-filter: invert(27%) sepia(44%) saturate(0%) hue-rotate(257deg) brightness(90%) contrast(86%); +} +.editedby span.mention.highlight { + color: #9337fd; +} +#end { + color: rgba(255, 255, 255, 0.3); + line-height: 3em; +} +body { + color: #fffefe; + background-color: #000000; +} +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em; + background: #000; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: #fffefe; + font: -apple-system-headline; + font-weight: 600; +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: #0066FF; + font: -apple-system-headline; + font-weight: 450; +} +.ghost-fill { + fill: #fffefe; +} +.ghost-eyes { + fill: #fffefe; +} +.ghost-stroke { + stroke: #fffefe; +} diff --git a/App/Theming/posts-view-spankykong-oled-dark.less b/App/Theming/posts-view-spankykong-oled-dark.less new file mode 100644 index 000000000..6d4985acf --- /dev/null +++ b/App/Theming/posts-view-spankykong-oled-dark.less @@ -0,0 +1,566 @@ +/* + posts-view-spankykong-oled-dark.css + Awful + + Copyright 2022 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app +*/ + +@import "base.less"; + + :root { + font-family: ui-rounded; + --username-font-size: 1.1em; + --username-color: #fffefe; + + --regdate-font-size: 0.75em; + --regdate-color: #4d4d4d; + + --postbody-font-size: 1.05em; + --postbody-color: #fffefe; + + --link-font-size: 1.05em; + --link-color: #0066ff; + + --editedby-font-size: 0.75em; + --editedby-color: #4d4d4d; + + --postdate-font-size: 0.75em; + --postdate-color: #4d4d4d; + + --quoteheader-font-size: .98em; + --quoteheader-color: #fffefe; + + --quotebody-font-size: 0.85em; + --quotebody-color: #fffefe; + + --quotelink-font-size: 0.85em; + --quotelink-color: #0066ff; +} +* { + box-sizing: border-box; + font-family: ui-rounded !important; +} + +body { + min-height: 100vh; + font: -apple-system-caption1; + font-size: var(--postbody-font-size); + font-family: ui-rounded; + margin: 0; + -webkit-text-size-adjust: 100%; + -webkit-touch-callout: none; + touch-action: manipulation; + word-wrap: break-word; +} + +post:first-child { + margin-top: 3px; +} +post { + background-color: #000000; + border-bottom: none; + border-top: none; + padding-bottom: 0.25em; +} +header { + border-bottom: none; +} +.iphone post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + padding-bottom: 7px; +} +.iphone post header, +.iphone post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; +} +.iphone post footer { + padding-left: 0.6em; +} +.iphone post .action-button { + padding-right: 0.6em; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-right: 12px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + vertical-align: middle; + grid-column: 1 / 2; +} +.iphone .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; +} +.username { + word-break: break-word; +} +.postdate { + font-size: var(--postdate-font-size); + font: -apple-system-footnote; + font-weight: 600 !important; + font-family: ui-rounded; + color: var(--postdate-color); + -webkit-flex-grow: 1; + -webkit-flex-wrap: wrap-reverse; + text-align: right; + position: relative; +} +.regdate { + display: block; + color: var(--regdate-color); + font: -apple-system-caption1; + font-weight: 600 !important; + font-family: ui-rounded; + font-size: var(--regdate-font-size); + margin: 0 0 2px 0px; +} +.username { + display: inline-block; + font: -apple-system-caption1; + font-weight: 600 !important; + font-family: ui-rounded; + font-size: var(--username-font-size); + color: var(--username-color); +} +.role-admin .username:before { + color: #DD1000; /* red */ +} +.role-mod .username:before { + color: #0066FF; /* blue */ +} +.role-supermod .username:before { + color: #f3a5aa; /* pink? never seen a supermod */ +} +.role-ik .username:before { + color: #4d4d4d; /* grey */ +} +.role-coder .username:before { + color: #FFCD00; /* yellow */ +} +.role-admin .username:before, +.role-mod .username:before, +.role-supermod .username:before, +.role-ik .username:before, +.role-coder .username:before { + content: '★'; +} +.op .username { + color: var(--link-color); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); + background-position: -100% 0; + /* determine (close enough to) #4d4d4d from black using https://codepen.io/sosuke/pen/Pjoqqp */ + -webkit-filter: invert(27%) sepia(44%) saturate(0%) hue-rotate(257deg) brightness(90%) contrast(86%); + content: ""; + background-size: 14px; + width: 14px; + height: 14px; + display: inline-block; +} +.coder .username:before { + content: url('awful-resource://image-coder.png'); +} +.idiotking .username:before { + content: url('awful-resource://ik.png'); +} +.diamond .username:before { + content: url('awful-resource://diamond-icon.png'); +} +.redpill .username:before { + content: url('awful-resource://redpill.png'); +} +.award .username:before { + content: url('awful-resource://award.png'); +} +.platinum .username:after { + background-image: url('awful-resource://platinum-member.png'); +} +.op .username { + color: var(--link-color); +} +.postbody img, +.postbody iframe, +.postbody embed { + max-width: 100%; +} +.postbody img, +#fyad-flag { + -webkit-user-select: none; +} +.postbody div.code pre { + white-space: break-spaces; +} +.postbody a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; + font-weight: 450; +} +.postbody b::before, +.postbody i::before, +.postbody s::before, +.postbody span.bbc-spoiler::before, +.postbody sub::before, +.postbody sup::before, +.postbody tt::before, +.postbody u::before { + content: "\200C"; +} +.iphone .postbody ol, +.iphone .postbody ul { + margin: 0; + padding-left: 1.5em; +} +.postbody > img { + border-radius: 3px !important; +} + +.postbody > iframe { + border-radius: 3px !important; +} +.postbody a, +[data-awful-linkified-image] { + color: var(--link-color); +} +.iphone .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; +} +.bbc-block { + border-left: 2px solid #999; + font-size: var(--quotebody-font-size); + padding: 0 6px 5px 3px; + margin: 7px 0px; +} + +.bbc-block h4 { + margin: 0; + font: -apple-system-headline; + font-weight: 700 !important; + font-size: var(--quoteheader-font-size); + font-family: ui-rounded; + text-align: top; +} +.bbc-block h4 span.mention.highlight { + color: #9337fd; + border-color: #7409a0; +} +blockquote { + margin: 0; +} +blockquote img { + max-width: 160px; + max-height: 100px; + border-radius: 3px !important; +} +.bbc-block.code pre { + margin: 0; +} +.bbc-block h5 { + margin: 0; +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #7409a0; +} +.ipad .bbc-block { + margin: 0 6px 1em 6px; +} +code, +pre, +tt { + font-family: menlo; + font-size: 0.9em; +} +span.mention.highlight { + color: #9337fd; +} +.quote_link { + text-decoration: none; + font-family: ui-rounded; + color: var(--quotelink-color); +} +[data-awful-linkified-image] { + cursor: pointer; + font-family: ui-rounded; + text-decoration: underline; +} +.gif-wrap { + cursor: pointer; + position: relative; + display: inline-block; +} +.gif-wrap:before { + content: "GIF"; + display: block; + background-color: rgba(255, 255, 255, 0.5); + background-image: url('awful-resource://play-button.png'); + background-size: 0.85em; + background-repeat: no-repeat; + background-position: right 5px center; + color: #000; + height: 1.35em; + margin: auto; + position: absolute; + width: 1.75em; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0.25em; + padding-right: 1.25em; + border-radius: 0.125em; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); +} +.gif-wrap.loading:before { + background-image: url('awful-resource://spinner-button.png'); +} +.gif-wrap.playing:before { + display: none; +} +.bbc-spoiler:not(.spoiled) .gif-wrap { + visibility: hidden; +} +.gif-wrap + br, +.gif-wrap + br + br { + display: none; +} +#fyad-flag { + width: 100%; + height: 102px; +} +#fyad-flag img { + border: 1px solid black; +} + +#ad { + text-align: center; +} +#ad img { + max-width: 100%; +} +.iphone #ad { + padding: 0.6em; + padding-bottom: 0; +} + +#end { + font-weight: normal; + text-align: center; + line-height: 1; + margin-bottom: 10px; + -webkit-user-select: none; +} +.voiceover-only { + position: absolute; + top: -9999px; + left: -9999px; +} +header, +footer { + -webkit-user-select: none; +} +header img.avatar, +header section.nameanddate { + cursor: pointer; +} +.bbc-spoiler { + cursor: pointer; +} +footer button.action-button { + cursor: pointer; +} +post, +#ad, +#end { + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + padding-left: constant(safe-area-inset-left); + padding-right: constant(safe-area-inset-right); +} +.bbc-spoiler:not(.spoiled) { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) .bbc-block, +.bbc-spoiler:not(.spoiled) .bbc-block h4, +.bbc-spoiler:not(.spoiled) .bbc-block h5, +.bbc-spoiler:not(.spoiled) li, +.bbc-spoiler:not(.spoiled) a:link, +.bbc-spoiler:not(.spoiled) a:visited, +.bbc-spoiler:not(.spoiled) a:active, +.bbc-spoiler:not(.spoiled) [data-awful-linkified-image] { + color: transparent; + background: #333; + border-radius: 6px; +} +.bbc-spoiler:not(.spoiled) li { + list-style: none; +} +.bbc-spoiler:not(.spoiled) img { + opacity: 0; + height: 0; + width: 100%; +} +.bbc-block h4, +.bbc-block h5 { + font-size: var(--quoteheader-font-size); + margin-bottom: 6px; +} +.bbc-block h4 a, +.bbc-block h5 a { + color: var(--quoteheader-color); +} +.bbc-block.mention.highlight, +.bbc-block.mention.highlight h4, +.bbc-block.mention.highlight h4 a { + color: #9337fd; + border-color: #b837ed; +} +.bbc-block.mention.highlight h4 span.mention.highlight { + color: #9337fd; +} +.bbc-block.mention > .quoteheader > a { + color: #9337fd; +} +.bbc-block { + border: none; + background-color: #1a1a1a; + font-size: var(quote-font-size); + font-family: ui-rounded; + padding: 10px; + padding-left: 40px; + padding-bottom: 20px; + border-radius: 1em; + position: relative; +} +.quotepost-span { + height: 25px; + width: 25px; + display: block; + position: absolute; + top: 8px; + left: 8px; + background-color: var(--quotelink-color); + -webkit-mask-box-image: url("awful-resource://quote-post.png"); +} +.bbc-block a { + -webkit-tap-highlight-color: transparent; + text-decoration: none; +} + +@import "posts-view-dark-emoticons.less"; + +footer { + white-space: nowrap; +} +.divider { + background-color: #1a1a1a; + content: ""; + border-radius: 0.3em; + display: inline-block; + height: 0.2em; + position: relative; + vertical-align: middle; + overflow: auto; + width: 100%; +} +.divider { + margin-right: 0.8em; + left: 1px; + overflow: auto; +} +.divider-seen { + background-color: #0066FF; + height: 0.15em; +} +.quoteheader > a { + margin-bottom: 8px; + color: var(--quoteheader-color); + font-family: ui-rounded; + font: -apple-system-headline; + font-weight: 600 !important; + font-size: var(--quoteheader-font-size); + text-align: top; +} +.quote_link { + color: var(--username-color); + margin-bottom: 8px; + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--quotelink-font-size); + display: inline-block; +} +img.awful-smile { + border-radius: 0px; +} +.editedby { + margin-top: 2em; + margin-bottom: 0; + font: -apple-system-caption1; + font-style: italic; + font-weight: 600; + font-size: var(--editedby-font-size); + color: var(--editedby-color); +} +.attachment { + margin: 0; +} +footer { + display: -webkit-flex; + -webkit-align-items: center; +} +footer:after { + content: ""; + display: block; + clear: both; +} +.iphone footer { + grid-column: 1 / span 2; + grid-row: 5 / 6; + align-items: center; + justify-content: start; +} +footer { + margin-top: 1em; + margin-bottom: 0.5em; +} +.action-button { + margin: 0; + border: none; + font-family: inherit; + -webkit-tap-highlight-color: transparent; + background-color: transparent; +} +.action-button img { + width: 24px; + height: 8px; + -webkit-filter: invert(27%) sepia(44%) saturate(0%) hue-rotate(257deg) brightness(90%) contrast(86%); +} +.editedby span.mention.highlight { + color: #9337fd; +} +#end { + color: rgba(255, 255, 255, 0.3); + line-height: 3em; +} +body { + color: #fffefe; + background-color: #000000; +} + +@import "dead-tweet-ghost.less"; +.dead-tweet(#0066FF, #000, #fffefe); //@tweetLinkColor, @backgroundColor, @ghostColor \ No newline at end of file diff --git a/App/Theming/posts-view-yospos.css b/App/Theming/posts-view-yospos.css index 470445b21..2dbaf9933 100644 --- a/App/Theming/posts-view-yospos.css +++ b/App/Theming/posts-view-yospos.css @@ -54,6 +54,29 @@ post { post:first-child { margin-top: 0; } +* { + box-sizing: border-box; +} +header:after { + content: ""; + display: block; + clear: both; +} +.avatar { + border-radius: 3px; + margin-top: 6px; + margin-bottom: 6px; +} +.iphone .avatar { + max-width: 4em; + max-height: 4em; + vertical-align: middle; +} +.ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; +} header { padding-top: 0.75em; padding-bottom: 0.7em; @@ -690,3 +713,186 @@ post.seen { .ghost-stroke { stroke: #57ff57; } +.dead-tweet-container { + display: grid; + grid-column: 2; + place-items: start; + max-width: -webkit-fit-content; + border-radius: 1em !important; + background: #000 !important; +} +.ghost-lottie { + grid-column: 1; + grid-row: 1 / span 6; + width: 6em; +} +.dead-tweet-title { + grid-column: 2; + grid-row: 3; + place-items: start; + color: var(--regdate-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 600 !important; + font-size: var(--regdate-font-size); +} +.dead-tweet-link { + grid-column: 2; + grid-row: 4; + place-items: start; + padding-right: 23px; + color: var(--link-color); + font: -apple-system-headline; + font-family: ui-rounded; + font-weight: 450 !important; + font-size: var(--regdate-font-size); +} +.ghost-fill { + fill: #57ff57 !important; +} +.ghost-eyes { + fill: #57ff57 !important; +} +.ghost-stroke { + stroke: #57ff57 !important; +} + +/* iPad should switch to iPhone view when split screen reduces width*/ +@media screen and (max-width: 399px) { + .customTitle { + display: none; + } + .ipad post header { + display: grid; + grid-column: 1 / span 2; + grid-row: 1 / 2; + align-items: center; + justify-content: start; + margin-bottom: 8px; + } + .ipad post header, + .ipad post .postbody { + padding-left: 0.6em; + padding-right: 0.6em; + } + .ipad post footer { + padding-left: 0.6em; + } + .ipad post .action-button { + padding-right: 0.6em; + } + .ipad .avatar { + max-width: 4em; + max-height: 4em; + margin-bottom: 6px; + margin-right: 12px; + vertical-align: middle; + grid-column: 1 / 2; + } + .ipad .nameanddate { + vertical-align: middle; + grid-column: 2 / 4; + align-items: start; + } + .ipad .postbody ol, + .ipad .postbody ul { + margin: 0; + padding-left: 1.5em; + } + .ipad .postbody { + grid-column: 1 / span 2; + grid-row: 2 / 4; + } +} + +@media screen and (min-width: 400px) { + .ipad post header { + grid-column: 1 / 2; + grid-row: 1 / 2; + min-width: 260px; + max-height: 500px; + display: grid; + } + .ipad post header, + .ipad post .postbody { + padding-left: 1.07em; + padding-right: 1.07em; + } + .ipad post { + display: grid; + grid-template-columns: 230px 1fr; + grid-template-rows: auto auto; + } + + .ipad post footer { + padding-left: 1.07em; + } + .ipad post .action-button { + padding-right: 1.07em; + } + .ipad .avatar { + max-width: 8em; + max-height: 8em; + vertical-align: top; + grid-row: 3; + margin-top: 8px; + margin-left: 4px; + } + .ipad .customTitle { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 160px; + overflow: auto; + font: -apple-system-headline; + transform-origin: top left; + -webkit-transform: scale(0.9); + margin-left: 8px; + margin-top: 4px; + } + + .ipad .bbc-center { + grid-row: 4 / 5; + grid-column: 1 / 5; + max-width: 210px; + max-height: 150px; + overflow: auto; + } + + .ipad .customTitle img { + border-radius: 3px; + } + .ipad .bbc-center img { + border-radius: 3px; + } + .ipad .customTitle a { + text-decoration: none; + color: var(--link-color); + } + .ipad .nameanddate { + vertical-align: middle; + grid-row: 1; + } + .ipad .username, + .ipad .regdate { + margin-left: 6px; + } + .ipad .postbody { + grid-row: 1 / 4; + grid-column: 2 / 4; + margin-top: 10px; + } + .ipad #ad { + padding: 1.07em; + padding-bottom: 0; + } + .ipad .bbc-block { + margin: 0; + } + .ipad footer { + grid-row: 5; + grid-column: 1 / span 4; + align-items: center; + justify-content: start; + } +} diff --git a/App/Thread Tags/ThreadTagLoader.swift b/App/Thread Tags/ThreadTagLoader.swift index 9f3909ed1..c9ddece3e 100644 --- a/App/Thread Tags/ThreadTagLoader.swift +++ b/App/Thread Tags/ThreadTagLoader.swift @@ -115,7 +115,7 @@ extension ThreadTagLoader { static let privateMessage = Placeholder(imageName: "empty-pm-tag", tintColor: nil) static func thread(tintColor: UIColor?) -> Placeholder { - return Placeholder(imageName: "empty-thread-tag", tintColor: tintColor) + return Placeholder(imageName: "empty-thread-tag", tintColor: nil) } static func thread(in forum: Forum) -> Placeholder { @@ -129,8 +129,46 @@ extension ThreadTagLoader { private let tintColor: UIColor? var image: UIImage? { - let image = UIImage(named: imageName) - return tintColor.flatMap { image?.withTint($0) } ?? image + if imageName == "empty-thread-tag" { + let image = UIImage(named: imageName)! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["tintColor"]!) + + let backgroundImage = UIImage(named: "thread-tag-background")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["backgroundColor"]!) + + let borderImage = UIImage(named: "thread-tag-border")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["listSecondaryTextColor"]!) + + let finalImage = backgroundImage + .mergeWith(topImage: image) + .mergeWith(topImage: borderImage) + + return finalImage //tintColor.flatMap { image?.withTint($0) } ?? image + } else if imageName == "empty-pm-tag" { + let image = UIImage(named: imageName)! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["listSecondaryTextColor"]!) + + let backgroundImage = UIImage(named: "thread-tag-background")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["backgroundColor"]!) + + let borderImage = UIImage(named: "thread-tag-border")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["listSecondaryTextColor"]!) + + let finalImage = backgroundImage + .mergeWith(topImage: image) + .mergeWith(topImage: borderImage) + + return finalImage //tintColor.flatMap { image?.withTint($0) } ?? image + } else { + let image = UIImage(named: imageName) + return image //tintColor.flatMap { image?.withTint($0) } ?? image + } } } } diff --git a/App/View Controllers/AnnouncementViewController.swift b/App/View Controllers/AnnouncementViewController.swift index 1f53a1308..8d7b5b2c3 100644 --- a/App/View Controllers/AnnouncementViewController.swift +++ b/App/View Controllers/AnnouncementViewController.swift @@ -387,8 +387,7 @@ private struct RenderModel: CustomDebugStringConvertible, Equatable, StencilCont authorUsername = announcement.author?.username ?? announcement.authorUsername - avatarURL = announcement.author?.avatarURL - ?? extractAvatarURL(fromCustomTitleHTML: announcement.authorCustomTitleHTML) + avatarURL = URL(string: announcement.author?.avatarURLString ?? "") ?? nil css = theme[string: "postsViewCSS"] ?? "" diff --git a/App/View Controllers/Forums/ForumListCell.swift b/App/View Controllers/Forums/ForumListCell.swift index 4ecd107c5..0d8e719e8 100644 --- a/App/View Controllers/Forums/ForumListCell.swift +++ b/App/View Controllers/Forums/ForumListCell.swift @@ -90,7 +90,7 @@ final class ForumListCell: UITableViewCell { return ViewModel( backgroundColor: .white, expansion: .none, - expansionTintColor: .black, + expansionTintColor: .clear, favoriteStar: .hidden, favoriteStarTintColor: .black, forumName: .init(), @@ -180,8 +180,8 @@ final class ForumListCell: UITableViewCell { let contentRect = CGRect(x: 0, y: 0, width: width, height: height) var remainder: CGRect - (favoriteStarFrame, remainder) = contentRect.divided(atDistance: starWidth, from: .minXEdge) - (expandFrame, remainder) = remainder.divided(atDistance: expandWidth, from: .maxXEdge) + (favoriteStarFrame, remainder) = contentRect.divided(atDistance: starWidth, from: .maxXEdge) + (expandFrame, remainder) = remainder.divided(atDistance: expandWidth, from: .minXEdge) nameFrame = remainder .insetBy(dx: Layout.nameMargin, dy: Layout.nameMargin) .divided(atDistance: indentation, from: .minXEdge).remainder @@ -199,8 +199,19 @@ final class ExpandForumButton: UIButton { init() { super.init(frame: .zero) - setImage(UIImage(named: "forum-arrow-down"), for: .normal) - setImage(UIImage(named: "forum-arrow-minus"), for: .selected) + setImage( + UIImage(named: "forum-arrow-right")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["listSecondaryTextColor"]!), + for: .normal + ) + + setImage( + UIImage(named: "forum-arrow-down")! + .withRenderingMode(.alwaysTemplate) + .withTintColor(Theme.defaultTheme()["listSecondaryTextColor"]!), + for: .selected + ) } required init?(coder: NSCoder) { @@ -212,7 +223,9 @@ final class FavoriteForumButton: UIButton { init() { super.init(frame: .zero) - setImage(UIImage(named: "star-off"), for: .normal) + setImage(UIImage(named: "star-off")! + .withTintColor(Theme.defaultTheme()["expansionTintColor"]!) + , for: .normal) setImage(UIImage(named: "star-on"), for: .selected) } diff --git a/App/View Controllers/Forums/ForumsTableViewController.swift b/App/View Controllers/Forums/ForumsTableViewController.swift index 51a3839ad..76f759594 100644 --- a/App/View Controllers/Forums/ForumsTableViewController.swift +++ b/App/View Controllers/Forums/ForumsTableViewController.swift @@ -18,9 +18,16 @@ final class ForumsTableViewController: TableViewController { self.managedObjectContext = managedObjectContext super.init(style: .grouped) - title = "Forums" - tabBarItem.image = UIImage(named: "forum-list") - tabBarItem.selectedImage = UIImage(named: "forum-list-filled") + title = LocalizedString("Forums") + tabBarItem.title = LocalizedString("Forums") + + tabBarItem.image = UIImage(named: "forum-list")!.withRenderingMode(.alwaysTemplate) + tabBarItem.selectedImage = UIImage(named: "forum-list-filled")!.withRenderingMode(.alwaysTemplate) + + if !Theme.defaultTheme().showRootTabBarLabel { + tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + tabBarItem.title = nil + } favoriteForumCountObserver = ManagedObjectCountObserver( context: managedObjectContext, @@ -99,8 +106,6 @@ final class ForumsTableViewController: TableViewController { } private func updateEditingState(favoriteCount: Int) { - navigationItem.setRightBarButton(favoriteCount > 0 ? editButtonItem : nil, animated: true) - var font: UIFont if Theme.defaultTheme().roundedFonts { font = roundedFont(ofSize: 17, weight: .medium) @@ -108,6 +113,9 @@ final class ForumsTableViewController: TableViewController { font = UIFont.systemFont(ofSize: 17, weight: .medium) } editButtonItem.setTitleTextAttributes([NSAttributedString.Key.font: font,], for: .normal) + + navigationItem.setLeftBarButton(favoriteCount > 0 ? editButtonItem : nil, animated: true) + if isEditing, favoriteCount == 0 { setEditing(false, animated: true) } @@ -158,6 +166,18 @@ final class ForumsTableViewController: TableViewController { self?.refresh() } } + + override func setEditing(_ editing: Bool, animated: Bool) { + // Takes care of toggling the button's title. + super.setEditing(editing, animated: true) + + if UserDefaults.standard.enableHaptics { + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + } + + // Toggle table view editing. + tableView.setEditing(editing, animated: true) + } override func themeDidChange() { super.themeDidChange() @@ -256,8 +276,8 @@ extension ForumsTableViewController { header.viewModel = .init( backgroundColor: theme["listHeaderBackgroundColor"], - sectionName: listDataSource.titleForSection(section), font: font, + sectionName: listDataSource.titleForSection(section).uppercased(), textColor: theme["listHeaderTextColor"]) return header diff --git a/App/View Controllers/Messages/MessageListCell.swift b/App/View Controllers/Messages/MessageListCell.swift index e7ca40176..85116b4ba 100644 --- a/App/View Controllers/Messages/MessageListCell.swift +++ b/App/View Controllers/Messages/MessageListCell.swift @@ -70,7 +70,11 @@ final class MessageListCell: UITableViewCell { ThreadTagLoader.shared.loadNamedImage(viewModel.tagImage, into: tagImageView) - tagOverlayView.image = viewModel.tagOverlayImage + tagImageView.layer.cornerRadius = 3 + tagImageView.layer.masksToBounds = true + + // badges + tagOverlayView.image = viewModel.tagOverlayImage?.image tagOverlayView.isHidden = viewModel.tagOverlayImage == nil setNeedsLayout() @@ -86,7 +90,7 @@ final class MessageListCell: UITableViewCell { let sentDateRaw: NSAttributedString let subject: NSAttributedString let tagImage: NamedThreadTag - let tagOverlayImage: UIImage? + let tagOverlayImage: UIImageView? fileprivate var accessibilityLabel: String { return String( @@ -148,7 +152,7 @@ final class MessageListCell: UITableViewCell { private static let minimumHeight: CGFloat = 65 private static let subjectTopMargin: CGFloat = 2 private static let tagRightMargin: CGFloat = 8 - private static let tagOverlayOffset = UIOffset(horizontal: 2, vertical: 3) + private static let tagOverlayOffset = UIOffset(horizontal: 4, vertical: 4) init(width: CGFloat, viewModel: ViewModel) { // 1. See how much width we have for the subject. @@ -183,30 +187,35 @@ final class MessageListCell: UITableViewCell { width: tagOverlaySize.width, height: tagOverlaySize.height) - // 4. Date - dateFrame = CGRect( - x: width - Layout.cellHorizontalMargin - dateSize.width, - y: (height - textHeight) / 2, - width: dateSize.width, - height: dateSize.height) - .pixelRound + // 5. Sender let senderX = tagSize.width > 0 ? tagFrame.maxX + Layout.tagRightMargin : Layout.cellHorizontalMargin - senderFrame = CGRect( + + subjectFrame = CGRect( x: senderX, y: (height - textHeight) / 2, - width: dateFrame.maxX - senderX - Layout.dateLeftMargin, - height: senderHeight) + width: subjectWidth, + height: subjectHeight) + + + // 4. Date + dateFrame = CGRect( + x: width - Layout.cellHorizontalMargin - dateSize.width, + y: (height - textHeight) / 2, + width: dateSize.width, + height: dateSize.height) + + // 6. Subject - subjectFrame = CGRect( - x: senderFrame.minX, - y: senderFrame.maxY + Layout.subjectTopMargin, - width: dateFrame.maxX - senderFrame.minX, - height: subjectHeight) + senderFrame = CGRect( + x: subjectFrame.minX, + y: subjectFrame.maxY, + width: dateFrame.maxX - senderX - Layout.dateLeftMargin, + height: senderHeight) } } diff --git a/App/View Controllers/Messages/MessageListViewController.swift b/App/View Controllers/Messages/MessageListViewController.swift index 5ff094562..af290d05b 100644 --- a/App/View Controllers/Messages/MessageListViewController.swift +++ b/App/View Controllers/Messages/MessageListViewController.swift @@ -22,9 +22,21 @@ final class MessageListViewController: TableViewController { title = LocalizedString("private-message-list.title") tabBarItem.title = LocalizedString("private-message-tab.title") + + if !Theme.defaultTheme().showRootTabBarLabel { + tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + tabBarItem.title = nil + } + tabBarItem.accessibilityLabel = LocalizedString("private-message-tab.accessibility-label") - tabBarItem.image = UIImage(named: "pm-icon") - tabBarItem.selectedImage = UIImage(named: "pm-icon-filled") + + tabBarItem.image = UIImage(named: "pm-icon")! + .withTintColor(Theme.defaultTheme()["tabBarTintColor"]!) + .withRenderingMode(.alwaysTemplate) + + tabBarItem.selectedImage = UIImage(named: "pm-icon-filled")! + .withTintColor(Theme.defaultTheme()["tintColor"]!) + .withRenderingMode(.alwaysTemplate) let updateBadgeValue = { [weak self] (unreadCount: Int) -> Void in self?.tabBarItem?.badgeValue = unreadCount > 0 diff --git a/App/View Controllers/Messages/MessageViewController.swift b/App/View Controllers/Messages/MessageViewController.swift index 084e87e44..d7793bcb5 100644 --- a/App/View Controllers/Messages/MessageViewController.swift +++ b/App/View Controllers/Messages/MessageViewController.swift @@ -173,6 +173,7 @@ final class MessageViewController: ViewController { override func viewDidLoad() { super.viewDidLoad() + self.addBackButton() renderView.frame = CGRect(origin: .zero, size: view.bounds.size) renderView.autoresizingMask = [.flexibleWidth, .flexibleHeight] @@ -367,7 +368,7 @@ private struct RenderModel: StencilContextConvertible { init(message: PrivateMessage, stylesheet: String?) { let showAvatars = UserDefaults.standard.showAuthorAvatars - let hiddenAvataruRL = showAvatars ? nil : message.from?.avatarURL + let hiddenAvataruRL = showAvatars ? nil : message.from?.avatarURLString var htmlContents: String? { guard let originalHTML = message.innerHTML else { return nil } let document = HTMLDocument(string: originalHTML) @@ -385,7 +386,19 @@ private struct RenderModel: StencilContextConvertible { document.embedVideos() return document.bodyElement?.innerHTML } - let visibleAvatarURL = showAvatars ? message.from?.avatarURL : nil + let visibleAvatarURL = showAvatars ? message.from?.avatarURLString : nil + + var customTitleHTML: String { + let html = message.from?.customTitleHTML + return html ?? "" + } + + var ipadPostsViewTemplate: Bool { + if UIDevice.current.userInterfaceIdiom == .pad { + return true + } + return false + } context = [ "fromUsername": message.fromUsername ?? "", @@ -394,11 +407,13 @@ private struct RenderModel: StencilContextConvertible { "messageID": message.messageID, "regdate": message.from?.regdate as Any, "regdateRaw": message.from?.regdateRaw as Any, + "customTitleHTML": message.from?.customTitleHTML as Any, "seen": message.seen, "sentDate": message.sentDate as Any, "sentDateRaw": message.sentDateRaw as Any, "showAvatars": showAvatars, "stylesheet": stylesheet as Any, - "visibleAvatarURL": visibleAvatarURL as Any] + "visibleAvatarURL": visibleAvatarURL as Any, + "ipadPostsViewTemplate": ipadPostsViewTemplate as Any] } } diff --git a/App/View Controllers/Posts/PostViewModel.swift b/App/View Controllers/Posts/PostViewModel.swift index 152a32de0..97cc055e1 100644 --- a/App/View Controllers/Posts/PostViewModel.swift +++ b/App/View Controllers/Posts/PostViewModel.swift @@ -37,17 +37,26 @@ struct PostRenderModel: StencilContextConvertible { } return true } + var showQuoteIcon: Bool { + if let tweaks = ForumTweaks(forumID: forumID) { + _ = massageHTML(post.innerHTML ?? "", isIgnored: post.ignored, forumID: forumID) + + print(tweaks) + return true + } + return false + } var showAvatars: Bool { return UserDefaults.standard.showAuthorAvatars } var hiddenAvatarURL: URL? { - return showAvatars ? nil : post.author?.avatarURL + return showAvatars ? nil : URL(string: post.author?.avatarURLString ?? "") } var htmlContents: String { return massageHTML(post.innerHTML ?? "", isIgnored: post.ignored, forumID: forumID) } - var visibleAvatarURL: URL? { - return showAvatars ? post.author?.avatarURL : nil + var visibleAvatarURL: String? { + return showAvatars ? post.author?.avatarURLString : nil } var customTitleHTML: String { let html = post.author?.customTitleHTML @@ -60,6 +69,7 @@ struct PostRenderModel: StencilContextConvertible { context = [ "accessibilityRoles": accessibilityRoles, "author": [ + "avatarURL": post.author?.avatarURLString as Any, "regdate": post.author?.regdate as Any, "regdateRaw": post.author?.regdateRaw as Any, "userID": post.author?.userID as Any, @@ -80,11 +90,12 @@ struct PostRenderModel: StencilContextConvertible { init(author: User, isOP: Bool, postDate: Date, postHTML: String) { context = [ "author": [ + "avatarURL": author.avatarURLString as Any, "regdate": author.regdate as Any, "userID": author.userID, "username": author.username as Any], "beenSeen": false, - "hiddenAvatarURL": (showAvatars ? author.avatarURL : nil) as Any, + "hiddenAvatarURL": (showAvatars ? author.avatarURLString : nil) as Any, "customTitleHTML": (enableCustomTitlePostLayout ? author.customTitleHTML : nil) as Any, "htmlContents": massageHTML(postHTML, isIgnored: false, forumID: ""), "postDate": postDate, @@ -92,7 +103,7 @@ struct PostRenderModel: StencilContextConvertible { "postID": "fake", "roles": (isOP ? "op " : "") + (author.authorClasses ?? ""), "showAvatars": showAvatars, - "visibleAvatarURL": (showAvatars ? author.avatarURL : nil) as Any] + "visibleAvatarURL": (showAvatars ? author.avatarURLString : nil) as Any] } } @@ -101,6 +112,7 @@ private func massageHTML(_ html: String, isIgnored: Bool, forumID: String) -> St document.removeSpoilerStylingAndEvents() document.removeEmptyEditedByParagraphs() document.addAttributeToTweetLinks() + document.addAttributeToTweetLinks() document.useHTML5VimeoPlayer() if let username = UserDefaults.standard.loggedInUsername { document.identifyQuotesCitingUser(named: username, shouldHighlight: true) @@ -113,6 +125,7 @@ private func massageHTML(_ html: String, isIgnored: Bool, forumID: String) -> St if isIgnored { document.markRevealIgnoredPostLink() } + document.addQuoteIcons() if (ForumTweaks(forumID: forumID)?.magicCake) == true { document.addMagicCakeCSS() } diff --git a/App/View Controllers/Posts/PostsPageRefreshArrowView.swift b/App/View Controllers/Posts/PostsPageRefreshArrowView.swift index 171c0cf64..fca370a74 100644 --- a/App/View Controllers/Posts/PostsPageRefreshArrowView.swift +++ b/App/View Controllers/Posts/PostsPageRefreshArrowView.swift @@ -15,6 +15,7 @@ final class PostsPageRefreshArrowView: UIView, PostsPageRefreshControlContent { init() { let image = UIImage(named: "arrowright")! + .withTintColor(Theme.defaultTheme()["expansionTintColor"]!) arrow = UIImageView(image: image) spinner = UIActivityIndicatorView(style: .large) diff --git a/App/View Controllers/Posts/PostsPageRefreshSpinnerView.swift b/App/View Controllers/Posts/PostsPageRefreshSpinnerView.swift index aab3bc0ff..05b03378d 100644 --- a/App/View Controllers/Posts/PostsPageRefreshSpinnerView.swift +++ b/App/View Controllers/Posts/PostsPageRefreshSpinnerView.swift @@ -3,20 +3,63 @@ // Copyright 2015 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app import UIKit +import Lottie final class PostsPageRefreshSpinnerView: UIView, PostsPageRefreshControlContent { - fileprivate let arrows: UIImageView + private var animationView: AnimationView? - init() { - arrows = UIImageView(image: UIImage(named: "pull-to-refresh")!) - super.init(frame: CGRect.zero) + init(theme: Theme) { + animationView = .init(name: "getout_vP3_120") + super.init(frame: .zero) + animationView!.frame = CGRect(x: 0, y: 0, width: 60, height: 60) + animationView!.contentMode = .scaleAspectFit + animationView!.respectAnimationFrameRate = true + animationView!.loopMode = .loop + animationView!.animationSpeed = 1 - arrows.translatesAutoresizingMaskIntoConstraints = false - addSubview(arrows) - arrows.topAnchor.constraint(equalTo: topAnchor).isActive = true - arrows.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true - arrows.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + let mainColor = ColorValueProvider(theme["getOutFrogColor"]!.lottieColorValue) + let clearColor = ColorValueProvider(UIColor.clear.lottieColorValue) + + let mainOutline = AnimationKeypath(keys: ["**", "Stroke 1", "**", "Color"]) + let nostrils = AnimationKeypath(keys: ["**", "Group 1", "**", "Color"]) + + let leftEye = AnimationKeypath(keys: ["**", "EyeA", "**", "Color"]) + let rightEye = AnimationKeypath(keys: ["**", "EyeB", "**", "Color"]) + + let pupilA = AnimationKeypath(keys: ["**", "PupilA", "**", "Color"]) + let pupilB = AnimationKeypath(keys: ["**", "PupilB", "**", "Color"]) + + if theme["keyboardAppearance"] == "Light" { + // outer eye stroke opaque in light mode + animationView!.setValueProvider(FloatValueProvider(100), keypath: AnimationKeypath(keys: ["**", "Outline", "**", "Opacity"])) + animationView!.setValueProvider(mainColor, keypath: pupilA) + animationView!.setValueProvider(mainColor, keypath: pupilB) + + // make eye whites invisible in light mode + animationView!.setValueProvider(clearColor, keypath: leftEye) + animationView!.setValueProvider(clearColor, keypath: rightEye) + } else { + // outer eye stroke invisible in dark mode + animationView!.setValueProvider(FloatValueProvider(0), keypath: AnimationKeypath(keys: ["**", "Outline", "**", "Opacity"])) + + // make eye whites opaque in dark mode theme + animationView!.setValueProvider(mainColor, keypath: leftEye) + animationView!.setValueProvider(mainColor, keypath: rightEye) + } + + animationView!.setValueProvider(mainColor, keypath: nostrils) + animationView!.setValueProvider(mainColor, keypath: mainOutline) + + animationView!.translatesAutoresizingMaskIntoConstraints = false + + addSubview(animationView!) + + animationView!.topAnchor.constraint(equalTo: topAnchor).isActive = true + animationView!.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + animationView!.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + animationView!.heightAnchor.constraint(equalToConstant: 60).isActive = true + animationView!.widthAnchor.constraint(equalToConstant: 60).isActive = true } required init?(coder: NSCoder) { @@ -24,65 +67,42 @@ final class PostsPageRefreshSpinnerView: UIView, PostsPageRefreshControlContent } private func transition(from oldState: PostsPageView.RefreshControlState, to newState: PostsPageView.RefreshControlState) { - switch (oldState, newState) { - case (.armed, .triggered): - rotateArrows(CGFloat(Double.pi / 2)) - - case (.refreshing, .refreshing): - break - case (_, .refreshing): - rotateArrowsForever() - - case (.armed, .armed): - break - case (_, .armed): - rotateArrows(0) - stopRotatingForever() - - case (.disabled, _), - (.ready, _), - (.armed, _), - (.awaitingScrollEnd, _), - (.triggered, _), - (.refreshing, _): - break - } - } - - private func rotateArrows(_ angle: CGFloat) { - UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: [], animations: { - self.arrowsRotation = angle - }, completion: nil) - } - - private var arrowsRotation: CGFloat = 0 { - didSet { - if arrowsRotation == 0 { - arrows.transform = CGAffineTransform.identity - } else { - arrows.transform = CGAffineTransform(rotationAngle: arrowsRotation) - } - } - } - - private func rotateArrowsForever() { - let existingAnimationKeys = arrows.layer.animationKeys() ?? [] - guard !existingAnimationKeys.contains(indefiniteRotationAnimationKey) else { - return - } - - let animation = CABasicAnimation(keyPath: "transform.rotation.z") - animation.fromValue = arrowsRotation - animation.toValue = arrowsRotation + (2 * CGFloat(Double.pi)) - animation.duration = 1 - animation.repeatCount = .infinity - arrows.layer.add(animation, forKey: indefiniteRotationAnimationKey) - arrowsRotation = 0 - } - - fileprivate func stopRotatingForever() { - arrows.layer.removeAnimation(forKey: indefiniteRotationAnimationKey) + switch (oldState, newState) { + case (_, .disabled): + animationView!.currentFrame = 0 + break + case (_, .ready), + (_, .awaitingScrollEnd): + animationView!.currentFrame = 0 + break + case (_, .armed(triggeredFraction: 0.0)): + animationView!.play(fromFrame: 50, toFrame: 0, loopMode: .playOnce) + break + case (.armed, .triggered): + animationView!.play(fromFrame: 0, toFrame: 50, loopMode: .playOnce) + if UserDefaults.standard.enableHaptics { + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + } + break + case (.refreshing, .refreshing): + break + case (_, .refreshing): + animationView!.play(fromFrame: 50, toFrame: 1000, loopMode: .playOnce) + if UserDefaults.standard.enableHaptics { + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + } + case (_, .armed): + break + case (.disabled, _), + (.ready, _), + (.armed, _), + (.awaitingScrollEnd, _), + (.triggered, _), + (.refreshing, _): + break + } + } // MARK: PostsPageRefreshControlContent diff --git a/App/View Controllers/Posts/PostsPageView.swift b/App/View Controllers/Posts/PostsPageView.swift index 20df41642..aa293589c 100644 --- a/App/View Controllers/Posts/PostsPageView.swift +++ b/App/View Controllers/Posts/PostsPageView.swift @@ -49,11 +49,24 @@ final class PostsPageView: UIView { refreshControl.translatesAutoresizingMaskIntoConstraints = false refreshControlContainer.addSubview(refreshControl) let containerMargins = refreshControlContainer.layoutMarginsGuide - NSLayoutConstraint.activate([ - refreshControl.leftAnchor.constraint(equalTo: containerMargins.leftAnchor), - containerMargins.rightAnchor.constraint(equalTo: refreshControl.rightAnchor), - refreshControl.topAnchor.constraint(equalTo: containerMargins.topAnchor), - containerMargins.bottomAnchor.constraint(equalTo: refreshControl.bottomAnchor)]) + + // arrow view is hidden behind the toolbar and revealed when pulled up + if refreshControl is PostsPageRefreshArrowView { + NSLayoutConstraint.activate([ + refreshControl.leftAnchor.constraint(equalTo: containerMargins.leftAnchor), + refreshControl.topAnchor.constraint(equalTo: containerMargins.topAnchor), + containerMargins.rightAnchor.constraint(equalTo: refreshControl.rightAnchor), + containerMargins.bottomAnchor.constraint(equalTo: refreshControl.bottomAnchor) + ]) + } + // spinner view is visible above the toolbar, before any scroll triggers occur + if refreshControl is PostsPageRefreshSpinnerView { + NSLayoutConstraint.activate([ + refreshControl.leftAnchor.constraint(equalTo: containerMargins.leftAnchor), + containerMargins.rightAnchor.constraint(equalTo: refreshControl.rightAnchor), + containerMargins.bottomAnchor.constraint(equalTo: refreshControl.bottomAnchor) + ]) + } refreshControl.state = refreshControlState } @@ -435,7 +448,7 @@ extension PostsPageView { targetScrollViewBoundsMaxY = (targetContentOffset?.y ?? scrollView.contentOffset.y) + scrollView.bounds.height } - static let closeEnoughToBottom: CGFloat = -50 + static let closeEnoughToBottom: CGFloat = -10 var visibleBottom: CGFloat { return targetScrollViewBoundsMaxY - effectiveContentHeight diff --git a/App/View Controllers/Posts/PostsPageViewController.swift b/App/View Controllers/Posts/PostsPageViewController.swift index f1edcae9b..4abe56170 100644 --- a/App/View Controllers/Posts/PostsPageViewController.swift +++ b/App/View Controllers/Posts/PostsPageViewController.swift @@ -8,6 +8,7 @@ import MobileCoreServices import MRProgress import PromiseKit import WebKit +import UIKit private let Log = Logger.get() @@ -409,17 +410,18 @@ final class PostsPageViewController: ViewController { } private lazy var settingsItem: UIBarButtonItem = { - let item = UIBarButtonItem(image: UIImage(named: "page-settings"), style: .plain, target: nil, action: nil) - item.accessibilityLabel = "Settings" - item.actionBlock = { [unowned self] (sender) in - let settings = PostsPageSettingsViewController() - self.present(settings, animated: true) - - if let popover = settings.popoverPresentationController { - popover.barButtonItem = sender + let button = UIBarButtonItem(image: UIImage(named: "page-settings"), style: .plain, target: nil, action: nil) + button.actionBlock = { [unowned self] (sender) in + let settings = PostsPageSettingsViewController() + self.present(settings, animated: true) + + if let popover = settings.popoverPresentationController { + popover.barButtonItem = sender + } } - } - return item + + button.accessibilityLabel = "Settings" + return button }() private lazy var backItem: UIBarButtonItem = { @@ -527,7 +529,7 @@ final class PostsPageViewController: ViewController { } } else { if !(postsView.refreshControl is PostsPageRefreshSpinnerView) { - postsView.refreshControl = PostsPageRefreshSpinnerView() + postsView.refreshControl = PostsPageRefreshSpinnerView(theme: theme) } } } else { @@ -551,6 +553,23 @@ final class PostsPageViewController: ViewController { currentPageItem.accessibilityLabel = nil } + let barAppearance = UIToolbarAppearance() + barAppearance.backgroundColor = theme["tabBarBackgroundColor"] + + // below lines prevent weird unwanted grey bar from appearing. can be confused with "hairline" border + barAppearance.shadowImage = nil + barAppearance.backgroundImage = nil + barAppearance.shadowColor = nil + + postsView.toolbar.standardAppearance = barAppearance + postsView.toolbar.compactAppearance = barAppearance + + if Theme.defaultTheme().roundedFonts { + currentPageItem.setTitleTextAttributes([.font: roundedFont(ofSize: 17, weight: .medium)], for: .normal) + } else { + currentPageItem.setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 17, weight: .medium)], for: .normal) + } + forwardItem.isEnabled = { switch page { case .specific(let pageNumber)?: @@ -1458,6 +1477,10 @@ final class PostsPageViewController: ViewController { postsView.themeDidChange(theme) + // this fixes the thread title color on theme mode change from within posts view + //TODO: may need to be done elsewhere, but it works from here only afaik + //navigationItem.titleLabel.textColor = theme["navigationBarTextColor"] + if postsView.loadingView != nil { postsView.loadingView = LoadingView.loadingViewWithTheme(theme) } @@ -1467,10 +1490,11 @@ final class PostsPageViewController: ViewController { override func viewDidLoad() { super.viewDidLoad() - + self.addBackButton() + definesPresentationContext = true /* - Laying this screen out used to be a challenge: there are bars on the top and bottom, and between our old deployment target and the latest SDK we spanned a few different schools of layout thought. This is probably not necessary anymore. But here was the plan: - + Laying this screen out is a challenge: there are bars on the top and bottom, and between our deployment target and the latest SDK we span a few different schools of layout thought. Here's the plan: + 1. Turn off all UIKit magic automated everything. We'll handle all scroll view content insets and safe area insets ourselves. 2. Set layout margins on `postsView` in lieu of the above. Layout margins are available on all iOS versions that Awful supports. @@ -1487,6 +1511,25 @@ final class PostsPageViewController: ViewController { backItem, .fixedSpace(spacer), currentPageItem, .fixedSpace(spacer), forwardItem, .flexibleSpace(), actionsItem] + // Fix tab bar having no background when scrolled to bottom on iOS 15. + let appearance = UIToolbarAppearance() + if (postsView.toolbar.isTranslucent) { + appearance.configureWithDefaultBackground() + } else { + appearance.configureWithOpaqueBackground() + } + appearance.backgroundColor = Theme.defaultTheme()["backgroundColor"]! + appearance.shadowImage = nil + appearance.shadowColor = nil + + postsView.toolbar.standardAppearance = appearance + postsView.toolbar.compactAppearance = appearance + + if #available(iOS 15.0, *) { + postsView.toolbar.scrollEdgeAppearance = appearance + postsView.toolbar.compactScrollEdgeAppearance = appearance + } + let longPress = UILongPressGestureRecognizer(target: self, action: #selector(didLongPressOnPostsView)) longPress.delegate = self postsView.renderView.addGestureRecognizer(longPress) @@ -1539,6 +1582,9 @@ final class PostsPageViewController: ViewController { override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() updatePostsViewLayoutMargins() + self.addBackButton() + // this fixes the thread title color on theme mode change from within posts view + navigationItem.titleLabel.text = title } override func viewSafeAreaInsetsDidChange() { @@ -1547,8 +1593,7 @@ final class PostsPageViewController: ViewController { } private func updatePostsViewLayoutMargins() { - // See commentary in `viewDidLoad()` about our layout strategy here. tl;dr layout margins were the highest-level approach available on all versions of iOS that Awful supported, so we'll use them exclusively to represent the safe area. Probably not necessary anymore. - postsView.layoutMargins = view.safeAreaInsets + postsView.layoutMargins = view.layoutMargins } override func viewDidAppear(_ animated: Bool) { @@ -1658,6 +1703,8 @@ extension PostsPageViewController: RenderViewDelegate { view.embedTweets() } + view.loadLottiePlayer() + webViewDidLoadOnce = true if jumpToLastPost { diff --git a/App/View Controllers/ProfileViewController.swift b/App/View Controllers/ProfileViewController.swift index d49dca1cf..831867324 100644 --- a/App/View Controllers/ProfileViewController.swift +++ b/App/View Controllers/ProfileViewController.swift @@ -235,7 +235,7 @@ private struct RenderModel: StencilContextConvertible { || !(profile.yahooName ?? "").isEmpty || profile.homepageURL != nil }() - avatarURL = profile.user.avatarURL + avatarURL = URL(string: profile.user.avatarURLString) customTitleHTML = { let html = profile.user.customTitleHTML return html == "
" ? nil : html diff --git a/App/View Controllers/Rap Sheet/RapSheetViewController.swift b/App/View Controllers/Rap Sheet/RapSheetViewController.swift index d8e2c4532..03b11aba2 100644 --- a/App/View Controllers/Rap Sheet/RapSheetViewController.swift +++ b/App/View Controllers/Rap Sheet/RapSheetViewController.swift @@ -35,8 +35,19 @@ final class RapSheetViewController: TableViewController { if user == nil { title = LocalizedString("lepers-colony.navbar-title") tabBarItem.title = LocalizedString("lepers-colony.tabbar-title") - tabBarItem.image = UIImage(named: "lepers") - tabBarItem.selectedImage = UIImage(named: "lepers-filled") + + if !Theme.defaultTheme().showRootTabBarLabel { + tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + tabBarItem.title = nil + } + + tabBarItem.image = UIImage(named: "lepers")! + .withTintColor(Theme.defaultTheme()["tabBarTintColor"]!) + .withRenderingMode(.alwaysTemplate) + + tabBarItem.selectedImage = UIImage(named: "lepers-filled")! + .withTintColor(Theme.defaultTheme()["tintColor"]!) + .withRenderingMode(.alwaysTemplate) } else { title = LocalizedString("rap-sheet.title") hidesBottomBarWhenPushed = true diff --git a/App/View Controllers/RootTabBarController.swift b/App/View Controllers/RootTabBarController.swift index 916c1c68e..4f21c03d3 100644 --- a/App/View Controllers/RootTabBarController.swift +++ b/App/View Controllers/RootTabBarController.swift @@ -35,6 +35,7 @@ final class RootTabBarController: UITabBarController, UITabBarControllerDelegate override func viewDidLoad() { super.viewDidLoad() + // tell our UITabBarController subclass to handle its own delegate methods self.delegate = self themeDidChange() } @@ -52,19 +53,31 @@ final class RootTabBarController: UITabBarController, UITabBarControllerDelegate tabBar.tintColor = theme["tintColor"] tabBar.topBorderColor = theme["bottomBarTopBorderColor"] + // Fix tab bar having no background when scrolled to bottom on iOS 15. + let appearance = UITabBarAppearance() + if (tabBar.isTranslucent) { + appearance.configureWithDefaultBackground() + } else { + appearance.configureWithOpaqueBackground() + } + appearance.backgroundColor = Theme.defaultTheme()["backgroundColor"]! + appearance.shadowImage = nil + appearance.shadowColor = nil + + let itemAppearance = UITabBarItemAppearance() + itemAppearance.selected.iconColor = Theme.defaultTheme()["tabBarIconSelectedColor"]! + itemAppearance.normal.iconColor = Theme.defaultTheme()["tabBarIconNormalColor"]! + + + appearance.inlineLayoutAppearance = itemAppearance + appearance.stackedLayoutAppearance = itemAppearance + appearance.compactInlineLayoutAppearance = itemAppearance + // tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + + tabBar.standardAppearance = appearance; + if #available(iOS 15.0, *) { - // Fix tab bar having no background when scrolled to bottom on iOS 15. - let appearance = UITabBarAppearance() - if (tabBar.isTranslucent) { - appearance.configureWithDefaultBackground() - } else { - appearance.configureWithOpaqueBackground() - } - - appearance.backgroundColor = theme["tabBarBackgroundColor"] - - tabBar.standardAppearance = appearance; - tabBar.scrollEdgeAppearance = tabBar.standardAppearance + tabBar.scrollEdgeAppearance = appearance } } } diff --git a/App/View Controllers/Settings/AppIconPickerCell.swift b/App/View Controllers/Settings/AppIconPickerCell.swift index 7b97f1195..9666fd851 100644 --- a/App/View Controllers/Settings/AppIconPickerCell.swift +++ b/App/View Controllers/Settings/AppIconPickerCell.swift @@ -62,12 +62,12 @@ final class AppIconPickerCell: UITableViewCell, UICollectionViewDataSource, UICo } } -private struct AppIcon: Equatable { +public struct AppIcon: Equatable { let filename: String let iconName: String } -private func findAppIcons() -> [AppIcon] { +public func findAppIcons() -> [AppIcon] { guard let icons = Bundle(for: AppIconPickerCell.self).object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any] else { Log.e("could not find CFBundleIcons in Info.plist") return [] diff --git a/App/View Controllers/Settings/SettingsViewController.swift b/App/View Controllers/Settings/SettingsViewController.swift index 36289a683..cc81a7125 100644 --- a/App/View Controllers/Settings/SettingsViewController.swift +++ b/App/View Controllers/Settings/SettingsViewController.swift @@ -16,8 +16,18 @@ final class SettingsViewController: TableViewController { title = "Settings" - tabBarItem.image = UIImage(named: "cog") - tabBarItem.selectedImage = UIImage(named: "cog-filled") + tabBarItem.title = nil + + tabBarItem.image = UIImage(named: "cog")! + .withTintColor(Theme.defaultTheme()["tabBarTintColor"]!) + .withRenderingMode(.alwaysTemplate) + + tabBarItem.selectedImage = UIImage(named: "cog-filled")! + .withTintColor(Theme.defaultTheme()["tintColor"]!) + .withRenderingMode(.alwaysTemplate) + + tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + } required init?(coder: NSCoder) { @@ -436,7 +446,7 @@ final class SettingsViewController: TableViewController { } header.configure( - avatarURL: loggedInUser?.avatarURL, + avatarURL: URL(string: loggedInUser?.avatarURLString ?? ""), horizontalPadding: tableView.separatorInset.left, textColor: theme["listTextColor"]) diff --git a/App/View Controllers/Thread Tags/ThreadTagPickerViewController.swift b/App/View Controllers/Thread Tags/ThreadTagPickerViewController.swift index 1de6f65ce..10e306369 100644 --- a/App/View Controllers/Thread Tags/ThreadTagPickerViewController.swift +++ b/App/View Controllers/Thread Tags/ThreadTagPickerViewController.swift @@ -129,8 +129,8 @@ final class ThreadTagPickerViewController: ViewController { private lazy var collectionView: UICollectionView = { let layout = ThreadTagPickerLayout() layout.itemSize = CGSize(width: 60, height: 60) - layout.minimumInteritemSpacing = 5 - layout.minimumLineSpacing = 5 + layout.minimumInteritemSpacing = 3 + layout.minimumLineSpacing = 3 let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.allowsMultipleSelection = true @@ -188,16 +188,22 @@ extension ThreadTagPickerViewController: UICollectionViewDataSource, UICollectio let cell = collectionView.dequeueReusableCell(withReuseIdentifier: secondaryCellID, for: indexPath as IndexPath) as! SecondaryThreadTagPickerCell cell.tagImageName = secondaryImageNames[indexPath.item] cell.titleTextColor = theme["tagPickerTextColor"] ?? .black + cell.layer.cornerRadius = 3 + cell.layer.masksToBounds = true return cell case .threadTag where indexPath.item == 0: let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath as IndexPath) as! ThreadTagPickerCell + cell.layer.cornerRadius = 3 + cell.layer.masksToBounds = true cell.configure(placeholder: firstTag) return cell case .threadTag: let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath as IndexPath) as! ThreadTagPickerCell cell.configure(tagImageName: imageNames[indexPath.item - 1]) + cell.layer.cornerRadius = 3 + cell.layer.masksToBounds = true return cell } } diff --git a/App/View Controllers/Threads/BookmarksTableViewController.swift b/App/View Controllers/Threads/BookmarksTableViewController.swift index 4b8d1b452..8df3f49fa 100644 --- a/App/View Controllers/Threads/BookmarksTableViewController.swift +++ b/App/View Controllers/Threads/BookmarksTableViewController.swift @@ -27,8 +27,22 @@ final class BookmarksTableViewController: TableViewController { title = LocalizedString("bookmarks.title") - tabBarItem.image = UIImage(named: "bookmarks") - tabBarItem.selectedImage = UIImage(named: "bookmarks-filled") + tabBarItem.image = UIImage(named: "forum-list")!.withRenderingMode(.alwaysTemplate) + tabBarItem.selectedImage = UIImage(named: "forum-list-filled")!.withRenderingMode(.alwaysTemplate) + + if !Theme.defaultTheme().showRootTabBarLabel { + tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) + tabBarItem.title = nil + } + + tabBarItem.image = UIImage(named: "bookmarks")! + .withTintColor(Theme.defaultTheme()["tabBarTintColor"]!) + .withRenderingMode(.alwaysTemplate) + + tabBarItem.selectedImage = UIImage(named: "bookmarks-filled")! + .withTintColor(Theme.defaultTheme()["tintColor"]!) + .withRenderingMode(.alwaysTemplate) + } deinit { diff --git a/App/View Controllers/Threads/ThreadListCell.swift b/App/View Controllers/Threads/ThreadListCell.swift index 87a6b8f7f..697dc532c 100644 --- a/App/View Controllers/Threads/ThreadListCell.swift +++ b/App/View Controllers/Threads/ThreadListCell.swift @@ -9,7 +9,7 @@ private let Log = Logger.get(level: .debug) final class ThreadListCell: UITableViewCell { private let pageCountLabel = UILabel() - private let pageIconView = PageIconView() + private let pageIconView = UIImageView() private let postInfoLabel = UILabel() private let ratingImageView = UIImageView() private let secondaryTagImageView = UIImageView() @@ -30,8 +30,8 @@ final class ThreadListCell: UITableViewCell { pageCountLabel.attributedText = viewModel.pageCount - pageIconView.borderColor = viewModel.pageIconColor + pageIconView.image = UIImage(named: "page")?.withTintColor(viewModel.pageIconColor) postInfoLabel.attributedText = viewModel.postInfo ratingImageView.image = viewModel.ratingImage @@ -110,6 +110,10 @@ final class ThreadListCell: UITableViewCell { tagImageView.frame = layout.tagImageFrame titleLabel.frame = layout.titleFrame unreadCountLabel.frame = layout.unreadCountFrame + + // spankykong + tagImageView.layer.masksToBounds = true + tagImageView.layer.cornerRadius = 3 } private struct Layout { @@ -223,7 +227,7 @@ final class ThreadListCell: UITableViewCell { let pageCountFont = viewModel.pageCount.attribute(.font, at: 0, effectiveRange: nil) as? UIFont ?? UIFont.systemFont(ofSize: 12) let pageIconHeight = pixelCeil(pageCountFont.capHeight) - let pageIconWidth = pageIconHeight * PageIconView.aspectRatio + let pageIconWidth = CGFloat(9) //pageIconHeight * PageIconView.aspectRatio pageIconFrame = CGRect( x: pageCountFrame.maxX + Layout.pageCountRightMargin, y: pageCountFrame.minY + pageCountFont.ascender - pageIconHeight, @@ -271,3 +275,21 @@ final class ThreadListCell: UITableViewCell { return Layout(width: width, viewModel: viewModel).titleFrame.minX } } + + +extension UIImage { + func mergeWith(topImage: UIImage) -> UIImage { + let bottomImage = self + + UIGraphicsBeginImageContextWithOptions(size, false, 0.0) + + let areaSize = CGRect(x: 0, y: 0, width: bottomImage.size.width, height: bottomImage.size.height) + bottomImage.draw(in: areaSize) + + topImage.draw(in: areaSize, blendMode: .normal, alpha: 1.0) + + let mergedImage = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext() + return mergedImage + } +} diff --git a/App/View Controllers/Threads/ThreadsTableViewController.swift b/App/View Controllers/Threads/ThreadsTableViewController.swift index c8db8b7b0..dbbf00082 100644 --- a/App/View Controllers/Threads/ThreadsTableViewController.swift +++ b/App/View Controllers/Threads/ThreadsTableViewController.swift @@ -106,6 +106,7 @@ final class ThreadsTableViewController: TableViewController, ComposeTextViewCont override func viewDidLoad() { super.viewDidLoad() + self.addBackButton() multiplexer.addDelegate(self) diff --git a/App/View Controllers/Threads/UIContextMenuConfiguration+ThreadListItem.swift b/App/View Controllers/Threads/UIContextMenuConfiguration+ThreadListItem.swift index 49e7f3a94..453014178 100644 --- a/App/View Controllers/Threads/UIContextMenuConfiguration+ThreadListItem.swift +++ b/App/View Controllers/Threads/UIContextMenuConfiguration+ThreadListItem.swift @@ -5,6 +5,7 @@ import AwfulCore import MRProgress import UIKit +import SwiftUI private let Log = Logger.get() @@ -22,7 +23,7 @@ extension UIContextMenuConfiguration { } var copyURL: UIMenuElement { UIAction( - title: NSLocalizedString("Copy URL", comment: ""), + title: NSLocalizedString("Copy Link", comment: ""), image: UIImage(named: "copy-url")!.withRenderingMode(.alwaysTemplate), handler: { action in let url = AwfulRoute.threadPage( @@ -43,11 +44,24 @@ extension UIContextMenuConfiguration { } var jumpToFirstPage: UIMenuElement { UIAction( - title: NSLocalizedString("Jump to First Page", comment: ""), + title: NSLocalizedString("First Page", comment: ""), image: UIImage(named: "jump-to-first-page")!.withRenderingMode(.alwaysTemplate), handler: { action in jump(to: .first) } ) } + var setBookmarkColor: UIMenuElement { + UIAction( + title: "Set color", + image: UIImage(named: "rainbow")!.withRenderingMode(.alwaysTemplate), + attributes: [], + handler: { action in + + let profile = UIHostingController(rootView: BookmarkColorPicker(thread: thread)) + presenter.present(profile, animated: true) + + } + ) + } var jumpToLastPage: UIMenuElement { UIAction( title: NSLocalizedString("Last Page", comment: ""), @@ -147,12 +161,13 @@ extension UIContextMenuConfiguration { UIMenu(children: [ jumpToFirstPage, jumpToLastPage, - toggleBookmark, profileAuthor, copyURL, copyTitle, markThreadRead, markThreadUnread, + setBookmarkColor, + toggleBookmark, ].compactMap { $0 }) }) } diff --git a/App/Views/BookmarkColorPicker.swift b/App/Views/BookmarkColorPicker.swift new file mode 100644 index 000000000..9b21afbee --- /dev/null +++ b/App/Views/BookmarkColorPicker.swift @@ -0,0 +1,282 @@ +// SetBookmarkColor.swift +// +// Copyright 2021 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app + +import SwiftUI +import AwfulCore + + +struct BookmarkColorPicker: View { + @SwiftUI.Environment(\.presentationMode) var presentationMode + + var thread: AwfulThread + + func containedView() -> String { + switch thread.starCategory { + case .orange: return Theme.defaultTheme()["unreadBadgeOrangeColor"]!.hexCode + case .red: return Theme.defaultTheme()["unreadBadgeRedColor"]!.hexCode + case .yellow: return Theme.defaultTheme()["unreadBadgeYellowColor"]!.hexCode + case .teal: return Theme.defaultTheme()["unreadBadgeTealColor"]!.hexCode + case .green: return Theme.defaultTheme()["unreadBadgeGreenColor"]!.hexCode + case .purple: return Theme.defaultTheme()["unreadBadgePurpleColor"]!.hexCode + case .none: return Theme.defaultTheme()["unreadBadgeBlueColor"]!.hexCode + } + } + + + var body: some View { + var selection = containedView() + + VStack { + + Text(thread.title!) + .foregroundColor(Color(hex: Theme.defaultTheme()["sheetTitleColor"]!)) + .font(.system(size: 16.0, weight: .regular, design: .rounded)) + .padding() + + HStack { + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgeRedColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + selection = Theme.defaultTheme()["unreadBadgeRedColor"]!.hexCode + + + _ = ForumsClient.shared.setBookmarkColor(thread, as: 1) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgeRedColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgeRedColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + + + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgeOrangeColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + _ = ForumsClient.shared.setBookmarkColor(thread, as: 0) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgeOrangeColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgeOrangeColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgeYellowColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + _ = ForumsClient.shared.setBookmarkColor(thread, as: 2) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgeYellowColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgeYellowColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgeGreenColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + _ = ForumsClient.shared.setBookmarkColor(thread, as: 4) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgeGreenColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgeGreenColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgeTealColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + _ = ForumsClient.shared.setBookmarkColor(thread, as: 3) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgeTealColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgeTealColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + + ZStack { + Circle() + .fill(Color(hex: Theme.defaultTheme()["unreadBadgePurpleColor"]!.hexCode)) + .frame(width: 30, height: 30) + .onTapGesture(perform: { + _ = ForumsClient.shared.setBookmarkColor(thread, as: 5) + .done { + _ = ForumsClient.shared.listBookmarkedThreads(page: 1) + self.presentationMode.wrappedValue.dismiss() + } + .catch { error in + print(error.localizedDescription) + } + }) + .padding(10) + + if selection == Theme.defaultTheme()["unreadBadgePurpleColor"]!.hexCode { + Circle() + .stroke(Color(hex: Theme.defaultTheme()["unreadBadgePurpleColor"]!.hexCode), lineWidth: 2) + .frame(width: 40, height: 40) + } + } + + } + + .frame( + minWidth: 0, + maxWidth: .infinity, + minHeight: 0, + maxHeight: .infinity, + alignment: .top + ) + .background(Color(hex: Theme.defaultTheme()["sheetBackgroundColor"]!).edgesIgnoringSafeArea(.all)) + } + .background(Color(hex: Theme.defaultTheme()["sheetBackgroundColor"]!).edgesIgnoringSafeArea(.all)) + } + +} + +extension Color { + init(hex string: String) { + var string: String = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + if string.hasPrefix("#") { + _ = string.removeFirst() + } + + // Double the last value if incomplete hex + if !string.count.isMultiple(of: 2), let last = string.last { + string.append(last) + } + + // Fix invalid values + if string.count > 8 { + string = String(string.prefix(8)) + } + + // Scanner creation + let scanner = Scanner(string: string) + + var color: UInt64 = 0 + scanner.scanHexInt64(&color) + + if string.count == 2 { + let mask = 0xFF + + let g = Int(color) & mask + + let gray = Double(g) / 255.0 + + self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: 1) + + } else if string.count == 4 { + let mask = 0x00FF + + let g = Int(color >> 8) & mask + let a = Int(color) & mask + + let gray = Double(g) / 255.0 + let alpha = Double(a) / 255.0 + + self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: alpha) + + } else if string.count == 6 { + let mask = 0x0000FF + let r = Int(color >> 16) & mask + let g = Int(color >> 8) & mask + let b = Int(color) & mask + + let red = Double(r) / 255.0 + let green = Double(g) / 255.0 + let blue = Double(b) / 255.0 + + self.init(.sRGB, red: red, green: green, blue: blue, opacity: 1) + + } else if string.count == 8 { + let mask = 0x000000FF + let r = Int(color >> 24) & mask + let g = Int(color >> 16) & mask + let b = Int(color >> 8) & mask + let a = Int(color) & mask + + let red = Double(r) / 255.0 + let green = Double(g) / 255.0 + let blue = Double(b) / 255.0 + let alpha = Double(a) / 255.0 + + self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha) + + } else { + self.init(.sRGB, red: 1, green: 1, blue: 1, opacity: 1) + } + } +} + +//struct BookmarkColorPicker_Previews: PreviewProvider { +// +// var thread: AwfulThread +// +// static var previews: some View { +// BookmarkColorPicker(thread: nil) +// } +//} diff --git a/App/Views/LoadingView.swift b/App/Views/LoadingView.swift index 46ac0160a..16d6259a2 100644 --- a/App/Views/LoadingView.swift +++ b/App/Views/LoadingView.swift @@ -4,6 +4,7 @@ import FLAnimatedImage import UIKit +import Lottie /// A view that covers its superview with an indeterminate progress indicator. class LoadingView: UIView { @@ -48,20 +49,38 @@ class LoadingView: UIView { } private class DefaultLoadingView: LoadingView { - lazy var spinner: SpriteSheetView = { - let image = UIImage(named: "v-throbber")! - let view = SpriteSheetView(spriteSheet: image, followsTheme: true) - view.frameRate = 30 - view.translatesAutoresizingMaskIntoConstraints = false - self.addSubview(view) + + override init(theme: Theme?) { + super.init(theme: theme) - NSLayoutConstraint.activate([ - self.centerXAnchor.constraint(equalTo: view.centerXAnchor), - self.centerYAnchor.constraint(equalTo: view.bottomAnchor), - ]) + let animationView: AnimationView = .init(name: "MainThrobberX120") + animationView.respectAnimationFrameRate = true + animationView.currentFrame = 0 + animationView.contentMode = .scaleAspectFit + animationView.animationSpeed = 1 + animationView.isOpaque = true + animationView.translatesAutoresizingMaskIntoConstraints = false - return view - }() + addSubview(animationView) + + animationView.widthAnchor.constraint(equalToConstant: 100).isActive = true + animationView.heightAnchor.constraint(equalToConstant: 100).isActive = true + animationView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true + animationView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true + + animationView.play(fromFrame: 0, toFrame: 50, loopMode: .playOnce, completion: { (finished) in + if finished { + // first animation complete! start second one and loop + animationView.play(fromFrame: 50, toFrame: 200, loopMode: .loop, completion: nil) + } else { + // animation cancelled + } + }) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } override func retheme() { super.retheme() @@ -72,11 +91,50 @@ private class DefaultLoadingView: LoadingView { fileprivate override func willMove(toSuperview newSuperview: UIView?) { super.willMove(toSuperview: newSuperview) - if newSuperview == nil { - spinner.stopAnimating() - } else { - spinner.startAnimating() + } +} + +class PostedTootLoadingView: LoadingView { + + override init(theme: Theme?) { + super.init(theme: theme) + + let animationView: AnimationView = .init(name: "TootX120") + animationView.respectAnimationFrameRate = true + animationView.currentFrame = 0 + animationView.contentMode = .scaleAspectFit + animationView.animationSpeed = 1 + animationView.isOpaque = true + animationView.translatesAutoresizingMaskIntoConstraints = false + + if Theme.defaultTheme()["keyboardAppearance"] == "Light" { + let backgroundColor = ColorValueProvider(Theme.defaultTheme()["backgroundColor"]!.lottieColorValue) + let stroke = AnimationKeypath(keys: ["**", "Stroke 1", "**", "Color"]) + let eyes = AnimationKeypath(keys: ["**", "Eye*", "**", "Color"]) + + animationView.setValueProvider(backgroundColor, keypath: stroke) + animationView.setValueProvider(backgroundColor, keypath: eyes) } + + addSubview(animationView) + + animationView.widthAnchor.constraint(equalToConstant: 100).isActive = true + animationView.heightAnchor.constraint(equalToConstant: 100).isActive = true + animationView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true + animationView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true + + animationView.play(fromFrame: 0, toFrame: 206, loopMode: .playOnce) + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func retheme() { + super.retheme() + + backgroundColor = theme?[color: "postsLoadingViewTintColor"] } } diff --git a/App/Views/NigglyRefreshLottieView.swift b/App/Views/NigglyRefreshLottieView.swift new file mode 100644 index 000000000..efa40f7c0 --- /dev/null +++ b/App/Views/NigglyRefreshLottieView.swift @@ -0,0 +1,95 @@ +// NigglyRefreshLottieView.swift +// +// Copyright 2021 Awful Contributors. CC BY-NC-SA 3.0 US https://github.com/Awful/Awful.app + +import PullToRefresh +import Lottie +import UIKit + +private let verticalMargin: CGFloat = 10 + +final class NigglyRefreshLottieView: UIView { + fileprivate var animationView: AnimationView? + + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + private func commonInit() { + animationView = .init(name: "niggly3x120") + + var theme: Theme { + return Theme.defaultTheme() + } + + animationView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40) + animationView!.translatesAutoresizingMaskIntoConstraints = true + animationView!.respectAnimationFrameRate = true + animationView!.contentMode = .scaleAspectFit + animationView!.loopMode = .loop + animationView!.animationSpeed = 1 + + addSubview(animationView!) + + backgroundColor = Theme.defaultTheme()["backgroundColor"]! + + NSLayoutConstraint.activate([ + animationView!.centerXAnchor.constraint(equalTo: centerXAnchor), + animationView!.centerYAnchor.constraint(equalTo: centerYAnchor)]) + } + + override func layoutSubviews() { + let gray = ColorValueProvider(Theme.defaultTheme()["nigglyColor"]!.lottieColorValue) + let mainOutline = AnimationKeypath(keys: ["**", "**", "**", "Color"]) + + animationView!.setValueProvider(gray, keypath: mainOutline) + animationView!.center = CGPoint(x: bounds.midX, y: bounds.midY) + } + + override var intrinsicContentSize: CGSize { + let spriteSheetSize = animationView!.intrinsicContentSize + let margin: CGFloat = 6 + return CGSize(width: UIView.noIntrinsicMetric, height: spriteSheetSize.height + (margin * 2)) + } + + func startAnimating() { + animationView!.play() + } + + func stopAnimating() { + animationView!.stop() + } +} + +extension NigglyRefreshLottieView { + final class RefreshAnimator: RefreshViewAnimator { + private let view: NigglyRefreshLottieView + + init(view: NigglyRefreshLottieView) { + self.view = view + } + + func animate(_ state: State) { + switch state { + case .initial: + view.animationView?.play() + view.animationView?.pause() + + case .releasing(let progress) where progress < 1: + view.animationView?.pause() + + case .loading, .releasing: + view.animationView?.play() + + case .finished: + view.animationView?.stop() + } + } + } +} diff --git a/App/Views/RenderView.swift b/App/Views/RenderView.swift index 6264e5076..7be6a1adf 100644 --- a/App/Views/RenderView.swift +++ b/App/Views/RenderView.swift @@ -277,6 +277,14 @@ extension RenderView { } } + func loadLottiePlayer() { + webView.evaluateJavaScript("if (window.Awful) Awful.loadLotties()") { rawResult, error in + if let error = error { + self.mentionError(error, explanation: "could not evaluate loadLotties") + } + } + } + /// iOS 15 and transparent webviews = dark "missing" scroll thumbs, regardless of settings applied /// webview must be transparent to prevent white flashes during content refreshes. setting opaque to true in viewDidAppear helped, but still sometimes produced white flashes. /// instead, we toggle the webview to opaque while it's being scrolled and return it to transparent seconds after diff --git a/Awful.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Awful.xcworkspace/xcshareddata/swiftpm/Package.resolved index 078ae94c2..ecb081d91 100644 --- a/Awful.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Awful.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -19,6 +19,15 @@ "version": "2.2.0" } }, + { + "package": "Lottie", + "repositoryURL": "https://github.com/airbnb/lottie-ios.git", + "state": { + "branch": null, + "revision": "4a6058cbbdfe4f74aeae92c8bd51ad3b0de2a1ee", + "version": "3.3.0" + } + }, { "package": "Nuke", "repositoryURL": "https://github.com/kean/Nuke", diff --git a/AwfulCore/Sources/AwfulCore/Model/Awful.xcdatamodeld/Awful 6.1.xcdatamodel/contents b/AwfulCore/Sources/AwfulCore/Model/Awful.xcdatamodeld/Awful 6.1.xcdatamodel/contents index 437f43273..80511902a 100644 --- a/AwfulCore/Sources/AwfulCore/Model/Awful.xcdatamodeld/Awful 6.1.xcdatamodel/contents +++ b/AwfulCore/Sources/AwfulCore/Model/Awful.xcdatamodeld/Awful 6.1.xcdatamodel/contents @@ -165,6 +165,7 @@ + diff --git a/AwfulCore/Sources/AwfulCore/Model/User.swift b/AwfulCore/Sources/AwfulCore/Model/User.swift index 888d40837..9d19071d3 100644 --- a/AwfulCore/Sources/AwfulCore/Model/User.swift +++ b/AwfulCore/Sources/AwfulCore/Model/User.swift @@ -26,28 +26,13 @@ public class User: AwfulManagedObject, Managed { @NSManaged var sentPrivateMessages: Set /* via from */ @NSManaged var threadFilters: Set @NSManaged var threads: Set + @NSManaged public var avatarURLString: String public override var objectKey: UserKey { .init(userID: userID, username: username) } } -extension User { - public var avatarURL: URL? { - return customTitleHTML.flatMap(extractAvatarURL) - } -} - -// TODO: this is very stupid, just handle it during scraping -public func extractAvatarURL(fromCustomTitleHTML customTitleHTML: String) -> URL? { - let document = HTMLDocument(string: customTitleHTML) - let img = document.firstNode(matchingSelector: "div > img:first-child") ?? - document.firstNode(matchingSelector: "body > img:first-child") ?? - document.firstNode(matchingSelector: "a > img:first-child") - - let src = img?["data-cfsrc"] ?? img?["src"] - return src.flatMap { URL(string: $0) } -} @objc(UserKey) public final class UserKey: AwfulObjectKey { diff --git a/AwfulCore/Sources/AwfulCore/Networking/ForumsClient.swift b/AwfulCore/Sources/AwfulCore/Networking/ForumsClient.swift index ec407f658..65c00990b 100644 --- a/AwfulCore/Sources/AwfulCore/Networking/ForumsClient.swift +++ b/AwfulCore/Sources/AwfulCore/Networking/ForumsClient.swift @@ -330,6 +330,29 @@ public final class ForumsClient { .promise.asVoid() } + public func setBookmarkColor(_ thread: AwfulThread, as rating: Int) -> Promise { + guard let mainContext = managedObjectContext else { + return Promise(error: PromiseError.missingManagedObjectContext) + } + + // we can set the bookmark color by sending a "category_id" parameter with an "add" action + let parameters: KeyValuePairs = [ + "threadid": thread.threadID, + "action": "add", + "category_id": "\(rating)", + "json": "1", + ] + + return fetch(method: .post, urlString: "bookmarkthreads.php", parameters: parameters) + .promise + .map(on: mainContext) { response, context in + if thread.bookmarkListPage <= 0 { + thread.bookmarkListPage = 1 + } + try context.save() + } + } + public func markThreadAsSeenUpTo(_ post: Post) -> Promise { guard let threadID = post.thread?.threadID else { assertionFailure("post needs a thread ID") diff --git a/AwfulCore/Sources/AwfulCore/Persistence/AuthorPersistence.swift b/AwfulCore/Sources/AwfulCore/Persistence/AuthorPersistence.swift index 29975dbe8..25ce86aaf 100644 --- a/AwfulCore/Sources/AwfulCore/Persistence/AuthorPersistence.swift +++ b/AwfulCore/Sources/AwfulCore/Persistence/AuthorPersistence.swift @@ -10,6 +10,7 @@ internal extension AuthorSidebarScrapeResult { if customTitle != user.customTitleHTML { user.customTitleHTML = customTitle } if isModerator != user.moderator { user.moderator = isModerator } if let regdate = regdate, user.regdate != regdate { user.regdate = regdate } + if avatarURLString != user.avatarURLString { user.avatarURLString = avatarURLString } if let regdateRaw = regdateRaw, user.regdateRaw != regdateRaw { user.regdateRaw = regdateRaw } if userID.rawValue != user.userID { user.userID = userID.rawValue } if !username.isEmpty, username != user.username { user.username = username } diff --git a/AwfulCore/Sources/AwfulCore/Persistence/PostPersistence.swift b/AwfulCore/Sources/AwfulCore/Persistence/PostPersistence.swift index 8269d6c27..3eb5ad50f 100644 --- a/AwfulCore/Sources/AwfulCore/Persistence/PostPersistence.swift +++ b/AwfulCore/Sources/AwfulCore/Persistence/PostPersistence.swift @@ -21,7 +21,7 @@ internal extension PostScrapeResult { } } -internal extension PostsPageScrapeResult { +public extension PostsPageScrapeResult { func upsert(into context: NSManagedObjectContext) throws -> [Post] { let forum: Forum? = { if @@ -192,6 +192,8 @@ internal extension ShowPostScrapeResult { matching: .init("\(\AwfulThread.threadID) = \(id.rawValue)"), configure: { $0.threadID = id.rawValue }) + if !threadTitle.isEmpty, threadTitle != thread.title { thread.title = threadTitle } + return thread } diff --git a/AwfulCore/Sources/AwfulCore/Scraping/AuthorSidebarScrapeResult.swift b/AwfulCore/Sources/AwfulCore/Scraping/AuthorSidebarScrapeResult.swift index 42f2c6353..408fbec77 100644 --- a/AwfulCore/Sources/AwfulCore/Scraping/AuthorSidebarScrapeResult.swift +++ b/AwfulCore/Sources/AwfulCore/Scraping/AuthorSidebarScrapeResult.swift @@ -8,6 +8,7 @@ import HTMLReader /// Scrapes the sidebar with author info that appears alongside posts, private messages, and user profiles. public struct AuthorSidebarScrapeResult: ScrapeResult { public let additionalAuthorClasses: Set + public let avatarURLString: String public let customTitle: RawHTML public let isAdministrator: Bool public let isModerator: Bool @@ -62,7 +63,10 @@ public struct AuthorSidebarScrapeResult: ScrapeResult { regdateRaw = html .firstNode(matchingSelector: "dd.registered")?.textContent ?? "" - customTitle = scrapeCustomTitle(html) ?? "" + avatarURLString = scrapeAvatarURLString(html) + + customTitle = scrapeCustomTitle(html, avatarURLString) ?? "" + } } diff --git a/AwfulCore/Sources/AwfulCore/Scraping/Helpers.swift b/AwfulCore/Sources/AwfulCore/Scraping/Helpers.swift index b8537141d..be32732df 100644 --- a/AwfulCore/Sources/AwfulCore/Scraping/Helpers.swift +++ b/AwfulCore/Sources/AwfulCore/Scraping/Helpers.swift @@ -92,17 +92,25 @@ extension Scanner { } } +func scrapeAvatarURLString(_ html: HTMLNode) -> String { + guard + let avatarNode = html.firstNode(matchingSelector: "dl.userinfo dd.title img:first-child") else { return "" } -func scrapeCustomTitle(_ html: HTMLNode) -> RawHTML? { - func isSuperfluousLineBreak(_ node: HTMLNode) -> Bool { - guard let element = node as? HTMLElement else { return false } - return element.tagName == "br" && element.hasClass("pb") - } + let src = avatarNode["data-cfsrc"] ?? avatarNode["src"] + + return src ?? "" +} +func scrapeCustomTitle(_ html: HTMLNode, _ avatarURLString: String) -> RawHTML? { + for br in html.nodes(matchingSelector: "dl.userinfo dd.title img:first-child ~ br") { + br.removeFromParentNode() + } + for img in html.nodes(matchingSelector: "dl.userinfo dd.title img:first-child") { + img.removeFromParentNode() + } return html .firstNode(matchingSelector: "dl.userinfo dd.title") .flatMap { $0.children.array as? [HTMLNode] }? - .filter { !isSuperfluousLineBreak($0) } .map { $0.serializedFragment } .joined() } diff --git a/Xcode/Awful.xcodeproj/project.pbxproj b/Xcode/Awful.xcodeproj/project.pbxproj index a6012dcd8..fe5e58855 100644 --- a/Xcode/Awful.xcodeproj/project.pbxproj +++ b/Xcode/Awful.xcodeproj/project.pbxproj @@ -58,8 +58,6 @@ 1C16FC141CCEE60C00C88BD1 /* MessageComposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C16FC131CCEE60C00C88BD1 /* MessageComposeViewController.swift */; }; 1C16FC181CD1848400C88BD1 /* ComposeTextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C16FC171CD1848400C88BD1 /* ComposeTextViewController.swift */; }; 1C16FC1A1CD42EB300C88BD1 /* PostPreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C16FC191CD42EB300C88BD1 /* PostPreviewViewController.swift */; }; - 1C1BD0B32320C98400805208 /* platinum-member-white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C1BD0B12320C98400805208 /* platinum-member-white@2x.png */; }; - 1C1BD0B42320C98400805208 /* platinum-member-white@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C1BD0B22320C98400805208 /* platinum-member-white@3x.png */; }; 1C1BF9C219AB9E6200E8FBBC /* InAppActionSheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1C1BF9C119AB9E6200E8FBBC /* InAppActionSheet.xib */; }; 1C1F8A2D2664BDF4003EA62C /* Smilies in Frameworks */ = {isa = PBXBuildFile; productRef = 1C1F8A2C2664BDF4003EA62C /* Smilies */; }; 1C23C7051A7AB8940089BD5C /* SlopButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C23C7041A7AB8940089BD5C /* SlopButton.swift */; }; @@ -234,20 +232,34 @@ 1CF6786B201E751D009A9640 /* MessageListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF6786A201E751D009A9640 /* MessageListDataSource.swift */; }; 1CF6786E201E8F45009A9640 /* MessageListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF6786D201E8F45009A9640 /* MessageListCell.swift */; }; 1CFC996A1BD3F402001180A7 /* PostsPageRefreshArrowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CFC99691BD3F402001180A7 /* PostsPageRefreshArrowView.swift */; }; + 2D0BB35B27F443A700242D2A /* Lotties2 in Resources */ = {isa = PBXBuildFile; fileRef = 2D0BB35A27F443A700242D2A /* Lotties2 */; }; + 2D0BB36D27F4525600242D2A /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 2D0BB36C27F4525600242D2A /* Lottie */; }; 2D0BB37427F453B600242D2A /* ChidoriMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0BB37027F453B600242D2A /* ChidoriMenu.swift */; }; 2D0BB37527F453B600242D2A /* ChidoriPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0BB37127F453B600242D2A /* ChidoriPresentationController.swift */; }; 2D0BB37627F453B600242D2A /* ChidoriMenuTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0BB37227F453B600242D2A /* ChidoriMenuTableViewCell.swift */; }; 2D0BB37727F453B600242D2A /* ChidoriAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0BB37327F453B600242D2A /* ChidoriAnimationController.swift */; }; + 2D1B3BF5281157830022B1D2 /* NigglyRefreshLottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1B3BF4281157830022B1D2 /* NigglyRefreshLottieView.swift */; }; + 2D327DD627F468CE00D21AB0 /* BookmarkColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D327DD527F468CE00D21AB0 /* BookmarkColorPicker.swift */; }; + 2D327DDD27F46DE600D21AB0 /* platinum-member.png in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DDC27F46DE600D21AB0 /* platinum-member.png */; }; + 2D327DDF27F46DFD00D21AB0 /* ghost.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DDE27F46DFD00D21AB0 /* ghost.json */; }; + 2D327DEB27F4713300D21AB0 /* GhostAnim.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE127F4713200D21AB0 /* GhostAnim.json */; }; + 2D327DEC27F4713300D21AB0 /* getout_vP_120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE227F4713200D21AB0 /* getout_vP_120.json */; }; + 2D327DED27F4713300D21AB0 /* getout_vZ_120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE327F4713200D21AB0 /* getout_vZ_120.json */; }; + 2D327DEE27F4713300D21AB0 /* getout_vP3_120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE427F4713200D21AB0 /* getout_vP3_120.json */; }; + 2D327DEF27F4713300D21AB0 /* MainThrobberX120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE527F4713200D21AB0 /* MainThrobberX120.json */; }; + 2D327DF027F4713300D21AB0 /* niggly120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE627F4713200D21AB0 /* niggly120.json */; }; + 2D327DF127F4713300D21AB0 /* TootX120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE727F4713200D21AB0 /* TootX120.json */; }; + 2D327DF227F4713300D21AB0 /* getout_vP2_120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE827F4713300D21AB0 /* getout_vP2_120.json */; }; + 2D327DF327F4713300D21AB0 /* niggly3x120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DE927F4713300D21AB0 /* niggly3x120.json */; }; + 2D327DF427F4713300D21AB0 /* getout_v3_120.json in Resources */ = {isa = PBXBuildFile; fileRef = 2D327DEA27F4713300D21AB0 /* getout_v3_120.json */; }; 2DD8209C25DDD9BF0015A90D /* CopyImageActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD8209B25DDD9BF0015A90D /* CopyImageActivity.swift */; }; + 2DE12C16284C9719007FD9A4 /* posts-view-spankykong-oled-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = 2DE12C14284C9719007FD9A4 /* posts-view-spankykong-oled-dark.css */; }; + 2DE12C17284C9719007FD9A4 /* posts-view-spankykong-light.css in Resources */ = {isa = PBXBuildFile; fileRef = 2DE12C15284C9719007FD9A4 /* posts-view-spankykong-light.css */; }; 7B0EA0B81D96B17B008B0A90 /* SettingsSliderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EA0B71D96B17B008B0A90 /* SettingsSliderCell.swift */; }; 7B0EA0BA1D96BF82008B0A90 /* SettingsSliderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B0EA0B91D96BF82008B0A90 /* SettingsSliderCell.xib */; }; 7B1FF1291F76C3A3000B64DA /* AppIconPickerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1FF1271F76C3A3000B64DA /* AppIconPickerCell.swift */; }; 7B1FF12A1F76C3A3000B64DA /* AppIconPickerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B1FF1281F76C3A3000B64DA /* AppIconPickerCell.xib */; }; 7B1FF12C1F76E690000B64DA /* AppIconPickerCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1FF12B1F76E690000B64DA /* AppIconPickerCollectionViewLayout.swift */; }; - 7B502E261F2513B400B1B305 /* post-dots@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7B502E251F25139600B1B305 /* post-dots@2x.png */; }; - 7B502E271F2513B400B1B305 /* post-dots@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7B502E241F25139600B1B305 /* post-dots@3x.png */; }; - 7B502E2C1F25140F00B1B305 /* platinum-member@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7B502E2A1F25140200B1B305 /* platinum-member@2x.png */; }; - 7B502E2D1F25140F00B1B305 /* platinum-member@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7B502E2B1F25140200B1B305 /* platinum-member@3x.png */; }; 7B82D6671F7809E3002291C7 /* AppIconCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B82D6651F7809E3002291C7 /* AppIconCell.swift */; }; 7B82D6681F7809E3002291C7 /* AppIconCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B82D6661F7809E3002291C7 /* AppIconCell.xib */; }; 83410EF219A582B8002CD019 /* DateFormatters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83410EF119A582B8002CD019 /* DateFormatters.swift */; }; @@ -414,8 +426,6 @@ 1C16FC131CCEE60C00C88BD1 /* MessageComposeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageComposeViewController.swift; sourceTree = ""; }; 1C16FC171CD1848400C88BD1 /* ComposeTextViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeTextViewController.swift; sourceTree = ""; }; 1C16FC191CD42EB300C88BD1 /* PostPreviewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostPreviewViewController.swift; sourceTree = ""; }; - 1C1BD0B12320C98400805208 /* platinum-member-white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "platinum-member-white@2x.png"; sourceTree = ""; }; - 1C1BD0B22320C98400805208 /* platinum-member-white@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "platinum-member-white@3x.png"; sourceTree = ""; }; 1C1BF9C119AB9E6200E8FBBC /* InAppActionSheet.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InAppActionSheet.xib; sourceTree = ""; }; 1C23C7041A7AB8940089BD5C /* SlopButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlopButton.swift; sourceTree = ""; }; 1C2434D81A4190F300DC8EA4 /* DraftStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DraftStore.swift; sourceTree = ""; }; @@ -608,11 +618,28 @@ 253A5104248FE92D0D619212 /* Pods-Awful-AwfulTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Awful-AwfulTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-Awful-AwfulTests/Pods-Awful-AwfulTests.release.xcconfig"; sourceTree = ""; }; 27F783E9D241CF6339BFCF0B /* Pods_CoreTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CoreTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2D0BB35827F440AF00242D2A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2D0BB35A27F443A700242D2A /* Lotties2 */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Lotties2; sourceTree = ""; }; 2D0BB37027F453B600242D2A /* ChidoriMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChidoriMenu.swift; sourceTree = ""; }; 2D0BB37127F453B600242D2A /* ChidoriPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChidoriPresentationController.swift; sourceTree = ""; }; 2D0BB37227F453B600242D2A /* ChidoriMenuTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChidoriMenuTableViewCell.swift; sourceTree = ""; }; 2D0BB37327F453B600242D2A /* ChidoriAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChidoriAnimationController.swift; sourceTree = ""; }; + 2D1B3BF4281157830022B1D2 /* NigglyRefreshLottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NigglyRefreshLottieView.swift; sourceTree = ""; }; + 2D327DD527F468CE00D21AB0 /* BookmarkColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkColorPicker.swift; sourceTree = ""; }; + 2D327DDC27F46DE600D21AB0 /* platinum-member.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "platinum-member.png"; sourceTree = ""; }; + 2D327DDE27F46DFD00D21AB0 /* ghost.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = ghost.json; sourceTree = ""; }; + 2D327DE127F4713200D21AB0 /* GhostAnim.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = GhostAnim.json; sourceTree = ""; }; + 2D327DE227F4713200D21AB0 /* getout_vP_120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = getout_vP_120.json; sourceTree = ""; }; + 2D327DE327F4713200D21AB0 /* getout_vZ_120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = getout_vZ_120.json; sourceTree = ""; }; + 2D327DE427F4713200D21AB0 /* getout_vP3_120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = getout_vP3_120.json; sourceTree = ""; }; + 2D327DE527F4713200D21AB0 /* MainThrobberX120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = MainThrobberX120.json; sourceTree = ""; }; + 2D327DE627F4713200D21AB0 /* niggly120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = niggly120.json; sourceTree = ""; }; + 2D327DE727F4713200D21AB0 /* TootX120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = TootX120.json; sourceTree = ""; }; + 2D327DE827F4713300D21AB0 /* getout_vP2_120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = getout_vP2_120.json; sourceTree = ""; }; + 2D327DE927F4713300D21AB0 /* niggly3x120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = niggly3x120.json; sourceTree = ""; }; + 2D327DEA27F4713300D21AB0 /* getout_v3_120.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = getout_v3_120.json; sourceTree = ""; }; 2DD8209B25DDD9BF0015A90D /* CopyImageActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CopyImageActivity.swift; sourceTree = ""; }; + 2DE12C14284C9719007FD9A4 /* posts-view-spankykong-oled-dark.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "posts-view-spankykong-oled-dark.css"; sourceTree = ""; }; + 2DE12C15284C9719007FD9A4 /* posts-view-spankykong-light.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "posts-view-spankykong-light.css"; sourceTree = ""; }; 3DEC84CD16F06A21949AA42D /* Pods-Awful.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Awful.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-Awful/Pods-Awful.debug.xcconfig"; sourceTree = ""; }; 68A40BB24850D9A942D1E270 /* Pods_Awful.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Awful.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74067F2D002D797BC328EF39 /* Pods_AwfulTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AwfulTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -621,10 +648,6 @@ 7B1FF1271F76C3A3000B64DA /* AppIconPickerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconPickerCell.swift; sourceTree = ""; }; 7B1FF1281F76C3A3000B64DA /* AppIconPickerCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AppIconPickerCell.xib; sourceTree = ""; }; 7B1FF12B1F76E690000B64DA /* AppIconPickerCollectionViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconPickerCollectionViewLayout.swift; sourceTree = ""; }; - 7B502E241F25139600B1B305 /* post-dots@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "post-dots@3x.png"; sourceTree = ""; }; - 7B502E251F25139600B1B305 /* post-dots@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "post-dots@2x.png"; sourceTree = ""; }; - 7B502E2A1F25140200B1B305 /* platinum-member@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "platinum-member@2x.png"; sourceTree = ""; }; - 7B502E2B1F25140200B1B305 /* platinum-member@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "platinum-member@3x.png"; sourceTree = ""; }; 7B82D6651F7809E3002291C7 /* AppIconCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconCell.swift; sourceTree = ""; }; 7B82D6661F7809E3002291C7 /* AppIconCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AppIconCell.xib; sourceTree = ""; }; 83410EF119A582B8002CD019 /* DateFormatters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateFormatters.swift; sourceTree = ""; }; @@ -715,6 +738,7 @@ 1CD72E79265CA0D500FF3BF4 /* AwfulCore in Frameworks */, 1C5C2B8D22D195BF00EA5A80 /* ImgurAnonymousAPI in Frameworks */, 1C725A8926E71C6D009713DC /* MRProgress in Frameworks */, + 2D0BB36D27F4525600242D2A /* Lottie in Frameworks */, D5035BC16B0E9C1817003AF2 /* Pods_Awful.framework in Frameworks */, 1C47122A2664CB8000E5AA74 /* Smilies in Frameworks */, 1C6BDD24265CB31E005475CE /* Logger in Frameworks */, @@ -1264,6 +1288,7 @@ 1CD33EDB16F397FC0059587E /* Posts View Theming */ = { isa = PBXGroup; children = ( + 2D327DDC27F46DE600D21AB0 /* platinum-member.png */, 8FC356EE2132F5C1006EE1A5 /* amberpos-ins.gif */, 8C8FA47719AD7CA300B67AAA /* award.png */, 8C8FA47819AD7CA300B67AAA /* diamond-icon.png */, @@ -1278,13 +1303,7 @@ 8C483FC116852E5D00D02482 /* macinyos-loading@2x.png */, 8CEBABEC16800A9300680935 /* macinyos-postactions-bg.png */, 8CEBABEA168000B800680935 /* macinyos-wallpaper@2x.png */, - 1C1BD0B12320C98400805208 /* platinum-member-white@2x.png */, - 1C1BD0B22320C98400805208 /* platinum-member-white@3x.png */, - 7B502E2A1F25140200B1B305 /* platinum-member@2x.png */, - 7B502E2B1F25140200B1B305 /* platinum-member@3x.png */, 1C397CA81BCC473A00CA7FD5 /* post-dots.png */, - 7B502E251F25139600B1B305 /* post-dots@2x.png */, - 7B502E241F25139600B1B305 /* post-dots@3x.png */, 1C29BD522251208200E1217A /* quote-post.png */, 8C8FA47C19AD7CA300B67AAA /* redpill.png */, 8CEB405B16877E1600BFA9A8 /* winpos95-heading-left-seen.png */, @@ -1292,6 +1311,7 @@ 8C299D7016877AE9001B9D96 /* winpos95-heading-right.png */, 8CEB405816877D2A00BFA9A8 /* winpos95-heading-seen.png */, 8C299D7116877AE9001B9D96 /* winpos95-heading.png */, + 2D327DDE27F46DFD00D21AB0 /* ghost.json */, ); name = "Posts View Theming"; path = Theming; @@ -1312,6 +1332,8 @@ 1C5B9C3417F20BB800D4981D /* posts-view-gas-chamber.css */, 1C5B9C3517F20BB800D4981D /* posts-view-macinyos.css */, 1C29BD502251203400E1217A /* posts-view-oled-dark.css */, + 2DE12C14284C9719007FD9A4 /* posts-view-spankykong-oled-dark.css */, + 2DE12C15284C9719007FD9A4 /* posts-view-spankykong-light.css */, 1C5B9C3617F20BB800D4981D /* posts-view-winpos95.css */, 1C5B9C3717F20BB800D4981D /* posts-view-yospos.css */, 1C40E5B11640FC2C004AAFA6 /* posts-view.css */, @@ -1352,6 +1374,8 @@ 1C23C7041A7AB8940089BD5C /* SlopButton.swift */, 1C353C061E416FE200CCBA51 /* SpriteSheetView.swift */, 1C16FBBF1CB950BE00C88BD1 /* ThreadTagButton.swift */, + 2D327DD527F468CE00D21AB0 /* BookmarkColorPicker.swift */, + 2D1B3BF4281157830022B1D2 /* NigglyRefreshLottieView.swift */, ); path = Views; sourceTree = ""; @@ -1387,9 +1411,28 @@ path = ..; sourceTree = ""; }; + 2D327DE027F4710E00D21AB0 /* Lotties */ = { + isa = PBXGroup; + children = ( + 2D327DEA27F4713300D21AB0 /* getout_v3_120.json */, + 2D327DE227F4713200D21AB0 /* getout_vP_120.json */, + 2D327DE827F4713300D21AB0 /* getout_vP2_120.json */, + 2D327DE427F4713200D21AB0 /* getout_vP3_120.json */, + 2D327DE327F4713200D21AB0 /* getout_vZ_120.json */, + 2D327DE127F4713200D21AB0 /* GhostAnim.json */, + 2D327DE527F4713200D21AB0 /* MainThrobberX120.json */, + 2D327DE927F4713300D21AB0 /* niggly3x120.json */, + 2D327DE627F4713200D21AB0 /* niggly120.json */, + 2D327DE727F4713200D21AB0 /* TootX120.json */, + ); + path = Lotties; + sourceTree = ""; + }; 8CCD498115B497A700E5893B /* Resources */ = { isa = PBXGroup; children = ( + 2D327DE027F4710E00D21AB0 /* Lotties */, + 2D0BB35A27F443A700242D2A /* Lotties2 */, 2D0BB35827F440AF00242D2A /* Assets.xcassets */, 8CCD503B15B783FC00E5893B /* Images */, 8CCD498215B497A700E5893B /* Info.plist */, @@ -1560,6 +1603,7 @@ 1C4712292664CB8000E5AA74 /* Smilies */, 1C725A8826E71C6D009713DC /* MRProgress */, 1C6B2A99272F992E00671F0C /* Nuke */, + 2D0BB36C27F4525600242D2A /* Lottie */, ); productName = Awful; productReference = 1D6058910D05DD3D006BFB54 /* AwfulDebug.app */; @@ -1589,7 +1633,6 @@ }; 1C66A9EE19DD3939001B9A41 = { CreatedOnToolsVersion = 6.0.1; - DevelopmentTeam = 9RR6L9X39A; LastSwiftMigration = 0900; ProvisioningStyle = Automatic; SystemCapabilities = { @@ -1606,7 +1649,6 @@ TestTargetID = 1D6058900D05DD3D006BFB54; }; 1D6058900D05DD3D006BFB54 = { - DevelopmentTeam = 9RR6L9X39A; LastSwiftMigration = 1000; ProvisioningStyle = Automatic; SystemCapabilities = { @@ -1632,6 +1674,7 @@ 1C453F262338457A007AC6CD /* XCRemoteSwiftPackageReference "Stencil" */, 1CD72E65265C7FD600FF3BF4 /* XCRemoteSwiftPackageReference "FLAnimatedImage" */, 1C6B2A98272F992E00671F0C /* XCRemoteSwiftPackageReference "Nuke" */, + 2D0BB36B27F4525600242D2A /* XCRemoteSwiftPackageReference "lottie-ios" */, ); productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */; projectDirPath = ""; @@ -1695,20 +1738,17 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7B502E2C1F25140F00B1B305 /* platinum-member@2x.png in Resources */, - 7B502E2D1F25140F00B1B305 /* platinum-member@3x.png in Resources */, - 7B502E261F2513B400B1B305 /* post-dots@2x.png in Resources */, - 7B502E271F2513B400B1B305 /* post-dots@3x.png in Resources */, 8CCD500615B497A900E5893B /* Settings.plist in Resources */, 1C273AA021C1DC25002875A9 /* RenderView-AllFrames.js in Resources */, 1C5B9C3D17F20BB800D4981D /* posts-view-yospos.css in Resources */, 8C8FA48119AD7CA300B67AAA /* image-coder.png in Resources */, 8C8FA47E19AD7CA300B67AAA /* award.png in Resources */, + 2D327DEE27F4713300D21AB0 /* getout_vP3_120.json in Resources */, 1C0AFAE31ECA96E6002D4003 /* posts-view-alternate.css in Resources */, - 1C1BD0B32320C98400805208 /* platinum-member-white@2x.png in Resources */, 1C5B9C3A17F20BB800D4981D /* posts-view-gas-chamber.css in Resources */, 1C1BF9C219AB9E6200E8FBBC /* InAppActionSheet.xib in Resources */, 1C397CA91BCC473A00CA7FD5 /* post-dots.png in Resources */, + 2D327DEC27F4713300D21AB0 /* getout_vP_120.json in Resources */, 1C5B9C3B17F20BB800D4981D /* posts-view-macinyos.css in Resources */, 1C0AFAE21ECA96E6002D4003 /* posts-view-alternate-dark.css in Resources */, 8CE8F2E21BBB754C00E81544 /* play-button.png in Resources */, @@ -1716,6 +1756,7 @@ 1C5B9C3817F20BB800D4981D /* posts-view-amberpos.css in Resources */, 1C5B9C3F17F21BFC00D4981D /* posts-view-dark.css in Resources */, 8C8FA48319AD7CA300B67AAA /* redpill.png in Resources */, + 2DE12C16284C9719007FD9A4 /* posts-view-spankykong-oled-dark.css in Resources */, 1C40E5B21640FC2D004AAFA6 /* posts-view.css in Resources */, 1C8F68012221BE7C007E61ED /* Post.html.stencil in Resources */, 1C8F68032221C545007E61ED /* PostsView.html.stencil in Resources */, @@ -1723,21 +1764,26 @@ 1C5B9C3917F20BB800D4981D /* posts-view-fyad.css in Resources */, 1C40D4AA1A85F57400D9F793 /* Acknowledgements.html.stencil in Resources */, 8C8FA47F19AD7CA300B67AAA /* diamond-icon.png in Resources */, + 2DE12C17284C9719007FD9A4 /* posts-view-spankykong-light.css in Resources */, 8CEBABEB168000B800680935 /* macinyos-wallpaper@2x.png in Resources */, 8CEBABED16800A9300680935 /* macinyos-postactions-bg.png in Resources */, 8CF740EF1681376600C219E4 /* macinyos-heading.png in Resources */, - 1C1BD0B42320C98400805208 /* platinum-member-white@3x.png in Resources */, 8CE8F2E31BBB754C00E81544 /* stop-button.png in Resources */, 8C0F4F561682CCFA00E25D7E /* macinyos-heading-center.png in Resources */, + 2D327DF127F4713300D21AB0 /* TootX120.json in Resources */, 7B1FF12A1F76C3A3000B64DA /* AppIconPickerCell.xib in Resources */, 8C0F4F571682CCFA00E25D7E /* macinyos-heading-right.png in Resources */, 1C8F67F822210DED007E61ED /* Profile.html.stencil in Resources */, 1CE2B76B19C2374C00FDC33E /* Login.storyboard in Resources */, + 2D327DF427F4713300D21AB0 /* getout_v3_120.json in Resources */, + 2D327DF227F4713300D21AB0 /* getout_vP2_120.json in Resources */, 1CC10E3B1DD9558B00E0FB63 /* PotentiallyObjectionableThreadTags.plist in Resources */, 8C483FC216852E5D00D02482 /* macinyos-loading@2x.png in Resources */, 1C8F67FD2221BB57007E61ED /* PrivateMessage.html.stencil in Resources */, 1C47AF4C19A790910098B828 /* PostsPageSettings.xib in Resources */, + 2D327DEB27F4713300D21AB0 /* GhostAnim.json in Resources */, 1C8F67FF2221BDE8007E61ED /* PostPreview.html.stencil in Resources */, + 2D0BB35B27F443A700242D2A /* Lotties2 in Resources */, 7B82D6681F7809E3002291C7 /* AppIconCell.xib in Resources */, 1C29BD512251203400E1217A /* posts-view-oled-dark.css in Resources */, 1C29BD532251208200E1217A /* quote-post.png in Resources */, @@ -1747,16 +1793,20 @@ 8C299D7316877AE9001B9D96 /* winpos95-heading-right.png in Resources */, 8C299D7416877AE9001B9D96 /* winpos95-heading.png in Resources */, 8CEB405916877D2A00BFA9A8 /* winpos95-heading-seen.png in Resources */, + 2D327DEF27F4713300D21AB0 /* MainThrobberX120.json in Resources */, 8CEB405C16877E1600BFA9A8 /* winpos95-heading-left-seen.png in Resources */, 8CEB405E1687865300BFA9A8 /* hourglass.gif in Resources */, 1C5C2C5322D2579E00EA5A80 /* TUSafariActivity.bundle in Resources */, 1CA45D941F2C0AD1005BEEC5 /* RenderView.js in Resources */, 1C4EE1CE28470C2400A7507E /* Assets.xcassets in Resources */, + 2D327DDD27F46DE600D21AB0 /* platinum-member.png in Resources */, 8C8813A218492AC80058009E /* mac-watch.png in Resources */, + 2D327DED27F4713300D21AB0 /* getout_vZ_120.json in Resources */, 1C54D31319BE1708002AC6B9 /* SettingsAvatarHeader.xib in Resources */, 1CF264CA1F7811EA0059CCCA /* RootTabBarController.storyboard in Resources */, 8C9834E2169091CE009F0CD6 /* fyad-bubble.png in Resources */, 1C41B8A716CD573D00718F79 /* title-banned.gif in Resources */, + 2D327DDF27F46DFD00D21AB0 /* ghost.json in Resources */, 1C0060AA217171CD00E5329A /* profile.css in Resources */, F4233C591917C77900482BD0 /* bg_menu.jpg in Resources */, 1C41B8A816CD573D00718F79 /* title-permabanned.gif in Resources */, @@ -1769,11 +1819,13 @@ 1C5C2C5922D2586D00EA5A80 /* ARChromeActivity.xcassets in Resources */, 8CE8F2E11BBB754C00E81544 /* spinner-button.png in Resources */, 1CDD48BC17EE288A00E4DAE3 /* Themes.plist in Resources */, + 2D327DF327F4713300D21AB0 /* niggly3x120.json in Resources */, 7B0EA0BA1D96BF82008B0A90 /* SettingsSliderCell.xib in Resources */, 1CF186A617D48E5700B26717 /* Thread Tags in Resources */, 0C6C11B422FCE5800084C406 /* posts-view-bright-light.css in Resources */, 8C8FA48019AD7CA300B67AAA /* ik.png in Resources */, 8FC356EF2132F5C1006EE1A5 /* amberpos-ins.gif in Resources */, + 2D327DF027F4713300D21AB0 /* niggly120.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2016,6 +2068,7 @@ 1C397C8E1BC9B12F00CA7FD5 /* UIContextMenuConfiguration+ThreadListItem.swift in Sources */, 1C25AC211F532EE600977D6F /* LocalizedString.swift in Sources */, 1C25AC451F5377B100977D6F /* ManagedObjectObserver.swift in Sources */, + 2D327DD627F468CE00D21AB0 /* BookmarkColorPicker.swift in Sources */, 1C4506C41A2BAB3800767306 /* Handoff.swift in Sources */, 1C16FBFE1CBF237800C88BD1 /* PrivateMessageInboxRefresher.swift in Sources */, 1C3E181B224FAE1200BD88E5 /* SmilieDataStore+Shared.swift in Sources */, @@ -2068,6 +2121,7 @@ 7B0EA0B81D96B17B008B0A90 /* SettingsSliderCell.swift in Sources */, 1C29BD4D22505E8100E1217A /* SettingsThemePickerViewController.swift in Sources */, 1C0D80061CFA0CD7003EE2D1 /* ViewController.swift in Sources */, + 2D1B3BF5281157830022B1D2 /* NigglyRefreshLottieView.swift in Sources */, 1C16FBB21CB86ACD00C88BD1 /* EmptyViewController.swift in Sources */, 1C353C071E416FE200CCBA51 /* SpriteSheetView.swift in Sources */, 1C16FBA21CB49D2700C88BD1 /* SelfHostingAttachmentInterpolator.swift in Sources */, @@ -2221,7 +2275,6 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 9RR6L9X39A; ENABLE_HARDENED_RUNTIME = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -2299,7 +2352,6 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 9RR6L9X39A; ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2366,7 +2418,6 @@ CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 9RR6L9X39A; ENABLE_HARDENED_RUNTIME = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -2442,7 +2493,6 @@ CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 9RR6L9X39A; ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2476,6 +2526,7 @@ 1C66A9FD19DD393A001B9A41 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "../Smilies Extra/Keyboard/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = com.awfulapp.Awful.debug.SmilieKeyboard; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2486,6 +2537,7 @@ 1C66A9FE19DD393A001B9A41 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "../Smilies Extra/Keyboard/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = com.awfulapp.Awful.SmilieKeyboard; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2694,6 +2746,14 @@ minimumVersion = 1.0.16; }; }; + 2D0BB36B27F4525600242D2A /* XCRemoteSwiftPackageReference "lottie-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-ios.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -2744,6 +2804,11 @@ isa = XCSwiftPackageProductDependency; productName = AwfulCore; }; + 2D0BB36C27F4525600242D2A /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = 2D0BB36B27F4525600242D2A /* XCRemoteSwiftPackageReference "lottie-ios" */; + productName = Lottie; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;