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