The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .codecov.yml
├── .editorconfig
├── .github
    ├── CODEOWNERS
    ├── FUNDING.yml
    ├── auto_assign.yml
    ├── issue_template.md
    ├── main.workflow
    ├── stale.yml
    └── workflows
    │   ├── build.yml
    │   ├── rebase.yml
    │   ├── swiftlint.yml
    │   └── test.yml
├── .gitignore
├── .jazzy.yaml
├── .makefiles
    ├── bundler.mk
    ├── docker-compose.mk
    ├── help.awk
    ├── ios.mk
    ├── ludicrous.mk
    └── virtualenv.mk
├── .swiftlint.yml
├── .travis.yml
├── CHANGELOG.md
├── DEVELOP.md
├── Dangerfile
├── Examples
    ├── AppStoreCardExample.swift
    ├── BuiltInTransitionExample.swift
    ├── ExampleBaseViewController.swift
    ├── MainViewController.swift
    ├── MatchExample.swift
    ├── MatchInCollectionExample.swift
    ├── Resources
    │   ├── AppDelegate.swift
    │   ├── Assets.xcassets
    │   │   ├── App Icon & Top Shelf Image.brandassets
    │   │   │   ├── App Icon - Large.imagestack
    │   │   │   │   ├── Back.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │   │   ├── Back@large.png
    │   │   │   │   │   │   └── Contents.json
    │   │   │   │   │   └── Contents.json
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── Front.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │   │   ├── Contents.json
    │   │   │   │   │   │   └── Front@large.png
    │   │   │   │   │   └── Contents.json
    │   │   │   │   └── Middle.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │       ├── Contents.json
    │   │   │   │   │       └── Middle@large.png
    │   │   │   │   │   └── Contents.json
    │   │   │   ├── App Icon - Small.imagestack
    │   │   │   │   ├── Back.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │   │   ├── Back.png
    │   │   │   │   │   │   └── Contents.json
    │   │   │   │   │   └── Contents.json
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── Front.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │   │   ├── Contents.json
    │   │   │   │   │   │   └── Front.png
    │   │   │   │   │   └── Contents.json
    │   │   │   │   └── Middle.imagestacklayer
    │   │   │   │   │   ├── Content.imageset
    │   │   │   │   │       ├── Contents.json
    │   │   │   │   │       └── Middle.png
    │   │   │   │   │   └── Contents.json
    │   │   │   ├── Contents.json
    │   │   │   ├── Top Shelf Image Wide.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Top Shelf Image Wide.png
    │   │   │   └── Top Shelf Image.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Top Shelf Image.png
    │   │   ├── AppIcon.appiconset
    │   │   │   ├── Contents.json
    │   │   │   ├── Icon-1024.png
    │   │   │   ├── Icon-20.png
    │   │   │   ├── Icon-20@2x-1.png
    │   │   │   ├── Icon-20@2x.png
    │   │   │   ├── Icon-20@3x.png
    │   │   │   ├── Icon-29.png
    │   │   │   ├── Icon-29@2x-1.png
    │   │   │   ├── Icon-29@2x.png
    │   │   │   ├── Icon-29@3x.png
    │   │   │   ├── Icon-40.png
    │   │   │   ├── Icon-40@2x-1.png
    │   │   │   ├── Icon-40@2x.png
    │   │   │   ├── Icon-40@3x.png
    │   │   │   ├── Icon-60@2x.png
    │   │   │   ├── Icon-60@3x.png
    │   │   │   ├── Icon-76.png
    │   │   │   ├── Icon-76@2x.png
    │   │   │   └── Icon-83.5@2x.png
    │   │   ├── AppleHomePage
    │   │   │   ├── Contents.json
    │   │   │   ├── iphone_alt_small_2x.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── iphone_alt_small_2x.jpg
    │   │   │   ├── macbookpro_portrait_small_2x.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── macbookpro_portrait_small_2x.jpg
    │   │   │   └── watch_alt_portrait_small_2x.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── watch_alt_portrait_small_2x.jpg
    │   │   ├── CityGuide
    │   │   │   ├── Contents.json
    │   │   │   ├── cityGuide.imageset
    │   │   │   │   ├── 316f8e75.jpeg
    │   │   │   │   └── Contents.json
    │   │   │   ├── montreal.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── photo-1419041082630-1e98debd0a6a.jpeg
    │   │   │   ├── toronto.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── photo-1437147921639-ef00e030265a.jpeg
    │   │   │   └── vancouver.imageset
    │   │   │   │   ├── 316f8e75.jpeg
    │   │   │   │   └── Contents.json
    │   │   ├── Contents.json
    │   │   ├── Foods
    │   │   │   ├── Contents.json
    │   │   │   ├── Unsplash0.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash0.png
    │   │   │   ├── Unsplash0_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash0_cell.png
    │   │   │   ├── Unsplash0_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash0_thumb.png
    │   │   │   ├── Unsplash1.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash1.png
    │   │   │   ├── Unsplash10.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash10.jpg
    │   │   │   ├── Unsplash10_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash10_cell.jpg
    │   │   │   ├── Unsplash10_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash10_thumb.jpg
    │   │   │   ├── Unsplash1_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash1_cell.png
    │   │   │   ├── Unsplash1_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash1_thumb.png
    │   │   │   ├── Unsplash2.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash2.png
    │   │   │   ├── Unsplash2_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash2_cell.png
    │   │   │   ├── Unsplash2_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash2_thumb.png
    │   │   │   ├── Unsplash3.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash3.png
    │   │   │   ├── Unsplash3_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash3_cell.png
    │   │   │   ├── Unsplash3_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash3_thumb.png
    │   │   │   ├── Unsplash4.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash4.png
    │   │   │   ├── Unsplash4_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash4_cell.png
    │   │   │   ├── Unsplash4_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash4_thumb.png
    │   │   │   ├── Unsplash5.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash5.png
    │   │   │   ├── Unsplash5_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash5_cell.png
    │   │   │   ├── Unsplash5_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash5_thumb.png
    │   │   │   ├── Unsplash6.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash6.png
    │   │   │   ├── Unsplash6_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash6_cell.png
    │   │   │   ├── Unsplash6_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash6_thumb.png
    │   │   │   ├── Unsplash7.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash7.png
    │   │   │   ├── Unsplash7_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash7_cell.png
    │   │   │   ├── Unsplash7_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash7_thumb.png
    │   │   │   ├── Unsplash8.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash8.png
    │   │   │   ├── Unsplash8_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash8_cell.png
    │   │   │   ├── Unsplash8_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash8_thumb.png
    │   │   │   ├── Unsplash9.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash9.png
    │   │   │   ├── Unsplash9_cell.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash9_cell.png
    │   │   │   └── Unsplash9_thumb.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── Unsplash9_thumb.png
    │   │   ├── HeroLogo.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── HeroLogo.png
    │   │   │   ├── HeroLogo@2x.png
    │   │   │   └── HeroLogo@3x.png
    │   │   ├── Menu
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_audiotrack_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_audiotrack_48pt.png
    │   │   │   │   ├── ic_audiotrack_48pt_2x.png
    │   │   │   │   └── ic_audiotrack_48pt_3x.png
    │   │   │   ├── ic_chat_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_chat_48pt.png
    │   │   │   │   ├── ic_chat_48pt_2x.png
    │   │   │   │   └── ic_chat_48pt_3x.png
    │   │   │   ├── ic_format_quote_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_format_quote_48pt.png
    │   │   │   │   ├── ic_format_quote_48pt_2x.png
    │   │   │   │   └── ic_format_quote_48pt_3x.png
    │   │   │   ├── ic_gif_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_gif_48pt.png
    │   │   │   │   ├── ic_gif_48pt_2x.png
    │   │   │   │   └── ic_gif_48pt_3x.png
    │   │   │   ├── ic_insert_photo_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_insert_photo_48pt.png
    │   │   │   │   ├── ic_insert_photo_48pt_2x.png
    │   │   │   │   └── ic_insert_photo_48pt_3x.png
    │   │   │   ├── ic_link_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_link_48pt.png
    │   │   │   │   ├── ic_link_48pt_2x.png
    │   │   │   │   └── ic_link_48pt_3x.png
    │   │   │   ├── ic_menu_36pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_menu_36pt.png
    │   │   │   │   ├── ic_menu_36pt_2x.png
    │   │   │   │   └── ic_menu_36pt_3x.png
    │   │   │   ├── ic_menu_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_menu_48pt.png
    │   │   │   │   ├── ic_menu_48pt_2x.png
    │   │   │   │   └── ic_menu_48pt_3x.png
    │   │   │   ├── ic_text_fields_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_text_fields_48pt.png
    │   │   │   │   ├── ic_text_fields_48pt_2x.png
    │   │   │   │   └── ic_text_fields_48pt_3x.png
    │   │   │   └── ic_videocam_48pt.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_videocam_48pt.png
    │   │   │   │   ├── ic_videocam_48pt_2x.png
    │   │   │   │   └── ic_videocam_48pt_3x.png
    │   │   ├── MusicPlayer
    │   │   │   ├── Contents.json
    │   │   │   ├── album1.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   └── computergraphics-album-covers-2014-3.jpg
    │   │   │   ├── ic_fast_forward.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_fast_forward.png
    │   │   │   │   ├── ic_fast_forward_2x.png
    │   │   │   │   └── ic_fast_forward_3x.png
    │   │   │   ├── ic_fast_rewind.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_fast_rewind.png
    │   │   │   │   ├── ic_fast_rewind_2x.png
    │   │   │   │   └── ic_fast_rewind_3x.png
    │   │   │   ├── ic_pause_white.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_pause_white.png
    │   │   │   │   ├── ic_pause_white_2x.png
    │   │   │   │   └── ic_pause_white_3x.png
    │   │   │   ├── ic_play_arrow_white.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_play_arrow_white.png
    │   │   │   │   ├── ic_play_arrow_white_2x.png
    │   │   │   │   └── ic_play_arrow_white_3x.png
    │   │   │   ├── ic_repeat.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_repeat.png
    │   │   │   │   ├── ic_repeat_2x.png
    │   │   │   │   └── ic_repeat_3x.png
    │   │   │   └── ic_shuffle.imageset
    │   │   │   │   ├── Contents.json
    │   │   │   │   ├── ic_shuffle.png
    │   │   │   │   ├── ic_shuffle_2x.png
    │   │   │   │   └── ic_shuffle_3x.png
    │   │   ├── bigbuckbunny.imageset
    │   │   │   ├── Contents.json
    │   │   │   └── poster.jpg
    │   │   ├── ic_bug_report_48pt.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_bug_report_48pt.png
    │   │   │   ├── ic_bug_report_48pt_2x.png
    │   │   │   └── ic_bug_report_48pt_3x.png
    │   │   ├── ic_close.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_close.png
    │   │   │   ├── ic_close_2x.png
    │   │   │   └── ic_close_3x.png
    │   │   ├── ic_code.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_code.png
    │   │   │   ├── ic_code_2x.png
    │   │   │   └── ic_code_3x.png
    │   │   ├── ic_input_48pt.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_input_48pt.png
    │   │   │   ├── ic_input_48pt_2x.png
    │   │   │   └── ic_input_48pt_3x.png
    │   │   ├── ic_keyboard_arrow_down.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_keyboard_arrow_down.png
    │   │   │   ├── ic_keyboard_arrow_down_2x.png
    │   │   │   └── ic_keyboard_arrow_down_3x.png
    │   │   ├── ic_view_list.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_view_list.png
    │   │   │   ├── ic_view_list_2x.png
    │   │   │   └── ic_view_list_3x.png
    │   │   └── ic_view_module.imageset
    │   │   │   ├── Contents.json
    │   │   │   ├── ic_view_module.png
    │   │   │   ├── ic_view_module_2x.png
    │   │   │   └── ic_view_module_3x.png
    │   ├── Base.lproj
    │   │   └── LaunchScreen.storyboard
    │   ├── Info.plist
    │   └── UIKit+HeroExamples.swift
    └── SwiftUIMatchExample.swift
├── Gemfile
├── Gemfile.lock
├── Hero.podspec
├── Hero.xcodeproj
    ├── project.pbxproj
    ├── project.xcworkspace
    │   ├── contents.xcworkspacedata
    │   └── xcshareddata
    │   │   └── IDEWorkspaceChecks.plist
    └── xcshareddata
    │   └── xcschemes
    │       ├── Hero (tvOS).xcscheme
    │       ├── Hero.xcscheme
    │       └── HeroExamples.xcscheme
├── Hero.xcworkspace
    ├── contents.xcworkspacedata
    └── xcshareddata
    │   ├── IDEWorkspaceChecks.plist
    │   └── WorkspaceSettings.xcsettings
├── LICENSE
├── LegacyExamples
    ├── Base.lproj
    │   └── Main.storyboard
    ├── Examples
    │   ├── AppleHomePage
    │   │   ├── AppleHomePage.storyboard
    │   │   └── AppleProductViewController.swift
    │   ├── Basic.storyboard
    │   ├── BuiltInTransition
    │   │   ├── AnimationSelectTableViewController.swift
    │   │   └── BuiltInTransitions.storyboard
    │   ├── CityGuide
    │   │   ├── City.swift
    │   │   ├── CityGuide.storyboard
    │   │   ├── CityGuideCell.swift
    │   │   ├── CityGuideViewController.swift
    │   │   └── CityViewController.swift
    │   ├── ImageGallery
    │   │   ├── ImageCells.swift
    │   │   ├── ImageGallery.storyboard
    │   │   ├── ImageGalleryCollectionViewController.swift
    │   │   ├── ImageLibrary.swift
    │   │   ├── ImageViewController.swift
    │   │   └── ImageViewer.storyboard
    │   ├── ListToGrid
    │   │   ├── GridCollectionViewController.swift
    │   │   ├── ListTableViewController.swift
    │   │   └── ListToGrid.storyboard
    │   ├── Menu
    │   │   ├── Menu.storyboard
    │   │   └── MenuViewController.swift
    │   ├── MusicPlayer.storyboard
    │   ├── Navigation
    │   │   ├── FirstViewController.swift
    │   │   └── Navigation.storyboard
    │   └── VideoPlayer
    │   │   ├── VideoPlayer.storyboard
    │   │   └── VideoPlayerViewController.swift
    ├── LegacyExampleViewController.swift
    ├── PluginViewController.swift
    └── en.lproj
    │   └── Main.strings
├── Makefile
├── Mintfile
├── Package.md
├── Package.swift
├── PackageModules.dot
├── Podfile
├── Podfile.lock
├── README.md
├── README.zh-cn.md
├── Resources
    ├── Hero.png
    ├── Hero.svg
    ├── HeroAnimated.svg
    ├── ViewController.png
    ├── ViewController@2x.png
    ├── advanced.svg
    ├── defaultAnimations.svg
    ├── defaultAnimations2.svg
    ├── features.svg
    ├── features2.svg
    ├── globalCoordinate.svg
    ├── headerDoc.png
    ├── localCoordinate.svg
    ├── simple.svg
    ├── storyboardView.png
    └── storyboardViewController.png
├── Sources
    ├── Animator
    │   ├── HeroAnimatorViewContext.swift
    │   ├── HeroCoreAnimationViewContext.swift
    │   ├── HeroDefaultAnimator.swift
    │   └── HeroViewPropertyViewContext.swift
    ├── Debug Plugin
    │   ├── HeroDebugPlugin.swift
    │   └── HeroDebugView.swift
    ├── Extensions
    │   ├── Array+HeroModifier.swift
    │   ├── CALayer+Hero.swift
    │   ├── CAMediaTimingFunction+Hero.swift
    │   ├── CG+Hero.swift
    │   ├── DispatchQueue+Hero.swift
    │   ├── Locale+Hero.swift
    │   ├── UIColor+HexString.swift
    │   ├── UIKit+Hero.swift
    │   ├── UIView+Hero.swift
    │   └── UIViewController+Hero.swift
    ├── Hero.h
    ├── HeroCompatible.swift
    ├── HeroContext.swift
    ├── HeroModifier+Advanced.swift
    ├── HeroModifier+HeroStringConvertible.swift
    ├── HeroModifier.swift
    ├── HeroPlugin.swift
    ├── HeroTargetState.swift
    ├── HeroTypes.swift
    ├── HeroViewControllerDelegate.swift
    ├── Info.plist
    ├── Parser
    │   ├── HeroStringConvertible.swift
    │   ├── Lexer.swift
    │   ├── Nodes.swift
    │   ├── Parser.swift
    │   └── Regex.swift
    ├── Preprocessors
    │   ├── BasePreprocessor.swift
    │   ├── CascadePreprocessor.swift
    │   ├── ConditionalPreprocessor.swift
    │   ├── DefaultAnimationPreprocessor.swift
    │   ├── IgnoreSubviewModifiersPreprocessor.swift
    │   ├── MatchPreprocessor.swift
    │   └── SourcePreprocessor.swift
    ├── SwiftSupport.swift
    └── Transition
    │   ├── HeroProgressRunner.swift
    │   ├── HeroTransition+Animate.swift
    │   ├── HeroTransition+Complete.swift
    │   ├── HeroTransition+CustomTransition.swift
    │   ├── HeroTransition+Interactive.swift
    │   ├── HeroTransition+Start.swift
    │   ├── HeroTransition+UINavigationControllerDelegate.swift
    │   ├── HeroTransition+UITabBarControllerDelegate.swift
    │   ├── HeroTransition+UIViewControllerTransitioningDelegate.swift
    │   ├── HeroTransition.swift
    │   └── HeroTransitionState.swift
