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