├── .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 |
--------------------------------------------------------------------------------