├── Tests
    ├── HeroTests.swift
    └── Info.plist
├── TvOSExamples
    ├── AppDelegate.swift
    ├── Base.lproj
    │   └── Main.storyboard
    ├── Basic.storyboard
    ├── ImageGallery.storyboard
    ├── ImageViewer.storyboard
    ├── Info.plist
    └── TVImageGalleryViewController.swift
├── book.json
└── docs
    ├── Classes.html
    ├── Classes
        ├── BinaryOpNode.html
        ├── CallNode.html
        ├── ExprNode.html
        ├── FunctionNode.html
        ├── Hero.html
        ├── HeroContext.html
        ├── HeroDebugPlugin.html
        ├── HeroExtension.html
        ├── HeroModifier.html
        ├── HeroPlugin.html
        ├── HeroTransition.html
        ├── Lexer.html
        ├── NumberNode.html
        ├── Parser.html
        ├── PrototypeNode.html
        └── VariableNode.html
    ├── Enums.html
    ├── Enums
        ├── CascadeDirection.html
        ├── HeroCoordinateSpace.html
        ├── HeroDefaultAnimationType.html
        ├── HeroDefaultAnimationType
        │   ├── Direction.html
        │   └── Strategy.html
        ├── HeroSnapshotType.html
        ├── HeroTransitionState.html
        ├── HeroViewOrderingStrategy.html
        ├── ParseError.html
        └── Token.html
    ├── Extensions.html
    ├── Extensions
        ├── CAMediaTimingFunction.html
        ├── CATransform3D.html
        ├── HeroDebugView.html
        ├── String.html
        ├── UINavigationController.html
        ├── UITabBarController.html
        ├── UIView.html
        └── UIViewController.html
    ├── Functions.html
    ├── Protocols.html
    ├── Protocols
        ├── HeroAnimator.html
        ├── HeroCompatible.html
        ├── HeroCustomSnapshotView.html
        ├── HeroPreprocessor.html
        ├── HeroProgressUpdateObserver.html
        ├── HeroStringConvertible.html
        ├── HeroTransitionDelegate.html
        └── HeroViewControllerDelegate.html
    ├── Structs.html
    ├── Structs
        ├── HeroConditionalContext.html
        └── HeroTargetState.html
    ├── badge.svg
    ├── css
        ├── highlight.css
        └── jazzy.css
    ├── docsets
        ├── Hero.docset
        │   └── Contents
        │   │   ├── Info.plist
        │   │   └── Resources
        │   │       ├── Documents
        │   │           ├── Classes.html
        │   │           ├── Classes
        │   │           │   ├── BinaryOpNode.html
        │   │           │   ├── CallNode.html
        │   │           │   ├── ExprNode.html
        │   │           │   ├── FunctionNode.html
        │   │           │   ├── Hero.html
        │   │           │   ├── HeroContext.html
        │   │           │   ├── HeroDebugPlugin.html
        │   │           │   ├── HeroExtension.html
        │   │           │   ├── HeroModifier.html
        │   │           │   ├── HeroPlugin.html
        │   │           │   ├── HeroTransition.html
        │   │           │   ├── Lexer.html
        │   │           │   ├── NumberNode.html
        │   │           │   ├── Parser.html
        │   │           │   ├── PrototypeNode.html
        │   │           │   └── VariableNode.html
        │   │           ├── Enums.html
        │   │           ├── Enums
        │   │           │   ├── CascadeDirection.html
        │   │           │   ├── HeroCoordinateSpace.html
        │   │           │   ├── HeroDefaultAnimationType.html
        │   │           │   ├── HeroDefaultAnimationType
        │   │           │   │   ├── Direction.html
        │   │           │   │   └── Strategy.html
        │   │           │   ├── HeroSnapshotType.html
        │   │           │   ├── HeroTransitionState.html
        │   │           │   ├── HeroViewOrderingStrategy.html
        │   │           │   ├── ParseError.html
        │   │           │   └── Token.html
        │   │           ├── Extensions.html
        │   │           ├── Extensions
        │   │           │   ├── CAMediaTimingFunction.html
        │   │           │   ├── CATransform3D.html
        │   │           │   ├── HeroDebugView.html
        │   │           │   ├── String.html
        │   │           │   ├── UINavigationController.html
        │   │           │   ├── UITabBarController.html
        │   │           │   ├── UIView.html
        │   │           │   └── UIViewController.html
        │   │           ├── Functions.html
        │   │           ├── Protocols.html
        │   │           ├── Protocols
        │   │           │   ├── HeroAnimator.html
        │   │           │   ├── HeroCompatible.html
        │   │           │   ├── HeroCustomSnapshotView.html
        │   │           │   ├── HeroPreprocessor.html
        │   │           │   ├── HeroProgressUpdateObserver.html
        │   │           │   ├── HeroStringConvertible.html
        │   │           │   ├── HeroTransitionDelegate.html
        │   │           │   └── HeroViewControllerDelegate.html
        │   │           ├── Structs.html
        │   │           ├── Structs
        │   │           │   ├── HeroConditionalContext.html
        │   │           │   └── HeroTargetState.html
        │   │           ├── css
        │   │           │   ├── highlight.css
        │   │           │   └── jazzy.css
        │   │           ├── img
        │   │           │   ├── carat.png
        │   │           │   ├── dash.png
        │   │           │   ├── gh.png
        │   │           │   └── spinner.gif
        │   │           ├── index.html
        │   │           ├── js
        │   │           │   ├── jazzy.js
        │   │           │   ├── jazzy.search.js
        │   │           │   ├── jquery.min.js
        │   │           │   ├── lunr.min.js
        │   │           │   └── typeahead.jquery.js
        │   │           └── search.json
        │   │       └── docSet.dsidx
        └── Hero.tgz
    ├── img
        ├── carat.png
        ├── dash.png
        ├── gh.png
        └── spinner.gif
    ├── index.html
    ├── js
        ├── jazzy.js
        ├── jazzy.search.js
        ├── jquery.min.js
        ├── lunr.min.js
        └── typeahead.jquery.js
    ├── search.json
    └── undocumented.json


/.codecov.yml:
--------------------------------------------------------------------------------
 1 | # https://docs.codecov.io/docs/codecov-yaml
 2 | 
 3 | codecov:
 4 |   require_ci_to_pass: yes
 5 | 
 6 | coverage:
 7 |   precision: 2
 8 |   round: down
 9 |   range: "70...100"
10 |   ignore:
11 |     - docs
12 |     - Examples
13 |     - LegacyExamples
14 |     - Resources
15 |     - TvOSExamples
16 |   status:
17 |     patch:
18 |       default:
19 |         if_no_uploads: error
20 |     changes: true
21 |     project:
22 |       default:
23 |         target: auto
24 |         if_no_uploads: error
25 | comment: false
26 | 
27 | 


--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
 1 | # http://editorconfig.org
 2 | root = true
 3 | 
 4 | [*]
 5 | indent_style = space
 6 | charset = utf-8
 7 | indent_size = 4
 8 | end_of_line = lf
 9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 | 
12 | [*.{md,markdown}]
13 | trim_trailing_whitespace = false
14 | 
15 | [*.{c,h,m,mm}]
16 | indent_size = 2
17 | 
18 | [*.js]
19 | indent_size = 2
20 | 
21 | [*.{swift}]
22 | indent_size = 4
23 | 
24 | [Makefile]
25 | trim_trailing_whitespace = true
26 | indent_style = tab
27 | indent_size = 8
28 | 
29 | [*.{yaml|yml}]
30 | indent_size = 2
31 | 


--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # CODEOWNERS
2 | # Lines starting with '#' are comments.
3 | # Each line is a file pattern followed by one or more owners.
4 | # https://help.github.com/en/articles/about-code-owners
5 | 
6 | # These owners will be the default owners for everything in the repo.
7 | *       @JoeMatt @lkzhao @SD10 @kuyazee
8 | 


--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
 1 | # These are supported funding model platforms
 2 | 
 3 | github: [JoeMatt, lkzhao, SD10, kuyazee] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
 4 | patreon: # Replace with a single Patreon username
 5 | open_collective: herotransitions # Replace with a single Open Collective username
 6 | ko_fi: # Replace with a single Ko-fi username
 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
 9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 | 


--------------------------------------------------------------------------------
/.github/auto_assign.yml:
--------------------------------------------------------------------------------
 1 | # Set to true to add reviewers to pull requests
 2 | addReviewers: true
 3 | 
 4 | # Set to true to add assignees to pull requests
 5 | addAssignees: false
 6 | 
 7 | # A list of reviewers to be added to pull requests (GitHub user name)
 8 | reviewers:
 9 |   - JoeMatt
10 |   - lkzhao
11 |   - SD10
12 |   - kuyazee
13 |   
14 | # A number of reviewers added to the pull request
15 | # Set 0 to add all the reviewers (default: 0)
16 | numberOfReviewers: 0
17 | 
18 | # A list of assignees, overrides reviewers if set
19 | # assignees:
20 | 
21 | # A number of assignees to add to the pull request
22 | # Set to 0 to add all of the assignees.
23 | # Uses numberOfReviewers if unset.
24 | numberOfAssignees: 1
25 | 
26 | # A list of keywords to be skipped the process that add reviewers if pull requests include it
27 | skipKeywords:
28 |   - wip
29 |   - WIP
30 | 


--------------------------------------------------------------------------------
/.github/issue_template.md:
--------------------------------------------------------------------------------
 1 | <!--
 2 | ℹ We use Github issues for bug reports, feature requests, general support, and questions about the library.
 3 | 
 4 | Please fill out this template when filing an issue.
 5 | -->
 6 | 
 7 | ## What did you do?
 8 | 
 9 | <!-- Please replace this with what you did. -->
10 | 
11 | ## What did you expect to happen?
12 | 
13 | <!-- Please replace this with what you expected to happen. -->
14 | 
15 | ##  What happened instead?
16 | 
17 | <!-- Please replace this with of what happened instead. -->
18 | 
19 | ## General Information
20 | 
21 | * Hero Version:
22 | 
23 | * iOS Version(s):
24 | 
25 | * Swift Version:
26 | 
27 | * Devices/Simulators:
28 | 
29 | * Reproducible in Examples? (Yes/No):
30 | 
31 | ## Demo Project
32 | 
33 | <!-- Please link to or upload a project we can download that reproduces the issue. -->
34 | 
35 | 
36 | 
37 | 
38 | 


--------------------------------------------------------------------------------
/.github/main.workflow:
--------------------------------------------------------------------------------
1 | action "Danger" {
2 |   uses = "danger/danger"
3 |   # secrets = ["GITHUB_TOKEN"]
4 | }
5 | 


--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
 1 | # Number of days of inactivity before an issue becomes stale
 2 | daysUntilStale: 180
 3 | # Number of days of inactivity before a stale issue is closed
 4 | daysUntilClose: 7
 5 | # Issues with these labels will never be considered stale
 6 | exemptLabels:
 7 |   - pinned
 8 |   - security
 9 |   - confirmed bug
10 |   - investigating
11 |   - bug?
12 |   - WIP
13 | # Label to use when marking an issue as stale
14 | staleLabel: stale
15 | # Comment to post when marking an issue as stale. Set to `false` to disable
16 | markComment: >
17 |   This issue has been automatically marked as stale because it has not had
18 |   recent activity. It will be closed if no further activity occurs. Thank you
19 |   for your contributions.
20 | # Comment to post when closing a stale issue. Set to `false` to disable
21 | closeComment: true
22 | 
23 | 


--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
 1 | on:
 2 |   push:
 3 |     branches:
 4 |       - master
 5 | name: Build
 6 | jobs:
 7 |   test:
 8 |     name: Build
 9 |     runs-on: macOS-latest
10 |     strategy:
11 |         matrix:
12 |           destination: [
13 |             'platform=Any iOS Simulator',
14 |             'platform=Any tvOS Simulator',
15 |             'platform=macOS,arch=x86_64',
16 |             'platform=macOS,arch=arm64',
17 |             'platform=macCatalyst,arch=x86_64',
18 |             'platform=macCatalyst,arch=arm64',
19 |             ]
20 |     steps:
21 |       - name: Checkout
22 |         uses: actions/checkout@master
23 |       - name: Build
24 |         run: |
25 |           pod install
26 |           set -o pipefail && \
27 |           xcodebuild clean build \
28 |           -workspace Hero.xcworkspace \
29 |           -scheme Hero \
30 |           -destination "${destination}" \
31 |           -parallelizeTargets -showBuildTimingSummary \
32 |           -enableCodeCoverage YES \
33 |           CODE_SIGN_IDENTITY="" \
34 |           CODE_SIGNING_REQUIRED=NO \
35 |           | xcpretty
36 |         env:
37 |          destination: ${{ matrix.destination }}
38 | 


--------------------------------------------------------------------------------
/.github/workflows/rebase.yml:
--------------------------------------------------------------------------------
 1 | # Rebase PR branch when someone comments /rebase
 2 | on:
 3 |   issue_comment:
 4 |     types: [created]
 5 | name: Automatic Rebase
 6 | jobs:
 7 |   rebase:
 8 |     name: Rebase
 9 |     if: contains(github.event.comment.body, '/rebase')
10 |     runs-on: ubuntu-latest
11 |     steps:
12 |       - uses: actions/checkout@master
13 |       - name: Automatic Rebase
14 |         uses: cirrus-actions/rebase@master
15 |         env:
16 |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17 | 


--------------------------------------------------------------------------------
/.github/workflows/swiftlint.yml:
--------------------------------------------------------------------------------
 1 | name: Swift Lint
 2 | 
 3 | on:
 4 |   pull_request:
 5 |     paths:
 6 |       - '.github/workflows/swiftlint.yml'
 7 |       - '.swiftlint.yml'
 8 |       - '**/*.swift'
 9 | 
10 | jobs:
11 |   swift-lint:
12 |     runs-on: ubuntu-latest
13 | 
14 |     steps:
15 |       - uses: actions/checkout@v1
16 |       - name: GitHub Action for SwiftLint
17 |         uses: norio-nomura/action-swiftlint@3.2.1
18 |         env:
19 |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
20 |           DIFF_BASE: ${{ github.base_ref }}
21 | 


--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
 1 | # test.yml
 2 | # Unit Test
 3 | name: Unit Test
 4 | 'on':
 5 |   pull_request:
 6 |     paths:
 7 |       - '**.swift'
 8 |       - '**.xcodeproj'
 9 |       - '**.m'
