├── .buildkite ├── commands │ ├── build-and-test.sh │ ├── build-and-ui-test.sh │ ├── build-prototype.sh │ ├── checkout-release-branch.sh │ ├── release-build.sh │ └── release-upload.sh ├── pipeline.yml ├── release-build.yml ├── release-pipelines │ ├── complete-code-freeze.yml │ ├── finalize-release.yml │ ├── new-beta-release.yml │ ├── publish-release.yml │ ├── start-code-freeze.yml │ └── update-metadata-on-app-store-connect.yml └── shared-pipeline-vars ├── .bundle └── config ├── .configure ├── .configure-files ├── SPCredentials.swift.enc ├── ScreenshotsCredentials.swift.enc ├── app_store_connect_fastlane_api_key.json.enc ├── google_cloud_keys.json.enc └── project.env.enc ├── .editorconfig ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── ---bug-report.md │ └── ---feature-request.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── run-danger.yml │ ├── screenshots.yml │ └── validate-issues.yml ├── .gitignore ├── .rubocop.yml ├── .rubocop_todo.yml ├── .ruby-version ├── .swiftlint.yml ├── .xcode-version ├── BuildTools ├── Empty.swift ├── Package.resolved └── Package.swift ├── CONTRIBUTING.md ├── Dangerfile ├── External └── Hoextdown │ ├── autolink.c │ ├── autolink.h │ ├── buffer.c │ ├── buffer.h │ ├── context_test.c │ ├── context_test.h │ ├── document.c │ ├── document.h │ ├── escape.c │ ├── escape.h │ ├── hash.c │ ├── hash.h │ ├── html.c │ ├── html.h │ ├── html5_blocks.c │ ├── html_blocks.c │ ├── html_smartypants.c │ ├── stack.c │ ├── stack.h │ ├── version.c │ └── version.h ├── Gemfile ├── Gemfile.lock ├── LICENSE.md ├── README.md ├── RELEASE-NOTES.txt ├── Rakefile ├── Scripts ├── Build-Phases │ └── copy-secret.sh ├── fix-translation ├── pre-actions │ └── configure-status-bar.sh └── update-translations.rb ├── Simplenote.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── swiftpm │ │ └── Package.resolved └── xcshareddata │ └── xcschemes │ ├── Simplenote.xcscheme │ ├── SimplenoteIntents.xcscheme │ ├── SimplenoteScreenshots.xcscheme │ ├── SimplenoteShare.xcscheme │ ├── SimplenoteUITests.xcscheme │ ├── SimplenoteUITests_Subset.xcscheme │ ├── SimplenoteWidgetsExtension.xcscheme │ └── UITestsFoundation.xcscheme ├── Simplenote ├── AuthenticationMode.swift ├── AuthenticationValidator.swift ├── BannerView.swift ├── BannerView.xib ├── BuildConfiguration.swift ├── Classes │ ├── ActivityIndicatorButton.swift │ ├── ActivityType.swift │ ├── ApplicationShortcutItemType.swift │ ├── ApplicationStateProvider.swift │ ├── BiometricAuthentication.swift │ ├── Bundle+Simplenote.swift │ ├── CGRect+Simplenote.swift │ ├── CSSearchable+Helpers.swift │ ├── ColorStudio.swift │ ├── ContentSlice.swift │ ├── DateFormatter+Simplenote.swift │ ├── EditorFactory.swift │ ├── FileManager+Simplenote.swift │ ├── FileStorage.swift │ ├── IndexPath+Simplenote.swift │ ├── InterlinkProcessor.swift │ ├── InterlinkResultsController.swift │ ├── InterlinkViewController.swift │ ├── InterlinkViewController.xib │ ├── JSONKit+Simplenote.h │ ├── JSONKit+Simplenote.m │ ├── KeyboardObservable.swift │ ├── KeychainManager.swift │ ├── MagicLinkAuthenticator.swift │ ├── MigrationsHandler.swift │ ├── NSAttributedString+AuthError.swift │ ├── NSAttributedString+Simplenote.swift │ ├── NSManagedObjectContext+CoreDataExtensions.h │ ├── NSManagedObjectContext+CoreDataExtensions.m │ ├── NSMutableAttributedString+Simplenote.swift │ ├── NSMutableParagraphStyle+Simplenote.swift │ ├── NSProcessInfo+Util.h │ ├── NSProcessInfo+Util.m │ ├── NSRegularExpression+Simplenote.swift │ ├── NSSortDescriptor+Simplenote.swift │ ├── NSString+Attributed.h │ ├── NSString+Attributed.m │ ├── NSString+Bullets.h │ ├── NSString+Bullets.m │ ├── NSString+Condensing.h │ ├── NSString+Condensing.m │ ├── NSString+Count.swift │ ├── NSString+Metadata.h │ ├── NSString+Metadata.m │ ├── NSString+Simplenote.swift │ ├── NSURL+Extensions.swift │ ├── NSURL+Links.swift │ ├── NSUserActivity+Shortcuts.swift │ ├── NSUserActivity+Simplenote.swift │ ├── Note+Properties.swift │ ├── Note.h │ ├── Note.m │ ├── NoteContentHelper.swift │ ├── NotesListController.swift │ ├── NotesListFilter.swift │ ├── NotesListSection.swift │ ├── NotesListState.swift │ ├── OptionsViewController.swift │ ├── OptionsViewController.xib │ ├── PassthruView.swift │ ├── PersonTag.h │ ├── PersonTag.m │ ├── PinLock │ │ ├── PinLockBaseController.swift │ │ ├── PinLockController.swift │ │ ├── PinLockRemoveController.swift │ │ ├── PinLockSetupController.swift │ │ ├── PinLockVerifyController.swift │ │ ├── PinLockViewController.swift │ │ └── PinLockViewController.xib │ ├── PopoverViewController.swift │ ├── PopoverViewController.xib │ ├── RoundedButton.swift │ ├── RoundedCrossButton.swift │ ├── RoundedView.swift │ ├── SPAboutViewController.swift │ ├── SPAcitivitySafari.h │ ├── SPAcitivitySafari.m │ ├── SPAddCollaboratorsViewController.h │ ├── SPAddCollaboratorsViewController.m │ ├── SPAuthError.swift │ ├── SPAuthHandler.swift │ ├── SPAuthViewController.swift │ ├── SPAuthViewController.xib │ ├── SPAutomatticTracker.h │ ├── SPAutomatticTracker.m │ ├── SPBlurEffectView.swift │ ├── SPContactsManager.swift │ ├── SPDebugViewController.h │ ├── SPDebugViewController.m │ ├── SPDefaultTableViewCell.swift │ ├── SPDiagnosticsViewController.swift │ ├── SPDiagnosticsViewController.xib │ ├── SPEditorTapRecognizerDelegate.swift │ ├── SPEditorTextView.h │ ├── SPEditorTextView.m │ ├── SPEntryListAutoCompleteCell.h │ ├── SPEntryListAutoCompleteCell.m │ ├── SPEntryListCell.h │ ├── SPEntryListCell.m │ ├── SPEntryListViewController.h │ ├── SPEntryListViewController.m │ ├── SPInteractivePushPopAnimationController.h │ ├── SPInteractivePushPopAnimationController.m │ ├── SPInteractiveTextStorage.h │ ├── SPInteractiveTextStorage.m │ ├── SPLabel.swift │ ├── SPMarkdownParser.h │ ├── SPMarkdownParser.m │ ├── SPMarkdownPreviewViewController+Extensions.swift │ ├── SPMarkdownPreviewViewController.h │ ├── SPMarkdownPreviewViewController.m │ ├── SPModalActivityIndicator.h │ ├── SPModalActivityIndicator.m │ ├── SPNavigationController.h │ ├── SPNavigationController.m │ ├── SPNoteEditorViewController+Extensions.swift │ ├── SPNoteEditorViewController.h │ ├── SPNoteEditorViewController.m │ ├── SPNoteHistoryViewController.swift │ ├── SPNoteHistoryViewController.xib │ ├── SPNoteListViewController+Extensions.swift │ ├── SPNoteListViewController.h │ ├── SPNoteListViewController.m │ ├── SPNoteTableViewCell.swift │ ├── SPNoteTableViewCell.xib │ ├── SPNotifications.h │ ├── SPNotifications.m │ ├── SPObjectManager+Simplenote.swift │ ├── SPObjectManager.h │ ├── SPObjectManager.m │ ├── SPOnboardingViewController.swift │ ├── SPOnboardingViewController.xib │ ├── SPPlaceholderView.swift │ ├── SPRatingsHelper.h │ ├── SPRatingsHelper.m │ ├── SPRatingsPromptView.swift │ ├── SPRatingsPromptView.xib │ ├── SPSectionHeaderView.swift │ ├── SPSectionHeaderView.xib │ ├── SPSettingsViewController+Extensions.swift │ ├── SPSettingsViewController.h │ ├── SPSettingsViewController.m │ ├── SPSheetController.swift │ ├── SPSheetController.xib │ ├── SPSidebarContainerViewController.h │ ├── SPSidebarContainerViewController.m │ ├── SPSidebarViewController+Extensions.swift │ ├── SPSimpleTextPrintFormatter.swift │ ├── SPSortBar.swift │ ├── SPSortBar.xib │ ├── SPSortOrderViewController.swift │ ├── SPSquaredButton.swift │ ├── SPTableViewController.h │ ├── SPTableViewController.m │ ├── SPTagEntryField.h │ ├── SPTagEntryField.m │ ├── SPTagHeaderView.swift │ ├── SPTagHeaderView.xib │ ├── SPTagTableViewCell.swift │ ├── SPTagTableViewCell.xib │ ├── SPTextField.h │ ├── SPTextField.m │ ├── SPTextInputView.swift │ ├── SPTextView.h │ ├── SPTextView.m │ ├── SPThemeViewController.swift │ ├── SPTracker.h │ ├── SPTracker.m │ ├── SPTransitionController.h │ ├── SPTransitionController.m │ ├── SPUserInterface.swift │ ├── SearchDisplayController.swift │ ├── Settings.h │ ├── Settings.m │ ├── ShortcutsHandler.swift │ ├── SignupVerificationViewController.swift │ ├── SignupVerificationViewController.xib │ ├── Simperium+Simplenote.h │ ├── Simperium+Simplenote.m │ ├── Simperium+Simplenote.swift │ ├── SimplenoteActivityItemSource.swift │ ├── SimplenoteConstants.swift │ ├── SortMode.swift │ ├── SortModePickerViewController.swift │ ├── SortModePickerViewController.xib │ ├── StatusChecker.h │ ├── StatusChecker.m │ ├── String+Simplenote.swift │ ├── SwitchTableViewCell.swift │ ├── Tag.h │ ├── Tag.m │ ├── TagListTextField.swift │ ├── TagListViewCell.xib │ ├── TagListViewController.xib │ ├── TagTextFieldInputValidator.swift │ ├── TagView.swift │ ├── TagViewCell.swift │ ├── Theme.swift │ ├── UIActivity+Simplenote.swift │ ├── UIAlertController+Helpers.swift │ ├── UIApplication+Simplenote.swift │ ├── UIBarButtonItem+Appearance.swift │ ├── UIBezierPath+Simplenote.swift │ ├── UIBlurEffect+Simplenote.swift │ ├── UIColor+Helpers.swift │ ├── UIColor+Studio.swift │ ├── UIContextualAction+Simplenote.swift │ ├── UIDevice+Simplenote.swift │ ├── UIFont+Simplenote.swift │ ├── UIGestureRecognizer+Simplenote.swift │ ├── UIImage+Colorization.h │ ├── UIImage+Colorization.m │ ├── UIImage+Dynamic.swift │ ├── UIImage+Simplenote.swift │ ├── UIImageName.swift │ ├── UIKeyCommand+Simplenote.swift │ ├── UIKeyboardAppearance+Simplenote.swift │ ├── UIKitConstants.swift │ ├── UINavigationBar+Appearance.swift │ ├── UINavigationBar+Simplenote.swift │ ├── UINavigationController+Simplenote.swift │ ├── UIPasteboard+Note.swift │ ├── UIResponder+Simplenote.swift │ ├── UIScreen+Simplenote.swift │ ├── UIScrollView+Simplenote.swift │ ├── UISearchBar+Simplenote.swift │ ├── UITableView+Simplenote.swift │ ├── UITableViewCell+Simplenote.swift │ ├── UITableViewHeaderFooterView+Simplenote.swift │ ├── UITextField+Tag.swift │ ├── UITextInput+Simplenote.swift │ ├── UITextView+Simplenote.h │ ├── UITextView+Simplenote.m │ ├── UITextView+Simplenote.swift │ ├── UITraitCollection+Simplenote.swift │ ├── UIView+Animations.swift │ ├── UIView+ImageRepresentation.swift │ ├── UIView+Simplenote.swift │ ├── UIViewController+Helpers.swift │ ├── UIViewController+Simplenote.swift │ ├── UserDefaults+Simplenote.swift │ ├── ViewSpinner.swift │ ├── WPAuthHandler.h │ └── WPAuthHandler.m ├── Color+Simplenote.swift ├── Controllers │ ├── AccountDeletionController.swift │ ├── PublishController.swift │ ├── PublishNoticePresenter.swift │ ├── VersionsController.swift │ └── WidgetController.swift ├── CoreDataManager.swift ├── CrashLogging.swift ├── Date+Simplenote.swift ├── EmailVerification.swift ├── HuggableTableView.swift ├── Icons.xcassets │ ├── AppIcon-Beta.appiconset │ │ ├── Contents.json │ │ └── Icon-App-iTunes.png │ ├── AppIcon-Sustainer.appiconset │ │ ├── Contents.json │ │ ├── SN-Sustainer @1024x1024.png │ │ ├── SN-Sustainer @114x114.png │ │ ├── SN-Sustainer @120x120 1.png │ │ ├── SN-Sustainer @120x120.png │ │ ├── SN-Sustainer @128x128 1.png │ │ ├── SN-Sustainer @128x128.png │ │ ├── SN-Sustainer @136x136.png │ │ ├── SN-Sustainer @152x152.png │ │ ├── SN-Sustainer @167x167.png │ │ ├── SN-Sustainer @180x180.png │ │ ├── SN-Sustainer @192x192.png │ │ ├── SN-Sustainer @40x40.png │ │ ├── SN-Sustainer @58x58.png │ │ ├── SN-Sustainer @60x60.png │ │ ├── SN-Sustainer @76x76.png │ │ ├── SN-Sustainer @80x80.png │ │ └── SN-Sustainer @87x87.png │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ └── Icon-App-iTunes.png │ └── Contents.json ├── Images.xcassets │ ├── Buttons │ │ ├── Contents.json │ │ ├── action_button_background.imageset │ │ │ ├── Contents.json │ │ │ ├── action_button_background.png │ │ │ └── action_button_background@2x.png │ │ ├── action_button_background_highlighted.imageset │ │ │ ├── Contents.json │ │ │ ├── action_button_background_highlighted.png │ │ │ └── action_button_background_highlighted@2x.png │ │ ├── button_delete_small.imageset │ │ │ ├── Contents.json │ │ │ ├── button_delete_small.png │ │ │ ├── button_delete_small@2x.png │ │ │ ├── button_delete_small_dark.png │ │ │ └── button_delete_small_dark@2x.png │ │ ├── button_delete_small_dark.imageset │ │ │ ├── Contents.json │ │ │ ├── button_delete_small_dark.png │ │ │ └── button_delete_small_dark@2x.png │ │ ├── button_safari.imageset │ │ │ ├── Contents.json │ │ │ ├── button_safari.png │ │ │ ├── button_safari@2x.png │ │ │ ├── button_safari@2x~ipad.png │ │ │ └── button_safari~ipad.png │ │ ├── toggle_background.imageset │ │ │ ├── Contents.json │ │ │ ├── toggle_background_square.png │ │ │ └── toggle_background_square@2x.png │ │ └── toggle_background_highlighted.imageset │ │ │ ├── Contents.json │ │ │ ├── toggle_background_square_highlighted.png │ │ │ └── toggle_background_square_highlighted@2x.png │ ├── Contents.json │ ├── Icons │ │ ├── Contents.json │ │ ├── icon_add.imageset │ │ │ ├── Contents.json │ │ │ └── add-outline.pdf │ │ ├── icon_allnotes.imageset │ │ │ ├── Contents.json │ │ │ └── notes.pdf │ │ ├── icon_archive.imageset │ │ │ ├── Contents.json │ │ │ └── archive.pdf │ │ ├── icon_arrow_top_right.imageset │ │ │ ├── Contents.json │ │ │ └── arrow-top-right.pdf │ │ ├── icon_checklist.imageset │ │ │ ├── Contents.json │ │ │ └── checklist.pdf │ │ ├── icon_checkmark_checked.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_checkmark_checked.png │ │ │ └── icon_checkmark_checked@2x.png │ │ ├── icon_checkmark_unchecked.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_checkmark_unchecked.png │ │ │ └── icon_checkmark_unchecked@2x.png │ │ ├── icon_chevron_left.imageset │ │ │ ├── Contents.json │ │ │ └── icon_chevron_left.pdf │ │ ├── icon_chevron_right.imageset │ │ │ ├── Contents.json │ │ │ └── chevron-right.pdf │ │ ├── icon_collaborate.imageset │ │ │ ├── Contents.json │ │ │ └── collaborate.pdf │ │ ├── icon_copy.imageset │ │ │ ├── Contents.json │ │ │ └── icon_copy.pdf │ │ ├── icon_cross.imageset │ │ │ ├── Contents.json │ │ │ └── cross.pdf │ │ ├── icon_cross_big.imageset │ │ │ ├── Contents.json │ │ │ └── icon_cross.pdf │ │ ├── icon_cross_big_outlined.imageset │ │ │ ├── Contents.json │ │ │ └── icon_cross_outline.pdf │ │ ├── icon_cross_outlined.imageset │ │ │ ├── Contents.json │ │ │ └── cross-outline.pdf │ │ ├── icon_editor.imageset │ │ │ ├── Contents.json │ │ │ └── editor.pdf │ │ ├── icon_ellipsis.imageset │ │ │ ├── Contents.json │ │ │ └── ellipsis.pdf │ │ ├── icon_ellipsis_outline.imageset │ │ │ ├── Contents.json │ │ │ └── ellipsis-outline.pdf │ │ ├── icon_hide_keyboard.imageset │ │ │ ├── Contents.json │ │ │ └── hide-keyboard.pdf │ │ ├── icon_history.imageset │ │ │ ├── Contents.json │ │ │ └── history.pdf │ │ ├── icon_info.imageset │ │ │ ├── Contents.json │ │ │ └── info.pdf │ │ ├── icon_link.imageset │ │ │ ├── Contents.json │ │ │ └── link.pdf │ │ ├── icon_mail.imageset │ │ │ ├── Contents.json │ │ │ └── mail.pdf │ │ ├── icon_menu.imageset │ │ │ ├── Contents.json │ │ │ └── menu.pdf │ │ ├── icon_new_note.imageset │ │ │ ├── Contents.json │ │ │ └── new-note.pdf │ │ ├── icon_note.imageset │ │ │ ├── Contents.json │ │ │ └── note.pdf │ │ ├── icon_pin.imageset │ │ │ ├── Contents.json │ │ │ └── pinned.pdf │ │ ├── icon_pin_small.imageset │ │ │ ├── Contents.json │ │ │ └── pinned.pdf │ │ ├── icon_published.imageset │ │ │ ├── Contents.json │ │ │ └── publish.pdf │ │ ├── icon_restore.imageset │ │ │ ├── Contents.json │ │ │ └── restore.pdf │ │ ├── icon_search.imageset │ │ │ ├── Contents.json │ │ │ └── search.pdf │ │ ├── icon_settings.imageset │ │ │ ├── Contents.json │ │ │ └── settings.pdf │ │ ├── icon_share.imageset │ │ │ ├── Contents.json │ │ │ └── share.pdf │ │ ├── icon_shared.imageset │ │ │ ├── Contents.json │ │ │ └── publish.pdf │ │ ├── icon_sort_order.imageset │ │ │ ├── Contents.json │ │ │ └── sort-order.pdf │ │ ├── icon_success.imageset │ │ │ ├── Contents.json │ │ │ └── success.pdf │ │ ├── icon_tag.imageset │ │ │ ├── Contents.json │ │ │ └── tag.pdf │ │ ├── icon_tags.imageset │ │ │ ├── Contents.json │ │ │ └── tags.pdf │ │ ├── icon_tags_close.imageset │ │ │ ├── Contents.json │ │ │ └── tags-close.pdf │ │ ├── icon_tags_open.imageset │ │ │ ├── Contents.json │ │ │ └── tags-open.pdf │ │ ├── icon_task_checked.imageset │ │ │ ├── Contents.json │ │ │ └── task-checked.pdf │ │ ├── icon_task_unchecked.imageset │ │ │ ├── Contents.json │ │ │ └── task-unchecked.pdf │ │ ├── icon_trash.imageset │ │ │ ├── Contents.json │ │ │ └── trash.pdf │ │ ├── icon_unpin.imageset │ │ │ ├── Contents.json │ │ │ └── unpin.pdf │ │ ├── icon_untagged.imageset │ │ │ ├── Contents.json │ │ │ └── untagged.pdf │ │ ├── icon_user.imageset │ │ │ ├── Contents.json │ │ │ └── user.pdf │ │ ├── icon_visibility_off.imageset │ │ │ ├── Contents.json │ │ │ └── visibility-hidden.pdf │ │ ├── icon_visibility_on.imageset │ │ │ ├── Contents.json │ │ │ └── visibility-visible.pdf │ │ ├── icon_warning.imageset │ │ │ ├── Contents.json │ │ │ └── warning.pdf │ │ └── icon_wpcom.imageset │ │ │ ├── Contents.json │ │ │ ├── wpcom-logo.png │ │ │ ├── wpcom-logo@2x.png │ │ │ └── wpcom-logo@3x.png │ ├── launch-logo.imageset │ │ ├── Contents.json │ │ └── launch-logo.pdf │ ├── logo_about.imageset │ │ ├── Contents.json │ │ ├── Icon-App-128x128.png │ │ ├── Icon-App-256x256.png │ │ └── Icon-App-512x512.png │ └── simplenote-logo.imageset │ │ ├── Contents.json │ │ └── icon_simplenote_inner.pdf ├── Information │ ├── NoteInformationController.swift │ ├── NoteInformationViewController.swift │ └── NoteInformationViewController.xib ├── KeychainPasswordItem.swift ├── MagicLinkInvalidView.swift ├── MagicLinkRequestedView.swift ├── NSAttributedStringToMarkdownConverter.swift ├── NSMutableAttributedString+Styling.h ├── NSMutableAttributedString+Styling.m ├── NSObject+Helpers.swift ├── NSPredicate+Email.swift ├── NSTextStorage+Simplenote.swift ├── NSURLComponents+Simplenote.swift ├── Note+Links.swift ├── Note+Publish.swift ├── NoteMetrics.swift ├── NoteScrollPositionCache.swift ├── Notice.swift ├── NoticeAction.swift ├── NoticeController.swift ├── NoticeFactory.swift ├── NoticePresenter.swift ├── NoticeView.swift ├── NoticeView.xib ├── NumberFormatter+Simplenote.swift ├── Options.swift ├── PinLockProgressView.swift ├── PopoverPresenter.swift ├── Preferences+IAP.swift ├── Preferences.h ├── Preferences.m ├── RecoveryUnarchiver.swift ├── Resources │ ├── AppStoreStrings.pot │ ├── LaunchScreen.storyboard │ ├── PrivacyInfo.xcprivacy │ ├── markdown-dark-contrast.css │ ├── markdown-dark.css │ ├── markdown-default-contrast.css │ ├── markdown-default.css │ └── markdown-light.css ├── SPAppDelegate+Extensions.swift ├── SPAppDelegate.h ├── SPAppDelegate.m ├── SPCardConfigurable.swift ├── SPCardDismissalAnimator.swift ├── SPCardPresentationAnimator.swift ├── SPCardPresentationController.swift ├── SPCardTransitioningManager.swift ├── SPCardView.swift ├── SPConstants.h ├── SPConstants.m ├── SPCredentials-demo.swift ├── SPDragBar.swift ├── SPEditorTextView+Simplenote.swift ├── SPHistoryVersion.swift ├── SPManagedObject+Version.swift ├── SPNoteHistoryController.swift ├── SPNoteHistoryControllerDelegate.swift ├── SPPinLockManager.swift ├── SPPrivacyViewController.swift ├── SPShadowView.swift ├── SPSnappingSlider.swift ├── SPTextAttachment.swift ├── SPTracker+Extensions.swift ├── SPUser+UserProtocol.swift ├── SearchMapView.swift ├── SearchQuery+Simplenote.swift ├── SeparatorsView.swift ├── SharedStorageMigrator.swift ├── Simplenote-Bridging-Header.h ├── Simplenote.xcdatamodeld │ ├── .xccurrentversion │ ├── Simplenote 2.xcdatamodel │ │ └── contents │ ├── Simplenote 3.xcdatamodel │ │ └── contents │ ├── Simplenote 4.xcdatamodel │ │ └── contents │ ├── Simplenote 5.xcdatamodel │ │ └── contents │ ├── Simplenote 6.xcdatamodel │ │ └── contents │ ├── Simplenote 7.xcdatamodel │ │ └── contents │ └── Simplenote.xcdatamodel │ │ ├── elements │ │ └── layout ├── SpinnerViewController.swift ├── StorageSettings.swift ├── StoreConstants.swift ├── StoreManager.swift ├── StoreProduct.swift ├── SubtitleTableViewCell.swift ├── Supporting Files │ ├── Base.lproj │ │ └── ShortcutIntents.intentdefinition │ ├── Simplenote-Info.plist │ ├── Simplenote-Internal.entitlements │ ├── Simplenote-Prefix.pch │ ├── Simplenote.entitlements │ ├── ar.lproj │ │ └── ShortcutIntents.strings │ ├── cy.lproj │ │ └── ShortcutIntents.strings │ ├── de.lproj │ │ └── ShortcutIntents.strings │ ├── el.lproj │ │ └── ShortcutIntents.strings │ ├── en.lproj │ │ └── ShortcutIntents.strings │ ├── es.lproj │ │ └── ShortcutIntents.strings │ ├── fa.lproj │ │ └── ShortcutIntents.strings │ ├── fr.lproj │ │ └── ShortcutIntents.strings │ ├── he.lproj │ │ └── ShortcutIntents.strings │ ├── id.lproj │ │ └── ShortcutIntents.strings │ ├── it.lproj │ │ └── ShortcutIntents.strings │ ├── ja.lproj │ │ └── ShortcutIntents.strings │ ├── ko.lproj │ │ └── ShortcutIntents.strings │ ├── main.m │ ├── nl.lproj │ │ └── ShortcutIntents.strings │ ├── pt-BR.lproj │ │ └── ShortcutIntents.strings │ ├── ru.lproj │ │ └── ShortcutIntents.strings │ ├── sv.lproj │ │ └── ShortcutIntents.strings │ ├── tr.lproj │ │ └── ShortcutIntents.strings │ ├── zh-Hans-CN.lproj │ │ └── ShortcutIntents.strings │ └── zh-Hant-TW.lproj │ │ └── ShortcutIntents.strings ├── TableHeaderViewCell.swift ├── TagListViewCell.swift ├── TagListViewController.swift ├── Tags │ ├── NoteEditorTagListViewController.swift │ ├── NoteEditorTagListViewController.xib │ ├── NoteEditorTagSuggestionsViewController.swift │ └── NoteEditorTagSuggestionsViewController.xib ├── TestConfiguration.storekit ├── TimerFactory.swift ├── UIActivityViewController+Simplenote.swift ├── UIAlertController+Auth.swift ├── UIButton+Simplenote.swift ├── UISlider+Simplenote.swift ├── UIView+Constraints.swift ├── URL+Simplenote.swift ├── URLComponents.swift ├── Value1TableViewCell.swift ├── Verification │ ├── AccountVerificationController.swift │ ├── AccountVerificationViewController.swift │ └── AccountVerificationViewController.xib ├── WidgetError.swift ├── WordPressRatings │ ├── NSDate+Ratings.h │ ├── NSDate+Ratings.m │ ├── WPRatingsHelper.h │ └── WPRatingsHelper.m ├── ar.lproj │ └── Localizable.strings ├── cy.lproj │ └── Localizable.strings ├── de.lproj │ └── Localizable.strings ├── el.lproj │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ └── Localizable.strings ├── fa.lproj │ └── Localizable.strings ├── fr.lproj │ └── Localizable.strings ├── he.lproj │ └── Localizable.strings ├── id.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── ko.lproj │ └── Localizable.strings ├── nl.lproj │ └── Localizable.strings ├── pt-BR.lproj │ └── Localizable.strings ├── ru.lproj │ └── Localizable.strings ├── sv.lproj │ └── Localizable.strings ├── tr.lproj │ └── Localizable.strings ├── zh-Hans-CN.lproj │ └── Localizable.strings └── zh-Hant-TW.lproj │ └── Localizable.strings ├── SimplenoteIntents ├── Intent Handlers │ ├── AppendNoteIntentHandler.swift │ ├── CopyNoteContentIntentHandler.swift │ ├── CreateNewNoteIntentHandler.swift │ ├── FindNoteIntentHandler.swift │ ├── FindNoteWithTagIntentHandler.swift │ ├── ListWidgetIntentHandler.swift │ ├── NoteWidgetIntentHandler.swift │ ├── OpenNewNoteIntentHandler.swift │ └── OpenNoteIntentHandler.swift ├── IntentHandler.swift ├── IntentsConstants.swift ├── IntentsError.swift ├── ResolutionResults │ ├── IntentNote+Helpers.swift │ └── IntentTag+Helpers.swift ├── Simplenote-Intents-Bridging-Header.h ├── SimplenoteIntentsRelease.entitlements ├── Supporting Files │ ├── Info.plist │ ├── PrivacyInfo.xcprivacy │ ├── SimplenoteIntents-Debug.entitlements │ ├── SimplenoteIntents-DistributionAlpha.entitlements │ ├── SimplenoteIntents-DistributionInternal.entitlements │ └── SimplenoteIntents-Release.entitlements └── Tools │ └── RecoveryArchiver.swift ├── SimplenoteScreenshots ├── Info.plist ├── ScreenshotsCredentials-demo.swift ├── SimplenoteScreenshots.swift └── SnapshotHelper.swift ├── SimplenoteShare ├── Base.lproj │ └── MainInterface.storyboard ├── Extensions │ ├── NSExtensionContext+Simplenote.swift │ └── NSURLSessionConfiguration+Extensions.swift ├── Extractors │ ├── Extractor.swift │ ├── Extractors.swift │ ├── PlainTextExtractor.swift │ └── URLExtractor.swift ├── Presentation │ ├── ExtensionPresentationAnimator.swift │ ├── ExtensionPresentationController.swift │ └── ExtensionTransitioningManager.swift ├── Simperium │ ├── Downloader.swift │ ├── Note.swift │ └── Uploader.swift ├── Simplenote-Share-Bridging-Header.h ├── Supporting Files │ ├── Info.plist │ ├── SimplenoteShare-AppStore.entitlements │ ├── SimplenoteShare-Development.entitlements │ ├── SimplenoteShare-DistributionAlpha.entitlements │ └── SimplenoteShare-Internal.entitlements ├── Themes │ └── SPUserInterface.swift ├── Tools │ ├── TextBundleWrapper.h │ └── TextBundleWrapper.m └── ViewControllers │ ├── SharePresentationController.swift │ ├── ShareViewController.swift │ └── ShareViewController.xib ├── SimplenoteTests ├── AuthenticationValidatorTests.swift ├── CGRectSimplenoteTests.swift ├── Constants.swift ├── EmailVerificationTests.swift ├── Info.plist ├── InterlinkResultsControllerTests.swift ├── MockApplication.swift ├── MockTimerFactory.swift ├── MockupStorage+Sample.swift ├── MockupStorage.swift ├── NSMutableAttributedStringStylingTests.swift ├── NSPredicateEmailTests.swift ├── NSStringCondensingTests.swift ├── NSStringSimplenoteTests.swift ├── NoteBodyExcerptTests.swift ├── NoteContentHelperTests.swift ├── NoteContentPreviewTests.swift ├── NoteLinkTests.swift ├── NoteScrollPositionCacheTests.swift ├── NotesListControllerTests.swift ├── NoticeControllerTests.swift ├── OptionsTests.swift ├── PinLock │ ├── Helpers │ │ ├── MockPinLockManager.swift │ │ ├── PinLockControllerConfiguration+Tests.swift │ │ └── PinLockControllerConfigurationObserver.swift │ ├── PinLockBaseControllerTests.swift │ ├── PinLockRemoveControllerTests.swift │ ├── PinLockSetupControllerTests.swift │ └── PinLockVerifyControllerTests.swift ├── PublishControllerTests.swift ├── RemoteResult+TestHelpers.swift ├── SimplenoteTests-Bridging-Header.h ├── StringContentSliceTests.swift ├── StringSimplenoteTests.swift ├── Tags │ └── TagTextFieldInputValidatorTests.swift ├── UIColorSimplenoteTests.swift ├── UIImageSimplenoteTests.swift ├── UserDefaults+Tests.swift └── Verification │ ├── AccountVerificationControllerTests.swift │ └── Helpers │ └── MockAccountVerificationRemote.swift ├── SimplenoteUITests ├── AssertGeneric.swift ├── EmailLogin.swift ├── Extensions.swift ├── Generic.swift ├── History.swift ├── Info.plist ├── NoteData.swift ├── NoteEditor.swift ├── NoteList.swift ├── Preview.swift ├── Settings.swift ├── Sidebar.swift ├── SimplenoteUISmokeTestsSettings.swift ├── SimplenoteUITestsHistory.swift ├── SimplenoteUITestsLogin.swift ├── SimplenoteUITestsNoteEditor.swift ├── SimplenoteUITestsSearch.swift ├── SimplenoteUITestsTrash.swift ├── Trash.swift └── UIDs.swift ├── SimplenoteWidgets ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── WidgetBackground.colorset │ │ └── Contents.json ├── Extensions │ ├── Color+Widgets.swift │ ├── Text+Simplenote.swift │ ├── View+Simplenote.swift │ └── WidgetTag+Helpers.swift ├── Info.plist ├── Models │ ├── Note+Widget.swift │ ├── SPManagedObject+Widget.swift │ └── Tag+Widget.swift ├── Providers │ ├── ListWidgetProvider.swift │ ├── NewNoteWidgetProvider.swift │ └── NoteWidgetProvider.swift ├── Simplenote-Widgets-Bridging-Header.h ├── SimplenoteWidgets.swift ├── Supporting Files │ ├── ListWidgetIntent.intentdefinition │ ├── NoteWidgetIntent.intentdefinition │ ├── PrivacyInfo.xcprivacy │ ├── SimplenoteWidgetsExtension-Debug.entitlements │ ├── SimplenoteWidgetsExtension-DistributionAlpha.entitlements │ ├── SimplenoteWidgetsExtension-DistributionInternal.entitlements │ └── SimplenoteWidgetsExtension-Release.entitlements ├── Tools │ ├── DemoContent.swift │ ├── ExtensionCoreDataWrapper.swift │ ├── ExtensionResultsController.swift │ ├── WidgetConstants.swift │ ├── WidgetDefaults.swift │ └── WidgetsState.swift ├── ViewModifiers │ └── Filling.swift ├── Views │ ├── ListWidgetHeaderView.swift │ ├── ListWidgetView.swift │ ├── NewNoteButton.swift │ ├── NewNoteWidgetView.swift │ ├── NoteListRow.swift │ ├── NoteListTable.swift │ ├── NoteWidgetView.swift │ └── WidgetWarningView.swift └── Widgets │ ├── ListWidget.swift │ ├── NewNoteWidget.swift │ └── NoteWidget.swift ├── TESTING-CHECKLIST.md ├── UITestsFoundation ├── PasscodeScreen.swift ├── UITestsFoundation.h └── XCUIApplication+Assertions.swift ├── config ├── Project.Release.xcconfig ├── Simplenote.debug.xcconfig ├── Simplenote.release.xcconfig └── Version.Public.xcconfig └── fastlane ├── Fastfile ├── appstoreres ├── .gitattributes ├── assets │ ├── SourceSansPro-Regular.ttf │ ├── ipad_12_9_3rd_gen_mask.png │ ├── ipad_2nd_gen.png │ ├── ipad_3rd_gen.png │ ├── iphone_8_plus.png │ ├── iphone_Xs_mask_no_notch.png │ ├── iphone_Xs_max.png │ └── styles │ │ └── style.css └── metadata │ └── source │ ├── description.txt │ ├── keywords.txt │ ├── name.txt │ └── subtitle.txt ├── env ├── project.env-example └── user.env-example ├── example.env ├── lanes ├── build.rb ├── localization.rb └── release.rb ├── lib ├── env_manager.rb └── release_helpers.rb ├── metadata ├── ar-SA │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── de-DE │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── default │ ├── description.txt │ ├── keywords.txt │ ├── privacy_url.txt │ ├── release_notes.txt │ ├── subtitle.txt │ └── support_url.txt ├── es-ES │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── fr-FR │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── he │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── id │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── it │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── ja │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── ko │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── nl-NL │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── pt-BR │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── ru │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── sv │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── tr │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt ├── zh-Hans │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt └── zh-Hant │ ├── .gitkeep │ ├── description.txt │ ├── keywords.txt │ ├── release_notes.txt │ └── subtitle.txt └── screenshots.json /.buildkite/commands/build-prototype.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash -eu 2 | 3 | echo "--- :rubygems: Setting up Gems" 4 | install_gems 5 | 6 | echo "--- :closed_lock_with_key: Installing Secrets" 7 | bundle exec fastlane run configure_apply 8 | 9 | echo "--- :hammer_and_wrench: Build and Upload to Firebase App Distribution" 10 | bundle exec fastlane build_and_upload_prototype_build 11 | -------------------------------------------------------------------------------- /.buildkite/commands/checkout-release-branch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eu 2 | 3 | # Checks out to the "release/$1" branch. 4 | # 5 | # Our CI system, Buildkite, by default checks out a specific commit. 6 | # For many release actions, we need to be on a release branch instead. 7 | 8 | RELEASE_VERSION=${1:-} 9 | 10 | if [[ -z "${RELEASE_VERSION}" ]]; then 11 | printf "Usage %s release_version.\n\nExample:\n" "$0" 12 | printf "\t%s 1.2\n" "$0" 13 | exit 1 14 | fi 15 | 16 | echo '--- :git: Checkout Release Branch' 17 | 18 | BRANCH_NAME="release/${RELEASE_VERSION}" 19 | 20 | git fetch origin "$BRANCH_NAME" 21 | git checkout "$BRANCH_NAME" 22 | -------------------------------------------------------------------------------- /.buildkite/commands/release-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eu 2 | 3 | echo "--- :rubygems: Setting up Gems" 4 | install_gems 5 | 6 | echo "--- :closed_lock_with_key: Installing Secrets" 7 | bundle exec fastlane run configure_apply 8 | 9 | echo "--- :hammer_and_wrench: Build for App Store Connect" 10 | bundle exec fastlane build_for_app_store_connect 11 | -------------------------------------------------------------------------------- /.buildkite/commands/release-upload.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eu 2 | 3 | echo "--- :arrow_down: Downloading Artifacts" 4 | ARTIFACTS_DIR='build/results' 5 | STEP=testflight_build 6 | buildkite-agent artifact download "$ARTIFACTS_DIR/*.ipa" . --step $STEP 7 | buildkite-agent artifact download "$ARTIFACTS_DIR/*.zip" . --step $STEP 8 | 9 | echo "--- :rubygems: Setting up Gems" 10 | install_gems 11 | 12 | echo "--- :closed_lock_with_key: Installing Secrets" 13 | bundle exec fastlane run configure_apply 14 | 15 | echo "--- :hammer_and_wrench: Upload to App Store Connect" 16 | bundle exec fastlane upload_to_app_store_connect \ 17 | skip_prechecks:true \ 18 | create_release:true \ 19 | "beta_release:${1:-true}" # use first call param, default to true for safety 20 | -------------------------------------------------------------------------------- /.buildkite/shared-pipeline-vars: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This file is `source`'d before calling `buildkite-agent pipeline upload`, and can be used 4 | # to set up some variables that will be interpolated in the `.yml` pipeline before uploading it. 5 | 6 | # The ~> modifier is not currently used, but we check for it just in case 7 | XCODE_VERSION=$(sed -E 's/^~> ?//' .xcode-version) 8 | export CI_TOOLKIT_PLUGIN_VERSION="3.7.1" 9 | 10 | export IMAGE_ID="xcode-$XCODE_VERSION" 11 | export CI_TOOLKIT_PLUGIN="automattic/a8c-ci-toolkit#$CI_TOOLKIT_PLUGIN_VERSION" 12 | -------------------------------------------------------------------------------- /.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_BUNDLE_SPECIFIC_PLATFORM: "false" 3 | BUNDLE_PATH: "vendor/bundle" 4 | BUNDLE_RETRY: "3" 5 | BUNDLE_JOBS: "3" 6 | -------------------------------------------------------------------------------- /.configure-files/SPCredentials.swift.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/.configure-files/SPCredentials.swift.enc -------------------------------------------------------------------------------- /.configure-files/ScreenshotsCredentials.swift.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/.configure-files/ScreenshotsCredentials.swift.enc -------------------------------------------------------------------------------- /.configure-files/app_store_connect_fastlane_api_key.json.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/.configure-files/app_store_connect_fastlane_api_key.json.enc -------------------------------------------------------------------------------- /.configure-files/google_cloud_keys.json.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/.configure-files/google_cloud_keys.json.enc -------------------------------------------------------------------------------- /.configure-files/project.env.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/.configure-files/project.env.enc -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Apply to all files 2 | [*] 3 | end_of_line = lf 4 | insert_final_newline = true 5 | trim_trailing_whitespace = true 6 | 7 | # Ruby specific rules 8 | [{*.rb,Fastfile,Gemfile}] 9 | indent_style = space 10 | indent_size = 2 11 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | RELEASE-NOTES.txt merge=union 2 | 3 | .configure-files/*.enc binary 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F680 Feature Request" 3 | about: "Suggest a new feature or enhancement to an existing one in the Simplenote iOS app." 4 | title: "" 5 | labels: feature request 6 | assignees: "" 7 | --- 8 | 9 | Please, be as descriptive as possible. Issues lacking detail, or for any other reason than to request a feature, may be closed without action. 10 | 11 | ### What 12 | ***(Required)*** What is the feature you are requesting? Add a concise description of the feature being requested. 13 | 14 | ### Why 15 | ***(Required)*** Why are you requesting this feature? Add a concise description of the problem this feature solves. 16 | 17 | ### How 18 | ***(Optional)*** If applicable, add screenshots, animations, or videos to help illustrate how the feature could be done. 19 | -------------------------------------------------------------------------------- /.github/workflows/run-danger.yml: -------------------------------------------------------------------------------- 1 | name: ☢️ Trigger Danger On Buildkite 2 | 3 | on: 4 | pull_request: 5 | types: [labeled, unlabeled, milestoned, demilestoned, ready_for_review] 6 | 7 | jobs: 8 | dangermattic: 9 | if: ${{ (github.event.pull_request.draft == false) }} 10 | uses: Automattic/dangermattic/.github/workflows/reusable-retry-buildkite-step-on-events.yml@v1.1.2 11 | with: 12 | org-slug: "automattic" 13 | pipeline-slug: "simplenote-ios" 14 | retry-step-key: "danger" 15 | build-commit-sha: "${{ github.event.pull_request.head.sha }}" 16 | secrets: 17 | buildkite-api-token: ${{ secrets.TRIGGER_BK_BUILD_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/validate-issues.yml: -------------------------------------------------------------------------------- 1 | name: 📝 Validate Issues 2 | 3 | on: 4 | issues: 5 | types: [opened, labeled, unlabeled] 6 | 7 | jobs: 8 | check-labels-on-issues: 9 | uses: Automattic/dangermattic/.github/workflows/reusable-check-labels-on-issues.yml@v1.0.0 10 | with: 11 | label-format-list: '[ 12 | "^\[.+\]", 13 | "^[[:alnum:]]" 14 | ]' 15 | label-error-message: '🚫 Please add a type label (e.g. **[Type] Enhancement**) and a feature label (e.g. **Stats**) to this issue.' 16 | label-success-message: 'Thanks for reporting! 👍' 17 | secrets: 18 | github-token: ${{ secrets.DANGERMATTIC_GITHUB_TOKEN }} 19 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | inherit_from: .rubocop_todo.yml 2 | 3 | AllCops: 4 | Exclude: 5 | - DerivedData/**/* 6 | - Pods/**/* 7 | - vendor/**/* 8 | NewCops: enable 9 | SuggestExtensions: 10 | rubocop-rake: false 11 | 12 | Metrics/MethodLength: 13 | Max: 30 14 | 15 | Layout/LineLength: 16 | Max: 180 17 | 18 | Metrics/BlockLength: 19 | Exclude: &xfiles 20 | - fastlane/Fastfile 21 | - fastlane/lanes/*.rb 22 | - Rakefile 23 | 24 | Style/HashSyntax: 25 | EnforcedShorthandSyntax: never 26 | # Used by UI test account methods. See https://github.com/Automattic/simplenote-ios/pull/1275 for more details. 27 | Style/GlobalVars: 28 | AllowedVariables: 29 | - $used_test_account_index 30 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.2.2 2 | -------------------------------------------------------------------------------- /.xcode-version: -------------------------------------------------------------------------------- 1 | 16.4 2 | -------------------------------------------------------------------------------- /BuildTools/Empty.swift: -------------------------------------------------------------------------------- 1 | // Here only to satisfy SwiftPM requirement. 2 | // See https://github.com/nicklockwood/SwiftFormat#1-create-a-buildtools-folder-and-packageswift 3 | -------------------------------------------------------------------------------- /BuildTools/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "originHash" : "cd02791f9079102404056ed65d89c5c6bb997332bbfd1b03550dfdd51e57551e", 3 | "pins" : [ 4 | { 5 | "identity" : "swiftlintplugins", 6 | "kind" : "remoteSourceControl", 7 | "location" : "https://github.com/SimplyDanny/SwiftLintPlugins", 8 | "state" : { 9 | "revision" : "7a3d77f3dd9f91d5cea138e52c20cfceabf352de", 10 | "version" : "0.58.2" 11 | } 12 | } 13 | ], 14 | "version" : 3 15 | } 16 | -------------------------------------------------------------------------------- /External/Hoextdown/escape.h: -------------------------------------------------------------------------------- 1 | /* escape.h - escape utilities */ 2 | 3 | #ifndef HOEDOWN_ESCAPE_H 4 | #define HOEDOWN_ESCAPE_H 5 | 6 | #include "buffer.h" 7 | 8 | #ifdef __cplusplus 9 | extern "C" { 10 | #endif 11 | 12 | 13 | /************* 14 | * FUNCTIONS * 15 | *************/ 16 | 17 | /* hoedown_escape_href: escape (part of) a URL inside HTML */ 18 | void hoedown_escape_href(hoedown_buffer *ob, const uint8_t *data, size_t size); 19 | 20 | /* hoedown_escape_html: escape HTML */ 21 | void hoedown_escape_html(hoedown_buffer *ob, const uint8_t *data, size_t size, int secure); 22 | 23 | 24 | #ifdef __cplusplus 25 | } 26 | #endif 27 | 28 | #endif /** HOEDOWN_ESCAPE_H **/ 29 | -------------------------------------------------------------------------------- /External/Hoextdown/version.c: -------------------------------------------------------------------------------- 1 | #include "version.h" 2 | 3 | void 4 | hoedown_version(int *major, int *minor, int *revision, int *extras) 5 | { 6 | *major = HOEDOWN_VERSION_MAJOR; 7 | *minor = HOEDOWN_VERSION_MINOR; 8 | *revision = HOEDOWN_VERSION_REVISION; 9 | *extras = HOEDOWN_VERSION_EXTRAS; 10 | } 11 | -------------------------------------------------------------------------------- /External/Hoextdown/version.h: -------------------------------------------------------------------------------- 1 | /* version.h - holds Hoedown's version */ 2 | 3 | #ifndef HOEDOWN_VERSION_H 4 | #define HOEDOWN_VERSION_H 5 | 6 | #ifdef __cplusplus 7 | extern "C" { 8 | #endif 9 | 10 | 11 | /************* 12 | * CONSTANTS * 13 | *************/ 14 | 15 | #define HOEDOWN_VERSION "3.0.7.15" 16 | #define HOEDOWN_VERSION_MAJOR 3 17 | #define HOEDOWN_VERSION_MINOR 0 18 | #define HOEDOWN_VERSION_REVISION 7 19 | #define HOEDOWN_VERSION_EXTRAS 15 20 | 21 | 22 | /************* 23 | * FUNCTIONS * 24 | *************/ 25 | 26 | /* hoedown_version: retrieve Hoedown's version numbers */ 27 | void hoedown_version(int *major, int *minor, int *revision, int *extras); 28 | 29 | 30 | #ifdef __cplusplus 31 | } 32 | #endif 33 | 34 | #endif /** HOEDOWN_VERSION_H **/ 35 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source 'https://rubygems.org' 4 | 5 | gem 'danger-dangermattic', '~> 1.0' 6 | gem 'fastlane', '~> 2' 7 | gem 'fastlane-plugin-firebase_app_distribution', '~> 0.10' 8 | gem 'fastlane-plugin-sentry', '~> 1.6' 9 | gem 'fastlane-plugin-wpmreleasetoolkit', '~> 13.0' 10 | 11 | group :screenshots, optional: true do 12 | gem 'rmagick', '~> 3.2.0' 13 | end 14 | -------------------------------------------------------------------------------- /Scripts/pre-actions/configure-status-bar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | IPHONE_TIME=$(ruby -e "require 'time';puts Time.new(2007, 1, 9, 9, 42, 0).iso8601") 4 | 5 | xcrun simctl boot "${TARGET_DEVICE_IDENTIFIER}" 6 | 7 | xcrun simctl status_bar "${TARGET_DEVICE_IDENTIFIER}" override \ 8 | --time $IPHONE_TIME \ 9 | --dataNetwork wifi \ 10 | --wifiMode active \ 11 | --wifiBars 3 \ 12 | --cellularMode active \ 13 | --batteryState charged \ 14 | --batteryLevel 100 15 | 16 | -------------------------------------------------------------------------------- /Simplenote.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Simplenote/BuildConfiguration.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | enum BuildConfiguration: String { 4 | case debug 5 | case `internal` 6 | case appStore 7 | case release 8 | case unknown 9 | 10 | static var current: BuildConfiguration { 11 | 12 | #if DEBUG 13 | return .debug 14 | #elseif BUILD_INTERNAL 15 | return .internal 16 | #elseif BUILD_APP_STORE 17 | return .appStore 18 | #elseif BUILD_RELEASE 19 | return .release 20 | #else 21 | 22 | return .unknown 23 | #endif 24 | } 25 | 26 | static func `is`(_ configuration: BuildConfiguration) -> Bool { 27 | return configuration == current 28 | } 29 | } 30 | 31 | extension BuildConfiguration: CustomStringConvertible { 32 | var description: String { 33 | return self.rawValue 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Simplenote/Classes/ActivityType.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Simplenote's User Activities 4 | // 5 | enum ActivityType: String { 6 | 7 | /// Launch Simplenote Activity 8 | /// 9 | case launch = "com.codality.NotationalFlow.launch" 10 | 11 | /// New Note Activity 12 | /// 13 | case newNote = "com.codality.NotationalFlow.newNote" 14 | case newNoteShortcut = "OpenNewNoteIntent" 15 | 16 | /// Open a Note! 17 | /// 18 | case openNote = "com.codality.NotationalFlow.openNote" 19 | case openNoteShortcut = "OpenNoteIntent" 20 | 21 | /// Open an Item that was indexed by Spotlight 22 | /// 23 | case openSpotlightItem = "com.apple.corespotlightitem" 24 | } 25 | -------------------------------------------------------------------------------- /Simplenote/Classes/ApplicationShortcutItemType.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - ApplicationShortcutItemType: Types of application shortcuts 4 | // 5 | enum ApplicationShortcutItemType: String { 6 | case search 7 | case newNote 8 | case note 9 | } 10 | -------------------------------------------------------------------------------- /Simplenote/Classes/ApplicationStateProvider.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - ApplicationStateProvider 4 | // 5 | protocol ApplicationStateProvider { 6 | var applicationState: UIApplication.State { get } 7 | } 8 | -------------------------------------------------------------------------------- /Simplenote/Classes/CGRect+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - CGRect Methods 4 | // 5 | extension CGRect { 6 | 7 | /// Returns the resulting Rectangles by splitting the receiver in two, by the specified Rectangle's **minY** and **maxY** 8 | /// - Note: We rely on this API to determine the available editing area above and below the cursor 9 | /// 10 | func split(by rect: CGRect) -> (aboveSlice: CGRect, belowSlice: CGRect) { 11 | var belowSlice = self 12 | belowSlice.size.height = rect.minY - minY 13 | 14 | var aboveSlice = self 15 | aboveSlice.origin.y = rect.maxY 16 | aboveSlice.size.height = maxY - rect.maxY 17 | 18 | return (aboveSlice, belowSlice) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/DateFormatter+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Simplenote Extension 4 | // 5 | extension DateFormatter { 6 | 7 | /// Shared DateFormatters 8 | /// 9 | static let listDateFormatter: DateFormatter = { 10 | let formatter = DateFormatter() 11 | formatter.dateStyle = .short 12 | formatter.timeStyle = .none 13 | return formatter 14 | }() 15 | 16 | static let dateTimeFormatter: DateFormatter = { 17 | let formatter = DateFormatter() 18 | formatter.dateStyle = .medium 19 | formatter.timeStyle = .short 20 | return formatter 21 | }() 22 | 23 | static let dateFormatter: DateFormatter = { 24 | let formatter = DateFormatter() 25 | formatter.dateStyle = .medium 26 | formatter.timeStyle = .none 27 | return formatter 28 | }() 29 | } 30 | -------------------------------------------------------------------------------- /Simplenote/Classes/FileStorage.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - FileStorage 4 | // 5 | class FileStorage { 6 | private let fileURL: URL 7 | 8 | private lazy var decoder = JSONDecoder() 9 | private lazy var encoder = JSONEncoder() 10 | 11 | init(fileURL: URL) { 12 | self.fileURL = fileURL 13 | } 14 | 15 | /// Load an object 16 | /// 17 | func load() throws -> T? { 18 | let data = try Data(contentsOf: fileURL) 19 | return try decoder.decode(T.self, from: data) 20 | } 21 | 22 | /// Save an object 23 | /// 24 | func save(object: T) throws { 25 | let data = try encoder.encode(object) 26 | try data.write(to: fileURL) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Simplenote/Classes/IndexPath+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - IndexPath 4 | // 5 | extension IndexPath { 6 | 7 | func transpose(toSection newSection: Int) -> IndexPath { 8 | IndexPath(row: row, section: newSection) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Simplenote/Classes/JSONKit+Simplenote.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSONKit+Simplenote.h 3 | // Simplenote-iOS 4 | // 5 | // Created by Jorge Leandro Perez on 1/4/14. 6 | // Copyright (c) 2014 Simperium. All rights reserved. 7 | // 8 | 9 | 10 | 11 | @interface NSArray (JSONKit) 12 | - (NSString *)JSONString; 13 | @end 14 | 15 | @interface NSDictionary (JSONKit) 16 | - (NSString *)JSONString; 17 | @end 18 | 19 | @interface NSString (JSONKit) 20 | - (id)objectFromJSONString; 21 | @end 22 | 23 | @interface NSData (JSONKit) 24 | - (id)objectFromJSONString; 25 | @end 26 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSAttributedString+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NSMutableAttributedString Simplenote Methods 4 | // 5 | extension NSAttributedString { 6 | 7 | /// Returns the full range of the receiver. 8 | /// 9 | @objc 10 | var fullRange: NSRange { 11 | NSRange(location: .zero, length: length) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSMutableParagraphStyle+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NSMutableParagraphStyle 4 | // 5 | extension NSMutableParagraphStyle { 6 | 7 | convenience init(lineSpacing: CGFloat) { 8 | self.init() 9 | self.lineSpacing = lineSpacing 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSProcessInfo+Util.h: -------------------------------------------------------------------------------- 1 | 2 | @interface NSProcessInfo (Util) 3 | + (BOOL)isRunningTests; 4 | @end 5 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSProcessInfo+Util.m: -------------------------------------------------------------------------------- 1 | #import "NSProcessInfo+Util.h" 2 | 3 | @implementation NSProcessInfo (Util) 4 | 5 | + (BOOL)isRunningTests 6 | { 7 | NSDictionary *environment = [[NSProcessInfo processInfo] environment]; 8 | NSString *injectBundle = environment[@"XCInjectBundle"]; 9 | BOOL result = [[injectBundle pathExtension] isEqualToString:@"xctest"] || [[injectBundle pathExtension] isEqualToString:@"octest"]; 10 | return result; 11 | 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Attributed.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Attributed.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 9/2/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSString (Attributed) 12 | 13 | - (NSAttributedString *)attributedString; 14 | - (NSMutableAttributedString *)mutableAttributedString; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Attributed.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Attributed.m 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 9/2/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import "NSString+Attributed.h" 10 | 11 | @implementation NSString (Attributed) 12 | 13 | - (NSAttributedString *)attributedString { 14 | 15 | return [[NSAttributedString alloc] initWithString:self]; 16 | } 17 | 18 | - (NSMutableAttributedString *)mutableAttributedString { 19 | 20 | return [[NSMutableAttributedString alloc] initWithString:self]; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Bullets.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Bullets.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 8/25/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSString (Bullets) 12 | 13 | + (NSString *)spaceString; 14 | + (NSString *)tabString; 15 | + (NSString *)newLineString; 16 | 17 | - (BOOL)isNewlineString; 18 | - (BOOL)isTabString; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Condensing.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface NSString (Condensing) 6 | 7 | /// Returns a version of the receiver with all of its newlines replaced with spaces. 8 | /// 9 | /// - Note: Multiple consecutive newlines will be replaced by a *single* space 10 | /// 11 | - (NSString *)stringByReplacingNewlinesWithSpaces; 12 | 13 | @end 14 | 15 | NS_ASSUME_NONNULL_END 16 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Condensing.m: -------------------------------------------------------------------------------- 1 | #import "NSString+Condensing.h" 2 | 3 | @implementation NSString (Condensing) 4 | 5 | - (NSString *)stringByReplacingNewlinesWithSpaces 6 | { 7 | if (self.length == 0) { 8 | return self; 9 | } 10 | 11 | // Newlines: \n *AND* \r's! 12 | NSMutableArray *components = [[self componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] mutableCopy]; 13 | 14 | // Note: The following nukes everything that tests true for `isEquals`: Every single empty string is gone! 15 | [components removeObject:@""]; 16 | 17 | return [components componentsJoinedByString:@" "]; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Metadata.h: -------------------------------------------------------------------------------- 1 | 2 | @interface NSString (Metadata) 3 | 4 | // Removes pin and tags 5 | - (NSArray *)stringArray; 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Metadata.m: -------------------------------------------------------------------------------- 1 | #import "NSString+Metadata.h" 2 | 3 | @implementation NSString (Metadata) 4 | 5 | - (NSArray *)stringArray { 6 | NSMutableArray *list = [NSMutableArray arrayWithArray: [self componentsSeparatedByString:@" "]]; 7 | NSMutableArray *discardedItems = [NSMutableArray array]; 8 | NSString *str; 9 | 10 | for (str in list) { 11 | if ([str length] == 0) 12 | [discardedItems addObject:str]; 13 | } 14 | 15 | [list removeObjectsInArray:discardedItems]; 16 | 17 | return list; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSString+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NSString Simplenote Helpers 4 | // 5 | extension NSString { 6 | 7 | /// Returns the full range of the receiver 8 | /// 9 | @objc 10 | var fullRange: NSRange { 11 | NSRange(location: .zero, length: length) 12 | } 13 | 14 | /// Encodes the receiver as a `Tag Hash` 15 | /// 16 | @objc 17 | var byEncodingAsTagHash: String { 18 | precomposedStringWithCanonicalMapping 19 | .lowercased() 20 | .addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? self as String 21 | } 22 | 23 | /// Indicates if the receiver contains a valid email address 24 | /// 25 | @objc 26 | var isValidEmailAddress: Bool { 27 | let predicate = NSPredicate.predicateForEmailValidation() 28 | return predicate.evaluate(with: self) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Simplenote/Classes/NSURL+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// This extension contains several helper-additions to Cocoa NSURL class. 4 | /// 5 | extension NSURL { 6 | 7 | /// Returns *true* if the current URL is HTTP or HTTPS 8 | /// 9 | @objc func containsHttpScheme() -> Bool { 10 | return scheme == "http" || scheme == "https" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Simplenote/Classes/NotesListSection.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NotesListSection 4 | // 5 | struct NotesListSection { 6 | 7 | /// Section Title 8 | /// 9 | let title: String? 10 | 11 | /// Section Objects 12 | /// 13 | let objects: [Any] 14 | 15 | /// Returns the number of Objects in the current section 16 | /// 17 | var numberOfObjects: Int { 18 | objects.count 19 | } 20 | 21 | var displaysTitle: Bool { 22 | title != nil && numberOfObjects > 0 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Simplenote/Classes/PassthruView.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - PassthruView: Doesn't capture tap events performed over itself! 4 | // 5 | class PassthruView: UIView { 6 | 7 | /// Callback is invoked when interacted with this view and not with subviews 8 | /// 9 | var onInteraction: (() -> Void)? 10 | 11 | override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 12 | let output = super.hitTest(point, with: event) 13 | if output == self { 14 | onInteraction?() 15 | return nil 16 | } 17 | 18 | return output 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/PersonTag.h: -------------------------------------------------------------------------------- 1 | // 2 | // PersonTag.h 3 | // Simplenote 4 | // 5 | // Created by Michael Johnston on 11-08-23. 6 | // Copyright (c) 2011 Codality. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PersonTag : NSObject 12 | 13 | @property (nonatomic, copy) NSString *name; 14 | @property (nonatomic, copy) NSString *email; 15 | @property (nonatomic) BOOL active; 16 | 17 | - (instancetype)initWithName:(NSString *)aName email:(NSString *)anEmail; 18 | 19 | - (NSComparisonResult)compareName:(PersonTag *)anotherTag; 20 | - (NSComparisonResult)compareEmail:(PersonTag *)anotherTag; 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Simplenote/Classes/RoundedButton.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - RoundedButton 4 | // 5 | class RoundedButton: UIButton { 6 | override var bounds: CGRect { 7 | didSet { 8 | guard bounds.size != oldValue.size else { 9 | return 10 | } 11 | 12 | updateCornerRadius() 13 | } 14 | } 15 | 16 | override init(frame: CGRect) { 17 | super.init(frame: frame) 18 | configure() 19 | } 20 | 21 | required init?(coder: NSCoder) { 22 | super.init(coder: coder) 23 | configure() 24 | } 25 | } 26 | 27 | // MARK: - Private 28 | // 29 | private extension RoundedButton { 30 | func configure() { 31 | layer.masksToBounds = true 32 | updateCornerRadius() 33 | } 34 | 35 | func updateCornerRadius() { 36 | layer.cornerRadius = min(frame.height, frame.width) / 2 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Simplenote/Classes/RoundedView.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - RoundedView 4 | // 5 | class RoundedView: UIView { 6 | override var bounds: CGRect { 7 | didSet { 8 | guard bounds.size != oldValue.size else { 9 | return 10 | } 11 | 12 | updateCornerRadius() 13 | } 14 | } 15 | 16 | override init(frame: CGRect) { 17 | super.init(frame: frame) 18 | configure() 19 | } 20 | 21 | required init?(coder: NSCoder) { 22 | super.init(coder: coder) 23 | configure() 24 | } 25 | } 26 | 27 | // MARK: - Private 28 | // 29 | private extension RoundedView { 30 | func configure() { 31 | layer.masksToBounds = true 32 | updateCornerRadius() 33 | } 34 | 35 | func updateCornerRadius() { 36 | layer.cornerRadius = min(frame.height, frame.width) / 2 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPAcitivitySafari.h: -------------------------------------------------------------------------------- 1 | // 2 | // TWAcitivityOpenInSafari.h 3 | // Poster 4 | // 5 | // 8/17/12. 6 | // 7 | // 8 | 9 | #import 10 | 11 | @interface SPAcitivitySafari : UIActivity 12 | { 13 | NSURL *openURL; 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPDebugViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDebugViewController.h 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 6/3/14. 6 | // Copyright (c) 2014 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPTableViewController.h" 11 | 12 | 13 | @interface SPDebugViewController : SPTableViewController 14 | 15 | + (instancetype)newDebugViewController; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPEntryListAutoCompleteCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPCollaboratorCompletionCell.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 7/27/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import "SPEntryListCell.h" 10 | 11 | @interface SPEntryListAutoCompleteCell : SPEntryListCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPEntryListAutoCompleteCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPCollaboratorCompletionCell.m 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 7/27/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import "SPEntryListAutoCompleteCell.h" 10 | 11 | @implementation SPEntryListAutoCompleteCell 12 | 13 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 14 | { 15 | self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 16 | if (self) { 17 | primaryLabel.font = secondaryLabel.font; 18 | checkmarkImageView.hidden = YES; 19 | } 20 | return self; 21 | } 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPEntryListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPCollaboratorCell.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 7/27/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SPEntryListCell : UITableViewCell { 12 | 13 | UILabel *primaryLabel; 14 | UILabel *secondaryLabel; 15 | UIImageView *checkmarkImageView; 16 | } 17 | 18 | - (void)setupWithPrimaryText:(NSString *)primaryText secondaryText:(NSString *)secondaryText checkmarked:(BOOL)checkmarked; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPInteractiveTextStorage.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | @interface SPInteractiveTextStorage : NSTextStorage 5 | 6 | @property (nonatomic, copy) NSDictionary *defaultStyle; 7 | @property (nonatomic, copy) NSDictionary *headlineStyle; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPLabel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - SPLabel: Standard UIKit Label with extra properties. And batteries! 5 | // 6 | @IBDesignable 7 | class SPLabel: UILabel { 8 | 9 | /// # Insets to be applied over the actual text 10 | /// 11 | @IBInspectable var textInsets = UIEdgeInsets.zero 12 | 13 | // MARK: - Overrides 14 | 15 | override func drawText(in rect: CGRect) { 16 | super.drawText(in: rect.inset(by: textInsets)) 17 | } 18 | 19 | override var intrinsicContentSize: CGSize { 20 | let size = super.intrinsicContentSize 21 | 22 | return CGSize(width: size.width + textInsets.left + textInsets.right, 23 | height: size.height + textInsets.top + textInsets.bottom) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPMarkdownParser.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPMarkdownParser.h 3 | // Simplenote 4 | // 5 | // Created by James Frost on 01/10/2015. 6 | // Copyright © 2015 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * @class SPMarkdownParser 13 | * @brief This is a simple wrapper around the 'hoedown' Markdown parser, 14 | * which produces HTML from a Markdown input string. 15 | */ 16 | @interface SPMarkdownParser : NSObject 17 | 18 | + (NSString *)renderHTMLFromMarkdownString:(NSString *)markdown; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPMarkdownPreviewViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPMarkdownPreviewViewController.h 3 | // Simplenote 4 | // 5 | // Created by James Frost on 01/10/2015. 6 | // Copyright © 2015 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPInteractivePushPopAnimationController.h" 11 | 12 | 13 | /** 14 | * @class SPMarkdownPreviewViewController 15 | * @brief Displays Markdown text rendered as HTML in a web view. 16 | */ 17 | @interface SPMarkdownPreviewViewController : UIViewController 18 | 19 | /// Markdown text to render as HTML 20 | @property (nonatomic, copy) NSString *markdownText; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPModalActivityIndicator.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface SPModalActivityIndicator : UIView { 4 | 5 | CGRect boxFrame; 6 | UIView *topView; 7 | } 8 | 9 | @property (nonatomic, retain) UIView *contentView; 10 | 11 | + (SPModalActivityIndicator *)showInWindow:(UIWindow *)window; 12 | - (void)dismiss:(BOOL)animated completion:(void (^)())completion; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPNavigationController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | typedef void(^SPNavigationControllerBlock)(void); 5 | 6 | @interface SPNavigationController : UINavigationController 7 | 8 | @property (nonatomic) BOOL displaysBlurEffect; 9 | @property (nonatomic) BOOL disableRotation; 10 | @property (nonatomic, copy) SPNavigationControllerBlock onWillDismiss; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPNotifications.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPNotifications.h 3 | // Simplenote 4 | // 5 | // Copyright © 2019 Automattic. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | 11 | #pragma mark ================================================================================ 12 | #pragma mark Notifications 13 | #pragma mark ================================================================================ 14 | 15 | extern NSString *const SPAlphabeticalTagSortPreferenceChangedNotification; 16 | extern NSString *const SPCondensedNoteListPreferenceChangedNotification; 17 | extern NSString *const SPNotesListSortModeChangedNotification; 18 | extern NSString *const SPSimplenoteThemeChangedNotification; 19 | extern NSString *const SPSubscriptionStatusDidChangeNotification; 20 | 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPRatingsHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPRatingsHelper.h 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 3/19/15. 6 | // Copyright (c) 2015 Automattic. All rights reserved. 7 | // 8 | 9 | #import "WPRatingsHelper.h" 10 | 11 | @interface SPRatingsHelper : WPRatingsHelper 12 | 13 | - (void)reloadSettings; 14 | - (BOOL)shouldPromptForAppReview; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPSettingsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SPTableViewController.h" 3 | 4 | @interface SPSettingsViewController : SPTableViewController { 5 | //Preferences 6 | NSNumber *sortOrderPref; 7 | NSNumber *numPreviewLinesPref; 8 | } 9 | 10 | @end 11 | 12 | extern NSString *const SPAlphabeticalTagSortPref; 13 | extern NSString *const SPSustainerAppIconName; 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPSimpleTextPrintFormatter.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class SPSimpleTextPrintFormatter: UISimpleTextPrintFormatter { 4 | override init(text: String) { 5 | super.init(text: text) 6 | 7 | // Check for darkmode 8 | // If dark mode is enabled change the text color to black before printing 9 | if SPUserInterface.isDark { 10 | self.color = .black 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPTableViewController.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 10/13/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SPTableViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPTagEntryField.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPTagTextView.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 7/24/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPTextField.h" 11 | 12 | @class SPTagEntryField; 13 | 14 | @protocol SPTagEntryFieldDelegate 15 | 16 | @optional 17 | - (void)tagEntryFieldDidChange:(SPTagEntryField *)tagTextField; 18 | @end 19 | 20 | 21 | @interface SPTagEntryField : SPTextField 22 | 23 | @property (nonatomic, weak) id tagDelegate; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPTagHeaderView.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - SPTagHeaderView 5 | // 6 | @objc @objcMembers 7 | class SPTagHeaderView: UIView { 8 | 9 | /// Leading TitleLabel 10 | /// 11 | @IBOutlet private(set) var titleLabel: UILabel! 12 | 13 | /// Trailing ActionButton 14 | /// 15 | @IBOutlet private(set) var actionButton: UIButton! { 16 | didSet { 17 | actionButton.titleLabel?.adjustsFontForContentSizeCategory = true 18 | } 19 | } 20 | 21 | // MARK: - Overriden Methods 22 | 23 | override func awakeFromNib() { 24 | super.awakeFromNib() 25 | refreshStyle() 26 | } 27 | 28 | /// Updates the receiver's colors 29 | /// 30 | func refreshStyle() { 31 | titleLabel.textColor = .simplenoteTextColor 32 | actionButton.setTitleColor(.simplenoteInteractiveTextColor, for: .normal) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPTextField.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPTextField.h 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 10/13/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SPTextField : UITextField 12 | 13 | @property (nonatomic, assign) NSDirectionalEdgeInsets rightViewInsets; 14 | @property (nonatomic, strong) UIColor *placeholdTextColor; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/SPTransitionController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | extern NSString *const SPTransitionControllerPopGestureTriggeredNotificationName; 5 | 6 | 7 | @protocol SPInteractiveDismissableViewController 8 | @property (readonly) BOOL requiresFirstResponderRestorationBypass; 9 | @end 10 | 11 | 12 | @interface SPTransitionController : NSObject 13 | - (instancetype)initWithNavigationController:(UINavigationController *)navigationController; 14 | @end 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/Settings.h: -------------------------------------------------------------------------------- 1 | // 2 | // Settings.h 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 3/16/15. 6 | // Copyright (c) 2015 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface Settings : SPManagedObject 13 | 14 | @property (nonatomic, copy) NSString *ghostData; 15 | @property (nonatomic, copy) NSString *simperiumKey; 16 | 17 | @property (nonatomic, strong) NSNumber *ratings_disabled; 18 | @property (nonatomic, strong) NSNumber *minimum_events; 19 | @property (nonatomic, strong) NSNumber *minimum_interval_days; 20 | 21 | @property (nonatomic, strong) NSNumber *like_skip_versions; 22 | @property (nonatomic, strong) NSNumber *decline_skip_versions; 23 | @property (nonatomic, strong) NSNumber *dislike_skip_versions; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Simplenote/Classes/Settings.m: -------------------------------------------------------------------------------- 1 | // 2 | // Settings.m 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 3/16/15. 6 | // Copyright (c) 2015 Automattic. All rights reserved. 7 | // 8 | 9 | #import "Settings.h" 10 | 11 | 12 | @implementation Settings 13 | 14 | @dynamic ghostData; 15 | @dynamic simperiumKey; 16 | 17 | @dynamic ratings_disabled; 18 | @dynamic minimum_events; 19 | @dynamic minimum_interval_days; 20 | 21 | @dynamic like_skip_versions; 22 | @dynamic decline_skip_versions; 23 | @dynamic dislike_skip_versions; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Simplenote/Classes/Simperium+Simplenote.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "Preferences.h" 4 | 5 | 6 | @interface Simperium (Simplenote) 7 | 8 | - (nonnull Preferences *)preferencesObject; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /Simplenote/Classes/Simperium+Simplenote.m: -------------------------------------------------------------------------------- 1 | #import "Simperium+Simplenote.h" 2 | #import "Simplenote-Swift.h" 3 | 4 | 5 | @implementation Simperium (Simplenote) 6 | 7 | - (Preferences *)preferencesObject 8 | { 9 | SPBucket *bucket = [self bucketForName:NSStringFromClass([Preferences class])]; 10 | Preferences *preferences = [bucket objectForKey:kSimperiumPreferencesObjectKey]; 11 | if (preferences != nil) { 12 | return preferences; 13 | } 14 | 15 | return [bucket insertNewObjectForKey:kSimperiumPreferencesObjectKey]; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Simplenote/Classes/StatusChecker.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | 5 | @class Simperium; 6 | 7 | #pragma mark ================================================================================ 8 | #pragma mark StatusChecker 9 | #pragma mark ================================================================================ 10 | 11 | @interface StatusChecker : NSObject 12 | 13 | + (BOOL)hasUnsentChanges:(Simperium *)simperium; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Simplenote/Classes/Tag.h: -------------------------------------------------------------------------------- 1 | // 2 | // Tag.h 3 | // Simplenote 4 | // 5 | // Created by Michael Johnston on 10-04-19. 6 | // Copyright 2010 Simperium. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Tag : SPManagedObject { 12 | NSString *name; 13 | NSMutableArray *recipients; 14 | int count; 15 | NSNumber *index; 16 | NSString *share; 17 | } 18 | 19 | @property (nonatomic, retain) NSString *name; 20 | @property (nonatomic, retain) NSMutableArray *recipients; 21 | @property (nonatomic) int count; 22 | @property (nonatomic, retain) NSNumber *index; 23 | @property (nonatomic, retain) NSString *share; 24 | 25 | - (id)initWithText:(NSString *)str; 26 | - (id)initWithText:(NSString *)str recipients:(NSArray *)emailList; 27 | - (NSString *)textWithPrefix; 28 | - (void)addRecipient:(NSString *)emailAddress; 29 | - (NSDictionary *)tagDictionary; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Simplenote/Classes/TagListTextField.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - TagListTextField 4 | // 5 | class TagListTextField: UITextField { 6 | override func paste(_ sender: Any?) { 7 | pasteTag() 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIBarButtonItem+Appearance.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UIBarButtonItem + Appearance 4 | // 5 | extension UIBarButtonItem { 6 | 7 | /// Applies the Simplenote Appearance to `UIBarButtonItem` instances 8 | /// 9 | class func refreshAppearance() { 10 | let titleAttributes: [NSAttributedString.Key: Any] = [ 11 | .font: UIFont.preferredFont(forTextStyle: .body) 12 | ] 13 | 14 | let appearance = UIBarButtonItem.appearance() 15 | appearance.setTitleTextAttributes(titleAttributes, for: .normal) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIBezierPath+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - UIBezierPath Methods 5 | // 6 | extension UIBezierPath { 7 | 8 | /// Returns an UIImage representation of the receiver. 9 | /// 10 | func imageRepresentation(color: UIColor) -> UIImage { 11 | return UIGraphicsImageRenderer(size: bounds.size).image { [unowned self] context in 12 | self.addClip() 13 | color.setFill() 14 | context.fill(bounds) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIBlurEffect+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - UIBlurEffect Simplenote Methods 5 | // 6 | extension UIBlurEffect { 7 | 8 | /// Returns a UIBlurEffect instance matching the System preferences 9 | /// 10 | @objc 11 | static var simplenoteBlurEffect: UIBlurEffect { 12 | return UIBlurEffect(style: simplenoteBlurStyle) 13 | } 14 | 15 | /// Returns the UIBlurEffect.Style matching the System preferences 16 | /// 17 | @objc 18 | static var simplenoteBlurStyle: UIBlurEffect.Style { 19 | .regular 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIContextualAction+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - Simplenote Methods 5 | // 6 | extension UIContextualAction { 7 | 8 | /// Initializes a Contextual Action with the specified parameters 9 | /// 10 | convenience init(style: UIContextualAction.Style, 11 | title: String? = nil, 12 | image: UIImage? = nil, 13 | backgroundColor: UIColor, 14 | handler: @escaping UIContextualAction.Handler) { 15 | 16 | self.init(style: style, title: title, handler: handler) 17 | self.image = image 18 | self.backgroundColor = backgroundColor 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIDevice+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Simplenote Methods 4 | // 5 | extension UIDevice { 6 | 7 | @objc 8 | static var isPad: Bool { 9 | UIDevice.current.userInterfaceIdiom == .pad 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIImage+Colorization.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Colorization.h 3 | // 4 | // Created by Tom Witkin on 1/13/13. 5 | // Copyright (c) 2013 Tom Witkin. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIImage (Colorization) 11 | 12 | - (UIImage *)imageWithOverlayColor:(UIColor *)color; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIImage+Dynamic.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - Dynamic Images 5 | // 6 | extension UIImage { 7 | 8 | /// Returns the SearchBar Background Image 9 | /// 10 | class var searchBarBackgroundImage: UIImage { 11 | let tintColor = UIColor.simplenoteSearchBarBackgroundColor.withAlphaComponent(SearchBackgroundMetrics.alpha) 12 | let path = UIBezierPath(roundedRect: SearchBackgroundMetrics.rect, cornerRadius: SearchBackgroundMetrics.radius) 13 | return path.imageRepresentation(color: tintColor) 14 | } 15 | } 16 | 17 | // MARK: - Constants 18 | // 19 | private enum SearchBackgroundMetrics { 20 | static let alpha = CGFloat(0.3) 21 | static let radius = CGFloat(10) 22 | static let rect = CGRect(x: 0, y: 0, width: 16, height: 36) 23 | } 24 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIImage+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - Simplenote's UIImage Static Methods 5 | // 6 | extension UIImage { 7 | 8 | /// Returns the UIColor instance matching a given UIColorName. If any 9 | /// 10 | @objc 11 | static func image(name: UIImageName) -> UIImage? { 12 | UIImage(named: name.lightAssetFilename) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIKeyCommand+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UIKeyCommand 4 | // 5 | extension UIKeyCommand { 6 | 7 | static var inputLeadingArrow: String { 8 | return UIApplication.isRTL ? UIKeyCommand.inputRightArrow : UIKeyCommand.inputLeftArrow 9 | } 10 | 11 | static var inputTrailingArrow: String { 12 | return UIApplication.isRTL ? UIKeyCommand.inputLeftArrow : UIKeyCommand.inputRightArrow 13 | } 14 | 15 | static let inputReturn = "\r" 16 | 17 | static let inputTab = "\t" 18 | 19 | convenience init(input: String, 20 | modifierFlags: UIKeyModifierFlags, 21 | action: Selector, 22 | title: String? = nil) { 23 | self.init(input: input, modifierFlags: modifierFlags, action: action) 24 | 25 | if let title = title { 26 | self.title = title 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIKeyboardAppearance+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UIKeyboardAppearance 4 | // 5 | extension UIKeyboardAppearance { 6 | 7 | /// Returns the Keyboard Appearance matching the current Style 8 | /// 9 | static var simplenoteKeyboardAppearance: UIKeyboardAppearance { 10 | SPUserInterface.isDark ? .dark : .default 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Simplenote/Classes/UINavigationBar+Appearance.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UINavigationBar + Appearance 4 | // 5 | extension UINavigationBar { 6 | 7 | /// Applies the Simplenote Appearance to `UINavigationBar` instances 8 | /// 9 | class func refreshAppearance() { 10 | let clearImage = UIImage() 11 | let apperance = UINavigationBar.appearance(whenContainedInInstancesOf: [SPNavigationController.self]) 12 | 13 | apperance.barTintColor = .clear 14 | apperance.shadowImage = clearImage 15 | apperance.titleTextAttributes = [ 16 | .font: UIFont.systemFont(ofSize: 17, weight: .semibold), 17 | .foregroundColor: UIColor.simplenoteNavigationBarTitleColor 18 | ] 19 | apperance.setBackgroundImage(clearImage, for: .default) 20 | apperance.setBackgroundImage(clearImage, for: .defaultPrompt) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Simplenote/Classes/UINavigationBar+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UINavigationBar Simplenote Methods 4 | // 5 | extension UINavigationBar { 6 | 7 | /// Applies Simplenote's **LIGHT** Style 8 | /// 9 | @objc 10 | func applyLightStyle() { 11 | let bcColor = UIColor.white 12 | backgroundColor = bcColor 13 | barTintColor = bcColor 14 | 15 | let backgroundImage = UIImage() 16 | shadowImage = backgroundImage 17 | setBackgroundImage(backgroundImage, for: .default) 18 | setBackgroundImage(backgroundImage, for: .defaultPrompt) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Simplenote/Classes/UINavigationController+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UINavigationController Simplenote API 4 | // 5 | extension UINavigationController { 6 | 7 | /// Returns the first Child ViewController of the specified Type 8 | /// 9 | func firstChild(ofType type: T.Type) -> T? { 10 | for child in children where child is T { 11 | return child as? T 12 | } 13 | 14 | return nil 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIPasteboard+Note.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UIPasteboard + Interlink 4 | // 5 | extension UIPasteboard { 6 | 7 | /// Copies the Internal Link (Markdown Reference) into the OS Pasteboard 8 | /// 9 | func copyInternalLink(to note: Note) { 10 | guard let link = note.markdownInternalLink else { 11 | return 12 | } 13 | 14 | string = link 15 | } 16 | 17 | /// Copies the Public Link (if any) into the OS Pasteboard 18 | /// 19 | func copyPublicLink(to note: Note) { 20 | guard let link = note.publicLink else { 21 | return 22 | } 23 | 24 | string = link 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIResponder+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UIResponder 4 | // 5 | extension UIResponder { 6 | private static weak var _currentFirstResponder: UIResponder? 7 | 8 | static var currentFirstResponder: UIResponder? { 9 | _currentFirstResponder = nil 10 | UIApplication.shared.sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, for: nil) 11 | 12 | return _currentFirstResponder 13 | } 14 | 15 | @objc 16 | private func findFirstResponder(_ sender: Any) { 17 | UIResponder._currentFirstResponder = self 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIScreen+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UIScreen Simplenote Methods 4 | // 5 | extension UIScreen { 6 | 7 | /// Returns the ratio between 1 point and 1 pixel in the current device. 8 | /// 9 | @objc 10 | var pointToPixelRatio: CGFloat { 11 | return 1 / scale 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIScrollView+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UIScrollView 4 | // 5 | extension UIScrollView { 6 | 7 | /// Returns an offset that is checked against min and max offset 8 | /// 9 | func boundedContentOffset(from offset: CGPoint) -> CGPoint { 10 | let minXOffset = -adjustedContentInset.left 11 | let minYOffset = -adjustedContentInset.top 12 | 13 | let maxXOffset = contentSize.width - bounds.width + adjustedContentInset.right 14 | let maxYOffset = contentSize.height - bounds.height + adjustedContentInset.bottom 15 | 16 | return CGPoint(x: max(minXOffset, min(maxXOffset, offset.x)), 17 | y: max(minYOffset, min(maxYOffset, offset.y))) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITableViewCell+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | /// UITableViewCell Helpers 5 | /// 6 | extension UITableViewCell { 7 | enum SeparatorWidth { 8 | case full 9 | case standard 10 | } 11 | 12 | /// Returns a reuseIdentifier that matches the receiver's classname (non namespaced). 13 | /// 14 | @objc 15 | class var reuseIdentifier: String { 16 | return classNameWithoutNamespaces 17 | } 18 | 19 | /// Adjust width of a separator 20 | /// 21 | func adjustSeparatorWidth(width: SeparatorWidth) { 22 | var separatorInset = self.separatorInset 23 | separatorInset.left = width == .full ? 0 : contentView.layoutMargins.left 24 | separatorInset.right = 0 25 | self.separatorInset = separatorInset 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITableViewHeaderFooterView+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | /// UITableViewHeaderFooterView Helpers 5 | /// 6 | extension UITableViewHeaderFooterView { 7 | 8 | /// Returns a reuseIdentifier that matches the receiver's classname (non namespaced). 9 | /// 10 | @objc 11 | class var reuseIdentifier: String { 12 | return classNameWithoutNamespaces 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITextField+Tag.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UITextField 4 | // 5 | extension UITextField { 6 | /// Preprocess pasteboard content before pasting into tag text field 7 | /// 8 | @objc 9 | func pasteTag() { 10 | guard let selectedRange = selectedRange, 11 | let pasteboardText = UIPasteboard.general.string, !pasteboardText.isEmpty else { 12 | return 13 | } 14 | 15 | guard let tag = TagTextFieldInputValidator().preprocessForPasting(tag: pasteboardText), 16 | !tag.isEmpty else { 17 | return 18 | } 19 | 20 | guard delegate?.textField?(self, shouldChangeCharactersIn: selectedRange, replacementString: tag) == true else { 21 | return 22 | } 23 | 24 | insertText(tag) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITextInput+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UITextInput 4 | // 5 | extension UITextInput { 6 | /// Returns NSRange from UITextRange 7 | /// 8 | var selectedRange: NSRange? { 9 | guard let range = selectedTextRange else { return nil } 10 | let location = offset(from: beginningOfDocument, to: range.start) 11 | let length = offset(from: range.start, to: range.end) 12 | return NSRange(location: location, length: length) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITextView+Simplenote.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+Simplenote.h 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 3/25/15. 6 | // Copyright (c) 2015 Simperium. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UITextView (Simplenote) 12 | 13 | - (BOOL)applyAutoBulletsWithReplacementText:(NSString *)replacementText replacementRange:(NSRange)replacementRange; 14 | - (NSRange)visibleTextRange; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Simplenote/Classes/UITraitCollection+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - UITraitCollection Simplenote Methods 5 | // 6 | extension UITraitCollection { 7 | 8 | /// Returns a UITraitCollection that *only* contains the Light Interface Style. No other attribute is initialized 9 | /// 10 | static var purelyLightTraits: UITraitCollection { 11 | UITraitCollection(userInterfaceStyle: .light) 12 | } 13 | 14 | /// Returns a UITraitCollection that *only* contains the Dark Interface Style. No other attribute is initialized 15 | /// 16 | static var purelyDarkTraits: UITraitCollection { 17 | UITraitCollection(userInterfaceStyle: .dark) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Simplenote/Classes/UIView+ImageRepresentation.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - UIView: Image Representation Helpers 5 | // 6 | extension UIView { 7 | 8 | /// Returns a UIImage containing a rastrerized version of the receiver. 9 | /// 10 | @objc 11 | func imageRepresentation() -> UIImage { 12 | let renderer = UIGraphicsImageRenderer(bounds: bounds) 13 | return renderer.image { [unowned self] rendererContext in 14 | self.layer.render(in: rendererContext.cgContext) 15 | } 16 | } 17 | 18 | /// Returns the Image Representation of the receiver, contained within an UIImageView Instance. 19 | /// 20 | @objc 21 | func imageRepresentationWithinImageView() -> UIImageView { 22 | let output = UIImageView(image: imageRepresentation()) 23 | output.sizeToFit() 24 | return output 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Simplenote/Classes/WPAuthHandler.h: -------------------------------------------------------------------------------- 1 | // 2 | // WPAuthHandler.h 3 | // Simplenote 4 | // Handles oauth authentication with WordPress.com 5 | // 6 | 7 | #import 8 | 9 | @interface WPAuthHandler : NSObject 10 | + (BOOL)isWPAuthenticationUrl:(NSURL*)url; 11 | + (void)presentWordPressSSOFromViewController:(UIViewController *)presenter; 12 | + (SPUser *)authorizeSimplenoteUserFromUrl:(NSURL*)url forAppId:(NSString *)appId; 13 | @end 14 | -------------------------------------------------------------------------------- /Simplenote/Date+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension Date { 4 | func increased(byHours hours: Int) -> Date? { 5 | var components = DateComponents() 6 | components.hour = hours 7 | return Calendar.current.date(byAdding: components, to: self) 8 | } 9 | 10 | func increased(byDays days: Int) -> Date? { 11 | var components = DateComponents() 12 | components.day = days 13 | return Calendar.current.date(byAdding: components, to: self) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Beta.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-App-iTunes.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Beta.appiconset/Icon-App-iTunes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Beta.appiconset/Icon-App-iTunes.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @1024x1024.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @114x114.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @120x120 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @120x120 1.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @120x120.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @128x128 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @128x128 1.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @128x128.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @136x136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @136x136.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @152x152.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @167x167.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @180x180.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @192x192.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @40x40.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @58x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @58x58.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @60x60.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @76x76.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @80x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @80x80.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @87x87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon-Sustainer.appiconset/SN-Sustainer @87x87.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-App-iTunes.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/AppIcon.appiconset/Icon-App-iTunes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Icons.xcassets/AppIcon.appiconset/Icon-App-iTunes.png -------------------------------------------------------------------------------- /Simplenote/Icons.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "action_button_background.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "action_button_background@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background.imageset/action_button_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/action_button_background.imageset/action_button_background.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background.imageset/action_button_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/action_button_background.imageset/action_button_background@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background_highlighted.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "action_button_background_highlighted.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "action_button_background_highlighted@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background_highlighted.imageset/action_button_background_highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/action_button_background_highlighted.imageset/action_button_background_highlighted.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/action_button_background_highlighted.imageset/action_button_background_highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/action_button_background_highlighted.imageset/action_button_background_highlighted@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small_dark.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small.imageset/button_delete_small_dark@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small_dark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "button_delete_small_dark.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "button_delete_small_dark@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small_dark.imageset/button_delete_small_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small_dark.imageset/button_delete_small_dark.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_delete_small_dark.imageset/button_delete_small_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_delete_small_dark.imageset/button_delete_small_dark@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_safari.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "button_safari.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "button_safari@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | }, 17 | { 18 | "idiom" : "ipad", 19 | "scale" : "1x", 20 | "filename" : "button_safari~ipad.png" 21 | }, 22 | { 23 | "idiom" : "ipad", 24 | "scale" : "2x", 25 | "filename" : "button_safari@2x~ipad.png" 26 | } 27 | ], 28 | "info" : { 29 | "version" : 1, 30 | "author" : "xcode" 31 | } 32 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari@2x~ipad.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/button_safari.imageset/button_safari~ipad.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "toggle_background_square.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "toggle_background_square@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background.imageset/toggle_background_square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/toggle_background.imageset/toggle_background_square.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background.imageset/toggle_background_square@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/toggle_background.imageset/toggle_background_square@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background_highlighted.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "toggle_background_square_highlighted.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "toggle_background_square_highlighted@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background_highlighted.imageset/toggle_background_square_highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/toggle_background_highlighted.imageset/toggle_background_square_highlighted.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Buttons/toggle_background_highlighted.imageset/toggle_background_square_highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Buttons/toggle_background_highlighted.imageset/toggle_background_square_highlighted@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "add-outline.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_add.imageset/add-outline.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_add.imageset/add-outline.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_allnotes.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "notes.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_allnotes.imageset/notes.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_allnotes.imageset/notes.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_archive.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "archive.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_archive.imageset/archive.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_archive.imageset/archive.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_arrow_top_right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "arrow-top-right.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_arrow_top_right.imageset/arrow-top-right.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_arrow_top_right.imageset/arrow-top-right.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checklist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checklist.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checklist.imageset/checklist.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_checklist.imageset/checklist.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_checked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "icon_checkmark_checked.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "icon_checkmark_checked@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_checked.imageset/icon_checkmark_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_checkmark_checked.imageset/icon_checkmark_checked.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_checked.imageset/icon_checkmark_checked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_checkmark_checked.imageset/icon_checkmark_checked@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_unchecked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "icon_checkmark_unchecked.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "icon_checkmark_unchecked@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_unchecked.imageset/icon_checkmark_unchecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_checkmark_unchecked.imageset/icon_checkmark_unchecked.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_checkmark_unchecked.imageset/icon_checkmark_unchecked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_checkmark_unchecked.imageset/icon_checkmark_unchecked@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_chevron_left.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_chevron_left.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_chevron_left.imageset/icon_chevron_left.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_chevron_left.imageset/icon_chevron_left.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_chevron_right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chevron-right.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_chevron_right.imageset/chevron-right.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_chevron_right.imageset/chevron-right.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_collaborate.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "collaborate.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_collaborate.imageset/collaborate.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_collaborate.imageset/collaborate.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_copy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_copy.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_copy.imageset/icon_copy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_copy.imageset/icon_copy.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cross.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross.imageset/cross.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_cross.imageset/cross.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_big.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_cross.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_big.imageset/icon_cross.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_cross_big.imageset/icon_cross.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_big_outlined.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_cross_outline.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_big_outlined.imageset/icon_cross_outline.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_cross_big_outlined.imageset/icon_cross_outline.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_outlined.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cross-outline.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_cross_outlined.imageset/cross-outline.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_cross_outlined.imageset/cross-outline.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_editor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "editor.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_editor.imageset/editor.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_editor.imageset/editor.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_ellipsis.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ellipsis.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_ellipsis.imageset/ellipsis.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_ellipsis.imageset/ellipsis.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_ellipsis_outline.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ellipsis-outline.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_ellipsis_outline.imageset/ellipsis-outline.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_ellipsis_outline.imageset/ellipsis-outline.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_hide_keyboard.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hide-keyboard.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_hide_keyboard.imageset/hide-keyboard.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_hide_keyboard.imageset/hide-keyboard.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_history.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "history.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_history.imageset/history.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_history.imageset/history.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_info.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "info.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_info.imageset/info.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_info.imageset/info.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_link.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "link.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_link.imageset/link.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_link.imageset/link.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_mail.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mail.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_mail.imageset/mail.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_mail.imageset/mail.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menu.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_menu.imageset/menu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_menu.imageset/menu.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_new_note.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "new-note.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_new_note.imageset/new-note.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_new_note.imageset/new-note.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_note.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "note.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_note.imageset/note.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_note.imageset/note.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_pin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pinned.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_pin.imageset/pinned.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_pin.imageset/pinned.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_pin_small.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pinned.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_pin_small.imageset/pinned.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_pin_small.imageset/pinned.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_published.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "publish.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_published.imageset/publish.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_published.imageset/publish.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_restore.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "restore.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_restore.imageset/restore.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_restore.imageset/restore.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "search.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_search.imageset/search.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_search.imageset/search.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_settings.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "settings.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_settings.imageset/settings.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_settings.imageset/settings.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "share.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_share.imageset/share.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_share.imageset/share.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_shared.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "publish.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_shared.imageset/publish.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_shared.imageset/publish.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_sort_order.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sort-order.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_sort_order.imageset/sort-order.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_sort_order.imageset/sort-order.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_success.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "success.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_success.imageset/success.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_success.imageset/success.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tag.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tag.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tag.imageset/tag.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_tag.imageset/tag.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tags.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags.imageset/tags.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_tags.imageset/tags.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tags-close.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags_close.imageset/tags-close.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_tags_close.imageset/tags-close.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags_open.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tags-open.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_tags_open.imageset/tags-open.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_tags_open.imageset/tags-open.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_task_checked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "task-checked.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_task_checked.imageset/task-checked.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_task_checked.imageset/task-checked.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_task_unchecked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "task-unchecked.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_task_unchecked.imageset/task-unchecked.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_task_unchecked.imageset/task-unchecked.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_trash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "trash.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_trash.imageset/trash.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_trash.imageset/trash.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_unpin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "unpin.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_unpin.imageset/unpin.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_unpin.imageset/unpin.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_untagged.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "untagged.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_untagged.imageset/untagged.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_untagged.imageset/untagged.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_user.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_user.imageset/user.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_user.imageset/user.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_visibility_off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "visibility-hidden.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_visibility_off.imageset/visibility-hidden.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_visibility_off.imageset/visibility-hidden.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_visibility_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "visibility-visible.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_visibility_on.imageset/visibility-visible.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_visibility_on.imageset/visibility-visible.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_warning.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "warning.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_warning.imageset/warning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_warning.imageset/warning.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "wpcom-logo.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "wpcom-logo@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "wpcom-logo@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo@2x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/Icons/icon_wpcom.imageset/wpcom-logo@3x.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/launch-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "launch-logo.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/launch-logo.imageset/launch-logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/launch-logo.imageset/launch-logo.pdf -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/logo_about.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-App-128x128.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Icon-App-256x256.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Icon-App-512x512.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/logo_about.imageset/Icon-App-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/logo_about.imageset/Icon-App-128x128.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/logo_about.imageset/Icon-App-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/logo_about.imageset/Icon-App-256x256.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/logo_about.imageset/Icon-App-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/logo_about.imageset/Icon-App-512x512.png -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/simplenote-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_simplenote_inner.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Images.xcassets/simplenote-logo.imageset/icon_simplenote_inner.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Images.xcassets/simplenote-logo.imageset/icon_simplenote_inner.pdf -------------------------------------------------------------------------------- /Simplenote/NSObject+Helpers.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// NSObject: Helper Methods 4 | /// 5 | extension NSObject { 6 | 7 | /// Returns the receiver's classname as a string, not including the namespace. 8 | /// 9 | class var classNameWithoutNamespaces: String { 10 | return String(describing: self) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Simplenote/NSPredicate+Email.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NSPredicate Validation Methods 4 | // 5 | extension NSPredicate { 6 | 7 | /// Returns a NSPredicate capable of validating Email Addressess 8 | /// 9 | static func predicateForEmailValidation() -> NSPredicate { 10 | let regex = ".+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*" 11 | return NSPredicate(format: "SELF MATCHES %@", regex) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Simplenote/NSTextStorage+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension NSTextStorage { 4 | @objc(applyBackgroundColor:toRanges:) 5 | func applyBackgroundColor(_ color: UIColor?, toRanges wordRanges: [NSValue]?) { 6 | guard let color = color, let wordRanges = wordRanges else { 7 | return 8 | } 9 | 10 | beginEditing() 11 | 12 | let maxLength = (string as NSString).length 13 | 14 | for value in wordRanges { 15 | let range = value.rangeValue 16 | 17 | if NSMaxRange(range) > maxLength { 18 | continue 19 | } 20 | 21 | addAttribute(.backgroundColor, value: color, range: range) 22 | } 23 | 24 | endEditing() 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Simplenote/NSURLComponents+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension NSURLComponents { 4 | @objc 5 | func contentFromQuery() -> String? { 6 | return queryItems?.first(where: { query in 7 | query.name == "content" 8 | })?.value 9 | } 10 | 11 | @objc 12 | func tagsFromQuery() -> [String]? { 13 | queryItems? 14 | .filter({ $0.name == "tag" }) 15 | .compactMap({ $0.value }) 16 | .flatMap({ $0.components(separatedBy: .whitespacesAndNewlines) }) 17 | .filter({ !$0.isEmpty }) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Simplenote/Note+Publish.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension Note { 4 | var publishState: PublishState { 5 | if published && !publishURL.isEmpty { 6 | return .published 7 | } 8 | 9 | if published && publishURL.isEmpty { 10 | return .publishing 11 | } 12 | 13 | if !published && !publishURL.isEmpty { 14 | return .unpublishing 15 | } 16 | 17 | return .unpublished 18 | } 19 | } 20 | 21 | enum PublishState { 22 | case published 23 | case publishing 24 | case unpublished 25 | case unpublishing 26 | } 27 | -------------------------------------------------------------------------------- /Simplenote/NoteMetrics.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NoteMetrics 4 | // 5 | struct NoteMetrics { 6 | 7 | /// Returns the total number of characters 8 | /// 9 | let numberOfChars: Int 10 | 11 | /// Returns the total number of words 12 | /// 13 | let numberOfWords: Int 14 | 15 | /// Creation Date 16 | /// 17 | let creationDate: Date 18 | 19 | /// Modification Date 20 | /// 21 | let modifiedDate: Date 22 | 23 | /// Designed Initializer 24 | /// - Parameter note: Note from which we should extract metrics 25 | /// 26 | init(note: Note) { 27 | let content = ((note.content ?? "") as NSString) 28 | 29 | numberOfChars = content.charCount 30 | numberOfWords = content.wordCount 31 | creationDate = note.creationDate 32 | modifiedDate = note.modificationDate 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Simplenote/Notice.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct Notice { 4 | 5 | let message: String 6 | let action: NoticeAction? 7 | 8 | var hasAction: Bool { 9 | return action != nil 10 | } 11 | } 12 | 13 | extension Notice: Equatable { 14 | static func == (lhs: Notice, rhs: Notice) -> Bool { 15 | return lhs.message == rhs.message 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Simplenote/NoticeAction.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct NoticeAction { 4 | let title: String 5 | let handler: () -> Void 6 | } 7 | -------------------------------------------------------------------------------- /Simplenote/NumberFormatter+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - NumberFormatter Extension 4 | // 5 | extension NumberFormatter { 6 | /// Number formatter with decimal style 7 | /// 8 | static let decimalFormatter: NumberFormatter = { 9 | let formatter = NumberFormatter() 10 | formatter.numberStyle = .decimal 11 | return formatter 12 | }() 13 | } 14 | -------------------------------------------------------------------------------- /Simplenote/Preferences+IAP.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Preferences+IAP.swift 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 10/27/22. 6 | // Copyright © 2022 Automattic. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - Preferences Extensions 12 | // 13 | extension Preferences { 14 | 15 | @objc 16 | var isActiveSubscriber: Bool { 17 | subscription_level == StoreConstants.activeSubscriptionLevel 18 | } 19 | 20 | @objc 21 | var wasSustainer: Bool { 22 | was_sustainer == true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Simplenote/Preferences.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | @interface Preferences: SPManagedObject 5 | 6 | @property (nullable, nonatomic, strong) NSArray *recent_searches; 7 | @property (nullable, nonatomic, copy) NSNumber *analytics_enabled; 8 | 9 | @property (nullable, nonatomic, copy) NSDate *subscription_date; 10 | @property (nullable, nonatomic, copy) NSString *subscription_level; 11 | @property (nullable, nonatomic, copy) NSString *subscription_platform; 12 | 13 | @property (nullable, nonatomic, copy) NSNumber *was_sustainer; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Simplenote/Resources/markdown-dark-contrast.css: -------------------------------------------------------------------------------- 1 | 2 | /* Accessibility high contrast blue */ 3 | .note-detail-markdown a { 4 | color: #85aaff !important; 5 | } 6 | -------------------------------------------------------------------------------- /Simplenote/Resources/markdown-dark.css: -------------------------------------------------------------------------------- 1 | html { 2 | background: 1f2123; 3 | color: #DDDDDD; 4 | } 5 | 6 | ::-webkit-scrollbar-thumb { 7 | background: #84878a; 8 | } 9 | 10 | .note-detail-markdown a { 11 | color: #618df2; 12 | } 13 | 14 | .note-detail-markdown hr { 15 | color: #4895d9; 16 | } 17 | 18 | .note-detail-markdown code { 19 | color: #84878a; 20 | } 21 | 22 | .note-detail-markdown pre { 23 | background: #002b36; 24 | } 25 | 26 | .note-detail-markdown pre code { 27 | color: #84878a; 28 | } 29 | 30 | .note-detail-markdown table tr:nth-child(2n) { 31 | background-color: #383d41; 32 | } 33 | 34 | .note-detail-markdown table th, .note-detail-markdown table td { 35 | border-color: #575e65; 36 | } 37 | -------------------------------------------------------------------------------- /Simplenote/Resources/markdown-default-contrast.css: -------------------------------------------------------------------------------- 1 | 2 | /* Accessibility high contrast blue */ 3 | .note-detail-markdown a { 4 | color: #284da2 !important; 5 | } 6 | -------------------------------------------------------------------------------- /Simplenote/Resources/markdown-light.css: -------------------------------------------------------------------------------- 1 | 2 | html { 3 | background: #FFFFFF; 4 | color: #111111; 5 | } 6 | 7 | ::-webkit-scrollbar-thumb { 8 | background: #84878a; 9 | } 10 | 11 | .note-detail-markdown a { 12 | color: #3361cc; 13 | } 14 | 15 | .note-detail-markdown hr { 16 | color: #4895d9; 17 | } 18 | 19 | .note-detail-markdown code { 20 | color: #899199; 21 | } 22 | 23 | .note-detail-markdown pre { 24 | background: #f6f7f8; 25 | } 26 | 27 | .note-detail-markdown pre code { 28 | color: #616870; 29 | } 30 | 31 | .note-detail-markdown table tr:nth-child(2n) { 32 | background-color: #f6f7f8; 33 | } 34 | 35 | .note-detail-markdown table th, .note-detail-markdown table td { 36 | border-color: #c0c4c8; 37 | } 38 | -------------------------------------------------------------------------------- /Simplenote/SPCardConfigurable.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - SPCardConfigurable: configure card 4 | // 5 | protocol SPCardConfigurable { 6 | /// This method allows the adopter to control swipe-to-dismiss 7 | /// 8 | /// - Parameters: 9 | /// - location: location in receiver's coordinate system. 10 | /// 11 | /// - Returns: Boolean value indicating if dismiss should begin 12 | /// 13 | func shouldBeginSwipeToDismiss(from location: CGPoint) -> Bool 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/SPDragBar.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class SPDragBar: UIView { 4 | override init(frame: CGRect) { 5 | super.init(frame: frame) 6 | configure() 7 | } 8 | 9 | required init?(coder: NSCoder) { 10 | super.init(coder: coder) 11 | configure() 12 | } 13 | 14 | private func configure() { 15 | let color = UIColor(lightColor: ColorStudio.black, darkColor: ColorStudio.white) 16 | 17 | backgroundColor = color 18 | alpha = 0.2 19 | layer.cornerRadius = 2.5 20 | layer.masksToBounds = true 21 | 22 | isAccessibilityElement = true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Simplenote/SPManagedObject+Version.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Simperium 3 | 4 | // MARK: - SPManagedObject extension 5 | // 6 | extension SPManagedObject { 7 | 8 | /// Version as an Int 9 | /// 10 | @objc 11 | var versionInt: Int { 12 | guard let versionStr = version(), let version = Int(versionStr) else { 13 | return 1 14 | } 15 | 16 | return version 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Simplenote/SPNoteHistoryControllerDelegate.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - SPNoteHistoryControllerDelegate 4 | // 5 | protocol SPNoteHistoryControllerDelegate: AnyObject { 6 | 7 | /// Cancel 8 | /// 9 | func noteHistoryControllerDidCancel() 10 | 11 | /// Finish and save 12 | /// 13 | func noteHistoryControllerDidFinish() 14 | 15 | /// Preview version content 16 | /// 17 | func noteHistoryControllerDidSelectVersion(withContent content: String) 18 | } 19 | -------------------------------------------------------------------------------- /Simplenote/SPUser+UserProtocol.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SimplenoteEndpoints 3 | import Simperium 4 | 5 | 6 | // MARK: - Simperium's SPUser Conformance 7 | // 8 | extension SPUser: UserProtocol { } 9 | -------------------------------------------------------------------------------- /Simplenote/SearchQuery+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SimplenoteSearch 3 | 4 | extension SearchQuery { 5 | convenience init(searchText: String) { 6 | self.init(searchText: searchText, settings: .default) 7 | } 8 | } 9 | 10 | extension SearchQuerySettings { 11 | static var `default`: SearchQuerySettings { 12 | let localizedKeyword = NSLocalizedString("tag:", comment: "Search Operator for tags. Please preserve the semicolons when translating!") 13 | return SearchQuerySettings(tagsKeyword: "tag:", localizedTagKeyword: localizedKeyword) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Simplenote/Simplenote.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | Simplenote 7.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /Simplenote/Simplenote.xcdatamodeld/Simplenote.xcdatamodel/elements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Simplenote.xcdatamodeld/Simplenote.xcdatamodel/elements -------------------------------------------------------------------------------- /Simplenote/Simplenote.xcdatamodeld/Simplenote.xcdatamodel/layout: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/Simplenote.xcdatamodeld/Simplenote.xcdatamodel/layout -------------------------------------------------------------------------------- /Simplenote/StoreConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreConstants.swift 3 | // Simplenote 4 | // 5 | // Created by Jorge Leandro Perez on 10/27/22. 6 | // Copyright © 2022 Automattic. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - Settings 12 | // 13 | enum StoreConstants { 14 | static let platform = "iOS" 15 | static let activeSubscriptionLevel = "sustainer" 16 | } 17 | -------------------------------------------------------------------------------- /Simplenote/Supporting Files/Simplenote-Internal.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.associated-domains 6 | 7 | webcredentials:simplenote.com 8 | applinks:app.simplenote.com 9 | 10 | com.apple.security.application-groups 11 | 12 | group.$(CFBundleIdentifier) 13 | 14 | keychain-access-groups 15 | 16 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Simplenote/Supporting Files/Simplenote-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_3_0 10 | #warning "This project uses features only available in iOS SDK 3.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #import 17 | #import 18 | #import 19 | #endif 20 | -------------------------------------------------------------------------------- /Simplenote/Supporting Files/Simplenote.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.associated-domains 6 | 7 | webcredentials:simplenote.com 8 | applinks:app.simplenote.com 9 | 10 | com.apple.security.application-groups 11 | 12 | group.$(CFBundleIdentifier) 13 | 14 | keychain-access-groups 15 | 16 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Simplenote/Supporting Files/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Simplenote 4 | // 5 | // Created by Tom Witkin on 7/3/13. 6 | // Copyright (c) 2013 Automattic. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SPAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Simplenote/TimerFactory.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | class TimerFactory { 4 | func scheduledTimer(with timeInterval: TimeInterval, completion: @escaping () -> Void) -> Timer { 5 | return Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false) { (_) in 6 | completion() 7 | } 8 | } 9 | 10 | func repeatingTimer(with timerInterval: TimeInterval, completion: @escaping (Timer)-> Void) -> Timer { 11 | return Timer.scheduledTimer(withTimeInterval: timerInterval, repeats: true) { (timer) in 12 | completion(timer) 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Simplenote/UIButton+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | 4 | extension UIButton { 5 | 6 | func setTitleWithoutAnimation(_ title: String?, for state: UIControl.State) { 7 | UIView.performWithoutAnimation { 8 | self.setTitle(title, for: state) 9 | self.layoutIfNeeded() 10 | } 11 | } 12 | 13 | func setAttributedTitleWithoutAnimation(_ title: NSAttributedString?, for state: UIControl.State) { 14 | UIView.performWithoutAnimation { 15 | self.setAttributedTitle(title, for: state) 16 | self.layoutIfNeeded() 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Simplenote/UISlider+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UISlider + Simplenote 4 | // 5 | extension UISlider { 6 | 7 | /// Rect for thumb 8 | /// 9 | var thumbRect: CGRect { 10 | return thumbRect(forBounds: bounds, 11 | trackRect: trackRect(forBounds: bounds), 12 | value: value) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Simplenote/URLComponents.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension URLComponents { 4 | static func simplenoteURLComponents(with host: String? = nil) -> URLComponents? { 5 | var components = URLComponents(string: .simplenotePath()) 6 | components?.host = host 7 | 8 | return components 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Simplenote/WordPressRatings/NSDate+Ratings.h: -------------------------------------------------------------------------------- 1 | // Sourced from https://github.com/wordpress-mobile/WordPress-Ratings-iOS/blob/8ba469e80214d1be29f3a8ca6776ecb04acdb416/WordPress-Ratings-iOS/NSDate%2BRatings.h 2 | #import 3 | 4 | @interface NSDate (Ratings) 5 | 6 | + (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /Simplenote/WordPressRatings/NSDate+Ratings.m: -------------------------------------------------------------------------------- 1 | // Sourced from https://github.com/wordpress-mobile/WordPress-Ratings-iOS/blob/8ba469e80214d1be29f3a8ca6776ecb04acdb416/WordPress-Ratings-iOS/NSDate%2BRatings.m 2 | #import "NSDate+Ratings.h" 3 | 4 | @implementation NSDate (Ratings) 5 | 6 | + (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime 7 | { 8 | NSDate *fromDate = nil; 9 | NSDate *toDate = nil; 10 | 11 | NSCalendar *calendar = [NSCalendar currentCalendar]; 12 | [calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate interval:nil forDate:fromDateTime]; 13 | [calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate interval:nil forDate:toDateTime]; 14 | 15 | NSDateComponents *delta = [calendar components:NSCalendarUnitDay fromDate:fromDate toDate:toDate options:0]; 16 | 17 | return delta.day; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Simplenote/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/Simplenote/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /SimplenoteIntents/Intent Handlers/OpenNewNoteIntentHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OpenNewNoteIntentHandler.swift 3 | // Simplenote 4 | // 5 | // Created by Charlie Scheer on 5/2/24. 6 | // Copyright © 2024 Automattic. All rights reserved. 7 | // 8 | 9 | import Intents 10 | 11 | class OpenNewNoteIntentHandler: NSObject, OpenNewNoteIntentHandling { 12 | func handle(intent: OpenNewNoteIntent) async -> OpenNewNoteIntentResponse { 13 | OpenNewNoteIntentResponse(code: .continueInApp, userActivity: nil) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SimplenoteIntents/IntentsConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntentsConstants.swift 3 | // Simplenote 4 | // 5 | // Created by Charlie Scheer on 5/2/24. 6 | // Copyright © 2024 Automattic. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct IntentsConstants { 12 | static let noteIdentifierKey = "OpenNoteIntentHandlerIdentifierKey" 13 | 14 | static let recoveryMessage = NSLocalizedString("Will attempt to recover shortcut content on next launch", comment: "Alerting users that we will attempt to restore lost content on next launch") 15 | } 16 | -------------------------------------------------------------------------------- /SimplenoteIntents/ResolutionResults/IntentTag+Helpers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntentTag+Helpers.swift 3 | // SimplenoteIntents 4 | // 5 | // Created by Charlie Scheer on 5/9/24. 6 | // Copyright © 2024 Automattic. All rights reserved. 7 | // 8 | 9 | import Intents 10 | 11 | extension IntentTag { 12 | static func allTags(in coreDataWrapper: ExtensionCoreDataWrapper) throws -> [IntentTag] { 13 | guard let tags = coreDataWrapper.resultsController()?.tags() else { 14 | throw IntentsError.couldNotFetchTags 15 | } 16 | 17 | return tags.map({ IntentTag(identifier: $0.simperiumKey, display: $0.name ?? String()) }) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SimplenoteIntents/Simplenote-Intents-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | 6 | #import "Foundation/Foundation.h" 7 | #import "SPConstants.h" 8 | -------------------------------------------------------------------------------- /SimplenoteIntents/SimplenoteIntentsRelease.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow 12 | $(AppIdentifierPrefix)4ESDVWK654.com.codality.NotationalFlow 13 | 14 | previous-application-identifiers 15 | 16 | 4ESDVWK654.com.codality.NotationalFlow 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SimplenoteIntents/Supporting Files/SimplenoteIntents-Debug.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Development 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Development 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteIntents/Supporting Files/SimplenoteIntents-DistributionAlpha.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Alpha 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Alpha 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteIntents/Supporting Files/SimplenoteIntents-DistributionInternal.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Internal 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Internal 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteIntents/Supporting Files/SimplenoteIntents-Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow 12 | $(AppIdentifierPrefix)4ESDVWK654.com.codality.NotationalFlow 13 | 14 | previous-application-identifiers 15 | 16 | 4ESDVWK654.com.codality.NotationalFlow 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SimplenoteScreenshots/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SimplenoteScreenshots/ScreenshotsCredentials-demo.swift: -------------------------------------------------------------------------------- 1 | /// Simplenote credentials for screenshots generation via UI tests 2 | /// 3 | struct ScreenshotsCredentials { 4 | 5 | static let testUserEmail = "test@example.com" 6 | 7 | static let testUserPassword = "password" 8 | } 9 | -------------------------------------------------------------------------------- /SimplenoteShare/Extensions/NSURLSessionConfiguration+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// Encapsulates NSURLSessionConfiguration Helpers 4 | /// 5 | extension URLSessionConfiguration { 6 | 7 | /// Returns a new Background Session Configuration, with a random identifier. 8 | /// 9 | class func backgroundSessionConfigurationWithRandomizedIdentifier() -> URLSessionConfiguration { 10 | let identifier = kShareExtensionGroupName + "." + UUID().uuidString 11 | let configuration = URLSessionConfiguration.background(withIdentifier: identifier) 12 | configuration.sharedContainerIdentifier = kShareExtensionGroupName 13 | 14 | return configuration 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SimplenoteShare/Extractors/Extractor.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Extractor 4 | // 5 | protocol Extractor { 6 | 7 | /// Accepted File Extension 8 | /// 9 | var acceptedType: String { get } 10 | 11 | /// Indicates if a given Extension Context can be handled by the Extractor 12 | /// 13 | func canHandle(context: NSExtensionContext) -> Bool 14 | 15 | /// Extracts a Note entity contained within a given Extension Context (If possible!) 16 | /// 17 | func extractNote(from context: NSExtensionContext, onCompletion: @escaping (Note?) -> Void) 18 | } 19 | -------------------------------------------------------------------------------- /SimplenoteShare/Extractors/Extractors.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Extractors: Convenience Struct that manages access to all of the known Extractors. 4 | // 5 | struct Extractors { 6 | 7 | /// All of the known Extractors 8 | /// 9 | private static let extractors: [Extractor] = [ 10 | URLExtractor(), 11 | PlainTextExtractor() 12 | ] 13 | 14 | /// Returns the Extractor that can handle a given Extension Context (if any) 15 | /// 16 | static func extractor(for extensionContext: NSExtensionContext) -> Extractor? { 17 | return extractors.first { 18 | $0.canHandle(context: extensionContext) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SimplenoteShare/Simplenote-Share-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | 6 | #import "SPConstants.h" 7 | #import "TextBundleWrapper.h" 8 | -------------------------------------------------------------------------------- /SimplenoteShare/Supporting Files/SimplenoteShare-AppStore.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | previous-application-identifiers 6 | 7 | 4ESDVWK654.com.codality.NotationalFlow 8 | 9 | com.apple.security.application-groups 10 | 11 | group.com.codality.NotationalFlow 12 | 13 | keychain-access-groups 14 | 15 | $(AppIdentifierPrefix)com.codality.NotationalFlow 16 | 4ESDVWK654.com.codality.NotationalFlow 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SimplenoteShare/Supporting Files/SimplenoteShare-Development.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Development 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Development 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteShare/Supporting Files/SimplenoteShare-DistributionAlpha.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Alpha 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Alpha 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteShare/Supporting Files/SimplenoteShare-Internal.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Internal 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)com.codality.NotationalFlow.Internal 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SimplenoteShare/Themes/SPUserInterface.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | // MARK: - Simplenote's Theme 5 | // 6 | @objc 7 | class SPUserInterface: NSObject { 8 | 9 | /// Ladies and gentlemen, this is a singleton. 10 | /// 11 | @objc 12 | static let shared = SPUserInterface() 13 | 14 | /// Indicates if the User Interface is in Dark Mode 15 | /// 16 | @objc 17 | static var isDark: Bool { 18 | UITraitCollection.current.userInterfaceStyle == .dark 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SimplenoteTests/Constants.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// Unit Tests Constants 4 | /// 5 | struct Constants { 6 | 7 | /// Default Expectation Timeout 8 | /// 9 | static let expectationTimeout = TimeInterval(10) 10 | } 11 | -------------------------------------------------------------------------------- /SimplenoteTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SimplenoteTests/MockApplication.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | @testable import Simplenote 3 | 4 | // MARK: - MockApplication 5 | // 6 | class MockApplication: ApplicationStateProvider { 7 | var applicationState: UIApplication.State = .active 8 | } 9 | -------------------------------------------------------------------------------- /SimplenoteTests/MockTimerFactory.swift: -------------------------------------------------------------------------------- 1 | @testable import Simplenote 2 | 3 | class MockTimerFactory: TimerFactory { 4 | var timer: MockTimer? 5 | 6 | override func scheduledTimer(with timeInterval: TimeInterval, completion: @escaping () -> Void) -> Timer { 7 | let timer = MockTimer() 8 | self.timer = timer 9 | timer.completion = completion 10 | return timer 11 | } 12 | } 13 | 14 | class MockTimer: Timer { 15 | var completion: (() -> Void)? 16 | 17 | convenience init(completion: (() -> Void)? = nil) { 18 | self.init() 19 | self.completion = completion 20 | } 21 | 22 | override func fire() { 23 | completion?() 24 | } 25 | 26 | override func invalidate() { 27 | completion = nil 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SimplenoteTests/PinLock/Helpers/PinLockControllerConfiguration+Tests.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | @testable import Simplenote 3 | 4 | // MARK: - PinLockControllerConfiguration 5 | // 6 | extension PinLockControllerConfiguration { 7 | static func random() -> PinLockControllerConfiguration { 8 | return PinLockControllerConfiguration(title: UUID().uuidString, 9 | message: UUID().uuidString) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SimplenoteTests/RemoteResult+TestHelpers.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SimplenoteEndpoints 3 | @testable import Simplenote 4 | 5 | extension Remote { 6 | static func randomResult() -> Result { 7 | if Bool.random() { 8 | return .success(nil) 9 | } 10 | 11 | return .failure(RemoteError(statusCode: 0, response: nil, networkError: nil)) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SimplenoteTests/SimplenoteTests-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "Simplenote-Bridging-Header.h" 6 | -------------------------------------------------------------------------------- /SimplenoteTests/UIImageSimplenoteTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Simplenote 3 | 4 | // MARK: - UIImage+Simplenote Unit Tests 5 | // 6 | class UIImageSimplenoteTests: XCTestCase { 7 | 8 | /// Verify every single UIColorName in existance yields a valid UIColor instancce 9 | /// 10 | func testEverySingleUIImageNameEffectivelyYieldsSomeUIImageInstance() { 11 | for imageName in UIImageName.allCases { 12 | XCTAssertNotNil(UIImage.image(name: imageName)) 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SimplenoteTests/UserDefaults+Tests.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - UserDefaults Extension Methods 4 | // 5 | extension UserDefaults { 6 | 7 | /// Resets all of the receiver's values 8 | /// 9 | func reset() { 10 | for (key, _) in dictionaryRepresentation() { 11 | removeObject(forKey: key) 12 | } 13 | 14 | synchronize() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SimplenoteUITests/Extensions.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | extension String { 4 | 5 | func strippingUnicodeObjectReplacementCharacter() -> String { 6 | replacingOccurrences(of: "\u{fffc}", with: "") 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /SimplenoteUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SimplenoteUITests/NoteData.swift: -------------------------------------------------------------------------------- 1 | /// Value-type to describe the elements that represent a not as seen from the UI. 2 | struct NoteData { 3 | let name: String 4 | let content: String 5 | private(set) var tags: [String] = [] 6 | 7 | var formattedForAutomatedInput: String { "\(name)\n\n\(content)" } 8 | } 9 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Extensions/Color+Widgets.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | extension Color { 4 | static var bodyTextColor: Color { 5 | Color(light: .gray100, dark: .white) 6 | } 7 | 8 | static var secondaryTextColor: Color { 9 | Color(light: .gray50, dark: .gray30) 10 | } 11 | 12 | static var widgetBackgroundColor: Color { 13 | Color(light: .white, dark: .darkGray1) 14 | } 15 | 16 | static var widgetBlueBackgroundColor: Color { 17 | Color(studioColor: .spBlue50) 18 | } 19 | 20 | static var widgetTintColor: Color { 21 | Color(light: .spBlue50, dark: .spBlue30) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Extensions/Text+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import WidgetKit 3 | 4 | @available(iOS 14.0, *) 5 | extension Text { 6 | func widgetHeader(_ widgetFamily: WidgetFamily, color: Color) -> Text { 7 | self 8 | .font(widgetFamily == .systemSmall ? .subheadline : .body) 9 | .fontWeight(.bold) 10 | .foregroundColor(color) 11 | } 12 | 13 | func subheadline(color: Color) -> Text { 14 | self 15 | .font(.subheadline) 16 | .foregroundColor(color) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Extensions/View+Simplenote.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | extension View { 4 | func filling() -> some View { 5 | self.modifier(Filling()) 6 | } 7 | 8 | func frame(side: CGFloat, alignment: Alignment = .center) -> some View { 9 | self.frame(width: side, height: side, alignment: alignment) 10 | } 11 | } 12 | 13 | extension View { 14 | func widgetBackground(@ViewBuilder content: ()-> some View) -> some View { 15 | if #available(iOSApplicationExtension 17.0, *) { 16 | return containerBackground(for: .widget) { 17 | content() 18 | } 19 | } else { 20 | return background(content()) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Models/SPManagedObject+Widget.swift: -------------------------------------------------------------------------------- 1 | // This file contains the required class structure to be able to fetch and use core data files in widgets and intents 2 | // We have collapsed the auto generated core data files into a single file as it is unlikely that the files will need to 3 | // be regenerated. Contained in this file is the generated class files SPManagedObject+CoreDataClass.swift and SPManagedObject+CoreDataProperties.swift 4 | 5 | import Foundation 6 | import CoreData 7 | 8 | @objc(SPManagedObject) 9 | public class SPManagedObject: NSManagedObject { 10 | 11 | } 12 | 13 | extension SPManagedObject { 14 | 15 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 16 | return NSFetchRequest(entityName: "SPManagedObject") 17 | } 18 | 19 | @NSManaged public var ghostData: String? 20 | @NSManaged public var simperiumKey: String 21 | } 22 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Models/Tag+Widget.swift: -------------------------------------------------------------------------------- 1 | // This file contains the required class structure to be able to fetch and use core data files in widgets and intents 2 | // We have collapsed the auto generated core data files into a single file as it is unlikely that the files will need to 3 | // be regenerated. Contained in this file is the generated class files Tag+CoreDataClass.swift and Tag+CoreDataProperties.swift 4 | 5 | import Foundation 6 | import CoreData 7 | 8 | @objc(Tag) 9 | public class Tag: SPManagedObject { 10 | 11 | } 12 | 13 | extension Tag { 14 | 15 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 16 | return NSFetchRequest(entityName: "Tag") 17 | } 18 | 19 | @NSManaged public var index: NSNumber? 20 | @NSManaged public var name: String? 21 | @NSManaged public var share: String? 22 | } 23 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Providers/NewNoteWidgetProvider.swift: -------------------------------------------------------------------------------- 1 | import WidgetKit 2 | 3 | struct NewNoteWidgetEntry: TimelineEntry { 4 | let date: Date 5 | } 6 | 7 | struct NewNoteTimelineProvider: TimelineProvider { 8 | typealias Entry = NewNoteWidgetEntry 9 | 10 | func placeholder(in context: Context) -> NewNoteWidgetEntry { 11 | return NewNoteWidgetEntry(date: Date()) 12 | } 13 | 14 | func getSnapshot(in context: Context, completion: @escaping (NewNoteWidgetEntry) -> Void) { 15 | let entry = NewNoteWidgetEntry(date: Date()) 16 | completion(entry) 17 | } 18 | 19 | func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { 20 | let timeline = Timeline(entries: [NewNoteWidgetEntry(date: Date())], policy: .never) 21 | completion(timeline) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Simplenote-Widgets-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | 6 | #import "Foundation/Foundation.h" 7 | -------------------------------------------------------------------------------- /SimplenoteWidgets/SimplenoteWidgets.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import WidgetKit 3 | 4 | @available(iOS 14.0, *) 5 | @main 6 | struct SimplenoteWidgets: WidgetBundle { 7 | var body: some Widget { 8 | NewNoteWidget() 9 | NoteWidget() 10 | ListWidget() 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Supporting Files/SimplenoteWidgetsExtension-Debug.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Development 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Supporting Files/SimplenoteWidgetsExtension-DistributionAlpha.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Alpha 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Supporting Files/SimplenoteWidgetsExtension-DistributionInternal.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow.Internal 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Supporting Files/SimplenoteWidgetsExtension-Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.codality.NotationalFlow 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Tools/WidgetConstants.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct WidgetConstants { 4 | static let rangeForSixEntries = .zero..<6 5 | } 6 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Tools/WidgetDefaults.swift: -------------------------------------------------------------------------------- 1 | class WidgetDefaults { 2 | 3 | static let shared = WidgetDefaults() 4 | 5 | private let defaults = UserDefaults(suiteName: SimplenoteConstants.sharedGroupDomain) 6 | 7 | private init() { } 8 | 9 | var loggedIn: Bool { 10 | get { 11 | defaults?.bool(forKey: .accountIsLoggedIn) ?? false 12 | } 13 | set { 14 | defaults?.set(newValue, forKey: .accountIsLoggedIn) 15 | } 16 | } 17 | 18 | var sortMode: SortMode { 19 | get { 20 | SortMode(rawValue: defaults?.integer(forKey: .listSortMode) ?? .zero) ?? .alphabeticallyAscending 21 | } 22 | set { 23 | let payload = newValue.rawValue 24 | defaults?.set(payload, forKey: .listSortMode) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Tools/WidgetsState.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | enum WidgetsState { 4 | case standard 5 | case noteMissing 6 | case tagDeleted 7 | case loggedOut 8 | } 9 | 10 | extension WidgetsState { 11 | var message: String { 12 | switch self { 13 | case .standard: 14 | return String() 15 | case .noteMissing: 16 | return NSLocalizedString("Note no longer available", comment: "Widget warning if note is deleted") 17 | case .tagDeleted: 18 | return NSLocalizedString("Tag no longer available", comment: "Widget warning if tag is deleted") 19 | case .loggedOut: 20 | return NSLocalizedString("Log in to see your notes", comment: "Widget warning if user is logged out") 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SimplenoteWidgets/ViewModifiers/Filling.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct Filling: ViewModifier { 4 | func body(content: Content) -> some View { 5 | content 6 | .frame( 7 | minWidth: .zero, 8 | maxWidth: .infinity, 9 | minHeight: .zero, 10 | maxHeight: .infinity, 11 | alignment: .topLeading 12 | ) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /SimplenoteWidgets/Widgets/NewNoteWidget.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import WidgetKit 3 | 4 | @available(iOS 14.0, *) 5 | struct NewNoteWidget: Widget { 6 | var body: some WidgetConfiguration { 7 | StaticConfiguration(kind: Constants.configurationKind, provider: NewNoteTimelineProvider()) { entry in 8 | NewNoteWidgetView() 9 | } 10 | .configurationDisplayName(Constants.displayName) 11 | .description(Constants.description) 12 | .supportedFamilies([.systemSmall]) 13 | .contentMarginsDisabled() 14 | 15 | } 16 | } 17 | 18 | private struct Constants { 19 | static let configurationKind = "NewNoteWidget" 20 | static let displayName = NSLocalizedString("New Note", comment: "New Note Widget Title") 21 | static let description = NSLocalizedString("Create a new note instantly with one tap.", comment: "New Note Widget Description") 22 | } 23 | -------------------------------------------------------------------------------- /UITestsFoundation/UITestsFoundation.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | FOUNDATION_EXPORT double UITestsFoundationVersionNumber; 4 | FOUNDATION_EXPORT const unsigned char UITestsFoundationVersionString[]; 5 | -------------------------------------------------------------------------------- /UITestsFoundation/XCUIApplication+Assertions.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | extension XCUIApplication { 4 | 5 | public func assertLabelExists( 6 | withText text: String, 7 | timetout: TimeInterval = 5.0, 8 | file: StaticString = #file, 9 | line: UInt = #line 10 | ) { 11 | XCTAssertTrue( 12 | staticTexts[text].waitForExistence(timeout: timetout), 13 | #"Label with text "\#(text)" NOT found"#, 14 | file: file, 15 | line: line 16 | ) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /config/Project.Release.xcconfig: -------------------------------------------------------------------------------- 1 | DEVELOPMENT_TEAM = PZYM8XX95Q 2 | -------------------------------------------------------------------------------- /config/Simplenote.debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Version.public.xcconfig" 2 | 3 | DISPLAY_NAME=Simplenote 4 | -------------------------------------------------------------------------------- /config/Simplenote.release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Version.public.xcconfig" 2 | #include "Project.Release.xcconfig" 3 | 4 | DISPLAY_NAME=Simplenote 5 | 6 | PROVISIONING_PROFILE_SPECIFIER = match AppStore $(PRODUCT_BUNDLE_IDENTIFIER) 7 | -------------------------------------------------------------------------------- /config/Version.Public.xcconfig: -------------------------------------------------------------------------------- 1 | VERSION_LONG = 4.55.0.4 2 | VERSION_SHORT = 4.55 3 | -------------------------------------------------------------------------------- /fastlane/appstoreres/.gitattributes: -------------------------------------------------------------------------------- 1 | assets/*.png filter=lfs diff=lfs merge=lfs -text 2 | assets/*.ttf filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c9868de61ff2bab0b5a3a6d01c4b76f299459f08c6ae2f2c0383b4f9f6bedbf3 3 | size 269108 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/ipad_12_9_3rd_gen_mask.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7e7d6d28e7069c8d745677ffc30e6741ec53eadb7f66f6161a20873fd5106814 3 | size 110360 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/ipad_2nd_gen.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7166b4805b87ce74a030d54428ccb84314bb23ee880430f7cb73b7275c76e12d 3 | size 107536 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/ipad_3rd_gen.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2a56f8bb3b861240d27890cd5ef90904f220ab3ee7b8e24772d8f0d75532f0ec 3 | size 110535 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/iphone_8_plus.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a0baf4e93eb39a4d012f6b378cb10e851e1d00f193d328f84b0dd3d56135f53e 3 | size 56386 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/iphone_Xs_mask_no_notch.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1f9f26f60d01cdfc19a13bea9347163569c6cccce29f52cc43456a35c3c8fd6e 3 | size 72259 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/iphone_Xs_max.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e82b29df5730a8d5ebc0ac4b3d2250410a59583dbd4f72a8bc70e0055785200b 3 | size 76328 4 | -------------------------------------------------------------------------------- /fastlane/appstoreres/assets/styles/style.css: -------------------------------------------------------------------------------- 1 | *{ 2 | color: #ffffff; 3 | font-family: "Source Sans Pro"; 4 | font-style: normal; 5 | font-weight: normal ; 6 | line-height: 105px; 7 | text-align: center; 8 | } 9 | -------------------------------------------------------------------------------- /fastlane/appstoreres/metadata/source/keywords.txt: -------------------------------------------------------------------------------- 1 | notes,note,markdown,journal,sync,to-do,list,cloud,notebook,simple,notepad,tag,todo,writing,memo -------------------------------------------------------------------------------- /fastlane/appstoreres/metadata/source/name.txt: -------------------------------------------------------------------------------- 1 | Simplenote 2 | -------------------------------------------------------------------------------- /fastlane/appstoreres/metadata/source/subtitle.txt: -------------------------------------------------------------------------------- 1 | Simple notes, todos and memos 2 | -------------------------------------------------------------------------------- /fastlane/env/project.env-example: -------------------------------------------------------------------------------- 1 | INT_EXPORT_TEAM_ID= 2 | EXT_EXPORT_TEAM_ID= 3 | 4 | FASTLANE_ITC_TEAM_ID= 5 | 6 | SENTRY_ORG_SLUG= 7 | SENTRY_PROJECT_SLUG= 8 | -------------------------------------------------------------------------------- /fastlane/env/user.env-example: -------------------------------------------------------------------------------- 1 | GHHELPER_ACCESS= 2 | SENTRY_AUTH_TOKEN= 3 | -------------------------------------------------------------------------------- /fastlane/example.env: -------------------------------------------------------------------------------- 1 | # You don't need to fill in these values for Fastlane to run. 2 | # 3 | # However, if a lane requires some of these environment values and they are not set here, it will fail. 4 | GITHUB_TOKEN= 5 | BUILDKITE_TOKEN= 6 | 7 | MATCH_S3_ACCESS_KEY= 8 | MATCH_S3_SECRET_ACCESS_KEY= 9 | 10 | APP_STORE_CONNECT_API_KEY_KEY_ID= 11 | APP_STORE_CONNECT_API_KEY_ISSUER_ID= 12 | APP_STORE_CONNECT_API_KEY_KEY= 13 | 14 | SENTRY_AUTH_TOKEN= 15 | 16 | UI_TESTS_ACCOUNT_EMAIL= 17 | -------------------------------------------------------------------------------- /fastlane/metadata/ar-SA/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/ar-SA/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/ar-SA/keywords.txt: -------------------------------------------------------------------------------- 1 | ملحوظات,ملحوظة,مهام مصغرة,صحيفة,مذكرات,مزامنة,قائمة مهام,مفكرة,بسيط,مفكرة,وسم قائمة مهام,كتابة -------------------------------------------------------------------------------- /fastlane/metadata/ar-SA/release_notes.txt: -------------------------------------------------------------------------------- 1 | - تم تحديث الأيقونات للعمل مع أنماط iOS 18 2 | - إضافة خيار تسجيل الدخول البديل باستخدام اسم المستخدم وكلمة المرور لتسجيل الدخول 3 | - تم تحديث رابط إشعار الخصوصية الخاص بالمستخدمين في كاليفورنيا 4 | -------------------------------------------------------------------------------- /fastlane/metadata/ar-SA/subtitle.txt: -------------------------------------------------------------------------------- 1 | ملاحظات بسيطة ومهام ومذكرات 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/de-DE/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/keywords.txt: -------------------------------------------------------------------------------- 1 | Notizen,Markdown,Tagebuch,synchronisieren,To-do-Liste,Cloud,Notizbuch,Schlagwort,Schreiben,Memo 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Aktualisierte Icons, die mit den neuen iOS 18-Stilen funktionieren 2 | - Fallback-Anmeldung mit Option für den Benutzernamen und das Passwort zur Anmeldung hinzufügen 3 | - Aktualisierter Link zu den Datenschutzhinweisen für Benutzer in Kalifornien 4 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/subtitle.txt: -------------------------------------------------------------------------------- 1 | Notizen, To-do-Listen, Memos 2 | -------------------------------------------------------------------------------- /fastlane/metadata/default/keywords.txt: -------------------------------------------------------------------------------- 1 | notes,note,markdown,journal,sync,to-do,list,cloud,notebook,simple,notepad,tag,todo,writing,memo -------------------------------------------------------------------------------- /fastlane/metadata/default/privacy_url.txt: -------------------------------------------------------------------------------- 1 | https://simplenote.com/privacy/ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/default/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Updated icons to work with new iOS 18 styles 2 | - Add fall back login with username and password option to login 3 | - Updated link to privacy notice for California users 4 | -------------------------------------------------------------------------------- /fastlane/metadata/default/subtitle.txt: -------------------------------------------------------------------------------- 1 | Simple notes, todos and memos -------------------------------------------------------------------------------- /fastlane/metadata/default/support_url.txt: -------------------------------------------------------------------------------- 1 | https://simplenote.com/help/ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/es-ES/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/es-ES/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/es-ES/keywords.txt: -------------------------------------------------------------------------------- 1 | notas,nota,markdown,diario,sincronizar,lista,nube,simple,bloc,etiqueta,tarea,escribir,recordatorio 2 | -------------------------------------------------------------------------------- /fastlane/metadata/es-ES/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Se han actualizado los iconos para que funcionen con los nuevos estilos de iOS 18 2 | - Añade la opción de inicio de sesión «fall back» con nombre de usuario y contraseña para iniciar sesión 3 | - Se ha actualizado el enlace que lleva al aviso de privacidad para usuarios de California 4 | -------------------------------------------------------------------------------- /fastlane/metadata/es-ES/subtitle.txt: -------------------------------------------------------------------------------- 1 | Notas, tareas y recordatorios 2 | -------------------------------------------------------------------------------- /fastlane/metadata/fr-FR/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/fr-FR/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/fr-FR/keywords.txt: -------------------------------------------------------------------------------- 1 | notes,note,markdown,journal,synchronisation,todo,liste,cloud,notebook,simple,notepad,écrire 2 | -------------------------------------------------------------------------------- /fastlane/metadata/fr-FR/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Mise à jour des icônes pour qu’elles fonctionnent avec les nouveaux styles d’iOS 18 2 | - Ajout d’une connexion de secours avec identifiant et mot de passe en option 3 | - Mise à jour du lien vers l’avis de confidentialité pour les utilisateurs californiens 4 | -------------------------------------------------------------------------------- /fastlane/metadata/fr-FR/subtitle.txt: -------------------------------------------------------------------------------- 1 | Notes, tâches et mémos simples 2 | -------------------------------------------------------------------------------- /fastlane/metadata/he/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/he/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/he/keywords.txt: -------------------------------------------------------------------------------- 1 | פתקים,פתק,סימון,markdown,יומן,סנכרון,לביצוע,רשימה,ענן,מחברת,פשוט,notepad,תג,כתיבה,תזכורת 2 | -------------------------------------------------------------------------------- /fastlane/metadata/he/release_notes.txt: -------------------------------------------------------------------------------- 1 | - עדכנו את הסמלים כדי להתאים אותם לסגנון של iOS 18 2 | - הוספנו ניסיון חוזר להתחברות באמצעות שם משתמש וסיסמה בכניסה 3 | - עדכנו את הקישור להצהרת הפרטיות עבור משתמשים בקליפורניה 4 | -------------------------------------------------------------------------------- /fastlane/metadata/he/subtitle.txt: -------------------------------------------------------------------------------- 1 | פתקים, רשימות לביצוע ותזכורות 2 | -------------------------------------------------------------------------------- /fastlane/metadata/id/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/id/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/id/keywords.txt: -------------------------------------------------------------------------------- 1 | catatan,teks,markdown,jurnal,sinkronisasi,daftar,tugas,cloud,notebook,simpel,notepad,tag,tugas 2 | -------------------------------------------------------------------------------- /fastlane/metadata/id/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Perbarui ikon untuk dapat bekerja dengan penataan iOS 18 yang baru 2 | - Tambahkan login sementara dengan menggunakan nama pengguna dan kata sandi 3 | - Pembaruan tautan pada pemberitahuan privasi bagi pengguna di California 4 | -------------------------------------------------------------------------------- /fastlane/metadata/id/subtitle.txt: -------------------------------------------------------------------------------- 1 | Catatan, tugas, dan memo 2 | -------------------------------------------------------------------------------- /fastlane/metadata/it/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/it/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/it/keywords.txt: -------------------------------------------------------------------------------- 1 | appunti,appunto,markdown,diario,sincronizzazione,checklist,cloud,blocco,semplice,notepad,tag 2 | -------------------------------------------------------------------------------- /fastlane/metadata/it/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Aggiornato le icone per renderle compatibili con i nuovi stili di iOS 18 2 | - Aggiunto un accesso di ripiego con opzioni di nome utente e password per l'accesso 3 | - Aggiornato il link alla nota sulla privacy per utenti in California 4 | -------------------------------------------------------------------------------- /fastlane/metadata/it/subtitle.txt: -------------------------------------------------------------------------------- 1 | Appunti, checklist e memo 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ja/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/ja/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/ja/keywords.txt: -------------------------------------------------------------------------------- 1 | 注意,メモ,Markdown,日記,同期,ToDo,リスト,クラウド,ノートブック,シンプル,メモ帳,タグ,ToDo,投稿,メモ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ja/release_notes.txt: -------------------------------------------------------------------------------- 1 | - 新しい iOS 18 のスタイルに対応するようにアイコンを更新しました 2 | - ログインにユーザー名とパスワードのオプションを使用するフォールバックログインを追加します 3 | - カリフォルニア州のユーザーへのプライバシー通知のリンクを更新しました 4 | -------------------------------------------------------------------------------- /fastlane/metadata/ja/subtitle.txt: -------------------------------------------------------------------------------- 1 | ノート、ToDo リスト、メモをよりシンプルに 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ko/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/ko/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/ko/keywords.txt: -------------------------------------------------------------------------------- 1 | 기록,노트,마크다운,일기,동기화,할일목록,목록,클라우드,공책,심플,메모장,태그,할일,글쓰기,메모 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ko/release_notes.txt: -------------------------------------------------------------------------------- 1 | - 새로운 iOS 18 스타일에서 지원하도록 아이콘이 업데이트됨 2 | - 사용자명과 비밀번호로 로그인할 수 있는 대체 로그인 옵션 추가 3 | - 캘리포니아 사용자를 위한 개인정보 취급방침 링크가 업데이트됨 4 | -------------------------------------------------------------------------------- /fastlane/metadata/ko/subtitle.txt: -------------------------------------------------------------------------------- 1 | 간단한 기록, 할 일 목록, 메모 2 | -------------------------------------------------------------------------------- /fastlane/metadata/nl-NL/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/nl-NL/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/nl-NL/keywords.txt: -------------------------------------------------------------------------------- 1 | notities,tekst,markdown,dagboek,synchroniseren,to-do,cloud,eenvoudig,tag,schrijven,memo 2 | -------------------------------------------------------------------------------- /fastlane/metadata/nl-NL/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Pictogrammen bijgewerkt om te werken met nieuwe iOS 18-stijlen 2 | -Back-up login toevoegen met gebruikersnaam en wachtwoordoptie om in te loggen 3 | -Link naar privacyverklaring voor gebruikers in Californië bijgewerkt 4 | -------------------------------------------------------------------------------- /fastlane/metadata/nl-NL/subtitle.txt: -------------------------------------------------------------------------------- 1 | Notities, taken en memo's 2 | -------------------------------------------------------------------------------- /fastlane/metadata/pt-BR/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/pt-BR/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/pt-BR/keywords.txt: -------------------------------------------------------------------------------- 1 | anotações,anotaçãp,markdown,diário,sincronização,tarefas,lista,nuvem,bloco de notas,simples,tag 2 | -------------------------------------------------------------------------------- /fastlane/metadata/pt-BR/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Ícones atualizados para funcionar com novos estilos do iOS 18 2 | - Adicionamos uma alternativa de login com opção de nome de usuário e senha 3 | - Link do aviso de privacidade para usuários residentes da Califórnia atualizado 4 | -------------------------------------------------------------------------------- /fastlane/metadata/pt-BR/subtitle.txt: -------------------------------------------------------------------------------- 1 | Anotações, tarefas e recados 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ru/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/ru/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/ru/keywords.txt: -------------------------------------------------------------------------------- 1 | примечания, заметка, разметка, журнал, синхронизация, список дел, список, облако, записная книжка 2 | -------------------------------------------------------------------------------- /fastlane/metadata/ru/release_notes.txt: -------------------------------------------------------------------------------- 1 | — Значки обновлены в соответствии со стилями новой iOS 18 2 | — Добавлена опция резервного входа с именем пользователя и паролем 3 | — Обновлена ссылка на заявление о защите конфиденциальности для пользователей из Калифорнии 4 | -------------------------------------------------------------------------------- /fastlane/metadata/ru/subtitle.txt: -------------------------------------------------------------------------------- 1 | Примечания, списки, заметки 2 | -------------------------------------------------------------------------------- /fastlane/metadata/sv/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/sv/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/sv/keywords.txt: -------------------------------------------------------------------------------- 1 | примечания,заметка,разметка,журнал,синхронизация,список дел,список,облако,записная книжка,простой 2 | -------------------------------------------------------------------------------- /fastlane/metadata/sv/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Uppdaterade ikoner som fungerar med nya iOS 18-stilar 2 | - Lägg till fallback-inloggning med alternativ för användarnamn och lösenord för att logga in 3 | - Uppdaterad länk till integritetsmeddelande för användare i Kalifornien 4 | -------------------------------------------------------------------------------- /fastlane/metadata/sv/subtitle.txt: -------------------------------------------------------------------------------- 1 | Enkla anteckningar och memon 2 | -------------------------------------------------------------------------------- /fastlane/metadata/tr/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/tr/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/tr/keywords.txt: -------------------------------------------------------------------------------- 1 | not,planlama,günlük,eşitle,yapılacaklar,bulut,defter,basit,not defteri,etiket,işler,yazı,hatırlatma 2 | -------------------------------------------------------------------------------- /fastlane/metadata/tr/release_notes.txt: -------------------------------------------------------------------------------- 1 | - Yeni iOS 18 stilleriyle çalışması için simgeler güncellendi 2 | - Oturum açmak için kullanıcı ve şifre seçeneği içeren ikinci oturum açma eklendi 3 | - Kaliforniya'daki kullanıcılar için gizlilik bildirimine giden bağlantı güncellendi 4 | -------------------------------------------------------------------------------- /fastlane/metadata/tr/subtitle.txt: -------------------------------------------------------------------------------- 1 | Basit not ve listeler 2 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/zh-Hans/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/description.txt: -------------------------------------------------------------------------------- 1 | Simplenote 可帮助您轻松记录笔记、创建任务清单、捕捉想法等。 只需打开并写下一些想法即可。 随着合集增多,您可以使用标签和固定按钮对其进行整理,通过快速搜索找到您需要的内容。 因为 Simplenote 会在您的设备之间免费同步,所以您可以随时随地访问您的笔记。 2 | 3 | - 轻松的笔记记录体验 4 | - 在所有设备之间同步所有内容 5 | - 协作与共享 6 | - 使用标签保持整洁有序 7 | - 使用您的电子邮件或 WordPress.com 账户登录 8 | 9 | 同步无忧 10 | - 自动在所有计算机、手机或平板电脑之间无缝同步。 11 | - 在您记录笔记时备份并同步所有内容,因此您永远不会丢失内容。 12 | 13 | 协作与共享 14 | - 协作与合作:与同事分享想法或与室友一起写购物清单。 15 | - 选择是否在网络上发布您的内容,并与您的理想对象共享链接。 16 | - 连接至您的 WordPress.com 帐户,可直接在 WordPress 站点上发布。 17 | - 快速轻松地与第三方应用共享。 18 | 19 | 整理与搜索 20 | - 使用标签保持整洁有序,并通过标签快速搜索和分类。 21 | - 通过高亮显示关键字,快速找到您所需的内容。 22 | - 使用 Markdown 添加格式。 23 | - 创建任务清单。 24 | - 选择笔记和标签的排序顺序。 25 | - 固定您最常使用的笔记。 26 | - 通过重命名和重新排序直接编辑标签。 27 | - 使用密码锁保护您的内容。 28 | 29 | -- 30 | 31 | 隐私政策:https://automattic.com/privacy/ 32 | 服务条款:https://simplenote.com/terms/ 33 | 加州用户隐私声明:https://automattic.com/privacy/#us-privacy-laws 34 | 35 | -- 36 | 37 | 访问 simplenote.com,将 Simplenote 下载至您的其他设备上。 38 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/keywords.txt: -------------------------------------------------------------------------------- 1 | 备注、文本、markdown、日志、日记、同步、待办事项、云、笔记本、简单、记事本、标记、待办事项、写作、备忘录 2 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/release_notes.txt: -------------------------------------------------------------------------------- 1 | - 更新了图标,使其与 iOS 18 的新样式相匹配 2 | - 增加了使用用户名和密码进行回退登录的登录选项 3 | - 更新了面向加州用户的隐私声明的链接 4 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/subtitle.txt: -------------------------------------------------------------------------------- 1 | 简明的备注、待办事项和备忘录 2 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hant/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Automattic/simplenote-ios/b484bb016a0b788303da32091b0fea93ae51d6cc/fastlane/metadata/zh-Hant/.gitkeep -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hant/description.txt: -------------------------------------------------------------------------------- 1 | Simplenote 讓你輕鬆做筆記、建立待辦事項清單、記下想法等等。 開啟程式、記下想法,大功告成。 隨著收集的資料越來越多,標籤和釘選功能可讓你保持井井有條,你也可以使用即時搜尋功能尋找所需資料。 Simplenote 提供免費跨裝置同步功能,讓你隨時隨地將筆記帶在身邊。 2 | 3 | - 享受輕鬆做筆記的體驗 4 | - 所有內容會同步到所有裝置 5 | - 協作與共用 6 | - 使用標籤統整資料 7 | - 使用電子郵件或 WordPress.com 帳號即可登入 8 | 9 | 放心同步 10 | - 順利自動同步到任何電腦、手機或平板電腦。 11 | - 做筆記的當下同時備份和同步,讓你永遠不會遺失內容。 12 | 13 | 協作與共用 14 | - 共同作業,與同事分享想法,或與室友合寫購物清單。 15 | - 能夠選擇是否將筆記內容發佈到網路,並與任何人分享連結。 16 | - 連結 WordPress.com 帳號即可將筆記直接發表至 WordPress 網站。 17 | - 輕鬆快速與第三方應用程式共享筆記。 18 | 19 | 整理和搜尋 20 | - 使用標籤即可讓一切保持井井有條,還能快速搜尋和排序。 21 | - 輸入關鍵字可立即找到所需內容。 22 | - 使用 Markdown 即可新增格式。 23 | - 建立待辦事項清單。 24 | - 為筆記和標籤選擇排序順序。 25 | - 釘選最常用的筆記。 26 | - 重新命名和重新排序即可直接編輯標籤。 27 | - 使用密碼鎖定保護你的內容。 28 | 29 | -- 30 | 31 | 隱私權政策:https://automattic.com/privacy/ 32 | 服務條款:https://simplenote.com/terms/ 33 | 加州使用者的隱私權聲明:https://automattic.com/privacy/#us-privacy-laws 34 | 35 | -- 36 | 37 | 如需為其他裝置下載 Simplenote,請造訪 simplenote.com。 38 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hant/keywords.txt: -------------------------------------------------------------------------------- 1 | 記事, 筆記, markdown, 日誌, 同步, 待辦事項, 清單, 雲端, 筆記本, 簡單, 記事本, 標籤, 待辦事項, 待處理, 備忘錄 2 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hant/release_notes.txt: -------------------------------------------------------------------------------- 1 | - 更新圖示以搭配新的 iOS 18 樣式 2 | - 新增可透過使用者名稱和密碼選項登入的備用登入方式 3 | - 更新了加州使用者隱私權聲明的連結 4 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hant/subtitle.txt: -------------------------------------------------------------------------------- 1 | 簡單好用的筆記、待辦事項和備忘錄 2 | --------------------------------------------------------------------------------