├── .github └── workflows │ └── main.yaml ├── .gitignore ├── Hour Blocks.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ │ └── Package.resolved │ └── xcuserdata │ │ └── jtsaeed.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcshareddata │ └── xcschemes │ │ ├── neon.xcscheme │ │ ├── neonSiri.xcscheme │ │ ├── neonToday.xcscheme │ │ ├── neonWatch (Notification).xcscheme │ │ └── neonWatch.xcscheme └── xcuserdata │ ├── jamessaeed.xcuserdatad │ └── xcschemes │ │ └── xcschememanagement.plist │ ├── jts.xcuserdatad │ └── xcschemes │ │ └── xcschememanagement.plist │ └── jtsaeed.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── LICENSE ├── NeonSiri ├── Info.plist ├── IntentHandler.swift ├── NeonSiri.entitlements └── SiriDataGateway.swift ├── NeonWidget ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── WidgetBackground.colorset │ │ └── Contents.json ├── Info.plist ├── NeonWidgets.swift ├── Schedule │ ├── ScheduleWidget.swift │ └── UpcomingScheduleView.swift ├── To Do │ ├── CurrentToDoListView.swift │ └── ToDoWidget.swift └── WidgetDataGateway.swift ├── NeonWidgetExtension.entitlements ├── README.md ├── neon ├── .DS_Store ├── App Icons │ ├── icon_blue@2x.png │ ├── icon_blue@3x.png │ ├── icon_blueprint@2x.png │ ├── icon_blueprint@3x.png │ ├── icon_dark@2x.png │ ├── icon_dark@3x.png │ ├── icon_purple@2x.png │ ├── icon_purple@3x.png │ ├── icon_urgency@2x.png │ └── icon_urgency@3x.png ├── App │ └── .DS_Store ├── AppDelegate.swift ├── AppIntentVocabulary.plist ├── AppPublishers.swift ├── AppStrings.swift ├── Assets.xcassets │ ├── .DS_Store │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── App_Icon_3-AppStore.png │ │ ├── App_Icon_3-iPad@2x.png │ │ ├── App_Icon_3-iPadPro@2x.png │ │ ├── App_Icon_3-iPhone@2x.png │ │ ├── App_Icon_3-iPhone@3x.png │ │ ├── App_Icon_3_Mac@1024.png │ │ ├── App_Icon_3_Mac@128.png │ │ ├── App_Icon_3_Mac@16.png │ │ ├── App_Icon_3_Mac@256-1.png │ │ ├── App_Icon_3_Mac@256.png │ │ ├── App_Icon_3_Mac@32-1.png │ │ ├── App_Icon_3_Mac@32.png │ │ ├── App_Icon_3_Mac@512-1.png │ │ ├── App_Icon_3_Mac@512.png │ │ ├── App_Icon_3_Mac@64.png │ │ └── Contents.json │ ├── Contents.json │ ├── blockIcons │ │ ├── .DS_Store │ │ ├── Contents.json │ │ ├── ac_unit.imageset │ │ │ ├── Contents.json │ │ │ ├── ac_unit.png │ │ │ ├── ac_unit@2x.png │ │ │ └── ac_unit@3x.png │ │ ├── alarm.imageset │ │ │ ├── Contents.json │ │ │ ├── alarm.png │ │ │ ├── alarm@2x.png │ │ │ └── alarm@3x.png │ │ ├── brush.imageset │ │ │ ├── Contents.json │ │ │ ├── brush.png │ │ │ ├── brush@2x.png │ │ │ └── brush@3x.png │ │ ├── cake.imageset │ │ │ ├── Contents.json │ │ │ ├── cake.png │ │ │ ├── cake@2x.png │ │ │ └── cake@3x.png │ │ ├── call.imageset │ │ │ ├── Contents.json │ │ │ ├── call.png │ │ │ ├── call@2x.png │ │ │ └── call@3x.png │ │ ├── code.imageset │ │ │ ├── Contents.json │ │ │ ├── code.png │ │ │ ├── code@2x.png │ │ │ └── code@3x.png │ │ ├── commute.imageset │ │ │ ├── Contents.json │ │ │ ├── commute.png │ │ │ ├── commute@2x.png │ │ │ └── commute@3x.png │ │ ├── create.imageset │ │ │ ├── Contents.json │ │ │ ├── create.png │ │ │ ├── create@2x.png │ │ │ └── create@3x.png │ │ ├── default.imageset │ │ │ ├── Artboard.png │ │ │ ├── Artboard@2x.png │ │ │ ├── Artboard@3x.png │ │ │ └── Contents.json │ │ ├── directions_bike.imageset │ │ │ ├── Contents.json │ │ │ ├── directions_bike.png │ │ │ ├── directions_bike@2x.png │ │ │ └── directions_bike@3x.png │ │ ├── directions_bus.imageset │ │ │ ├── Contents.json │ │ │ ├── directions_bus.png │ │ │ ├── directions_bus@2x.png │ │ │ └── directions_bus@3x.png │ │ ├── directions_car.imageset │ │ │ ├── Contents.json │ │ │ ├── directions_car.png │ │ │ ├── directions_car@2x.png │ │ │ └── directions_car@3x.png │ │ ├── directions_run.imageset │ │ │ ├── Contents.json │ │ │ ├── directions_run.png │ │ │ ├── directions_run@2x.png │ │ │ └── directions_run@3x.png │ │ ├── directions_subway.imageset │ │ │ ├── Contents.json │ │ │ ├── directions_subway.png │ │ │ ├── directions_subway@2x.png │ │ │ └── directions_subway@3x.png │ │ ├── email.imageset │ │ │ ├── Contents.json │ │ │ ├── email.png │ │ │ ├── email@2x.png │ │ │ └── email@3x.png │ │ ├── emoji_events.imageset │ │ │ ├── Contents.json │ │ │ ├── emoji_events.png │ │ │ ├── emoji_events@2x.png │ │ │ └── emoji_events@3x.png │ │ ├── event.imageset │ │ │ ├── Contents.json │ │ │ ├── calendar.png │ │ │ ├── calendar@2x.png │ │ │ └── calendar@3x.png │ │ ├── favorite.imageset │ │ │ ├── Contents.json │ │ │ ├── favorite.png │ │ │ ├── favorite@2x.png │ │ │ └── favorite@3x.png │ │ ├── fitness_center.imageset │ │ │ ├── Contents.json │ │ │ ├── fitness_center.png │ │ │ ├── fitness_center@2x.png │ │ │ └── fitness_center@3x.png │ │ ├── flight.imageset │ │ │ ├── Contents.json │ │ │ ├── flight.png │ │ │ ├── flight@2x.png │ │ │ └── flight@3x.png │ │ ├── golf_course.imageset │ │ │ ├── Contents.json │ │ │ ├── golf_course.png │ │ │ ├── golf_course@2x.png │ │ │ └── golf_course@3x.png │ │ ├── group.imageset │ │ │ ├── Contents.json │ │ │ ├── group.png │ │ │ ├── group@2x.png │ │ │ └── group@3x.png │ │ ├── home.imageset │ │ │ ├── Contents.json │ │ │ ├── home.png │ │ │ ├── home@2x.png │ │ │ └── home@3x.png │ │ ├── hotel.imageset │ │ │ ├── Contents.json │ │ │ ├── hotel.png │ │ │ ├── hotel@2x.png │ │ │ └── hotel@3x.png │ │ ├── how_to_vote.imageset │ │ │ ├── Contents.json │ │ │ ├── how_to_vote.png │ │ │ ├── how_to_vote@2x.png │ │ │ └── how_to_vote@3x.png │ │ ├── local_bar.imageset │ │ │ ├── Contents.json │ │ │ ├── local_bar.png │ │ │ ├── local_bar@2x.png │ │ │ └── local_bar@3x.png │ │ ├── local_cafe.imageset │ │ │ ├── Contents.json │ │ │ ├── local_cafe.png │ │ │ ├── local_cafe@2x.png │ │ │ └── local_cafe@3x.png │ │ ├── local_laundry.imageset │ │ │ ├── Contents.json │ │ │ ├── local_laundry.png │ │ │ ├── local_laundry@2x.png │ │ │ └── local_laundry@3x.png │ │ ├── location_on.imageset │ │ │ ├── Contents.json │ │ │ ├── location_on.png │ │ │ ├── location_on@2x.png │ │ │ └── location_on@3x.png │ │ ├── menu_book.imageset │ │ │ ├── Contents.json │ │ │ ├── menu_book.png │ │ │ ├── menu_book@2x.png │ │ │ └── menu_book@3x.png │ │ ├── music_note.imageset │ │ │ ├── Contents.json │ │ │ ├── music_note.png │ │ │ ├── music_note@2x.png │ │ │ └── music_note@3x.png │ │ ├── nature_people.imageset │ │ │ ├── Contents.json │ │ │ ├── nature_people.png │ │ │ ├── nature_people@2x.png │ │ │ └── nature_people@3x.png │ │ ├── palette.imageset │ │ │ ├── Contents.json │ │ │ ├── palette.png │ │ │ ├── palette@2x.png │ │ │ └── palette@3x.png │ │ ├── pets.imageset │ │ │ ├── Contents.json │ │ │ ├── pets.png │ │ │ ├── pets@2x.png │ │ │ └── pets@3x.png │ │ ├── pool.imageset │ │ │ ├── Contents.json │ │ │ ├── pool.png │ │ │ ├── pool@2x.png │ │ │ └── pool@3x.png │ │ ├── restaurant.imageset │ │ │ ├── Contents.json │ │ │ ├── restaurant.png │ │ │ ├── restaurant@2x.png │ │ │ └── restaurant@3x.png │ │ ├── school.imageset │ │ │ ├── Contents.json │ │ │ ├── school.png │ │ │ ├── school@2x.png │ │ │ └── school@3x.png │ │ ├── self_improvement.imageset │ │ │ ├── Contents.json │ │ │ ├── self_improvement.png │ │ │ ├── self_improvement@2x.png │ │ │ └── self_improvement@3x.png │ │ ├── shopping_cart.imageset │ │ │ ├── Contents.json │ │ │ ├── shopping_cart.png │ │ │ ├── shopping_cart@2x.png │ │ │ └── shopping_cart@3x.png │ │ ├── sports_baseball.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_baseball.png │ │ │ ├── sports_baseball@2x.png │ │ │ └── sports_baseball@3x.png │ │ ├── sports_basketball.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_basketball.png │ │ │ ├── sports_basketball@2x.png │ │ │ └── sports_basketball@3x.png │ │ ├── sports_cricket.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_cricket.png │ │ │ ├── sports_cricket@2x.png │ │ │ └── sports_cricket@3x.png │ │ ├── sports_esports.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_esports.png │ │ │ ├── sports_esports@2x.png │ │ │ └── sports_esports@3x.png │ │ ├── sports_hockey.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_hockey.png │ │ │ ├── sports_hockey@2x.png │ │ │ └── sports_hockey@3x.png │ │ ├── sports_rugby.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_rugby.png │ │ │ ├── sports_rugby@2x.png │ │ │ └── sports_rugby@3x.png │ │ ├── sports_soccer.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_football.png │ │ │ ├── sports_football@2x.png │ │ │ └── sports_football@3x.png │ │ ├── sports_tennis.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_tennis.png │ │ │ ├── sports_tennis@2x.png │ │ │ └── sports_tennis@3x.png │ │ ├── sports_volleyball.imageset │ │ │ ├── Contents.json │ │ │ ├── sports_volleyball.png │ │ │ ├── sports_volleyball@2x.png │ │ │ └── sports_volleyball@3x.png │ │ ├── theaters.imageset │ │ │ ├── Contents.json │ │ │ ├── theaters.png │ │ │ ├── theaters@2x.png │ │ │ └── theaters@3x.png │ │ ├── tv.imageset │ │ │ ├── Contents.json │ │ │ ├── tv.png │ │ │ ├── tv@2x.png │ │ │ └── tv@3x.png │ │ ├── wb_sunny.imageset │ │ │ ├── Contents.json │ │ │ ├── wb_sunny.png │ │ │ ├── wb_sunny@2x.png │ │ │ └── wb_sunny@3x.png │ │ ├── weekend.imageset │ │ │ ├── Contents.json │ │ │ ├── weekend.png │ │ │ ├── weekend@2x.png │ │ │ └── weekend@3x.png │ │ └── work.imageset │ │ │ ├── Contents.json │ │ │ ├── work.png │ │ │ ├── work@2x.png │ │ │ └── work@3x.png │ ├── choose_app_icon │ │ ├── Contents.json │ │ ├── choose_blue_icon.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_blue@2x.png │ │ │ └── icon_blue@3x.png │ │ ├── choose_blueprint_icon.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_blueprint@2x.png │ │ │ └── icon_blueprint@3x.png │ │ ├── choose_dark_icon.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_dark@2x.png │ │ │ └── icon_dark@3x.png │ │ ├── choose_original_icon.imageset │ │ │ ├── App_Icon_3-iPhone@2x.png │ │ │ ├── App_Icon_3-iPhone@3x.png │ │ │ └── Contents.json │ │ ├── choose_purple_icon.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_purple@2x.png │ │ │ └── icon_purple@3x.png │ │ └── choose_urgency_icon.imageset │ │ │ ├── Contents.json │ │ │ ├── icon_urgency@2x.png │ │ │ └── icon_urgency@3x.png │ └── colors │ │ ├── BackgroundColor.colorset │ │ └── Contents.json │ │ ├── CardBackingColor.colorset │ │ └── Contents.json │ │ ├── CardShadowColor.colorset │ │ └── Contents.json │ │ ├── ConfirmColor.colorset │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── DarkWidgetBackgroundColor.colorset │ │ └── Contents.json │ │ ├── DividerColor.colorset │ │ └── Contents.json │ │ ├── GradientEnd.colorset │ │ └── Contents.json │ │ ├── GradientStart.colorset │ │ └── Contents.json │ │ ├── HourBlockIconColor.colorset │ │ └── Contents.json │ │ ├── TextColor.colorset │ │ └── Contents.json │ │ └── UrgentColor.colorset │ │ └── Contents.json ├── ContentView.swift ├── Extension │ ├── .DS_Store │ ├── Color+Ext.swift │ ├── Date+Ext.swift │ ├── EKEvent+Ext.swift │ ├── Int+Ext.swift │ ├── String+Ext.swift │ ├── UIDevice+Ext.swift │ └── URL+Ext.swift ├── Info.plist ├── LaunchScreen.storyboard ├── Model │ └── .DS_Store ├── Rewrite │ └── Model │ │ ├── BlockDomain.swift │ │ ├── HourBlock.swift │ │ ├── SelectableIcon.swift │ │ ├── SubBlock.swift │ │ ├── Suggestion.swift │ │ ├── Tip.swift │ │ ├── ToDoItem.swift │ │ ├── ToDoUrgency.swift │ │ └── UserPreference.swift ├── SceneDelegate.swift ├── Service │ ├── AnalyticsGateway.swift │ ├── CalendarGateway.swift │ ├── DataGateway.swift │ ├── DomainsGateway.swift │ ├── HapticsGateway.swift │ ├── RemindersGateway.swift │ ├── SuggestionsGateway.swift │ ├── UtilGateway.swift │ └── VersionGateway.swift ├── View │ ├── Concepts │ │ ├── TestSidebarView.swift │ │ └── ToDoGrid.swift │ ├── Schedule │ │ ├── Hour Block │ │ │ ├── CalendarBlockView.swift │ │ │ ├── CompactHourBlockView.swift │ │ │ ├── EmptyHourBlockView.swift │ │ │ ├── HourBlockIcon.swift │ │ │ ├── HourBlockView.swift │ │ │ ├── NoHourBlocksView.swift │ │ │ ├── NoSuggestionsBlockView.swift │ │ │ └── SuggestionBlockView.swift │ │ ├── ScheduleView.swift │ │ └── Sheets │ │ │ ├── AddHourBlockView.swift │ │ │ ├── EditHourBlockView.swift │ │ │ ├── IconPicker.swift │ │ │ ├── ManageSubBlocksView.swift │ │ │ ├── RescheduleBlockView.swift │ │ │ ├── ScheduleDatePicker.swift │ │ │ └── SchedulePickerView.swift │ ├── Settings │ │ ├── AcknowledgementsView.swift │ │ ├── CalendarSettingsView.swift │ │ ├── Other Settings │ │ │ ├── IconChooser.swift │ │ │ ├── OtherSettingsCard.swift │ │ │ └── OtherSettingsView.swift │ │ ├── PrivacyPolicyView.swift │ │ ├── SettingsCardView.swift │ │ └── SettingsView.swift │ ├── Shared │ │ ├── ActionButton.swift │ │ ├── Card.swift │ │ ├── CardLabels.swift │ │ ├── CardsListView.swift │ │ ├── HeaderView.swift │ │ ├── IconButton.swift │ │ ├── NeonDivider.swift │ │ ├── NeonTextField.swift │ │ ├── TextBlockView.swift │ │ ├── TipCardView.swift │ │ └── WhatsNewView.swift │ └── To Do List │ │ ├── AddToDoItemView.swift │ │ ├── CompletedToDoItemView.swift │ │ ├── EditToDoItemView.swift │ │ ├── ToDoItemView.swift │ │ ├── ToDoListHistoryView.swift │ │ └── ToDoListView.swift ├── ViewModel │ ├── Schedule │ │ ├── Hour Block │ │ │ └── HourBlockViewModel.swift │ │ ├── ScheduleViewModel.swift │ │ └── Sheets │ │ │ ├── AddHourBlockViewModel.swift │ │ │ └── ScheduleDatePickerViewModel.swift │ ├── Settings │ │ ├── CalendarOptionsViewModel.swift │ │ └── SettingsViewModel.swift │ └── To Do List │ │ ├── ToDoItemViewModel.swift │ │ ├── ToDoListHistoryViewModel.swift │ │ └── ToDoListViewModel.swift ├── neon.entitlements ├── neon.xcdatamodeld │ ├── .xccurrentversion │ └── neon.xcdatamodel │ │ └── contents └── notification.aif ├── neonTests ├── Info.plist ├── Schedule │ ├── AddHourBlockTests.swift │ ├── HourBlockTests.swift │ ├── ScheduleDatePickerTests.swift │ └── ScheduleTests.swift ├── Service │ ├── MockAnalyticsGateway.swift │ ├── MockCalendarGateway.swift │ └── MockRemindersGateway.swift └── To Do List │ ├── ToDoItemTests.swift │ ├── ToDoListHistoryTests.swift │ └── ToDoListTests.swift └── neonUITests ├── Info.plist └── neonUITests.swift /.github/workflows/main.yaml: -------------------------------------------------------------------------------- 1 | name: Test & Build 2 | 3 | on: 4 | pull_request: 5 | branches: [ main ] 6 | 7 | jobs: 8 | build: 9 | runs-on: macOS-latest 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v1 13 | - name: Select Xcode 14 | run: sudo xcode-select -switch /Applications/Xcode_12.app 15 | - name: Test & Build 16 | run: xcodebuild clean test -project Hour\ Blocks.xcodeproj -scheme neon -destination "platform=iOS Simulator,name=iPhone 11 Pro" 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | .DS_Store 4 | unused.rb 5 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Amplitude", 6 | "repositoryURL": "https://github.com/amplitude/Amplitude-iOS", 7 | "state": { 8 | "branch": null, 9 | "revision": "f6b19721defbb5424941a4ff80407804a664d15b", 10 | "version": "7.2.0" 11 | } 12 | }, 13 | { 14 | "package": "Sentry", 15 | "repositoryURL": "https://github.com/getsentry/sentry-cocoa", 16 | "state": { 17 | "branch": null, 18 | "revision": "5559277356fb435a61d48ecb73582ed5581d2105", 19 | "version": "6.0.7" 20 | } 21 | }, 22 | { 23 | "package": "SwiftDate", 24 | "repositoryURL": "https://github.com/malcommac/SwiftDate", 25 | "state": { 26 | "branch": null, 27 | "revision": "a25913b19833860b61fac161a706e44834f03c47", 28 | "version": "6.2.0" 29 | } 30 | } 31 | ] 32 | }, 33 | "version": 1 34 | } 35 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/project.xcworkspace/xcuserdata/jtsaeed.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/Hour Blocks.xcodeproj/project.xcworkspace/xcuserdata/jtsaeed.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/xcuserdata/jamessaeed.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | neon.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | neonSiri.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 1 16 | 17 | neonToday.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 2 21 | 22 | neonWatch (Notification).xcscheme_^#shared#^_ 23 | 24 | orderHint 25 | 4 26 | 27 | neonWatch.xcscheme_^#shared#^_ 28 | 29 | orderHint 30 | 3 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/xcuserdata/jts.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | neon-playground.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 4 11 | 12 | neon.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | neonMessage.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 17 21 | 22 | neonSiri.xcscheme_^#shared#^_ 23 | 24 | orderHint 25 | 1 26 | 27 | neonToday.xcscheme_^#shared#^_ 28 | 29 | orderHint 30 | 2 31 | 32 | neonWatch (Notification).xcscheme_^#shared#^_ 33 | 34 | orderHint 35 | 4 36 | 37 | neonWatch.xcscheme_^#shared#^_ 38 | 39 | orderHint 40 | 3 41 | 42 | 43 | SuppressBuildableAutocreation 44 | 45 | 230D099F224E7F4300C103CC 46 | 47 | primary 48 | 49 | 50 | 2338BEB7220A7840004F288F 51 | 52 | primary 53 | 54 | 55 | 2338BECE220A7841004F288F 56 | 57 | primary 58 | 59 | 60 | 2338BED9220A7841004F288F 61 | 62 | primary 63 | 64 | 65 | 2395A94B224AE1750007D6F2 66 | 67 | primary 68 | 69 | 70 | 2395A964224AE78C0007D6F2 71 | 72 | primary 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /Hour Blocks.xcodeproj/xcuserdata/jtsaeed.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | NeonSiri.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 5 11 | 12 | NeonWatch WatchKit App (Complication).xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 25 16 | 17 | NeonWatch WatchKit App.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 20 21 | 22 | NeonWidgetExtension.xcscheme_^#shared#^_ 23 | 24 | orderHint 25 | 6 26 | 27 | SwiftDate (Playground) 1.xcscheme 28 | 29 | isShown 30 | 31 | orderHint 32 | 8 33 | 34 | SwiftDate (Playground) 2.xcscheme 35 | 36 | isShown 37 | 38 | orderHint 39 | 9 40 | 41 | SwiftDate (Playground).xcscheme 42 | 43 | isShown 44 | 45 | orderHint 46 | 7 47 | 48 | neon.xcscheme_^#shared#^_ 49 | 50 | orderHint 51 | 0 52 | 53 | neonSiri.xcscheme_^#shared#^_ 54 | 55 | orderHint 56 | 1 57 | 58 | neonToday.xcscheme_^#shared#^_ 59 | 60 | orderHint 61 | 2 62 | 63 | neonWatch (Notification).xcscheme_^#shared#^_ 64 | 65 | orderHint 66 | 4 67 | 68 | neonWatch.xcscheme_^#shared#^_ 69 | 70 | orderHint 71 | 3 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /NeonSiri/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Hour Blocks Siri 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSExtension 24 | 25 | NSExtensionAttributes 26 | 27 | IntentsRestrictedWhileLocked 28 | 29 | IntentsSupported 30 | 31 | INAddTasksIntent 32 | 33 | 34 | NSExtensionPointIdentifier 35 | com.apple.intents-service 36 | NSExtensionPrincipalClass 37 | $(PRODUCT_MODULE_NAME).IntentHandler 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /NeonSiri/NeonSiri.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.com.evh98.neon 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /NeonWidget/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 | -------------------------------------------------------------------------------- /NeonWidget/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /NeonWidget/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /NeonWidget/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 | -------------------------------------------------------------------------------- /NeonWidget/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Hour Blocks Widget 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSExtension 24 | 25 | NSExtensionPointIdentifier 26 | com.apple.widgetkit-extension 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /NeonWidget/NeonWidgets.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NeonWidgets.swift 3 | // NeonWidgetExtension 4 | // 5 | // Created by James Saeed on 09/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | @main 12 | struct NeonWidgets: WidgetBundle { 13 | 14 | var body: some Widget { 15 | ScheduleWidget() 16 | ToDoWidget() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /NeonWidgetExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.icloud-container-identifiers 8 | 9 | iCloud.com.evh98.neon 10 | 11 | com.apple.developer.icloud-services 12 | 13 | CloudKit 14 | 15 | com.apple.security.app-sandbox 16 | 17 | com.apple.security.application-groups 18 | 19 | group.com.evh98.neon 20 | 21 | com.apple.security.network.client 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hour Blocks: Day Planner 2 | ![HB6_Promo_Art](https://user-images.githubusercontent.com/5303889/112391113-c4a0f800-8ccd-11eb-9655-4e2d0d57ca8c.png) 3 | 4 | # Architecture 5 | 6 | Hour Blocks is built 100% with SwiftUI (iOS 14+) and mostly follows the MVVM pattern. 7 | -------------------------------------------------------------------------------- /neon/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/.DS_Store -------------------------------------------------------------------------------- /neon/App Icons/icon_blue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_blue@2x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_blue@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_blue@3x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_blueprint@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_blueprint@2x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_blueprint@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_blueprint@3x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_dark@2x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_dark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_dark@3x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_purple@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_purple@2x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_purple@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_purple@3x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_urgency@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_urgency@2x.png -------------------------------------------------------------------------------- /neon/App Icons/icon_urgency@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App Icons/icon_urgency@3x.png -------------------------------------------------------------------------------- /neon/App/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/App/.DS_Store -------------------------------------------------------------------------------- /neon/AppIntentVocabulary.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IntentPhrases 6 | 7 | 8 | IntentName 9 | INAddTasksIntent 10 | IntentExamples 11 | 12 | Add grocery shopping to my To Do List in Hour Blocks 13 | Add call Melissa in Hour Blocks 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /neon/AppPublishers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppPublishers.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 26/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// A structure containing publishers used throughout the app. 12 | struct AppPublishers { 13 | 14 | struct Names { 15 | static let refreshSchedule = "RefreshSchedule" 16 | static let refreshToDoList = "RefreshToDoList" 17 | 18 | static let scheduleWidgetTimeline = "ScheduleWidget" 19 | static let toDoListWidgetTimeline = "ToDoWidget" 20 | } 21 | 22 | static let refreshSchedulePublisher = NotificationCenter.default.publisher(for: NSNotification.Name(Names.refreshSchedule)) 23 | static let refreshOnLaunchPublisher = NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification) 24 | 25 | static let refreshToDoListPublisher = NotificationCenter.default.publisher(for: NSNotification.Name(Names.refreshToDoList)) 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /neon/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.635", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-AppStore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-AppStore.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPad@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPadPro@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPadPro@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPhone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPhone@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPhone@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3-iPhone@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@1024.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@128.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@16.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@256-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@256-1.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@256.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@32-1.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@32.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@512-1.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@512.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/AppIcon.appiconset/App_Icon_3_Mac@64.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/.DS_Store -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/ac_unit.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ac_unit.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "ac_unit@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "ac_unit@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/ac_unit.imageset/ac_unit@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/alarm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alarm.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "alarm@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "alarm@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/alarm.imageset/alarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/alarm.imageset/alarm.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/alarm.imageset/alarm@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/alarm.imageset/alarm@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/alarm.imageset/alarm@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/alarm.imageset/alarm@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/brush.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "brush.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "brush@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "brush@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/brush.imageset/brush.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/brush.imageset/brush.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/brush.imageset/brush@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/brush.imageset/brush@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/brush.imageset/brush@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/brush.imageset/brush@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/cake.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cake.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "cake@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "cake@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/cake.imageset/cake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/cake.imageset/cake.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/cake.imageset/cake@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/cake.imageset/cake@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/cake.imageset/cake@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/cake.imageset/cake@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/call.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "call.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "call@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "call@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/call.imageset/call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/call.imageset/call.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/call.imageset/call@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/call.imageset/call@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/call.imageset/call@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/call.imageset/call@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/code.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "code.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "code@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "code@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/code.imageset/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/code.imageset/code.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/code.imageset/code@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/code.imageset/code@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/code.imageset/code@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/code.imageset/code@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/commute.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "commute.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "commute@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "commute@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/commute.imageset/commute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/commute.imageset/commute.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/commute.imageset/commute@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/commute.imageset/commute@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/commute.imageset/commute@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/commute.imageset/commute@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/create.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "create.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "create@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "create@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/create.imageset/create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/create.imageset/create.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/create.imageset/create@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/create.imageset/create@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/create.imageset/create@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/create.imageset/create@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/default.imageset/Artboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/default.imageset/Artboard.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/default.imageset/Artboard@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/default.imageset/Artboard@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/default.imageset/Artboard@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/default.imageset/Artboard@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/default.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Artboard.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Artboard@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Artboard@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bike.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "directions_bike.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "directions_bike@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "directions_bike@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bike.imageset/directions_bike@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "directions_bus.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "directions_bus@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "directions_bus@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_bus.imageset/directions_bus@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_car.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "directions_car.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "directions_car@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "directions_car@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_car.imageset/directions_car@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_run.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "directions_run.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "directions_run@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "directions_run@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_run.imageset/directions_run@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_subway.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "directions_subway.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "directions_subway@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "directions_subway@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/directions_subway.imageset/directions_subway@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/email.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "email.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "email@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "email@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/email.imageset/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/email.imageset/email.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/email.imageset/email@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/email.imageset/email@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/email.imageset/email@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/email.imageset/email@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/emoji_events.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "emoji_events.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "emoji_events@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "emoji_events@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/emoji_events.imageset/emoji_events@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/event.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "calendar.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "calendar@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "calendar@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/event.imageset/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/event.imageset/calendar.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/event.imageset/calendar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/event.imageset/calendar@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/event.imageset/calendar@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/event.imageset/calendar@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/favorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favorite.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "favorite@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "favorite@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/favorite.imageset/favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/favorite.imageset/favorite.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/favorite.imageset/favorite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/favorite.imageset/favorite@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/favorite.imageset/favorite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/favorite.imageset/favorite@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/fitness_center.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fitness_center.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "fitness_center@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "fitness_center@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/fitness_center.imageset/fitness_center@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/flight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "flight.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "flight@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "flight@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/flight.imageset/flight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/flight.imageset/flight.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/flight.imageset/flight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/flight.imageset/flight@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/flight.imageset/flight@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/flight.imageset/flight@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/golf_course.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "golf_course.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "golf_course@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "golf_course@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/golf_course.imageset/golf_course@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/group.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "group.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "group@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "group@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/group.imageset/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/group.imageset/group.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/group.imageset/group@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/group.imageset/group@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/group.imageset/group@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/group.imageset/group@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "home.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "home@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "home@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/home.imageset/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/home.imageset/home.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/home.imageset/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/home.imageset/home@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/home.imageset/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/home.imageset/home@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/hotel.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hotel.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "hotel@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "hotel@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/hotel.imageset/hotel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/hotel.imageset/hotel.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/hotel.imageset/hotel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/hotel.imageset/hotel@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/hotel.imageset/hotel@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/hotel.imageset/hotel@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/how_to_vote.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "how_to_vote.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "how_to_vote@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "how_to_vote@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/how_to_vote.imageset/how_to_vote@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_bar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "local_bar.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "local_bar@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "local_bar@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_bar.imageset/local_bar@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_cafe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "local_cafe.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "local_cafe@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "local_cafe@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_cafe.imageset/local_cafe@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_laundry.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "local_laundry.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "local_laundry@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "local_laundry@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/local_laundry.imageset/local_laundry@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/location_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "location_on.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "location_on@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "location_on@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/location_on.imageset/location_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/location_on.imageset/location_on.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/location_on.imageset/location_on@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/location_on.imageset/location_on@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/location_on.imageset/location_on@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/location_on.imageset/location_on@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/menu_book.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menu_book.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "menu_book@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "menu_book@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/menu_book.imageset/menu_book@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/music_note.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "music_note.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "music_note@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "music_note@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/music_note.imageset/music_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/music_note.imageset/music_note.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/music_note.imageset/music_note@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/music_note.imageset/music_note@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/music_note.imageset/music_note@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/music_note.imageset/music_note@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/nature_people.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "nature_people.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "nature_people@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "nature_people@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/nature_people.imageset/nature_people@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/palette.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "palette.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "palette@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "palette@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/palette.imageset/palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/palette.imageset/palette.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/palette.imageset/palette@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/palette.imageset/palette@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/palette.imageset/palette@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/palette.imageset/palette@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pets.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pets.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "pets@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "pets@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pets.imageset/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pets.imageset/pets.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pets.imageset/pets@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pets.imageset/pets@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pets.imageset/pets@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pets.imageset/pets@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pool.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pool.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "pool@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "pool@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pool.imageset/pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pool.imageset/pool.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pool.imageset/pool@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pool.imageset/pool@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/pool.imageset/pool@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/pool.imageset/pool@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/restaurant.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "restaurant.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "restaurant@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "restaurant@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/restaurant.imageset/restaurant@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/school.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "school.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "school@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "school@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/school.imageset/school.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/school.imageset/school.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/school.imageset/school@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/school.imageset/school@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/school.imageset/school@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/school.imageset/school@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/self_improvement.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "self_improvement.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "self_improvement@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "self_improvement@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/self_improvement.imageset/self_improvement@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/shopping_cart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shopping_cart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "shopping_cart@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "shopping_cart@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/shopping_cart.imageset/shopping_cart@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_baseball.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_baseball.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_baseball@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_baseball@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_baseball.imageset/sports_baseball@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_basketball.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_basketball.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_basketball@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_basketball@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_basketball.imageset/sports_basketball@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_cricket.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_cricket.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_cricket@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_cricket@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_cricket.imageset/sports_cricket@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_esports.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_esports.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_esports@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_esports@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_esports.imageset/sports_esports@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_hockey.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_hockey.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_hockey@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_hockey@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_hockey.imageset/sports_hockey@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_rugby.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_rugby.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_rugby@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_rugby@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_rugby.imageset/sports_rugby@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_soccer.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_football.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_football@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_football@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_soccer.imageset/sports_football@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_tennis.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_tennis.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_tennis@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_tennis@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_tennis.imageset/sports_tennis@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sports_volleyball.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sports_volleyball@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sports_volleyball@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/sports_volleyball.imageset/sports_volleyball@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/theaters.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "theaters.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "theaters@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "theaters@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/theaters.imageset/theaters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/theaters.imageset/theaters.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/theaters.imageset/theaters@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/theaters.imageset/theaters@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/theaters.imageset/theaters@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/theaters.imageset/theaters@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/tv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tv.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "tv@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "tv@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/tv.imageset/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/tv.imageset/tv.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/tv.imageset/tv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/tv.imageset/tv@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/tv.imageset/tv@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/tv.imageset/tv@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/wb_sunny.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "wb_sunny.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "wb_sunny@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "wb_sunny@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/wb_sunny.imageset/wb_sunny@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/weekend.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "weekend.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "weekend@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "weekend@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/weekend.imageset/weekend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/weekend.imageset/weekend.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/weekend.imageset/weekend@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/weekend.imageset/weekend@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/weekend.imageset/weekend@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/weekend.imageset/weekend@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/work.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "work.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "work@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "work@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/work.imageset/work.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/work.imageset/work.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/work.imageset/work@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/work.imageset/work@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/blockIcons/work.imageset/work@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/blockIcons/work.imageset/work@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blue_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_blue@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_blue@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blue_icon.imageset/icon_blue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_blue_icon.imageset/icon_blue@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blue_icon.imageset/icon_blue@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_blue_icon.imageset/icon_blue@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blueprint_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_blueprint@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_blueprint@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "template-rendering-intent" : "original" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blueprint_icon.imageset/icon_blueprint@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_blueprint_icon.imageset/icon_blueprint@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_blueprint_icon.imageset/icon_blueprint@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_blueprint_icon.imageset/icon_blueprint@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_dark_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_dark@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_dark@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "template-rendering-intent" : "original" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_dark_icon.imageset/icon_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_dark_icon.imageset/icon_dark@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_dark_icon.imageset/icon_dark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_dark_icon.imageset/icon_dark@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_original_icon.imageset/App_Icon_3-iPhone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_original_icon.imageset/App_Icon_3-iPhone@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_original_icon.imageset/App_Icon_3-iPhone@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_original_icon.imageset/App_Icon_3-iPhone@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_original_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "App_Icon_3-iPhone@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "App_Icon_3-iPhone@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "template-rendering-intent" : "original" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_purple_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_purple@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_purple@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_purple_icon.imageset/icon_purple@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_purple_icon.imageset/icon_purple@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_purple_icon.imageset/icon_purple@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_purple_icon.imageset/icon_purple@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_urgency_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_urgency@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_urgency@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_urgency_icon.imageset/icon_urgency@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_urgency_icon.imageset/icon_urgency@2x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/choose_app_icon/choose_urgency_icon.imageset/icon_urgency@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Assets.xcassets/choose_app_icon/choose_urgency_icon.imageset/icon_urgency@3x.png -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/BackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "display-p3", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0x00", 45 | "green" : "0x00", 46 | "red" : "0x00" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/CardBackingColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "0.100", 44 | "blue" : "1.000", 45 | "green" : "1.000", 46 | "red" : "1.000" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/CardShadowColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.100", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/ConfirmColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x50", 9 | "green" : "0xAF", 10 | "red" : "0x4C" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/DarkWidgetBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.100" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/DividerColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "0.040", 8 | "blue" : "0x00", 9 | "green" : "0x00", 10 | "red" : "0x00" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "display-p3", 24 | "components" : { 25 | "alpha" : "0.120", 26 | "blue" : "0xFF", 27 | "green" : "0xFF", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/GradientEnd.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x06", 9 | "green" : "0x9A", 10 | "red" : "0xF9" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/GradientStart.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x18", 9 | "green" : "0xC5", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/HourBlockIconColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "0.100", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "display-p3", 24 | "components" : { 25 | "alpha" : "0.100", 26 | "blue" : "0.000", 27 | "green" : "0.000", 28 | "red" : "0.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "display-p3", 42 | "components" : { 43 | "alpha" : "0.400", 44 | "blue" : "1.000", 45 | "green" : "1.000", 46 | "red" : "1.000" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/TextColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "display-p3", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.000", 27 | "green" : "0.000", 28 | "red" : "0.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "display-p3", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0xFF", 45 | "green" : "0xFF", 46 | "red" : "0xFF" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /neon/Assets.xcassets/colors/UrgentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x1E", 9 | "green" : "0x51", 10 | "red" : "0xF4" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neon/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // neon3 4 | // 5 | // Created by James Saeed on 18/06/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import CoreData 11 | 12 | struct ContentView: View { 13 | 14 | /// Used to determine whether or not to show the 'What's New in Hour Blocks ...' sheet 15 | @State var isWhatsNewPresented = VersionGateway.shared.isNewVersion() 16 | 17 | var body: some View { 18 | TabView { 19 | ScheduleView().tabItem { 20 | Image(systemName: "calendar") 21 | Text("Schedule") 22 | } 23 | ToDoListView().tabItem { 24 | Image(systemName: "list.bullet") 25 | Text("To Do List") 26 | } 27 | SettingsView().tabItem { 28 | Image(systemName: "gear") 29 | Text("Settings") 30 | } 31 | }.accentColor(Color("AccentColor")) 32 | .sheet(isPresented: $isWhatsNewPresented) { 33 | WhatsNewView(isPresented: $isWhatsNewPresented) 34 | } 35 | } 36 | } 37 | 38 | #if DEBUG 39 | struct ContentView_Previews : PreviewProvider { 40 | static var previews: some View { 41 | ContentView() 42 | } 43 | } 44 | #endif 45 | -------------------------------------------------------------------------------- /neon/Extension/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Extension/.DS_Store -------------------------------------------------------------------------------- /neon/Extension/Color+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color+Ext.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 26/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | extension Color { 12 | 13 | func getLightColor(darkMode: Bool) -> Color { 14 | var hue: CGFloat = 0 15 | UIColor(self).getHue(&hue, saturation: nil, brightness: nil, alpha: nil) 16 | 17 | return Color(hue: Double(hue), saturation: darkMode ? 1.0 : 0.03, brightness: darkMode ? 0.10 : 0.97) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /neon/Extension/Date+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Date+Ext.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 07/02/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftDate 11 | 12 | extension Date { 13 | 14 | /// Converts the date into the formatted form of `E d MMM`. 15 | /// 16 | /// - Returns: 17 | /// The formatted date string. 18 | func getFormattedDate() -> String { 19 | let dateFormatter = DateFormatter() 20 | dateFormatter.dateFormat = "E d MMM" 21 | 22 | return dateFormatter.string(from: self).uppercased() 23 | } 24 | 25 | /// Converts the date into the formatted form of either `HH:mm` or `h:mma` depending on whether or not military time is being used. 26 | /// 27 | /// - Parameters: 28 | /// - date: The day to match when querying calendar events from EventKit. 29 | /// 30 | /// - Returns: 31 | /// The formatted date string. 32 | func getFullFormattedTime(usingMilitaryTime: Bool) -> String { 33 | let dateFormatter = DateFormatter() 34 | dateFormatter.dateFormat = usingMilitaryTime ? "HH:mm" : "h:mma" 35 | dateFormatter.locale = Locale(identifier: "en_US_POSIX") 36 | 37 | return dateFormatter.string(from: self).uppercased() 38 | } 39 | 40 | /// Converts the date to UTC time. 41 | /// 42 | /// - Returns: 43 | /// A UTC adjusted date object. 44 | func toGlobalTime() -> Date { 45 | let timezone = TimeZone.current 46 | let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) 47 | return Date(timeInterval: seconds, since: self) 48 | } 49 | 50 | /// Converts the date to local time. 51 | /// 52 | /// - Returns: 53 | /// A local-time adjusted date object. 54 | func toLocalTime() -> Date { 55 | let timezone = TimeZone.current 56 | let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) 57 | return Date(timeInterval: seconds, since: self) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /neon/Extension/EKEvent+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EKEvent+Ext.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 12/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import EventKit 11 | 12 | /// Conformity for the purpose of ensuring each instance of EKEvent is unique 13 | extension EKEvent: Identifiable { } 14 | -------------------------------------------------------------------------------- /neon/Extension/Int+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+Ext.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 11/11/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Int { 12 | 13 | /// Converts an hour value to a formatted 12h string. 14 | /// 15 | /// - Returns: 16 | /// A formatted 12h string. 17 | func get12hTime() -> String { 18 | if self == 0 { 19 | return "12AM" 20 | } else if self < 12 { 21 | return "\(self)AM" 22 | } else if self == 12 { 23 | return "\(self)PM" 24 | } else { 25 | return "\(self - 12)PM" 26 | } 27 | } 28 | 29 | /// Converts an hour value to a formatted 24h string. 30 | /// 31 | /// - Returns: 32 | /// A formatted 24h string. 33 | func get24hTime() -> String { 34 | if self >= 10 { 35 | return "\(self):00" 36 | } else { 37 | return "0\(self):00" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /neon/Extension/String+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Ext.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 30/10/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension String { 12 | 13 | /// Capitalizes a string but excludes commonly non-capitalized words & excludes dates 14 | /// 15 | /// - Returns: 16 | /// A 'smart' capitalized string 17 | func smartCapitalization() -> String { 18 | var title = "" 19 | let words = self.lowercased().components(separatedBy: " ") 20 | 21 | for word in words { 22 | if word == "to" || word == "and" || word == "with" || word == "for" || word == "a" || word == "at" || word == "in" || word.hasPrefix("1") || word.hasPrefix("2") || word.hasPrefix("3") || word.hasPrefix("4") || word.hasPrefix("5") || word.hasPrefix("6") || word.hasPrefix("7") || word.hasPrefix("8") || word.hasPrefix("9") || word.hasPrefix("0") { 23 | title += (word + " ") 24 | } else { 25 | title += (word.capitalized + " ") 26 | } 27 | } 28 | 29 | return String(title.dropLast()) 30 | } 31 | 32 | @available(*, deprecated, message: "This function will be redundant after a small ToDoUrgency refactor") 33 | func urgencyToColorString() -> String { 34 | if self == "urgent" { 35 | return "UrgentColor" 36 | } else if self == "soon" { 37 | return "AccentColor" 38 | } else if self == "whenever" { 39 | return "TextColor" 40 | } 41 | 42 | return self 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /neon/Extension/UIDevice+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+Ext.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 16/09/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIDevice { 12 | 13 | /// Determines whether or not the current device has a notch or not. 14 | var hasNotch: Bool { 15 | let bottom = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 16 | return bottom > 0 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /neon/Extension/URL+Ext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL+Ext.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 10/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension URL { 12 | 13 | /// Uses the FileManager to determine the URL for a particular database. 14 | /// 15 | /// - Parameters: 16 | /// - appGroup: The App Group that the database is part of. 17 | /// - databaseName: The name of the database. 18 | /// 19 | /// - Returns: 20 | /// The URL of the database. 21 | static func storeURL(for appGroup: String, databaseName: String) -> URL { 22 | guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) else { 23 | fatalError("Shared file container could not be created.") 24 | } 25 | 26 | return fileContainer.appendingPathComponent("\(databaseName).sqlite") 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /neon/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /neon/Model/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/Model/.DS_Store -------------------------------------------------------------------------------- /neon/Rewrite/Model/SubBlock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubBlock.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 02/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import CoreData 11 | 12 | /// The model for a Sub Block. 13 | struct SubBlock: Identifiable { 14 | 15 | let id: String 16 | private let hourBlockId: String 17 | 18 | let title: String 19 | private let timestamp: Date 20 | 21 | /// Creates an instance of a Sub Block. 22 | /// 23 | /// - Parameters: 24 | /// - hourBlock: The associated Hour Block for this Sub Block. 25 | /// - title: The raw, user-inputted title of the Sub Block. 26 | init(of hourBlock: HourBlock, title: String) { 27 | self.id = UUID().uuidString 28 | self.hourBlockId = hourBlock.id 29 | self.title = title 30 | self.timestamp = Date() 31 | } 32 | 33 | /// Creates an instance of a Sub Block from a Core Data entity. 34 | /// 35 | /// - Parameters: 36 | /// - entity: The SubBlockEntity instance from the Core Data store. 37 | init?(fromEntity entity: SubBlockEntity) { 38 | guard let entityIdentifier = entity.identifier else { return nil } 39 | guard let entityHourBlockIdentifier = entity.hourBlockIdentifier else { return nil } 40 | guard let entityTitle = entity.title else { return nil } 41 | guard let entityTimestamp = entity.timestamp else { return nil } 42 | 43 | self.id = entityIdentifier 44 | self.hourBlockId = entityHourBlockIdentifier 45 | self.title = entityTitle 46 | self.timestamp = entityTimestamp 47 | } 48 | 49 | /// Creates a SubBlockEntity from the instance to be used with Core Data. 50 | /// 51 | /// - Returns: 52 | /// An instance of SubBlockEntity. 53 | @discardableResult 54 | func getEntity(context: NSManagedObjectContext) -> SubBlockEntity { 55 | let entity = SubBlockEntity(context: context) 56 | 57 | entity.identifier = id 58 | entity.hourBlockIdentifier = hourBlockId 59 | entity.title = title 60 | entity.timestamp = timestamp 61 | 62 | return entity 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /neon/Rewrite/Model/Suggestion.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Suggestion.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 12/02/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// The model for an Suggestion to be used for a suggested Hour Block. 12 | struct Suggestion: Identifiable { 13 | 14 | let id: String 15 | 16 | let domain: BlockDomain 17 | let reason: String 18 | let score: Int 19 | 20 | /// Creates an instance of a Suggestion. 21 | /// 22 | /// - Parameters: 23 | /// - domain: The corresponding domain for the suggestion. 24 | /// - reason: The reason why this suggestion was generated for the user. 25 | /// - score: The value determining how highly the suggestion ranks. 26 | init(domain: BlockDomain, reason: String, score: Int) { 27 | self.id = UUID().uuidString 28 | self.domain = domain 29 | self.reason = reason 30 | self.score = score 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /neon/Rewrite/Model/Tip.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tip.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 14/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// An enum mapping the tips that can be shown as Tip Cards within the app. 12 | enum Tip: CustomStringConvertible { 13 | 14 | case blockOptions 15 | case headerSwipe 16 | 17 | case toDoSiri 18 | 19 | var description: String { 20 | switch self { 21 | #if targetEnvironment(macCatalyst) 22 | case .blockOptions: return "Right click on a block for more options" 23 | #else 24 | case .blockOptions: return "Hold down on a block for more options" 25 | #endif 26 | case .headerSwipe: return "Swipe across the header to change days" 27 | 28 | case .toDoSiri: return "Ask Siri to add an item in Hour Blocks" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /neon/Rewrite/Model/ToDoUrgency.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoUrgency.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 30/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | enum ToDoUrgency: String, CaseIterable { 12 | 13 | case whenever, soon, urgent 14 | 15 | var color: Color { 16 | switch self { 17 | case .urgent: return Color(AppStrings.Colors.urgent) 18 | case .soon: return Color(AppStrings.Colors.accent) 19 | case .whenever: return Color(AppStrings.Colors.text) 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /neon/Rewrite/Model/UserPreference.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserPreference.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 30/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum UserPreference: String { 12 | 13 | case reminders, dayStart, timeFormat, autoCaps 14 | 15 | var key: String { 16 | return self.rawValue 17 | } 18 | 19 | var defaultValue: Int { 20 | switch self { 21 | case .reminders, .autoCaps: return 0 22 | case .timeFormat: return 1 23 | case .dayStart: return 2 24 | } 25 | } 26 | 27 | var title: String { 28 | switch self { 29 | case .reminders: return "Reminders" 30 | case .dayStart: return "Day Start" 31 | case .timeFormat: return "Time Format" 32 | case .autoCaps: return "Automatic Capitalization" 33 | } 34 | } 35 | 36 | var description: String { 37 | switch self { 38 | case .reminders: return "Enable reminders for upcoming Hour Blocks (changes only applied to new Hour Blocks)" 39 | case .dayStart: return "Change the time (am) your Schedule starts in Hour Blocks" 40 | case .timeFormat: return "Change the time format used throughout Hour Blocks" 41 | case .autoCaps: return "Would you like the titles of blocks to be automatically capitalized?" 42 | } 43 | } 44 | 45 | var options: [String] { 46 | switch self { 47 | case .reminders, .autoCaps: return ["Yes", "No"] 48 | case .dayStart: return ["12", "5", "6", "7", "8"] 49 | case .timeFormat: return ["System", "12h", "24h"] 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /neon/Service/AnalyticsGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnalyticsGateway.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 15/05/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Amplitude 11 | 12 | protocol AnalyticsGatewayProtocol { 13 | 14 | func log(hourBlock: HourBlock) 15 | func log(suggestion: Suggestion) 16 | func logToDoItem() 17 | } 18 | 19 | /// The analytics gateway service used to interface with Firebase Analytics. 20 | struct AnalyticsGateway: AnalyticsGatewayProtocol { 21 | 22 | /// Log a newly added Hour Block. 23 | /// 24 | /// - Parameters: 25 | /// - hourBlock: The Hour Block to be logged. 26 | func log(hourBlock: HourBlock) { 27 | Amplitude.instance().logEvent("hour_block_added", withEventProperties: ["domain": DomainsGateway.shared.determineDomain(for: hourBlock.title!)?.rawValue ?? "Default"]) 28 | } 29 | 30 | /// Log a newly added suggestion. 31 | /// 32 | /// - Parameters: 33 | /// - hourBlock: The Suggestion to be logged. 34 | func log(suggestion: Suggestion) { 35 | Amplitude.instance().logEvent("suggestion_added", withEventProperties: ["domain": suggestion.domain.rawValue, 36 | "reason": suggestion.reason]) 37 | } 38 | 39 | /// Log a newly added To Do item. 40 | func logToDoItem() { 41 | Amplitude.instance().logEvent("to_do_item_added") 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /neon/Service/HapticsGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AudioGateway.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 22/10/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AVFoundation 11 | import SwiftUI 12 | 13 | /// A singleton gateway service used to interface with Core Haptics. 14 | struct HapticsGateway { 15 | 16 | static let shared = HapticsGateway() 17 | 18 | /// Triggers a medium intensity heavy haptic that's generally used for when items are added. 19 | func triggerAddBlockHaptic() { 20 | UIImpactFeedbackGenerator(style: .heavy).impactOccurred(intensity: 0.75) 21 | } 22 | 23 | /// Triggers a high intensity soft haptic that's generally used for when items are cleared. 24 | func triggerClearBlockHaptic() { 25 | UIImpactFeedbackGenerator(style: .soft).impactOccurred(intensity: 0.9) 26 | } 27 | 28 | /// Triggers a success haptic that's used when an item is marked as complete. 29 | func triggerCompletionHaptic() { 30 | UINotificationFeedbackGenerator().notificationOccurred(.success) 31 | } 32 | 33 | /// Triggers a light haptic that's generally used for generic button taps. 34 | func triggerLightImpact() { 35 | UIImpactFeedbackGenerator(style: .light).impactOccurred() 36 | } 37 | 38 | /// Trigers a low intensity soft haptic that's used for lightweight interactions such as icon selection. 39 | func triggerSoftImpact() { 40 | UIImpactFeedbackGenerator(style: .soft).impactOccurred(intensity: 0.6) 41 | } 42 | 43 | /// Triggers an error haptic. 44 | func triggerErrorHaptic() { 45 | UINotificationFeedbackGenerator().notificationOccurred(.error) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /neon/Service/UtilGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UtilGateway.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 08/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// A singleton gateway service used to interface with any utility functions that don't belong anywhere else. 12 | struct UtilGateway { 13 | 14 | static let shared = UtilGateway() 15 | 16 | /// Determines the system time format setting. 17 | /// 18 | /// - Returns: 19 | /// Whether or not the system time setting is 12h. 20 | func isSystemClock12h() -> Bool { 21 | let formatter = DateFormatter() 22 | formatter.locale = Locale.current 23 | formatter.dateStyle = .none 24 | formatter.timeStyle = .short 25 | 26 | let dateString = formatter.string(from: Date()) 27 | let amRange = dateString.range(of: formatter.amSymbol) 28 | let pmRange = dateString.range(of: formatter.pmSymbol) 29 | 30 | return !(pmRange == nil && amRange == nil) 31 | } 32 | 33 | @available(*, deprecated, message: "This function will be redundant after a small ScheduleViewModel refactor") 34 | func dayStartHour() -> Int { 35 | if let dayStartValue = UserDefaults.standard.value(forKey: "dayStart") as? Int { 36 | switch dayStartValue { 37 | case 0: return 0 38 | case 1: return 5 39 | case 2: return 6 40 | case 3: return 7 41 | case 4: return 8 42 | default: return 6 43 | } 44 | } else { 45 | return 6 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /neon/Service/VersionGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VersionGateway.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 27/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// A singleton gateway service used to interface with app version related activity. 12 | struct VersionGateway { 13 | 14 | static let shared = VersionGateway() 15 | 16 | let currentMajorVersion = 6.2 17 | let currentFullVersion = "6.2.2" 18 | 19 | /// Determines whether or not the user has launched a new major app update for the first time; called in order to trigger the presentation of the WhatsNewView. 20 | /// 21 | /// - Returns: 22 | /// Whether a new major version has been launched for the first time or not. 23 | func isNewVersion() -> Bool { 24 | // Check if the user has had a previous version of the app installed 25 | guard let userVersion = UserDefaults.standard.object(forKey: "currentVersion") as? Double else { 26 | UserDefaults.standard.set(currentMajorVersion, forKey: "currentVersion") 27 | return false 28 | } 29 | 30 | UserDefaults.standard.set(currentMajorVersion, forKey: "currentVersion") 31 | UserDefaults.standard.synchronize() 32 | 33 | return userVersion < currentMajorVersion 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /neon/View/Concepts/TestSidebarView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TestSidebarView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 04/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct TestSidebarView: View { 12 | 13 | var body: some View { 14 | NavigationView { 15 | List { 16 | NavigationLink(destination: ScheduleView()) { 17 | Label("Schedule", systemImage: "calendar") 18 | } 19 | 20 | NavigationLink(destination: ToDoListView()) { 21 | Label("To Do List", systemImage: "list.bullet") 22 | } 23 | 24 | Section(header: Text("Settings")) { 25 | NavigationLink(destination: CalendarSettingsView(isPresented: .constant(true))) { 26 | Label("Calendars", systemImage: "calendar") 27 | } 28 | 29 | NavigationLink(destination: OtherSettingsView(isPresented: .constant(true))) { 30 | Label("Other Stuff", systemImage: "gearshape.fill") 31 | } 32 | 33 | NavigationLink(destination: PrivacyPolicyView(isPresented: .constant(true))) { 34 | Label("Privacy Policy", systemImage: "lock.fill") 35 | } 36 | } 37 | }.listStyle(SidebarListStyle()) 38 | .navigationTitle("Menu") 39 | 40 | ScheduleView() 41 | }.accentColor(Color("AccentColor")) 42 | } 43 | } 44 | 45 | struct TestSidebarView_Previews: PreviewProvider { 46 | static var previews: some View { 47 | TestSidebarView().previewDevice(PreviewDevice(rawValue: "iPad Pro (11-inch) (2nd generation)")) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /neon/View/Concepts/ToDoGrid.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoGrid.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 25/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ToDoGrid: View { 12 | 13 | let columns: [GridItem] = [ 14 | GridItem(.adaptive(minimum: 160, maximum: 512)) 15 | ] 16 | 17 | var body: some View { 18 | ScrollView { 19 | LazyVGrid(columns: columns, spacing: 20) { 20 | ForEach(1 ..< 20) { _ in 21 | Card { 22 | VStack(alignment: .leading, spacing: 4) { 23 | Text("HIGH PRIORITY") 24 | .foregroundColor(Color("UrgentColor")) 25 | .font(.system(size: 14, weight: .semibold, design: .default)) 26 | Text("Sort out Joe's room") 27 | .opacity(0.9) 28 | .font(.system(size: 22, weight: .bold, design: .rounded)) 29 | } 30 | }.frame(width: 160) 31 | .onDrag { return NSItemProvider(object: "test" as NSString) } 32 | } 33 | }.padding(20) 34 | } 35 | } 36 | } 37 | 38 | struct ToDoGrid_Previews: PreviewProvider { 39 | static var previews: some View { 40 | ToDoGrid() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/CalendarBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CalendarBlockView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 06/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import EventKit 11 | 12 | /// A Card based view for displaying a Calendar event. 13 | struct CalendarBlockView: View { 14 | 15 | /// A UserDefaults property determining what hour format to use when displaying times. 16 | @AppStorage(AppStrings.AppStorage.timeFormat) private var timeFormatValue: Int = 1 17 | 18 | private let event: EKEvent 19 | 20 | /// Creates an instance of CalendarBlockView. 21 | /// 22 | /// - Parameters: 23 | /// - event: The event to be displayed. 24 | init(for event: EKEvent) { 25 | self.event = event 26 | } 27 | 28 | var body: some View { 29 | Card { 30 | HStack { 31 | CardLabels(title: event.title, 32 | subtitle: getSubtitle()) 33 | Spacer() 34 | HourBlockIcon(AppStrings.Icons.calendarEvent) 35 | } 36 | }.padding(.horizontal, 24) 37 | } 38 | 39 | /// Determines the properly formatted subtitle for the calendar event. 40 | /// 41 | /// - Returns: 42 | /// A formatted subtitle string 43 | private func getSubtitle() -> String { 44 | if event.isAllDay { 45 | return AppStrings.Schedule.HourBlock.calendarBlockAllDay 46 | } else { 47 | return "\(event.startDate.getFullFormattedTime(usingMilitaryTime: isUsingMilitaryTime())) TO \(event.endDate.getFullFormattedTime(usingMilitaryTime: isUsingMilitaryTime()))" 48 | } 49 | } 50 | 51 | /// Determines whether or not to use military time based on user preferences 52 | /// 53 | /// - Returns: 54 | /// A boolean on whether or not to use military time 55 | private func isUsingMilitaryTime() -> Bool { 56 | return (timeFormatValue == 0 && !UtilGateway.shared.isSystemClock12h()) || timeFormatValue == 2 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/CompactHourBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CompactHourBlockView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 27/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view for displaying an Hour Block without its corresponding Sub Blocks or interactions 12 | struct CompactHourBlockView: View { 13 | 14 | @ObservedObject var viewModel: HourBlockViewModel 15 | 16 | var body: some View { 17 | Card { 18 | VStack(spacing: 20) { 19 | HStack { 20 | CardLabels(title: viewModel.getTitle(), 21 | subtitle: viewModel.getFormattedTime()) 22 | Spacer() 23 | HourBlockIcon(viewModel.icon.imageName) 24 | } 25 | } 26 | }.padding(.horizontal, 24) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/EmptyHourBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyHourBlockView.swift 3 | // neon6 4 | // 5 | // Created by James Saeed on 27/06/2020. 6 | // 7 | 8 | import SwiftUI 9 | 10 | /// A Card based view for displaying an empty Hour Block. 11 | struct EmptyHourBlockView: View { 12 | 13 | @ObservedObject private var viewModel: HourBlockViewModel 14 | 15 | private let onNewBlockAdded: (HourBlock) -> Void 16 | 17 | /// Creates an instance of EmptyHourBlockView. 18 | /// 19 | /// - Parameters: 20 | /// - viewModel: The corresponding view model for the given Hour Block. 21 | /// - onNewBlockAdded: The callback function to be triggered when the user chooses to add to the corresponding Hour Block. 22 | init(viewModel: HourBlockViewModel, onNewBlockAdded: @escaping (HourBlock) -> Void) { 23 | self.viewModel = viewModel 24 | self.onNewBlockAdded = onNewBlockAdded 25 | } 26 | 27 | var body: some View { 28 | Card { 29 | HStack { 30 | CardLabels(title: AppStrings.Schedule.HourBlock.empty, 31 | subtitle: viewModel.getFormattedTime(), 32 | titleOpacity: 0.4) 33 | Spacer() 34 | IconButton(iconName: AppStrings.Icons.add, 35 | iconWeight: .bold, 36 | action: viewModel.presentAddHourBlockView) 37 | } 38 | }.padding(.horizontal, 24) 39 | 40 | .sheet(isPresented: $viewModel.isAddHourBlockViewPresented) { 41 | AddHourBlockView(isPresented: $viewModel.isAddHourBlockViewPresented, 42 | for: viewModel.hourBlock.day, viewModel.hourBlock.hour, 43 | onNewBlockAdded: { onNewBlockAdded($0) }) 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/HourBlockIcon.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HourBlockIcon.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 06/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// The large material icon used on the right-hand side of Hour Block cards. 12 | struct HourBlockIcon: View { 13 | 14 | private let name: String 15 | 16 | /// Creates an instance of the HourBlockIcon view. 17 | /// 18 | /// - Parameters: 19 | /// - name: The name of the icon to be displayed. 20 | init(_ name: String) { 21 | self.name = name 22 | } 23 | 24 | var body: some View { 25 | Image(name) 26 | .resizable() 27 | .frame(width: 40, height: 40) 28 | .foregroundColor(Color(AppStrings.Colors.hourBlockIcon)) 29 | } 30 | } 31 | 32 | struct HourBlockIcon_Previews: PreviewProvider { 33 | static var previews: some View { 34 | HourBlockIcon("calendar") 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/NoHourBlocksView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NoHourBlocksView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 15/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view that displays the absence of any Hour Blocks. 12 | struct NoHourBlocksView: View { 13 | 14 | var body: some View { 15 | Card { 16 | HStack { 17 | CardLabels(title: AppStrings.Schedule.HourBlock.noHourBlocksTitle, 18 | subtitle: AppStrings.Schedule.HourBlock.noHourBlocksSubtitle, 19 | titleColor: Color(AppStrings.Colors.text), 20 | horizontalAlignment: .center) 21 | } 22 | }.padding(.horizontal, 24) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/NoSuggestionsBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NoSuggestionsBlockView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 16/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view that displays the absence of any suggested Hour Blocks. 12 | struct NoSuggestionsBlockView: View { 13 | 14 | var body: some View { 15 | Card { 16 | HStack { 17 | CardLabels(title: AppStrings.Schedule.HourBlock.noSuggestionsTitle, 18 | subtitle: AppStrings.Schedule.HourBlock.noSuggestionsSubtitle, 19 | titleColor: Color(AppStrings.Colors.text), 20 | horizontalAlignment: .center) 21 | } 22 | }.padding(.horizontal, 24) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /neon/View/Schedule/Hour Block/SuggestionBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SuggestionView.swift 3 | // Hour BlocksTests 4 | // 5 | // Created by James Saeed on 01/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view for displaying a suggested Hour Block. 12 | struct SuggestionBlockView: View { 13 | 14 | private let suggestion: Suggestion 15 | private let onSuggestionAdded: () -> Void 16 | 17 | /// Creates an instance of SuggestionBlockView. 18 | /// 19 | /// - Parameters: 20 | /// - suggestion: The suggestion to display. 21 | /// - onSuggestionAdded: The callback function to be triggered when the user chooses to add the suggested Hour Block. 22 | init(for suggestion: Suggestion, onSuggestionAdded: @escaping () -> Void) { 23 | self.suggestion = suggestion 24 | self.onSuggestionAdded = onSuggestionAdded 25 | } 26 | 27 | var body: some View { 28 | Card { 29 | HStack { 30 | CardLabels(title: suggestion.domain.suggestionTitle.smartCapitalization(), 31 | subtitle: suggestion.reason) 32 | Spacer() 33 | IconButton(iconName: AppStrings.Icons.add, 34 | iconWeight: .bold, 35 | action: onSuggestionAdded) 36 | } 37 | }.padding(.horizontal, 24) 38 | } 39 | } 40 | 41 | struct SuggestionView_Previews: PreviewProvider { 42 | static var previews: some View { 43 | SuggestionBlockView(for: Suggestion(domain: .baseball, reason: "popular", score: 0), 44 | onSuggestionAdded: {}) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /neon/View/Settings/PrivacyPolicyView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PrivacyPolicyView.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 12/11/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A view displaying a summary of the Hour Blocks privacy policy. 12 | struct PrivacyPolicyView: View { 13 | 14 | @Binding private var isPresented: Bool 15 | 16 | /// Creates an instance of PrivacyPolicyView. 17 | /// 18 | /// - Parameters: 19 | /// - isPresented: A binding determining whether or not the view is presented. 20 | init(isPresented: Binding) { 21 | self._isPresented = isPresented 22 | } 23 | 24 | var body: some View { 25 | NavigationView { 26 | VStack { 27 | VStack(alignment: .leading, spacing: 16) { 28 | TextBlockView(title: AppStrings.Settings.collectedDataPrivacyTitle, 29 | content: AppStrings.Settings.collectedDataPrivacyContent) 30 | } 31 | 32 | Spacer() 33 | 34 | ActionButton(AppStrings.Settings.viewFullPrivacyPolicyButton, action: viewFullPrivacyPolicy) 35 | }.padding(.vertical, 24) 36 | .padding(.horizontal, 32) 37 | .navigationBarTitle(AppStrings.Settings.privacyTitle) 38 | .toolbar { 39 | ToolbarItem(placement: .confirmationAction) { 40 | Button(AppStrings.Global.done, action: dismiss) 41 | } 42 | } 43 | }.accentColor(Color(AppStrings.Colors.accent)) 44 | } 45 | 46 | /// Opens the URL for the full privacy policy. 47 | private func viewFullPrivacyPolicy() { 48 | if let url = URL(string: AppStrings.Settings.fullPrivacyPolicyURL) { 49 | UIApplication.shared.open(url) 50 | } 51 | } 52 | 53 | /// Dismisses the current view. 54 | private func dismiss() { 55 | isPresented = false 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /neon/View/Settings/SettingsCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsCardView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 22/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view for displaying a Settings section. 12 | struct SettingsCardView: View { 13 | 14 | private let title: String 15 | private let subtitle: String 16 | private let iconName: String 17 | private let action: () -> Void 18 | 19 | /// Creates an instance of SettingsCardView. 20 | /// 21 | /// - Parameters: 22 | /// - title: The text string for the main label on the bottom. 23 | /// - subtitle: The text string for the secondary label at the top. 24 | /// - iconName: The SF Symbol name of the icon to be used as part of the Card's trailing IconButton. 25 | /// - action: The callback function to be triggered when the user has tapped on the Card's trailing IconButton. 26 | init(title: String, subtitle: String, iconName: String, action: @escaping () -> Void) { 27 | self.title = title 28 | self.subtitle = subtitle 29 | self.iconName = iconName 30 | self.action = action 31 | } 32 | 33 | var body: some View { 34 | Card { 35 | HStack { 36 | CardLabels(title: title, subtitle: subtitle) 37 | Spacer() 38 | IconButton(iconName: iconName, action: action) 39 | } 40 | }.padding(.horizontal, 24) 41 | } 42 | } 43 | 44 | struct SettingsCardView_Previews: PreviewProvider { 45 | static var previews: some View { 46 | SettingsCardView(title: "Calendars", subtitle: "Take control of", iconName: "calendar", action: {}) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /neon/View/Shared/ActionButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActionButton.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 17/11/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// The large coloured action button used sparingly throughout Hour Blocks. 12 | struct ActionButton: View { 13 | 14 | let title: String 15 | let action: () -> Void 16 | 17 | /// Creates an instance of the NeonTextField view. 18 | /// 19 | /// - Parameters: 20 | /// - text: A binding of the input text. 21 | /// - action: The callback function to be triggered when the user has tapped on the button. 22 | init(_ title: String, action: @escaping () -> Void) { 23 | self.title = title 24 | self.action = action 25 | } 26 | 27 | var body: some View { 28 | Button(action: action) { 29 | ZStack { 30 | RoundedRectangle(cornerRadius: 12) 31 | .foregroundColor(Color(AppStrings.Colors.accent)) 32 | .frame(height: 48) 33 | Text(title) 34 | .font(.system(size: 17, weight: .semibold, design: .default)) 35 | .foregroundColor(.white) 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /neon/View/Shared/Card.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CardView.swift 3 | // Created by James Saeed on 27/06/2020. 4 | // 5 | 6 | import SwiftUI 7 | 8 | /// The underlying 'Card' view used throughout the Hour Blocks UI. 9 | struct Card: View where Content: View { 10 | 11 | private let content: () -> Content 12 | private let padding: EdgeInsets 13 | 14 | /// Creates an instance of the Card view. 15 | /// 16 | /// - Parameters: 17 | /// - padding: The padding around the card's content. A default value is provided. 18 | /// - content: The view content to be rendered on top of the card. 19 | init(padding: EdgeInsets = EdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 32), @ViewBuilder content: @escaping () -> Content) { 20 | self.content = content 21 | self.padding = padding 22 | } 23 | 24 | var body: some View { 25 | ZStack { 26 | RoundedRectangle(cornerRadius: 16) 27 | .foregroundColor(Color(AppStrings.Colors.cardBacking)) 28 | .shadow(color: Color(AppStrings.Colors.cardShadow), radius: 6, x: 0, y: 3) 29 | content() 30 | .padding(padding) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /neon/View/Shared/CardsListView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CardsListView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 26/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A scrollable view to contain a list of Card based views. 12 | struct CardsListView: View where Content: View { 13 | 14 | private let content: () -> Content 15 | 16 | /// Creates an instance of the CardList view. 17 | /// 18 | /// - Parameters: 19 | /// - content: The Cards content to be rendered within the scrollable list view. 20 | init(@ViewBuilder content: @escaping () -> Content) { 21 | self.content = content 22 | } 23 | 24 | var body: some View { 25 | ScrollView(showsIndicators: false) { 26 | VStack(spacing: 24) { 27 | content() 28 | }.padding(.top, 8) 29 | .padding(.bottom, 24) 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /neon/View/Shared/HeaderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewHeaderView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 01/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// The double header view used at the top of root views within Hour Blocks. 12 | struct HeaderView: View where Content: View { 13 | 14 | private let title: String 15 | private let subtitle: String 16 | 17 | private let accessory: () -> Content 18 | 19 | /// Creates an instance of the Header view. 20 | /// 21 | /// - Parameters: 22 | /// - title: The text string for the main label on the bottom. 23 | /// - subtitle: The text string for the secondary label at the top. 24 | /// - accessory: Any header accessory views; usually an icon button. 25 | init(title: String, subtitle: String, @ViewBuilder accessory: @escaping () -> Content) { 26 | self.title = title 27 | self.subtitle = subtitle 28 | self.accessory = accessory 29 | } 30 | 31 | var body: some View { 32 | ZStack(alignment: .leading) { 33 | Rectangle() 34 | .foregroundColor(Color(AppStrings.Colors.background)) 35 | .frame(height: 96) 36 | HStack(spacing: 16) { 37 | VStack(alignment: .leading, spacing: 4) { 38 | Text(subtitle.uppercased()) 39 | .font(.system(size: 14, weight: .semibold, design: .default)) 40 | .opacity(0.5) 41 | Text(title) 42 | .font(.system(size: 28, weight: .bold, design: .default)) 43 | .lineLimit(1) 44 | } 45 | Spacer() 46 | accessory() 47 | }.padding(.leading, 32) 48 | .padding(.trailing, 56) 49 | .padding(.top, 16) 50 | } 51 | } 52 | } 53 | 54 | struct HeaderView_Previews: PreviewProvider { 55 | static var previews: some View { 56 | HeaderView(title: "Schedule", subtitle: "Sat 27 Jun") { 57 | IconButton(iconName: AppStrings.Icons.calendar, action: { print("test") }) 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /neon/View/Shared/NeonDivider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NeonDivider.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 06/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// An adaptation of the native SwiftUI Divider with Hour Blocks styling. Used to seperate groups of Card based views. 12 | struct NeonDivider: View { 13 | 14 | var body: some View { 15 | RoundedRectangle(cornerRadius: 1) 16 | .foregroundColor(Color(AppStrings.Colors.divider)) 17 | .frame(height: 2) 18 | } 19 | } 20 | 21 | struct NeonDivider_Previews: PreviewProvider { 22 | static var previews: some View { 23 | NeonDivider() 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /neon/View/Shared/NeonTextField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewNeonTextField.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 01/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A wrapper around the native SwiftUI TextField with Hour Blocks styling. Used for all text fields within Hour Blocks. 12 | struct NeonTextField: View { 13 | 14 | /// Environment variable identifying the current device colour scheme between dark or light mode. 15 | @Environment(\.colorScheme) var colorScheme 16 | 17 | @Binding private var text: String 18 | 19 | private let onReturn: () -> Void 20 | 21 | /// Creates an instance of the NeonTextField view. 22 | /// 23 | /// - Parameters: 24 | /// - text: A binding of the input text. 25 | /// - onReturn: The callback function to be triggered when the user hits the return key on the keyboard. By default this is set to be empty. 26 | init(text: Binding, onReturn: @escaping () -> Void = {}) { 27 | self._text = text 28 | self.onReturn = onReturn 29 | } 30 | 31 | var body: some View { 32 | ZStack() { 33 | Rectangle() 34 | .frame(height: 40) 35 | .foregroundColor(Color(AppStrings.Colors.accent).getLightColor(darkMode: colorScheme == .dark)) 36 | .cornerRadius(8) 37 | TextField(AppStrings.Global.textFieldPlaceholder, text: $text, onCommit: onReturn) 38 | .autocapitalization(.none) 39 | .font(.system(size: 17, weight: .medium, design: .default)) 40 | .foregroundColor(Color(AppStrings.Colors.text)) 41 | .padding(.horizontal, 16) 42 | } 43 | } 44 | } 45 | 46 | struct NeonTextField_Previews: PreviewProvider { 47 | static var previews: some View { 48 | NeonTextField(text: .constant("Lecture")) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /neon/View/Shared/TextBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextBlockView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 11/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A view that contains a title text view above a multiline content text view. 12 | struct TextBlockView: View { 13 | 14 | private let title: String 15 | private let content: String 16 | 17 | 18 | /// Creates an instance of TextBlockView. 19 | /// 20 | /// - Parameters: 21 | /// - title: The text string for the main label at the top. 22 | /// - content: The text string for the secondary content on the bottom. 23 | init(title: String, content: String) { 24 | self.title = title 25 | self.content = content 26 | } 27 | 28 | var body: some View { 29 | VStack(alignment: .leading, spacing: 4) { 30 | Text(title) 31 | .font(.system(size: 20, weight: .semibold, design: .rounded)) 32 | Text(content) 33 | .font(.system(size: 17, weight: .regular, design: .default)) 34 | } 35 | } 36 | } 37 | 38 | struct TextBlockView_Previews: PreviewProvider { 39 | static var previews: some View { 40 | TextBlockView(title: "Test", content: "Test") 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /neon/View/Shared/TipCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TipCardView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 14/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view for displaying a Tip. 12 | struct TipCardView: View { 13 | 14 | private let tip: Tip 15 | private let onDismiss: () -> Void 16 | 17 | /// Creates an instance of WhatsNewView. 18 | /// 19 | /// - Parameters: 20 | /// - tip: The instance of Tip to be displayed. 21 | /// - onDismiss: The callback function to be triggered when the user dismisses the tip card. 22 | init(for tip: Tip, onDismiss: @escaping () -> Void) { 23 | self.tip = tip 24 | self.onDismiss = onDismiss 25 | } 26 | 27 | var body: some View { 28 | Card { 29 | HStack { 30 | Text(tip.description) 31 | .font(.system(size: 20, weight: .semibold, design: .rounded)) 32 | .padding(.trailing, 16) 33 | .fixedSize(horizontal: false, vertical: true) 34 | Spacer() 35 | IconButton(iconName: AppStrings.Icons.checkmark, 36 | iconWeight: .semibold, 37 | iconColor: Color(AppStrings.Colors.confirmation), 38 | action: onDismiss) 39 | } 40 | }.padding(.horizontal, 24) 41 | } 42 | } 43 | 44 | struct TipCardView_Previews: PreviewProvider { 45 | static var previews: some View { 46 | TipCardView(for: .blockOptions, onDismiss: {}) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /neon/View/Shared/WhatsNewView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewView.swift 3 | // neon 4 | // 5 | // Created by James Saeed on 02/11/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A view displaying the changelog for the latest version of Hour Blocks. 12 | struct WhatsNewView: View { 13 | 14 | @Binding private var isPresented: Bool 15 | 16 | /// Creates an instance of WhatsNewView. 17 | /// 18 | /// - Parameters: 19 | /// - isPresented: A binding determining whether or not the view is presented. 20 | init(isPresented: Binding) { 21 | self._isPresented = isPresented 22 | } 23 | 24 | var body: some View { 25 | VStack { 26 | Text(AppStrings.WhatsNew.header) 27 | .font(.system(size: 34, weight: .bold, design: .default)) 28 | .multilineTextAlignment(.center) 29 | .padding(.top, 24) 30 | 31 | ScrollView { 32 | VStack(alignment: .leading, spacing: 20) { 33 | TextBlockView(title: "iCloud Sync ☁️", 34 | content: "Hour Blocks and To Do Items now sync across your iOS, iPadOS & macOS") 35 | TextBlockView(title: "To Do List History 🕖", 36 | content: "You can now view your completed To Do List items in one convenient sheet") 37 | TextBlockView(title: "Small Improvements ✨", 38 | content: "Native support for iPhone 12 & some minor UI tweaks in various places") 39 | } 40 | }.padding(.top, 24) 41 | 42 | ActionButton(AppStrings.WhatsNew.dismissButtonTitle, action: dismiss) 43 | }.padding(.vertical, 24) 44 | .padding(.horizontal, 32) 45 | } 46 | 47 | /// Dismisses the current view. 48 | private func dismiss() { 49 | HapticsGateway.shared.triggerLightImpact() 50 | isPresented = false 51 | } 52 | } 53 | 54 | struct WhatsNewView_Previews: PreviewProvider { 55 | static var previews: some View { 56 | WhatsNewView(isPresented: .constant(true)) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /neon/View/To Do List/CompletedToDoItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CompletedToDoItemView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Litchfield on 23/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// A Card based view for displaying a Completed To Do Item. 12 | struct CompletedToDoItemView: View { 13 | 14 | @ObservedObject private var viewModel: ToDoItemViewModel 15 | 16 | /// Creates an instance of ToDoItemView. 17 | /// 18 | /// - Parameters: 19 | /// - viewModel: The corresponding view model for the given To Do item. 20 | init(viewModel: ToDoItemViewModel) { 21 | self.viewModel = viewModel 22 | } 23 | 24 | var body: some View { 25 | Card { 26 | CardLabels(title: viewModel.getTitle(), 27 | subtitle: viewModel.toDoItem.completionDate?.getFormattedDate() ?? "N/A", 28 | horizontalAlignment: .center) 29 | }.padding(.horizontal, 24) 30 | 31 | .contextMenu(ContextMenu(menuItems: { 32 | Button(action: viewModel.markAsIncomplete) { 33 | Label(AppStrings.ToDoList.ToDoItem.menuIncomplete, systemImage: AppStrings.Icons.undo) 34 | } 35 | })) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /neon/View/To Do List/ToDoListHistoryView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoListHistoryView.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Litchfield on 23/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | /// The view of the To Do List History. 12 | struct ToDoListHistoryView: View { 13 | 14 | @Binding var isPresented: Bool 15 | @StateObject var viewModel = ToDoListHistoryViewModel() 16 | 17 | var body: some View { 18 | NavigationView{ 19 | CardsListView { 20 | ForEach(viewModel.completedToDoItems) { completedToDoItemViewModel in 21 | CompletedToDoItemView(viewModel: completedToDoItemViewModel) 22 | } 23 | }.navigationTitle(AppStrings.ToDoList.historyHeader) 24 | 25 | .toolbar { 26 | ToolbarItem(placement: .confirmationAction) { 27 | Button(AppStrings.Global.done, action: dismiss) 28 | } 29 | } 30 | }.accentColor(Color(AppStrings.Colors.accent)) 31 | .onReceive(AppPublishers.refreshToDoListPublisher) { _ in viewModel.loadCompletedToDoItems() } 32 | } 33 | 34 | /// Dismisses the current view. 35 | func dismiss() { 36 | isPresented = false 37 | } 38 | 39 | struct ToDoListHistoryView_Previews: PreviewProvider { 40 | static var previews: some View { 41 | ToDoListHistoryView(isPresented: .constant(true)) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /neon/ViewModel/Schedule/Sheets/ScheduleDatePickerViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScheduleDatePickerViewModel.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 27/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import EventKit 11 | 12 | /// The view model for the ScheduleDatePickerView. 13 | class ScheduleDatePickerViewModel: ObservableObject { 14 | 15 | private let dataGateway: DataGateway 16 | private let calendarGateway: CalendarGatewayProtocol 17 | 18 | @Published var selectedDate: Date 19 | @Published private(set) var hourBlocks = [HourBlockViewModel]() 20 | @Published private(set) var calendarBlocks = [EKEvent]() 21 | 22 | /// Creates an instance of the ScheduleDatePickerViewModel. 23 | /// 24 | /// - Parameters: 25 | /// - dataGateway: The data gateway instance used to interface with Core Data. By default, this is set to an instance of DataGateway. 26 | /// - calendarGateway: The calendar gateway instance used to interface with EventKit. By default, this is set to an instance of CalendarGateway. 27 | /// - initialSelectedDate: The current date of the schedule; set as the initially selected date within the date picker. 28 | init(dataGateway: DataGateway = DataGateway(), calendarGateway: CalendarGatewayProtocol = CalendarGateway(), initialSelectedDate: Date) { 29 | self.dataGateway = dataGateway 30 | self.calendarGateway = calendarGateway 31 | self.selectedDate = initialSelectedDate 32 | } 33 | 34 | /// Loads the selected day's hour blocks and calendar blocks. 35 | func loadHourBlocks() { 36 | hourBlocks = dataGateway.getHourBlocks(for: selectedDate) 37 | .sorted(by: { $0.hour < $1.hour }) 38 | .map { HourBlockViewModel(for: $0) } 39 | 40 | calendarBlocks = calendarGateway.getEvents(for: selectedDate) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /neon/ViewModel/Settings/SettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewSettingsViewModel.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 22/07/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | /// The view model for the SettingsView. 13 | class SettingsViewModel: ObservableObject { 14 | 15 | @Published var isCalendarSettingsViewPresented = false 16 | @Published var isOtherSettingsViewPresented = false 17 | @Published var isPrivacyPolicyViewPresented = false 18 | @Published var isAcknowledgementsViewPresented = false 19 | 20 | /// Creates an instance of the SettingsViewModel. 21 | init() { } 22 | 23 | /// Presents the CalendarSettingsView. 24 | func presentCalendarSettingsView() { 25 | HapticsGateway.shared.triggerLightImpact() 26 | isCalendarSettingsViewPresented = true 27 | } 28 | 29 | /// Presents the OtherSettingsView. 30 | func presentOtherSettingsView() { 31 | HapticsGateway.shared.triggerLightImpact() 32 | isOtherSettingsViewPresented = true 33 | } 34 | 35 | /// Presents the PrivacyPolicyView. 36 | func presentPrivacyPolicyView() { 37 | HapticsGateway.shared.triggerLightImpact() 38 | isPrivacyPolicyViewPresented = true 39 | } 40 | 41 | /// Presents the AcknowledgementsView. 42 | func presentAcknowledgementsView() { 43 | HapticsGateway.shared.triggerLightImpact() 44 | isAcknowledgementsViewPresented = true 45 | } 46 | 47 | /// Opens a web link to James' Twitter profile. 48 | func openTwitter() { 49 | if let url = URL(string: "https://twitter.com/j_t_saeed") { 50 | UIApplication.shared.open(url) 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /neon/ViewModel/To Do List/ToDoListHistoryViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoListHistoryViewModel.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Litchfield on 23/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import WidgetKit 11 | 12 | /// The view model for the ToDoListHistoryView. 13 | class ToDoListHistoryViewModel: ObservableObject { 14 | 15 | private let dataGateway: DataGateway 16 | 17 | @Published var completedToDoItems: [ToDoItemViewModel] = [] 18 | 19 | /// Creates an instance of the ToDoListHistoryViewModel and then loads the user's To Do items. 20 | /// 21 | /// - Parameters: 22 | /// - dataGateway: The data gateway instance used to interface with Core Data. By default, this is set to an instance of DataGateway. 23 | init(dataGateway: DataGateway = DataGateway()) { 24 | self.dataGateway = dataGateway 25 | 26 | loadCompletedToDoItems() 27 | } 28 | 29 | /// Loads the user's completed To Do items from the Core Data store. 30 | func loadCompletedToDoItems() { 31 | completedToDoItems = dataGateway.getCompletedToDoItems().map { ToDoItemViewModel(for: $0) } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /neon/neon.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.icloud-container-identifiers 8 | 9 | iCloud.com.evh98.neon 10 | 11 | com.apple.developer.icloud-services 12 | 13 | CloudKit 14 | 15 | com.apple.developer.siri 16 | 17 | com.apple.security.app-sandbox 18 | 19 | com.apple.security.application-groups 20 | 21 | group.com.evh98.neon 22 | 23 | com.apple.security.network.client 24 | 25 | com.apple.security.personal-information.calendars 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /neon/neon.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | neon.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /neon/notification.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtsaeed/Hour-Blocks/79a18ba24bb5a005d9e54ff4a1071265a9ec5152/neon/notification.aif -------------------------------------------------------------------------------- /neonTests/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 | -------------------------------------------------------------------------------- /neonTests/Schedule/ScheduleDatePickerTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScheduleDatePickerTests.swift 3 | // Hour BlocksTests 4 | // 5 | // Created by James Saeed on 12/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CoreData 11 | @testable import Hour_Blocks 12 | 13 | class ScheduleDatePickerTests: XCTestCase { 14 | 15 | let date = Date(year: 2020, month: 08, day: 02, hour: 13, minute: 0) 16 | 17 | var dataGateway: DataGateway! 18 | var viewModel: ScheduleDatePickerViewModel! 19 | 20 | override func setUpWithError() throws { 21 | dataGateway = DataGateway(for: mockPersistantContainer.viewContext) 22 | viewModel = ScheduleDatePickerViewModel(dataGateway: dataGateway, 23 | calendarGateway: MockCalendarGateway(), 24 | initialSelectedDate: date) 25 | } 26 | 27 | override func tearDownWithError() throws { } 28 | 29 | func testLoadHourBlocks() { 30 | dataGateway.save(hourBlock: HourBlock(day: date, hour: 15, title: "Gym")) 31 | 32 | viewModel.loadHourBlocks() 33 | 34 | XCTAssertEqual(self.viewModel.hourBlocks[0].getTitle(), "Gym") 35 | } 36 | 37 | lazy var mockPersistantContainer: NSPersistentContainer = { 38 | let container = NSPersistentContainer(name: "neon") 39 | let description = NSPersistentStoreDescription() 40 | description.type = NSInMemoryStoreType 41 | description.shouldAddStoreAsynchronously = false // Make it simpler in test env 42 | 43 | container.persistentStoreDescriptions = [description] 44 | container.loadPersistentStores { (description, error) in 45 | // Check if the data store is in memory 46 | precondition( description.type == NSInMemoryStoreType ) 47 | 48 | // Check if creating container wrong 49 | if let error = error { 50 | fatalError("Create an in-mem coordinator failed \(error)") 51 | } 52 | } 53 | return container 54 | }() 55 | } 56 | -------------------------------------------------------------------------------- /neonTests/Service/MockAnalyticsGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockAnalyticsGateway.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 12/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct MockAnalyticsGateway: AnalyticsGatewayProtocol { 12 | 13 | func log(hourBlock: HourBlock) { } 14 | 15 | func log(suggestion: Suggestion) { } 16 | 17 | func logToDoItem() { } 18 | } 19 | -------------------------------------------------------------------------------- /neonTests/Service/MockCalendarGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockCalendarGateway.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 12/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import EventKit 11 | 12 | struct MockCalendarGateway: CalendarGatewayProtocol { 13 | 14 | func hasPermission() -> Bool { 15 | return false 16 | } 17 | 18 | func requestPermissions(completion: @escaping (_ granted: Bool) -> Void) { 19 | completion(true) 20 | } 21 | 22 | func getEvents(for date: Date) -> [EKEvent] { 23 | return [EKEvent]() 24 | } 25 | 26 | func initialiseEnabledCalendars() -> [String : Bool] { 27 | return [String: Bool]() 28 | } 29 | 30 | func getAllCalendars() -> [EKCalendar] { 31 | return [EKCalendar]() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /neonTests/Service/MockRemindersGateway.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockRemindersGateway.swift 3 | // Hour Blocks 4 | // 5 | // Created by James Saeed on 12/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct MockRemindersGateway: RemindersGatewayProtocol { 12 | 13 | func setReminder(for hourBlock: HourBlock, with title: String) { } 14 | 15 | func removeReminder(for hourBlock: HourBlock) { } 16 | 17 | func editReminder(for hourBlock: HourBlock, with title: String) { } 18 | } 19 | -------------------------------------------------------------------------------- /neonTests/To Do List/ToDoItemTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoItemTests.swift 3 | // Hour BlocksTests 4 | // 5 | // Created by James Saeed on 12/08/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CoreData 11 | @testable import Hour_Blocks 12 | 13 | class ToDoItemTests: XCTestCase { 14 | 15 | var dataGateway: DataGateway! 16 | var viewModel: ToDoItemViewModel! 17 | 18 | override func setUpWithError() throws { 19 | dataGateway = DataGateway(for: mockPersistantContainer.viewContext) 20 | 21 | let toDoItem = ToDoItem(title: "Book meeting room", urgency: .soon) 22 | dataGateway.save(toDoItem: toDoItem) 23 | 24 | viewModel = ToDoItemViewModel(for: toDoItem) 25 | } 26 | 27 | override func tearDownWithError() throws { } 28 | 29 | func testSaveTitleChanges() { 30 | viewModel.saveChanges(newTitle: "new", newUrgency: .soon) 31 | 32 | XCTAssertEqual(self.viewModel.getTitle(), "New") 33 | } 34 | 35 | func testSavePriorityChanges() { 36 | viewModel.saveChanges(newTitle: viewModel.getTitle(), newUrgency: .urgent) 37 | 38 | XCTAssertEqual(self.viewModel.urgency, .urgent) 39 | } 40 | 41 | lazy var mockPersistantContainer: NSPersistentContainer = { 42 | let container = NSPersistentContainer(name: "neon") 43 | let description = NSPersistentStoreDescription() 44 | description.type = NSInMemoryStoreType 45 | description.shouldAddStoreAsynchronously = false // Make it simpler in test env 46 | 47 | container.persistentStoreDescriptions = [description] 48 | container.loadPersistentStores { (description, error) in 49 | // Check if the data store is in memory 50 | precondition( description.type == NSInMemoryStoreType ) 51 | 52 | // Check if creating container wrong 53 | if let error = error { 54 | fatalError("Create an in-mem coordinator failed \(error)") 55 | } 56 | } 57 | return container 58 | }() 59 | } 60 | -------------------------------------------------------------------------------- /neonTests/To Do List/ToDoListHistoryTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToDoListHistoryTest.swift 3 | // Hour BlocksTests 4 | // 5 | // Created by James Litchfield on 23/10/2020. 6 | // Copyright © 2020 James Saeed. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CoreData 11 | @testable import Hour_Blocks 12 | 13 | class ToDoListHistoryTests: XCTestCase { 14 | 15 | var dataGateway: DataGateway! 16 | var viewModel: ToDoListHistoryViewModel! 17 | 18 | override func setUpWithError() throws { 19 | dataGateway = DataGateway(for: mockPersistantContainer.viewContext) 20 | viewModel = ToDoListHistoryViewModel(dataGateway: dataGateway) 21 | } 22 | 23 | override func tearDownWithError() throws { } 24 | 25 | func testLoadCompletedToDoItems() { 26 | let item1 = ToDoItem(title: "Clean", urgency: ToDoUrgency.urgent) 27 | let item2 = ToDoItem(title: "Eat", urgency: ToDoUrgency.whenever) 28 | dataGateway.save(toDoItem: item1) 29 | dataGateway.save(toDoItem: item2) 30 | dataGateway.edit(toDoItem: item1, set: true, forKey: "completed") 31 | dataGateway.edit(toDoItem: item2, set: Date(), forKey: "completionDate") 32 | 33 | viewModel.loadCompletedToDoItems() 34 | 35 | XCTAssertEqual(self.viewModel.completedToDoItems.count, 1) 36 | } 37 | 38 | lazy var mockPersistantContainer: NSPersistentContainer = { 39 | let container = NSPersistentContainer(name: "neon") 40 | let description = NSPersistentStoreDescription() 41 | description.type = NSInMemoryStoreType 42 | description.shouldAddStoreAsynchronously = false // Make it simpler in test env 43 | 44 | container.persistentStoreDescriptions = [description] 45 | container.loadPersistentStores { (description, error) in 46 | // Check if the data store is in memory 47 | precondition( description.type == NSInMemoryStoreType ) 48 | 49 | // Check if creating container wrong 50 | if let error = error { 51 | fatalError("Create an in-mem coordinator failed \(error)") 52 | } 53 | } 54 | return container 55 | }() 56 | } 57 | -------------------------------------------------------------------------------- /neonUITests/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 | -------------------------------------------------------------------------------- /neonUITests/neonUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // neonUITests.swift 3 | // neonUITests 4 | // 5 | // Created by James Saeed on 06/02/2019. 6 | // Copyright © 2019 James Saeed. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class neonUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | 16 | // In UI tests it is usually best to stop immediately when a failure occurs. 17 | continueAfterFailure = false 18 | 19 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 20 | XCUIApplication().launch() 21 | 22 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 23 | } 24 | 25 | override func tearDown() { 26 | // Put teardown code here. This method is called after the invocation of each test method in the class. 27 | } 28 | 29 | func testExample() { 30 | // Use recording to get started writing UI tests. 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | } 35 | --------------------------------------------------------------------------------