10 |       - '**.h'
11 |       - '**.podspec'
12 |       - Podfile
13 |       - Podfile.lock
14 |       - '**/test.yml'
15 | jobs:
16 |   swiftpm:
17 |     name: Test iOS (swiftpm)
18 |     runs-on: macOS-latest
19 |     env:
20 |       DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer
21 |     steps:
22 |       - name: Checkout
23 |         uses: actions/checkout@master
24 |       - name: iOS - Swift PM
25 |         run: |
26 |           pod install
27 |           set -o pipefail && swift test --parallel
28 |   XCode:
29 |     name: Test iOS
30 |     runs-on: macOS-latest
31 |     env:
32 |       DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer
33 |     strategy:
34 |       matrix:
35 |         run-config:
36 |           - scheme: Hero
37 |             platform: iOS
38 |             action: test
39 |             code-coverage: true
40 |           - scheme: Hero (tvOS)
41 |             platform: tvOS
42 |             action: build
43 |             code-coverage: false
44 |     steps:
45 |       - name: Checkout
46 |         uses: actions/checkout@master
47 | 
48 |       - name: CocoaPods - ${{ matrix.run-config.destination }}
49 |         run: |
50 |           pod install
51 | 
52 |       - name: Test - ${{ matrix.run-config.platform }}
53 |         uses: mxcl/xcodebuild@v2.0
54 |         with:
55 |           platform: ${{ matrix.run-config.platform }}
56 |           action: ${{ matrix.run-config.action }}
57 |           code-coverage:  ${{ matrix.run-config.code-coverage }}
58 |           configuration: Debug
59 |           scheme: ${{ matrix.run-config.scheme }}
60 |           workspace: Hero.xcworkspace
61 | 
62 |       - name: Upload Code Coverage
63 |         uses: codecov/codecov-action@v3
64 |         if: ${{ matrix.run-config.code-coverage }}
65 |         with:
66 |           token: ${{ secrets.CODECOV_TOKEN }}
67 | 


--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
 1 | .DS_Store
 2 | # Xcode
 3 | #
 4 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
 5 | 
 6 | ## Build generated
 7 | build/
 8 | DerivedData/
 9 | 
10 | ## Various settings
11 | *.pbxuser
12 | !default.pbxuser
13 | *.mode1v3
14 | !default.mode1v3
15 | *.mode2v3
16 | !default.mode2v3
17 | *.perspectivev3
18 | !default.perspectivev3
19 | xcuserdata/
20 | 
21 | ## Other
22 | *.moved-aside
23 | *.xcuserstate
24 | 
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 | 
31 | ## Playgrounds
32 | timeline.xctimeline
33 | playground.xcworkspace
34 | 
35 | # Swift Package Manager
36 | #
37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
38 | # Packages/
39 | .build/
40 | 
41 | # CocoaPods
42 | #
43 | # We recommend against adding the Pods directory to your .gitignore. However
44 | # you should judge for yourself, the pros and cons are mentioned at:
45 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
46 | #
47 | Pods/
48 | 
49 | # Carthage
50 | #
51 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
52 | # Carthage/Checkouts
53 | 
54 | Carthage/Build
55 | 
56 | # fastlane
57 | #
58 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
59 | # screenshots whenever they are needed.
60 | # For more information about the recommended setup visit:
61 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
62 | 
63 | fastlane/report.xml
64 | fastlane/Preview.html
65 | fastlane/screenshots
66 | fastlane/test_output
67 | 
68 | # Gitbook
69 | node_modules
70 | _book
71 | xcodebuild.log
72 | .swiftpm
73 | /.bundle
74 | *.zip
75 | 


--------------------------------------------------------------------------------
/.jazzy.yaml:
--------------------------------------------------------------------------------
 1 | # ---- About ----
 2 | module: Hero
 3 | module_version: 1.6.4
 4 | author: HeroTransitions
 5 | readme: README.md
 6 | copyright: 'See [license](https://github.com/HeroTransitions/Hero/blob/develop/LICENSE) for more details.'
 7 | 
 8 | # ---- URLs ----
 9 | author_url: https://herotransitions.github.io/Hero/
10 | dash_url: https://herotransitions.github.io/Hero/docsets/Hero.xml
11 | github_url: https://github.com/HeroTransitions/Hero/
12 | github_file_prefix: https://github.com/HeroTransitions/Hero/tree/1.6.2/
13 | 
14 | # ---- Sources ----
15 | podspec: Hero.podspec
16 | 
17 | # ---- Generation ----
18 | clean: true
19 | output: docs
20 | min_acl: public
21 | hide_documentation_coverage: false
22 | skip_undocumented: false
23 | objc: false
24 | # swift_version: 5.1.0
25 | 
26 | # ---- Formatting ----
27 | theme: fullwidth
28 | 


--------------------------------------------------------------------------------
/.makefiles/bundler.mk:
--------------------------------------------------------------------------------
 1 | # Provides a dependecy, `bundle`, which runs bundle install when necessary.
 2 | # Override bundle install options by setting BUNDLE_INSTALL_OPTS.
 3 | BE := bundle exec
 4 | BUNDLE_INSTALL_OPTS ?=
 5 | 
 6 | Gemfile.lock: Gemfile FORCE | _program_bundle
 7 | 	@bundle check > /dev/null 2>&1 && \
 8 | 		( $(call _log,rubygems up-to-date) ) || \
 9 | 		( $(call _log,installing rubygems); \
10 | 		  bundle install $(BUNDLE_INSTALL_OPTS) )
11 | 
12 | #> installs rubygems
13 | bundle:: Gemfile.lock
14 | 
15 | .PHONY: bundle
16 | 


--------------------------------------------------------------------------------
/.makefiles/docker-compose.mk:
--------------------------------------------------------------------------------
 1 | DOCKER_COMPOSE_PULL ?= yes
 2 | DOCKER_COMPOSE_DAEMON ?= yes
 3 | DOCKER_COMPOSE_FILE ?= docker-compose.yml
 4 | 
 5 | DOCKER_COMPOSE_UP_FLAGS += $(if $(filter yes,$(DOCKER_COMPOSE_DAEMON)),-d)
 6 | DOCKER_COMPOSE_BUILD_FLAGS += $(if $(filter yes,$(DOCKER_COMPOSE_PULL)),--pull)
 7 | DOCKER_COMPOSE_CLEAN_FLAGS ?= --rmi all --volumes --remove-orphans
 8 | 
 9 | .docker-compose-build-complete:
10 | 	@[ -f .gitignore -a -z "$(grep '$@' .gitignore 2> /dev/null)" ] && \
11 | 		( $(call _warn,WARNING: $@ not found in .gitignore) ) || true
12 | 	$(call log,building from $(DOCKER_COMPOSE_FILE))
13 | 	docker-compose -f $(DOCKER_COMPOSE_FILE) build $(DOCKER_COMPOSE_BUILD_FLAGS)
14 | 	@touch $@
15 | 
16 | #> build docker images (force rebuild with -B)
17 | build:: .docker-compose-build-complete | _program_docker-compose
18 | .PHONY: build
19 | 
20 | #> run docker-compose up
21 | up:: build | _program_docker-compose
22 | 	$(call log,starting docker services in $(DOCKER_COMPOSE_FILE))
23 | 	docker-compose -f $(DOCKER_COMPOSE_FILE) up $(DOCKER_COMPOSE_UP_FLAGS)
24 | .PHONY: up
25 | 
26 | #> run docker-compose down
27 | down:: | _program_docker-compose
28 | 	$(call log,stopping docker services in $(DOCKER_COMPOSE_FILE))
29 | 	docker-compose -f $(DOCKER_COMPOSE_FILE) down
30 | .PHONY: down
31 | 
32 | #> remove docker-compose artifacts
33 | clean:: | _program_docker-compose
34 | 	$(call log,cleaning up docker artifacts)
35 | 	docker-compose -f $(DOCKER_COMPOSE_FILE) down $(DOCKER_COMPOSE_CLEAN_FLAGS)
36 | 	rm -f .docker-compose-build-complete
37 | .PHONY: clean
38 | 


--------------------------------------------------------------------------------
/.makefiles/help.awk:
--------------------------------------------------------------------------------
 1 | # Awk program for automatically generating help text from those ludicrous makefiles.
 2 | # See help.mk for details.
 3 | function len(a,    i, k) {
 4 |   for (i in a) k++
 5 |   return k
 6 | }
 7 | 
 8 | function join(a, sep) {
 9 |   result = ""
10 |   if (sep == "")
11 |     sep = SUBSEP
12 |   for (item in a)
13 |     result = result sep a[item]
14 |   return result
15 | }
16 | 
17 | function unjoin(a, text, sep) {
18 |   if (sep == "")
19 |     sep = SUBSEP
20 |   split(substr(text, 2), a, sep)
21 | }
22 | 
23 | function append(a, item) {
24 |   a[len(a) + 1] = item
25 | }
26 | 
27 | function extend(a, b) {
28 |   for (item in b)
29 |     append(a, b[item])
30 | }
31 | 
32 | /^#> / {
33 |   comments[++comments_counter] = substr($0, 4)
34 | }
35 | 
36 | /^[^: \t]*:[^;]*;?/ {
37 |   split($0, recipe_firstline, ":")
38 |   target = recipe_firstline[1]
39 | 
40 |   width = length(target)
41 |   max_width = (max_width > width) ? max_width : width
42 | 
43 |   if ( substr(lastline, 1, 2) == "#>" ) {
44 |     target_docs[target] = join(comments, "#")
45 |     delete comments
46 |   }
47 | }
48 | 
49 | !/^#>/ {
50 |   if (len(comments) > 0) {
51 |     extend(global_docs, comments)
52 |     append(global_docs, "")
53 |     delete comments
54 |   }
55 | }
56 | 
57 | { lastline = $0 }
58 | 
59 | END {
60 | 
61 |   for (doc in global_docs)
62 |     print global_docs[doc]
63 | 
64 |   printf "Targets:\n"
65 | 
66 |   for (target in target_docs) {
67 |     unjoin(help, target_docs[target], "#")
68 |     printf "  %-" max_width "s   %s\n", target, help[1]
69 |     for (i = 2; i <= len(help); i++)
70 |       printf "  %-" max_width "s   %s\n", "", help[i]
71 |   }
72 | 
73 | }
74 | 


--------------------------------------------------------------------------------
/.makefiles/virtualenv.mk:
--------------------------------------------------------------------------------
 1 | # Provides a dependecy, `virtualenv`, which creates a local virtualenv for use
 2 | # during development of a python project.
 3 | PYTHON_VERSION   ?=
 4 | VIRTUALENV_DIR   ?= .env
 5 | PIP_INDEX_URL    ?=
 6 | PIP_REQUIREMENTS ?= requirements.txt
 7 | 
 8 | PYTHON := python$(PYTHON_VERSION)
 9 | PIP    := $(VIRTUALENV_DIR)/bin/pip
10 | PIP_INDEX_FLAG := $(if $(PIP_INDEX_URL),--index-url $(PIP_INDEX_URL))
11 | 
12 | $(VIRTUALENV_DIR): | _program_$(PYTHON) _program_virtualenv
13 | 	${call log,creating virtualenv at $(VIRTUALENV_DIR)}
14 | 	virtualenv --python=$(PYTHON) $(VIRTUALENV_DIR)
15 | 
16 | $(PIP): $(PIP_REQUIREMENTS) | $(VIRTUALENV_DIR)
17 | 	${call log,install python dependencies from $(PIP_REQUIREMENTS)}
18 | 	$(PIP) install $(PIP_INDEX_FLAG) --upgrade pip setuptools
19 | 	$(PIP) install $(PIP_INDEX_FLAG) --upgrade -r $(PIP_REQUIREMENTS)
20 | 	@touch $(PIP)
21 | 
22 | #> installs python dependencies
23 | virtualenv:: $(PIP)
24 | .PHONY: virtualenv
25 | 
26 | clean::
27 | 	rm -rf $(VIRTUALENV_DIR)
28 | .PHONY: clean
29 | 


--------------------------------------------------------------------------------
/.swiftlint.yml:
--------------------------------------------------------------------------------
 1 | disabled_rules: # rule identifiers to exclude from running
 2 |   - missing_docs
 3 |   - unused_closure_parameter
 4 |   - identifier_name
 5 |   - weak_delegate
 6 |   - cyclomatic_complexity
 7 |   - function_body_length
 8 |   - todo
 9 |   - large_tuple
10 | 
11 | opt_in_rules: # some rules are only opt-in
12 |   - empty_count
13 | # Find all the available rules by running:
14 | # swiftlint rules
15 | 
16 | included: # paths to include during linting. `--path` is ignored if present.
17 | - Sources
18 | 
19 | excluded: # paths to ignore during linting. Takes precedence over `included`.
20 |   - Carthage
21 |   - Pods
22 | 
23 | # configurable rules can be customized from this configuration file
24 | # binary rules can set their severity level
25 | force_cast: warning # implicitly
26 | force_try:
27 |   severity: warning # explicitly
28 | 
29 | # rules that have both warning and error levels, can set just the warning level
30 | # implicitly
31 | line_length: 500
32 | 
33 | # they can set both implicitly with an array
34 | type_body_length:
35 |   - 300 # warning
36 |   - 400 # error
37 | 
38 | # or they can set both explicitly
39 | file_length:
40 |   warning: 600
41 |   error: 1200
42 | 
43 | # naming rules can set warnings/errors for min_length and max_length
44 | # additionally they can set excluded names
45 | type_name:
46 |   min_length: 3 # only warning
47 |   max_length: # warning and error
48 |     warning: 40
49 |     error: 50
50 |   excluded: # excluded via string
51 |     - T
52 |     - t
53 | 
54 | identifier_name:
55 |   min_length: # only min_length
56 |     error: 3 # only error
57 |   excluded: # excluded via string array
58 |     - id
59 |     - vc
60 |     - to
61 |     - a
62 |     - b
63 |     - t
64 |     - x
65 |     - y
66 |     - z
67 |     - p
68 |     - xy
69 |     - dx
70 |     - dy
71 |     - gr
72 | 


--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language:
2 |     - swift
3 | osx_image: xcode11.0
4 | script:
5 |   - xcodebuild -scheme HeroExamples -workspace Hero.xcworkspace -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone X,OS=13.0' build test
6 | after_success:
7 |   - bash <(curl -s https://codecov.io/bash)
8 | 


--------------------------------------------------------------------------------
/DEVELOP.md:
--------------------------------------------------------------------------------
 1 | # Develop.md
 2 | 
 3 | ## Releases
 4 | 
 5 | 1. Make release brach `git-flow release start x.x.x`
 6 | 2. Search find/replace current version in XCode project
 7 | 3. Update `CHANGELOG.md`
 8 | 4. Run swift lint autocorrect `make autocorrect`
 9 | 5. Change version in `jazzy.yml`
10 | 6. Run `make jazzy`
11 | 7. Commit changes.
12 | 8. Create GitHub release
13 | 9. Create CocoaPods release
14 |    1.  ` pod lib lint`
15 | 10. Finish release
16 |     1.  `git-flow release finish x.x.x`
17 |     2.  `git push --tags`
18 | 11. Public CocoaPod release
19 |     1.  `pod trunk push`
20 | 


--------------------------------------------------------------------------------
/Examples/ExampleBaseViewController.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  ExampleBaseViewController.swift
 3 | //  HeroExamples
 4 | //
 5 | //  Created by Luke Zhao on 2018-04-15.
 6 | //  Copyright © 2018 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import UIKit
10 | 
11 | // basically a view controller with a back button and a tap gesture configured
12 | class ExampleBaseViewController: UIViewController {
13 |   let dismissButton = UIButton(type: .system)
14 | 
15 |   override func viewDidLoad() {
16 |     super.viewDidLoad()
17 |     if #available(iOS 13.0, tvOS 13, *) {
18 |       view.backgroundColor = .systemBackground
19 |     } else {
20 |       view.backgroundColor = .white
21 |     }
22 |     view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
23 | 
24 |     dismissButton.setTitle("Back", for: .normal)
25 |     dismissButton.addTarget(self, action: #selector(back), for: .touchUpInside)
26 |     dismissButton.hero.id = "back button"
27 |     view.addSubview(dismissButton)
28 |   }
29 | 
30 |   override func viewDidLayoutSubviews() {
31 |     super.viewDidLayoutSubviews()
32 |     dismissButton.sizeToFit()
33 |     dismissButton.center = CGPoint(x: 30, y: 30)
34 |   }
35 | 
36 |   @objc func back() {
37 |     dismiss(animated: true, completion: nil)
38 |   }
39 | 
40 |   @objc func onTap() {
41 |     back() // default action is back on tap
42 |   }
43 | }
44 | 


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Back@large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Back@large.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Back@large.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "layers" : [
 3 |     {
 4 |       "filename" : "Front.imagestacklayer"
 5 |     },
 6 |     {
 7 |       "filename" : "Middle.imagestacklayer"
 8 |     },
 9 |     {
10 |       "filename" : "Back.imagestacklayer"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Front@large.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Front@large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Front@large.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Middle@large.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Middle@large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Middle@large.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Back.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Back.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "layers" : [
 3 |     {
 4 |       "filename" : "Front.imagestacklayer"
 5 |     },
 6 |     {
 7 |       "filename" : "Middle.imagestacklayer"
 8 |     },
 9 |     {
10 |       "filename" : "Back.imagestacklayer"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Front.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Front.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Middle.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "assets" : [
 3 |     {
 4 |       "size" : "1280x768",
 5 |       "idiom" : "tv",
 6 |       "filename" : "App Icon - Large.imagestack",
 7 |       "role" : "primary-app-icon"
 8 |     },
 9 |     {
10 |       "size" : "400x240",
11 |       "idiom" : "tv",
12 |       "filename" : "App Icon - Small.imagestack",
13 |       "role" : "primary-app-icon"
14 |     },
15 |     {
16 |       "size" : "2320x720",
17 |       "idiom" : "tv",
18 |       "filename" : "Top Shelf Image Wide.imageset",
19 |       "role" : "top-shelf-image-wide"
20 |     },
21 |     {
22 |       "size" : "1920x720",
23 |       "idiom" : "tv",
24 |       "filename" : "Top Shelf Image.imageset",
25 |       "role" : "top-shelf-image"
26 |     }
27 |   ],
28 |   "info" : {
29 |     "version" : 1,
30 |     "author" : "xcode"
31 |   }
32 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Top Shelf Image Wide.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Top Shelf Image Wide.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Top Shelf Image Wide.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "tv",
 5 |       "filename" : "Top Shelf Image.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "tv",
10 |       "scale" : "2x"
11 |     }
12 |   ],
13 |   "info" : {
14 |     "version" : 1,
15 |     "author" : "xcode"
16 |   }
17 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Top Shelf Image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Top Shelf Image.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/iphone_alt_small_2x.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "scale" : "1x"
 6 |     },
 7 |     {
 8 |       "idiom" : "universal",
 9 |       "filename" : "iphone_alt_small_2x.jpg",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/iphone_alt_small_2x.imageset/iphone_alt_small_2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppleHomePage/iphone_alt_small_2x.imageset/iphone_alt_small_2x.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/macbookpro_portrait_small_2x.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "scale" : "1x"
 6 |     },
 7 |     {
 8 |       "idiom" : "universal",
 9 |       "filename" : "macbookpro_portrait_small_2x.jpg",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/macbookpro_portrait_small_2x.imageset/macbookpro_portrait_small_2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppleHomePage/macbookpro_portrait_small_2x.imageset/macbookpro_portrait_small_2x.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/watch_alt_portrait_small_2x.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "scale" : "1x"
 6 |     },
 7 |     {
 8 |       "idiom" : "universal",
 9 |       "filename" : "watch_alt_portrait_small_2x.jpg",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/AppleHomePage/watch_alt_portrait_small_2x.imageset/watch_alt_portrait_small_2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/AppleHomePage/watch_alt_portrait_small_2x.imageset/watch_alt_portrait_small_2x.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/cityGuide.imageset/316f8e75.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/CityGuide/cityGuide.imageset/316f8e75.jpeg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/cityGuide.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "316f8e75.jpeg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/montreal.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "photo-1419041082630-1e98debd0a6a.jpeg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/montreal.imageset/photo-1419041082630-1e98debd0a6a.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/CityGuide/montreal.imageset/photo-1419041082630-1e98debd0a6a.jpeg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/toronto.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "photo-1437147921639-ef00e030265a.jpeg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/toronto.imageset/photo-1437147921639-ef00e030265a.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/CityGuide/toronto.imageset/photo-1437147921639-ef00e030265a.jpeg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/vancouver.imageset/316f8e75.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/CityGuide/vancouver.imageset/316f8e75.jpeg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/CityGuide/vancouver.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "316f8e75.jpeg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash0.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0.imageset/Unsplash0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash0.imageset/Unsplash0.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash0_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0_cell.imageset/Unsplash0_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash0_cell.imageset/Unsplash0_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash0_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash0_thumb.imageset/Unsplash0_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash0_thumb.imageset/Unsplash0_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash1.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1.imageset/Unsplash1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash1.imageset/Unsplash1.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash10.jpg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10.imageset/Unsplash10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash10.imageset/Unsplash10.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash10_cell.jpg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10_cell.imageset/Unsplash10_cell.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash10_cell.imageset/Unsplash10_cell.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash10_thumb.jpg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash10_thumb.imageset/Unsplash10_thumb.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash10_thumb.imageset/Unsplash10_thumb.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash1_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1_cell.imageset/Unsplash1_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash1_cell.imageset/Unsplash1_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash1_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash1_thumb.imageset/Unsplash1_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash1_thumb.imageset/Unsplash1_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash2.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2.imageset/Unsplash2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash2.imageset/Unsplash2.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash2_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2_cell.imageset/Unsplash2_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash2_cell.imageset/Unsplash2_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash2_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash2_thumb.imageset/Unsplash2_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash2_thumb.imageset/Unsplash2_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash3.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3.imageset/Unsplash3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash3.imageset/Unsplash3.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash3_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3_cell.imageset/Unsplash3_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash3_cell.imageset/Unsplash3_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash3_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash3_thumb.imageset/Unsplash3_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash3_thumb.imageset/Unsplash3_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash4.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4.imageset/Unsplash4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash4.imageset/Unsplash4.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash4_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4_cell.imageset/Unsplash4_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash4_cell.imageset/Unsplash4_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash4_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash4_thumb.imageset/Unsplash4_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash4_thumb.imageset/Unsplash4_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash5.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5.imageset/Unsplash5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash5.imageset/Unsplash5.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash5_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5_cell.imageset/Unsplash5_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash5_cell.imageset/Unsplash5_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash5_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash5_thumb.imageset/Unsplash5_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash5_thumb.imageset/Unsplash5_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash6.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6.imageset/Unsplash6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash6.imageset/Unsplash6.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash6_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6_cell.imageset/Unsplash6_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash6_cell.imageset/Unsplash6_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash6_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash6_thumb.imageset/Unsplash6_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash6_thumb.imageset/Unsplash6_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash7.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7.imageset/Unsplash7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash7.imageset/Unsplash7.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash7_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7_cell.imageset/Unsplash7_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash7_cell.imageset/Unsplash7_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash7_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash7_thumb.imageset/Unsplash7_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash7_thumb.imageset/Unsplash7_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash8.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8.imageset/Unsplash8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash8.imageset/Unsplash8.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash8_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8_cell.imageset/Unsplash8_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash8_cell.imageset/Unsplash8_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash8_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash8_thumb.imageset/Unsplash8_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash8_thumb.imageset/Unsplash8_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash9.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9.imageset/Unsplash9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash9.imageset/Unsplash9.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9_cell.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash9_cell.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9_cell.imageset/Unsplash9_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash9_cell.imageset/Unsplash9_cell.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9_thumb.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "Unsplash9_thumb.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Foods/Unsplash9_thumb.imageset/Unsplash9_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Foods/Unsplash9_thumb.imageset/Unsplash9_thumb.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/HeroLogo.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "HeroLogo.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "HeroLogo@2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "HeroLogo@3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo@2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/HeroLogo.imageset/HeroLogo@3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_audiotrack_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_audiotrack_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_audiotrack_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/ic_audiotrack_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_chat_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_chat_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_chat_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/ic_chat_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_format_quote_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_format_quote_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_format_quote_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/ic_format_quote_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_gif_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_gif_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_gif_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/ic_gif_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_insert_photo_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_insert_photo_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_insert_photo_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/ic_insert_photo_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_link_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_link_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_link_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/ic_link_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_menu_36pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_menu_36pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_menu_36pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   },
23 |   "properties" : {
24 |     "template-rendering-intent" : "template"
25 |   }
26 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/ic_menu_36pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_menu_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_menu_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_menu_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   },
23 |   "properties" : {
24 |     "template-rendering-intent" : "template"
25 |   }
26 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/ic_menu_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_text_fields_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_text_fields_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_text_fields_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/ic_text_fields_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_videocam_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_videocam_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_videocam_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/ic_videocam_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/album1.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "computergraphics-album-covers-2014-3.jpg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/album1.imageset/computergraphics-album-covers-2014-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/album1.imageset/computergraphics-album-covers-2014-3.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_fast_forward.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_fast_forward_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_fast_forward_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/ic_fast_forward_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_fast_rewind.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_fast_rewind_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_fast_rewind_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/ic_fast_rewind_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_pause_white.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_pause_white_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_pause_white_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/ic_pause_white_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_play_arrow_white.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_play_arrow_white_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_play_arrow_white_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/ic_play_arrow_white_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_repeat.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_repeat_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_repeat_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/ic_repeat_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_shuffle.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_shuffle_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_shuffle_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/ic_shuffle_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/bigbuckbunny.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "poster.jpg",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "scale" : "2x"
11 |     },
12 |     {
13 |       "idiom" : "universal",
14 |       "scale" : "3x"
15 |     }
16 |   ],
17 |   "info" : {
18 |     "version" : 1,
19 |     "author" : "xcode"
20 |   }
21 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/bigbuckbunny.imageset/poster.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/bigbuckbunny.imageset/poster.jpg


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_bug_report_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_bug_report_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_bug_report_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/ic_bug_report_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_close.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_close.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_close_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_close_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_close.imageset/ic_close_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_code.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_code.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_code_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_code_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_code.imageset/ic_code_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_input_48pt.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_input_48pt_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_input_48pt_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/ic_input_48pt_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_keyboard_arrow_down.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_keyboard_arrow_down_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_keyboard_arrow_down_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/ic_keyboard_arrow_down_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_list.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_view_list.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_view_list_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_view_list_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_list.imageset/ic_view_list_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_module.imageset/Contents.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "images" : [
 3 |     {
 4 |       "idiom" : "universal",
 5 |       "filename" : "ic_view_module.png",
 6 |       "scale" : "1x"
 7 |     },
 8 |     {
 9 |       "idiom" : "universal",
10 |       "filename" : "ic_view_module_2x.png",
11 |       "scale" : "2x"
12 |     },
13 |     {
14 |       "idiom" : "universal",
15 |       "filename" : "ic_view_module_3x.png",
16 |       "scale" : "3x"
17 |     }
18 |   ],
19 |   "info" : {
20 |     "version" : 1,
21 |     "author" : "xcode"
22 |   }
23 | }


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module_2x.png


--------------------------------------------------------------------------------
/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module_3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Examples/Resources/Assets.xcassets/ic_view_module.imageset/ic_view_module_3x.png


--------------------------------------------------------------------------------
/Examples/Resources/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
 3 |     <device id="retina6_1" orientation="portrait" appearance="light"/>
 4 |     <dependencies>
 5 |         <deployment identifier="iOS"/>
 6 |         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
 7 |         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
 8 |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
 9 |     </dependencies>
10 |     <scenes>
11 |         <!--View Controller-->
12 |         <scene sceneID="EHf-IW-A2E">
13 |             <objects>
14 |                 <viewController id="01J-lp-oVM" sceneMemberID="viewController">
15 |                     <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
16 |                         <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
17 |                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18 |                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
19 |                         <viewLayoutGuide key="safeArea" id="ahU-2K-RQA"/>
20 |                     </view>
21 |                 </viewController>
22 |                 <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
23 |             </objects>
24 |             <point key="canvasLocation" x="53" y="375"/>
25 |         </scene>
26 |     </scenes>
27 | </document>
28 | 


--------------------------------------------------------------------------------
/Examples/Resources/Info.plist:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 | <dict>
 5 | 	<key>CFBundleDevelopmentRegion</key>
 6 | 	<string>en</string>
 7 | 	<key>CFBundleExecutable</key>
 8 | 	<string>$(EXECUTABLE_NAME)</string>
 9 | 	<key>CFBundleIdentifier</key>
10 | 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11 | 	<key>CFBundleInfoDictionaryVersion</key>
12 | 	<string>6.0</string>
13 | 	<key>CFBundleName</key>
14 | 	<string>$(PRODUCT_NAME)</string>
15 | 	<key>CFBundlePackageType</key>
16 | 	<string>APPL</string>
17 | 	<key>CFBundleShortVersionString</key>
18 | 	<string>$(MARKETING_VERSION)</string>
19 | 	<key>CFBundleVersion</key>
20 | 	<string>1</string>
21 | 	<key>LSRequiresIPhoneOS</key>
22 | 	<true/>
23 | 	<key>UILaunchStoryboardName</key>
24 | 	<string>LaunchScreen</string>
25 | 	<key>UIRequiredDeviceCapabilities</key>
26 | 	<array>
27 | 		<string>armv7</string>
28 | 	</array>
29 | 	<key>UIRequiresFullScreen</key>
30 | 	<true/>
31 | 	<key>UIStatusBarHidden</key>
32 | 	<true/>
33 | 	<key>UISupportedInterfaceOrientations</key>
34 | 	<array>
35 | 		<string>UIInterfaceOrientationPortrait</string>
36 | 		<string>UIInterfaceOrientationLandscapeLeft</string>
37 | 		<string>UIInterfaceOrientationLandscapeRight</string>
38 | 	</array>
39 | 	<key>UIViewControllerBasedStatusBarAppearance</key>
40 | 	<false/>
41 | </dict>
42 | </plist>
43 | 


--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
 1 | # frozen_string_literal: true
 2 | 
 3 | source 'https://rubygems.org'
 4 | #ruby '~> 2.5.1'
 5 | 
 6 | gem 'cocoapods', '~> 1.10'
 7 | gem 'cocoapods-check'
 8 | gem 'cocoapods-generate'
 9 | gem 'cocoapods-githooks'      # Sync .git-hooks across team members at `pod install` time
10 | gem 'cocoapods-packager'      # Generate a framework or static library from a podspec. https://github.com/CocoaPods/cocoapods-packager
11 | gem 'cocoapods-repo-update'   # Fixes issues with CI not updating specs
12 | 
13 | # Temporary workaround for bug in binary file diffing
14 | # https://github.com/danger/danger/issues/1055
15 | # https://github.com/ruby-git/ruby-git/pull/405
16 | gem 'git', git: 'https://github.com/jcouball/ruby-git.git'
17 | 
18 | gem 'fastlane'
19 | gem 'xcode-install'
20 | 
21 | group :documentation do
22 | # gem 'jazzy', '~> 0.11'
23 | end
24 | 
25 | group :test do
26 |   gem 'git_diff_parser'
27 |   gem 'xcpretty'
28 | 
29 |   gem 'danger'
30 |   gem 'danger-auto_label'
31 |   gem 'danger-swiftlint'
32 | 
33 |   # Danger plugin to validate the code coverage of the files changed
34 |   #     - Gem:     danger-xcov
35 |   #     - URL:     https://github.com/nakiostudio/danger-xcov
36 |   gem 'danger-xcov'
37 | end
38 | 
39 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
40 | eval_gemfile(plugins_path) if File.exist?(plugins_path)
41 | 


--------------------------------------------------------------------------------
/Hero.podspec:
--------------------------------------------------------------------------------
 1 | # frozen_string_literal: true
 2 | 
 3 | Pod::Spec.new do |s|
 4 |   s.name              = 'Hero'
 5 |   s.version           = '1.6.4'
 6 |   s.summary           = 'Elegant transition library for iOS'
 7 | 
 8 |   s.description       = <<-DESC
 9 |                         Hero is a library for building iOS view controller transitions.
10 |                         It provides a declarative layer on top of the UIKit's cumbersome transition APIs.
11 |                         Making custom transitions an easy task for developers.
12 |   DESC
13 | 
14 |   s.homepage          = 'https://github.com/HeroTransitions/Hero'
15 |   s.screenshots       = 'https://github.com/HeroTransitions/Hero/blob/master/Resources/Hero.png?raw=true'
16 |   s.documentation_url = 'https://herotransitions.github.io/Hero/'
17 |   s.screenshots       = ['https://git.io/JeRkv', 'https://git.io/JeRke', 'https://git.io/JeRkf', 'https://git.io/JeRkJ']
18 |   s.license           = { :type => 'MIT' }
19 |   s.author            = {
20 |     'Luke' => 'lzhaoyilun@gmail.com',
21 |     'Joe Mattiello' => 'git@joemattiello.com'
22 |   }
23 |   s.source           = { git: 'https://github.com/HeroTransitions/Hero.git', tag: s.version.to_s }
24 | 
25 |   s.cocoapods_version = '>= 1.4.0'
26 | 
27 |   s.ios.deployment_target = '10.0'
28 |   s.tvos.deployment_target = '10.0'
29 | 
30 |   s.ios.frameworks = 'UIKit', 'Foundation', 'QuartzCore', 'CoreGraphics', 'CoreMedia'
31 |   s.tvos.frameworks = 'UIKit', 'Foundation', 'QuartzCore', 'CoreGraphics', 'CoreMedia'
32 | 
33 |   s.swift_version = '5.0'
34 | 
35 |   s.requires_arc = true
36 | 
37 |   s.source_files = 'Sources/**/*.swift'
38 | end
39 | 


--------------------------------------------------------------------------------
/Hero.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <Workspace
3 |    version = "1.0">
4 |    <FileRef
5 |       location = "self:HeroExamples.xcodeproj">
6 |    </FileRef>
7 | </Workspace>
8 | 


--------------------------------------------------------------------------------
/Hero.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 | <plist version="1.0">
4 | <dict>
5 | 	<key>IDEDidComputeMac32BitWarning</key>
6 | 	<true/>
7 | </dict>
8 | </plist>
9 | 


--------------------------------------------------------------------------------
/Hero.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <Workspace
 3 |    version = "1.0">
 4 |    <FileRef
 5 |       location = "group:Hero.xcodeproj">
 6 |    </FileRef>
 7 |    <FileRef
 8 |       location = "group:Pods/Pods.xcodeproj">
 9 |    </FileRef>
10 | </Workspace>
11 | 


--------------------------------------------------------------------------------
/Hero.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 | <plist version="1.0">
4 | <dict>
5 | 	<key>IDEDidComputeMac32BitWarning</key>
6 | 	<true/>
7 | </dict>
8 | </plist>
9 | 


--------------------------------------------------------------------------------
/Hero.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 | <dict>
 5 | 	<key>BuildSystemType</key>
 6 | 	<string>Latest</string>
 7 | 	<key>PreviewsEnabled</key>
 8 | 	<false/>
 9 | </dict>
10 | </plist>
11 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | The MIT License (MIT)
 2 | 
 3 | Copyright (c) 2015 Luke Zhao <me@lkzhao.com>
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/CityGuide/CityGuideCell.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | 
25 | class CityCell: UICollectionViewCell {
26 |   @IBOutlet weak var imageView: UIImageView!
27 | 
28 |   @IBOutlet weak var nameLabel: UILabel!
29 |   @IBOutlet weak var descriptionLabel: UILabel!
30 | 
31 |   var useShortDescription: Bool = true
32 | 
33 |   var city: City? {
34 |     didSet {
35 |       guard let city = city else { return }
36 |       let name = city.name
37 | 
38 |       hero.id = "\(name)"
39 | 
40 |       nameLabel.text = name
41 |       imageView.image = city.image
42 |       descriptionLabel.text = useShortDescription ? city.shortDescription : city.description
43 |     }
44 |   }
45 | }
46 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/CityGuide/CityGuideViewController.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | 
25 | class CityGuideViewController: UIViewController {
26 |   @IBOutlet weak var collectionView: UICollectionView!
27 |   var cities = City.cities
28 |   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
29 |     if let currentCell = sender as? CityCell,
30 |        let vc = segue.destination as? CityViewController,
31 |        let currentCellIndex = collectionView.indexPath(for: currentCell) {
32 |       vc.selectedIndex = currentCellIndex
33 |     }
34 |   }
35 | }
36 | 
37 | extension CityGuideViewController:UICollectionViewDataSource, UICollectionViewDelegate {
38 |   func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
39 |     return cities.count
40 |   }
41 | 
42 |   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
43 |     let cell = (collectionView.dequeueReusableCell(withReuseIdentifier: "item", for: indexPath) as? CityCell)!
44 |     cell.city = cities[indexPath.item]
45 |     return cell
46 |   }
47 | }
48 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/CityGuide/CityViewController.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | 
25 | class CityViewController: UIViewController {
26 |   var selectedIndex: IndexPath!
27 |   var cities: [City] = City.cities
28 | 
29 |   @IBOutlet weak var collectionView: UICollectionView!
30 |   override func viewDidLoad() {
31 |     super.viewDidLoad()
32 |     view.layoutIfNeeded()
33 |     collectionView.reloadData()
34 |     collectionView.scrollToItem(at: selectedIndex, at: .centeredHorizontally, animated: false)
35 |   }
36 | }
37 | 
38 | extension CityViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
39 |   func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
40 |     return cities.count
41 |   }
42 | 
43 |   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
44 |     return view.frame.size
45 |   }
46 | 
47 |   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
48 |     let cell = (collectionView.dequeueReusableCell(withReuseIdentifier: "item", for: indexPath) as? CityCell)!
49 |     cell.useShortDescription = false
50 |     cell.city = cities[indexPath.item]
51 |     return cell
52 |   }
53 | }
54 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/ImageGallery/ImageLibrary.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  ImageLibrary.swift
 3 | //  HeroExamples
 4 | //
 5 | //  Created by YiLun Zhao on 2017-01-04.
 6 | //  Copyright © 2017 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import UIKit
10 | 
11 | class ImageLibrary {
12 |   static var count = 100
13 |   static func thumbnail(index: Int) -> UIImage {
14 |     return UIImage(named: "Unsplash\(index % 11)_thumb")!
15 |   }
16 |   static func image(index: Int) -> UIImage {
17 |     return UIImage(named: "Unsplash\(index % 11)")!
18 |   }
19 | }
20 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/Menu/MenuViewController.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  MenuViewController.swift
 3 | //  HeroExamples
 4 | //
 5 | //  Created by YiLun Zhao on 2017-02-09.
 6 | //  Copyright © 2017 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import UIKit
10 | import Hero
11 | 
12 | class MenuViewController: UIViewController {
13 | 
14 |   override func viewDidLoad() {
15 |     super.viewDidLoad()
16 |     view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissMenu)))
17 |   }
18 | 
19 |   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
20 |     if let vc = segue.destination as? MenuPageViewController, let sender = sender as? UIButton {
21 |       sender.hero.id = "selected"
22 |       vc.view.hero.modifiers = [.source(heroID: "selected")]
23 |       vc.centerButton.hero.id = "selected"
24 |       vc.centerButton.hero.modifiers = [.durationMatchLongest]
25 |       vc.view.backgroundColor = sender.backgroundColor
26 |       vc.centerButton.setImage(sender.image(for: .normal), for: .normal)
27 |     }
28 |   }
29 |   
30 |   @objc private func dismissMenu() {
31 |     hero.dismissViewController()
32 |   }
33 | }
34 | 
35 | class MenuPageViewController: UIViewController {
36 |   @IBOutlet weak var centerButton: UIButton!
37 | }
38 | 


--------------------------------------------------------------------------------
/LegacyExamples/Examples/Navigation/FirstViewController.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  FirstViewController.swift
 3 | //  HeroExamples
 4 | //
 5 | //  Created by Luke Zhao on 2017-11-04.
 6 | //  Copyright © 2017 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import UIKit
10 | 
11 | class FirstViewController: UIViewController {
12 | 
13 |   @IBAction func toggleIsHeroEnabled(_ sender: UISwitch) {
14 | 
15 |     // uncomment the following code to configure different animation type
16 |     // navigationController?.heroNavigationAnimationType = .zoomOut
17 | 
18 |     navigationController?.hero.isEnabled = sender.isOn
19 |   }
20 | 
21 | }
22 | 


--------------------------------------------------------------------------------
/LegacyExamples/LegacyExampleViewController.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | import Hero
25 | 
26 | class LegacyExampleViewController: UITableViewController {
27 | 
28 |   var storyboards: [[String]] = [
29 |     [],
30 |     ["Basic", "Navigation", "MusicPlayer", "Menu", "BuiltInTransitions"],
31 |     ["CityGuide", "ImageViewer", "VideoPlayer"],
32 |     ["AppleHomePage", "ListToGrid", "ImageGallery"]
33 |   ]
34 | 
35 |   override func viewDidLayoutSubviews() {
36 |     super.viewDidLayoutSubviews()
37 |     tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: bottomLayoutGuide.length, right: 0)
38 |     tableView.scrollIndicatorInsets = tableView.contentInset
39 |   }
40 | 
41 |   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
42 |     if indexPath.item < storyboards[indexPath.section].count {
43 |       let storyboardName = storyboards[indexPath.section][indexPath.item]
44 |       let vc = viewController(forStoryboardName: storyboardName)
45 | 
46 |       // iOS bug: https://github.com/lkzhao/Hero/issues/106 https://github.com/lkzhao/Hero/issues/79
47 |       DispatchQueue.main.async {
48 |         self.present(vc, animated: true, completion: nil)
49 |       }
50 |     }
51 |   }
52 | }
53 | 


--------------------------------------------------------------------------------
/LegacyExamples/PluginViewController.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | import Hero
25 | 
26 | class PluginViewController: UIViewController {
27 |   @IBOutlet weak var debugSwitch: UISwitch!
28 | 
29 |   @IBAction func togglePlugin(_ sender: UISwitch) {
30 |     if sender == debugSwitch {
31 |       HeroDebugPlugin.isEnabled = sender.isOn
32 |     }
33 |   }
34 | 
35 |   override func viewDidLoad() {
36 |     super.viewDidLoad()
37 |     debugSwitch.isOn = HeroDebugPlugin.isEnabled
38 |   }
39 | }
40 | 


--------------------------------------------------------------------------------
/LegacyExamples/en.lproj/Main.strings:
--------------------------------------------------------------------------------
 1 | 
 2 | /* Class = "UILabel"; text = "Built-in"; ObjectID = "IIL-pF-BfF"; */
 3 | "IIL-pF-BfF.text" = "Built-in";
 4 | 
 5 | /* Class = "UITabBarItem"; title = "Plugins"; ObjectID = "bDK-79-b3B"; */
 6 | "bDK-79-b3B.title" = "Plugins";
 7 | 
 8 | /* Class = "UILabel"; text = "HeroDebugPlugin"; ObjectID = "fUh-RG-Pga"; */
 9 | "fUh-RG-Pga.text" = "HeroDebugPlugin";
10 | 
11 | /* Class = "UIViewController"; title = "Plugins"; ObjectID = "uv4-Wk-GeR"; */
12 | "uv4-Wk-GeR.title" = "Plugins";
13 | 


--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
 1 | GITHUB_URL := https://github.com/HeroTransitions/Hero/
 2 | 
 3 | include .makefiles/ludicrous.mk
 4 | include .makefiles/bundler.mk
 5 | include .makefiles/ios.mk
 6 | 
 7 | PLATFORM := 'iOS'
 8 | TEST_SCHEME := 'HeroExamples'
 9 | WORKSPACE := 'Hero.xcworkspace'
10 | 
11 | %:
12 | 	@:
13 | 
14 | args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo ${arg:-${1}}`
15 | 
16 | #> Lint the podspec for upload
17 | pod_lint:
18 | 	bundle exec pod spec lint Hero.podspec
19 | 
20 | #> Build API documentation; https://github.com/realm/jazzy
21 | jazzy:
22 | 	@jazzy --config .jazzy.yaml
23 | 
24 | #> Markdown API using sourcedocs; https://github.com/eneko/SourceDocs
25 | sourcedocs:
26 | 	@sourcedocs generate --clean --output-folder docs
27 | 
28 | #> Run tests
29 | swift_test:
30 | 	swift test --parallel
31 | 
32 | #> Build debug
33 | swift_debug:
34 | 	swift build --skip-update --jobs 4 --configuration debug
35 | 
36 | #> Build release
37 | swift_release:
38 | 	swift build --skip-update --jobs 4 --configuration release
39 | 


--------------------------------------------------------------------------------
/Mintfile:
--------------------------------------------------------------------------------
1 | # yonaskolb/xcodegen
2 | realm/SwiftLint # Linting Tool
3 | danger/swift.git
4 | nicklockwood/SwiftFormat
5 | # orta/Komondor
6 | 


--------------------------------------------------------------------------------
/Package.md:
--------------------------------------------------------------------------------
 1 | # Package: **Hero**
 2 | 
 3 | ## Products
 4 | 
 5 | List of products in this package:
 6 | 
 7 | | Product | Type | Targets |
 8 | | ------- | ---- | ------- |
 9 | | Hero | library | Hero |
10 | 
11 | _Libraries denoted 'automatic' can be both static or dynamic._
12 | 
13 | ## Modules
14 | 
15 | ### Program Modules
16 | 
17 | | Module | Type | Dependencies |
18 | | ------ | ---- | ------------ |
19 | | Hero | Regular |  |
20 | 
21 | ### Test Modules
22 | 
23 | | Module | Type | Dependencies |
24 | | ------ | ---- | ------------ |
25 | | HeroTests | Test |  |
26 | 
27 | ## External Dependencies
28 | 
29 | This package has zero dependencies 🎉
30 | 
31 | ## Requirements
32 | 
33 | ### Minimum Required Versions
34 | 
35 | | Platform | Version |
36 | | -------- | ------- |
37 | | tvOS | 10.0 |
38 | | iOS | 10.0 |
39 | 
40 | This file was generated by [SourceDocs](https://github.com/eneko/SourceDocs) on 2024-02-06 02:01:40 +0000


--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
 1 | // swift-tools-version:5.0
 2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
 3 | 
 4 | import PackageDescription
 5 | 
 6 | let package = Package(
 7 |     name: "Hero",
 8 |     platforms: [
 9 |         .tvOS(.v10),
10 |         .iOS(.v10)
11 |     ],
12 |     products: [
13 |         .library(name: "Hero",
14 |                  targets: ["Hero"]),
15 |     ],
16 |     targets: [
17 |         .target(name: "Hero", path: "Sources"),
18 |         .testTarget(name: "HeroTests",
19 |                     dependencies: [.target(name: "Hero")],
20 |                     path: "Tests"),
21 |     ],
22 |     swiftLanguageVersions: [.v5]
23 | )
24 | 
25 | // The settings for the git hooks for our repo
26 | #if canImport(PackageConfig)
27 |     import PackageConfig
28 | 
29 |     let config = PackageConfig([
30 |         "komondor": [
31 |             // When someone has run `git commit`, first run
32 |             // SwiftFormat and the auto-correcter for SwiftLint
33 |             "pre-commit": [
34 |                 "swift run swiftformat .",
35 |                 "swift run swiftlint autocorrect",
36 |                 "git add .",
37 |             ],
38 |         ]
39 |     ])
40 | #endif
41 | 


--------------------------------------------------------------------------------
/PackageModules.dot:
--------------------------------------------------------------------------------
 1 | digraph ModuleDependencyGraph {
 2 |     rankdir = LR
 3 |     graph [fontname="Helvetica-light", style = filled, color = "#eaeaea"]
 4 |     node [shape=box, fontname="Helvetica", style=filled]
 5 |     edge [color="#545454"]
 6 | 
 7 |     subgraph clusterRegular {
 8 |         label = "Program Modules"
 9 |         node [color="#caecec"]
10 |         "Hero"
11 |     }
12 |     subgraph clusterTest {
13 |         label = "Test Modules"
14 |         node [color="#aaccee"]
15 |         "HeroTests"
16 |     }
17 |     subgraph clusterExternal {
18 |         label = "External Dependencies"
19 |         node [color="#eeccaa"]
20 |         ""
21 |     }
22 | 
23 |     "HeroTests" -> ""
24 | }


--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | target 'HeroExamples' do
 4 |   platform :ios, '10.0'
 5 |   use_frameworks!
 6 |   pod 'CollectionKit', :inhibit_warnings => true
 7 | 
 8 |   target 'HeroTests' do
 9 |     inherit! :search_paths
10 |   end
11 | end
12 | 
13 | target 'HeroTvOSExamples' do
14 |   platform :tvos, '10.0'
15 |   use_frameworks!
16 | end
17 | 


--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
 1 | PODS:
 2 |   - CollectionKit (2.4.0):
 3 |     - CollectionKit/Core (= 2.4.0)
 4 |   - CollectionKit/Core (2.4.0)
 5 | 
 6 | DEPENDENCIES:
 7 |   - CollectionKit
 8 | 
 9 | SPEC REPOS:
10 |   trunk:
11 |     - CollectionKit
12 | 
13 | SPEC CHECKSUMS:
14 |   CollectionKit: 8f01e7629185bb81072c4aa734d105df5c2d1c8b
15 | 
16 | PODFILE CHECKSUM: 5c14933c915eeee6fbe5ecdd950d3da01c4a0a86
17 | 
18 | COCOAPODS: 1.11.3
19 | 


--------------------------------------------------------------------------------
/Resources/Hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/Hero.png


--------------------------------------------------------------------------------
/Resources/Hero.svg:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <svg width="750px" height="250px" viewBox="0 0 750 250" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 3 |     <title>Hero</title>
 4 |     <defs>
 5 |         <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="darkOrangeGradient">
 6 |             <stop stop-color="#FF8938" offset="0%"></stop>
 7 |             <stop stop-color="#F76F1E" offset="100%"></stop>
 8 |         </linearGradient>
 9 |         <linearGradient x1="70.563613%" y1="-29.9665328%" x2="39.8308304%" y2="90.2273182%" id="centerOrangeGradient">
10 |             <stop stop-color="#FBDA61" offset="0%"></stop>
11 |             <stop stop-color="#F76B1C" offset="100%"></stop>
12 |         </linearGradient>
13 |         <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="defaultOrangeGradient">
14 |             <stop stop-color="#FBDA61" offset="0%"></stop>
15 |             <stop stop-color="#F76B1C" offset="100%"></stop>
16 |         </linearGradient>
17 |     </defs>
18 |     <g id="Hero">
19 |         <text id="Hero" font-family="HelveticaNeue-UltraLight, Helvetica Neue" font-size="280" font-weight="200" fill="#FD8332">
20 |             <tspan x="250" y="231">H</tspan>
21 |             <tspan x="420" y="231">e</tspan>
22 |             <tspan x="550" y="231">r</tspan>
23 |             <tspan x="610" y="231">o</tspan>
24 |         </text>
25 |         <g id="right" transform="translate(100,0)">
26 |             <path d="M0,-1.42108547e-14 L52.6291862,30.0738207 C62.2228218,35.5558982 70,48.9562589 70,59.9930619 L70,250 L1.42108547e-14,210 L0,-1.42108547e-14 Z" id="top" fill="url(#defaultOrangeGradient)"></path>
27 |             <polygon id="bottom" fill="url(#darkOrangeGradient)" points="0 100 70 130 70 250 0 210"></polygon>
28 |         </g>
29 |         <path d="M0,100 L100,100 L170,130 L100.003297,130 C83.4329338,130 70,143.431508 70,159.994535 L70,160 L0,100 Z" id="center" fill="url(#centerOrangeGradient)">
30 |         </path>
31 |         <g id="left">
32 |             <path d="M0,0 
33 |                      C0,0 0,0 0,0
34 |                      L52.6291862,30.0738207
35 |                      C62.2228218,35.5558982 70,48.9562589 70,59.9930619
36 |                      L70,250
37 |                      C70,250 70,250 70,250
38 |                      L0,210
39 |                      C0,210 0,210 0,210
40 |                      L0,0 Z;" id="orange" fill="url(#defaultOrangeGradient)">
41 |             </path>
42 |         </g>
43 |     </g>
44 | </svg>


--------------------------------------------------------------------------------
/Resources/ViewController.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/ViewController.png


--------------------------------------------------------------------------------
/Resources/ViewController@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/ViewController@2x.png


--------------------------------------------------------------------------------
/Resources/globalCoordinate.svg:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <svg width="136px" height="270px" viewBox="0 0 136 270" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 3 |     <title>Global Coordinate Space</title>
 4 |     <defs>
 5 |         <clipPath>
 6 |             <rect x="0" y="0" width="120" height="208" rx="10"></rect>
 7 |         </clipPath>
 8 |     </defs>
 9 |     <g transform="translate(0.000000, 0.000000)">
10 |         <rect fill="#0C1E31" x="0" y="0" width="136" height="270" rx="18"></rect>
11 |         <circle fill="#FC3A5E" cx="68" cy="253" r="9"></circle>
12 |         <g transform="translate(8.000000, 31.000000)">
13 |             <rect fill="#FFFFFF" x="0" y="0" width="119.325312" height="208.819297" rx="10"></rect>
14 | 
15 |             <rect fill="#D8D8D8" x="21" y="30" width="78" height="78" rx="9">
16 |                 <animate 
17 |                     attributeName="y" 
18 |                     values="30;100;100;30;30" 
19 |                     dur="1s"
20 |                     calcMode="spline"
21 |                     keySplines="0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1"
22 |                     repeatCount="indefinite"
23 |                     fill="freeze" />
24 |             </rect>
25 |             <rect fill="#555555" x="29" y="42" width="24" height="24" rx="9">
26 |                 <animate 
27 |                     attributeName="y" 
28 |                     values="42;112;112;42;42" 
29 |                     dur="1s"
30 |                     calcMode="spline"
31 |                     keySplines="0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1"
32 |                     repeatCount="indefinite"
33 |                     fill="freeze" />
34 |             </rect>
35 |             <rect fill="#FC3A5E" x="29" y="72" width="24" height="24" rx="9">
36 |                 <animate 
37 |                     attributeName="x" 
38 |                     values="29;66;66;29;29" 
39 |                     dur="1s"
40 |                     calcMode="spline"
41 |                     keySplines="0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1;0.4,0,0.2,1"
42 |                     repeatCount="indefinite"
43 |                     fill="freeze" />
44 |             </rect>
45 |         </g>
46 |     </g>
47 | </svg>
48 | 


--------------------------------------------------------------------------------
/Resources/headerDoc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/headerDoc.png


--------------------------------------------------------------------------------
/Resources/storyboardView.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/storyboardView.png


--------------------------------------------------------------------------------
/Resources/storyboardViewController.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/Resources/storyboardViewController.png


--------------------------------------------------------------------------------
/Sources/Animator/HeroAnimatorViewContext.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | internal class HeroAnimatorViewContext {
28 |   weak var animator: HeroAnimator?
29 |   let snapshot: UIView
30 |   let appearing: Bool
31 |   var targetState: HeroTargetState
32 |   var duration: TimeInterval = 0
33 | 
34 |   // computed
35 |   var currentTime: TimeInterval {
36 |     return snapshot.layer.convertTime(CACurrentMediaTime(), from: nil)
37 |   }
38 |   var container: UIView? {
39 |     return animator?.hero.context.container
40 |   }
41 | 
42 |   class func canAnimate(view: UIView, state: HeroTargetState, appearing: Bool) -> Bool {
43 |     return false
44 |   }
45 | 
46 |   func apply(state: HeroTargetState) {
47 |   }
48 | 
49 |   func changeTarget(state: HeroTargetState, isDestination: Bool) {
50 |   }
51 | 
52 |   func resume(timePassed: TimeInterval, reverse: Bool) -> TimeInterval {
53 |     return 0
54 |   }
55 | 
56 |   func seek(timePassed: TimeInterval) {
57 |   }
58 | 
59 |   func clean() {
60 |     animator = nil
61 |   }
62 | 
63 |   func startAnimations() -> TimeInterval {
64 |     return 0
65 |   }
66 | 
67 |   required init(animator: HeroAnimator, snapshot: UIView, targetState: HeroTargetState, appearing: Bool) {
68 |     self.animator = animator
69 |     self.snapshot = snapshot
70 |     self.targetState = targetState
71 |     self.appearing = appearing
72 |   }
73 | }
74 | 
75 | #endif
76 | 


--------------------------------------------------------------------------------
/Sources/Extensions/Array+HeroModifier.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import Foundation
24 | 
25 | #if canImport(CoreGraphics)
26 | import CoreGraphics
27 | #endif
28 | 
29 | internal extension Array {
30 |   func get(_ index: Int) -> Element? {
31 |     if index < count {
32 |       return self[index]
33 |     }
34 |     return nil
35 |   }
36 | }
37 | 
38 | internal extension Array where Element: ExprNode {
39 | 	#if canImport(CoreGraphics)
40 |   func getCGFloat(_ index: Int) -> CGFloat? {
41 |     if let s = get(index) as? NumberNode {
42 |       return CGFloat(s.value)
43 |     }
44 |     return nil
45 |   }
46 | 	#endif
47 |   func getDouble(_ index: Int) -> Double? {
48 |     if let s = get(index) as? NumberNode {
49 |       return Double(s.value)
50 |     }
51 |     return nil
52 |   }
53 |   func getFloat(_ index: Int) -> Float? {
54 |     if let s = get(index) as? NumberNode {
55 |       return s.value
56 |     }
57 |     return nil
58 |   }
59 |   func getBool(_ index: Int) -> Bool? {
60 |     if let s = get(index) as? VariableNode, let f = Bool(s.name) {
61 |       return f
62 |     }
63 |     return nil
64 |   }
65 | }
66 | 


--------------------------------------------------------------------------------
/Sources/Extensions/CALayer+Hero.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | internal extension CALayer {
28 |   // return all animations running by this layer.
29 |   // the returned value is mutable
30 |   var animations: [(String, CAAnimation)] {
31 |     if let keys = animationKeys() {
32 |       // swiftlint:disable:next force_cast
33 |       return keys.map { return ($0, self.animation(forKey: $0)!.copy() as! CAAnimation) }
34 |     }
35 |     return []
36 |   }
37 | 
38 |   func flatTransformTo(layer: CALayer) -> CATransform3D {
39 |     var layer = layer
40 |     var trans = layer.transform
41 |     while let superlayer = layer.superlayer, superlayer != self, !(superlayer.delegate is UIWindow) {
42 |       trans = CATransform3DConcat(superlayer.transform, trans)
43 |       layer = superlayer
44 |     }
45 |     return trans
46 |   }
47 | 
48 |   func removeAllHeroAnimations() {
49 |     guard let keys = animationKeys() else { return }
50 |     for animationKey in keys where animationKey.hasPrefix("hero.") {
51 |       removeAnimation(forKey: animationKey)
52 |     }
53 |   }
54 | }
55 | 
56 | #endif
57 | 


--------------------------------------------------------------------------------
/Sources/Extensions/DispatchQueue+Hero.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import Foundation
24 | 
25 | func delay(_ time: Double, execute: @escaping () -> Void) {
26 |   if time > 0 {
27 |     DispatchQueue.main.asyncAfter(deadline: .now() + time, execute: execute)
28 |   } else {
29 |     DispatchQueue.main.async(execute: execute)
30 |   }
31 | }
32 | 


--------------------------------------------------------------------------------
/Sources/Extensions/Locale+Hero.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  Locale+Hero.swift
 3 | //  Hero
 4 | //
 5 | //  Created by Joseph Mattiello on 4/25/20.
 6 | //  Copyright © 2020 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import Foundation
10 | 
11 | internal extension Locale {
12 |   static var isDeviceLanguageRightToLeft: Bool {
13 |     let currentLocale: Locale = Locale.current
14 |     guard let code: String = currentLocale.languageCode else {
15 |       return false
16 |     }
17 |     let direction: Locale.LanguageDirection = Locale.characterDirection(forLanguage: code)
18 |     return (direction == .rightToLeft)
19 |   }
20 | 
21 |   static var isDeviceLanguageLeftToRight: Bool {
22 |     return !isDeviceLanguageRightToLeft
23 |   }
24 | }
25 | 


--------------------------------------------------------------------------------
/Sources/Extensions/UIColor+HexString.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  UIColor+HexString.swift
 3 | //  Hero
 4 | //
 5 | //  Created by Joseph Mattiello on 10/21/19.
 6 | //  Copyright © 2019 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | #if canImport(UIKit)
10 | import UIKit.UIColor
11 | 
12 | extension UIColor {
13 |   convenience init?(hexString hex: String) {
14 |     var cString: String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
15 | 
16 |     if cString.hasPrefix("#") {
17 |       cString.remove(at: cString.startIndex)
18 |     }
19 | 
20 |     guard cString.count == 6 else {
21 |       return nil
22 |     }
23 | 
24 |     var rgbValue: UInt64 = 0
25 |     Scanner(string: cString).scanHexInt64(&rgbValue)
26 | 
27 |     self.init(
28 |       red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
29 |       green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
30 |       blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
31 |       alpha: CGFloat(1.0)
32 |     )
33 |   }
34 | }
35 | 
36 | #endif
37 | 


--------------------------------------------------------------------------------
/Sources/Extensions/UIKit+Hero.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | private let parameterRegex = "(?:\\-?\\d+(\\.?\\d+)?)|\\w+"
28 | private let modifiersRegex = "(\\w+)(?:\\(([^\\)]*)\\))?"
29 | 
30 | internal extension NSCoding where Self: NSObject {
31 |   func copyWithArchiver() -> Any? {
32 | 		if #available(iOS 11.0, tvOS 11.0, *) {
33 | 			return try? NSKeyedUnarchiver.unarchivedObject(ofClass: type(of: self), from: NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false))
34 | 		} else {
35 | 			return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))!
36 | 		}
37 |   }
38 | }
39 | 
40 | internal extension UIImage {
41 |   class func imageWithView(view: UIView) -> UIImage {
42 |     UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
43 |     view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
44 |     let img = UIGraphicsGetImageFromCurrentImageContext()
45 |     UIGraphicsEndImageContext()
46 |     return img!
47 |   }
48 | }
49 | 
50 | internal extension UIColor {
51 |   var components:(r:CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {
52 |     var r: CGFloat = 0
53 |     var g: CGFloat = 0
54 |     var b: CGFloat = 0
55 |     var a: CGFloat = 0
56 |     getRed(&r, green: &g, blue: &b, alpha: &a)
57 |     return (r, g, b, a)
58 |   }
59 |   var alphaComponent: CGFloat {
60 |     return components.a
61 |   }
62 | }
63 | 
64 | #endif
65 | 


--------------------------------------------------------------------------------
/Sources/Hero.h:
--------------------------------------------------------------------------------
 1 | //
 2 | //  Hero.h
 3 | //  Hero
 4 | //
 5 | //  Created by YiLun Zhao on 2017-01-03.
 6 | //  Copyright © 2017 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | #import <UIKit/UIKit.h>
10 | 
11 | //! Project version number for Hero.
12 | FOUNDATION_EXPORT double HeroVersionNumber;
13 | 
14 | //! Project version string for Hero.
15 | FOUNDATION_EXPORT const unsigned char HeroVersionString[];
16 | 
17 | // In this header, you should import all the public headers of your framework using statements like #import <Hero/PublicHeader.h>
18 | 


--------------------------------------------------------------------------------
/Sources/HeroCompatible.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import Foundation
24 | 
25 | public protocol HeroCompatible {
26 |   associatedtype CompatibleType
27 | 
28 |   var hero: HeroExtension<CompatibleType> { get set }
29 | }
30 | 
31 | public extension HeroCompatible {
32 |   var hero: HeroExtension<Self> {
33 |     get { return HeroExtension(self) }
34 |     // swiftlint:disable unused_setter_value
35 |     set { }
36 |   }
37 | }
38 | 
39 | public class HeroExtension<Base> {
40 |   public let base: Base
41 | 
42 |   init(_ base: Base) {
43 |     self.base = base
44 |   }
45 | }
46 | 


--------------------------------------------------------------------------------
/Sources/HeroTypes.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | public protocol HeroPreprocessor: AnyObject {
28 |   var hero: HeroTransition! { get set }
29 |   func process(fromViews: [UIView], toViews: [UIView])
30 | }
31 | 
32 | public protocol HeroAnimator: AnyObject {
33 |   var hero: HeroTransition! { get set }
34 |   func canAnimate(view: UIView, appearing: Bool) -> Bool
35 |   func animate(fromViews: [UIView], toViews: [UIView]) -> TimeInterval
36 |   func clean()
37 | 
38 |   func seekTo(timePassed: TimeInterval)
39 |   func resume(timePassed: TimeInterval, reverse: Bool) -> TimeInterval
40 |   func apply(state: HeroTargetState, to view: UIView)
41 |   func changeTarget(state: HeroTargetState, isDestination: Bool, to view: UIView)
42 | }
43 | 
44 | public protocol HeroProgressUpdateObserver: AnyObject {
45 |   func heroDidUpdateProgress(progress: Double)
46 | }
47 | 
48 | public enum HeroViewOrderingStrategy {
49 |   case auto, sourceViewOnTop, destinationViewOnTop
50 | }
51 | 
52 | #endif
53 | 


--------------------------------------------------------------------------------
/Sources/Info.plist:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 | <dict>
 5 | 	<key>CFBundleDevelopmentRegion</key>
 6 | 	<string>en</string>
 7 | 	<key>CFBundleExecutable</key>
 8 | 	<string>$(EXECUTABLE_NAME)</string>
 9 | 	<key>CFBundleIdentifier</key>
10 | 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11 | 	<key>CFBundleInfoDictionaryVersion</key>
12 | 	<string>6.0</string>
13 | 	<key>CFBundleName</key>
14 | 	<string>$(PRODUCT_NAME)</string>
15 | 	<key>CFBundlePackageType</key>
16 | 	<string>FMWK</string>
17 | 	<key>CFBundleShortVersionString</key>
18 | 	<string>$(MARKETING_VERSION)</string>
19 | 	<key>CFBundleVersion</key>
20 | 	<string>$(CURRENT_PROJECT_VERSION)</string>
21 | 	<key>NSPrincipalClass</key>
22 | 	<string></string>
23 | </dict>
24 | </plist>
25 | 


--------------------------------------------------------------------------------
/Sources/Parser/HeroStringConvertible.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import Foundation
24 | 
25 | public protocol HeroStringConvertible {
26 |   static func from(node: ExprNode) -> Self?
27 | }
28 | 
29 | extension String {
30 |   func parse<T: HeroStringConvertible>() -> [T]? {
31 |     let lexer = Lexer(input: self)
32 |     let parser = Parser(tokens: lexer.tokenize())
33 |     do {
34 |       let nodes = try parser.parse()
35 |       var results = [T]()
36 |       for node in nodes {
37 |         if let modifier = T.from(node: node) {
38 |           results.append(modifier)
39 |         } else {
40 |           print("\(node.name) doesn't exist in \(T.self)")
41 |         }
42 |       }
43 |       return results
44 |     } catch let error {
45 |       print("failed to parse \"\(self)\", error: \(error)")
46 |     }
47 |     return nil
48 |   }
49 | 
50 |   func parseOne<T: HeroStringConvertible>() -> T? {
51 |     return parse()?.last
52 |   }
53 | }
54 | 


--------------------------------------------------------------------------------
/Sources/Parser/Lexer.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  Lexer.swift
 3 | //  Kaleidoscope
 4 | //
 5 | //  Created by Matthew Cheok on 15/11/15.
 6 | //  Copyright © 2015 Matthew Cheok. All rights reserved.
 7 | //
 8 | 
 9 | import Foundation
10 | 
11 | public enum Token {
12 |   case identifier(String, CountableRange<Int>)
13 |   case number(Float, CountableRange<Int>)
14 |   case parensOpen(CountableRange<Int>)
15 |   case parensClose(CountableRange<Int>)
16 |   case comma(CountableRange<Int>)
17 |   case other(String, CountableRange<Int>)
18 | }
19 | 
20 | typealias TokenGenerator = (String, CountableRange<Int>) -> Token?
21 | let tokenList: [(String, TokenGenerator)] = [
22 |   ("[ \t\n]", { _, _ in nil }),
23 |   ("[a-zA-Z][a-zA-Z0-9]*", { .identifier($0, $1) }),
24 |   ("\\-?[0-9.]+", { .number(Float($0)!, $1) }),
25 |   ("\\(", { .parensOpen($1) }),
26 |   ("\\)", { .parensClose($1) }),
27 |   (",", { .comma($1) })
28 | ]
29 | 
30 | public class Lexer {
31 |   let input: String
32 |   public init(input: String) {
33 |     self.input = input
34 |   }
35 |   public func tokenize() -> [Token] {
36 |     var tokens = [Token]()
37 |     var content = input
38 | 
39 |     while !content.isEmpty {
40 |       var matched = false
41 | 
42 |       for (pattern, generator) in tokenList {
43 |         if let (m, r) = content.match(regex: pattern) {
44 |           if let t = generator(m, r) {
45 |             tokens.append(t)
46 |           }
47 | 
48 |           content = String(content[content.index(content.startIndex, offsetBy: m.count)...])
49 |           matched = true
50 |           break
51 |         }
52 |       }
53 | 
54 |       if !matched {
55 |         let index = content.index(content.startIndex, offsetBy: 1)
56 |         let intIndex = content.distance(from: content.startIndex, to: index)
57 |         tokens.append(.other(String(content[..<index]), intIndex..<intIndex+1))
58 |         content = String(content[index...])
59 |       }
60 |     }
61 |     return tokens
62 |   }
63 | }
64 | 


--------------------------------------------------------------------------------
/Sources/Parser/Nodes.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  Nodes.swift
 3 | //  Kaleidoscope
 4 | //
 5 | //  Created by Matthew Cheok on 15/11/15.
 6 | //  Copyright © 2015 Matthew Cheok. All rights reserved.
 7 | //
 8 | 
 9 | import Foundation
10 | 
11 | public class ExprNode: CustomStringConvertible, Equatable {
12 |   public var range: CountableRange<Int> = 0..<0
13 |   public let name: String
14 |   public var description: String {
15 |     return "ExprNode(name: \"\(name)\")"
16 |   }
17 |   public init(name: String) {
18 |     self.name = name
19 |   }
20 | }
21 | 
22 | public func == (lhs: ExprNode, rhs: ExprNode) -> Bool {
23 |   return lhs.description == rhs.description
24 | }
25 | 
26 | public class NumberNode: ExprNode {
27 |   public let value: Float
28 |   public override var description: String {
29 |     return "NumberNode(value: \(value))"
30 |   }
31 |   public init(value: Float) {
32 |     self.value = value
33 |     super.init(name: "\(value)")
34 |   }
35 | }
36 | 
37 | public class VariableNode: ExprNode {
38 |   public override var description: String {
39 |     return "VariableNode(name: \"\(name)\")"
40 |   }
41 | }
42 | 
43 | public class BinaryOpNode: ExprNode {
44 |   public let lhs: ExprNode
45 |   public let rhs: ExprNode
46 |   public override var description: String {
47 |     return "BinaryOpNode(name: \"\(name)\", lhs: \(lhs), rhs: \(rhs))"
48 |   }
49 |   public init(name: String, lhs: ExprNode, rhs: ExprNode) {
50 |     self.lhs = lhs
51 |     self.rhs = rhs
52 |     super.init(name: "\(name)")
53 |   }
54 | }
55 | 
56 | public class CallNode: ExprNode {
57 |   public let arguments: [ExprNode]
58 |   public override var description: String {
59 |     return "CallNode(name: \"\(name)\", arguments: \(arguments))"
60 |   }
61 |   public init(name: String, arguments: [ExprNode]) {
62 |     self.arguments = arguments
63 |     super.init(name: "\(name)")
64 |   }
65 | }
66 | 
67 | public class PrototypeNode: ExprNode {
68 |   public let argumentNames: [String]
69 |   public override var description: String {
70 |     return "PrototypeNode(name: \"\(name)\", argumentNames: \(argumentNames))"
71 |   }
72 |   public init(name: String, argumentNames: [String]) {
73 |     self.argumentNames = argumentNames
74 |     super.init(name: "\(name)")
75 |   }
76 | }
77 | 
78 | public class FunctionNode: ExprNode {
79 |   public let prototype: PrototypeNode
80 |   public let body: ExprNode
81 |   public override var description: String {
82 |     return "FunctionNode(prototype: \(prototype), body: \(body))"
83 |   }
84 |   public init(prototype: PrototypeNode, body: ExprNode) {
85 |     self.prototype = prototype
86 |     self.body = body
87 |     super.init(name: "\(prototype.name)")
88 |   }
89 | }
90 | 


--------------------------------------------------------------------------------
/Sources/Parser/Regex.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  Regex.swift
 3 | //  Kaleidoscope
 4 | //
 5 | //  Created by Matthew Cheok on 15/11/15.
 6 | //  Copyright © 2015 Matthew Cheok. All rights reserved.
 7 | //
 8 | 
 9 | import Foundation
10 | 
11 | var expressions = [String: NSRegularExpression]()
12 | public extension String {
13 |   func match(regex: String) -> (String, CountableRange<Int>)? {
14 |     let expression: NSRegularExpression
15 |     if let exists = expressions[regex] {
16 |       expression = exists
17 |     } else {
18 |       do {
19 |         expression = try NSRegularExpression(pattern: "^\(regex)", options: [])
20 |         expressions[regex] = expression
21 |       } catch {
22 |         return nil
23 |       }
24 |     }
25 | 
26 |     let range = expression.rangeOfFirstMatch(in: self, options: [], range: NSRange(0 ..< self.utf16.count))
27 |     if range.location != NSNotFound {
28 |       return ((self as NSString).substring(with: range), range.location ..< range.location + range.length )
29 |     }
30 |     return nil
31 |   }
32 | }
33 | 


--------------------------------------------------------------------------------
/Sources/Preprocessors/BasePreprocessor.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  CascadeEffect.swift
 3 | // The MIT License (MIT)
 4 | //
 5 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 6 | //
 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 8 | // of this software and associated documentation files (the "Software"), to deal
 9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 | // THE SOFTWARE.
24 | 
25 | #if canImport(UIKit)
26 | 
27 | import UIKit
28 | 
29 | class BasePreprocessor: HeroPreprocessor {
30 |   weak public var hero: HeroTransition!
31 |   public var context: HeroContext! {
32 |     return hero?.context
33 |   }
34 | 
35 |   func process(fromViews: [UIView], toViews: [UIView]) {}
36 | }
37 | 
38 | #endif
39 | 


--------------------------------------------------------------------------------
/Sources/Preprocessors/IgnoreSubviewModifiersPreprocessor.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | class IgnoreSubviewModifiersPreprocessor: BasePreprocessor {
28 |   override func process(fromViews: [UIView], toViews: [UIView]) {
29 |     process(views: fromViews)
30 |     process(views: toViews)
31 |   }
32 | 
33 |   func process(views: [UIView]) {
34 |     for view in views {
35 |       guard let recursive = context[view]?.ignoreSubviewModifiers else { continue }
36 |       var parentView = view
37 |       if view is UITableView, let wrapperView = view.subviews.get(0) {
38 |         parentView = wrapperView
39 |       }
40 | 
41 |       if recursive {
42 |         cleanSubviewModifiers(parentView)
43 |       } else {
44 |         for subview in parentView.subviews {
45 |           context[subview] = nil
46 |         }
47 |       }
48 |     }
49 |   }
50 | 
51 |   private func cleanSubviewModifiers(_ parentView: UIView) {
52 |     for view in parentView.subviews {
53 |       context[view] = nil
54 |       cleanSubviewModifiers(view)
55 |     }
56 |   }
57 | }
58 | 
59 | #endif
60 | 


--------------------------------------------------------------------------------
/Sources/SwiftSupport.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  SwiftSupport.swift
 3 | //  Hero
 4 | //
 5 | //  Created by Steven Deutsch on 10/14/18.
 6 | //  Copyright © 2018 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | #if canImport(UIKit) && !(swift(>=4.2))
10 | import Foundation
11 | import CoreMedia
12 | import CoreGraphics
13 | 
14 | extension CMTime {
15 | 	static let zero = kCMTimeZero
16 | }
17 | 
18 | enum CAMediaTimingFillMode {
19 |   static let both = kCAFillModeBoth
20 | }
21 | 
22 | enum CAMediaTimingFunctionName {
23 |   static let linear = kCAMediaTimingFunctionLinear
24 |   static let easeIn = kCAMediaTimingFunctionEaseIn
25 |   static let easeOut = kCAMediaTimingFunctionEaseOut
26 |   static let easeInEaseOut = kCAMediaTimingFunctionEaseInEaseOut
27 | }
28 | 
29 | #if canImport(UIKit)
30 | import UIKit
31 | 
32 | extension UIControl {
33 |   typealias State = UIControlState
34 | }
35 | 
36 | public extension UINavigationController {
37 |   typealias Operation = UINavigationControllerOperation
38 | }
39 | 
40 | extension UIViewController {
41 |   var children: [UIViewController] {
42 |     return childViewControllers
43 |   }
44 | }
45 | #endif
46 | 
47 | extension RunLoop {
48 |   enum Mode {
49 | 		static let common = RunLoopMode.commonModes
50 |   }
51 | }
52 | 
53 | #endif
54 | 


--------------------------------------------------------------------------------
/Sources/Transition/HeroTransition+CustomTransition.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | #if canImport(UIKit)
24 | 
25 | import UIKit
26 | 
27 | // custom transition helper, used in hero_replaceViewController
28 | public extension HeroTransition {
29 |   func transition(from: UIViewController, to: UIViewController, in view: UIView, completion: ((Bool) -> Void)? = nil) {
30 |     guard !isTransitioning else { return }
31 |     self.state = .notified
32 |     isPresenting = true
33 |     transitionContainer = view
34 |     fromViewController = from
35 |     toViewController = to
36 |     completionCallback = {
37 |       completion?($0)
38 |       self.state = .possible
39 |     }
40 |     start()
41 |   }
42 | }
43 | 
44 | #endif
45 | 


--------------------------------------------------------------------------------
/Sources/Transition/HeroTransitionState.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import Foundation
24 | 
25 | public enum HeroTransitionState: Int {
26 |   // Hero is able to start a new transition
27 |   case possible
28 | 
29 |   // UIKit has notified Hero about a pending transition.
30 |   // Hero haven't started preparing.
31 |   case notified
32 | 
33 |   // Hero's `start` method has been called. Preparing the animation.
34 |   case starting
35 | 
36 |   // Hero's `animate` method has been called. Animation has started.
37 |   case animating
38 | 
39 |   // Hero's `complete` method has been called. Transition is ended or cancelled. Hero is doing cleanup.
40 |   case completing
41 | }
42 | 


--------------------------------------------------------------------------------
/Tests/HeroTests.swift:
--------------------------------------------------------------------------------
 1 | //
 2 | //  HeroTests.swift
 3 | //  HeroTests
 4 | //
 5 | //  Created by Luke Zhao on 2/28/17.
 6 | //  Copyright © 2017 Luke Zhao. All rights reserved.
 7 | //
 8 | 
 9 | import XCTest
10 | import Hero
11 | 
12 | @discardableResult func parse(_ source: String) throws -> [ExprNode] {
13 |   let lexer = Lexer(input: source)
14 |   let tokens = lexer.tokenize()
15 |   let parser = Parser(tokens: tokens)
16 |   return try parser.parse()
17 | }
18 | 
19 | class HeroTests: XCTestCase {
20 | 
21 |   func testNoArg() {
22 |     XCTAssertEqual(try! parse("fade()"), [CallNode(name: "fade", arguments: [])])
23 |     XCTAssertEqual(try! parse("fade"), [VariableNode(name: "fade")])
24 |   }
25 | 
26 |   func testArg() {
27 |     XCTAssertEqual(try! parse("fade(123, fade)"), [CallNode(name: "fade", arguments: [NumberNode(value: 123), VariableNode(name: "fade")])])
28 |   }
29 | 
30 |   func testMultiple() {
31 |     XCTAssertEqual(try! parse("fade() fade catch catch(123) catch"),
32 |                    [CallNode(name: "fade", arguments: []),
33 |                     VariableNode(name: "fade"),
34 |                     VariableNode(name: "catch"),
35 |                     CallNode(name: "catch", arguments: [NumberNode(value: 123.0)]),
36 |                     VariableNode(name: "catch")])
37 |   }
38 | 
39 |   func testNested() {
40 |     XCTAssertEqual(try! parse("fade(fade(catch(123, fade)))"),
41 |        [CallNode(name: "fade", arguments: [
42 |           CallNode(name: "fade", arguments: [
43 |             CallNode(name: "catch", arguments: [
44 |               NumberNode(value: 123.0),
45 |               VariableNode(name: "fade")])
46 |             ])
47 |         ])
48 |       ])
49 |   }
50 | 
51 |   func testError() throws {
52 |     print(try parse("scale(0.5) translate(200, 0) fade useGlobalCoordinateSpace"))
53 |     XCTAssertThrowsError(try parse("()"), "") { (error) in
54 |       if case ParseError.expectExpression = error {} else {
55 |         XCTFail()
56 |       }
57 |     }
58 |   }
59 | 
60 | }
61 | 


--------------------------------------------------------------------------------
/Tests/Info.plist:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 | <dict>
 5 | 	<key>CFBundleDevelopmentRegion</key>
 6 | 	<string>en</string>
 7 | 	<key>CFBundleExecutable</key>
 8 | 	<string>$(EXECUTABLE_NAME)</string>
 9 | 	<key>CFBundleIdentifier</key>
10 | 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11 | 	<key>CFBundleInfoDictionaryVersion</key>
12 | 	<string>6.0</string>
13 | 	<key>CFBundleName</key>
14 | 	<string>$(PRODUCT_NAME)</string>
15 | 	<key>CFBundlePackageType</key>
16 | 	<string>BNDL</string>
17 | 	<key>CFBundleShortVersionString</key>
18 | 	<string>1.0</string>
19 | 	<key>CFBundleVersion</key>
20 | 	<string>1</string>
21 | </dict>
22 | </plist>
23 | 


--------------------------------------------------------------------------------
/TvOSExamples/Info.plist:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 | <dict>
 5 | 	<key>CFBundleDevelopmentRegion</key>
 6 | 	<string>en</string>
 7 | 	<key>CFBundleDisplayName</key>
 8 | 	<string>Hero Examples</string>
 9 | 	<key>CFBundleExecutable</key>
10 | 	<string>$(EXECUTABLE_NAME)</string>
11 | 	<key>CFBundleIdentifier</key>
12 | 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13 | 	<key>CFBundleInfoDictionaryVersion</key>
14 | 	<string>6.0</string>
15 | 	<key>CFBundleName</key>
16 | 	<string>$(PRODUCT_NAME)</string>
17 | 	<key>CFBundlePackageType</key>
18 | 	<string>APPL</string>
19 | 	<key>CFBundleShortVersionString</key>
20 | 	<string>$(MARKETING_VERSION)</string>
21 | 	<key>CFBundleVersion</key>
22 | 	<string>1</string>
23 | 	<key>LSRequiresIPhoneOS</key>
24 | 	<true/>
25 | 	<key>UIMainStoryboardFile</key>
26 | 	<string>Main</string>
27 | 	<key>UIRequiredDeviceCapabilities</key>
28 | 	<array>
29 | 		<string>arm64</string>
30 | 	</array>
31 | 	<key>UIUserInterfaceStyle</key>
32 | 	<string>Dark</string>
33 | </dict>
34 | </plist>
35 | 


--------------------------------------------------------------------------------
/TvOSExamples/TVImageGalleryViewController.swift:
--------------------------------------------------------------------------------
 1 | // The MIT License (MIT)
 2 | //
 3 | // Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
 4 | //
 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | // of this software and associated documentation files (the "Software"), to deal
 7 | // in the Software without restriction, including without limitation the rights
 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions:
11 | //
12 | // The above copyright notice and this permission notice shall be included in
13 | // all copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | // THE SOFTWARE.
22 | 
23 | import UIKit
24 | import Hero
25 | 
26 | class TVImageGalleryViewController: ImageGalleryViewController {
27 |   @IBOutlet weak var topImageView: UIImageView!
28 | 
29 |   override func viewDidLoad() {
30 |     columns = 5
31 |     cellSize = CGSize(width: (self.view.bounds.width - CGFloat(self.columns + 1)*64)/CGFloat(self.columns),
32 |                       height: (self.view.bounds.width - CGFloat(self.columns + 1)*64)/CGFloat(self.columns))
33 |     super.viewDidLoad()
34 |   }
35 | 
36 | }
37 | 
38 | 


--------------------------------------------------------------------------------
/book.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "gitbook": "3.2.2",
 3 |   "title": "Hero",
 4 |   "plugins": ["edit-link", "prism", "-highlight", "github", "anchorjs"],
 5 |   "pluginsConfig": {
 6 |     "edit-link": {
 7 |       "base": "https://github.com/lkzhao/Hero/tree/master",
 8 |       "label": "Edit This Page"
 9 |     },
10 |     "github": {
11 |       "url": "https://github.com/lkzhao/Hero/"
12 |     }
13 |   }
14 | }
15 | 


--------------------------------------------------------------------------------
/docs/badge.svg:
--------------------------------------------------------------------------------
 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="20">
 2 |   <linearGradient id="b" x2="0" y2="100%">
 3 |     <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
 4 |     <stop offset="1" stop-opacity=".1"/>
 5 |   </linearGradient>
 6 |   <clipPath id="a">
 7 |     <rect width="128" height="20" rx="3" fill="#fff"/>
 8 |   </clipPath>
 9 |   <g clip-path="url(#a)">
10 |     <path fill="#555" d="M0 0h93v20H0z"/>
11 |     <path fill="#fe7d37" d="M93 0h35v20H93z"/>
12 |     <path fill="url(#b)" d="M0 0h128v20H0z"/>
13 |   </g>
14 |   <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
15 |     <text x="475" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="830">
16 |       documentation
17 |     </text>
18 |     <text x="475" y="140" transform="scale(.1)" textLength="830">
19 |       documentation
20 |     </text>
21 |     <text x="1095" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">
22 |       24%
23 |     </text>
24 |     <text x="1095" y="140" transform="scale(.1)" textLength="250">
25 |       24%
26 |     </text>
27 |   </g>
28 | </svg>
29 | 


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Info.plist:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3 | <plist version="1.0">
 4 |   <dict>
 5 |     <key>CFBundleIdentifier</key>
 6 |       <string>com.jazzy.hero</string>
 7 |     <key>CFBundleName</key>
 8 |       <string>Hero</string>
 9 |     <key>DocSetPlatformFamily</key>
10 |       <string>hero</string>
11 |     <key>isDashDocset</key>
12 |       <true/>
13 |     <key>dashIndexFilePath</key>
14 |       <string>index.html</string>
15 |     <key>isJavaScriptEnabled</key>
16 |       <true/>
17 |     <key>DashDocSetFamily</key>
18 |       <string>dashtoc</string>
19 |   </dict>
20 | </plist>
21 | 


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/img/carat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.docset/Contents/Resources/Documents/img/carat.png


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/img/dash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.docset/Contents/Resources/Documents/img/dash.png


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/img/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.docset/Contents/Resources/Documents/img/gh.png


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/img/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.docset/Contents/Resources/Documents/img/spinner.gif


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/js/jazzy.js:
--------------------------------------------------------------------------------
 1 | // Jazzy - https://github.com/realm/jazzy
 2 | // Copyright Realm Inc.
 3 | // SPDX-License-Identifier: MIT
 4 | 
 5 | window.jazzy = {'docset': false}
 6 | if (typeof window.dash != 'undefined') {
 7 |   document.documentElement.className += ' dash'
 8 |   window.jazzy.docset = true
 9 | }
10 | if (navigator.userAgent.match(/xcode/i)) {
11 |   document.documentElement.className += ' xcode'
12 |   window.jazzy.docset = true
13 | }
14 | 
15 | function toggleItem($link, $content) {
16 |   var animationDuration = 300;
17 |   $link.toggleClass('token-open');
18 |   $content.slideToggle(animationDuration);
19 | }
20 | 
21 | function itemLinkToContent($link) {
22 |   return $link.parent().parent().next();
23 | }
24 | 
25 | // On doc load + hash-change, open any targetted item
26 | function openCurrentItemIfClosed() {
27 |   if (window.jazzy.docset) {
28 |     return;
29 |   }
30 |   var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token');
31 |   $content = itemLinkToContent($link);
32 |   if ($content.is(':hidden')) {
33 |     toggleItem($link, $content);
34 |   }
35 | }
36 | 
37 | $(openCurrentItemIfClosed);
38 | $(window).on('hashchange', openCurrentItemIfClosed);
39 | 
40 | // On item link ('token') click, toggle its discussion
41 | $('.token').on('click', function(event) {
42 |   if (window.jazzy.docset) {
43 |     return;
44 |   }
45 |   var $link = $(this);
46 |   toggleItem($link, itemLinkToContent($link));
47 | 
48 |   // Keeps the document from jumping to the hash.
49 |   var href = $link.attr('href');
50 |   if (history.pushState) {
51 |     history.pushState({}, '', href);
52 |   } else {
53 |     location.hash = href;
54 |   }
55 |   event.preventDefault();
56 | });
57 | 
58 | // Clicks on links to the current, closed, item need to open the item
59 | $("a:not('.token')").on('click', function() {
60 |   if (location == this.href) {
61 |     openCurrentItemIfClosed();
62 |   }
63 | });
64 | 
65 | // KaTeX rendering
66 | if ("katex" in window) {
67 |   $($('.math').each( (_, element) => {
68 |     katex.render(element.textContent, element, {
69 |       displayMode: $(element).hasClass('m-block'),
70 |       throwOnError: false,
71 |       trust: true
72 |     });
73 |   }))
74 | }
75 | 


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/Documents/js/jazzy.search.js:
--------------------------------------------------------------------------------
 1 | // Jazzy - https://github.com/realm/jazzy
 2 | // Copyright Realm Inc.
 3 | // SPDX-License-Identifier: MIT
 4 | 
 5 | $(function(){
 6 |   var $typeahead = $('[data-typeahead]');
 7 |   var $form = $typeahead.parents('form');
 8 |   var searchURL = $form.attr('action');
 9 | 
10 |   function displayTemplate(result) {
11 |     return result.name;
12 |   }
13 | 
14 |   function suggestionTemplate(result) {
15 |     var t = '<div class="list-group-item clearfix">';
16 |     t += '<span class="doc-name">' + result.name + '</span>';
17 |     if (result.parent_name) {
18 |      t += '<span class="doc-parent-name label">' + result.parent_name + '</span>';
19 |     }
20 |     t += '</div>';
21 |     return t;
22 |   }
23 | 
24 |   $typeahead.one('focus', function() {
25 |     $form.addClass('loading');
26 | 
27 |     $.getJSON(searchURL).then(function(searchData) {
28 |       const searchIndex = lunr(function() {
29 |         this.ref('url');
30 |         this.field('name');
31 |         this.field('abstract');
32 |         for (const [url, doc] of Object.entries(searchData)) {
33 |           this.add({url: url, name: doc.name, abstract: doc.abstract});
34 |         }
35 |       });
36 | 
37 |       $typeahead.typeahead(
38 |         {
39 |           highlight: true,
40 |           minLength: 3,
41 |           autoselect: true
42 |         },
43 |         {
44 |           limit: 10,
45 |           display: displayTemplate,
46 |           templates: { suggestion: suggestionTemplate },
47 |           source: function(query, sync) {
48 |             const lcSearch = query.toLowerCase();
49 |             const results = searchIndex.query(function(q) {
50 |                 q.term(lcSearch, { boost: 100 });
51 |                 q.term(lcSearch, {
52 |                   boost: 10,
53 |                   wildcard: lunr.Query.wildcard.TRAILING
54 |                 });
55 |             }).map(function(result) {
56 |               var doc = searchData[result.ref];
57 |               doc.url = result.ref;
58 |               return doc;
59 |             });
60 |             sync(results);
61 |           }
62 |         }
63 |       );
64 |       $form.removeClass('loading');
65 |       $typeahead.trigger('focus');
66 |     });
67 |   });
68 | 
69 |   var baseURL = searchURL.slice(0, -"search.json".length);
70 | 
71 |   $typeahead.on('typeahead:select', function(e, result) {
72 |     window.location = baseURL + result.url;
73 |   });
74 | });
75 | 


--------------------------------------------------------------------------------
/docs/docsets/Hero.docset/Contents/Resources/docSet.dsidx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.docset/Contents/Resources/docSet.dsidx


--------------------------------------------------------------------------------
/docs/docsets/Hero.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/docsets/Hero.tgz


--------------------------------------------------------------------------------
/docs/img/carat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/img/carat.png


--------------------------------------------------------------------------------
/docs/img/dash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/img/dash.png


--------------------------------------------------------------------------------
/docs/img/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/img/gh.png


--------------------------------------------------------------------------------
/docs/img/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeroTransitions/Hero/d7a72e13b034599ff694e6907f770e6bcb83f59d/docs/img/spinner.gif


--------------------------------------------------------------------------------
/docs/js/jazzy.js:
--------------------------------------------------------------------------------
 1 | // Jazzy - https://github.com/realm/jazzy
 2 | // Copyright Realm Inc.
 3 | // SPDX-License-Identifier: MIT
 4 | 
 5 | window.jazzy = {'docset': false}
 6 | if (typeof window.dash != 'undefined') {
 7 |   document.documentElement.className += ' dash'
 8 |   window.jazzy.docset = true
 9 | }
10 | if (navigator.userAgent.match(/xcode/i)) {
11 |   document.documentElement.className += ' xcode'
12 |   window.jazzy.docset = true
13 | }
14 | 
15 | function toggleItem($link, $content) {
16 |   var animationDuration = 300;
17 |   $link.toggleClass('token-open');
18 |   $content.slideToggle(animationDuration);
19 | }
20 | 
21 | function itemLinkToContent($link) {
22 |   return $link.parent().parent().next();
23 | }
24 | 
25 | // On doc load + hash-change, open any targetted item
26 | function openCurrentItemIfClosed() {
27 |   if (window.jazzy.docset) {
28 |     return;
29 |   }
30 |   var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token');
31 |   $content = itemLinkToContent($link);
32 |   if ($content.is(':hidden')) {
33 |     toggleItem($link, $content);
34 |   }
35 | }
36 | 
37 | $(openCurrentItemIfClosed);
38 | $(window).on('hashchange', openCurrentItemIfClosed);
39 | 
40 | // On item link ('token') click, toggle its discussion
41 | $('.token').on('click', function(event) {
42 |   if (window.jazzy.docset) {
43 |     return;
44 |   }
45 |   var $link = $(this);
46 |   toggleItem($link, itemLinkToContent($link));
47 | 
48 |   // Keeps the document from jumping to the hash.
49 |   var href = $link.attr('href');
50 |   if (history.pushState) {
51 |     history.pushState({}, '', href);
52 |   } else {
53 |     location.hash = href;
54 |   }
55 |   event.preventDefault();
56 | });
57 | 
58 | // Clicks on links to the current, closed, item need to open the item
59 | $("a:not('.token')").on('click', function() {
60 |   if (location == this.href) {
61 |     openCurrentItemIfClosed();
62 |   }
63 | });
64 | 
65 | // KaTeX rendering
66 | if ("katex" in window) {
67 |   $($('.math').each( (_, element) => {
68 |     katex.render(element.textContent, element, {
69 |       displayMode: $(element).hasClass('m-block'),
70 |       throwOnError: false,
71 |       trust: true
72 |     });
73 |   }))
74 | }
75 | 


--------------------------------------------------------------------------------
/docs/js/jazzy.search.js:
--------------------------------------------------------------------------------
 1 | // Jazzy - https://github.com/realm/jazzy
 2 | // Copyright Realm Inc.
 3 | // SPDX-License-Identifier: MIT
 4 | 
 5 | $(function(){
 6 |   var $typeahead = $('[data-typeahead]');
 7 |   var $form = $typeahead.parents('form');
 8 |   var searchURL = $form.attr('action');
 9 | 
10 |   function displayTemplate(result) {
11 |     return result.name;
12 |   }
13 | 
14 |   function suggestionTemplate(result) {
15 |     var t = '<div class="list-group-item clearfix">';
16 |     t += '<span class="doc-name">' + result.name + '</span>';
17 |     if (result.parent_name) {
18 |      t += '<span class="doc-parent-name label">' + result.parent_name + '</span>';
19 |     }
20 |     t += '</div>';
21 |     return t;
22 |   }
23 | 
24 |   $typeahead.one('focus', function() {
25 |     $form.addClass('loading');
26 | 
27 |     $.getJSON(searchURL).then(function(searchData) {
28 |       const searchIndex = lunr(function() {
29 |         this.ref('url');
30 |         this.field('name');
31 |         this.field('abstract');
32 |         for (const [url, doc] of Object.entries(searchData)) {
33 |           this.add({url: url, name: doc.name, abstract: doc.abstract});
34 |         }
35 |       });
36 | 
37 |       $typeahead.typeahead(
38 |         {
39 |           highlight: true,
40 |           minLength: 3,
41 |           autoselect: true
42 |         },
43 |         {
44 |           limit: 10,
45 |           display: displayTemplate,
46 |           templates: { suggestion: suggestionTemplate },
47 |           source: function(query, sync) {
48 |             const lcSearch = query.toLowerCase();
49 |             const results = searchIndex.query(function(q) {
50 |                 q.term(lcSearch, { boost: 100 });
51 |                 q.term(lcSearch, {
52 |                   boost: 10,
53 |                   wildcard: lunr.Query.wildcard.TRAILING
54 |                 });
55 |             }).map(function(result) {
56 |               var doc = searchData[result.ref];
57 |               doc.url = result.ref;
58 |               return doc;
59 |             });
60 |             sync(results);
61 |           }
62 |         }
63 |       );
64 |       $form.removeClass('loading');
65 |       $typeahead.trigger('focus');
66 |     });
67 |   });
68 | 
69 |   var baseURL = searchURL.slice(0, -"search.json".length);
70 | 
71 |   $typeahead.on('typeahead:select', function(e, result) {
72 |     window.location = baseURL + result.url;
73 |   });
74 | });
75 | 


--------------------------------------------------------------------------------